diff --git a/.arista/secret_allowlist.yaml b/.arista/secret_allowlist.yaml new file mode 100644 index 00000000000..7bcc79aa478 --- /dev/null +++ b/.arista/secret_allowlist.yaml @@ -0,0 +1,10 @@ +# Arista Secret Scanner allow list + +version: v1.0 +allowed_secrets: +- secret_pattern: "http://arista:arista@10.83.12.78:3128" + category: FALSE_POSITIVE + reason: Used as example in documentation +- secret_pattern: "http://arista:arista@10.10.10.1:3128" + category: FALSE_POSITIVE + reason: Used as example in documentation diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index d1c2dfe3eb8..655d8a3b091 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -12,5 +12,6 @@ // The dev entrypoint is used to install Ansible collections and requirements, as they are not included with the dev version. // "true" is required to exit "postStartCommand" without entering ZSH. // the script must be executed ONLY if Ansible is not installed - "postStartCommand": "/bin/entrypoint.sh true" + "postStartCommand": "/bin/entrypoint.sh true", + "remoteUser": "avd" } \ No newline at end of file diff --git a/.flake8 b/.flake8 index fe436bdcb98..3d93a09de27 100644 --- a/.flake8 +++ b/.flake8 @@ -8,4 +8,4 @@ max-line-length = 160 exclude = # The cv_client api is generated from proto files, so it should not be linted. - ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api + python-avd/pyavd/_cv/api diff --git a/.github/.markdownlintignore b/.github/.markdownlintignore index efeba84464d..6c28afb6b6d 100644 --- a/.github/.markdownlintignore +++ b/.github/.markdownlintignore @@ -2,4 +2,4 @@ ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ip-extended-community-lists-regexp.md ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/generate-default-config.md ansible_collections/arista/avd/molecule/eos_cli_config_gen_deprecated_vars/documentation/devices/host1.md -ansible_collections/arista/avd/tests/unit/filters/toc_files/ +python-avd/tests/pyavd/j2filters/toc_files/ diff --git a/.github/changelog.sh b/.github/changelog.sh index e997f98ef44..346afbd8124 100644 --- a/.github/changelog.sh +++ b/.github/changelog.sh @@ -20,7 +20,7 @@ TYPES=( OPTIMIZE "Code optimization" PERF "Performance" REFACTOR "Code Refactoring" - REFORMAT "Code Reformating" + REFORMAT "Code Reformatting" REVERT "Revert" TEST "Testing" ) diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000000..f63fef15b42 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,52 @@ +--- +version: 2 +updates: + # Maintain dependencies for Python + # Need one per directory until the following issue is fixed - Beta in April 2024 + # https://github.com/dependabot/dependabot-core/issues/2178 + # This first entry for pip should cover python-avd + - package-ecosystem: "pip" + directory: "/" + schedule: + interval: "daily" + reviewers: + - "aristanetworks/avd-maintainers" + pull-request-branch-name: + separator: "/" + commit-message: + prefix: "Bump(requirements): " + # Allow up to 10 open pull requests for pip dependencies + open-pull-requests-limit: 10 + # This next entry intends to ignore requirements-minimum.txt + # Need to check if it works or not. + - package-ecosystem: "pip" + directory: "/ansible_collections/arista/avd/requirements-minimum.txt" + schedule: + interval: "monthly" + # Allow up to 0 open pull requests for pip dependencies + open-pull-requests-limit: 0 + ignore: + - dependency-name: "*" + # This second entry for pip covers the requirements file in the ansible collection + - package-ecosystem: "pip" + directory: "/ansible_collections/arista/avd/" + schedule: + interval: "daily" + reviewers: + - "aristanetworks/avd-maintainers" + pull-request-branch-name: + separator: "/" + commit-message: + prefix: "Bump(requirements): " + # Allow up to 10 open pull requests for pip dependencies + open-pull-requests-limit: 10 + # Maintain dependencies for GitHub Actions + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + reviewers: + - "aristanetworks/avd-maintainers" + commit-message: + prefix: "CI: " + open-pull-requests-limit: 10 diff --git a/.github/ignore-codespell-words b/.github/ignore-codespell-words new file mode 100644 index 00000000000..844fa149851 --- /dev/null +++ b/.github/ignore-codespell-words @@ -0,0 +1,10 @@ +nd +iif +supress +inout +claus +clos +beed +defauls +toi +pathc diff --git a/.github/ignore-codespell-words.md b/.github/ignore-codespell-words.md new file mode 100644 index 00000000000..3e33ebecca7 --- /dev/null +++ b/.github/ignore-codespell-words.md @@ -0,0 +1,27 @@ +# Codespell ignore file documentation + +Ignored words are stored in the `.github/ignore-codespell-words` file. This file +intends to clarify why the words are ignored and if any action is pending + +- nd + Acronym for Neighbor Discovery +- iif + Used as test data +- supress + This word is in the schema - probably wrongly spelled. It was introduced in + https://github.com/aristanetworks/avd/pull/3360 in AVD 3.6.0 + TODO - raise an issue to fix it. +- inout + Key name `route_map_inout` in `eos_cli_config_gen` schema +- claus + Maintainer name in some places in the code +- clos + Used to design CLOS topology in documentation +- beed + Used as example data +- defauls + Used as test data +- TOI + Acronym Transfer of Information +- pathc + Used as test data diff --git a/.github/labeler.yml b/.github/labeler.yml index dfc0e408425..e2d2263790a 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -1,86 +1,130 @@ "role: build_output_folders": - - ansible_collections/arista/avd/roles/build_output_folders/* - - ansible_collections/arista/avd/roles/build_output_folders/**/* + - changed-files: + - any-glob-to-any-file: + - ansible_collections/arista/avd/roles/build_output_folders/* + - ansible_collections/arista/avd/roles/build_output_folders/**/* "role: cvp_configlet_upload": - - ansible_collections/arista/avd/roles/cvp_configlet_upload/* - - ansible_collections/arista/avd/roles/cvp_configlet_upload/**/* + - changed-files: + - any-glob-to-any-file: + - ansible_collections/arista/avd/roles/cvp_configlet_upload/* + - ansible_collections/arista/avd/roles/cvp_configlet_upload/**/* "role: eos_cli_config_gen": - - ansible_collections/arista/avd/roles/eos_cli_config_gen/* - - ansible_collections/arista/avd/roles/eos_cli_config_gen/**/* + - changed-files: + - any-glob-to-any-file: + - ansible_collections/arista/avd/roles/eos_cli_config_gen/* + - ansible_collections/arista/avd/roles/eos_cli_config_gen/**/* "role: eos_config_deploy_cvp": - - ansible_collections/arista/avd/roles/eos_config_deploy_cvp/* - - ansible_collections/arista/avd/roles/eos_config_deploy_cvp/**/* + - changed-files: + - any-glob-to-any-file: + - ansible_collections/arista/avd/roles/eos_config_deploy_cvp/* + - ansible_collections/arista/avd/roles/eos_config_deploy_cvp/**/* "role: eos_config_deploy_eapi": - - ansible_collections/arista/avd/roles/eos_config_deploy_eapi/* - - ansible_collections/arista/avd/roles/eos_config_deploy_eapi/**/* + - changed-files: + - any-glob-to-any-file: + - ansible_collections/arista/avd/roles/eos_config_deploy_eapi/* + - ansible_collections/arista/avd/roles/eos_config_deploy_eapi/**/* "role: eos_designs": - - ansible_collections/arista/avd/roles/eos_designs/* - - ansible_collections/arista/avd/roles/eos_designs/**/* + - changed-files: + - any-glob-to-any-file: + - ansible_collections/arista/avd/roles/eos_designs/* + - ansible_collections/arista/avd/roles/eos_designs/**/* "role: eos_validate_state": - - ansible_collections/arista/avd/roles/eos_validate_state/* - - ansible_collections/arista/avd/roles/eos_validate_state/**/* + - changed-files: + - any-glob-to-any-file: + - ansible_collections/arista/avd/roles/eos_validate_state/* + - ansible_collections/arista/avd/roles/eos_validate_state/**/* "role: eos_snapshot": - - ansible_collections/arista/avd/roles/eos_snapshot/* - - ansible_collections/arista/avd/roles/eos_snapshot/**/* + - changed-files: + - any-glob-to-any-file: + - ansible_collections/arista/avd/roles/eos_snapshot/* + - ansible_collections/arista/avd/roles/eos_snapshot/**/* "role: dhcp_provisioner": - - ansible_collections/arista/avd/roles/dhcp_provisioner/* - - ansible_collections/arista/avd/roles/dhcp_provisioner/**/* + - changed-files: + - any-glob-to-any-file: + - ansible_collections/arista/avd/roles/dhcp_provisioner/* + - ansible_collections/arista/avd/roles/dhcp_provisioner/**/* "filter: natural_sort": - - ansible_collections/arista/avd/plugins/filter/natural_sort.py + - changed-files: + - any-glob-to-any-file: + - ansible_collections/arista/avd/plugins/filter/natural_sort.py "filter: is_in_filter": - - ansible_collections/arista/avd/plugins/filter/is_in_filter.py + - changed-files: + - any-glob-to-any-file: + - ansible_collections/arista/avd/plugins/filter/is_in_filter.py "filter: list_compress": - - ansible_collections/arista/avd/plugins/filter/list_compress.py + - changed-files: + - any-glob-to-any-file: + - ansible_collections/arista/avd/plugins/filter/list_compress.py "filter: defined": - - ansible_collections/arista/avd/plugins/filter/defined.py + - changed-files: + - any-glob-to-any-file: + - ansible_collections/arista/avd/plugins/filter/defined.py "module: configlet_build_config": - - ansible_collections/arista/avd/plugins/modules/configlet_build_config.py + - changed-files: + - any-glob-to-any-file: + - ansible_collections/arista/avd/plugins/modules/configlet_build_config.py "module: inventory_to_container": - - ansible_collections/arista/avd/plugins/modules/inventory_to_container.py + - changed-files: + - any-glob-to-any-file: + - ansible_collections/arista/avd/plugins/modules/inventory_to_container.py "type: Python filters": - - ansible_collections/arista/avd/plugins/filter/*.py + - changed-files: + - any-glob-to-any-file: + - ansible_collections/arista/avd/plugins/filter/*.py "type: Ansible roles": - - ansible_collections/arista/avd/plugins/roles/**/*.yml - - ansible_collections/arista/avd/plugins/roles/**/*.j2 + - changed-files: + - any-glob-to-any-file: + - ansible_collections/arista/avd/plugins/roles/**/*.yml + - ansible_collections/arista/avd/plugins/roles/**/*.j2 "state: Documentation role Updated": - - 'ansible_collections/arista/avd/roles/**/*.md' + - changed-files: + - any-glob-to-any-file: + - 'ansible_collections/arista/avd/roles/**/*.md' "type: documentation": - - README.md - - contributing.md - - ansible_collections/arista/avd/*.md - - ansible_collections/arista/avd/docs/* - - ansible_collections/arista/avd/docs/**/* + - changed-files: + - any-glob-to-any-file: + - README.md + - contributing.md + - ansible_collections/arista/avd/*.md + - ansible_collections/arista/avd/docs/* + - ansible_collections/arista/avd/docs/**/* "type: code quality": - - .github/labeler.yml - - .github/* - - .github/**/* - - development/docker-compose.yml - - development/Makefile + - changed-files: + - any-glob-to-any-file: + - .github/labeler.yml + - .github/* + - .github/**/* + - development/docker-compose.yml + - development/Makefile "type: dependencies": - - development/requirements-dev.txt - - development/requirements.txt - - ansible_collections/arista/avd/docs/requirements.txt + - changed-files: + - any-glob-to-any-file: + - development/requirements-dev.txt + - development/requirements.txt + - ansible_collections/arista/avd/docs/requirements.txt "state: CI Updated": - - ansible_collections/arista/avd/molecule/* - - ansible_collections/arista/avd/molecule/**/* + - changed-files: + - any-glob-to-any-file: + - ansible_collections/arista/avd/molecule/* + - ansible_collections/arista/avd/molecule/**/* diff --git a/.github/requirements-ci.txt b/.github/requirements-ci.txt new file mode 100644 index 00000000000..b7e94fd2714 --- /dev/null +++ b/.github/requirements-ci.txt @@ -0,0 +1,5 @@ +# Installing PyAVD from source. +# The package path below is relative to the repo root and will only work if the pip install is executed from there. +./python-avd +# The -r path is relative to this file. +-r ../ansible_collections/arista/avd/requirements.txt diff --git a/.github/workflows/container_build_base.yml b/.github/workflows/container_build_base.yml index 85fb9127b10..124512afa74 100644 --- a/.github/workflows/container_build_base.yml +++ b/.github/workflows/container_build_base.yml @@ -20,7 +20,7 @@ jobs: strategy: matrix: container_name: [base] - python_version: ["3.9", "3.10", "3.11"] + python_version: ["3.10", "3.11", "3.12"] include: - python_version: "3.11" container_tags: latest diff --git a/.github/workflows/container_build_dev.yml b/.github/workflows/container_build_dev.yml index 9ae483554d1..cdaf6a9b695 100644 --- a/.github/workflows/container_build_dev.yml +++ b/.github/workflows/container_build_dev.yml @@ -20,7 +20,7 @@ jobs: strategy: matrix: container_name: [dev] - python_version: ["3.9", "3.10", "3.11"] + python_version: ["3.10", "3.11", "3.12"] include: - python_version: "3.11" container_tags: latest diff --git a/.github/workflows/container_build_template.yml b/.github/workflows/container_build_template.yml index 017872f4965..e7e07122271 100644 --- a/.github/workflows/container_build_template.yml +++ b/.github/workflows/container_build_template.yml @@ -122,17 +122,13 @@ jobs: exit 1 fi - - name: Find ansible-core version 🔥 - id: find-ansible-core-version - run: | - ANSIBLE_CORE_VERSION=$(cat ansible_collections/arista/avd/requirements-dev.txt| grep ansible-core) - echo "ansible_core_version=$ANSIBLE_CORE_VERSION" >> $GITHUB_OUTPUT - - - name: Find ansible install location - id: find-ansible-install-location + - name: Find ansible and pyavd install location + id: find-install-locations run: | + PYAVD_INSTALL_LOCATION="git+https://github.com/${{ github.repository }}.git@${{ github.ref_name }}#subdirectory=python-avd" ANSIBLE_INSTALL_LOCATION="git+https://github.com/${{ github.repository }}.git#/ansible_collections/arista/avd/,${{ github.ref_name }}" echo "ansible_install_location=$ANSIBLE_INSTALL_LOCATION" >> $GITHUB_OUTPUT + echo "pyavd_install_location=$PYAVD_INSTALL_LOCATION" >> $GITHUB_OUTPUT # This check is temporarily deactivated, will be rewised in later PRs # @@ -176,8 +172,8 @@ jobs: env: FROM_IMAGE: ${{ steps.generate-from-parameters.outputs.from_image }} FROM_VARIANT: ${{ steps.generate-from-parameters.outputs.from_variant }} - ANSIBLE_INSTALL_LOCATION: ${{ steps.find-ansible-install-location.outputs.ansible_install_location }} - ANSIBLE_CORE_VERSION: ${{ steps.find-ansible-core-version.outputs.ansible_core_version }} + ANSIBLE_INSTALL_LOCATION: ${{ steps.find-install-locations.outputs.ansible_install_location }} + PYAVD_INSTALL_LOCATION: ${{ steps.find-install-locations.outputs.pyavd_install_location }} USERNAME: ${{ inputs.username }} UID: ${{ inputs.user_id }} GID: ${{ inputs.group_id }} diff --git a/.github/workflows/container_build_universal.yml b/.github/workflows/container_build_universal.yml index 903c4dd80f3..2ff029681c0 100644 --- a/.github/workflows/container_build_universal.yml +++ b/.github/workflows/container_build_universal.yml @@ -23,7 +23,7 @@ jobs: strategy: matrix: container_name: [universal] - python_version: ["3.9", "3.10", "3.11"] + python_version: ["3.10", "3.11", "3.12"] include: - python_version: "3.11" container_tags: latest diff --git a/.github/workflows/installation-test.yml b/.github/workflows/installation-test.yml deleted file mode 100644 index 3a1db7a67de..00000000000 --- a/.github/workflows/installation-test.yml +++ /dev/null @@ -1,21 +0,0 @@ -name: Test Installation -on: - schedule: - - cron: '0 6 * * *' -jobs: - 'setup': - name: 'One liner installation' - runs-on: ubuntu-20.04 - container: avdteam/base:3.8-v2.0 - if: github.repository == 'aristanetworks/avd' - steps: - - uses: actions/checkout@v4 - - name: Execute one-liner installation - run: | - cd /tmp/ - curl -fs https://get.avd.sh | sh - - name: Run Makefile commands - run: | - cd /tmp/arista-ansible/ - cat Makefile - make diff --git a/.github/workflows/new-cvp-integration.yml b/.github/workflows/new-cvp-integration.yml new file mode 100644 index 00000000000..6912091e871 --- /dev/null +++ b/.github/workflows/new-cvp-integration.yml @@ -0,0 +1,74 @@ +--- +name: "CV integration testing" + +# on: pull_request +on: workflow_dispatch + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref }} +jobs: + # ----------------------------------------------- # + # CV INTEGRATION MOLECULE TEST FOR CV_WORKFLOW # + # ----------------------------------------------- # + molecule_cv_workflow: + name: Run molecule test for new cvp integration + runs-on: ubuntu-latest + strategy: + fail-fast: true + matrix: + avd_scenario: + - 'cv_workflow' + ansible_version: + - 'ansible-core<2.18.0 --upgrade' + steps: + - name: 'Set environment variables' + run: | + echo "PY_COLORS=1" >> $GITHUB_ENV + echo "ANSIBLE_FORCE_COLOR=1" >> $GITHUB_ENV + - uses: actions/checkout@v4 + - name: Run molecule action + env: + CVAAS_AAWG_CI: ${{ secrets.CVAAS_AAWG_CI }} + uses: arista-netdevops-community/action-molecule-avd@v1.7 + with: + molecule_parentdir: 'ansible_collections/arista/avd' + molecule_command: 'test' + molecule_args: '--scenario-name ${{ matrix.avd_scenario }}' + pip_file: .github/requirements-ci.txt + galaxy_file: "ansible_collections/arista/avd/collections.yml" + ansible: ${{ matrix.ansible_version }} + check_git: true + check_git_enforced: true + + # ------------------------------------------- # + # CV INTEGRATION MOLECULE TEST FOR CV_DEPLOY # + # ------------------------------------------- # + molecule_cv_deploy: + name: Run molecule test for new cvp integration + runs-on: ubuntu-latest + strategy: + fail-fast: true + matrix: + avd_scenario: + - 'cv_deploy' + ansible_version: + - 'ansible-core<2.18.0 --upgrade' + steps: + - name: 'Set environment variables' + run: | + echo "PY_COLORS=1" >> $GITHUB_ENV + echo "ANSIBLE_FORCE_COLOR=1" >> $GITHUB_ENV + - uses: actions/checkout@v4 + - name: Run molecule action + env: + CVAAS_AAWG_CI: ${{ secrets.CVAAS_AAWG_CI }} + uses: arista-netdevops-community/action-molecule-avd@v1.7 + with: + molecule_parentdir: 'ansible_collections/arista/avd' + molecule_command: 'test' + molecule_args: '--scenario-name ${{ matrix.avd_scenario }}' + pip_file: .github/requirements-ci.txt + galaxy_file: "ansible_collections/arista/avd/collections.yml" + ansible: ${{ matrix.ansible_version }} + check_git: true + check_git_enforced: true diff --git a/.github/workflows/pull-request-comment.yml b/.github/workflows/pull-request-comment.yml new file mode 100644 index 00000000000..e6fa827f2b3 --- /dev/null +++ b/.github/workflows/pull-request-comment.yml @@ -0,0 +1,47 @@ +name: "Pull Request Comment" + +on: + pull_request_target: + types: + - opened + +jobs: + ################################################### + # Add comment with useful links for the reviewers + ################################################### + + comment: + runs-on: ubuntu-latest + permissions: + issues: write + pull-requests: write + + steps: + - uses: actions/github-script@v7 + env: + BODY: | + Review docs on [Read the Docs](https://ansible-avd--${{ github.event.pull_request.number }}.org.readthedocs.build/en/${{ github.event.pull_request.number }}/) + + To test this pull request: + + \`\`\`sh + # Create virtual environment for this testing below the current directory + python -m venv test-avd-pr-${{ github.event.pull_request.number }} + # Activate the virtual environment + source test-avd-pr-${{ github.event.pull_request.number }}/bin/activate + # Install all requirements including PyAVD + pip install "pyavd[ansible] @ git+${{ github.event.pull_request.head.repo.clone_url }}@${{ github.event.pull_request.head.ref }}#subdirectory=python-avd" --force + # Install Ansible collection + ansible-galaxy collection install git+${{ github.event.pull_request.head.repo.clone_url }}#/ansible_collections/arista/avd/,${{ github.event.pull_request.head.ref }} --force + # Optional: Install AVD examples + cd test-avd-pr-${{ github.event.pull_request.number }} + ansible-playbook arista.avd.install_examples + \`\`\` + with: + script: | + github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: `${{ env.BODY }}` + }) diff --git a/.github/workflows/pull-request-management.yml b/.github/workflows/pull-request-management.yml index 67ad059559b..9277a7cee13 100644 --- a/.github/workflows/pull-request-management.yml +++ b/.github/workflows/pull-request-management.yml @@ -7,6 +7,11 @@ concurrency: group: ${{ github.workflow }}-${{ github.head_ref }} cancel-in-progress: true +env: + # Set -vvv is ACTIONS_STEP_DEBUG is set + # Apparently it is set in secrets when running with debug + ANSIBLE_VERBOSITY: ${{ secrets.ACTIONS_STEP_DEBUG && 3 || 0 }} + jobs: file-changes: runs-on: ubuntu-latest @@ -30,6 +35,8 @@ jobs: - '.github/workflows/pull-request-management.yml' - 'ansible_collections/arista/avd/molecule/*' - 'ansible_collections/arista/avd/molecule/**/*' + - 'python-avd/pyavd/_eos_designs/*' + - 'python-avd/pyavd/_eos_designs/**/*' - '!ansible_collections/arista/avd/roles/eos_config_deploy_cvp/*' - '!ansible_collections/arista/avd/roles/eos_config_deploy_cvp/**/*' - '!ansible_collections/arista/avd/molecule/cvp_configlet_upload/*' @@ -40,6 +47,8 @@ jobs: - '.github/workflows/pull-request-management.yml' - 'ansible_collections/arista/avd/molecule/eos_cli_config_gen*/*' - 'ansible_collections/arista/avd/molecule/eos_cli_config_gen*/**/*' + - 'python-avd/pyavd/_eos_cli_config_gen/*' + - 'python-avd/pyavd/_eos_cli_config_gen/**/*' validate_state: - 'ansible_collections/arista/avd/roles/eos_validate_state/*' - 'ansible_collections/arista/avd/roles/eos_validate_state/**/*' @@ -60,6 +69,7 @@ jobs: - 'ansible_collections/arista/avd/requirements.txt' - 'ansible_collections/arista/avd/requirements-dev.txt' - 'ansible_collections/arista/avd/meta/runtime.yml' + - '.github/requirements-ci.txt' - '.github/workflows/pull-request-management.yml' docs: - '.github/workflows/pull-request-management.yml' @@ -72,27 +82,6 @@ jobs: pyavd: - 'python_avd/*' - 'python_avd/**/*' - # ----------------------------------- # - # Pre Commit code validation - # ----------------------------------- # - pre_commit: - name: Run pre-commit validation hooks - runs-on: ubuntu-latest - needs: file-changes - if: needs.file-changes.outputs.eos_design == 'true' || needs.file-changes.outputs.config_gen == 'true' || needs.file-changes.outputs.requirements == 'true' - steps: - - uses: actions/checkout@v4 - - name: Set up Python 3 - uses: actions/setup-python@v5 - - name: Install Python requirements - run: | - pip install -r ansible_collections/arista/avd/requirements.txt -r ansible_collections/arista/avd/requirements-dev.txt --upgrade - - name: Run pre-commit - run: | - pre-commit run --all-files --color always - # Do NOT set a name for the pre-commit-ci action. Otherwise the Github App will not pick it up. - - uses: pre-commit-ci/lite-action@v1.0.0 - if: always() # ----------------------------------- # # Test Requirements @@ -100,12 +89,16 @@ jobs: python_requirements: name: Test Python requirements installation runs-on: ubuntu-latest - needs: [ pre_commit ] + needs: [ file-changes ] if: needs.file-changes.outputs.requirements == 'true' strategy: fail-fast: true matrix: - python_version: [ "3.9", "3.10", "3.11", "3.12" ] + python_version: + - "3.9" + - "3.10" + - "3.11" + - "3.12" steps: - name: 'Set environment variables' run: | @@ -118,7 +111,7 @@ jobs: python-version: ${{ matrix.python_version }} - name: 'Install Python requirements' run: | - pip install -r ansible_collections/arista/avd/requirements.txt -r ansible_collections/arista/avd/requirements-dev.txt --upgrade + pip install -r ansible_collections/arista/avd/requirements-dev.txt -r ansible_collections/arista/avd/requirements.txt --upgrade # ----------------------------------- # # EOS CLI CONFIG GEN MOLECULE @@ -134,12 +127,12 @@ jobs: - 'eos_cli_config_gen_deprecated_vars' - 'eos_cli_config_gen_negative_unit_tests' ansible_version: - - 'ansible-core<2.17.0 --upgrade' + - 'ansible-core<2.18.0 --upgrade' # Also test minimum ansible version for one scenario. include: - avd_scenario: 'eos_cli_config_gen' - ansible_version: 'ansible-core==2.14.0' - needs: [ pre_commit ] + ansible_version: 'ansible-core==2.15.0' + needs: [ file-changes ] if: needs.file-changes.outputs.config_gen == 'true' steps: - name: 'Set environment variables' @@ -153,12 +146,12 @@ jobs: molecule_parentdir: 'ansible_collections/arista/avd' molecule_command: 'test' molecule_args: '--scenario-name ${{ matrix.avd_scenario }}' - pip_file: ansible_collections/arista/avd/requirements.txt + pip_file: .github/requirements-ci.txt galaxy_file: "ansible_collections/arista/avd/collections.yml" ansible: ${{ matrix.ansible_version }} check_git: true check_git_enforced: true - # - uses: actions/upload-artifact@v3 + # - uses: actions/upload-artifact@v4 # with: # name: molecule-${{ matrix.avd_scenario }}-artifacts # path: ${PWD}/ansible_collections/arista/avd/molecule/${{ matrix.avd_scenario }} @@ -173,8 +166,8 @@ jobs: fail-fast: true matrix: avd_scenario: ['dhcp_configuration', 'dhcp_provisioning'] - ansible_version: ['ansible-core<2.17.0 --upgrade'] - needs: [ pre_commit ] + ansible_version: ['ansible-core<2.18.0 --upgrade'] + needs: [ file-changes ] if: needs.file-changes.outputs.dhcp == 'true' steps: - name: 'Set environment variables' @@ -188,12 +181,12 @@ jobs: molecule_parentdir: 'ansible_collections/arista/avd' molecule_command: 'test' molecule_args: '--scenario-name ${{ matrix.avd_scenario }}' - pip_file: ansible_collections/arista/avd/requirements.txt + pip_file: .github/requirements-ci.txt galaxy_file: "ansible_collections/arista/avd/collections.yml" ansible: ${{ matrix.ansible_version }} check_git: true check_git_enforced: true - # - uses: actions/upload-artifact@v3 + # - uses: actions/upload-artifact@v4 # with: # name: molecule-${{ matrix.avd_scenario }}-artifacts # path: ${PWD}/ansible_collections/arista/avd/molecule/${{ matrix.avd_scenario }} @@ -225,16 +218,22 @@ jobs: - 'example-single-dc-l3ls' - 'example-single-dc-multipod-l3ls' ansible_version: - - 'ansible-core<2.17.0 --upgrade' + # Testing all scenario with 2.16.x, due to bug with in 2.17.0 with and the way we test eos_designs_negative_unit_tests https://github.com/ansible/ansible/issues/83292 + - 'ansible-core>=2.16.0,<2.17.0 --upgrade' + pip_requirements: + - '.github/requirements-ci.txt' # Also test minimum ansible version for one scenario. include: - avd_scenario: 'eos_designs_unit_tests' - ansible_version: 'ansible-core==2.14.0' - - avd_scenario: 'eos_designs_unit_tests' - ansible_version: 'ansible-core>=2.14.0,<2.15.0 --upgrade' + ansible_version: 'ansible-core==2.15.0' + pip_requirements: 'tmp-requirements-minimum.txt' - avd_scenario: 'eos_designs_unit_tests' ansible_version: 'ansible-core>=2.15.0,<2.16.0 --upgrade' - needs: [ pre_commit ] + pip_requirements: '.github/requirements-ci.txt' + - avd_scenario: 'eos_designs_unit_tests' + ansible_version: 'ansible-core<2.18.0 --upgrade' + pip_requirements: '.github/requirements-ci.txt' + needs: [ file-changes ] if: needs.file-changes.outputs.eos_design == 'true' || needs.file-changes.outputs.config_gen == 'true' steps: - name: 'Set environment variables' @@ -242,18 +241,24 @@ jobs: echo "PY_COLORS=1" >> $GITHUB_ENV echo "ANSIBLE_FORCE_COLOR=1" >> $GITHUB_ENV - uses: actions/checkout@v4 + - name: Build minimum requirements + run: | + pip install uv + uv pip compile .github/requirements-ci.txt --resolution=lowest-direct > ${{ matrix.pip_requirements }} + cat ${{ matrix.pip_requirements }} + if: matrix.pip_requirements == 'tmp-requirements-minimum.txt' - name: Run molecule action uses: arista-netdevops-community/action-molecule-avd@v1.7 with: molecule_parentdir: 'ansible_collections/arista/avd' molecule_command: 'test' molecule_args: '--scenario-name ${{ matrix.avd_scenario }}' - pip_file: ansible_collections/arista/avd/requirements.txt + pip_file: ${{ matrix.pip_requirements }} galaxy_file: "ansible_collections/arista/avd/collections.yml" ansible: ${{ matrix.ansible_version }} check_git: true check_git_enforced: true - # - uses: actions/upload-artifact@v3 + # - uses: actions/upload-artifact@v4 # with: # name: molecule-${{ matrix.avd_scenario }}-artifacts # path: ${PWD}/ansible_collections/arista/avd/molecule/${{ matrix.avd_scenario }} @@ -269,11 +274,11 @@ jobs: avd_scenario: - 'eos_config_deploy_cvp' ansible_version: - - 'ansible-core<2.17.0 --upgrade' + - 'ansible-core<2.18.0 --upgrade' include: - avd_scenario: 'eos_config_deploy_cvp' - ansible_version: 'ansible-core==2.14.0' - needs: [ pre_commit ] + ansible_version: 'ansible-core==2.15.0' + needs: [ file-changes ] if: needs.file-changes.outputs.cloudvision == 'true' steps: - name: 'Set environment variables' @@ -287,12 +292,12 @@ jobs: molecule_parentdir: 'ansible_collections/arista/avd' molecule_command: 'test' molecule_args: '--scenario-name ${{ matrix.avd_scenario }}' - pip_file: ansible_collections/arista/avd/requirements.txt + pip_file: .github/requirements-ci.txt galaxy_file: "ansible_collections/arista/avd/collections.yml" ansible: ${{ matrix.ansible_version }} check_git: true check_git_enforced: true - # - uses: actions/upload-artifact@v3 + # - uses: actions/upload-artifact@v4 # with: # name: molecule-${{ matrix.avd_scenario }}-artifacts # path: ${PWD}/ansible_collections/arista/avd/molecule/${{ matrix.avd_scenario }} @@ -309,11 +314,11 @@ jobs: avd_scenario: - 'eos_validate_state' ansible_version: - - 'ansible-core<2.17.0 --upgrade' + - 'ansible-core<2.18.0 --upgrade' include: - avd_scenario: 'eos_validate_state' - ansible_version: 'ansible-core==2.14.0' - needs: [ pre_commit ] + ansible_version: 'ansible-core==2.15.0' + needs: [ file-changes ] if: needs.file-changes.outputs.eos_design == 'true' || needs.file-changes.outputs.validate_state == 'true' steps: - name: 'Set environment variables' @@ -327,8 +332,7 @@ jobs: molecule_parentdir: 'ansible_collections/arista/avd' molecule_command: 'test' molecule_args: '--scenario-name ${{ matrix.avd_scenario }}' - # Temporarily using special requirements to install anta while the feature is in preview. - pip_file: ansible_collections/arista/avd/roles/eos_validate_state/preview_requirements.txt + pip_file: .github/requirements-ci.txt galaxy_file: "ansible_collections/arista/avd/collections.yml" ansible: ${{ matrix.ansible_version }} check_git: true @@ -340,7 +344,7 @@ jobs: ansible_test_sanity: name: Run ansible-test sanity validation runs-on: ubuntu-latest - needs: [ pre_commit ] + needs: [ file-changes ] #needs: [ molecule_eos_designs, molecule_cloudvision ] #if: needs.cloudvision.status != 'failed' && needs.molecule_eos_designs.status != 'failed' && needs.file-changes.outputs.plugins == 'true' steps: @@ -357,33 +361,38 @@ jobs: 3.12 - name: 'Install Python requirements' run: | - pip install -r ansible_collections/arista/avd/requirements.txt -r ansible_collections/arista/avd/requirements-dev.txt --upgrade + pip install "ansible-core<2.18.0" -r .github/requirements-ci.txt --upgrade - name: 'Run ansible-test sanity' run: | cd ansible_collections/arista/avd/ - ansible-test sanity --color yes -v --requirements --docker + ansible-test sanity --color yes -v ansible_test_units: name: Run ansible-test units test cases runs-on: ubuntu-latest - needs: [ pre_commit ] + needs: [ file-changes ] steps: - name: 'Set environment variables' run: | echo "PY_COLORS=1" >> $GITHUB_ENV - uses: actions/checkout@v4 + - name: Set up Python 3 + uses: actions/setup-python@v5 + with: + python-version: | + 3.10 - name: 'Install Python requirements' run: | - pip install -r ansible_collections/arista/avd/requirements.txt -r ansible_collections/arista/avd/requirements-dev.txt --upgrade + pip install mock pytest pytest-mock pytest-xdist pyyaml "ansible-core<2.18.0" -r .github/requirements-ci.txt --upgrade - name: 'Run ansible-test units test cases' run: | cd ansible_collections/arista/avd/ - ansible-test units --requirements --docker -vv + ansible-test units -vv ansible_test_integration: name: Run ansible-test integration test cases runs-on: ubuntu-latest - needs: [ pre_commit ] + needs: [ file-changes ] steps: - name: 'Set environment variables' run: | @@ -393,21 +402,19 @@ jobs: uses: actions/setup-python@v5 with: python-version: | - 3.10 - 3.11 3.12 - name: 'Install Python requirements' run: | - pip install -r ansible_collections/arista/avd/requirements.txt -r ansible_collections/arista/avd/requirements-dev.txt --upgrade + pip install "ansible-core<2.18.0" -r .github/requirements-ci.txt --upgrade - name: 'Run ansible-test integration test cases' run: | cd ansible_collections/arista/avd/ - ansible-test integration --requirements --docker -vv + ansible-test integration -vv ansible_lint: name: Run ansible-lint test case runs-on: ubuntu-latest - needs: [ pre_commit ] + needs: [ file-changes ] steps: - name: 'Set environment variables' run: | @@ -422,7 +429,7 @@ jobs: 3.12 - name: 'Install Python & Ansible requirements' run: | - pip install -r ansible_collections/arista/avd/requirements.txt -r ansible_collections/arista/avd/requirements-dev.txt --upgrade + pip install -r ansible_collections/arista/avd/requirements-dev.txt -r ansible_collections/arista/avd/requirements.txt --upgrade ansible-galaxy collection install -r ansible_collections/arista/avd/collections.yml - name: 'Run ansible-test integration test cases' run: | @@ -446,19 +453,19 @@ jobs: - uses: actions/checkout@v4 - name: 'Install Python & Ansible requirements' run: | - pip install -r ansible_collections/arista/avd/requirements.txt -r ansible_collections/arista/avd/requirements-dev.txt --upgrade + pip install pydantic>=2.3.0 "ansible-core<2.18.0" -r .github/requirements-ci.txt --upgrade ansible-galaxy collection install -r ansible_collections/arista/avd/collections.yml - name: Install galaxy-importer # Install the specific version of galaxy-importer used on galaxy.ansible.com # The version conflicts with our requirements, # so we let the galaxy-importer version resolve remaining requirements. run: | - pip install "galaxy-importer==0.4.19" + pip install "galaxy-importer==0.4.20" - name: 'Build ansible package' run: make collection-build - name: 'Run galaxy-importer checks' run: python -m galaxy_importer.main *.tar.gz - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: importer-logs path: ./importer_result.json @@ -469,11 +476,14 @@ jobs: pyavd: name: Test pyavd runs-on: ubuntu-latest - needs: [ pre_commit ] + needs: [file-changes] if: | needs.file-changes.outputs.eos_design == 'true' || needs.file-changes.outputs.config_gen == 'true' || needs.file-changes.outputs.pyavd == 'true' + strategy: + matrix: + python: ["3.9", "3.10", "3.11", "3.12"] steps: - name: 'Set environment variables' run: | @@ -482,14 +492,11 @@ jobs: - name: Set up Python 3 uses: actions/setup-python@v5 with: - python-version: | - 3.10 - 3.11 - 3.12 + python-version: ${{ matrix.python }} - name: 'Install tox' run: | - pip install tox --upgrade - - name: 'Run tox' + pip install tox tox-gh-actions --upgrade + - name: "Run pytest via tox for ${{ matrix.python }}" working-directory: python-avd run: | tox diff --git a/.github/workflows/pull-request-triage.yml b/.github/workflows/pull-request-triage.yml index f0eb54cee1f..971d371e6ff 100644 --- a/.github/workflows/pull-request-triage.yml +++ b/.github/workflows/pull-request-triage.yml @@ -16,8 +16,11 @@ jobs: name: "PR Labeller" # https://github.com/actions/labeler runs-on: ubuntu-latest + permissions: + contents: read + pull-requests: write steps: - - uses: actions/labeler@v4 + - uses: actions/labeler@v5 with: repo-token: "${{ secrets.GITHUB_TOKEN }}" configuration-path: '.github/labeler.yml' @@ -27,7 +30,7 @@ jobs: # https://github.com/marketplace/actions/auto-author-assign runs-on: ubuntu-latest steps: - - uses: toshimaru/auto-author-assign@v1.6.1 + - uses: toshimaru/auto-author-assign@v2.1.1 with: repo-token: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 303d3cf397a..3720e89eb97 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -9,7 +9,7 @@ jobs: if: github.repository == 'aristanetworks/avd' steps: # Issue stale management - - uses: actions/stale@v6 + - uses: actions/stale@v9 with: repo-token: ${{ secrets.GITHUB_TOKEN }} days-before-stale: 90 diff --git a/.gitignore b/.gitignore index 6f5ef96ffa7..fd3297f2f4a 100644 --- a/.gitignore +++ b/.gitignore @@ -46,3 +46,6 @@ ansible_collections/arista/avd/plugins/plugin_utils/cv_client/cloudvision-apis/ # Checksum of schemas *schema.sha1 + +# Temporary files creating during CI workflow +/tmp-requirements-minimum.txt diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0e29ab7774c..bd6ab1e3eb2 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,24 +1,30 @@ # See https://pre-commit.com for more information # See https://pre-commit.com/hooks.html for more hooks +ci: + autoupdate_commit_msg: "Bump: pre-commit autoupdate" repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v2.4.0 + rev: v4.6.0 hooks: - id: trailing-whitespace + name: Trims trailing whitespace. exclude: ansible_collections/arista/avd/molecule - id: end-of-file-fixer + name: Ensures that a file is either empty, or ends with one newline. exclude_types: [svg, json] exclude: ansible_collections/arista/avd/molecule - id: check-added-large-files + name: Prevents giant files from being committed. exclude: (ansible_collections/arista/avd/molecule|pickle$) - id: check-merge-conflict + name: Checks for files that contain merge conflict strings. exclude: ansible_collections/arista/avd/molecule - repo: https://github.com/Lucas-C/pre-commit-hooks - rev: v1.5.4 + rev: v1.5.5 hooks: - - name: Check and insert license on Python files - id: insert-license + - id: insert-license + name: Check and insert license on Python files. exclude: ansible_collections/arista/avd/(plugins/module_utils|tests/unit(/module_utils|/modules|))/__init__.py files: .*\.py$ args: @@ -29,8 +35,8 @@ repos: - --fuzzy-match-generates-todo - --no-extra-eol - - name: Check and insert license on select YAML files - id: insert-license + - id: insert-license + name: Check and insert license on select YAML files. files: ansible_collections/arista/avd/roles/.*/(handlers|schemas|tasks)/.*\.yml$ args: - --license-filepath @@ -40,8 +46,8 @@ repos: - --fuzzy-match-generates-todo - --no-extra-eol - - name: Check and insert license on Jinja2 files - id: insert-license + - id: insert-license + name: Check and insert license on Jinja2 files. files: .*\.j2$ exclude: ansible_collections/arista/avd/molecule.* args: @@ -54,8 +60,8 @@ repos: - '{#||#}' - --no-extra-eol - - name: Check and insert license on Markdown files - id: insert-license + - id: insert-license + name: Check and insert license on Markdown files. files: .*\.md$ exclude: (ansible_collections/arista/avd/molecule|.github|ansible_collections/arista/avd/examples/.+/documentation/).* args: @@ -76,41 +82,50 @@ repos: rev: 5.13.2 hooks: - id: isort - name: Check for changes when running isort on all python files + name: Check for changes when running isort on all python files. - repo: https://github.com/psf/black - rev: 24.3.0 + rev: 24.4.2 hooks: - id: black - name: Check for changes when running Black on all python files + name: Check for changes when running Black on all python files. - repo: https://github.com/pycqa/flake8 - rev: 4.0.1 # Note ansible-test uses pycodestyle 2.8.0 which is part of this tagged release of flake8 + rev: 7.0.0 hooks: - id: flake8 - name: Check for Flake8 errors on Python files + name: Check for Flake8 errors on Python files. # ignoring errors and selecting line length as per # https://github.com/ansible/ansible/blob/devel/test/lib/ansible_test/_util/controller/sanity/pep8/current-ignore.txt types: [python] - # The cv_client api is generated from proto files, so it should not be linted. - exclude: ^ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/ + # The cv client api is generated from proto files, so it should not be linted. + exclude: ^python-avd/pyavd/_cv/api - repo: https://github.com/pycqa/pylint - rev: "v2.16.1" + rev: "v3.1.1" hooks: - id: pylint # Use pylintrc file in repository - name: Check for Linting errors on Python files + name: Check for Linting errors on Python files outside the Ansible collection. description: This hook runs pylint. types: [python] args: # Suppress duplicate code for modules header - -d duplicate-code + - id: pylint # Use pylintrc file in Ansible collection + name: Check for Linting errors on Python files in the Ansible collection. + description: This hook runs pylint. + types: [python] + files: ansible_collections/arista/avd/ + args: + - --rcfile=ansible_collections/arista/avd/pylintrc + # Suppress duplicate code for modules header + - -d duplicate-code - repo: https://github.com/adrienverge/yamllint.git - rev: "v1.23.0" + rev: "v1.35.1" hooks: - id: yamllint - name: Check for Linting errors on YAML files + name: Check for Linting errors on YAML files with settings defined in `.github/yamllintrc`. description: This hook runs yamllint. entry: yamllint language: python @@ -118,54 +133,102 @@ repos: args: [--strict, -c=.github/yamllintrc] - repo: https://github.com/aristanetworks/j2lint.git - rev: "742a25e" + rev: "v1.1.0" hooks: - id: j2lint name: Check for Linting errors on Jinja2 files + - repo: https://github.com/codespell-project/codespell + rev: v2.3.0 + hooks: + - id: codespell + name: Check for common misspellings in text files. + entry: codespell + language: python + types: [text] + args: + - '--ignore-words=.github/ignore-codespell-words' # Ignore words listed in this file + exclude: > # List of regex patterns for files/directories to exclude + (?x)^( + .*\.cfg| # Exclude all .cfg files + .*\.svg| # Exclude all .svg files + .*\.excalidraw| # Exclude all .excalidraw files + .*\.rst| # Exclude all .rst files + python-avd/pyavd/vendor/.*| # Exclude all files in this directory + ansible_collections/arista/avd/CHANGELOG.rst| # Exclude auto generated CHANGELOG.rst file + ansible_collections/arista/avd/changelogs/.*| # Exclude all files in this directory + ansible_collections/arista/avd/roles/.*/docs/tables/.*\.md| # Exclude all .md files in tables + python-avd/pyavd/.*/schema/.*schema\.yml| # Exclude YAML schemas file + python-avd/pyavd/.*/schema/.*jsonschema\.json| # Exclude JSON schemas file + python-avd/pyavd/_cv/api/.*| # Exclude auto generated files for CV API + python-avd/pyavd/_cv/extra_cv_protos/.*| # Exclude extra CV proto files + ansible-avd/ansible_collections/arista/avd/docs/plugins/.* | # Excluded auto generated doc for Ansible plugins + )$ + - repo: local hooks: - id: docs-plugin-modules - name: Build documentation for collection modules and action plugins + name: Build documentation for collection modules and action plugins. entry: ansible-doc-extractor --template ansible_collections/arista/avd/docs/templates/plugin-docs.j2 --markdown "ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/" - language: system + language: python types: [python] + additional_dependencies: ['ansible-doc-extractor>=0.1.10', 'ansible-core>=2.15.0,<2.18.0'] files: ansible_collections/arista/avd/plugins/modules/ - id: docs-plugin-filter - name: Build documentation for collection filter plugins + name: Build documentation for collection filter plugins. entry: ansible-doc-extractor --template ansible_collections/arista/avd/docs/templates/plugin-docs.j2 --markdown "ansible_collections/arista/avd/docs/plugins/Filter_plugins/" - language: system + language: python types: [python] + additional_dependencies: ['ansible-doc-extractor>=0.1.10', 'ansible-core>=2.15.0,<2.18.0'] files: ansible_collections/arista/avd/plugins/filter/ + - id: docs-plugin-lookup + name: Build documentation for collection lookup plugins. + entry: ansible-doc-extractor --template ansible_collections/arista/avd/docs/templates/plugin-docs.j2 --markdown "ansible_collections/arista/avd/docs/plugins/Lookup_plugins/" + language: python + types: [python] + additional_dependencies: ['ansible-doc-extractor>=0.1.10', 'ansible-core>=2.15.0,<2.18.0'] + files: ansible_collections/arista/avd/plugins/lookup/ + - id: docs-plugin-test - name: Build documentation for collection test plugins + name: Build documentation for collection test plugins. entry: ansible-doc-extractor --template ansible_collections/arista/avd/docs/templates/plugin-docs.j2 --markdown "ansible_collections/arista/avd/docs/plugins/Test_plugins/" - language: system + language: python types: [python] + additional_dependencies: ['ansible-doc-extractor>=0.1.10', 'ansible-core>=2.15.0,<2.18.0'] files: ansible_collections/arista/avd/plugins/test/ - id: docs-plugin-vars - name: Build documentation for collection var plugins + name: Build documentation for collection var plugins. entry: ansible-doc-extractor --template ansible_collections/arista/avd/docs/templates/plugin-docs.j2 --markdown "ansible_collections/arista/avd/docs/plugins/Vars_plugins/" - language: system + language: python types: [python] + additional_dependencies: ['ansible-doc-extractor>=0.1.10', 'ansible-core>=2.15.0,<2.18.0'] files: ansible_collections/arista/avd/plugins/vars/ - id: schemas - name: Build AVD Schemas and Docs + name: Build AVD schemas and documentation. entry: sh -c 'exec python-avd/scripts/build-schemas.py' - language: system - files: ansible_collections/arista/avd/roles/[a-z_]+/schemas + language: python + files: python-avd/pyavd/[a-z_]+/schema + pass_filenames: false + additional_dependencies: ['deepmerge>=1.1.0', 'PyYAML>=6.0.0', 'pydantic>=2.3.0', 'jsonschema>=4.10.3', 'referencing>=0.35.0'] + + - id: templates + name: Precompile eos_cli_config_gen Jinja2 + entry: sh -c 'python-avd/scripts/compile_templates.py' + language: python + files: python-avd/pyavd/_eos_cli_config_gen/j2templates/ pass_filenames: false + additional_dependencies: ['Jinja2>=3.0.0', 'cryptography>=38.0.4', 'deepmerge>=1.1.0', 'PyYAML>=6.0.0', 'pydantic>=2.3.0', 'jsonschema>=4.10.3', 'referencing>=0.35.0'] - repo: https://github.com/igorshubovych/markdownlint-cli - rev: v0.32.1 + rev: v0.41.0 hooks: - id: markdownlint - name: Check for Linting errors on MarkDown files + name: Check for Linting errors on Markdown files with settings defined in `.github/.markdownlint.yaml`. args: - --config=.github/.markdownlint.yaml - --ignore-path=.github/.markdownlintignore diff --git a/.sonarcloud.properties b/.sonarcloud.properties new file mode 100644 index 00000000000..6e3907878b7 --- /dev/null +++ b/.sonarcloud.properties @@ -0,0 +1,6 @@ +# Python version +sonar.python.version=3.9, 3.10, 3.11, 3.12 +# Exclude tests from source +sonar.exclusions=python-avd/tests/** +# Path to tests +sonar.tests=python-avd/tests diff --git a/.sonarlint/connectedMode.json b/.sonarlint/connectedMode.json new file mode 100644 index 00000000000..6b6e88a1ba7 --- /dev/null +++ b/.sonarlint/connectedMode.json @@ -0,0 +1,4 @@ +{ + "sonarCloudOrganization": "aristanetworks-1", + "projectKey": "aristanetworks_avd" +} \ No newline at end of file diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index cdaecd3ca9e..00000000000 --- a/Dockerfile +++ /dev/null @@ -1,30 +0,0 @@ -ARG EE_BASE_IMAGE=quay.io/ansible/ansible-runner:stable-2.12-latest -ARG EE_BUILDER_IMAGE=quay.io/ansible/ansible-builder:latest - -FROM $EE_BASE_IMAGE as galaxy -ARG ANSIBLE_GALAXY_CLI_COLLECTION_OPTS=--force --verbose -USER root - -ADD _build /build -WORKDIR /build - -RUN ansible-galaxy role install -r requirements.yml --roles-path "/usr/share/ansible/roles" -RUN ANSIBLE_GALAXY_DISABLE_GPG_VERIFY=1 ansible-galaxy collection install $ANSIBLE_GALAXY_CLI_COLLECTION_OPTS -r requirements.yml --collections-path "/usr/share/ansible/collections" - -FROM $EE_BUILDER_IMAGE as builder - -COPY --from=galaxy /usr/share/ansible /usr/share/ansible - -ADD _build/requirements.txt requirements.txt -ADD _build/bindep.txt bindep.txt -RUN ansible-builder introspect --sanitize --user-pip=requirements.txt --user-bindep=bindep.txt --write-bindep=/tmp/src/bindep.txt --write-pip=/tmp/src/requirements.txt -RUN assemble - -FROM $EE_BASE_IMAGE -USER root - -COPY --from=galaxy /usr/share/ansible /usr/share/ansible - -COPY --from=builder /output/ /output/ -RUN /output/install-from-bindep && rm -rf /output/wheels -COPY ansible_collections/arista/avd/ /usr/share/ansible/collections/ansible_collections/arista/avd diff --git a/Makefile b/Makefile index f5ce73c8487..68f9e2c685c 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ CURRENT_DIR = $(shell pwd) -# option to run ansible-test sanity: must be either venv or docker (default is docker) -ANSIBLE_TEST_MODE ?= docker +# option to run ansible-test sanity: must be either venv or docker (default is venv) +ANSIBLE_TEST_MODE ?= venv MUFFET_TIMEOUT ?= 60 .PHONY: help @@ -8,35 +8,36 @@ help: ## Display help message @grep -E '^[0-9a-zA-Z_-]+\.*[0-9a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' ######################################### -# Ansible Collection actions # +# Ansible Collection actions # ######################################### .PHONY: collection-build -collection-build: ## Build arista.cvp collection locally +collection-build: ## Build arista.avd collection locally. ./python-avd/scripts/build-schemas.py ansible-galaxy collection build --force ansible_collections/arista/avd ######################################### -# pyavd actions # +# pyavd actions # ######################################### .PHONY: pyavd-build -pyavd-build: ## Build PyAVD Python package locally - cd python-avd && $(MAKE) clean build +pyavd-build: ## Build PyAVD Python package locally. + cd python-avd && $(MAKE) build .PHONY: pyavd-test -pyavd-test: ## Test PyAVD Python code - cd python-avd && $(MAKE) clean && tox -r +pyavd-test: ## Test PyAVD Python code with tox. + cd python-avd && $(MAKE) && tox -r .PHONY: pyavd-publish -pyavd-publish: ## Build and publish PyAVD Python package - cd python-avd && $(MAKE) clean build publish +pyavd-publish: ## Build and publish PyAVD Python package. + cd python-avd && $(MAKE) build publish .PHONY: pyavd-install -pyavd-install: pyavd-build ## Build and install PyAVD Python package - pip install python-avd/dist/* +pyavd-install: pyavd-build ## Build and install PyAVD Python package. + pip install python-avd/dist/* --force-reinstall +# The editable_mode=compat is required for pylance to pick up the editable install. .PHONY: pyavd-editable-install pyavd-editable-install: ## Build and install PyAVD as editable - pip install -e python-avd + pip install -e python-avd --config-settings editable_mode=compat --force-reinstall ######################################### # Code Validation using ansible-test # @@ -46,21 +47,21 @@ pyavd-editable-install: ## Build and install PyAVD as editable sanity: sanity-info sanity-lint sanity-import ## Run ansible-test sanity validation. .PHONY: sanity-info -sanity-info: ## Show information about ansible-test +sanity-info: ## Show information about ansible-test. cd ansible_collections/arista/avd/ ; ansible-test env .PHONY: sanity-lint -sanity-lint: ## Run ansible-test sanity for code sanity +sanity-lint: ## Run ansible-test sanity for code sanity. Specify `ANSIBLE_TEST_MODE=` (default: `venv`). cd ansible_collections/arista/avd/ ; \ ansible-test sanity --requirements --$(ANSIBLE_TEST_MODE) --skip-test import .PHONY: sanity-import -sanity-import: ## Run ansible-test sanity for code import +sanity-import: ## Run ansible-test sanity for code import. Specify `ANSIBLE_TEST_MODE=` (default: `venv`). cd ansible_collections/arista/avd/ ; \ ansible-test sanity --requirements --$(ANSIBLE_TEST_MODE) --test import .PHONY: galaxy-importer -galaxy-importer: ## Run galaxy importer tests +galaxy-importer: ## Run galaxy importer tests. rm -f *.tar.gz && \ ansible-galaxy collection build --force ansible_collections/arista/avd && \ python -m galaxy_importer.main *.tar.gz @@ -70,7 +71,7 @@ galaxy-importer: ## Run galaxy importer tests ############################################# .PHONY: unit-tests -unit-tests: ## Run unit test cases using ansible-test +unit-tests: ## Run unit test cases using ansible-test. Specify `ANSIBLE_TEST_MODE=` (default: `venv`). cd ansible_collections/arista/avd/ ; \ ansible-test units --requirements --$(ANSIBLE_TEST_MODE) -vv @@ -79,26 +80,6 @@ unit-tests: ## Run unit test cases using ansible-test ################################################### .PHONY: integration-tests -integration-tests: ## Run integration test cases using ansible-test +integration-tests: ## Run integration test cases using ansible-test. Specify `ANSIBLE_TEST_MODE=` (default: `venv`). cd ansible_collections/arista/avd/ ; \ ansible-test integration --requirements --$(ANSIBLE_TEST_MODE) - -######################################### -# Documentation actions # -######################################### -.PHONY: webdoc-up -webdoc-up: ## Build documentation to view - docker-compose -f development/docker-compose.yml up -d webdoc_avd ; \ - docker exec -it webdoc_avd sh - -.PHONY: webdoc-down -webdoc-down: ## shutdown docs - docker-compose -f development/docker-compose.yml down - -.PHONY: webdoc-logs -webdoc-logs: ## View logs - docker logs webdoc_avd - -.PHONY: check-avd-404 -check-avd-404: ## Check local 404 links for AVD documentation - docker run --rm --network container:webdoc_avd raviqqe/muffet:2.9.2 http://127.0.0.1:8000/ -e ".*fonts.googleapis.com.*" -e ".*fonts.gstatic.com.*" -e ".*tools.ietf.org.*" -e ".*edit.*" -e ".*docs.github.com.*" -e "twitter.com" -f --max-redirections=3 --timeout=$(MUFFET_TIMEOUT) --rate-limit=1 --buffer-size 8192 diff --git a/README.md b/README.md index 003c176ad59..c6a31a35a1a 100644 --- a/README.md +++ b/README.md @@ -15,13 +15,13 @@ Arista Validated Designs (AVD) is an extensible data model that defines Arista's AVD Documentation: - [Stable version](https://avd.arista.com/stable/) -- [Development version](https://www.avd.sh/en/devel/) +- [Development version](https://avd.arista.com/devel/) ## Features - **Flexibility with Open Data Models:** Extensible fabric-wide network models, simplifying configuration, delivering consistency, and reducing errors - **Simplification through Multi-Domain Automation:** A framework that can automate the data center, campus or wide area network, enabled by a consistent EOS software image and management platform -- **Comprehensive Workflows:** Automating the full life cycle of network provisioning from config generation to pre and post-deployment validation, and self-documentation of the network +- **Comprehensive Workflows:** Automating the full life cycle of network provisioning from config generation to pre- and post-deployment validation, and self-documentation of the network ## Reference designs @@ -34,25 +34,28 @@ AVD Documentation: ### Examples - [Getting started](https://avd.arista.com/stable/docs/getting-started/intro-to-ansible-and-avd.html) -- [Arista NetDevOps Examples](https://github.com/aristanetworks/netdevops-examples) +- [Examples](https://avd.arista.com/stable/examples/single-dc-l3ls/index.html) -### Additional resources +## Additional resources - Ansible [EOS modules](https://docs.ansible.com/ansible/latest/collections/arista/eos/index.html) on Ansible documentation - Ansible [CloudVision modules](https://cvp.avd.sh/en/stable/) - [CloudVision Portal](https://www.arista.com/en/products/eos/eos-cloudvision) - [Arista Design and Deployment Guides](https://www.arista.com/en/solutions/design-guides) -## Ask a question +## Support -Support for this `arista.avd` collection is provided by the community directly in this repository. If you have any questions, please leverage the GitHub [discussions board](https://github.com/aristanetworks/avd/discussions). +- AVD version 4.x releases with full support from Arista TAC. If your organization has the [A-Care subscription](https://www.arista.com/assets/data/pdf/AVD-A-Care-TAC-Support-Overview.pdf) please don't hesitate to contact TAC with any questions or issues. +- Community support is provided via [Github discussions board](https://github.com/aristanetworks/avd/discussions). ## Contributing -Contributing pull requests are gladly welcomed for this repository. If you are planning a big change, please start a discussion first to make sure we'll be able to merge it. Please see [contribution guide](./ansible_collections/arista/avd/docs/contribution/overview.md) for additional details. +Contributing pull requests are gladly welcomed for this repository. If you are planning a big change, please start a discussion first to make sure we'll be able to merge it. Please see the [contribution guide](ansible_collections/arista/avd/docs/contribution/overview.md) for additional details. -You can also open an [issue](https://github.com/aristanetworks/avd/issues) to report any problems or submit requests for enhancements. +You can also open an [issue](https://github.com/aristanetworks/avd/issues) to report any problems or submit enhancements. ## License -The project is published under [Apache 2.0 License](./LICENSE) +Copyright (c) 2019-2024 Arista Networks, Inc. + +The project is published under [Apache 2.0 License](LICENSE) diff --git a/ansible_collections/arista/avd/CHANGELOG.rst b/ansible_collections/arista/avd/CHANGELOG.rst index f12e1cde5b7..7d7fbb89dd8 100644 --- a/ansible_collections/arista/avd/CHANGELOG.rst +++ b/ansible_collections/arista/avd/CHANGELOG.rst @@ -4,6 +4,227 @@ Arista.Avd Release Notes .. contents:: Topics +v4.9.0 +====== + +Release Summary +--------------- + +Release 4.9.0 - See documentation on avd.arista.com for details. + +Minor Changes +------------- + +- Bump(pyavd): Add support for Python 3.9 in PyAVD by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4051 +- Doc(eos_cli_config_gen): Include docs for router segment-security by @jonxstill in https://github.com/aristanetworks/avd/pull/4059 +- Doc: Add notes about using cv_deploy for CV Pathfinder by @gmuloc in https://github.com/aristanetworks/avd/pull/4044 +- Doc: Added the table of WAN validation by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/4125 +- Doc: Contribution Guide Updates by @carlbuchmann in https://github.com/aristanetworks/avd/pull/3766 +- Doc: Fix mkdocs broken requirement links in roles by @gmuloc in https://github.com/aristanetworks/avd/pull/4039 +- Doc: Minor grammar edits. by @blitzeditor in https://github.com/aristanetworks/avd/pull/3362 +- Doc: Minor updates to Development Tooling guide. by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4067 +- Doc: Semantic Versioning by @carlbuchmann in https://github.com/aristanetworks/avd/pull/3417 +- Doc: Update installation guide with PyAVD by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4076 +- Doc: add CVaaS regional URLs to cv_deploy by @noredistribution in https://github.com/aristanetworks/avd/pull/4092 +- Feat(containers): switch to pyavd and editable install for container build by @ankudinov in https://github.com/aristanetworks/avd/pull/4087 +- Feat(eos_cli_config_gen): Add Patch-Panel Connector commands by @ccsnw in https://github.com/aristanetworks/avd/pull/4063 +- Feat(eos_cli_config_gen): Add option for `ospf_type` when redistributing OSPF into BGP by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4029 +- Feat(eos_cli_config_gen): Add support for 'no bgp redistribute-internal' by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/4033 +- Feat(eos_cli_config_gen): Add support for MACsec fallback to unprotected traffic by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4028 +- Feat(eos_cli_config_gen): Add support for Postcard telemetry by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3642 +- Feat(eos_cli_config_gen): Add support for Router BGP missing-policy for address-family all by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/4034 +- Feat(eos_cli_config_gen): Add support for dot1x captive portal and supplicant commands by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4023 +- Feat(eos_cli_config_gen): Add support for permit response traffic nat under ip acls by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4128 +- Feat(eos_cli_config_gen): Adding option for arp cache persistent and arp persistent refresh-delay by @bjmeuer in https://github.com/aristanetworks/avd/pull/4109 +- Feat(eos_cli_config_gen): Support of BGP default-originate per VRF #3941 by @mmaaloul in https://github.com/aristanetworks/avd/pull/4122 +- Feat(eos_cli_config_gen): Support of static IPv6 neighbor entries by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/4075 +- Feat(eos_designs): Add platform settings for WAN devices by @ayushmittal-arista in https://github.com/aristanetworks/avd/pull/4027 +- Feat(eos_designs): Add support for 'uplink_mtu' under node config by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/4040 +- Feat(eos_designs): Add support for directly connected WAN HA by @gmuloc in https://github.com/aristanetworks/avd/pull/3720 +- Feat(eos_designs): Add support to enable BGP peering with wan provider by @ayushmittal-arista in https://github.com/aristanetworks/avd/pull/4079 +- Feat(eos_designs): Allow 'evpn_vlan_bundle' to be set up at tenant level by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/4093 +- Feat(eos_designs): Allow reuse of cross-device BGP peer ip by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/4050 +- Feat(eos_designs): Disable per interface MTU for 7010TX by @xaviramon in https://github.com/aristanetworks/avd/pull/4053 +- Feat(eos_designs): Enforce unicity of region IDs and per-region site IDs for CV Pathfinder by @gmuloc in https://github.com/aristanetworks/avd/pull/4121 +- Feat(eos_validate_state): Add support for ANTA v1.0.0 by @carl-baillargeon in https://github.com/aristanetworks/avd/pull/4123 +- Feat(eos_validate_state): Added the validation for IP security connections by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/3911 +- Feat(eos_validate_state): Added the validation for STUN client configurations by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/3898 +- Refactor(cv_deploy): Optimize creation of configlet containers by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3950 +- Refactor(eos_cli_config_gen): Addressed missed comments for patch-panel by @gmuloc in https://github.com/aristanetworks/avd/pull/4078 +- Refactor(eos_cli_config_gen): Move eos_cli_config_gen to pyavd by @gmuloc in https://github.com/aristanetworks/avd/pull/4117 +- Refactor(eos_designs): Move eos_designs Python modules to PyAVD by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4120 +- Refactor(eos_designs): Move eos_designs_facts to PyAVD by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4110 +- Refactor(eos_designs): Move eos_designs_shared_utils to PyAVD by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4126 +- Refactor(plugins): Deprecate various unused Ansible plugins by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4166 +- Refactor(plugins): Move internal AVD code to PyAVD by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4140 +- Refactor(plugins): Move internal cv_client code to PyAVD by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4141 +- Refactor(plugins): Move jinja filter code for `arista.avd.default` to PyAVD by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4047 +- Refactor(plugins): Move jinja filter code for arista.avd.add_md_toc to PyAVD by @gmuloc in https://github.com/aristanetworks/avd/pull/4104 +- Refactor(plugins): Move jinja filter code for arista.avd.convert_dicts to PyAVD by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4069 +- Refactor(plugins): Move jinja filter code for arista.avd.encrypt and arista.avd.decrypt to PyAVD by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/4135 +- Refactor(plugins): Move jinja filter code for arista.avd.generate_esi to PyAVD by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4114 +- Refactor(plugins): Move jinja filter code for arista.avd.generate_lacp_id to PyAVD by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4139 +- Refactor(plugins): Move jinja filter code for arista.avd.generate_route_target to PyAVD by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4101 +- Refactor(plugins): Move jinja filter code for arista.avd.hide_passwords to PyAVD by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4112 +- Refactor(plugins): Move jinja filter code for arista.avd.is_in_filter to PyAVD by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4133 +- Refactor(plugins): Move jinja filter code for arista.avd.list_compress to PyAVD by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4099 +- Refactor(plugins): Move jinja filter code for arista.avd.natural_sort to PyAVD by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4068 +- Refactor(plugins): Move jinja filter code for arista.avd.range_expand to PyAVD by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/4138 +- Refactor(plugins): Move jinja filter code for arista.avd.snmp_hash to PyAVD by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4136 +- Refactor(plugins): Move jinja filter code for arista.avd.status_render to PyAVD by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4142 +- Refactor(plugins): Move jinja test code for arista.avd.contains to PyAVD by @gmuloc in https://github.com/aristanetworks/avd/pull/4131 +- Refactor(plugins): Move jinja test code for arista.avd.defined to PyAVD by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4143 +- Refactor(plugins): Move schema code and schema fragments to PyAVD by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4130 +- Refactor: Deprecate Python3.9 support by @gmuloc in https://github.com/aristanetworks/avd/pull/4177 +- Refactor: Move requirements to PyAVD by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4147 + +Bugfixes +-------- + +- Fix(containers): Add "remoteUser": "avd" to devcontainer by @carlbuchmann in https://github.com/aristanetworks/avd/pull/4043 +- Fix(cv_deploy): Improve SWG API handling for Zscaler internet exit by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4090 +- Fix(eos_cli_config_gen): BGP models has supress-map which is not present in EOS commands. by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/4054 +- Fix(eos_cli_config_gen): Fix MSDP template typo for sa_filter.out_list by @gusmb in https://github.com/aristanetworks/avd/pull/4161 +- Fix(eos_cli_config_gen): Fix the templates for event-handlers by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4055 +- Fix(eos_designs)!: Remove eBGP LAN outbound route-map for WAN by @gmuloc in https://github.com/aristanetworks/avd/pull/4107 +- Fix(eos_designs): Address ipv4_acl_in/out not working for WAN l3 subinterfaces by @gmuloc in https://github.com/aristanetworks/avd/pull/4116 +- Fix(eos_designs): Inband mgmt route-map and prefix-list should not be applied without overlay_routing_protocol by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4045 +- Fix(eos_designs): WAN Exclude interface IP address from direct internet-exit NAT ACL by @ayushmittal-arista in https://github.com/aristanetworks/avd/pull/4096 +- Fix(eos_designs): core_interfaces generates invalid config if ASN is not defined for the p2p_links/p2p_links_profiles by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4046 +- Fix(eos_validate_state): Update error message when a device does not have httpapi _sub_plugin by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/4049 +- Fix: Adjust inventory group names in molecule tests to follow Ansible guidelines by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/4097 +- Fix: Change the required arguments for eos_cli_config_gen action plugin by @gmuloc in https://github.com/aristanetworks/avd/pull/4152 + +New Modules +----------- + +- arista.avd.eos_cli_config_gen - Generate AVD EOS device configurations and documentations + +v4.8.0 +====== + +Release Summary +--------------- + +Release 4.8.0 - See documentation on avd.arista.com for details. + +Minor Changes +------------- + +- Bump(eos_validate_state): ANTA Update eos_validate_state code to support ANTA v0.14.0 by @carl-baillargeon in https://github.com/aristanetworks/avd/pull/3871 +- Bump(requirements): Bump black from 24.3.0 to 24.4.0 in /ansible_collections/arista/avd by @dependabot in https://github.com/aristanetworks/avd/pull/3860 +- Bump(requirements): Bump black from 24.4.0 to 24.4.1 in /ansible_collections/arista/avd by @dependabot in https://github.com/aristanetworks/avd/pull/3906 +- Bump(requirements): Bump black from 24.4.1 to 24.4.2 in /ansible_collections/arista/avd by @dependabot in https://github.com/aristanetworks/avd/pull/3913 +- Bump(requirements): Set minimum ansible-core version to 2.15.x and maximum to 2.17.x by @carlbuchmann in https://github.com/aristanetworks/avd/pull/3927 +- Bump(requirements): Support newer jsonschema versions by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3934 +- Doc(eos_cli_config_gen): Add missing switchport port security table to documentation by @carlbuchmann in https://github.com/aristanetworks/avd/pull/3880 +- Doc(eos_designs): Fix indentation in WAN how-to by @gmuloc in https://github.com/aristanetworks/avd/pull/4010 +- Doc(eos_validate_state): Add link for OSX fork issue by @gmuloc in https://github.com/aristanetworks/avd/pull/3902 +- Doc(plugins): Fix wrong module name in eos_designs_structured_config module doc by @gmuloc in https://github.com/aristanetworks/avd/pull/3795 +- Doc: Fix examples for connected endpoints using deprecated data-model in input-varaibles.md by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3989 +- Doc: Move documentation of mlag_ibgp_peering_vrfs to network services section. by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3992 +- Doc: Readme updates to align with the new Red Hat template by @JulioPDX in https://github.com/aristanetworks/avd/pull/4024 +- Doc: Release 4.7.1 by @carlbuchmann in https://github.com/aristanetworks/avd/pull/3846 +- Doc: Update CSS to bring `code` to 100% size by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3917 +- Doc: Update installation guide to avoid 'pipx' by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3863 +- Doc: Updated the documentation for IPv4 ACL by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/3955 +- Feat(eos_cli_config_gen): Add policy-maps qos police. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3620 +- Feat(eos_cli_config_gen): Add DHCP server options for TFTP and DNS by @jrecchia1029 in https://github.com/aristanetworks/avd/pull/3993 +- Feat(eos_cli_config_gen): Add FQDN & UFQDN support for ike profile local-id by @gmuloc in https://github.com/aristanetworks/avd/pull/3832 +- Feat(eos_cli_config_gen): Add IPsec and NAT options to tunnel_interfaces. by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3830 +- Feat(eos_cli_config_gen): Add InfluxDB support by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3705 +- Feat(eos_cli_config_gen): Add Regex pattern for region/zone/site name for router_adapative_virtual_topology by @ayushmittal-arista in https://github.com/aristanetworks/avd/pull/4026 +- Feat(eos_cli_config_gen): Add aaa unresponsive action under global dot1x by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3739 +- Feat(eos_cli_config_gen): Add capability to disable address-only for connectivity monitors by @gmuloc in https://github.com/aristanetworks/avd/pull/3867 +- Feat(eos_cli_config_gen): Add eos_cli support under router_isis. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3745 +- Feat(eos_cli_config_gen): Add event-handler trigger on-maintenance. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3629 +- Feat(eos_cli_config_gen): Add l4 to application traffic recognition by @colinmacgiolla in https://github.com/aristanetworks/avd/pull/3780 +- Feat(eos_cli_config_gen): Add option for dot1x aaa accounting update interval x seconds. by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4017 +- Feat(eos_cli_config_gen): Add router internet-exit. by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3748 +- Feat(eos_cli_config_gen): Add router segment security by @colinmacgiolla in https://github.com/aristanetworks/avd/pull/3782 +- Feat(eos_cli_config_gen): Add router service-insertion subcommands for Internet Exit by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3757 +- Feat(eos_cli_config_gen): Add support for BGP TCP AO. by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3853 +- Feat(eos_cli_config_gen): Add support for L2 in-place adjacency replacement (IAR) by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/3990 +- Feat(eos_cli_config_gen): Add support for copp policy-maps. by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3895 +- Feat(eos_cli_config_gen): Add support for isis spf-interval hold timer. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3912 +- Feat(eos_cli_config_gen): Add support for raw `eos_cli` under `router_bgp` by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3673 +- Feat(eos_cli_config_gen): Add transceiver.frequency under ethernet_interfaces by @ccsnw in https://github.com/aristanetworks/avd/pull/4003 +- Feat(eos_cli_config_gen): Adding 'ip igmp host-proxy' interface support by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3657 +- Feat(eos_cli_config_gen): Adding segment-security in hardware counters. by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4000 +- Feat(eos_cli_config_gen): Enhance event-handlers model to accommodate other triggers with their specificities. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3878 +- Feat(eos_cli_config_gen): Implement managing RCF. by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3798 +- Feat(eos_cli_config_gen): Option to set RCF address-family ipv4, ipv6 and evpn by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3814 +- Feat(eos_cli_config_gen): Option to set RCF for route bgp ipv4/ipv6 mulit-cast and VRF by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3821 +- Feat(eos_cli_config_gen): Option to set RCF route bgp address-family vpn-ipv6/ipv4 and redistribute. by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3819 +- Feat(eos_cli_config_gen): Support SA lifetime for IP sec by @gmuloc in https://github.com/aristanetworks/avd/pull/3875 +- Feat(eos_cli_config_gen): Support activity polling-interval for router multicast. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3893 +- Feat(eos_cli_config_gen): Support additional options for IP DHCP relay and IPv6 DHCP relay by @bjmeuer in https://github.com/aristanetworks/avd/pull/3925 +- Feat(eos_cli_config_gen): Support additional options for IPv6 ND under SVIs by @bjmeuer in https://github.com/aristanetworks/avd/pull/3935 +- Feat(eos_cli_config_gen): Support for MSS Clamping on ethernet interfaces. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4018 +- Feat(eos_cli_config_gen): Support for additional commands under the EVPN address family by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/3881 +- Feat(eos_cli_config_gen): Support for configuring logging level facilities by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/3944 +- Feat(eos_cli_config_gen): Support logging transceiver in monitor layer1 by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3991 +- Feat(eos_cli_config_gen): Support port-only option in IP NAT pools by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3840 +- Feat(eos_cli_config_gen): add hardware flow tracking standard record format support by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3681 +- Feat(eos_designs): Add knob for IS-IS system-id format by @ZoeyFahner-Arista in https://github.com/aristanetworks/avd/pull/3677 +- Feat(eos_designs): Add metadata for Zscaler internet-exit by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3886 +- Feat(eos_designs): Add more granular settings for flow_tracking by @ayushmittal-arista in https://github.com/aristanetworks/avd/pull/3776 +- Feat(eos_designs): Add optional cv-pathfinder site for pathfinders by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3904 +- Feat(eos_designs): Add pim ipv4 sparse_mode on core_interfaces/l3_edge interfaces. by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3831 +- Feat(eos_designs): Add platform specific management security entropy source settings. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3810 +- Feat(eos_designs): Add sample rate to sflow settings in eos_designs. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3891 +- Feat(eos_designs): Add structured_config support in platform_settings. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3807 +- Feat(eos_designs): Add support for Zscaler internet-exit policy by @gmuloc in https://github.com/aristanetworks/avd/pull/3833 +- Feat(eos_designs): Add support for ipv4_acl_in/out on SVIs defined under network services. by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3791 +- Feat(eos_designs): Add support for local internet exit by @ayushmittal-arista in https://github.com/aristanetworks/avd/pull/3952 +- Feat(eos_designs): Add support for mlag_peer_ipv6_pool by @Xatrekak in https://github.com/aristanetworks/avd/pull/3885 +- Feat(eos_designs): Add support for setting mgmt_gateway under the node settings. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3799 +- Feat(eos_designs): Added for L3LS P2P addressing via Spine using "downlink_pools" data model by @hubert-arista in https://github.com/aristanetworks/avd/pull/3693 +- Feat(eos_designs): Allow VLAN Aware Bundles even if common evpn_vlan_aware_bundles is false by @bjmeuer in https://github.com/aristanetworks/avd/pull/3827 +- Feat(eos_designs): Extend the functionality of the is_deployed flag to shutdown BGP peerings. by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3916 +- Feat(eos_designs): IPv4/IPv6 address-family configuration for bgp_peer_groups defined under network services. by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3887 +- Feat(eos_designs, eos_cli_config_gen): Add BFD option for underlay ISIS by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3683 +- Feat(eos_designs,eos_cli_config_gen): Add support for MLAG port-channels to endpoints with PTP by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3672 +- Feat(eos_validate_state): Added the validation for BGP address families(link-state, path-selection and ipv4/ipv6 sr-te) by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/3872 +- Feat(plugins): Revert support braces in range_expand filter (#3244)" by @carlbuchmann in https://github.com/aristanetworks/avd/pull/4013 +- Feat(plugins): Support braces in range_expand filter by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3244 +- Feat(pyavd): Add optional dependency pyavd by @dlobato in https://github.com/aristanetworks/avd/pull/3852 +- Fix(pyavd): Remove accidental requirement for PyYAML by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3838 +- Refactor(eos_cli_config_gen): Modifying the data-model for management security entropy source by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3841 +- Refactor(eos_designs): Minor code adjustments caught by latest pylint by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4021 +- Refactor(eos_designs): Source more Zscaler metadata from lookup plugin by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3977 +- Refactor(plugins): Move WAN internet-exit zscaler integration to eos_designs by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4002 +- Refactor(plugins): Rewrite add_md_toc by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4011 +- Refactor(plugins): Update cloudvision api with latest proto files by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3995 +- Refactor(plugins): Update cv_client to use SetSome for topology studio inputs by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3803 +- Refactor(pyavd): Lazy imports of vendored code by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3923 +- Revert: "Bump pre-commit-ci/lite-action from 1.0.0 to 1.0.2" by @gmuloc in https://github.com/aristanetworks/avd/pull/3868 + +Bugfixes +-------- + +- Fix(cv_deploy): Detect pathfinder metadata studio version and skip unsupported fields by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3986 +- Fix(cv_deploy): Fix internet exit metadata by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3956 +- Fix(dhcp_provisioner): Support custom `node_type_keys` as a list of dicts. by @philippebureau in https://github.com/aristanetworks/avd/pull/3813 +- Fix(eos_cli_config_gen): Fix the schema and template for action in event-handler. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4007 +- Fix(eos_cli_config_gen): Missing variable protection in Jinja Templates. by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4005 +- Fix(eos_cli_config_gen): Remove requirement for original_ip to be unique under interface IP NAT by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3900 +- Fix(eos_cli_config_gen): Render access vlan on port-channel interfaces if mode is dot1q-tunnel. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3920 +- Fix(eos_designs): Connected endpoints ESI should only be configured on EVPN VTEPs. by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/4020 +- Fix(eos_designs): Fix code error for monitor_sessions for network_ports by @gmuloc in https://github.com/aristanetworks/avd/pull/3818 +- Fix(eos_designs): Fix missing features from LACP fallback individual by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3862 +- Fix(eos_designs): Inband ztp works with inband_mgmt_ip key by @jrecchia1029 in https://github.com/aristanetworks/avd/pull/3908 +- Fix(eos_designs): Make WAN RRs route-reflector clients of each other by @gmuloc in https://github.com/aristanetworks/avd/pull/3921 +- Fix(eos_designs): Remove the remaining trailing slashes in schema by @gmuloc in https://github.com/aristanetworks/avd/pull/3961 +- Fix(eos_designs): Sanitize interface name in STUN profile name by @gmuloc in https://github.com/aristanetworks/avd/pull/3949 +- Fix(eos_designs): WAN Internet-exit fixes for Zscaler integration by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3984 +- Fix(eos_designs): Wrong IPsec profile name for Zscaler by @gmuloc in https://github.com/aristanetworks/avd/pull/3948 +- Fix(eos_validate_state): ANTA Remove the use of the eos_design's "type" variable by @carl-baillargeon in https://github.com/aristanetworks/avd/pull/3870 +- Fix(plugins): Fix cv_zscaler_endpoints lookup plugin by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3946 +- Fix(plugins): Handle md-toc v9 by @carlbuchmann in https://github.com/aristanetworks/avd/pull/3837 +- Fix: Fixing event-handlers in eos_designs_unit_tests molecule scenario. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3938 +- Fix: Remove "not RFC1918 IPs" from examples. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3800 + v4.7.1 ====== diff --git a/ansible_collections/arista/avd/README.md b/ansible_collections/arista/avd/README.md index 7a99fa8e517..73f88010a59 100644 --- a/ansible_collections/arista/avd/README.md +++ b/ansible_collections/arista/avd/README.md @@ -4,82 +4,111 @@ ~ that can be found in the LICENSE file. --> -# Arista Validated Designs +# arista.avd - Design Driven Network Automation -
Arista AVD Overview
- -Arista Validated Designs (AVD) is an extensible data model that defines Arista's Unified Cloud Network architecture as "code". - -## Features +## Description - **Flexibility with Open Data Models:** Extensible fabric-wide network models, simplifying configuration, delivering consistency, and reducing errors - **Simplification through Multi-Domain Automation:** A framework that can automate the data center, campus or wide area network, enabled by a consistent EOS software image and management platform -- **Comprehensive Workflows:** Automating the full life cycle of network provisioning from config generation to pre and post-deployment validation, and self-documentation of the network +- **Comprehensive Workflows:** Automating the full life cycle of network provisioning from config generation to pre- and post-deployment validation, and self-documentation of the network -## Reference designs +AVD Documentation: -- [L3LS VXLAN-EVPN, L2LS, and MPLS](https://avd.arista.com/stable/roles/eos_designs/index.html) +- [Stable version](https://avd.arista.com/stable/) +- [Development version](https://avd.arista.com/devel/) -## AVD Ansible Collection +## Requirements -[Arista Networks](https://www.arista.com/) supports Ansible for managing devices running Arista's **Extensible Operating System (EOS)** natively through it's **EOS API (eAPI)** or [**CloudVision Portal (CVP)**](https://www.arista.com/en/products/eos/eos-cloudvision). The collection includes a set of Ansible roles and modules to help kick-start your automation with Arista. The various roles and templates provided are designed to be customized and extended to your needs. +The AVD collection has the following requirements: -Full documentation for the collection: +- Python 3.9 or above +- Ansible Core 2.15.0 to 2.17.x +- [Additional Python Dependencies](#additional-python-dependencies) +- Modify the `ansible.cfg` file to support additional Jinja2 extensions -- [stable version](https://avd.arista.com/stable/) -- [development version](https://www.avd.sh/en/devel/) +## Installations -### Roles overview +Before using this collection, you need to install it with the Ansible Galaxy command-line tool: -This repository provides content for Arista's **arista.avd** collection. The following roles are included. +```shell +ansible-galaxy collection install arista.avd +``` -- [**arista.avd.eos_designs**](roles/eos_designs/README.md) - Opinionated Data model to assist with the deployment of Arista Validated Designs. -- [**arista.avd.eos_cli_config_gen**](roles/eos_cli_config_gen/README.md) - Generate Arista EOS cli syntax and device documentation. -- [**arista.avd.eos_config_deploy_cvp**](roles/eos_config_deploy_cvp/README.md) - Deploys intended configuration via CloudVision. -- [**arista.avd.eos_config_deploy_eapi**](roles/eos_config_deploy_eapi/README.md) - Deploys intended configuration via eAPI. -- [**arista.avd.cvp_configlet_upload**](roles/cvp_configlet_upload/README.md) - Uploads configlets from a local folder to CloudVision Server. -- [**arista.avd.eos_validate_state**](roles/eos_validate_state/README.md) - Validate operational states of Arista EOS devices. -- [**arista.avd.eos_snapshot**](roles/eos_snapshot/README.md) - Collect commands on EOS devices and generate reports. -- [**arista.avd.dhcp_provisioner**](roles/dhcp_provisioner/README.md) - Configure an ISC-DHCP server to provide ZTP services and CloudVision registration. -- [**arista.avd.cv_deploy**](roles/cv_deploy/README.md) - Deploys EOS device configurations and tags to the CloudVision management platform. +You can also include it in a `requirements.yml` file and install it with `ansible-galaxy collection install -r requirements.yml`, using the format: -![Arista AVD Overview](docs/_media/avd_roles_dark.svg#only-dark) -![Arista AVD Overview](docs/_media/avd_roles_light.svg#only-light) +```yaml +collections: + - name: arista.avd +``` -### Collection installation +Note that if you install the collection from Ansible Galaxy, it will not be upgraded automatically when you upgrade the Ansible package. -Ansible galaxy hosts all stable versions of the `arista.avd` collection. Installation from ansible-galaxy is the most convenient approach for consuming `arista.avd` content. Please follow the collection installation [guide](https://avd.arista.com/stable/docs/installation/collection-installation.html). +To upgrade the collection to the latest available version, run the following command: -### Examples +```shell +ansible-galaxy collection install arista.avd --upgrade +``` -- [Getting started](https://avd.arista.com/stable/docs/getting-started/intro-to-ansible-and-avd.html) -- [Arista NetDevOps GitHub repository](https://github.com/aristanetworks/netdevops-examples) +You can also install a specific version of the collection, for example, if you need to downgrade when something is broken in the latest version (please report an issue in this repository). Use the following syntax to install version 4.7.1: + +```shell +ansible-galaxy collection install arista.avd:==4.7.1 +``` + +See [using Ansible collections](https://docs.ansible.com/ansible/devel/collections_guide/index.html) for more details. + +### Additional Python Dependencies + +The AVD collection requires the installation of additional Python packages. To ensure you install the correct versions, run the following commands: + +```shell +export ARISTA_AVD_DIR=$(ansible-galaxy collection list arista.avd --format yaml | head -1 | cut -d: -f1) +pip3 install -r ${ARISTA_AVD_DIR}/arista/avd/requirements.txt +``` -### Custom plugins & modules +### Enable Jinja2 Extensions -See the section "Ansible Collection Plugins" on the menu to the left. +In your `ansible.cfg` file, add the following modifications: -## Additional resources +```ini +[defaults] +jinja2_extensions=jinja2.ext.loopcontrols,jinja2.ext.do +duplicate_dict_key=error +``` -- Ansible [EOS modules](https://docs.ansible.com/ansible/latest/collections/arista/eos/index.html) on Ansible documentation -- Ansible [CloudVision modules](https://cvp.avd.sh/en/stable/) -- [CloudVision Portal](https://www.arista.com/en/products/eos/eos-cloudvision) -- [Arista Design and Deployment Guides](https://www.arista.com/en/solutions/design-guides) +## Use Cases -## Ask a question +Please see the documentation for examples in data center, campus, and wide area network environments. -Support for the `arista.avd` collection is provided by the community directly in this repository. If you have any questions, please leverage the GitHub [discussions board](https://github.com/aristanetworks/avd/discussions). +- [Getting started](https://avd.arista.com/stable/docs/getting-started/intro-to-ansible-and-avd.html) +- [Examples](https://avd.arista.com/stable/examples/single-dc-l3ls/index.html) -### Official Arista support +### Testing -AVD version 4.x releases with full support from Arista TAC. If your organization has the appropriate support agreement, please don't hesitate to contact TAC with any questions or issues. +Every pull request is thoroughly tested by our extensive CI pipeline and reviewed by the AVD Maintainer team. ## Contributing Contributing pull requests are gladly welcomed for this repository. If you are planning a big change, please start a discussion first to make sure we'll be able to merge it. Please see [contribution guide](https://avd.arista.com/stable/docs/contribution/overview.html) for additional details. -You can also open an [issue](https://github.com/aristanetworks/avd/issues) to report any problems or submit enhancements. +You can also open an [issue](https://github.com/aristanetworks/avd/issues) to report any problems or submit requests for enhancements. + +## Support + +- AVD version 4.x releases with full support from Arista TAC. If your organization has the [A-Care subscription](https://www.arista.com/assets/data/pdf/AVD-A-Care-TAC-Support-Overview.pdf) please don't hesitate to contact TAC with any questions or issues. +- Community support is provided via [Github discussions board](https://github.com/aristanetworks/avd/discussions). + +## Release Notes and Roadmap + +Please see the [release notes](https://avd.arista.com) for the latest updates to the AVD collection. + +## Related Information + +- [arista.avd documentation](https://avd.arista.com) +- [Arista NetDevOps Examples](https://github.com/aristanetworks/netdevops-examples) + +## License Information -## License +Copyright (c) 2019-2024 Arista Networks, Inc. The project is published under [Apache 2.0 License](https://github.com/aristanetworks/avd/blob/devel/ansible_collections/arista/avd/LICENSE) diff --git a/ansible_collections/arista/avd/changelogs/.plugin-cache.yaml b/ansible_collections/arista/avd/changelogs/.plugin-cache.yaml index 272030d151f..a6746fe65c3 100644 --- a/ansible_collections/arista/avd/changelogs/.plugin-cache.yaml +++ b/ansible_collections/arista/avd/changelogs/.plugin-cache.yaml @@ -91,6 +91,11 @@ plugins: name: cv_workflow namespace: '' version_added: 4.7.0 + eos_cli_config_gen: + description: Generate AVD EOS device configurations and documentations + name: eos_cli_config_gen + namespace: '' + version_added: 4.9.0 eos_designs_facts: description: Set eos_designs facts name: eos_designs_facts @@ -155,4 +160,4 @@ plugins: than group_vars or host_vars name: global_vars version_added: 4.0.0 -version: 4.7.1 +version: 4.9.0 diff --git a/ansible_collections/arista/avd/changelogs/changelog.yaml b/ansible_collections/arista/avd/changelogs/changelog.yaml index 07b96b29db8..ea28ac1ff7b 100644 --- a/ansible_collections/arista/avd/changelogs/changelog.yaml +++ b/ansible_collections/arista/avd/changelogs/changelog.yaml @@ -1739,3 +1739,371 @@ releases: fragments: - v4.7.1.yml release_date: '2024-04-12' + 4.8.0: + changes: + bugfixes: + - 'Fix(cv_deploy): Detect pathfinder metadata studio version and skip unsupported + fields by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3986' + - 'Fix(cv_deploy): Fix internet exit metadata by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3956' + - 'Fix(dhcp_provisioner): Support custom `node_type_keys` as a list of dicts. + by @philippebureau in https://github.com/aristanetworks/avd/pull/3813' + - 'Fix(eos_cli_config_gen): Fix the schema and template for action in event-handler. + by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4007' + - 'Fix(eos_cli_config_gen): Missing variable protection in Jinja Templates. + by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4005' + - 'Fix(eos_cli_config_gen): Remove requirement for original_ip to be unique + under interface IP NAT by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3900' + - 'Fix(eos_cli_config_gen): Render access vlan on port-channel interfaces if + mode is dot1q-tunnel. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3920' + - 'Fix(eos_designs): Connected endpoints ESI should only be configured on EVPN + VTEPs. by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/4020' + - 'Fix(eos_designs): Fix code error for monitor_sessions for network_ports by + @gmuloc in https://github.com/aristanetworks/avd/pull/3818' + - 'Fix(eos_designs): Fix missing features from LACP fallback individual by @ClausHolbechArista + in https://github.com/aristanetworks/avd/pull/3862' + - 'Fix(eos_designs): Inband ztp works with inband_mgmt_ip key by @jrecchia1029 + in https://github.com/aristanetworks/avd/pull/3908' + - 'Fix(eos_designs): Make WAN RRs route-reflector clients of each other by @gmuloc + in https://github.com/aristanetworks/avd/pull/3921' + - 'Fix(eos_designs): Remove the remaining trailing slashes in schema by @gmuloc + in https://github.com/aristanetworks/avd/pull/3961' + - 'Fix(eos_designs): Sanitize interface name in STUN profile name by @gmuloc + in https://github.com/aristanetworks/avd/pull/3949' + - 'Fix(eos_designs): WAN Internet-exit fixes for Zscaler integration by @ClausHolbechArista + in https://github.com/aristanetworks/avd/pull/3984' + - 'Fix(eos_designs): Wrong IPsec profile name for Zscaler by @gmuloc in https://github.com/aristanetworks/avd/pull/3948' + - 'Fix(eos_validate_state): ANTA Remove the use of the eos_design''s "type" + variable by @carl-baillargeon in https://github.com/aristanetworks/avd/pull/3870' + - 'Fix(plugins): Fix cv_zscaler_endpoints lookup plugin by @ClausHolbechArista + in https://github.com/aristanetworks/avd/pull/3946' + - 'Fix(plugins): Handle md-toc v9 by @carlbuchmann in https://github.com/aristanetworks/avd/pull/3837' + - 'Fix: Fixing event-handlers in eos_designs_unit_tests molecule scenario. by + @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3938' + - 'Fix: Remove "not RFC1918 IPs" from examples. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3800' + minor_changes: + - 'Bump(eos_validate_state): ANTA Update eos_validate_state code to support + ANTA v0.14.0 by @carl-baillargeon in https://github.com/aristanetworks/avd/pull/3871' + - 'Bump(requirements): Bump black from 24.3.0 to 24.4.0 in /ansible_collections/arista/avd + by @dependabot in https://github.com/aristanetworks/avd/pull/3860' + - 'Bump(requirements): Bump black from 24.4.0 to 24.4.1 in /ansible_collections/arista/avd + by @dependabot in https://github.com/aristanetworks/avd/pull/3906' + - 'Bump(requirements): Bump black from 24.4.1 to 24.4.2 in /ansible_collections/arista/avd + by @dependabot in https://github.com/aristanetworks/avd/pull/3913' + - 'Bump(requirements): Set minimum ansible-core version to 2.15.x and maximum + to 2.17.x by @carlbuchmann in https://github.com/aristanetworks/avd/pull/3927' + - 'Bump(requirements): Support newer jsonschema versions by @ClausHolbechArista + in https://github.com/aristanetworks/avd/pull/3934' + - 'Doc(eos_cli_config_gen): Add missing switchport port security table to documentation + by @carlbuchmann in https://github.com/aristanetworks/avd/pull/3880' + - 'Doc(eos_designs): Fix indentation in WAN how-to by @gmuloc in https://github.com/aristanetworks/avd/pull/4010' + - 'Doc(eos_validate_state): Add link for OSX fork issue by @gmuloc in https://github.com/aristanetworks/avd/pull/3902' + - 'Doc(plugins): Fix wrong module name in eos_designs_structured_config module + doc by @gmuloc in https://github.com/aristanetworks/avd/pull/3795' + - 'Doc: Fix examples for connected endpoints using deprecated data-model in + input-varaibles.md by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3989' + - 'Doc: Move documentation of mlag_ibgp_peering_vrfs to network services section. + by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3992' + - 'Doc: Readme updates to align with the new Red Hat template by @JulioPDX in + https://github.com/aristanetworks/avd/pull/4024' + - 'Doc: Release 4.7.1 by @carlbuchmann in https://github.com/aristanetworks/avd/pull/3846' + - 'Doc: Update CSS to bring `code` to 100% size by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3917' + - 'Doc: Update installation guide to avoid ''pipx'' by @ClausHolbechArista in + https://github.com/aristanetworks/avd/pull/3863' + - 'Doc: Updated the documentation for IPv4 ACL by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/3955' + - 'Feat(eos_cli_config_gen): Add policy-maps qos police. by @Shivani-gslab + in https://github.com/aristanetworks/avd/pull/3620' + - 'Feat(eos_cli_config_gen): Add DHCP server options for TFTP and DNS by @jrecchia1029 + in https://github.com/aristanetworks/avd/pull/3993' + - 'Feat(eos_cli_config_gen): Add FQDN & UFQDN support for ike profile local-id + by @gmuloc in https://github.com/aristanetworks/avd/pull/3832' + - 'Feat(eos_cli_config_gen): Add IPsec and NAT options to tunnel_interfaces. + by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3830' + - 'Feat(eos_cli_config_gen): Add InfluxDB support by @laxmikantchintakindi in + https://github.com/aristanetworks/avd/pull/3705' + - 'Feat(eos_cli_config_gen): Add Regex pattern for region/zone/site name for + router_adapative_virtual_topology by @ayushmittal-arista in https://github.com/aristanetworks/avd/pull/4026' + - 'Feat(eos_cli_config_gen): Add aaa unresponsive action under global dot1x + by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3739' + - 'Feat(eos_cli_config_gen): Add capability to disable address-only for connectivity + monitors by @gmuloc in https://github.com/aristanetworks/avd/pull/3867' + - 'Feat(eos_cli_config_gen): Add eos_cli support under router_isis. by @Shivani-gslab + in https://github.com/aristanetworks/avd/pull/3745' + - 'Feat(eos_cli_config_gen): Add event-handler trigger on-maintenance. by @Shivani-gslab + in https://github.com/aristanetworks/avd/pull/3629' + - 'Feat(eos_cli_config_gen): Add l4 to application traffic recognition by @colinmacgiolla + in https://github.com/aristanetworks/avd/pull/3780' + - 'Feat(eos_cli_config_gen): Add option for dot1x aaa accounting update interval + x seconds. by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4017' + - 'Feat(eos_cli_config_gen): Add router internet-exit. by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3748' + - 'Feat(eos_cli_config_gen): Add router segment security by @colinmacgiolla + in https://github.com/aristanetworks/avd/pull/3782' + - 'Feat(eos_cli_config_gen): Add router service-insertion subcommands for Internet + Exit by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3757' + - 'Feat(eos_cli_config_gen): Add support for BGP TCP AO. by @laxmikantchintakindi + in https://github.com/aristanetworks/avd/pull/3853' + - 'Feat(eos_cli_config_gen): Add support for L2 in-place adjacency replacement + (IAR) by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/3990' + - 'Feat(eos_cli_config_gen): Add support for copp policy-maps. by @laxmikantchintakindi + in https://github.com/aristanetworks/avd/pull/3895' + - 'Feat(eos_cli_config_gen): Add support for isis spf-interval hold timer. by + @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3912' + - 'Feat(eos_cli_config_gen): Add support for raw `eos_cli` under `router_bgp` + by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3673' + - 'Feat(eos_cli_config_gen): Add transceiver.frequency under ethernet_interfaces + by @ccsnw in https://github.com/aristanetworks/avd/pull/4003' + - 'Feat(eos_cli_config_gen): Adding ''ip igmp host-proxy'' interface support + by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3657' + - 'Feat(eos_cli_config_gen): Adding segment-security in hardware counters. by + @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4000' + - 'Feat(eos_cli_config_gen): Enhance event-handlers model to accommodate other + triggers with their specificities. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3878' + - 'Feat(eos_cli_config_gen): Implement managing RCF. by @laxmikantchintakindi + in https://github.com/aristanetworks/avd/pull/3798' + - 'Feat(eos_cli_config_gen): Option to set RCF address-family ipv4, ipv6 and + evpn by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3814' + - 'Feat(eos_cli_config_gen): Option to set RCF for route bgp ipv4/ipv6 mulit-cast + and VRF by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3821' + - 'Feat(eos_cli_config_gen): Option to set RCF route bgp address-family vpn-ipv6/ipv4 + and redistribute. by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3819' + - 'Feat(eos_cli_config_gen): Support SA lifetime for IP sec by @gmuloc in https://github.com/aristanetworks/avd/pull/3875' + - 'Feat(eos_cli_config_gen): Support activity polling-interval for router multicast. + by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3893' + - 'Feat(eos_cli_config_gen): Support additional options for IP DHCP relay and + IPv6 DHCP relay by @bjmeuer in https://github.com/aristanetworks/avd/pull/3925' + - 'Feat(eos_cli_config_gen): Support additional options for IPv6 ND under SVIs + by @bjmeuer in https://github.com/aristanetworks/avd/pull/3935' + - 'Feat(eos_cli_config_gen): Support for MSS Clamping on ethernet interfaces. + by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4018' + - 'Feat(eos_cli_config_gen): Support for additional commands under the EVPN + address family by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/3881' + - 'Feat(eos_cli_config_gen): Support for configuring logging level facilities + by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/3944' + - 'Feat(eos_cli_config_gen): Support logging transceiver in monitor layer1 by + @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3991' + - 'Feat(eos_cli_config_gen): Support port-only option in IP NAT pools by @Vibhu-gslab + in https://github.com/aristanetworks/avd/pull/3840' + - 'Feat(eos_cli_config_gen): add hardware flow tracking standard record format + support by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3681' + - 'Feat(eos_designs): Add knob for IS-IS system-id format by @ZoeyFahner-Arista + in https://github.com/aristanetworks/avd/pull/3677' + - 'Feat(eos_designs): Add metadata for Zscaler internet-exit by @ClausHolbechArista + in https://github.com/aristanetworks/avd/pull/3886' + - 'Feat(eos_designs): Add more granular settings for flow_tracking by @ayushmittal-arista + in https://github.com/aristanetworks/avd/pull/3776' + - 'Feat(eos_designs): Add optional cv-pathfinder site for pathfinders by @ClausHolbechArista + in https://github.com/aristanetworks/avd/pull/3904' + - 'Feat(eos_designs): Add pim ipv4 sparse_mode on core_interfaces/l3_edge interfaces. + by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3831' + - 'Feat(eos_designs): Add platform specific management security entropy source + settings. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3810' + - 'Feat(eos_designs): Add sample rate to sflow settings in eos_designs. by @Shivani-gslab + in https://github.com/aristanetworks/avd/pull/3891' + - 'Feat(eos_designs): Add structured_config support in platform_settings. by + @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3807' + - 'Feat(eos_designs): Add support for Zscaler internet-exit policy by @gmuloc + in https://github.com/aristanetworks/avd/pull/3833' + - 'Feat(eos_designs): Add support for ipv4_acl_in/out on SVIs defined under + network services. by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3791' + - 'Feat(eos_designs): Add support for local internet exit by @ayushmittal-arista + in https://github.com/aristanetworks/avd/pull/3952' + - 'Feat(eos_designs): Add support for mlag_peer_ipv6_pool by @Xatrekak in https://github.com/aristanetworks/avd/pull/3885' + - 'Feat(eos_designs): Add support for setting mgmt_gateway under the node settings. + by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3799' + - 'Feat(eos_designs): Added for L3LS P2P addressing via Spine using "downlink_pools" + data model by @hubert-arista in https://github.com/aristanetworks/avd/pull/3693' + - 'Feat(eos_designs): Allow VLAN Aware Bundles even if common evpn_vlan_aware_bundles + is false by @bjmeuer in https://github.com/aristanetworks/avd/pull/3827' + - 'Feat(eos_designs): Extend the functionality of the is_deployed flag to shutdown + BGP peerings. by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3916' + - 'Feat(eos_designs): IPv4/IPv6 address-family configuration for bgp_peer_groups + defined under network services. by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3887' + - 'Feat(eos_designs, eos_cli_config_gen): Add BFD option for underlay ISIS by + @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3683' + - 'Feat(eos_designs,eos_cli_config_gen): Add support for MLAG port-channels + to endpoints with PTP by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3672' + - 'Feat(eos_validate_state): Added the validation for BGP address families(link-state, + path-selection and ipv4/ipv6 sr-te) by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/3872' + - 'Feat(plugins): Revert support braces in range_expand filter (#3244)" by @carlbuchmann + in https://github.com/aristanetworks/avd/pull/4013' + - 'Feat(plugins): Support braces in range_expand filter by @ClausHolbechArista + in https://github.com/aristanetworks/avd/pull/3244' + - 'Feat(pyavd): Add optional dependency pyavd by @dlobato in https://github.com/aristanetworks/avd/pull/3852' + - 'Fix(pyavd): Remove accidental requirement for PyYAML by @ClausHolbechArista + in https://github.com/aristanetworks/avd/pull/3838' + - 'Refactor(eos_cli_config_gen): Modifying the data-model for management security + entropy source by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3841' + - 'Refactor(eos_designs): Minor code adjustments caught by latest pylint by + @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4021' + - 'Refactor(eos_designs): Source more Zscaler metadata from lookup plugin by + @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3977' + - 'Refactor(plugins): Move WAN internet-exit zscaler integration to eos_designs + by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4002' + - 'Refactor(plugins): Rewrite add_md_toc by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4011' + - 'Refactor(plugins): Update cloudvision api with latest proto files by @ClausHolbechArista + in https://github.com/aristanetworks/avd/pull/3995' + - 'Refactor(plugins): Update cv_client to use SetSome for topology studio inputs + by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3803' + - 'Refactor(pyavd): Lazy imports of vendored code by @ClausHolbechArista in + https://github.com/aristanetworks/avd/pull/3923' + - 'Revert: "Bump pre-commit-ci/lite-action from 1.0.0 to 1.0.2" by @gmuloc in + https://github.com/aristanetworks/avd/pull/3868' + release_summary: 'Release 4.8.0 - See documentation on avd.arista.com for details. + + ' + fragments: + - v4.8.0.yml + release_date: '2024-05-24' + 4.9.0: + changes: + bugfixes: + - 'Fix(containers): Add "remoteUser": "avd" to devcontainer by @carlbuchmann + in https://github.com/aristanetworks/avd/pull/4043' + - 'Fix(cv_deploy): Improve SWG API handling for Zscaler internet exit by @ClausHolbechArista + in https://github.com/aristanetworks/avd/pull/4090' + - 'Fix(eos_cli_config_gen): BGP models has supress-map which is not present + in EOS commands. by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/4054' + - 'Fix(eos_cli_config_gen): Fix MSDP template typo for sa_filter.out_list by + @gusmb in https://github.com/aristanetworks/avd/pull/4161' + - 'Fix(eos_cli_config_gen): Fix the templates for event-handlers by @Shivani-gslab + in https://github.com/aristanetworks/avd/pull/4055' + - 'Fix(eos_designs)!: Remove eBGP LAN outbound route-map for WAN by @gmuloc + in https://github.com/aristanetworks/avd/pull/4107' + - 'Fix(eos_designs): Address ipv4_acl_in/out not working for WAN l3 subinterfaces + by @gmuloc in https://github.com/aristanetworks/avd/pull/4116' + - 'Fix(eos_designs): Inband mgmt route-map and prefix-list should not be applied + without overlay_routing_protocol by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4045' + - 'Fix(eos_designs): WAN Exclude interface IP address from direct internet-exit + NAT ACL by @ayushmittal-arista in https://github.com/aristanetworks/avd/pull/4096' + - 'Fix(eos_designs): core_interfaces generates invalid config if ASN is not + defined for the p2p_links/p2p_links_profiles by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4046' + - 'Fix(eos_validate_state): Update error message when a device does not have + httpapi _sub_plugin by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/4049' + - 'Fix: Adjust inventory group names in molecule tests to follow Ansible guidelines + by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/4097' + - 'Fix: Change the required arguments for eos_cli_config_gen action plugin by + @gmuloc in https://github.com/aristanetworks/avd/pull/4152' + minor_changes: + - 'Bump(pyavd): Add support for Python 3.9 in PyAVD by @ClausHolbechArista in + https://github.com/aristanetworks/avd/pull/4051' + - 'Doc(eos_cli_config_gen): Include docs for router segment-security by @jonxstill + in https://github.com/aristanetworks/avd/pull/4059' + - 'Doc: Add notes about using cv_deploy for CV Pathfinder by @gmuloc in https://github.com/aristanetworks/avd/pull/4044' + - 'Doc: Added the table of WAN validation by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/4125' + - 'Doc: Contribution Guide Updates by @carlbuchmann in https://github.com/aristanetworks/avd/pull/3766' + - 'Doc: Fix mkdocs broken requirement links in roles by @gmuloc in https://github.com/aristanetworks/avd/pull/4039' + - 'Doc: Minor grammar edits. by @blitzeditor in https://github.com/aristanetworks/avd/pull/3362' + - 'Doc: Minor updates to Development Tooling guide. by @ClausHolbechArista in + https://github.com/aristanetworks/avd/pull/4067' + - 'Doc: Semantic Versioning by @carlbuchmann in https://github.com/aristanetworks/avd/pull/3417' + - 'Doc: Update installation guide with PyAVD by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4076' + - 'Doc: add CVaaS regional URLs to cv_deploy by @noredistribution in https://github.com/aristanetworks/avd/pull/4092' + - 'Feat(containers): switch to pyavd and editable install for container build + by @ankudinov in https://github.com/aristanetworks/avd/pull/4087' + - 'Feat(eos_cli_config_gen): Add Patch-Panel Connector commands by @ccsnw in + https://github.com/aristanetworks/avd/pull/4063' + - 'Feat(eos_cli_config_gen): Add option for `ospf_type` when redistributing + OSPF into BGP by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4029' + - 'Feat(eos_cli_config_gen): Add support for ''no bgp redistribute-internal'' + by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/4033' + - 'Feat(eos_cli_config_gen): Add support for MACsec fallback to unprotected + traffic by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4028' + - 'Feat(eos_cli_config_gen): Add support for Postcard telemetry by @laxmikantchintakindi + in https://github.com/aristanetworks/avd/pull/3642' + - 'Feat(eos_cli_config_gen): Add support for Router BGP missing-policy for address-family + all by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/4034' + - 'Feat(eos_cli_config_gen): Add support for dot1x captive portal and supplicant + commands by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4023' + - 'Feat(eos_cli_config_gen): Add support for permit response traffic nat under + ip acls by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4128' + - 'Feat(eos_cli_config_gen): Adding option for arp cache persistent and arp + persistent refresh-delay by @bjmeuer in https://github.com/aristanetworks/avd/pull/4109' + - 'Feat(eos_cli_config_gen): Support of BGP default-originate per VRF #3941 + by @mmaaloul in https://github.com/aristanetworks/avd/pull/4122' + - 'Feat(eos_cli_config_gen): Support of static IPv6 neighbor entries by @MaheshGSLAB + in https://github.com/aristanetworks/avd/pull/4075' + - 'Feat(eos_designs): Add platform settings for WAN devices by @ayushmittal-arista + in https://github.com/aristanetworks/avd/pull/4027' + - 'Feat(eos_designs): Add support for ''uplink_mtu'' under node config by @laxmikantchintakindi + in https://github.com/aristanetworks/avd/pull/4040' + - 'Feat(eos_designs): Add support for directly connected WAN HA by @gmuloc in + https://github.com/aristanetworks/avd/pull/3720' + - 'Feat(eos_designs): Add support to enable BGP peering with wan provider by + @ayushmittal-arista in https://github.com/aristanetworks/avd/pull/4079' + - 'Feat(eos_designs): Allow ''evpn_vlan_bundle'' to be set up at tenant level + by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/4093' + - 'Feat(eos_designs): Allow reuse of cross-device BGP peer ip by @laxmikantchintakindi + in https://github.com/aristanetworks/avd/pull/4050' + - 'Feat(eos_designs): Disable per interface MTU for 7010TX by @xaviramon in + https://github.com/aristanetworks/avd/pull/4053' + - 'Feat(eos_designs): Enforce unicity of region IDs and per-region site IDs + for CV Pathfinder by @gmuloc in https://github.com/aristanetworks/avd/pull/4121' + - 'Feat(eos_validate_state): Add support for ANTA v1.0.0 by @carl-baillargeon + in https://github.com/aristanetworks/avd/pull/4123' + - 'Feat(eos_validate_state): Added the validation for IP security connections + by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/3911' + - 'Feat(eos_validate_state): Added the validation for STUN client configurations + by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/3898' + - 'Refactor(cv_deploy): Optimize creation of configlet containers by @ClausHolbechArista + in https://github.com/aristanetworks/avd/pull/3950' + - 'Refactor(eos_cli_config_gen): Addressed missed comments for patch-panel by + @gmuloc in https://github.com/aristanetworks/avd/pull/4078' + - 'Refactor(eos_cli_config_gen): Move eos_cli_config_gen to pyavd by @gmuloc + in https://github.com/aristanetworks/avd/pull/4117' + - 'Refactor(eos_designs): Move eos_designs Python modules to PyAVD by @ClausHolbechArista + in https://github.com/aristanetworks/avd/pull/4120' + - 'Refactor(eos_designs): Move eos_designs_facts to PyAVD by @ClausHolbechArista + in https://github.com/aristanetworks/avd/pull/4110' + - 'Refactor(eos_designs): Move eos_designs_shared_utils to PyAVD by @ClausHolbechArista + in https://github.com/aristanetworks/avd/pull/4126' + - 'Refactor(plugins): Deprecate various unused Ansible plugins by @ClausHolbechArista + in https://github.com/aristanetworks/avd/pull/4166' + - 'Refactor(plugins): Move internal AVD code to PyAVD by @ClausHolbechArista + in https://github.com/aristanetworks/avd/pull/4140' + - 'Refactor(plugins): Move internal cv_client code to PyAVD by @ClausHolbechArista + in https://github.com/aristanetworks/avd/pull/4141' + - 'Refactor(plugins): Move jinja filter code for `arista.avd.default` to PyAVD + by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4047' + - 'Refactor(plugins): Move jinja filter code for arista.avd.add_md_toc to PyAVD + by @gmuloc in https://github.com/aristanetworks/avd/pull/4104' + - 'Refactor(plugins): Move jinja filter code for arista.avd.convert_dicts to + PyAVD by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4069' + - 'Refactor(plugins): Move jinja filter code for arista.avd.encrypt and arista.avd.decrypt + to PyAVD by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/4135' + - 'Refactor(plugins): Move jinja filter code for arista.avd.generate_esi to + PyAVD by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4114' + - 'Refactor(plugins): Move jinja filter code for arista.avd.generate_lacp_id + to PyAVD by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4139' + - 'Refactor(plugins): Move jinja filter code for arista.avd.generate_route_target + to PyAVD by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4101' + - 'Refactor(plugins): Move jinja filter code for arista.avd.hide_passwords to + PyAVD by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4112' + - 'Refactor(plugins): Move jinja filter code for arista.avd.is_in_filter to + PyAVD by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4133' + - 'Refactor(plugins): Move jinja filter code for arista.avd.list_compress to + PyAVD by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4099' + - 'Refactor(plugins): Move jinja filter code for arista.avd.natural_sort to + PyAVD by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4068' + - 'Refactor(plugins): Move jinja filter code for arista.avd.range_expand to + PyAVD by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/4138' + - 'Refactor(plugins): Move jinja filter code for arista.avd.snmp_hash to PyAVD + by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4136' + - 'Refactor(plugins): Move jinja filter code for arista.avd.status_render to + PyAVD by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4142' + - 'Refactor(plugins): Move jinja test code for arista.avd.contains to PyAVD + by @gmuloc in https://github.com/aristanetworks/avd/pull/4131' + - 'Refactor(plugins): Move jinja test code for arista.avd.defined to PyAVD by + @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4143' + - 'Refactor(plugins): Move schema code and schema fragments to PyAVD by @ClausHolbechArista + in https://github.com/aristanetworks/avd/pull/4130' + - 'Refactor: Deprecate Python3.9 support by @gmuloc in https://github.com/aristanetworks/avd/pull/4177' + - 'Refactor: Move requirements to PyAVD by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4147' + release_summary: 'Release 4.9.0 - See documentation on avd.arista.com for details. + + ' + fragments: + - v4.9.0.yml + modules: + - description: Generate AVD EOS device configurations and documentations + name: eos_cli_config_gen + namespace: '' + release_date: '2024-07-05' diff --git a/ansible_collections/arista/avd/changelogs/fragments_backup/v4.8.0.yml b/ansible_collections/arista/avd/changelogs/fragments_backup/v4.8.0.yml new file mode 100644 index 00000000000..0b819ff3304 --- /dev/null +++ b/ansible_collections/arista/avd/changelogs/fragments_backup/v4.8.0.yml @@ -0,0 +1,232 @@ +release_summary: | + Release 4.8.0 - See documentation on avd.arista.com for details. +bugfixes: +### Fixed issues in eos_cli_config_gen +- |- + Fix(eos_cli_config_gen): Remove requirement for original_ip to be unique under interface IP NAT by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3900 +- |- + Fix(eos_cli_config_gen): Render access vlan on port-channel interfaces if mode is dot1q-tunnel. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3920 +- |- + Fix(eos_cli_config_gen): Missing variable protection in Jinja Templates. by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4005 +- |- + Fix(eos_cli_config_gen): Fix the schema and template for action in event-handler. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4007 +### Fixed issues in eos_designs +- |- + Fix(eos_designs): Fix code error for monitor_sessions for network_ports by @gmuloc in https://github.com/aristanetworks/avd/pull/3818 +- |- + Fix(eos_designs): Fix missing features from LACP fallback individual by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3862 +- |- + Fix(eos_designs): Inband ztp works with inband_mgmt_ip key by @jrecchia1029 in https://github.com/aristanetworks/avd/pull/3908 +- |- + Fix(eos_designs): Make WAN RRs route-reflector clients of each other by @gmuloc in https://github.com/aristanetworks/avd/pull/3921 +- |- + Fix(eos_designs): Wrong IPsec profile name for Zscaler by @gmuloc in https://github.com/aristanetworks/avd/pull/3948 +- |- + Fix(eos_designs): Sanitize interface name in STUN profile name by @gmuloc in https://github.com/aristanetworks/avd/pull/3949 +- |- + Fix(eos_designs): Remove the remaining trailing slashes in schema by @gmuloc in https://github.com/aristanetworks/avd/pull/3961 +- |- + Fix(eos_designs): WAN Internet-exit fixes for Zscaler integration by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3984 +- |- + Fix(eos_designs): Connected endpoints ESI should only be configured on EVPN VTEPs. by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/4020 +### Other Fixed issues +- |- + Fix: Remove "not RFC1918 IPs" from examples. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3800 +- |- + Fix(dhcp_provisioner): Support custom `node_type_keys` as a list of dicts. by @philippebureau in https://github.com/aristanetworks/avd/pull/3813 +- |- + Fix(plugins): Handle md-toc v9 by @carlbuchmann in https://github.com/aristanetworks/avd/pull/3837 +- |- + Fix(eos_validate_state): ANTA Remove the use of the eos_design's "type" variable by @carl-baillargeon in https://github.com/aristanetworks/avd/pull/3870 +- |- + Fix: Fixing event-handlers in eos_designs_unit_tests molecule scenario. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3938 +- |- + Fix(plugins): Fix cv_zscaler_endpoints lookup plugin by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3946 +- |- + Fix(cv_deploy): Fix internet exit metadata by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3956 +- |- + Fix(cv_deploy): Detect pathfinder metadata studio version and skip unsupported fields by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3986 +minor_changes: +### Documentation +- |- + Doc(plugins): Fix wrong module name in eos_designs_structured_config module doc by @gmuloc in https://github.com/aristanetworks/avd/pull/3795 +- |- + Doc: Release 4.7.1 by @carlbuchmann in https://github.com/aristanetworks/avd/pull/3846 +- |- + Doc: Update installation guide to avoid 'pipx' by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3863 +- |- + Doc(eos_cli_config_gen): Add missing switchport port security table to documentation by @carlbuchmann in https://github.com/aristanetworks/avd/pull/3880 +- |- + Doc(eos_validate_state): Add link for OSX fork issue by @gmuloc in https://github.com/aristanetworks/avd/pull/3902 +- |- + Doc: Update CSS to bring `code` to 100% size by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3917 +- |- + Doc: Updated the documentation for IPv4 ACL by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/3955 +- |- + Doc: Move documentation of mlag_ibgp_peering_vrfs to network services section. by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3992 +- |- + Doc: Fix examples for connected endpoints using deprecated data-model in input-varaibles.md by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3989 +- |- + Doc(eos_designs): Fix indentation in WAN how-to by @gmuloc in https://github.com/aristanetworks/avd/pull/4010 +- |- + Doc: Readme updates to align with the new Red Hat template by @JulioPDX in https://github.com/aristanetworks/avd/pull/4024 +### New features and enhancements in eos_cli_config_gen +- |- + Feat(eos_cli_config_gen): Add eos_cli support under router_isis. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3745 +- |- + Feat(eos_cli_config_gen): Add support for raw `eos_cli` under `router_bgp` by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3673 +- |- + Feat(eos_cli_config_gen): Adding 'ip igmp host-proxy' interface support by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3657 +- |- + Feat(eos_cli_config_gen): add hardware flow tracking standard record format support by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3681 +- |- + Feat(eos_cli_config_gen): Add router service-insertion subcommands for Internet Exit by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3757 +- |- + Feat(eos_cli_config_gen): Add router internet-exit. by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3748 +- |- + Feat(eos_cli_config_gen): Add aaa unresponsive action under global dot1x by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3739 +- |- + Feat(eos_cli_config_gen): Add IPsec and NAT options to tunnel_interfaces. by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3830 +- |- + Feat(eos_cli_config_gen): Add policy-maps qos police. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3620 +- |- + Feat(eos_cli_config_gen): Add FQDN & UFQDN support for ike profile local-id by @gmuloc in https://github.com/aristanetworks/avd/pull/3832 +- |- + Feat(eos_cli_config_gen): Add event-handler trigger on-maintenance. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3629 +- |- + Feat(eos_cli_config_gen): Support port-only option in IP NAT pools by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3840 +- |- + Feat(eos_cli_config_gen): Add capability to disable address-only for connectivity monitors by @gmuloc in https://github.com/aristanetworks/avd/pull/3867 +- |- + Feat(eos_cli_config_gen): Support SA lifetime for IP sec by @gmuloc in https://github.com/aristanetworks/avd/pull/3875 +- |- + Feat(eos_cli_config_gen): Add l4 to application traffic recognition by @colinmacgiolla in https://github.com/aristanetworks/avd/pull/3780 +- |- + Feat(eos_cli_config_gen): Support activity polling-interval for router multicast. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3893 +- |- + Feat(eos_cli_config_gen): Support for additional commands under the EVPN address family by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/3881 +- |- + Feat(eos_cli_config_gen): Enhance event-handlers model to accommodate other triggers with their specificities. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3878 +- |- + Feat(eos_cli_config_gen): Implement managing RCF. by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3798 +- |- + Feat(eos_cli_config_gen): Add support for isis spf-interval hold timer. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3912 +- |- + Feat(eos_cli_config_gen): Support for configuring logging level facilities by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/3944 +- |- + Feat(eos_cli_config_gen): Option to set RCF route bgp address-family vpn-ipv6/ipv4 and redistribute. by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3819 +- |- + Feat(eos_cli_config_gen): Support additional options for IP DHCP relay and IPv6 DHCP relay by @bjmeuer in https://github.com/aristanetworks/avd/pull/3925 +- |- + Feat(eos_cli_config_gen): Add router segment security by @colinmacgiolla in https://github.com/aristanetworks/avd/pull/3782 +- |- + Feat(eos_cli_config_gen): Option to set RCF address-family ipv4, ipv6 and evpn by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3814 +- |- + Feat(eos_cli_config_gen): Option to set RCF for route bgp ipv4/ipv6 mulit-cast and VRF by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3821 +- |- + Feat(eos_cli_config_gen): Support additional options for IPv6 ND under SVIs by @bjmeuer in https://github.com/aristanetworks/avd/pull/3935 +- |- + Feat(eos_cli_config_gen): Add InfluxDB support by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3705 +- |- + Feat(eos_cli_config_gen): Adding segment-security in hardware counters. by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4000 +- |- + Feat(eos_cli_config_gen): Add support for L2 in-place adjacency replacement (IAR) by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/3990 +- |- + Feat(eos_cli_config_gen): Add transceiver.frequency under ethernet_interfaces by @ccsnw in https://github.com/aristanetworks/avd/pull/4003 +- |- + Feat(eos_cli_config_gen): Add option for dot1x aaa accounting update interval x seconds. by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4017 +- |- + Feat(eos_cli_config_gen): Support logging transceiver in monitor layer1 by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3991 +- |- + Feat(eos_cli_config_gen): Add support for BGP TCP AO. by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3853 +- |- + Feat(eos_cli_config_gen): Add Regex pattern for region/zone/site name for router_adapative_virtual_topology by @ayushmittal-arista in https://github.com/aristanetworks/avd/pull/4026 +- |- + Feat(eos_cli_config_gen): Support for MSS Clamping on ethernet interfaces. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4018 +- |- + Feat(eos_cli_config_gen): Add support for copp policy-maps. by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3895 +- |- + Feat(eos_cli_config_gen): Add DHCP server options for TFTP and DNS by @jrecchia1029 in https://github.com/aristanetworks/avd/pull/3993 +### New features and enhancements in eos_designs +- |- + Feat(eos_designs): Added for L3LS P2P addressing via Spine using "downlink_pools" data model by @hubert-arista in https://github.com/aristanetworks/avd/pull/3693 +- |- + Feat(eos_designs): Add knob for IS-IS system-id format by @ZoeyFahner-Arista in https://github.com/aristanetworks/avd/pull/3677 +- |- + Feat(eos_designs): Add structured_config support in platform_settings. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3807 +- |- + Feat(eos_designs): Add platform specific management security entropy source settings. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3810 +- |- + Feat(eos_designs): Add support for Zscaler internet-exit policy by @gmuloc in https://github.com/aristanetworks/avd/pull/3833 +- |- + Feat(eos_designs): Add more granular settings for flow_tracking by @ayushmittal-arista in https://github.com/aristanetworks/avd/pull/3776 +- |- + Feat(eos_designs): Add pim ipv4 sparse_mode on core_interfaces/l3_edge interfaces. by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3831 +- |- + Feat(eos_designs): Allow VLAN Aware Bundles even if common evpn_vlan_aware_bundles is false by @bjmeuer in https://github.com/aristanetworks/avd/pull/3827 +- |- + Feat(eos_designs): Add metadata for Zscaler internet-exit by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3886 +- |- + Feat(eos_designs): Add support for setting mgmt_gateway under the node settings. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3799 +- |- + Feat(eos_designs): Add optional cv-pathfinder site for pathfinders by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3904 +- |- + Feat(eos_designs): Add support for mlag_peer_ipv6_pool by @Xatrekak in https://github.com/aristanetworks/avd/pull/3885 +- |- + Feat(eos_designs): Add sample rate to sflow settings in eos_designs. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3891 +- |- + Feat(eos_designs): IPv4/IPv6 address-family configuration for bgp_peer_groups defined under network services. by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3887 +- |- + Feat(eos_designs): Extend the functionality of the is_deployed flag to shutdown BGP peerings. by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3916 +- |- + Feat(eos_designs): Add support for ipv4_acl_in/out on SVIs defined under network services. by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3791 +- |- + Feat(eos_designs): Add support for local internet exit by @ayushmittal-arista in https://github.com/aristanetworks/avd/pull/3952 +### New features and enhancement in both eos_designs and eos_cli_config_gen +- |- + Feat(eos_designs,eos_cli_config_gen): Add support for MLAG port-channels to endpoints with PTP by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3672 +- |- + Feat(eos_designs, eos_cli_config_gen): Add BFD option for underlay ISIS by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3683 +### Other new features and enhancements +- |- + Feat(eos_validate_state): Added the validation for BGP address families(link-state, path-selection and ipv4/ipv6 sr-te) by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/3872 +- |- + Feat(plugins): Support braces in range_expand filter by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3244 +- |- + Feat(plugins): Revert support braces in range_expand filter (#3244)" by @carlbuchmann in https://github.com/aristanetworks/avd/pull/4013 +### PyAVD Changes +- |- + Fix(pyavd): Remove accidental requirement for PyYAML by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3838 +- |- + Feat(pyavd): Add optional dependency pyavd by @dlobato in https://github.com/aristanetworks/avd/pull/3852 +- |- + Refactor(pyavd): Lazy imports of vendored code by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3923 +### Other Changes +- |- + Refactor(plugins): Update cv_client to use SetSome for topology studio inputs by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3803 +- |- + Refactor(eos_cli_config_gen): Modifying the data-model for management security entropy source by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3841 +- |- + Revert: "Bump pre-commit-ci/lite-action from 1.0.0 to 1.0.2" by @gmuloc in https://github.com/aristanetworks/avd/pull/3868 +- |- + Bump(requirements): Bump black from 24.3.0 to 24.4.0 in /ansible_collections/arista/avd by @dependabot in https://github.com/aristanetworks/avd/pull/3860 +- |- + Bump(eos_validate_state): ANTA Update eos_validate_state code to support ANTA v0.14.0 by @carl-baillargeon in https://github.com/aristanetworks/avd/pull/3871 +- |- + Bump(requirements): Bump black from 24.4.0 to 24.4.1 in /ansible_collections/arista/avd by @dependabot in https://github.com/aristanetworks/avd/pull/3906 +- |- + Bump(requirements): Bump black from 24.4.1 to 24.4.2 in /ansible_collections/arista/avd by @dependabot in https://github.com/aristanetworks/avd/pull/3913 +- |- + Bump(requirements): Support newer jsonschema versions by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3934 +- |- + Refactor(eos_designs): Source more Zscaler metadata from lookup plugin by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3977 +- |- + Refactor(eos_designs): Minor code adjustments caught by latest pylint by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4021 +- |- + Refactor(plugins): Update cloudvision api with latest proto files by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3995 +- |- + Refactor(plugins): Move WAN internet-exit zscaler integration to eos_designs by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4002 +- |- + Bump(requirements): Set minimum ansible-core version to 2.15.x and maximum to 2.17.x by @carlbuchmann in https://github.com/aristanetworks/avd/pull/3927 +- |- + Refactor(plugins): Rewrite add_md_toc by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4011 diff --git a/ansible_collections/arista/avd/changelogs/fragments_backup/v4.9.0.yml b/ansible_collections/arista/avd/changelogs/fragments_backup/v4.9.0.yml new file mode 100644 index 00000000000..6afc9a9036f --- /dev/null +++ b/ansible_collections/arista/avd/changelogs/fragments_backup/v4.9.0.yml @@ -0,0 +1,164 @@ +release_summary: | + Release 4.9.0 - See documentation on avd.arista.com for details. +bugfixes: +### Breaking Changes +- |- + Fix(eos_designs)!: Remove eBGP LAN outbound route-map for WAN by @gmuloc in https://github.com/aristanetworks/avd/pull/4107 +### Fixed issues in eos_cli_config_gen +- |- + Fix(eos_cli_config_gen): Fix the templates for event-handlers by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4055 +- |- + Fix(eos_cli_config_gen): BGP models has supress-map which is not present in EOS commands. by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/4054 +- |- + Fix(eos_cli_config_gen): Fix MSDP template typo for sa_filter.out_list by @gusmb in https://github.com/aristanetworks/avd/pull/4161 +### Fixed issues in eos_designs +- |- + Fix(eos_designs): Inband mgmt route-map and prefix-list should not be applied without overlay_routing_protocol by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4045 +- |- + Fix(eos_designs): core_interfaces generates invalid config if ASN is not defined for the p2p_links/p2p_links_profiles by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4046 +- |- + Fix(eos_designs): Address ipv4_acl_in/out not working for WAN l3 subinterfaces by @gmuloc in https://github.com/aristanetworks/avd/pull/4116 +- |- + Fix(eos_designs): WAN Exclude interface IP address from direct internet-exit NAT ACL by @ayushmittal-arista in https://github.com/aristanetworks/avd/pull/4096 +### Other Fixed issues +- |- + Fix(containers): Add "remoteUser": "avd" to devcontainer by @carlbuchmann in https://github.com/aristanetworks/avd/pull/4043 +- |- + Fix(eos_validate_state): Update error message when a device does not have httpapi _sub_plugin by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/4049 +- |- + Fix(cv_deploy): Improve SWG API handling for Zscaler internet exit by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4090 +- |- + Fix: Adjust inventory group names in molecule tests to follow Ansible guidelines by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/4097 +- |- + Fix: Change the required arguments for eos_cli_config_gen action plugin by @gmuloc in https://github.com/aristanetworks/avd/pull/4152 +minor_changes: +### Documentation +- |- + Doc: Fix mkdocs broken requirement links in roles by @gmuloc in https://github.com/aristanetworks/avd/pull/4039 +- |- + Doc: Contribution Guide Updates by @carlbuchmann in https://github.com/aristanetworks/avd/pull/3766 +- |- + Doc: Add notes about using cv_deploy for CV Pathfinder by @gmuloc in https://github.com/aristanetworks/avd/pull/4044 +- |- + Doc(eos_cli_config_gen): Include docs for router segment-security by @jonxstill in https://github.com/aristanetworks/avd/pull/4059 +- |- + Doc: Minor updates to Development Tooling guide. by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4067 +- |- + Doc: Update installation guide with PyAVD by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4076 +- |- + Doc: Minor grammar edits. by @blitzeditor in https://github.com/aristanetworks/avd/pull/3362 +- |- + Doc: Added the table of WAN validation by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/4125 +- |- + Doc: Semantic Versioning by @carlbuchmann in https://github.com/aristanetworks/avd/pull/3417 +- |- + Doc: add CVaaS regional URLs to cv_deploy by @noredistribution in https://github.com/aristanetworks/avd/pull/4092 +### New features and enhancements in eos_cli_config_gen +- |- + Feat(eos_cli_config_gen): Add support for Postcard telemetry by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3642 +- |- + Feat(eos_cli_config_gen): Add option for `ospf_type` when redistributing OSPF into BGP by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4029 +- |- + Feat(eos_cli_config_gen): Add support for MACsec fallback to unprotected traffic by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4028 +- |- + Feat(eos_cli_config_gen): Add Patch-Panel Connector commands by @ccsnw in https://github.com/aristanetworks/avd/pull/4063 +- |- + Feat(eos_cli_config_gen): Add support for 'no bgp redistribute-internal' by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/4033 +- |- + Feat(eos_cli_config_gen): Add support for Router BGP missing-policy for address-family all by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/4034 +- |- + Feat(eos_cli_config_gen): Add support for dot1x captive portal and supplicant commands by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4023 +- |- + Feat(eos_cli_config_gen): Adding option for arp cache persistent and arp persistent refresh-delay by @bjmeuer in https://github.com/aristanetworks/avd/pull/4109 +- |- + Feat(eos_cli_config_gen): Support of static IPv6 neighbor entries by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/4075 +- |- + Feat(eos_cli_config_gen): Add support for permit response traffic nat under ip acls by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4128 +- |- + Feat(eos_cli_config_gen): Support of BGP default-originate per VRF #3941 by @mmaaloul in https://github.com/aristanetworks/avd/pull/4122 +### New features and enhancements in eos_designs +- |- + Feat(eos_designs): Add support for 'uplink_mtu' under node config by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/4040 +- |- + Feat(eos_designs): Add platform settings for WAN devices by @ayushmittal-arista in https://github.com/aristanetworks/avd/pull/4027 +- |- + Feat(eos_designs): Disable per interface MTU for 7010TX by @xaviramon in https://github.com/aristanetworks/avd/pull/4053 +- |- + Feat(eos_designs): Allow reuse of cross-device BGP peer ip by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/4050 +- |- + Feat(eos_designs): Allow 'evpn_vlan_bundle' to be set up at tenant level by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/4093 +- |- + Feat(eos_designs): Enforce unicity of region IDs and per-region site IDs for CV Pathfinder by @gmuloc in https://github.com/aristanetworks/avd/pull/4121 +- |- + Feat(eos_designs): Add support for directly connected WAN HA by @gmuloc in https://github.com/aristanetworks/avd/pull/3720 +- |- + Feat(eos_designs): Add support to enable BGP peering with wan provider by @ayushmittal-arista in https://github.com/aristanetworks/avd/pull/4079 +### Other new features and enhancements +- |- + Feat(eos_validate_state): Added the validation for IP security connections by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/3911 +- |- + Feat(eos_validate_state): Added the validation for STUN client configurations by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/3898 +- |- + Feat(containers): switch to pyavd and editable install for container build by @ankudinov in https://github.com/aristanetworks/avd/pull/4087 +- |- + Feat(eos_validate_state): Add support for ANTA v1.0.0 by @carl-baillargeon in https://github.com/aristanetworks/avd/pull/4123 +### PyAVD Changes +- |- + Bump(pyavd): Add support for Python 3.9 in PyAVD by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4051 +### Other Changes +- |- + Refactor(plugins): Move jinja filter code for `arista.avd.default` to PyAVD by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4047 +- |- + Refactor(eos_cli_config_gen): Addressed missed comments for patch-panel by @gmuloc in https://github.com/aristanetworks/avd/pull/4078 +- |- + Refactor(plugins): Move jinja filter code for arista.avd.natural_sort to PyAVD by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4068 +- |- + Refactor(plugins): Move jinja filter code for arista.avd.convert_dicts to PyAVD by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4069 +- |- + Refactor(plugins): Move jinja filter code for arista.avd.list_compress to PyAVD by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4099 +- |- + Refactor(plugins): Move jinja filter code for arista.avd.generate_route_target to PyAVD by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4101 +- |- + Refactor(plugins): Move jinja filter code for arista.avd.add_md_toc to PyAVD by @gmuloc in https://github.com/aristanetworks/avd/pull/4104 +- |- + Refactor(plugins): Move jinja filter code for arista.avd.hide_passwords to PyAVD by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4112 +- |- + Refactor(plugins): Move jinja filter code for arista.avd.generate_esi to PyAVD by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4114 +- |- + Refactor(eos_designs): Move eos_designs_facts to PyAVD by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4110 +- |- + Refactor(eos_designs): Move eos_designs Python modules to PyAVD by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4120 +- |- + Refactor(eos_designs): Move eos_designs_shared_utils to PyAVD by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4126 +- |- + Refactor(plugins): Move jinja test code for arista.avd.contains to PyAVD by @gmuloc in https://github.com/aristanetworks/avd/pull/4131 +- |- + Refactor(eos_cli_config_gen): Move eos_cli_config_gen to pyavd by @gmuloc in https://github.com/aristanetworks/avd/pull/4117 +- |- + Refactor(plugins): Move jinja filter code for arista.avd.is_in_filter to PyAVD by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4133 +- |- + Refactor(plugins): Move schema code and schema fragments to PyAVD by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4130 +- |- + Refactor(plugins): Move jinja filter code for arista.avd.snmp_hash to PyAVD by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4136 +- |- + Refactor(plugins): Move jinja filter code for arista.avd.generate_lacp_id to PyAVD by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4139 +- |- + Refactor(plugins): Move jinja filter code for arista.avd.encrypt and arista.avd.decrypt to PyAVD by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/4135 +- |- + Refactor(plugins): Move jinja filter code for arista.avd.status_render to PyAVD by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4142 +- |- + Refactor(plugins): Move jinja filter code for arista.avd.range_expand to PyAVD by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/4138 +- |- + Refactor(plugins): Move internal cv_client code to PyAVD by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4141 +- |- + Refactor(plugins): Move jinja test code for arista.avd.defined to PyAVD by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4143 +- |- + Refactor(plugins): Move internal AVD code to PyAVD by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4140 +- |- + Refactor: Move requirements to PyAVD by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4147 +- |- + Refactor(cv_deploy): Optimize creation of configlet containers by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3950 +- |- + Refactor(plugins): Deprecate various unused Ansible plugins by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4166 +- |- + Refactor: Deprecate Python3.9 support by @gmuloc in https://github.com/aristanetworks/avd/pull/4177 diff --git a/ansible_collections/arista/avd/docs/containers/overview.md b/ansible_collections/arista/avd/docs/containers/overview.md index ea589cf8938..9bba05e1efc 100644 --- a/ansible_collections/arista/avd/docs/containers/overview.md +++ b/ansible_collections/arista/avd/docs/containers/overview.md @@ -45,7 +45,7 @@ To start using the containers for running AVD: - Install [VScode Dev Containers extension](https://code.visualstudio.com/docs/devcontainers/tutorial) - Add `.devcontainer/devcontainer.json` to your repository containing the AVD inventory (check examples below for possible dev container definitions). -- Open VSCode command pallette and pick `Dev Containers: Rebuild and Reopen in Container`. +- Open VSCode command palette and pick `Dev Containers: Rebuild and Reopen in Container`. - Wait until the build finish and enjoy running AVD in a container. If you want to use a specific AVD release, use the following `devcontainer.json`: diff --git a/ansible_collections/arista/avd/docs/contribution/development-tooling.md b/ansible_collections/arista/avd/docs/contribution/development-tooling.md new file mode 100644 index 00000000000..3d337f3dd7c --- /dev/null +++ b/ansible_collections/arista/avd/docs/contribution/development-tooling.md @@ -0,0 +1,245 @@ + + +# Development Tooling + +- To assist the AVD development community, we provide guidance to develop with two primary methods: VSCode dev containers or local Python environment. + - You may also choose your own development methodology, however we may not be able to provide assistance in a timely manner. +- This guide provides additional information about the development tools leveraged in the project: pre-commit, Molecule and ansible-test. +- Please report any issues and optimization suggestions regarding the development workflow via [Github discussions board](https://github.com/aristanetworks/avd/discussions). + +!!! note + The examples in this guide assume a Linux or macOS based operating system, however, it does not go into details on how to install common development tooling as this differs between operating systems. + +## Development environments + +Before setting up your development environment, create a fork of the [GitHub AVD project](https://github.com/aristanetworks/avd) and clone your fork to a local directory. + +Recommended directory structure: + +```shell +├── avd <- Clone of forked avd GitHub repository +└── avd-venv <- Python virtual environment, applicable only when leveraging a Local Python environment. +``` + +### VSCode Dev Containers + +To facilitate onboarding of development the AVD project builds [Dev Containers](../containers/overview.md) with all the required tools to get started. +Before you can leverage the VSCode Dev Container ensure to have the following tools installed on your workstation: + +- [Docker](https://docs.docker.com/engine/install/). +- [Visual Studio Code](https://code.visualstudio.com/) and the [Dev Container](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) extension. + +The AVD repository contains a devcontainer definition at the root of the project. +This will be executed automatically by VSCode by following these steps: + +1. Start VSCode on your worksation +2. Select "File/Open Folder..." and open the cloned avd GitHub repository (your fork). +3. A pop up will appear with "Folder contains a Dev Container configuration file. Reopen folder to develop in a container." Select "Reopen in Container". +4. VScode will re-open and start in the AVD Dev Container. + +!!! Warning + Note, at this time the AVD Dev Container doesn't support docker-in-docker, therefore some of the tests that rely on Docker can not be performed locally. Please rely on the CI pipeline results and logs for troubleshooting. + +### Local Python environments + +Developing with your local Python environment requires you to configure and install the AVD project development tools and dependencies installed on your workstation: + +- [Python 3.10](https://docs.python.org/) or later and [Python Virtual Environments](https://docs.python.org/3/tutorial/venv.html). +- Additional AVD Python package dependencies. +- [Make](https://www.gnu.org/software/make/manual/make.html): Leveraged for automating software building and test procedures. +- [Docker](https://docs.docker.com/engine/install/) (Optional): Some of the tests require docker to be executed locally and useful when troubleshooting failures of the CI pipeline. + +Recommended steps with Python virtual environment: + +1. Create and activate a Python virtual environment. +2. Install Python requirements located in the AVD repository: [requirements-dev.txt](https://github.com/aristanetworks/avd/blob/devel/ansible_collections/arista/avd/requirements-dev.txt) and [requirements.txt](https://github.com/aristanetworks/avd/blob/devel/ansible_collections/arista/avd/requirements.txt). + +!!! note + Ensure the virtual environment is located outside of the AVD project directory. + +```shell +# Create a Python virtual environment `python -m venv `. +python3 -m venv avd-venv + +# Activate Python virtual environment `source /bin/activate`. +source avd-venv/bin/activate + +# Install AVD project requirements-dev.txt and requirements.txt in your Python Virtual environment. +# The installation _must_ be performed from the root of the cloned avd repository. +cd avd +# Requirements files are located in `ansible_collections/arista/avd` of the avd repository. +pip3 install -r ansible_collections/arista/avd/requirements-dev.txt -r ansible_collections/arista/avd/requirements.txt --upgrade +``` + +!!! note + It is important to confirm the Python interpreter Ansible is using. + You may be required to set `ansible_python_interpreter` in your Ansible inventory. + For more information consult with the [Ansible documentation](https://docs.ansible.com/ansible/latest/reference_appendices/python_3_support.html#using-python-3-on-the-managed-machines-with-commands-and-playbooks). + +## Pre-commit + +- [pre-commit](https://github.com/aristanetworks/avd/blob/devel/.pre-commit-config.yaml) can run standard hooks on every commit to automatically point out issues in code such as missing semicolons, trailing whitespace, and debug statements. +- Pointing these issues out before code review allows a code reviewer to focus on the architecture of a change while not wasting time with trivial style nitpicks. +- Additionally, the AVD project leverages pre-commit hooks to build and update the AVD schemas and documentation artifacts. + +### Install pre-commit hook + +Configure pre-commit git hook, to automatically run pre-commit. This is optional, but highly recommended! + +```shell +# Change to directory to your cloned avd repository. +cd avd + +# Install pre-commit hooks to run automatically. +pre-commit install +``` + +### Run pre-commit manually + +To run `pre-commit` manually before you commit, use this command: + +```shell +# Change to directory to your cloned avd repository. +cd avd + +# Run pre-commit hooks on all staged files. +# The command will automatically detect changed files using `git status` and run tests according to their type. +pre-commit run + +# Run pre-commit hooks on all un-staged and staged files. +pre-commit run --all + +# Run specific pre-commit schemas hook on all un-staged and staged files. +pre-commit run schemas --all +``` + +!!! note + This process is also implemented in the project CI to ensure code quality and compliance. + All pre-commit checks must pass, therefore we highly recommend running this workflow before committing changes! + + Pre-commit will fail if any files are changed by the pre-commit hooks. Make sure to review the changes, commit them and rerun pre-commit. + +## Molecule + +The [Molecule](https://ansible.readthedocs.io/projects/molecule/) project is designed to aid in developing and testing of Ansible roles. + +The AVD project leverages Molecule for: + +- Static integration test on the following Ansible roles: + - `eos_designs` + - `eos_cli_config_gen` + - `eos_validate_state` + - `eos_config_deploy_cvp` + - `dhcp_provisioner` (requires docker) +- End-to-end systems integration tests on the following CloudVision role and module: + - `cv_deploy` + - `cv_workflow` + +The Molecule scenarios are located under the `molecule` directory at the root of the collection (`ansible_collections/arista/avd/molecule`). + +The directory name of each Molecule scenario folder is used as the `--scenario-name` when executing Molecule, i.e: `eos_cli_config_gen`, `eos_designs_unit_tests`. + +### Executing Molecule with makefile method + +To run the Molecule tests locally to generate the new expected configuration and documentation leverage Makefile located in the `ansible_collections/arista/avd/molecule` directory. + +The Makefile supports the following targets: + +- `help`: Display available make target and descriptions. +- `converge`: Execute molecule "converge" sequence. Specify scenario name with `MOLECULE=` (default: `eos_cli_config_gen`) and Ansible options with `ANSIBLE_OPTIONS=` (default: `--forks 5`). + - This is the recommended way for development, as it is quicker and does not execute idempotency checks. +- `test`: Execute molecule "test" sequence. Specify scenario name with `MOLECULE=` (default: `eos_cli_config_gen`) and Ansible options with `ANSIBLE_OPTIONS=` (default: `--forks 5`). + - This is executed as part of the CI and tests for idempotency. +- `refresh-facts`: Run all "eos_designs" and "eos_cli_config_gen" [molecule scenarios](https://github.com/aristanetworks/avd/blob/devel/ansible_collections/arista/avd/molecule/MOLECULE_SCENARIOS.txt). + +!!! info + `make refresh-facts` can be useful when you change common template or structured configuration output. + Note that it will take a significant amount of local resources and several minutes/hours to execute. + +In the majority of new features or bug fixes, the process is the following: + +1. Update scenario inventory when required. It is ok to extend an existing host to cover a new test. When in doubt, consult with a maintainer. +2. Update group and host variables in the scenario and ensure to cover all use cases of the feature. +3. Run `make converge` target within the `molecule` directory to generate artifacts. Examples: + + ```shell + # Change to molecule directory + cd ansible_collections/arista/avd/molecule + + # Run eos_designs_unit_tests scenario to generate artifacts + make converge MOLECULE=eos_designs_unit_tests + + # Run eos_designs_unit_tests scenario with verbosity `-vvv` and max forks of 10 `--forks 10`. + make converge MOLECULE=eos_designs_unit_tests ANSIBLE_OPTIONS="-vvv --forks 10" + + # Run eos_cli_config_gen scenario with limit. + make converge ANSIBLE_OPTIONS="--limit logging" + ``` + +4. Review generated artifacts and test results on an EOS device to confirm syntax and working configuration. +5. Commit generated artifacts. + +!!! info + Molecule scenarios are also executed in the project CI to ensure code quality and compliance and tested against various versions of `ansible-core` and other Python dependencies. + +### Executing Molecule with advanced CLI syntax + +You may also run Molecule by leveraging its CLI syntax directly from the root of the collection path: `ansible_collections/arista/avd`. + +Examples: + +```shell +# Change to root collection directory +cd ansible_collections/arista/avd + +# Run eos_cli_config_gen scenario +molecule converge -s eos_cli_config_gen + +# Run eos_cli_config_gen scenario limiting to "logging" host only +molecule converge -s eos_cli_config_gen -- --limit logging + +# Run eos_designs unit_test scenario with verbosity +molecule converge -s eos_designs_unit_tests -- -vvv +``` + +## Ansible-test + +The AVD project leverages [ansible-test](https://www.ansible.com/blog/introduction-to-ansible-test/) to run sanity, unit and integration tests for the `arista.avd` Ansible Collection. + +Testing is performed automatically as part of the CI pipeline. If troubleshooting is required, a Makefile at the root of the `avd` repository supports the following targets to execute `ansible-test`: + +- `sanity`: Run ansible-test sanity validation. +- `unit-tests`: Run unit test cases using ansible-test. Optionally specify `ANSIBLE_TEST_MODE=` (default: `venv`). +- `integration-tests`: Run integration test cases using `ansible-test`. Optionally specify `ANSIBLE_TEST_MODE=` (default: `venv`). + +Examples: + +```shell +# Run ansible-test sanity validation. +make sanity + +# Run unit test cases using ansible-test with venv (default) +make unit-tests + +# Run integration test cases using ansible-test with docker. +make integration-tests ANSIBLE_TEST_MODE=docker +``` + +## Tox + +The AVD project leverages [Tox](https://tox.wiki/) to run unit and integration of the `pyavd` Python package. + +Testing is performed automatically as part of the CI pipeline. If troubleshooting is required, a Makefile at the root of the `avd` repository supports the following targets to execute `tox`: + +- `pyavd-test`: Test PyAVD Python code with tox. + +Example: + +```shell +# Run tox on pyavd +make pyavd-test +``` diff --git a/ansible_collections/arista/avd/docs/contribution/development.md b/ansible_collections/arista/avd/docs/contribution/development.md deleted file mode 100644 index 2bca8b9209d..00000000000 --- a/ansible_collections/arista/avd/docs/contribution/development.md +++ /dev/null @@ -1,171 +0,0 @@ - - -# Development Tips & Tricks - -## Overview - -Two methods can be used to get Ansible up and running quickly with all the requirements to leverage AVD: a Python Virtual Environment or a Docker container. - -The best way to use the development files is to copy them to the root directory where your repositories are cloned. For example, see the file/folder structure below. - -```shell -├── git_projects -│ ├── avd -│ ├── ansible-cvp -│ ├── netdevops-examples -| ├── -│ ├── Makefile -``` - -## Build a local environment - -Please refer to [Setup environment page](./setup-environment.md) - -Once installed, use `dev-start` command to bring up all the required containers: - -- An [mkdoc](https://hub.docker.com/repository/docker/titom73/mkdocs) for AVD documentation listening on port `localhost:8000` -- An [mkdoc](https://hub.docker.com/repository/docker/titom73/mkdocs) or CVP documentation listening on port `localhost:8001` -- An [AVD runner](https://hub.docker.com/repository/docker/avdteam/base) with a pseudo-terminal connected to a shell for Ansible execution - -## Docker tips - -The Docker container approach for development can be used to ensure that everybody is using the same development environment while still being flexible enough to use the repository you are making changes to. You can inspect the Dockerfile to see what packages have been installed. The container will mount the current working directory so that you can work with your local files. - -The Ansible version is passed in with the Docker build command using the **`ANSIBLE_VERSION`** variable. If the variable isn't defined, the Dockerfile will, by default, set the Ansible version to what's specified in the AVD requirements. - -Before you can use a container, you must install [**Docker CE**](https://www.docker.com/products/docker-desktop) and [**docker-compose**](https://docs.docker.com/compose/) on your workstation. - -Since the AVD Docker image is now automatically published on [**docker-hub**](https://hub.docker.com/repository/docker/avdteam/base), a dedicated repository is available on [**Arista NetDevOps Community**](https://github.com/arista-netdevops-community/docker-avd-base). - -```shell -# Start development stack -$ make start -docker-compose -f avd/development/docker-compose.yml up -d -Recreating development_ansible_1 ... done -Recreating development_webdoc_cvp_1 ... done -Recreating development_webdoc_avd_1 ... done - -# List containers started with stack -$ docker-compose -f avd/development/docker-compose.yml ps - Name Command State Ports ------------------------------------------------------------------------------ -ansible_avd /bin/sh -c while true; do ... Up -webdoc_avd sh -c pip install -r ansib ... Up 0.0.0.0:8000->8000/tcp -webdoc_cvp sh -c pip install -r ansib ... Up 0.0.0.0:8001->8000/tcp - -# Get a shell with ansible (if not in shell from previous command) -$ make dev-run -docker-compose -f avd/development/docker-compose.yml exec ansible zsh -Agent pid 52 -âžœ /projects - -# Test MKDOCS access (outside of development container) -$ curl -s http://127.0.0.1:8000 | head -n 10 - - - - - - - -# Stop development stack -$ make dev-stop -docker-compose -f avd/development/docker-compose.yml kill &&\ - docker-compose -f avd/development/docker-compose.yml rm -f -Killing development_ansible_1 ... done -Killing development_webdoc_1 ... done -Going to remove development_ansible_1, development_webdoc_1 -Removing development_ansible_1 ... done -Removing development_webdoc_1 ... done -``` - -## Development tools - -### Pre-commit hook - -[pre-commit](https://github.com/aristanetworks/avd/blob/devel/.pre-commit-config.yaml) can run standard hooks on every commit to automatically point out issues in code such as missing semicolons, trailing whitespace, and debug statements. Pointing these issues out before code review allows a code reviewer to focus on the architecture of a change while not wasting time with trivial style nitpicks. - -Repository implements the following hooks: - -- `trailing-whitespace`: Fix trailing whitespace. If found, the commit is stopped, and you must rerun the commit process. -- `end-of-file-fixer`: Like `trailing-whitespace`, this hook fixes the wrong end of the file and stops your commit. -- `check-yaml`: Checks that all YAML files are valid. -- `check-added-large-files`: Check if no large file is included in the repository. -- `check-merge-conflict`: Validate there is no `MERGE` syntax related to an invalid merge process. -- `pylint`: Run Python linting with settings defined in [pylintrc](https://github.com/aristanetworks/avd/blob/devel/pylintrc). -- `yamllint`: Validate all YAML files using configuration from [yamllintrc](https://github.com/aristanetworks/avd/blob/devel/.github/yamllintrc). -- `ansible-lint`: Validate YAML files with Ansible proven practices, patters, and behaviors. -- `Flake8`: Style guide enforcement for Python code base. -- `markdownlint-cli`: Validates markdown files for common errors as referenced [here](https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md). - -#### Installation - -`pre-commit` is part of [**development requirements**](https://github.com/aristanetworks/avd/blob/devel/development/requirements-dev.txt). To install, run `pip command` in **avd** folder: - -```shell -$ pip install -r development/requirements-dev.txt -... -``` - -#### Run pre-commit manually - -To run `pre-commit` manually before your commit, use this command: - -```shell -pre-commit run -[WARNING] Unstaged files detected. - -[INFO] Stashing unstaged files to /Users/xxx/.cache/pre-commit/patch1590742434. - -Trim Trailing Whitespace.............................(no files to check)Skipped -Fix End of Files.....................................(no files to check)Skipped -Check Yaml...........................................(no files to check)Skipped -Check for added large files..........................(no files to check)Skipped -Check for merge conflicts............................(no files to check)Skipped -Check for Linting error on Python files..............(no files to check)Skipped -Check for Linting error on YAML files................(no files to check)Skipped -Check for ansible-lint errors............................................Passed - -[INFO] Restored changes from /Users/xxx/.cache/pre-commit/patch1590742434. -``` - -The command will automatically detect changed files using `git status` and run tests according to their type. - -!!! note - This process is also implemented in project CI to ensure code quality and compliance with the Ansible development process. - -### Configure Git hook - -To automatically run tests when running a commit, configure your repository with the following command: - -```shell -$ pre-commit install -pre-commit installed at .git/hooks/pre-commit -``` - -To remove the installation, use the `uninstall` option. - -### Check 404 links - -To validate documentation, you should check for *not found* links in your local version of the documentation. This test requires running the mkdocs container as explained in [installation documentation](./setup-environment.md). - -In a shell, run the following make command. It starts a container in the AVD documentation network and leverages [`muffet`](https://github.com/raviqqe/muffet) tool to check for any 404 HTTP codes: - -```shell -$ check-avd-404 -docker run --network container:webdoc_avd raviqqe/muffet \ - http://127.0.0.1:8000 \ - -e ".*fonts.gstatic.com.*" \ - -e ".*edit.*" \ - -f --limit-redirections=3 \ - --timeout=60 -http://127.0.0.1:8000/docs/installation/development/ - 404 http://127.0.0.1:8000/docs/installation/development/setup-environment2.md -make: *** [check-avd-404] Error 1 -``` - -> This process is also implemented in project CI to protect documentation against dead links. diff --git a/ansible_collections/arista/avd/docs/contribution/eos_designs_internal_notes.md b/ansible_collections/arista/avd/docs/contribution/eos_designs_internal_notes.md index d3d6433231c..7acccda3b21 100644 --- a/ansible_collections/arista/avd/docs/contribution/eos_designs_internal_notes.md +++ b/ansible_collections/arista/avd/docs/contribution/eos_designs_internal_notes.md @@ -135,7 +135,7 @@ The base class has a few important methods: - `get(key, default=None)` returns the value of the requested "key" (`cached_property`) if the "key" is in the list returned by `keys()`. Otherwise the default value is returned. -See the source code [here](../../plugins/plugin_utils/avdfacts.py) +See the source code [here](https://github.com/aristanetworks/avd/tree/devel/python-avd/pyavd/_eos_designs/avdfacts.py) ### get_structured_config @@ -148,7 +148,7 @@ TODO The class is instantiated once per device. Methods may use references to other device instances using `hostvars.avd_switch_facts`, which is a dict of `EosDesignsfacts` instances covering all devices. -See the source code [here](../../plugins/plugin_utils/eos_designs_facts/__init__.py) +See the source code [here](https://github.com/aristanetworks/avd/tree/devel/python-avd/pyavd/_eos_designs/eos_designs_facts) ```mermaid classDiagram @@ -179,7 +179,7 @@ classDiagram ### SharedUtils -See the source code [here](../../plugins/plugin_utils/eos_designs_shared_utils/__init__.py) +See the source code [here](https://github.com/aristanetworks/avd/tree/devel/python-avd/pyavd/_eos_designs/shared_utils) ```mermaid classDiagram @@ -228,20 +228,9 @@ Each class is loaded in `get_structured_config` and rendered. All the results ar The class is instantiated once per device. Methods may use references to other device instances using `hostvars.avd_switch_facts`, which at the time where `eos_designs_structured_config` run, is a nested `dict`. It contains the output from `EosDesignsFacts`'s `render()` method. -Subclasses are typically using Mixin classes to split all the attributes/`cached_properties` into managable files. +Subclasses are typically using Mixin classes to split all the attributes/`cached_properties` into manageable files. -Source code: - -- [AvdStructuredConfigBase](../../roles/eos_designs/python_modules/base/__init__.py) - (Unfortunate naming. Base here refers to base configurations. Not a Base class.) -- [AvdStructuredConfigConnectedEndpoints](../../roles/eos_designs/python_modules/connected_endpoints/__init__.py) -- [AvdStructuredConfigCoreInterfacesAndL3Edge](../../roles/eos_designs/python_modules/core_interfaces_and_l3_edge/__init__.py) -- [AvdStructuredConfigCustomStructuredConfiguration](../../roles/eos_designs/python_modules/custom_structured_configuration/__init__.py) -- [AvdStructuredConfigInbandManagement](../../roles/eos_designs/python_modules/inband_management/__init__.py) -- [AvdStructuredConfigMlag](../../roles/eos_designs/python_modules/mlag/__init__.py) -- [AvdStructuredConfigNetworkServices](../../roles/eos_designs/python_modules/network_services/__init__.py) -- [AvdStructuredConfigOverlay](../../roles/eos_designs/python_modules/overlay/__init__.py) -- [AvdStructuredConfigUnderlay](../../roles/eos_designs/python_modules/underlay/__init__.py) +See the source code [here](https://github.com/aristanetworks/avd/tree/devel/python-avd/pyavd/_eos_designs/structured_config) ```mermaid classDiagram @@ -417,7 +406,7 @@ outside of that, so any inline Jinja2 could not use these values. | switch.mlag_l3_ip | mlag_l3_ip must be available to the mlag peer. | | switch.mgmt_ip | mgmt_ip must be available to the mlag peer. | | switch.uplink_peers | These are used to generate the "avd_topology_peers" fact covering downlinks for all devices in eos_designs_facts action plugin. | -| switch.dc_name | Used for underlay HER flood-list calculations when using scope dc_name +| switch.dc_name | Used for underlay HER flood-list calculations when using scope dc_name | | switch.bgp_as | Known use of inline jinja in customer deployments | | switch.group | Known use of inline jinja in customer deployments | | switch.hostname | Known use of inline jinja in customer deployments | diff --git a/ansible_collections/arista/avd/docs/contribution/getting-started.md b/ansible_collections/arista/avd/docs/contribution/getting-started.md deleted file mode 100644 index b20da4faad5..00000000000 --- a/ansible_collections/arista/avd/docs/contribution/getting-started.md +++ /dev/null @@ -1,73 +0,0 @@ - - -# Getting Started - -## Branches - -- Current development branch: **`devel`** -- Branch namespace for release & development: `releases/` - -## Pull requests - -- **Before** you start working on a pull request, open an issue and discuss your ideas with the **AVD** maintainers. This will help prevent wasting time on something we might be unable to implement. When suggesting a new feature, ensure it will be consistent with all work already in progress. - -- Any pull request which *doesn't* relate to an accepted issue will not be approved. - -- All major new functionality must include relevant molecule tests where applicable. - -- When submitting a pull request, please rebase from the `devel` branch rather than a release branch:`releases/*`. This is because the `devel` branch is used for ongoing development, while `releases/*` are used for tagging new stable releases. - -- All code submissions should meet the following criteria (CI will enforce these checks): - - - YAML syntax is valid - - Python syntax is valid - - All tests pass when run with `make sanity` - - PEP 8 compliance is enforced, with the exception that lines may be greater than 80 characters in length - -Adhering to the following process is the best way to get your work merged: - -- [Fork](https://docs.github.com/en/get-started/quickstart/fork-a-repo) the repository, clone your fork, and configure the remotes: - - ```bash - # Clone your fork of the repo into the current directory - git clone https://github.com//avd - - # Navigate to the newly cloned directory - cd avd - - # Assign the original repo to a remote called "upstream" - git remote add upstream https://github.com/aristanetworks/avd.git - ``` - -- If you cloned a while ago, get the latest changes from upstream: - - ```bash - git checkout devel - git pull upstream devel - ``` - -- Create a new topic branch (off the main project development branch) to contain your feature, change, or fix: - - ```bash - git checkout -b - ``` - -- Commit your changes in logical chunks. Please adhere to these [Git commit message guidelines](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html), or your code will unlikely be merged into the main project. Use Git's [git rebase](https://docs.github.com/en/get-started/using-git/about-git-rebase) feature to tidy up your commits before making them public. - -- Locally merge (or rebase) the upstream development branch into your topic branch: - - ```bash - git pull [--rebase] upstream - ``` - -- Push your topic branch up to your fork: - - ```bash - git push origin - ``` - -- [Open a Pull Request](https://github.com/aristanetworks/avd/pulls) with a clear title, description, and following the template. diff --git a/ansible_collections/arista/avd/docs/contribution/input-variable-validation.md b/ansible_collections/arista/avd/docs/contribution/input-variable-validation.md index 7fdd50669d6..37cd4305d95 100644 --- a/ansible_collections/arista/avd/docs/contribution/input-variable-validation.md +++ b/ansible_collections/arista/avd/docs/contribution/input-variable-validation.md @@ -125,15 +125,15 @@ This fragment will be merged with other fragments during development, to form th For reference, the full Role Schemas can be found here: -- [`eos_designs` AVD Schema, not ready yet](../../roles/eos_designs/schemas/eos_designs.schema.yml) -- [`eos_cli_config_gen` AVD Schema](../../roles/eos_cli_config_gen/schemas/eos_cli_config_gen.schema.yml) +- [`eos_designs` AVD Schema](https://github.com/aristanetworks/avd/tree/devel/python-avd/pyavd/eos_designs/schema/eos_designs.schema.yml) +- [`eos_cli_config_gen` AVD Schema](https://github.com/aristanetworks/avd/tree/devel/python-avd/pyavd/_eos_cli_config_gen/schema/eos_cli_config_gen.schema.yml) The supported schema options depend on the type of variable that is described. The supported types are `int`, `bool`, `str`, `dict` and `list`. The schema does not support mixed types for the same variable, but the automatic type conversion mentioned above can address the usability aspect by helping the user with common mistakes. The supported schema options for AVD Schema are described in a meta-schema using JSON Schema Draft-7 format. The meta-schema -can be seen [here](../../plugins/plugin_utils/schema/avd_meta_schema.json). In addition, below is a more detailed description of the supported +can be seen [here](https://github.com/aristanetworks/avd/tree/devel/python-avd/pyavd/_schema/avd_meta_schema.json). In addition, below is a more detailed description of the supported schema options per variable type. All schema options (ex. `type`, `max`, `valid_values`) are validated individually, and to pass the validation, the data must diff --git a/ansible_collections/arista/avd/docs/contribution/overview.md b/ansible_collections/arista/avd/docs/contribution/overview.md index 6884dee82b1..1a3091c7582 100644 --- a/ansible_collections/arista/avd/docs/contribution/overview.md +++ b/ansible_collections/arista/avd/docs/contribution/overview.md @@ -4,13 +4,13 @@ ~ that can be found in the LICENSE file. --> -# Arista Validated Design Development +# Arista Validated Designs Development -**Arista Validated Design (AVD)** is maintained as a [GitHub project](https://github.com/aristanetworks/avd) under the Apache 2 license. Users are encouraged to submit GitHub issues for feature requests and bug reports. +**Arista Validated Designs (AVD)** is maintained as a [GitHub project](https://github.com/aristanetworks/avd) under the Apache 2 license. Users are encouraged to submit GitHub issues for feature requests and bug reports. ## Governance -AVD is a community-based Free Open Source Software (FOSS) project sponsored by [Arista Networks](https://www.arista.com/). [Arista Networks](https://www.arista.com/) supports Ansible for managing devices running the EOS operating system natively through eAPI or [CloudVision Portal (CVP)](https://www.arista.com/en/products/eos/eos-cloudvision). This collection includes a set of Ansible roles and modules to help kick-start your automation with Arista. The various roles and templates provided are designed to be customized and extended to your needs. +AVD is a community-based Free Open Source Software (FOSS) project sponsored by [Arista Networks](https://www.arista.com/). Arista Networks supports Ansible for managing devices running the EOS operating system natively through eAPI or [CloudVision Portal (CVP)](https://www.arista.com/en/products/eos/eos-cloudvision). This collection includes a set of Ansible roles and modules to help kick-start your automation with Arista. The various roles and templates provided are designed to be customized and extended to your needs. The AVD Core Team is responsible for the direction and execution of the code that gets committed to the project. @@ -24,15 +24,11 @@ The following individuals are on the AVD Core Team: ## Contributing -We welcome many forms of contributions to AVD. While we understand most contributions will commonly come from ansible power users, we encourage others to contribute through docs, tutorials, and user guides. Also, if you have other ideas for contributing, don't hesitate to open an issue or have a discussion in one of the forums below. +We welcome all forms of contribution to AVD, whether to the code base, docs, tutorials, or user guides. If you have other ideas for contributing, don't hesitate to open an issue or discuss them in one of the forums below. ### Communication -Communication among the contributors should always occur via public channels. The following outlines the best ways to communicate and engage on all things AVD: - -#### Slack - -- [**#ansible | #arista** on Network to Code Slack](http://slack.networktocode.com/) - Good for quick chats. Avoid any discussion that might need to be referenced later, as the chat history isn't retained long. +The following links outline the best ways to communicate and engage on all things AVD: #### GitHub @@ -55,21 +51,22 @@ Semantic Versioning ([SemVer](https://semver.org/)) is used for AVD versioning. ### Contributor Workflow +The AVD repository follows a [GitHub flow](https://docs.github.com/en/get-started/using-github/github-flow) to collaborate on the project with a personal fork. + The following documents the lifecycle of work within AVD: 1. Open/request a feature enhancement or file a bug - a. If bug, see [here](#reporting-bugs) - b. If feature request or enhancement, continue. + - If a bug, please see [reporting bugs](#reporting-bugs). + - If feature request or enhancement, continue. 2. Open a GitHub Issue - a. The issue will be reviewed. Based on the request, it will get labeled as `current`, `near-term`, or `future`. - b. It will likely only stay in *current* if it's trivial and quick work. - c. If it gets labeled as *future*, the issue will be closed in the next batch of issues that get migrated and converted to GitHub discussions. + - The issue will be reviewed and approved by a maintainer. +3. Submit a [Pull Request (PR)](#submitting-pull-requests) referencing the issue with `Fixes #`. -If you follow these steps, there **will** be a GitHub Issue opened before submitting a Pull Request (PR). However, a PR may come in without being discussed in an Issue or Discussion. While we don't advocate for this, you should be aware of the process that will be followed for those circumstances. +If you follow these steps, a GitHub Issue will be opened before you submit a PR. However, a PR may come in without being discussed in an Issue or Discussion. While we don't advocate for this, you should be aware of the process that will be followed for those circumstances. -Should this happen, and if you followed the project guidelines, have sample tests, and code quality, you will first be acknowledged for your work; thank you in advance. After that, the PR will be quickly reviewed to ensure that it makes sense as a contribution to the project and to gauge the work effort or issues with merging into *devel*. If the effort required by the core team is manageable, it'll likely still be a few weeks before it gets thoroughly reviewed and merged. After that, it will just depend on the current backlog. +Should this happen, and if you followed the project guidelines, have sample tests, and code quality, you will first be acknowledged for your work; thank you in advance. After that, the PR will be quickly reviewed to ensure that it makes sense as a contribution to the project and to gauge the work effort or issues with merging into the *devel* branch. If the effort required by the core team is manageable, it'll likely still be a few weeks before it gets thoroughly reviewed and merged. After that, it will just depend on the current backlog. -### Contributing to Arista Validated Design +### Contributing to Arista Validated Designs Contributing pull requests are gladly welcomed for this repository. If you are planning a significant change, please start a discussion first to ensure we can merge it. @@ -77,12 +74,15 @@ Contributing pull requests are gladly welcomed for this repository. If you are p - The **`devel`** branch corresponds to the release actively under development. - The [release tags](https://github.com/aristanetworks/avd/tags) correspond to stable releases. + - For major and minor releases, release tags are applied directly on the `devel` branch. + - For bug fix release, release tags are applied to `releases/*` branch. - Fork the repository and create a branch based on **`devel`** to set up a dev environment if you want to open a PR. -- See the AVD release for information about active branches. + - We do not enforce any branch naming convention. + - All PRs should be submitted towards the `devel` branch. #### Reporting Bugs -- First, ensure that you're running the [latest stable version](https://github.com/aristanetworks/avd/releases) of AVD. If you're running an older version, it's possible that the bug has already been fixed. +- First, ensure that you're running the [latest development version](../installation/collection-installation.md#install-latest-devel-version-from-avd-github) of AVD. If you're running an older version, it's possible that the bug has already been fixed. - Next, check the GitHub [issues list](https://github.com/aristanetworks/avd/issues) to see if the bug you've found has already been reported. If you think you may be experiencing a reported issue that hasn't already been resolved, please click "add a reaction" in the top right corner of the issue and add a thumbs up (+1). Also, add a comment describing how it's affecting your installation. This will allow us to prioritize bugs based on how many users are affected. @@ -118,7 +118,7 @@ The issue will be reviewed by a moderator after submission, and the appropriate #### Submitting Pull Requests -- If you're interested in contributing to AVD, check out our [getting started](getting-started.md) documentation for tips on setting up your development environment. +- If you're interested in contributing to AVD, check out our [development tooling](development-tooling.md) documentation for tips on setting up your development environment. - It's recommended to open an issue **before** starting work on a pull request and discuss your idea with the AVD maintainers before beginning work. This will save time on something we might be unable to implement. When suggesting a new feature, ensure it will be consistent with any work already in progress. @@ -128,16 +128,14 @@ The issue will be reviewed by a moderator after submission, and the appropriate - When submitting a pull request, please work off the `devel` branch rather than `releases/*`. The `devel` branch is used for ongoing development, while `releases/*` is used for tagging stable releases. -- In most cases, adding a changelog entry is unnecessary: A maintainer will take care of this when the PR is merged. (This helps avoid merge conflicts resulting from multiple PRs being submitted simultaneously.) +- In most cases, adding a changelog entry is unnecessary: A maintainer will take care of this when the PR is merged. This helps avoid merge conflicts resulting from multiple PRs being submitted simultaneously. - All code submissions should meet the following criteria (CI will enforce these checks): - - Jinja2 templates follow our [guidelines](style-guide.md). - Molecule is updated with data covering your fix. - Molecule artifacts are updated with your coverage. - Python syntax is valid. - All unit tests pass successfully. - - PEP 8 compliance is enforced, with the exception that lines may be greater than 80 characters in length. - A PR can be opened before all the work is complete. The PR state should be set to **draft** in this situation. The maintainer team will review PRs marked as ready for review (not in draft). @@ -163,7 +161,3 @@ The issue will be reviewed by a moderator after submission, and the appropriate !!! info "Scopes" The scope is optional and can be ignored safely if your PR covers an undefined scope. - -## Project Structure - -All development of the current AVD release occurs in the `devel` branch; releases are packaged from the `releases/*` branches. A `releases/v*` branch should *always* represent a stable release in its entirety, such that installing AVD by either downloading a packaged release or cloning the `releases/v*` branch provides the same code base. diff --git a/ansible_collections/arista/avd/docs/contribution/setup-environment.md b/ansible_collections/arista/avd/docs/contribution/setup-environment.md deleted file mode 100644 index ceacc4fd168..00000000000 --- a/ansible_collections/arista/avd/docs/contribution/setup-environment.md +++ /dev/null @@ -1,279 +0,0 @@ - - -# Setup Ansible AVD Environment - -Two methods can be used to get Ansible up and running quickly with all the requirements to leverage **arista.avd**: -A Python Virtual Environment or [Docker container](https://hub.docker.com/repository/docker/avdteam/base). - -In both scenarios, this document will leverage the git approach to create a local environment with collections installed in their respective folders and additional folders for all your content. All examples will be based on the following folder structure: - -```shell -├── git_projects -│ ├── avd -│ ├── ansible-cvp -│ ├── ansible-avd-cloudvision-demo -│ ├── Makefile -``` - -## Ansible runner requirements - -As described in [requirement page](../installation/collection-installation.md), your runner should run Python 3.8 or Docker engine with [`docker-compose`](https://docs.docker.com/compose/install/). - -Besides that, the local runner will read your gitconfig file to let you manipulate files in a container as if you were on your host. If you haven't configured Git on your host, it's required to create at least a [basic git](https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup) configuration file: - -```shell -# Create your username exposed in git commit -$ git config --global user.name "John Doe" - -# Create email exposed in your commit -$ git config --global user.email johndoe@example.com -``` - -## Create a local folder structure - -To build a local folder structure, you manually run all the following commands to git clone [avd](https://github.com/aristanetworks/avd), [ansible-cvp collection](https://github.com/aristanetworks/ansible-cvp) and a [repository with demo content](https://github.com/arista-netdevops-community/ansible-avd-cloudvision-demo) - -In addition to these three git clones, you can also deploy a [Makefile](https://github.com/aristanetworks/avd/blob/devel/development/Makefile) built to provide some shortcuts we will discuss in a second stage. - -```shell -$ mkdir git_projects - -$ cd git_projects - -$ git clone https://github.com/aristanetworks/avd.git -$ git clone https://github.com/aristanetworks/ansible-cvp.git -$ git clone https://github.com/arista-netdevops-community/ansible-avd-cloudvision-demo.git - -# Copy Makefile at the root position -$ cp avd/development/Makefile ./ -$ make start -``` - -Or you can use a one-liner script available in avd repository to create this structure for you. This script accomplishes the following actions: - -- Create a local folder for development -- Instantiate a local git repository (no remote) -- Clone AVD and CVP collections -- Deploy Makefile - -Because we're cloning the Ansible collection using Git, it's recommended to read the documentation about [how to setup Ansible to use collection based on git clone](setup-git.md#update-your-ansiblecfg). - -## Environment with the latest stable - -This one-liner will install the AVD and CVP collections using the latest version released on GitHub. These branches might have some differences from the devel branch. - -```shell -sh -c "$(curl -fsSL https://get.avd.sh)" -``` - -## Development environment with AVD - -This one-liner will install AVD using the `devel` branch. - -```shell -sh -c "$(curl -fsSL https://get.avd.sh/dev/)" -``` - -!!! warning - As the devel branch always includes the latest features and updates, the data models might change without notice, and demo content could be broken. It should be used for development only. - -## Use Docker as an AVD shell - -This approach will leverage a Docker container to provide all the AVD requirements and playbooks. The collection will be shared from your localhost to the container. - -This approach will make the run process easier as all libraries are pre-configured in the container, and you can continue to use your preferred text editor to edit and build your content. - -Considering you have deployed [Makefile](https://github.com/aristanetworks/avd/blob/devel/development/Makefile) described in the previous section, all the outputs will provide native Docker command and the Make command. - -### AVD environment commands - -When using the installation script to create your own AVD environment, a [`Makefile`](https://github.com/aristanetworks/avd/blob/devel/development/Makefile) is deployed under `./ansible-arista` to automate some common commands: - -```shell -make -``` - -#### Commands for docker-compose - -- `start`: Start the Docker compose stack to develop with AVD and CVP collection (alias: `start`) - - Deploy an [mkdoc](https://hub.docker.com/repository/docker/titom73/mkdocs) instance to expose AVD documentation with live reload for development purposes. - - Deploy an [mkdoc](https://hub.docker.com/repository/docker/titom73/mkdocs) instance to expose CVP documentation with live reload for development purposes. - - Deploy an [AVD runner](https://hub.docker.com/repository/docker/avdteam/base) with a pseudo-terminal connected to a shell for Ansible execution -- `stop`: Stop the Docker compose stack and remove containers (alias: `stop`) -- `shell`: Run a shell attached to the Ansible container (alias: `shell`) -- `reload`: Stop and Start the docker-compose stack -- `ansible-upgrade`: To upgrade Ansible in your runner in conjunction with `ANSIBLE_VERSION` - -```shell -$ make ansible-upgrade ANSIBLE_VERSION=2.10.7 -docker-compose -f avd/development/docker-compose.yml exec -u avd ansible pip install --user --upgrade ansible==2.10.7 -Collecting ansible==2.10.7 - Downloading ansible-2.10.7.tar.gz (14.2 MB) - |████████████████████████████████| 14.2 MB 475 kB/s -... -$ make shell -docker-compose -f avd/development/docker-compose.yml exec -u avd ansible zsh - -Agent pid 109 -âžœ /projects ansible --version -ansible 2.10.7 -``` - -### Commands for Docker only - -- `run`: Run a [Docker container](https://hub.docker.com/repository/docker/avdteam/base) with local folder mounted under `/projects`. This command supports some options to test development versions like: - - `ANSIBLE_VERSION`: Specific version of Ansible to install during container startup. - - `PIP_REQ`: Specific pip requirements file to install during container startup. -- `vscode`: start a VScode container available in your browser to edit your local files. - -```shell -$ make run ANSIBLE_VERSION=2.10 -docker run --rm -it \ - -e AVD_REQUIREMENTS= \ - -e AVD_ANSIBLE=2.10 \ - -e AVD_GIT_USER="xxxxx" \ - -e AVD_GIT_EMAIL="xxxxx" \ - -v /var/run/docker.sock:/var/run/docker.sock \ - -v /Users/tgrimonet/Projects/arista-ansible/:/projects \ - -v /etc/hosts:/etc/hosts avdteam/base:3.6 -Install ansible with version 2.10 -Collecting ansible==2.10 - Downloading ansible-2.10.0.tar.gz (14.1 MB) -... -``` - -#### Command for image management - -- `update`: Get the latest version of [AVD runner](https://hub.docker.com/repository/docker/avdteam/base) and [mkdoc](https://hub.docker.com/repository/docker/titom73/mkdocs) servers -- `clean`: Remove the AVD image from the local repository - -### Run AVD shell - -We will start a [new container](https://hub.docker.com/repository/docker/avdteam/base) running Ansible with all the Python requirements and mount a local folder under `/projects`. If the image is missing, Docker will pull it automatically. - -```shell -$ docker run --rm -it -v ${pwd}/:/projects avdteam/base:3.6 -Unable to find image 'avdteam/base:3.6' locally -3.6: Pulling from avdteam/base -bf5952930446: Already exists -385bb58d08e6: Already exists -f59c6df69726: Already exists -cc14d0cfa632: Already exists -f4eba3bd5be8: Already exists -55c6a5feb373: Already exists -83464a988ea4: Pull complete -9b675b85887d: Pull complete -9cce9aa068f4: Pull complete -a49dbba0fea8: Pull complete -793f98fe2265: Pull complete -Digest: sha256:ead3ef030caa6caeafd6ddbfd31ce935da26b66914096c9543d9a44cca993dfd -Status: Downloaded newer image for avdteam/base:3.6 -Agent pid 45 -âžœ /projects -``` - -You can use the Make command to run the same set of actions: - -```shell -$ make run -Unable to find image 'avdteam/base:3.6' locally -3.6: Pulling from avdteam/base -bf5952930446: Already exists -385bb58d08e6: Already exists -f59c6df69726: Already exists -cc14d0cfa632: Already exists -f4eba3bd5be8: Already exists -55c6a5feb373: Already exists -83464a988ea4: Pull complete -9b675b85887d: Pull complete -9cce9aa068f4: Pull complete -a49dbba0fea8: Pull complete -793f98fe2265: Pull complete -Digest: sha256:ead3ef030caa6caeafd6ddbfd31ce935da26b66914096c9543d9a44cca993dfd -Status: Downloaded newer image for avdteam/base:3.6 -Agent pid 45 -âžœ /projects -``` - -Then you can move to your content folder as the structure remains the same: - -```shell -âžœ /projects ls -l -drwxr-xr-x 24 root root 768 Sep 4 15:47 avd -drwxr-xr-x 24 root root 768 Sep 4 15:47 ansible-cvp -drwxr-xr-x 24 root root 768 Sep 4 15:47 ansible-avd-cloudvision-demo -drwxr-xr-x 24 root root 768 Sep 4 15:47 Makefile -``` - -You can validate if everything is set up correctly: - -```shell -âžœ /projects python --version -Python 3.6.12 - -âžœ /projects ansible --version -ansible 2.10.7 - config file = None - configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] - ansible python module location = /root/.local/lib/python3.6/site-packages/ansible - executable location = /root/.local/bin/ansible - python version = 3.6.12 (default, Aug 18 2020, 04:28:43) [GCC 8.3.0] -``` - -To exit the container, use `exit` - -```shell -âžœ /projects exit -$ -``` - -### Get the latest image of the AVD container - -The AVD container is updated frequently to reflect some changes in either Python requirements or the Ansible version. Because your Docker engine won't get the latest version automatically, it's essential to manually update this container: - -```shell -$ docker pull avdteam/base:3.6 -latest: Pulling from avdteam/base -8a29a15cefae: Already exists -95df01e08bce: Downloading [==============================================> ] 33.55MB/36.35MB -512a8a4d71f7: Downloading [=========================================> ] 45.1MB/53.85MB -209c1657264b: Download complete -bd6eece0221e: Downloading [===================> ] 52.04MB/132.1MB -036c486feecb: Waiting -``` - -Your environment is now ready, and you can start to build your project leveraging arista.avd and arista.cvp Ansible collections. - -## Using Python 3 Virtual Environment feature - -This section describes how to configure Python to run AVD. - -As a requirement, we consider python3 as the default Python interpreter and pip3 as the package manager for python3. Some differences can be spotted depending on your operating system and how they package Python. - -**Disclaimer**: Not a preferred method. If you are an inexperienced user, please use the Docker approach. - -In a shell, install the `virtualenv` package: - -```shell -# install virtualenv via pip3 -sudo pip3 install virtualenv -``` - -Create a dedicated virtual environment where AVD will install all required Python packages: - -```shell -$ pwd -/home/user/git_projects - -# Configure Python virtual environment -$ virtualenv -p python3 .venv -$ source .venv/bin/activate - -# Install Python requirements -$ pip3 install -r avd/ansible_collections/arista/avd/requirements.txt -... -``` diff --git a/ansible_collections/arista/avd/docs/contribution/setup-git.md b/ansible_collections/arista/avd/docs/contribution/setup-git.md deleted file mode 100644 index 0618186b61f..00000000000 --- a/ansible_collections/arista/avd/docs/contribution/setup-git.md +++ /dev/null @@ -1,66 +0,0 @@ - - -# Git installation - -Using Git as the source of collections in Ansible provides an easy way to implement all the changes once they're part of the development branch without waiting for a new tagged version shipped to Ansible Galaxy. - -## Use Git as the source of collection - -In this setup, the Git repository will be used by Ansible as a collection. It's useful when working on feature development as we can change the Git branch and test code live. - -### Clone the remote repository - -```shell -# Clone repository -git clone https://github.com/aristanetworks/avd.git - -# Move to git folder -cd avd -``` - -### Update your `ansible.cfg` - -In your project, update your `ansible.cfg` file to point **collection_paths** to your local version of the `arista.avd` collection - -- Get the full path to your newly cloned AVD repository. - -```shell -# Get your current location -$ pwd -/path/to/ansible/avd/collection_repository -``` - -- Configure your project to use the AVD repository as a source of collections: - -```ini -# Update your ansible.cfg in your playbook project -# $ vim ansible.cfg -[default] -... -collections_paths = /path/to/ansible/avd/collection_repository -... -``` - -## Build & install collection from Git - -This approach uses an Ansible collection package built from the current Git version and installed locally. - -### Clone repository - -```shell -git clone https://github.com/aristanetworks/avd.git -cd avd -``` - -### Build and install collection - -This section should be used only to test collection packaging and to create an offline package to ship on your internal resources if required. - -```shell -ansible-galaxy collection build --force ansible_collections/arista/avd -ansible-galaxy collection install arista-avd-.tar.gz -``` diff --git a/ansible_collections/arista/avd/docs/contribution/style-guide.md b/ansible_collections/arista/avd/docs/contribution/style-guide.md index 265bda7c8b8..73f58f77132 100644 --- a/ansible_collections/arista/avd/docs/contribution/style-guide.md +++ b/ansible_collections/arista/avd/docs/contribution/style-guide.md @@ -27,7 +27,10 @@ Configurations for the above tools can be found in: - [.flake8](https://github.com/aristanetworks/avd/blob/devel/.flake8) - [pylintrc](https://github.com/aristanetworks/avd/blob/devel/pylintrc) -## Jinja2 Syntax guidelines +## Jinja2 Syntax and guidelines + +- Jinja2 template syntax is enforced by [j2lint](https://github.com/aristanetworks/j2lint). +- Additional guidelines are also provided and will be enforced by maintainers. ### SYNTAX-1 - Using variables in Jinja diff --git a/ansible_collections/arista/avd/docs/getting-started/intro-to-ansible-and-avd.md b/ansible_collections/arista/avd/docs/getting-started/intro-to-ansible-and-avd.md index 55e76428be2..a483a43b332 100644 --- a/ansible_collections/arista/avd/docs/getting-started/intro-to-ansible-and-avd.md +++ b/ansible_collections/arista/avd/docs/getting-started/intro-to-ansible-and-avd.md @@ -8,15 +8,15 @@ ## Day 1 Operation -Imagine being asked to configure a **layer 3 leaf spine (L3LS)** network from scratch: +Imagine being asked to configure a **Layer 3 leaf spine (L3LS)** network from scratch: ![Figure: Arista Leaf Spine topology](../_media/getting-started/single-dc.svg) -Traditionally, one would configure the switches manually using a laptop, console cable, and USB key to load the correct EOS software image and configuration. Of course, the configuration would be manually generated using snippets from the relevant Arista design guides or copied/pasted from existing devices. Configurations must be manually adapted to every device, which is time-consuming and error-prone. Imagine a new pair of leaf switches or new VRFs/VLANs were added to the network; changes would need to be made to most of the devices. +Traditionally, one would configure the switches manually using a laptop, console cable, and USB key to load the correct EOS software image and configuration. Of course, the configuration would be manually generated, using snippets from the relevant Arista design guides, or copying/pasting from existing devices. Configurations would have to be manually adapted to each and every device, which is time consuming and prone to errors. Consider what would happen if a new pair of leaf switches or new VRFs/VLANs are added to the network - changes would need to be made to most of the devices. -Using Arista Validated Designs (AVD), this task is automated, greatly simplified, and made considerably faster. All the basic network configuration is guaranteed to be identical across the entire fabric from day one. No longer do you have to manually inspect each device for errors or differences. AVD will ensure the consistency and accuracy of your configuration not only for initial deployment but for all subsequent network changes. +Using Arista Validated Designs (AVD), this task is automated, greatly simplified, and made considerably faster. All the basic network configuration is guaranteed to be identical across the entire fabric from day one. No longer do you have to manually inspect each device for errors or differences. AVD will ensure the consistency and accuracy of your configuration not only for initial deployment, but for all subsequent network changes. -AVD is based on best practices from [Arista Design and Deployment Guides](https://www.arista.com/en/solutions/design-guides), meaning you get the full benefit of Arista's experience deploying large-scale leaf spine fabrics. AVD fully integrates with Arista CloudVision, which adds a change control workflow, continuous compliance check, network topology overview, real-time streaming telemetry including flow-based data, and more. +AVD is also based on best practice from [Arista Design and Deployment Guides](https://www.arista.com/en/solutions/design-guides), meaning you get the full benefit of Arista's experience in deploying large scale leaf-spine fabrics. AVD fully integrates with Arista CloudVision, which adds a change control workflow, continuous compliance check, and network topology overview as well as real-time streaming telemetry including flow-based data and more. ## What is Ansible? @@ -27,14 +27,14 @@ is an automation engine that can be used for many purposes including: - Configuration management - Application deployment -It's easily extended through the use of Ansible Collections - essentially prepackaged groups of Ansible components such as playbooks, roles, modules and plugins - that are distributed through [Ansible Galaxy](https://galaxy.ansible.com/home). +It's easily extended through the use of Ansible Collections - essentially prepackaged groups of Ansible components such as playbooks, roles, modules, and plugins - that are distributed through [Ansible Galaxy](https://galaxy.ansible.com/home). Between the core Ansible software and third-party-contributed collections, we can use Ansible to carry out almost any automated task on a network, server, or cloud platform in a consistent, secure, and distributed way. Consistency of tasks carried out is assured through idempotency - that the outcome of an operation is only performed once and only if necessary, no matter how many times that process is carried out. A simple example of idempotency would be a pair of on/off buttons for a machine - no matter how many times you push 'on,' the device will only turn on once. -Unlike other tools, Ansible doesn't use a proprietary communications mechanism or agent on the device being managed. Instead, it leverages industry-standard protocols for device access, including SSH and REST APIs. This also means that Ansible doesn't require the setup of any unique infrastructure - it's entirely possible to automate tasks using nothing but your laptop or desktop computer (but a central deployment server is recommended). +Unlike other tools, Ansible does not use a proprietary communications mechanism or agent on the device being managed. Instead, it leverages industry-standard protocols for device access, including SSH and REST APIs. This also means that Ansible does not require the setup of any unique infrastructure - it is entirely possible to automate tasks using nothing but your laptop or desktop computer (but a central deployment server is recommended). Ansible describes tasks in a structured language called [YAML](https://yaml.org). Unlike other languages such as JSON and XML, YAML was designed to be human-readable. YAML will be covered further later on in the section @@ -60,11 +60,11 @@ that allow the user to generate and deploy best-practice configurations to Arist The illustration above shows the arista.avd collection as a box with a red background on the right-hand side. -When designing an EVPN/VXLAN L3LS fabric, you don't need to spend hours reading through the [Arista Design and Deployment Guides](https://www.arista.com/en/solutions/design-guides). Instead, the AVD collection will implement those rules and guidelines. +When designing an EVPN/VXLAN L3LS fabric, you do not need to spend hours reading through the [Arista Design and Deployment Guides](https://www.arista.com/en/solutions/design-guides). Instead, the AVD collection will implement those rules and guidelines. AVD is an opinionated collection, meaning field experiences and best practices from actual deployments at Arista customers are included. With AVD, users get up and running quickly without inventing every part of the network configuration from scratch. This means the user must provide only the most basic information to get a new fabric up and running. -Parameters which need to be defined by the user include (but aren't limited to): +Parameters which need to be defined by the user include (but are not limited to): - Username/password for network devices and CloudVision - OOB management IP range @@ -84,11 +84,11 @@ It's important to note when and perhaps more importantly, when not to use AVD. AVD is designed to generate and deploy complete configuration files where the network device's running configuration is entirely replaced. As such, caution should be exercised when running AVD against an existing manually configured network. We can take various approaches under such circumstances: -- Compare AVD-generated configurations against the device running configurations; make changes to the AVD input data and iterate until the configurations are functionally equivalent. -- Use AVD to generate partial configurations that we can apply to devices in such a way that won't destroy existing manual configurations. +- Compare AVD-generated configurations against device running configurations; make changes to the AVD input data and iterate until the configurations are functionally equivalent. +- Use AVD to generate partial configurations that we can apply to devices in such a way that will not destroy the existing manual configuration. - Use AVD to generate configurations part-based on automation, part-based on manual configuration included into AVD using AVD's `structured_configuration`, `raw_eos_cli` or `custom_template` facilities. -Automating the provisioning of network infrastructure makes the most sense when the network is built from repeatable building blocks. These allow for code reuse and the abstraction of data. For example, point-to-point links are allocated IP subnets from a much larger pool in most leaf-spine networks. This is a tedious job for a human to design and configure but is an ideal candidate to be automated. However, automation may take longer to achieve in a network that has evolved rather than been designed from the ground up. +Automating the provisioning of network infrastructure makes the most sense when the network is built from repeatable building blocks. These allow for code reuse and the abstraction of data. For example, point-to-point links are allocated IP subnets from a much larger pool in most leaf-spine networks. This is a tedious job for a human to design and configure, but is an ideal candidate to be automated. However, automation may take longer to achieve in a network that has evolved rather than one designed from the ground up. ## Change your mindset and culture @@ -108,7 +108,7 @@ This is defined in the Ansible ***inventory***. Per the official Ansible documen Please note that the example above is taken from the Ansible AVD Examples repository, specifically the `Single-DC-L3LS`. -The exact name of the inventory file isn't important but is provided to Ansible in the `ansible.cfg` file for the project or as `ansible-playbook -i ./inventory.yml` when later running Ansible. +The exact name of the inventory file is not important, but is provided to Ansible in the `ansible.cfg` file for the project or as `ansible-playbook -i ./inventory.yml` when later running Ansible. ### Inventories @@ -134,7 +134,7 @@ all: ansible_host: 172.16.1.12 ``` -However, going forward, we expect that all hostnames specified are resolvable hence the entire inventory file looks as follows: +However, going forward, we expect that all hostnames specified are resolvable, hence the entire inventory file appears as follows: ```yaml --- @@ -169,11 +169,11 @@ all: DC1_L2_LEAVES: ``` -Don't confuse ***hosts*** with servers or similar. A host can be anything that can be accessed via SSH or an API, to be managed by Ansible, including Arista switches. +Do not confuse ***hosts*** with servers or similar. A host can be anything that can be accessed via SSH or an API, to be managed by Ansible, including Arista switches. The settings inside the inventory.yml file are defined in a tree-like structure using ***groups***. Groups can contain hosts or other groups - making it easier to apply a common configuration to a group of devices. -The ***all*** line at the top is a default group that contains all ***hosts***, i.e., all switches. So don't worry too much about that for now. +The ***all*** line at the top is a default group that contains all ***hosts***, i.e., all switches. So do not worry too much about that for now. The ***children:*** keyword is used to define "groups of groups," i.e., just an internal keyword to differentiate between hosts and groups. @@ -189,7 +189,7 @@ More information about Ansible inventories can be found [here](https://docs.ansi ### Organizing host and group variables AVD makes use of variables defined in the inventory to generate the EOS configuration files necessary to configure the devices. While these -variables can be stored in the main inventory file described earlier, it's highly recommended to use separate files for host and group +variables can be stored in the main inventory file described earlier, it is highly recommended to use separate files for host and group variables. Like the inventory.yml file, the host and group variables are also stored in dedicated folders named accordingly in YAML files. ### Group Variables @@ -273,7 +273,7 @@ local_users: no_password: true ``` -The above snippet defines a number of defaults that apply to all children of FABRIC along with configuration specific to each leaf pair and finally each individual leaf switch. +The snippet above defines a number of defaults that apply to all children of FABRIC along with configurations specific to each leaf pair and finally each individual leaf switch. We can override group variables by specifying host variables for specific devices. (see [DEFAULT_HASH_BEHAVIOUR](https://docs.ansible.com/ansible/latest/reference_appendices/config.html#default-hash-behaviour)). The order of precedence is (from lowest to highest): @@ -359,11 +359,11 @@ While this play shows both the `eos_designs` and `eos_cli_config_gen` roles used ## System of Record -In a legacy network where configuration isn't administered centrally, you have very little control of the relationship between the configuration you *intend* to be applied to the network and the configuration *running* on the network. You might have centralized low-level design documents describing how the network should function in great detail, but you don't have much but the best intentions to ensure that your **entire** network is working as you intended. As a result, it takes only a single configuration mistake on a single device to create havoc. +In a legacy network where configuration is not administered centrally, you have very little control of the relationship between the configuration you *intend* to be applied to the network and the configuration *running* on the network. You might have centralized low-level design documents describing how the network should function in great detail, but you do not have much but the best intentions to ensure that your **entire** network is working as you intended. As a result, it takes only a single configuration mistake on a single device to create havoc. -Since operating many networking devices also typically results in having many networking engineers, there is even more room for error. Different people do things differently, and repetitive tasks aren't always executed in the same manner. +Since operating many networking devices also typically results in having many networking engineers, there is even more room for error. Different people do things differently, and repetitive tasks are not always executed in the same manner. -With AVD, you define not only the topology of your network centrally but also which services are used where in a central repository of text files. Furthermore, because this data is stored in text files, it's possible to apply version control (for example, using tools like git, subversion, or mercurial) to this System of Record, giving you visibility of when the intended configuration was changed and by whom. +With AVD, you define not only the topology of your network centrally, but also which services are used where in a central repository of text files. Furthermore, because this data is stored in text files, it is possible to apply version control (for example, using tools like git, subversion, or mercurial) to this system of record, giving you visibility of when the intended configuration was changed and by whom. This System of Record means you have a complete overview of your designed network configuration without looking at individual network devices. An additional benefit of AVD is that by design, you always have a network configuration backup. Including automated documentation in markdown format, you no longer have to remember to update documentation about which interface is connected to which device, etc., whenever you change something on a device. Instead, it's all done automatically based on the configuration built and applied to the network devices by Ansible every time you execute the playbooks. @@ -477,7 +477,7 @@ These tasks, while relatively simple, can be time-consuming simply because they - Adding/removing new leaf switches. - Adding/removing new VLANs. - Creating/modifying/deleting port profiles. -- Configuring/modifying ports towards end systems. +- Configuring/modifying ports toward end systems. Making these changes could involve many hours of planning to generate configuration snippets to apply during a change window. diff --git a/ansible_collections/arista/avd/docs/installation/collection-installation.md b/ansible_collections/arista/avd/docs/installation/collection-installation.md index dc024fd6c66..69a4b81eda3 100644 --- a/ansible_collections/arista/avd/docs/installation/collection-installation.md +++ b/ansible_collections/arista/avd/docs/installation/collection-installation.md @@ -9,58 +9,62 @@ ## Installation workflow - Install [Python](https://www.python.org/downloads/) **3.9** or later -- Install [ansible-core](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html) from **2.14.0** to **2.16.x** -- Install [arista.avd](#install-collection-from-ansible-galaxy) collection -- Install additional Python [requirements](#python-requirements-installation) +- Install [arista.avd](#install-collection-from-ansible-galaxy) collection including Python requirements. - Modify `ansible.cfg` file to support additional [jinja2 extensions](#ansible-configuration-file) ## Install Collection from Ansible Galaxy -These instructions are for regular users to install via Ansible Galaxy. To setup a development environment use [these](../contribution/setup-environment.md) instructions. **arista.avd** can also be consumed using the ["AVD All-in-one" container](https://github.com/arista-netdevops-community/avd-all-in-one-container). The **arista.avd** collection is available on [Ansible Galaxy](https://galaxy.ansible.com/arista/avd) server and can be automatically installed on your system. +These instructions are for regular users to install via Ansible Galaxy. +The instructions also include installation of all Python requirements for a given version. +To set up a development environment, please follow the [development tooling](../contribution/development-tooling.md) instructions. +**arista.avd** can also be consumed using the ["Universal" container](../containers/overview.md#how-to-use-dev-containers). +The **arista.avd** collection is available on the [Ansible Galaxy](https://galaxy.ansible.com/arista/avd) +server and can be automatically installed on your system. ### Latest version +These commands install all Python requirements including `ansible-core` and then installs the `arista.avd` Ansible collection including +all required Ansible collections. + ```shell +pip install "pyavd[ansible]" ansible-galaxy collection install arista.avd ``` !!! warning If you have an `ansible.cfg` file in the directory where you run `ansible-galaxy`, it may affect the directory under which the collection and dependencies will be installed. +!!! warning + Depending of your operating system settings, `pip` might be replaced by `pip3`. + ### Install a specific version ```shell -ansible-galaxy collection install arista.avd:==4.4.0 +pip install "pyavd[ansible]==4.8.0" +ansible-galaxy collection install arista.avd:==4.8.0 ``` -You can specify multiple range identifiers which are split by `,`. For example, you can use the following range identifiers: - -- `*`: Any version, this is the default used when no range specified is set. -- `!=`: Version isn't equal to the one specified. -- `==`: Version must be the one specified. -- `>=`: Version is greater than or equal to the one specified. -- `>`: Version is greater than the one specified. -- `<=`: Version is less than or equal to the one specified. -- `<`: Version is less than the one specified. - -!!! note - If you are installing with a range command, you must surround the command in quotes. For example, `ansible-galaxy collection install 'arista.avd:>=4.0.0,<5.0.0'` - ### Install latest `devel` version from AVD GitHub ```shell +pip install "pyavd[ansible] @ git+https://github.com/aristanetworks/avd.git@devel#subdirectory=python-avd" ansible-galaxy collection install git+https://github.com/aristanetworks/avd.git#/ansible_collections/arista/avd/,devel ``` !!! note - Collection dependencies like `ansible-cvp` will be installed from ansible-galaxy unless installed first using similar GitHub source. + Installing from `devel` will require minimum Python 3.10, since the PyAVD package will be built during installation, and some + of the build tooling requires minimum 3.10. + +!!! note + Collection dependencies like `ansible-cvp` will be installed from Ansible Galaxy unless installed first using similar GitHub source. ### Install in a specific directory -If you want to install collection in a specific directory part of your project, you can call `ansible-galaxy` and update your `ansible.cfg` +If you want to install collection in a specific directory part of your project, you can call `ansible-galaxy` with the `-p` option +and update your `ansible.cfg`: ```shell -# Install collection under ${PWD/collections/} +# Install collection under ${PWD}/collections/ $ ansible-galaxy collection install arista.avd -p collections/ # Update ansible.cfg file @@ -70,52 +74,27 @@ collections_paths = ${PWD}/collections:~/.ansible/collections:/usr/share/ansible ### Upgrade installed AVD collection -!!! note - You can use `-U` to upgrade to a new version for any installed collection: +You can use `-U` to upgrade to a new version for any installed collection: ```shell $ ansible-galaxy collection install -U arista.avd Process install dependency map Starting collection install process -Installing 'arista.avd:4.4.0' to '/root/.ansible/collections/ansible_collections/arista/avd' -``` - -!!! warning -After an upgrade, some python requirements may have changed. Follow the -instructions in the Python [requirements](#python-requirements-installation) -section to update your python packages. - -!!! note - You can find some additional information about how to use Ansible's collections on the following Ansible pages: - - - [Ansible collection user guide](https://docs.ansible.com/ansible/latest/user_guide/collections_using.html) - - [Ansible User guide](https://docs.ansible.com/ansible/latest/user_guide/index.html) - -## Additional Python Libraries required - -```pip ---8<-- -requirements.txt ---8<-- +Installing 'arista.avd:4.9.0' to '/home/arista/.ansible/collections/ansible_collections/arista/avd' ``` -### Python requirements installation - -In a shell, run the following commands after installing the collection from ansible-galaxy: +After an upgrade, some python requirements may have changed. Make sure to also update the Python requirements for the same version (the version given below matches the installed collection above): ```shell -export ARISTA_AVD_DIR=$(ansible-galaxy collection list arista.avd --format yaml | head -1 | cut -d: -f1) -pip3 install -r ${ARISTA_AVD_DIR}/arista/avd/requirements.txt +pip install "pyavd[ansible]==4.9.0" ``` -If the collection is cloned from GitHub, we can reference the requirements file directly: +### Python requirements installation -```shell -pip3 install -r avd/ansible_collections/arista/avd/requirements.txt -``` +Python requirements can be installed with the `pip install "pyavd[ansible]"`. +The installed version of PyAVD **must** match the version of the `arista.avd` collection. -!!! warning - Depending of your operating system settings, `pip3` might be replaced by `pip`. +See the [collection installation](#install-collection-from-ansible-galaxy) section for details of each installation method. ## Ansible configuration file diff --git a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/generate_esi.md b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/generate_esi.md index 73594176221..88002d72bb1 100644 --- a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/generate_esi.md +++ b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/generate_esi.md @@ -13,6 +13,9 @@ title: arista.avd.generate_esi !!! note Always use the FQCN (Fully Qualified Collection Name) `arista.avd.generate_esi` when using this plugin. +!!! danger "This plugin is **deprecated**" + This will be removed in version 5.0.0. + Transforms short_esi `0303:0202:0101` to EVPN ESI format `0000:0000:0303:0202:0101` ## Synopsis diff --git a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/generate_lacp_id.md b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/generate_lacp_id.md index 2273fe0f8c6..207c53c23e2 100644 --- a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/generate_lacp_id.md +++ b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/generate_lacp_id.md @@ -13,6 +13,9 @@ title: arista.avd.generate_lacp_id !!! note Always use the FQCN (Fully Qualified Collection Name) `arista.avd.generate_lacp_id` when using this plugin. +!!! danger "This plugin is **deprecated**" + This will be removed in version 5.0.0. + Transforms short_esi `0303:0202:0101` to LACP ID format `0303.0202.0101` ## Synopsis diff --git a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/generate_route_target.md b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/generate_route_target.md index cfc8b768d81..4e39caff853 100644 --- a/ansible_collections/arista/avd/docs/plugins/Filter_plugins/generate_route_target.md +++ b/ansible_collections/arista/avd/docs/plugins/Filter_plugins/generate_route_target.md @@ -13,6 +13,9 @@ title: arista.avd.generate_route_target !!! note Always use the FQCN (Fully Qualified Collection Name) `arista.avd.generate_route_target` when using this plugin. +!!! danger "This plugin is **deprecated**" + This will be removed in version 5.0.0. + Transforms short_esi `0303:0202:0101` to route-target format `03:03:02:02:01:01` ## Synopsis diff --git a/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/batch_template.md b/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/batch_template.md index 4bc72a23239..807dadffb7d 100644 --- a/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/batch_template.md +++ b/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/batch_template.md @@ -13,6 +13,9 @@ title: arista.avd.batch_template !!! note Always use the FQCN (Fully Qualified Collection Name) `arista.avd.batch_template` when using this plugin. +!!! danger "This plugin is **deprecated**" + This module will be removed in version 5.0.0. + Render Jinja2 template on multiple items and write result to individual files. ## Synopsis diff --git a/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/cv_workflow.md b/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/cv_workflow.md index bfc5a4a54a8..f1517c966f1 100644 --- a/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/cv_workflow.md +++ b/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/cv_workflow.md @@ -56,6 +56,15 @@ The `arista.avd.cv_workflow` module is an Ansible Action Plugin providing the fo |     change_control_creation_timeout | float | optional | 300.0 | | Time to wait for Change Control creation before failing. | | return_details | bool | optional | False | | If `true` all details will be returned to Ansible and can be registered.
For large inventories this can affect performance, so it is disabled by default. | +## Notes + +- When interacting with CVaaS the regional URL where the tenant is deployed should be used, e.g: + `cv_servers: [ www.cv-prod-euwest-2.arista.io ]` + To see the full list of regional URLs, please visit the [cv_deploy](../../../roles/cv_deploy/README.md#overview) + role documentation. +- To generate service accounts check [cv_deploy](../../../roles/cv_deploy/README.md#steps-to-create-service-accounts-on-cloudvision) + role documentation or the CloudVision Help Center. + ## Examples ```yaml diff --git a/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/eos_cli_config_gen.md b/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/eos_cli_config_gen.md new file mode 100644 index 00000000000..662f93f182c --- /dev/null +++ b/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/eos_cli_config_gen.md @@ -0,0 +1,69 @@ +--- +# This title is used for search results +title: arista.avd.eos_cli_config_gen +--- + + +# eos_cli_config_gen + +!!! note + Always use the FQCN (Fully Qualified Collection Name) `arista.avd.eos_cli_config_gen` when using this plugin. + +Generate AVD EOS device configurations and documentations + +## Synopsis + +The `arista.avd.eos_cli_config_gen` module is an Ansible Action Plugin providing the following capabilities: + +- Validates input variables according to eos_cli_config_gen schema +- Generates device configuration and saves it to file +- Optionallu generates device documentation and saves it to file + +## Parameters + +| Argument | Type | Required | Default | Value Restrictions | Description | +| -------- | ---- | -------- | ------- | ------------------ | ----------- | +| structured_config_filename | str | optional | None | | The path of the structured config to load. Required if read_structured_config_from_file is true. | +| config_filename | str | optional | None | | The path to save the generated config to. Required if generate_device_config is true. | +| documentation_filename | str | optional | None | | The path to save the generated documentation. Required if generate_device_doc is true. | +| read_structured_config_from_file | bool | optional | True | | Flag to indicate if the structured config should be read from a file or not. | +| generate_device_config | bool | optional | True | | Flag to generate the device configuration. | +| generate_device_doc | bool | optional | True | | Flag to generate the device documentation. | +| device_doc_toc | bool | optional | True | | Flag to generate the table of content for the device documentation. | +| conversion_mode | str | False | debug | Valid values:
- error
- warning
- info
- debug
- quiet
- disabled | Run data conversion in either "error", "warning", "info", "debug", "quiet" or "disabled" mode.
Conversion will perform type conversion of input variables as defined in the schema.
Conversion is intended to help the user to identify minor issues with the input data, while still allowing the data to be validated.
During conversion, messages will be generated with information about the host(s) and key(s) which required conversion.
conversion_mode:disabled means that conversion will not run.
conversion_mode:error will produce error messages and fail the task.
conversion_mode:warning will produce warning messages.
conversion_mode:info will produce regular log messages.
conversion_mode:debug will produce hidden messages viewable with -v.
conversion_mode:quiet will not produce any messages. | +| validation_mode | str | False | warning | Valid values:
- error
- warning
- info
- debug
- disabled | Run validation in either "error", "warning", "info", "debug" or "disabled" mode.
Validation will validate the input variables according to the schema.
During validation, messages will be generated with information about the host(s) and key(s) which failed validation.
validation_mode:disabled means that validation will not run.
validation_mode:error will produce error messages and fail the task.
validation_mode:warning will produce warning messages.
validation_mode:info will produce regular log messages.
validation_mode:debug will produce hidden messages viewable with -v. | +| cprofile_file | str | False | None | | Filename for storing cprofile data used to debug performance issues.
Running cprofile will slow down performance in it self, so only set this while troubleshooting. | + +## Examples + +```yaml +--- +- name: Generate eos intended configuration and device documentation + arista.avd.eos_cli_config_gen: + structured_config_filename: "{{ structured_config_filename }}" + config_filename: "{{ eos_config_dir }}/{{ inventory_hostname }}.cfg" + documentation_filename: "{{ devices_dir }}/{{ inventory_hostname }}.md" + read_structured_config_from_file: true + delegate_to: localhost + vars: + structured_config_filename: "{{ structured_dir }}/{{ inventory_hostname }}.{{ avd_structured_config_file_format }}" +- name: Generate device documentation only + arista.avd.eos_cli_config_gen: + structured_config_filename: "{{ structured_config_filename }}" + config_filename: "{{ eos_config_dir }}/{{ inventory_hostname }}.cfg" + documentation_filename: "{{ devices_dir }}/{{ inventory_hostname }}.md" + read_structured_config_from_file: true + generate_device_config: false + device_doc_toc: true + delegate_to: localhost + vars: + structured_config_filename: "{{ structured_dir }}/{{ inventory_hostname }}.{{ avd_structured_config_file_format }}" +``` + +## Authors + +- Arista Ansible Team (@aristanetworks) diff --git a/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/eos_validate_state_reports.md b/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/eos_validate_state_reports.md index 14340adaaec..710ffdb5ea1 100644 --- a/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/eos_validate_state_reports.md +++ b/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/eos_validate_state_reports.md @@ -13,9 +13,6 @@ title: arista.avd.eos_validate_state_reports !!! note Always use the FQCN (Fully Qualified Collection Name) `arista.avd.eos_validate_state_reports` when using this plugin. -!!! warning "This module is in **preview** mode" - This module is not guaranteed to have a backwards compatible interface. - Generates validation reports for the eos_validate_state role ## Synopsis @@ -52,7 +49,7 @@ The plugin offers the following functionalities: ## See Also -- ANTA website: [https://anta.ninja](https://anta.ninja)
Documentation for the ANTA test framework +- ANTA website: [https://anta.arista.com](https://anta.arista.com)
Documentation for the ANTA test framework ## Examples diff --git a/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/eos_validate_state_runner.md b/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/eos_validate_state_runner.md index df72700f80c..da5823fd818 100644 --- a/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/eos_validate_state_runner.md +++ b/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/eos_validate_state_runner.md @@ -13,9 +13,6 @@ title: arista.avd.eos_validate_state_runner !!! note Always use the FQCN (Fully Qualified Collection Name) `arista.avd.eos_validate_state_runner` when using this plugin. -!!! warning "This module is in **preview** mode" - This module is not guaranteed to have a backwards compatible interface. - Uses ANTA for eos_validate_state role ## Synopsis @@ -40,9 +37,9 @@ The plugin offers the following capabilities: | device_catalog_path | str | optional | None | | The absolute path where the device test catalog will be saved.
Required if `save_catalog` is set to `True`. | | test_results_dir | str | optional | None | | The directory where the test results JSON file for each host will be saved. | | custom_anta_catalogs_dir | any | optional | None | | The directory where custom ANTA test catalogs are stored.
Files must be named after the device hostname or the Ansible group name and have a `.yml` or `.yaml` extension. | -| skipped_tests | list | optional | None | | A list of dictionaries specifying categories and, optionally, tests to skip.
Each dictionary must have a key `category` and can optionally include a `tests` key. | +| skip_tests | list | optional | None | | A list of dictionaries specifying categories and, optionally, tests to skip.
Each dictionary must have a key `category` and can optionally include a `tests` key. | |     category | str | optional | None | | The name of an AvdTest category (e.g., `AvdTestHardware`). | -|     tests | list | optional | None | | An optional list of specific tests in the category to skip (e.g., `VerifyRoutingProtocolModel` in `AvdTestBGP`).
If not specified, all tests in the category are considered.
For a complete list of available tests, see [link to the test list](https://avd.sh/en/stable/roles/eos_validate_state/ANTA-Preview.html#test-categories). | +|     tests | list | optional | None | | An optional list of specific tests in the category to skip (e.g., `VerifyRoutingProtocolModel` in `AvdTestBGP`).
If not specified, all tests in the category are considered.
For a complete list of available tests, see [link to the test list](https://avd.arista.com/stable/roles/eos_validate_state/anta_integration.html#test-categories). | | cprofile_file | any | optional | None | | The filename for storing cProfile data, useful for debugging performance issues.
Be aware that enabling cProfile can affect performance, so use it only for troubleshooting. | ## Notes @@ -55,7 +52,7 @@ The plugin offers the following capabilities: ## See Also -- ANTA website: [https://anta.ninja](https://anta.ninja)
Documentation for the ANTA test framework +- ANTA website: [https://anta.arista.com](https://anta.arista.com)
Documentation for the ANTA test framework ## Examples @@ -67,7 +64,7 @@ The plugin offers the following capabilities: device_catalog_path: "/my_avd_project/intended/test_catalogs/{{ inventory_hostname }}-catalog.yml" test_results_dir: "/my_avd_project/reports/test_results" custom_anta_catalogs_dir: "/my_avd_project/custom_anta_catalogs" - skipped_tests: + skip_tests: - category: AvdTestHardware - category: AvdTestBGP tests: diff --git a/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/validate_and_template.md b/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/validate_and_template.md index 65634a1f4d9..0dfc3be24ad 100644 --- a/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/validate_and_template.md +++ b/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/validate_and_template.md @@ -13,6 +13,9 @@ title: arista.avd.validate_and_template !!! note Always use the FQCN (Fully Qualified Collection Name) `arista.avd.validate_and_template` when using this plugin. +!!! danger "This plugin is **deprecated**" + This module will be removed in version 5.0.0. + Validate input data according to Schema, render Jinja2 template and write result to a file. ## Synopsis diff --git a/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/yaml_templates_to_facts.md b/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/yaml_templates_to_facts.md index 53772f46228..4fd1ab24106 100644 --- a/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/yaml_templates_to_facts.md +++ b/ansible_collections/arista/avd/docs/plugins/Modules_and_action_plugins/yaml_templates_to_facts.md @@ -13,6 +13,9 @@ title: arista.avd.yaml_templates_to_facts !!! note Always use the FQCN (Fully Qualified Collection Name) `arista.avd.yaml_templates_to_facts` when using this plugin. +!!! danger "This plugin is **deprecated**" + This module will be removed in version 5.0.0. + Set facts from YAML via Jinja2 templates ## Synopsis @@ -51,7 +54,7 @@ Set facts from YAML produced by Jinja2 templates arista.avd.yaml_templates_to_facts: root_key: structured_config templates: - - python_module: "ansible_collections.arista.avd.roles.eos_designs.python_modules.base" + - python_module: "pyavd._eos_designs.structured_config.base" python_class_name: "AvdStructuredConfig" - template: "mlag/main.j2" - template: "designs/underlay/main.j2" diff --git a/ansible_collections/arista/avd/docs/pyavd.md b/ansible_collections/arista/avd/docs/pyavd.md index a5fa46db0f6..7ad5ea48257 100644 --- a/ansible_collections/arista/avd/docs/pyavd.md +++ b/ansible_collections/arista/avd/docs/pyavd.md @@ -61,29 +61,17 @@ Feedback is very welcome. Please use [GitHub discussions](https://github.com/ari Install the `pyavd` Python package: ```sh -pip3 install pyavd +pip install pyavd ``` -Requirements (automatically installed with above command): - -```ini -jinja2>=3.0 -jsonschema>=4.5.1,<4.18 -deepmerge>=1.1.0 -``` +Python dependencies are automatically installed with above command. ### Optional requirements -For support of `get_device_doc(..., add_md_toc=True)` install with extra `mdtoc`: +To install Ansible [AVD collection additional Python requirements](installation/collection-installation.md#additional-python-libraries-required) install with extra `ansible`: ```sh -pip3 install pyavd[mdtoc] -``` - -Optional `md-toc` requirement (automatically installed with above command): - -```ini -md-toc>=8.1.8 +pip install pyavd[ansible] ``` ## Reference diff --git a/ansible_collections/arista/avd/docs/release-notes/3.x.x.md b/ansible_collections/arista/avd/docs/release-notes/3.x.x.md index 3ca9ada212c..06349f03ecd 100644 --- a/ansible_collections/arista/avd/docs/release-notes/3.x.x.md +++ b/ansible_collections/arista/avd/docs/release-notes/3.x.x.md @@ -142,7 +142,7 @@ - Fix(eos_designs): Detect duplicate VLAN, VRF, VNI within network_services (#2411) by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/2449 - Fix(eos_designs): Renders lacp fallback when port-channel mode is passive by @gmuloc in https://github.com/aristanetworks/avd/pull/2452 - Fix(eos_designs): vtep_vvtep_ip doesn't generate any config (#2442) by @emilarista in https://github.com/aristanetworks/avd/pull/2455 -- Fix(eos_designs): Fix issue with hardware_counters python code (#2447) by @gmuloc in https://github.com/aristanetworks/avd/pull/2454 +- Fix(eos_designs): Fix issue with hardware_counders python code (#2447) by @gmuloc in https://github.com/aristanetworks/avd/pull/2454 - Fix(eos_designs) - Remove speed from port-channel interfaces (#2463) by @carlbuchmann in (https://github.com/aristanetworks/avd/pull/2465) #### Fixed issues in eos_snapshot @@ -291,7 +291,7 @@ - Feat(eos_designs): EVPN to MPLS-VPN Gateway Overlay Support by @emilarista in https://github.com/aristanetworks/avd/pull/2209 - Feat(eos_designs): EVPN Multicast L3 (OISM) Support by @jonxstill in https://github.com/aristanetworks/avd/pull/2276 - Feat(eos_cli_config_gen,eos_designs): Support Track BFD in static routes by @tgodaA in https://github.com/aristanetworks/avd/pull/2320 -- Feat(eos_designs): Adding 7020R to plattform settings by @tweippert in https://github.com/aristanetworks/avd/pull/2356 +- Feat(eos_designs): Adding 7020R to platform settings by @tweippert in https://github.com/aristanetworks/avd/pull/2356 #### Other new features and enhancements @@ -319,7 +319,7 @@ - Fix(eos_cli_config_gen): add vlan.vni var is defined by @lermilov in https://github.com/aristanetworks/avd/pull/1919 - Fix(eos_cli_config_gen): print the vlans in alphabetical order for `router bgp` by @gmuloc in https://github.com/aristanetworks/avd/pull/1925 - Fix(eos_cli_config_gen): Rendering of dot1x cli by @carlbuchmann in https://github.com/aristanetworks/avd/pull/1924 -- Fix(eos_cli_config_gen): Re-add seperator between VRF and non-VRF config by @ccsnw in https://github.com/aristanetworks/avd/pull/1961 +- Fix(eos_cli_config_gen): Re-add separator between VRF and non-VRF config by @ccsnw in https://github.com/aristanetworks/avd/pull/1961 #### Fixed issues in eos_designs @@ -485,7 +485,7 @@ - Feat(eos_cli_config_gen): Add eos_cli for loopback_interfaces by @UchihaItachiSama in #1707 - Feat(eos_cli_config_gen): dot1x-reauthentication by @mthiel117 in #1700 - Feat(eos_cli_config_gen): Support interfaces snmp trap link-change by @tgodaA in #1703 -- Feat(eos_cli_config_gen): Support platfom sand qos-mapping by @tgodaA in #1686 +- Feat(eos_cli_config_gen): Support platform sand qos-mapping by @tgodaA in #1686 - Feat(eos_cli_config_gen): Added support for CVX client by @sugetha24 in #1682 - Feat(eos_designs, eos_cli_config_gen): Support default-services in management-api-http by @tgodaA in #1704 - Feat(eos_cli_config_gen): dot1x-pae-mode by @mthiel117 in #1722 @@ -593,7 +593,7 @@ No changes are required for existing deployments. - Feat(eos_cli_config_gen): Add dr_priority to pim ipv4 configuration on interface by @ryanmerolle in #1560 - Feat(eos_cli_config_gen): Add router_bgp rib-in pre-policy retain to eos_cli_config_gen by @ryanmerolle in #1559 - Feat(eos_cli_config_gen): interface bfd echo by @ryanmerolle in #1571 -- Feat(eos_cli_config_gen): router multicast ipv4 counters support by @ryanmerolle in #1582 +- Feat(eos_cli_config_gen): router multicast ipv4 counders support by @ryanmerolle in #1582 - Feat(eos_cli_config_gen): Add support for changing the notification timestamp mode for gnmi (Issues/1532) by @noredistribution in #1533 - Feat(eos_cli_config_gen): add support for FlexRoute compression and expansion of prefixes by @c-po in #1621 - Feat(eos_cli_config_gen): Add support for ebgp_multihop under bgp neighbors by @ccsnw in #1633 @@ -694,7 +694,7 @@ Existing installations will not be affected by this, since `community.general` w - 0c7f9894e Doc(eos_validate_state): Update link to loopback test (#1473) - 8fbb43f43 Doc(eos_designs): Fix markdown errors, typos and update documentation (#1402) - 6db25275e Doc(eos_cli_config_gen): Update documentation and fix typos (#1423) -- 09de02527 Doc(eos_cli_config_gen): README, fix indention for bgp vrf address family (#1467) +- 09de02527 Doc(eos_cli_config_gen): README, fix indentation for bgp vrf address family (#1467) - 4d5c0476c Doc(eos_cli_config_gen): OSPF network prefixes (#1421) - 4abee6aff Doc(eos_cli_config_gen): Key exchange under management_ssh incorrectly documented in the README file (#1510) - bc76ca254 Doc(eos_cli_config_gen): Add information about gnmi provider configured with octa (#1494) @@ -1216,7 +1216,7 @@ daemon_terminattr: grpcaddr: < string | e.g. "MGMT/0.0.0.0:6042" > grpcreadonly: < true | false > ingestexclude: < string | e.g. "/Sysdb/cell/1/agent,/Sysdb/cell/2/agent" > - smashexcludes: < string | e.g. "ale,flexCounter,hardware,kni,pulse,strata" > + smashexcludes: < string | e.g. "ale,flexCounder,hardware,kni,pulse,strata" > taillogs: < path | e.g. "/var/log/messages" > ecodhcpaddr: < IPV4_address:port > ipfix: < true | false > @@ -1309,8 +1309,8 @@ ntp: iburst: < true | false > key: < 1 - 65535 > local_interface: < source_interface > - maxpoll: < 3 - 17 (logorithmic)> - minpoll: < 3 - 17 (logorithmic)> + maxpoll: < 3 - 17 (logarithmic)> + minpoll: < 3 - 17 (logarithmic)> preferred: < true | false > version: < 1 - 4 > vrf: < vrf_name > @@ -1343,7 +1343,7 @@ ntp: - Feat(eos_cli_config_gen,eos_designs): Add support for setting multiple secondary virtual IP addresses for vlans (#1180) - Feat(eos_designs): Add support for vxlan: false on svis and l2vlans (#1191) - Optimize(eos_designs): Move upgrade into eos_designs role and optimize it a bit (#1192) -- Feat(eos_designs): Add support for no pasword in BGP sessions (#1199) +- Feat(eos_designs): Add support for no password in BGP sessions (#1199) - Feat(eos_designs): interface storm-control feature can be set per platform (#1201) - Feat(eos_designs)!: Add "VEOS" to default platform_settings (#1216) - Refactor(eos_designs): Refactor template folders (#1263) @@ -1358,7 +1358,7 @@ ntp: - Feat(eos_cli_config): Ensure required directories are present (#1044) - Feat(eos_*):Ensure required directories are present in all roles (#1048) - Feat(eos_designs): Implement tag for documentation (#1053) -- Local sshkey field added to local-users.j2 to enable sshkey definitio… (#1065) +- Local sshkey field added to local-users.j2 to enable sshkey definition… (#1065) - Feat(eos_cli_config_gen):Add support for mlag heartbeat-interval and system control-plane section (#1069) - Feat(eos_cli_config_gen): Add OSPF timers to router ospf (#1070) - Feat(eos_cli_config_gen):Add support for Private Vlans (#1071) @@ -1387,7 +1387,7 @@ ntp: - Feat(eos_cli_config_gen): Data model upgrade feature for AVD 2.x.x to 3.0 (#1196) - Feat(eos_cli_config_gen): Add support for SSH connection-limit (#1200) - Feat(eos_cli_config_gen): Add support for ip ssh client source-interface (#1212) -- Feat(eos_cli_config_gen): add ACL "counters per-entry" support (#1243) +- Feat(eos_cli_config_gen): add ACL "counders per-entry" support (#1243) #### Enhancement of collections plugins diff --git a/ansible_collections/arista/avd/docs/release-notes/4.x.x.md b/ansible_collections/arista/avd/docs/release-notes/4.x.x.md index 2e85f0fe59d..59956f4ca31 100644 --- a/ansible_collections/arista/avd/docs/release-notes/4.x.x.md +++ b/ansible_collections/arista/avd/docs/release-notes/4.x.x.md @@ -13,6 +13,299 @@ title: Release Notes for AVD 4.x.x - Documentation for AVD version `4.x.x` [available here](https://www.avd.sh/en/stable/) +## Release 4.9.0 + +### Breaking or behavioral changes in eos_designs + +Breaking changes may require modifications to the inventory or playbook. + +#### Removed the BGP outbound route-map for eBGP LAN on WAN routers + +The eBGP LAN feature for WAN routers introduced in AVD 4.7.0 is not working for connected and static redistributed routes inside a VRF (outside of the VRF default) as the RM-BGP-UNDERLAY-PEERS-OUT outbound route-map would not match these routes. +Similarly the routes coming from an eBGP peering in any VRF (including default) would be blocked out by the route-map. + +For these reasons, the route-map was removed as a bug fix. + +To keep the broken route-map, `structured_config` can be used. + +Pull request: + +- Fix(eos_designs)!: Remove eBGP LAN outbound route-map for WAN by @gmuloc in https://github.com/aristanetworks/avd/pull/4107 + +### Changes to requirements + +- The Ansible collection `arista.avd` now only requires `pyavd[ansible]` which will install all other Python dependencies.
+ Note that the version of `pyavd` **must** match the version of the `arista.avd` collection. + +### Deprecations + +- AVD version 5.0.0 will drop support for Python version 3.9. The decision has been taken to remove Python version 3.9 support in AVD collection to anticipate its removal in `ansible-core`. + `ansible-core` version 2.15 End-Of-Life is scheduled for November 2024 and it will be the last `ansible-core` version supporting Python version 3.9 as documented here: https://docs.ansible.com/ansible/latest/reference_appendices/release_and_maintenance.html#ansible-core-support-matrix. + +- The following Ansible plugins are no longer being used by AVD and have been deprecated for removal in AVD 5.0.0. See the plugin docs for possible replacements. + + Filters: + + - `arista.avd.generate_esi` + - `arista.avd.generate_lacp_id` + - `arista.avd.generate_route_target` + + Action plugins / Modules: + + - `arista.avd.batch_template` + - `arista.avd.validate_and_template` + - `arista.avd.yaml_templates_to_facts` + +### Fixed issues in eos_cli_config_gen + +- Fix(eos_cli_config_gen): Fix the templates for event-handlers by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4055 +- Fix(eos_cli_config_gen): BGP models has supress-map which is not present in EOS commands. by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/4054 +- Fix(eos_cli_config_gen): Fix MSDP template typo for sa_filter.out_list by @gusmb in https://github.com/aristanetworks/avd/pull/4161 + +### Fixed issues in eos_designs + +- Fix(eos_designs): Inband mgmt route-map and prefix-list should not be applied without overlay_routing_protocol by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4045 +- Fix(eos_designs): core_interfaces generates invalid config if ASN is not defined for the p2p_links/p2p_links_profiles by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4046 +- Fix(eos_designs): Address ipv4_acl_in/out not working for WAN l3 subinterfaces by @gmuloc in https://github.com/aristanetworks/avd/pull/4116 +- Fix(eos_designs): WAN Exclude interface IP address from direct internet-exit NAT ACL by @ayushmittal-arista in https://github.com/aristanetworks/avd/pull/4096 + +### Other Fixed issues + +- Fix(containers): Add "remoteUser": "avd" to devcontainer by @carlbuchmann in https://github.com/aristanetworks/avd/pull/4043 +- Fix(eos_validate_state): Update error message when a device does not have httpapi _sub_plugin by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/4049 +- Fix(cv_deploy): Improve SWG API handling for Zscaler internet exit by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4090 +- Fix: Adjust inventory group names in molecule tests to follow Ansible guidelines by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/4097 +- Fix: Change the required arguments for eos_cli_config_gen action plugin by @gmuloc in https://github.com/aristanetworks/avd/pull/4152 + +### Documentation + +- Doc: Fix mkdocs broken requirement links in roles by @gmuloc in https://github.com/aristanetworks/avd/pull/4039 +- Doc: Contribution Guide Updates by @carlbuchmann in https://github.com/aristanetworks/avd/pull/3766 +- Doc: Add notes about using cv_deploy for CV Pathfinder by @gmuloc in https://github.com/aristanetworks/avd/pull/4044 +- Doc(eos_cli_config_gen): Include docs for router segment-security by @jonxstill in https://github.com/aristanetworks/avd/pull/4059 +- Doc: Minor updates to Development Tooling guide. by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4067 +- Doc: Update installation guide with PyAVD by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4076 +- Doc: Minor grammar edits. by @blitzeditor in https://github.com/aristanetworks/avd/pull/3362 +- Doc: Added the table of WAN validation by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/4125 +- Doc: Semantic Versioning by @carlbuchmann in https://github.com/aristanetworks/avd/pull/3417 +- Doc: add CVaaS regional URLs to cv_deploy by @noredistribution in https://github.com/aristanetworks/avd/pull/4092 + +### New features and enhancements in eos_cli_config_gen + +- Feat(eos_cli_config_gen): Add support for Postcard telemetry by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3642 +- Feat(eos_cli_config_gen): Add option for `ospf_type` when redistributing OSPF into BGP by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4029 +- Feat(eos_cli_config_gen): Add support for MACsec fallback to unprotected traffic by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4028 +- Feat(eos_cli_config_gen): Add Patch-Panel Connector commands by @ccsnw in https://github.com/aristanetworks/avd/pull/4063 +- Feat(eos_cli_config_gen): Add support for 'no bgp redistribute-internal' by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/4033 +- Feat(eos_cli_config_gen): Add support for Router BGP missing-policy for address-family all by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/4034 +- Feat(eos_cli_config_gen): Add support for dot1x captive portal and supplicant commands by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4023 +- Feat(eos_cli_config_gen): Adding option for arp cache persistent and arp persistent refresh-delay by @bjmeuer in https://github.com/aristanetworks/avd/pull/4109 +- Feat(eos_cli_config_gen): Support of static IPv6 neighbor entries by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/4075 +- Feat(eos_cli_config_gen): Add support for permit response traffic nat under ip acls by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4128 +- Feat(eos_cli_config_gen): Support of BGP default-originate per VRF #3941 by @mmaaloul in https://github.com/aristanetworks/avd/pull/4122 + +### New features and enhancements in eos_designs + +- Feat(eos_designs): Add support for 'uplink_mtu' under node config by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/4040 +- Feat(eos_designs): Add platform settings for WAN devices by @ayushmittal-arista in https://github.com/aristanetworks/avd/pull/4027 +- Feat(eos_designs): Disable per interface MTU for 7010TX by @xaviramon in https://github.com/aristanetworks/avd/pull/4053 +- Feat(eos_designs): Allow reuse of cross-device BGP peer ip by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/4050 +- Feat(eos_designs): Allow 'evpn_vlan_bundle' to be set up at tenant level by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/4093 +- Feat(eos_designs): Enforce unicity of region IDs and per-region site IDs for CV Pathfinder by @gmuloc in https://github.com/aristanetworks/avd/pull/4121 +- Feat(eos_designs): Add support for directly connected WAN HA by @gmuloc in https://github.com/aristanetworks/avd/pull/3720 +- Feat(eos_designs): Add support to enable BGP peering with wan provider by @ayushmittal-arista in https://github.com/aristanetworks/avd/pull/4079 + +### Other new features and enhancements + +- Feat(eos_validate_state): Added the validation for IP security connections by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/3911 +- Feat(eos_validate_state): Added the validation for STUN client configurations by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/3898 +- Feat(containers): switch to pyavd and editable install for container build by @ankudinov in https://github.com/aristanetworks/avd/pull/4087 +- Feat(eos_validate_state): Add support for ANTA v1.0.0 by @carl-baillargeon in https://github.com/aristanetworks/avd/pull/4123 + +### PyAVD Changes + +- Bump(pyavd): Add support for Python 3.9 in PyAVD by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4051 + +### Other Changes + +- Refactor(plugins): Move jinja filter code for `arista.avd.default` to PyAVD by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4047 +- Refactor(eos_cli_config_gen): Addressed missed comments for patch-panel by @gmuloc in https://github.com/aristanetworks/avd/pull/4078 +- Refactor(plugins): Move jinja filter code for arista.avd.natural_sort to PyAVD by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4068 +- Refactor(plugins): Move jinja filter code for arista.avd.convert_dicts to PyAVD by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4069 +- Refactor(plugins): Move jinja filter code for arista.avd.list_compress to PyAVD by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4099 +- Refactor(plugins): Move jinja filter code for arista.avd.generate_route_target to PyAVD by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4101 +- Refactor(plugins): Move jinja filter code for arista.avd.add_md_toc to PyAVD by @gmuloc in https://github.com/aristanetworks/avd/pull/4104 +- Refactor(plugins): Move jinja filter code for arista.avd.hide_passwords to PyAVD by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4112 +- Refactor(plugins): Move jinja filter code for arista.avd.generate_esi to PyAVD by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4114 +- Refactor(eos_designs): Move eos_designs_facts to PyAVD by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4110 +- Refactor(eos_designs): Move eos_designs Python modules to PyAVD by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4120 +- Refactor(eos_designs): Move eos_designs_shared_utils to PyAVD by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4126 +- Refactor(plugins): Move jinja test code for arista.avd.contains to PyAVD by @gmuloc in https://github.com/aristanetworks/avd/pull/4131 +- Refactor(eos_cli_config_gen): Move eos_cli_config_gen to pyavd by @gmuloc in https://github.com/aristanetworks/avd/pull/4117 +- Refactor(plugins): Move jinja filter code for arista.avd.is_in_filter to PyAVD by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4133 +- Refactor(plugins): Move schema code and schema fragments to PyAVD by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4130 +- Refactor(plugins): Move jinja filter code for arista.avd.snmp_hash to PyAVD by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4136 +- Refactor(plugins): Move jinja filter code for arista.avd.generate_lacp_id to PyAVD by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4139 +- Refactor(plugins): Move jinja filter code for arista.avd.encrypt and arista.avd.decrypt to PyAVD by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/4135 +- Refactor(plugins): Move jinja filter code for arista.avd.status_render to PyAVD by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4142 +- Refactor(plugins): Move jinja filter code for arista.avd.range_expand to PyAVD by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/4138 +- Refactor(plugins): Move internal cv_client code to PyAVD by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4141 +- Refactor(plugins): Move jinja test code for arista.avd.defined to PyAVD by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4143 +- Refactor(plugins): Move internal AVD code to PyAVD by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4140 +- Refactor: Move requirements to PyAVD by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4147 +- Refactor(cv_deploy): Optimize creation of configlet containers by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3950 +- Bump: pre-release 4.9.0-dev1 by @carlbuchmann in https://github.com/aristanetworks/avd/pull/4149 +- Refactor(plugins): Deprecate various unused Ansible plugins by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4166 +- Refactor: Deprecate Python3.9 support by @gmuloc in https://github.com/aristanetworks/avd/pull/4177 + +## Release 4.8.0 + +### Changes to requirements + +- AVD now requires a newer minimum and maximum version of the Python package `ansible-core>=2.15.0,<2.18.0`.
+- The latest version can be installed with `pip install "ansible-core>=2.15.0" --upgrade`. +- AVD now requires a newer minimum but no maximum version of the Python package `jsonschema>=4.10.3`.
+ The latest version can be installed with `pip install "jsonschema>=4.10.3" --upgrade`. +- AVD has a new requirement of the Python package `referencing>=0.35.0`.
+ The latest version can be installed with `pip install "referencing>=0.35.0" --upgrade`. +- AVD no longer requires the Python package `md-toc`. + +### Fixed issues in eos_cli_config_gen + +- Fix(eos_cli_config_gen): Remove requirement for original_ip to be unique under interface IP NAT by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3900 +- Fix(eos_cli_config_gen): Render access vlan on port-channel interfaces if mode is dot1q-tunnel. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3920 +- Fix(eos_cli_config_gen): Missing variable protection in Jinja Templates. by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4005 +- Fix(eos_cli_config_gen): Fix the schema and template for action in event-handler. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4007 + +### Fixed issues in eos_designs + +- Fix(eos_designs): Fix code error for monitor_sessions for network_ports by @gmuloc in https://github.com/aristanetworks/avd/pull/3818 +- Fix(eos_designs): Fix missing features from LACP fallback individual by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3862 +- Fix(eos_designs): Inband ztp works with inband_mgmt_ip key by @jrecchia1029 in https://github.com/aristanetworks/avd/pull/3908 +- Fix(eos_designs): Make WAN RRs route-reflector clients of each other by @gmuloc in https://github.com/aristanetworks/avd/pull/3921 +- Fix(eos_designs): Wrong IPsec profile name for Zscaler by @gmuloc in https://github.com/aristanetworks/avd/pull/3948 +- Fix(eos_designs): Sanitize interface name in STUN profile name by @gmuloc in https://github.com/aristanetworks/avd/pull/3949 +- Fix(eos_designs): Remove the remaining trailing slashes in schema by @gmuloc in https://github.com/aristanetworks/avd/pull/3961 +- Fix(eos_designs): WAN Internet-exit fixes for Zscaler integration by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3984 +- Fix(eos_designs): Connected endpoints ESI should only be configured on EVPN VTEPs. by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/4020 + +### Other Fixed issues + +- Fix: Remove "not RFC1918 IPs" from examples. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3800 +- Fix(dhcp_provisioner): Support custom `node_type_keys` as a list of dicts. by @philippebureau in https://github.com/aristanetworks/avd/pull/3813 +- Fix(plugins): Handle md-toc v9 by @carlbuchmann in https://github.com/aristanetworks/avd/pull/3837 +- Fix(eos_validate_state): ANTA Remove the use of the eos_design's "type" variable by @carl-baillargeon in https://github.com/aristanetworks/avd/pull/3870 +- Fix: Fixing event-handlers in eos_designs_unit_tests molecule scenario. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3938 +- Fix(plugins): Fix cv_zscaler_endpoints lookup plugin by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3946 +- Fix(cv_deploy): Fix internet exit metadata by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3956 +- Fix(cv_deploy): Detect pathfinder metadata studio version and skip unsupported fields by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3986 + +### Documentation + +- Doc(plugins): Fix wrong module name in eos_designs_structured_config module doc by @gmuloc in https://github.com/aristanetworks/avd/pull/3795 +- Doc: Release 4.7.1 by @carlbuchmann in https://github.com/aristanetworks/avd/pull/3846 +- Doc: Update installation guide to avoid 'pipx' by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3863 +- Doc(eos_cli_config_gen): Add missing switchport port security table to documentation by @carlbuchmann in https://github.com/aristanetworks/avd/pull/3880 +- Doc(eos_validate_state): Add link for OSX fork issue by @gmuloc in https://github.com/aristanetworks/avd/pull/3902 +- Doc: Update CSS to bring `code` to 100% size by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3917 +- Doc: Updated the documentation for IPv4 ACL by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/3955 +- Doc: Move documentation of mlag_ibgp_peering_vrfs to network services section. by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3992 +- Doc: Fix examples for connected endpoints using deprecated data-model in input-varaibles.md by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3989 +- Doc(eos_designs): Fix indentation in WAN how-to by @gmuloc in https://github.com/aristanetworks/avd/pull/4010 +- Doc: Readme updates to align with the new Red Hat template by @JulioPDX in https://github.com/aristanetworks/avd/pull/4024 + +### New features and enhancements in eos_cli_config_gen + +- Feat(eos_cli_config_gen): Add eos_cli support under router_isis. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3745 +- Feat(eos_cli_config_gen): Add support for raw `eos_cli` under `router_bgp` by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3673 +- Feat(eos_cli_config_gen): Adding 'ip igmp host-proxy' interface support by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3657 +- Feat(eos_cli_config_gen): add hardware flow tracking standard record format support by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3681 +- Feat(eos_cli_config_gen): Add router service-insertion subcommands for Internet Exit by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3757 +- Feat(eos_cli_config_gen): Add router internet-exit. by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3748 +- Feat(eos_cli_config_gen): Add aaa unresponsive action under global dot1x by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3739 +- Feat(eos_cli_config_gen): Add IPsec and NAT options to tunnel_interfaces. by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3830 +- Feat(eos_cli_config_gen): Add policy-maps qos police. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3620 +- Feat(eos_cli_config_gen): Add FQDN & UFQDN support for ike profile local-id by @gmuloc in https://github.com/aristanetworks/avd/pull/3832 +- Feat(eos_cli_config_gen): Add event-handler trigger on-maintenance. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3629 +- Feat(eos_cli_config_gen): Support port-only option in IP NAT pools by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3840 +- Feat(eos_cli_config_gen): Add capability to disable address-only for connectivity monitors by @gmuloc in https://github.com/aristanetworks/avd/pull/3867 +- Feat(eos_cli_config_gen): Support SA lifetime for IP sec by @gmuloc in https://github.com/aristanetworks/avd/pull/3875 +- Feat(eos_cli_config_gen): Add l4 to application traffic recognition by @colinmacgiolla in https://github.com/aristanetworks/avd/pull/3780 +- Feat(eos_cli_config_gen): Support activity polling-interval for router multicast. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3893 +- Feat(eos_cli_config_gen): Support for additional commands under the EVPN address family by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/3881 +- Feat(eos_cli_config_gen): Enhance event-handlers model to accommodate other triggers with their specificities. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3878 +- Feat(eos_cli_config_gen): Implement managing RCF. by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3798 +- Feat(eos_cli_config_gen): Add support for isis spf-interval hold timer. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3912 +- Feat(eos_cli_config_gen): Support for configuring logging level facilities by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/3944 +- Feat(eos_cli_config_gen): Option to set RCF route bgp address-family vpn-ipv6/ipv4 and redistribute. by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3819 +- Feat(eos_cli_config_gen): Support additional options for IP DHCP relay and IPv6 DHCP relay by @bjmeuer in https://github.com/aristanetworks/avd/pull/3925 +- Feat(eos_cli_config_gen): Add router segment security by @colinmacgiolla in https://github.com/aristanetworks/avd/pull/3782 +- Feat(eos_cli_config_gen): Option to set RCF address-family ipv4, ipv6 and evpn by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3814 +- Feat(eos_cli_config_gen): Option to set RCF for route bgp ipv4/ipv6 mulit-cast and VRF by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3821 +- Feat(eos_cli_config_gen): Support additional options for IPv6 ND under SVIs by @bjmeuer in https://github.com/aristanetworks/avd/pull/3935 +- Feat(eos_cli_config_gen): Add InfluxDB support by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3705 +- Feat(eos_cli_config_gen): Adding segment-security in hardware counters. by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4000 +- Feat(eos_cli_config_gen): Add support for L2 in-place adjacency replacement (IAR) by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/3990 +- Feat(eos_cli_config_gen): Add transceiver.frequency under ethernet_interfaces by @ccsnw in https://github.com/aristanetworks/avd/pull/4003 +- Feat(eos_cli_config_gen): Add option for dot1x aaa accounting update interval x seconds. by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/4017 +- Feat(eos_cli_config_gen): Support logging transceiver in monitor layer1 by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3991 +- Feat(eos_cli_config_gen): Add support for BGP TCP AO. by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3853 +- Feat(eos_cli_config_gen): Add Regex pattern for region/zone/site name for router_adapative_virtual_topology by @ayushmittal-arista in https://github.com/aristanetworks/avd/pull/4026 +- Feat(eos_cli_config_gen): Support for MSS Clamping on ethernet interfaces. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/4018 +- Feat(eos_cli_config_gen): Add support for copp policy-maps. by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3895 +- Feat(eos_cli_config_gen): Add DHCP server options for TFTP and DNS by @jrecchia1029 in https://github.com/aristanetworks/avd/pull/3993 + +### New features and enhancements in eos_designs + +- Feat(eos_designs): Added for L3LS P2P addressing via Spine using "downlink_pools" data model by @hubert-arista in https://github.com/aristanetworks/avd/pull/3693 +- Feat(eos_designs): Add knob for IS-IS system-id format by @ZoeyFahner-Arista in https://github.com/aristanetworks/avd/pull/3677 +- Feat(eos_designs): Add structured_config support in platform_settings. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3807 +- Feat(eos_designs): Add platform specific management security entropy source settings. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3810 +- Feat(eos_designs): Add support for Zscaler internet-exit policy by @gmuloc in https://github.com/aristanetworks/avd/pull/3833 +- Feat(eos_designs): Add more granular settings for flow_tracking by @ayushmittal-arista in https://github.com/aristanetworks/avd/pull/3776 +- Feat(eos_designs): Add pim ipv4 sparse_mode on core_interfaces/l3_edge interfaces. by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3831 +- Feat(eos_designs): Allow VLAN Aware Bundles even if common evpn_vlan_aware_bundles is false by @bjmeuer in https://github.com/aristanetworks/avd/pull/3827 +- Feat(eos_designs): Add metadata for Zscaler internet-exit by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3886 +- Feat(eos_designs): Add support for setting mgmt_gateway under the node settings. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3799 +- Feat(eos_designs): Add optional cv-pathfinder site for pathfinders by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3904 +- Feat(eos_designs): Add support for mlag_peer_ipv6_pool by @Xatrekak in https://github.com/aristanetworks/avd/pull/3885 +- Feat(eos_designs): Add sample rate to sflow settings in eos_designs. by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3891 +- Feat(eos_designs): IPv4/IPv6 address-family configuration for bgp_peer_groups defined under network services. by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3887 +- Feat(eos_designs): Extend the functionality of the is_deployed flag to shutdown BGP peerings. by @laxmikantchintakindi in https://github.com/aristanetworks/avd/pull/3916 +- Feat(eos_designs): Add support for ipv4_acl_in/out on SVIs defined under network services. by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3791 +- Feat(eos_designs): Add support for local internet exit by @ayushmittal-arista in https://github.com/aristanetworks/avd/pull/3952 + +### New features and enhancement in both eos_designs and eos_cli_config_gen + +- Feat(eos_designs,eos_cli_config_gen): Add support for MLAG port-channels to endpoints with PTP by @Vibhu-gslab in https://github.com/aristanetworks/avd/pull/3672 +- Feat(eos_designs, eos_cli_config_gen): Add BFD option for underlay ISIS by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3683 + +### Other new features and enhancements + +- Feat(eos_validate_state): Added the validation for BGP address families(link-state, path-selection and ipv4/ipv6 sr-te) by @MaheshGSLAB in https://github.com/aristanetworks/avd/pull/3872 + +### PyAVD Changes + +- Fix(pyavd): Remove accidental requirement for PyYAML by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3838 +- Feat(pyavd): Add optional dependency pyavd by @dlobato in https://github.com/aristanetworks/avd/pull/3852 +- Refactor(pyavd): Lazy imports of vendored code by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3923 + +### Other Changes + +- Refactor(plugins): Update cv_client to use SetSome for topology studio inputs by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3803 +- Refactor(eos_cli_config_gen): Modifying the data-model for management security entropy source by @Shivani-gslab in https://github.com/aristanetworks/avd/pull/3841 +- Revert: "Bump pre-commit-ci/lite-action from 1.0.0 to 1.0.2" by @gmuloc in https://github.com/aristanetworks/avd/pull/3868 +- Bump(requirements): Bump black from 24.3.0 to 24.4.0 in /ansible_collections/arista/avd by @dependabot in https://github.com/aristanetworks/avd/pull/3860 +- Bump(eos_validate_state): ANTA Update eos_validate_state code to support ANTA v0.14.0 by @carl-baillargeon in https://github.com/aristanetworks/avd/pull/3871 +- Bump(requirements): Bump black from 24.4.0 to 24.4.1 in /ansible_collections/arista/avd by @dependabot in https://github.com/aristanetworks/avd/pull/3906 +- Bump(requirements): Bump black from 24.4.1 to 24.4.2 in /ansible_collections/arista/avd by @dependabot in https://github.com/aristanetworks/avd/pull/3913 +- Bump(requirements): Support newer jsonschema versions by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3934 +- Refactor(eos_designs): Source more Zscaler metadata from lookup plugin by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3977 +- Refactor(eos_designs): Minor code adjustments caught by latest pylint by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4021 +- Refactor(plugins): Update cloudvision api with latest proto files by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3995 +- Refactor(plugins): Move WAN internet-exit zscaler integration to eos_designs by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4002 +- Bump(requirements): Set minimum ansible-core version to 2.15.x and maximum to 2.17.x by @carlbuchmann in https://github.com/aristanetworks/avd/pull/3927 +- Refactor(plugins): Rewrite add_md_toc by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/4011 ## Release 4.7.1 @@ -297,7 +590,7 @@ Detailed changes: - Fix(eos_cli_config_gen): Wrong CLI template for some ip_security options by @gmuloc in https://github.com/aristanetworks/avd/pull/3263 - Fix(eos_cli_config_gen): STUN server supports multiple local interfaces by @gmuloc in https://github.com/aristanetworks/avd/pull/3266 - Fix(eos_cli_config_gen): l2_mtu under port_channel_interfaces by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3291 -- Fix(eos_cli_config_gen): correct logging event storm-control unter interface ethernet by @kmueller68 in https://github.com/aristanetworks/avd/pull/3303 +- Fix(eos_cli_config_gen): correct logging event storm-control under interface ethernet by @kmueller68 in https://github.com/aristanetworks/avd/pull/3303 - Fix(eos_cli_config_gen): Missing password key in router_bgp.neighbors.items by @carlbuchmann in https://github.com/aristanetworks/avd/pull/3326 - Fix(eos_cli_config_gen): Add device documentation for phone VLAN features by @jonxstill in https://github.com/aristanetworks/avd/pull/3329 - Fix(eos_cli_config_gen): Correct syntax for "redistribute bgp" in router bgp by @carlbuchmann in https://github.com/aristanetworks/avd/pull/3369 @@ -312,7 +605,7 @@ Detailed changes: - Fix(eos_designs): Inherited structured_config on multiple SVIs. by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3298 - Fix(eos_designs): Handling empty vars in network services by @emilarista in https://github.com/aristanetworks/avd/pull/3314 -- Fix(eos_designs): Incorect type for bpg remote_as by @carlbuchmann in https://github.com/aristanetworks/avd/pull/3313 +- Fix(eos_designs): Incorrect type for bpg remote_as by @carlbuchmann in https://github.com/aristanetworks/avd/pull/3313 - Fix(eos_designs): Include ISIS interfaces in fabric docs if any device uses ISIS by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3345 - Fix(eos_designs): Correct logic for VRF RD/RT overrides by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/3434 @@ -652,9 +945,9 @@ Detailed changes: If Ansible is installed using pip, a supported version can be installed with `pip3 install "ansible-core>=2.12.6,<2.15.0,!=2.13.0"`. -- The `arista.avd` collection no longer depends directly on `ansible.netcommon`. `ansible.netcommon` is still a depedency of `arista.eos` and `arista.cvp`, which are both dependencies of `arista.avd`. +- The `arista.avd` collection no longer depends directly on `ansible.netcommon`. `ansible.netcommon` is still a dependency of `arista.eos` and `arista.cvp`, which are both dependencies of `arista.avd`. -- AVD now requires the minumum versions of the following Ansible collections: +- AVD now requires the minimum versions of the following Ansible collections: - arista.cvp version 3.6.1 or later. - arista.eos version 6.0.1 or later. - ansible.utils version 2.10.3 or later. @@ -774,7 +1067,7 @@ See details in the [Porting guide for AVD 4.x.x](../porting-guides/4.x.x.md#hard Pull requests: -- Feat(eos_cli_config_gen)! - Change Hardware Counter model by @gmuloc in https://github.com/aristanetworks/avd/pull/2695 +- Feat(eos_cli_config_gen)! - Change Hardware Counder model by @gmuloc in https://github.com/aristanetworks/avd/pull/2695 #### `eos_cli_config_gen` sanitized device documentation @@ -1248,7 +1541,7 @@ Pull request: - Feat(plugins) - Add schema driven deprecation warnings by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/2369 - Feat(plugins) - Automatic requirements check by @gmuloc in https://github.com/aristanetworks/avd/pull/2015 - Feat(plugins) - Add arista.avd.batch_template action plugin by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/2593 -- Feat(plugins) - Add OSPF pasword type 7 to encrypt/decrypt filters by @gmuloc in https://github.com/aristanetworks/avd/pull/2626 +- Feat(plugins) - Add OSPF password type 7 to encrypt/decrypt filters by @gmuloc in https://github.com/aristanetworks/avd/pull/2626 - Feat(plugins) - Update schema validation to ignore any key starting with underscore by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/2689 - Feat(eos_config_deploy_cvp) - Option for deploying using serial number as identifier by @ClausHolbechArista in https://github.com/aristanetworks/avd/pull/2718 - Feat(plugins) - Add arista.avd.global_vars plugin by @gmuloc in https://github.com/aristanetworks/avd/pull/2751 diff --git a/ansible_collections/arista/avd/docs/semantic-versioning.md b/ansible_collections/arista/avd/docs/semantic-versioning.md new file mode 100644 index 00000000000..506195991ab --- /dev/null +++ b/ansible_collections/arista/avd/docs/semantic-versioning.md @@ -0,0 +1,85 @@ + + +# Semantic Versioning + +The AVD project follows Semantic Versioning ([SemVer](https://semver.org/)). + +This document describes which attributes and APIs are stable and follow SemVer and which ones may change between minor releases. + +## Ansible Collection (arista.avd) + +All roles input variables follow SemVer. Any breaking changes will, at a minimum, be communicated with a deprecation notice in the previous release, except for the ones resulting from a bug fix that will be documented in the release notes. Keys will then be documented as removed in the next major release. + +### Roles + +| Roles | Inputs Follow SemVer | Outputs Follow SemVer | Notes | +| ----- | :------------------: | :-------------------: | ----- | +| `eos_designs` + `eos_cli_config_gen`
EOS CLI configuration | ✅ | ✅ | When leveraging `eos_designs` with `eos_cli_config_gen`, the resulting EOS CLI configuration generated from `eos_cli_config_gen` will be maintained, unless in rare cases when addressing a bug. | +| `eos_designs`
Structured configuration | ✅ | ✘ | eos_designs `structured_configuration` may change between minor releases.
Structured configuration can change to use new keys when keys are deprecated in the `eos_cli_config_gen` role. | +| `eos_designs`
Documentation | ✅ | ✘ | Fabric documentation artifacts may change between minor releases.
Breaking changes to CSV output will be communicated in the release notes. | +| `eos_designs`
`avd_switch_facts` or `switch.*` | ✅ | ✘ | The `switch.*` and `avd_switch_facts` are internal datamodels used for sharing data between various stages of `eos_designs`. They **should not** be used in custom templates for interface descriptions or IP addressing, since they are subject to change without notice. | +| `eos_cli_config_gen`
EOS configuration | ✅ | ✅ | EOS configuration generated by `eos_cli_config_gen` follows SemVer.
Breaking changes may occur in rare cases when addressing a bug.
Reordering of the CLI output may occur but without impacting the resulting configuration on EOS. | +| `eos_cli_config_gen`
Documentation | ✅ | ✘ | Device documentation artifacts may change during minor releases.| +| `cvp_configlet_upload` | ✅ | ✅ | | +| `eos_config_deploy_cvp` | ✅ | ✘ | Structured configuration output may change during minor releases to accommodate changes in the ansible-cvp collection.
The resulting CloudVision configuration will be maintained, unless in rare cases, when addressing a bug.
Breaking changes will be communicated in the release notes. | +| `cv_deploy` | ✅ | ✅ | The resulting CloudVision configuration will be maintained, unless in rare cases, when addressing a bug. | +| `eos_config_deploy_eapi` | ✅ | ✅ | | +| `eos_validate_state` | ✅ | ✘ | The generated reports and other artifacts may change between minor releases.
Breaking changes to CSV outputs will be communicated in the release notes.| +| `dhcp_provisioner` | ✅ | ✘ | Structured configuration output may change during minor releases to accommodate changes in the ansible-cvp collection.
The resulting DHCP configuration will be maintained, unless in rare cases, when addressing a bug. | +| `build_output_folders` | ✅ | ✅ | | + +### Plugins + +| Plugins | Inputs Follow SemVer | Outputs Follow SemVer | Notes | +| ------- | :------------------: | :-------------------: | ----- | +| Filter: `add_md_toc` | ✅ | ✅ | | +| Filter: `convert_dicts` | ✅ | ✅ | | +| Filter: `decrypt` | ✅ | ✅ | | +| Filter: `default` | ✅ | ✅ | | +| Filter: `encrypt` | ✅ | ✅ | | +| Filter: `generate_esi` | ✅ | ✅ | | +| Filter: `generate_lacp_id` | ✅ | ✅ | | +| Filter: `generate_route_target` | ✅ | ✅ | | +| Filter: `hide_passwords` | ✅ | ✅ | | +| Filter: `is_in_filter` | ✅ | ✅ | | +| Filter: `list_compress` | ✅ | ✅ | | +| Filter: `natural_sort` | ✅ | ✅ | | +| Filter: `range_expand` | ✅ | ✅ | | +| Filter: `snmp_hash` | ✅ | ✅ | | +| Filter: `status_render` | ✅ | ✅ | | +| Action: `batch_template` | ✅ | ✅ | | +| Action: `configlet_build_config` | ✘ | ✘ | Internal plugin, not intended for external use. | +| Action: `cv_workflow` | ✅ | ✅ | The resulting CloudVision configuration will be maintained, unless in rare cases, when addressing a bug. | +| Action: `eos_designs_facts` | ✘ | ✘ | Internal plugin, not intended for external use. | +| Action: `eos_designs_structured_config` | ✘ | ✘ | Internal plugin, not intended for external use. | +| Action: `eos_validate_state_reports` | ✘ | ✘ | Internal plugin, not intended for external use. | +| Action: `eos_validate_state_runner` | ✘ | ✘ | Internal plugin, not intended for external use. | +| Action: `inventory_to_container` | ✘ | ✘ | Internal plugin, not intended for external use. | +| Action: `set_vars` | ✅ | ✅ | | +| Action: `validate_and_template` | ✘ | ✘ | Internal plugin, not intended for external use. | +| Action: `verify_requirements` | ✘ | ✘ | Internal plugin, not intended for external use. | +| Action: `yaml_templates_to_facts` | ✘ | ✘ | Internal plugin, not intended for external use. | +| Test: `contains` | ✅ | ✅ | | +| Test: `defined` | ✅ | ✅ | | +| Test: `global_vars` | ✅ | ✅ | | + +## PyAVD + +All functions input variables follow SemVer. Any breaking changes will, at a minimum, be communicated with a deprecation notice in the previous release, except for the ones resulting from a bug fix that will be documented in the release notes. Keys will then be documented as removed in the next major release. + +!!! warning + + Internal/undocumented code is not covered by SemVer. Changes may not be documented in release notes. + +| Functions | Inputs Follow SemVer | Outputs Follow SemVer | Notes | +| --------- | :------------------: | :-------------------: | ----- | +| `validate_inputs()` | ✅ | ✅ | | +| `get_avd_facts()` | ✅ | ✘ | `avd_facts` output may change between minor releases. | +| `get_device_structured_config()` | ✅ | ✘ | `structured_configuration` may change between minor releases.
Structure config can change to use new keys when keys are deprecated in the `get_device_config()` function.
The resulting EOS CLI configuration generated from the `get_device_config()` function will be maintained, unless in rare cases when addressing a bug. | +| `validate_structured_config()` | ✅ | ✅ | | +| `get_device_config()` | ✅ | ✅ | EOS CLI configuration generated from eos_cli_config_gen follows SemVer.
Breaking changes may occur in rare cases when addressing a bug.
Reordering of the CLI output may occur but without impacting the resulting configuration on EOS. | +| `get_device_doc()` | ✅ | ✘ | Device documentation artifacts may change during minor releases. | diff --git a/ansible_collections/arista/avd/docs/stylesheets/extra.ivory.css b/ansible_collections/arista/avd/docs/stylesheets/extra.ivory.css.backup similarity index 100% rename from ansible_collections/arista/avd/docs/stylesheets/extra.ivory.css rename to ansible_collections/arista/avd/docs/stylesheets/extra.ivory.css.backup diff --git a/ansible_collections/arista/avd/docs/stylesheets/extra.material.css b/ansible_collections/arista/avd/docs/stylesheets/extra.material.css index ee4da247ca0..8d93e4c3e75 100644 --- a/ansible_collections/arista/avd/docs/stylesheets/extra.material.css +++ b/ansible_collections/arista/avd/docs/stylesheets/extra.material.css @@ -129,7 +129,6 @@ } .md-typeset code { padding: 0 .2941176471em; - font-size: 80%; word-break: break-word; background-color: var(--md-code-bg-color); border-radius: .1rem; diff --git a/ansible_collections/arista/avd/docs/stylesheets/tables.js b/ansible_collections/arista/avd/docs/stylesheets/tables.js index 7530c924985..7be0f526990 100644 --- a/ansible_collections/arista/avd/docs/stylesheets/tables.js +++ b/ansible_collections/arista/avd/docs/stylesheets/tables.js @@ -2,6 +2,6 @@ document$.subscribe(function() { var tables = document.querySelectorAll("article table:not([class])") tables.forEach(function(table) { - new Tablesort(table) + new Tablesort(table) // NOSONAR }) }) diff --git a/ansible_collections/arista/avd/docs/templates/plugin-docs.j2 b/ansible_collections/arista/avd/docs/templates/plugin-docs.j2 index 646489f2efe..7297ec37293 100644 --- a/ansible_collections/arista/avd/docs/templates/plugin-docs.j2 +++ b/ansible_collections/arista/avd/docs/templates/plugin-docs.j2 @@ -65,7 +65,6 @@ title: {{ collection | default("arista.avd", true) ~ "." ~ module }} !!! danger "This plugin is **deprecated**" This {{ plugin_type }} will be removed in version {{ deprecated['removed_in'] | default('') }}. - {% else %} {% set module_states = { "preview": {"message": "not guaranteed to have a backwards compatible interface", "level": "warning"}, @@ -115,7 +114,7 @@ The below requirements are needed on the host that executes this module. ## Notes {% for note in notes %} -- {{ note | e }} +- {{ note | e | indent(2, false) }} {% endfor %} {% endif %} {% if seealso %} diff --git a/ansible_collections/arista/avd/examples/campus-fabric/group_vars/DC1.yml b/ansible_collections/arista/avd/examples/campus-fabric/group_vars/DC1.yml index dd1f326543b..b36d95de6ef 100644 --- a/ansible_collections/arista/avd/examples/campus-fabric/group_vars/DC1.yml +++ b/ansible_collections/arista/avd/examples/campus-fabric/group_vars/DC1.yml @@ -22,7 +22,7 @@ name_servers: - 8.8.4.4 - 8.8.8.8 -# NTP Servers IP or DNS name, first NTP server will be prefered, and sourced from Managment VRF +# NTP Servers IP or DNS name, first NTP server will be preferred, and sourced from Management VRF ntp_settings: server_vrf: use_mgmt_interface_vrf servers: diff --git a/ansible_collections/arista/avd/examples/campus-fabric/intended/structured_configs/LEAF1A.yml b/ansible_collections/arista/avd/examples/campus-fabric/intended/structured_configs/LEAF1A.yml index 4ba28c394ee..1f83a0a1c0a 100644 --- a/ansible_collections/arista/avd/examples/campus-fabric/intended/structured_configs/LEAF1A.yml +++ b/ansible_collections/arista/avd/examples/campus-fabric/intended/structured_configs/LEAF1A.yml @@ -75,9 +75,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 192.168.0.4/31 no_autostate: true mtu: 1500 + ip_address: 192.168.0.4/31 - name: Vlan10 description: Inband Management shutdown: false diff --git a/ansible_collections/arista/avd/examples/campus-fabric/intended/structured_configs/LEAF1B.yml b/ansible_collections/arista/avd/examples/campus-fabric/intended/structured_configs/LEAF1B.yml index 05dfe24395d..5bd8450c742 100644 --- a/ansible_collections/arista/avd/examples/campus-fabric/intended/structured_configs/LEAF1B.yml +++ b/ansible_collections/arista/avd/examples/campus-fabric/intended/structured_configs/LEAF1B.yml @@ -75,9 +75,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 192.168.0.5/31 no_autostate: true mtu: 1500 + ip_address: 192.168.0.5/31 - name: Vlan10 description: Inband Management shutdown: false diff --git a/ansible_collections/arista/avd/examples/campus-fabric/intended/structured_configs/LEAF3A.yml b/ansible_collections/arista/avd/examples/campus-fabric/intended/structured_configs/LEAF3A.yml index c6968ba2363..49906db65c4 100644 --- a/ansible_collections/arista/avd/examples/campus-fabric/intended/structured_configs/LEAF3A.yml +++ b/ansible_collections/arista/avd/examples/campus-fabric/intended/structured_configs/LEAF3A.yml @@ -75,9 +75,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 192.168.0.10/31 no_autostate: true mtu: 1500 + ip_address: 192.168.0.10/31 - name: Vlan10 description: Inband Management shutdown: false diff --git a/ansible_collections/arista/avd/examples/campus-fabric/intended/structured_configs/LEAF3B.yml b/ansible_collections/arista/avd/examples/campus-fabric/intended/structured_configs/LEAF3B.yml index 73291dee1ff..0c193026139 100644 --- a/ansible_collections/arista/avd/examples/campus-fabric/intended/structured_configs/LEAF3B.yml +++ b/ansible_collections/arista/avd/examples/campus-fabric/intended/structured_configs/LEAF3B.yml @@ -75,9 +75,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 192.168.0.11/31 no_autostate: true mtu: 1500 + ip_address: 192.168.0.11/31 - name: Vlan10 description: Inband Management shutdown: false diff --git a/ansible_collections/arista/avd/examples/campus-fabric/intended/structured_configs/SPINE1.yml b/ansible_collections/arista/avd/examples/campus-fabric/intended/structured_configs/SPINE1.yml index 7c082c1e129..63948d029e2 100644 --- a/ansible_collections/arista/avd/examples/campus-fabric/intended/structured_configs/SPINE1.yml +++ b/ansible_collections/arista/avd/examples/campus-fabric/intended/structured_configs/SPINE1.yml @@ -104,9 +104,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 192.168.0.0/31 no_autostate: true mtu: 1500 + ip_address: 192.168.0.0/31 - name: Vlan110 tenant: MY_FABRIC tags: diff --git a/ansible_collections/arista/avd/examples/campus-fabric/intended/structured_configs/SPINE2.yml b/ansible_collections/arista/avd/examples/campus-fabric/intended/structured_configs/SPINE2.yml index 823e6ba5342..7fca6ee23f8 100644 --- a/ansible_collections/arista/avd/examples/campus-fabric/intended/structured_configs/SPINE2.yml +++ b/ansible_collections/arista/avd/examples/campus-fabric/intended/structured_configs/SPINE2.yml @@ -104,9 +104,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 192.168.0.1/31 no_autostate: true mtu: 1500 + ip_address: 192.168.0.1/31 - name: Vlan110 tenant: MY_FABRIC tags: diff --git a/ansible_collections/arista/avd/examples/dual-dc-l3ls/documentation/devices/dc1-leaf1a.md b/ansible_collections/arista/avd/examples/dual-dc-l3ls/documentation/devices/dc1-leaf1a.md index dc5a2c15c10..9b8cf414295 100644 --- a/ansible_collections/arista/avd/examples/dual-dc-l3ls/documentation/devices/dc1-leaf1a.md +++ b/ansible_collections/arista/avd/examples/dual-dc-l3ls/documentation/devices/dc1-leaf1a.md @@ -651,8 +651,8 @@ ASN Notation: asplain | 10.255.1.97 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | default | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | | 10.255.255.0 | 65100 | default | - | Inherited from peer group IPv4-UNDERLAY-PEERS | Inherited from peer group IPv4-UNDERLAY-PEERS | - | - | - | - | - | - | | 10.255.255.2 | 65100 | default | - | Inherited from peer group IPv4-UNDERLAY-PEERS | Inherited from peer group IPv4-UNDERLAY-PEERS | - | - | - | - | - | - | -| 10.255.1.97 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF10 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.1.97 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF11 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | +| 10.255.1.97 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF10 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.1.97 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF11 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | #### Router BGP EVPN Address Family diff --git a/ansible_collections/arista/avd/examples/dual-dc-l3ls/documentation/devices/dc1-leaf1b.md b/ansible_collections/arista/avd/examples/dual-dc-l3ls/documentation/devices/dc1-leaf1b.md index 06e45fda94f..4ee20b56541 100644 --- a/ansible_collections/arista/avd/examples/dual-dc-l3ls/documentation/devices/dc1-leaf1b.md +++ b/ansible_collections/arista/avd/examples/dual-dc-l3ls/documentation/devices/dc1-leaf1b.md @@ -651,8 +651,8 @@ ASN Notation: asplain | 10.255.1.96 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | default | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | | 10.255.255.4 | 65100 | default | - | Inherited from peer group IPv4-UNDERLAY-PEERS | Inherited from peer group IPv4-UNDERLAY-PEERS | - | - | - | - | - | - | | 10.255.255.6 | 65100 | default | - | Inherited from peer group IPv4-UNDERLAY-PEERS | Inherited from peer group IPv4-UNDERLAY-PEERS | - | - | - | - | - | - | -| 10.255.1.96 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF10 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.1.96 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF11 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | +| 10.255.1.96 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF10 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.1.96 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF11 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | #### Router BGP EVPN Address Family diff --git a/ansible_collections/arista/avd/examples/dual-dc-l3ls/documentation/devices/dc1-leaf2a.md b/ansible_collections/arista/avd/examples/dual-dc-l3ls/documentation/devices/dc1-leaf2a.md index 8203971f114..44aefdc35aa 100644 --- a/ansible_collections/arista/avd/examples/dual-dc-l3ls/documentation/devices/dc1-leaf2a.md +++ b/ansible_collections/arista/avd/examples/dual-dc-l3ls/documentation/devices/dc1-leaf2a.md @@ -672,8 +672,8 @@ ASN Notation: asplain | 10.255.255.8 | 65100 | default | - | Inherited from peer group IPv4-UNDERLAY-PEERS | Inherited from peer group IPv4-UNDERLAY-PEERS | - | - | - | - | - | - | | 10.255.255.10 | 65100 | default | - | Inherited from peer group IPv4-UNDERLAY-PEERS | Inherited from peer group IPv4-UNDERLAY-PEERS | - | - | - | - | - | - | | 172.16.100.1 | 65202 | default | - | Inherited from peer group IPv4-UNDERLAY-PEERS | Inherited from peer group IPv4-UNDERLAY-PEERS | - | - | - | - | - | - | -| 10.255.1.101 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF10 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.1.101 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF11 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | +| 10.255.1.101 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF10 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.1.101 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF11 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | #### Router BGP EVPN Address Family diff --git a/ansible_collections/arista/avd/examples/dual-dc-l3ls/documentation/devices/dc1-leaf2b.md b/ansible_collections/arista/avd/examples/dual-dc-l3ls/documentation/devices/dc1-leaf2b.md index d3902f02d1c..24683275365 100644 --- a/ansible_collections/arista/avd/examples/dual-dc-l3ls/documentation/devices/dc1-leaf2b.md +++ b/ansible_collections/arista/avd/examples/dual-dc-l3ls/documentation/devices/dc1-leaf2b.md @@ -672,8 +672,8 @@ ASN Notation: asplain | 10.255.255.12 | 65100 | default | - | Inherited from peer group IPv4-UNDERLAY-PEERS | Inherited from peer group IPv4-UNDERLAY-PEERS | - | - | - | - | - | - | | 10.255.255.14 | 65100 | default | - | Inherited from peer group IPv4-UNDERLAY-PEERS | Inherited from peer group IPv4-UNDERLAY-PEERS | - | - | - | - | - | - | | 172.16.100.3 | 65202 | default | - | Inherited from peer group IPv4-UNDERLAY-PEERS | Inherited from peer group IPv4-UNDERLAY-PEERS | - | - | - | - | - | - | -| 10.255.1.100 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF10 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.1.100 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF11 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | +| 10.255.1.100 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF10 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.1.100 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF11 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | #### Router BGP EVPN Address Family diff --git a/ansible_collections/arista/avd/examples/dual-dc-l3ls/documentation/devices/dc2-leaf1a.md b/ansible_collections/arista/avd/examples/dual-dc-l3ls/documentation/devices/dc2-leaf1a.md index c69c46488a8..c42489b7edf 100644 --- a/ansible_collections/arista/avd/examples/dual-dc-l3ls/documentation/devices/dc2-leaf1a.md +++ b/ansible_collections/arista/avd/examples/dual-dc-l3ls/documentation/devices/dc2-leaf1a.md @@ -651,8 +651,8 @@ ASN Notation: asplain | 10.255.129.117 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | default | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | | 10.255.255.104 | 65200 | default | - | Inherited from peer group IPv4-UNDERLAY-PEERS | Inherited from peer group IPv4-UNDERLAY-PEERS | - | - | - | - | - | - | | 10.255.255.106 | 65200 | default | - | Inherited from peer group IPv4-UNDERLAY-PEERS | Inherited from peer group IPv4-UNDERLAY-PEERS | - | - | - | - | - | - | -| 10.255.129.117 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF10 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.129.117 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF11 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | +| 10.255.129.117 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF10 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.129.117 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF11 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | #### Router BGP EVPN Address Family diff --git a/ansible_collections/arista/avd/examples/dual-dc-l3ls/documentation/devices/dc2-leaf1b.md b/ansible_collections/arista/avd/examples/dual-dc-l3ls/documentation/devices/dc2-leaf1b.md index 3dfbef120b8..0b0532d15ef 100644 --- a/ansible_collections/arista/avd/examples/dual-dc-l3ls/documentation/devices/dc2-leaf1b.md +++ b/ansible_collections/arista/avd/examples/dual-dc-l3ls/documentation/devices/dc2-leaf1b.md @@ -651,8 +651,8 @@ ASN Notation: asplain | 10.255.129.116 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | default | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | | 10.255.255.108 | 65200 | default | - | Inherited from peer group IPv4-UNDERLAY-PEERS | Inherited from peer group IPv4-UNDERLAY-PEERS | - | - | - | - | - | - | | 10.255.255.110 | 65200 | default | - | Inherited from peer group IPv4-UNDERLAY-PEERS | Inherited from peer group IPv4-UNDERLAY-PEERS | - | - | - | - | - | - | -| 10.255.129.116 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF10 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.129.116 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF11 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | +| 10.255.129.116 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF10 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.129.116 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF11 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | #### Router BGP EVPN Address Family diff --git a/ansible_collections/arista/avd/examples/dual-dc-l3ls/documentation/devices/dc2-leaf2a.md b/ansible_collections/arista/avd/examples/dual-dc-l3ls/documentation/devices/dc2-leaf2a.md index 3f604b5d988..a14babe8c9e 100644 --- a/ansible_collections/arista/avd/examples/dual-dc-l3ls/documentation/devices/dc2-leaf2a.md +++ b/ansible_collections/arista/avd/examples/dual-dc-l3ls/documentation/devices/dc2-leaf2a.md @@ -672,8 +672,8 @@ ASN Notation: asplain | 10.255.255.112 | 65200 | default | - | Inherited from peer group IPv4-UNDERLAY-PEERS | Inherited from peer group IPv4-UNDERLAY-PEERS | - | - | - | - | - | - | | 10.255.255.114 | 65200 | default | - | Inherited from peer group IPv4-UNDERLAY-PEERS | Inherited from peer group IPv4-UNDERLAY-PEERS | - | - | - | - | - | - | | 172.16.100.0 | 65102 | default | - | Inherited from peer group IPv4-UNDERLAY-PEERS | Inherited from peer group IPv4-UNDERLAY-PEERS | - | - | - | - | - | - | -| 10.255.129.121 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF10 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.129.121 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF11 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | +| 10.255.129.121 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF10 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.129.121 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF11 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | #### Router BGP EVPN Address Family diff --git a/ansible_collections/arista/avd/examples/dual-dc-l3ls/documentation/devices/dc2-leaf2b.md b/ansible_collections/arista/avd/examples/dual-dc-l3ls/documentation/devices/dc2-leaf2b.md index 008eda7fe17..7cdcec105b6 100644 --- a/ansible_collections/arista/avd/examples/dual-dc-l3ls/documentation/devices/dc2-leaf2b.md +++ b/ansible_collections/arista/avd/examples/dual-dc-l3ls/documentation/devices/dc2-leaf2b.md @@ -672,8 +672,8 @@ ASN Notation: asplain | 10.255.255.116 | 65200 | default | - | Inherited from peer group IPv4-UNDERLAY-PEERS | Inherited from peer group IPv4-UNDERLAY-PEERS | - | - | - | - | - | - | | 10.255.255.118 | 65200 | default | - | Inherited from peer group IPv4-UNDERLAY-PEERS | Inherited from peer group IPv4-UNDERLAY-PEERS | - | - | - | - | - | - | | 172.16.100.2 | 65102 | default | - | Inherited from peer group IPv4-UNDERLAY-PEERS | Inherited from peer group IPv4-UNDERLAY-PEERS | - | - | - | - | - | - | -| 10.255.129.120 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF10 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.129.120 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF11 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | +| 10.255.129.120 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF10 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.129.120 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF11 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | #### Router BGP EVPN Address Family diff --git a/ansible_collections/arista/avd/examples/dual-dc-l3ls/intended/structured_configs/dc1-leaf1a.yml b/ansible_collections/arista/avd/examples/dual-dc-l3ls/intended/structured_configs/dc1-leaf1a.yml index b30b50ba7f4..9b21b45e0c8 100644 --- a/ansible_collections/arista/avd/examples/dual-dc-l3ls/intended/structured_configs/dc1-leaf1a.yml +++ b/ansible_collections/arista/avd/examples/dual-dc-l3ls/intended/structured_configs/dc1-leaf1a.yml @@ -251,9 +251,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.1.64/31 no_autostate: true mtu: 1500 + ip_address: 10.255.1.64/31 - name: Vlan11 tenant: TENANT1 description: VRF10_VLAN11 diff --git a/ansible_collections/arista/avd/examples/dual-dc-l3ls/intended/structured_configs/dc1-leaf1b.yml b/ansible_collections/arista/avd/examples/dual-dc-l3ls/intended/structured_configs/dc1-leaf1b.yml index 16eb9af43c1..bf891849c24 100644 --- a/ansible_collections/arista/avd/examples/dual-dc-l3ls/intended/structured_configs/dc1-leaf1b.yml +++ b/ansible_collections/arista/avd/examples/dual-dc-l3ls/intended/structured_configs/dc1-leaf1b.yml @@ -251,9 +251,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.1.65/31 no_autostate: true mtu: 1500 + ip_address: 10.255.1.65/31 - name: Vlan11 tenant: TENANT1 description: VRF10_VLAN11 diff --git a/ansible_collections/arista/avd/examples/dual-dc-l3ls/intended/structured_configs/dc1-leaf2a.yml b/ansible_collections/arista/avd/examples/dual-dc-l3ls/intended/structured_configs/dc1-leaf2a.yml index 1b360f45348..30c8948af28 100644 --- a/ansible_collections/arista/avd/examples/dual-dc-l3ls/intended/structured_configs/dc1-leaf2a.yml +++ b/ansible_collections/arista/avd/examples/dual-dc-l3ls/intended/structured_configs/dc1-leaf2a.yml @@ -313,9 +313,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.1.68/31 no_autostate: true mtu: 1500 + ip_address: 10.255.1.68/31 - name: Vlan11 tenant: TENANT1 description: VRF10_VLAN11 diff --git a/ansible_collections/arista/avd/examples/dual-dc-l3ls/intended/structured_configs/dc1-leaf2b.yml b/ansible_collections/arista/avd/examples/dual-dc-l3ls/intended/structured_configs/dc1-leaf2b.yml index dd083d3bf24..b147984935d 100644 --- a/ansible_collections/arista/avd/examples/dual-dc-l3ls/intended/structured_configs/dc1-leaf2b.yml +++ b/ansible_collections/arista/avd/examples/dual-dc-l3ls/intended/structured_configs/dc1-leaf2b.yml @@ -313,9 +313,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.1.69/31 no_autostate: true mtu: 1500 + ip_address: 10.255.1.69/31 - name: Vlan11 tenant: TENANT1 description: VRF10_VLAN11 diff --git a/ansible_collections/arista/avd/examples/dual-dc-l3ls/intended/structured_configs/dc2-leaf1a.yml b/ansible_collections/arista/avd/examples/dual-dc-l3ls/intended/structured_configs/dc2-leaf1a.yml index c06908bf2f1..081a05bd994 100644 --- a/ansible_collections/arista/avd/examples/dual-dc-l3ls/intended/structured_configs/dc2-leaf1a.yml +++ b/ansible_collections/arista/avd/examples/dual-dc-l3ls/intended/structured_configs/dc2-leaf1a.yml @@ -251,9 +251,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.129.84/31 no_autostate: true mtu: 1500 + ip_address: 10.255.129.84/31 - name: Vlan11 tenant: TENANT1 description: VRF10_VLAN11 diff --git a/ansible_collections/arista/avd/examples/dual-dc-l3ls/intended/structured_configs/dc2-leaf1b.yml b/ansible_collections/arista/avd/examples/dual-dc-l3ls/intended/structured_configs/dc2-leaf1b.yml index bbbeb7b9516..bd62070d4cc 100644 --- a/ansible_collections/arista/avd/examples/dual-dc-l3ls/intended/structured_configs/dc2-leaf1b.yml +++ b/ansible_collections/arista/avd/examples/dual-dc-l3ls/intended/structured_configs/dc2-leaf1b.yml @@ -251,9 +251,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.129.85/31 no_autostate: true mtu: 1500 + ip_address: 10.255.129.85/31 - name: Vlan11 tenant: TENANT1 description: VRF10_VLAN11 diff --git a/ansible_collections/arista/avd/examples/dual-dc-l3ls/intended/structured_configs/dc2-leaf2a.yml b/ansible_collections/arista/avd/examples/dual-dc-l3ls/intended/structured_configs/dc2-leaf2a.yml index 2a463c0cc2a..3ac6d9941f8 100644 --- a/ansible_collections/arista/avd/examples/dual-dc-l3ls/intended/structured_configs/dc2-leaf2a.yml +++ b/ansible_collections/arista/avd/examples/dual-dc-l3ls/intended/structured_configs/dc2-leaf2a.yml @@ -313,9 +313,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.129.88/31 no_autostate: true mtu: 1500 + ip_address: 10.255.129.88/31 - name: Vlan11 tenant: TENANT1 description: VRF10_VLAN11 diff --git a/ansible_collections/arista/avd/examples/dual-dc-l3ls/intended/structured_configs/dc2-leaf2b.yml b/ansible_collections/arista/avd/examples/dual-dc-l3ls/intended/structured_configs/dc2-leaf2b.yml index 6bdd30ee840..3bb78ceb49d 100644 --- a/ansible_collections/arista/avd/examples/dual-dc-l3ls/intended/structured_configs/dc2-leaf2b.yml +++ b/ansible_collections/arista/avd/examples/dual-dc-l3ls/intended/structured_configs/dc2-leaf2b.yml @@ -313,9 +313,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.129.89/31 no_autostate: true mtu: 1500 + ip_address: 10.255.129.89/31 - name: Vlan11 tenant: TENANT1 description: VRF10_VLAN11 diff --git a/ansible_collections/arista/avd/examples/isis-ldp-ipvpn/documentation/devices/p1.md b/ansible_collections/arista/avd/examples/isis-ldp-ipvpn/documentation/devices/p1.md index b52222c50ba..1ebcdfc0be6 100644 --- a/ansible_collections/arista/avd/examples/isis-ldp-ipvpn/documentation/devices/p1.md +++ b/ansible_collections/arista/avd/examples/isis-ldp-ipvpn/documentation/devices/p1.md @@ -174,12 +174,12 @@ vlan internal order ascending range 1006 1199 ##### ISIS -| Interface | Channel Group | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | -| Ethernet1 | - | CORE | 50 | point-to-point | level-2 | True | md5 | -| Ethernet2 | - | CORE | 50 | point-to-point | level-2 | True | md5 | -| Ethernet3 | - | CORE | 50 | point-to-point | level-2 | True | md5 | -| Ethernet4 | - | CORE | 50 | point-to-point | level-2 | True | md5 | +| Interface | Channel Group | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Ethernet1 | - | CORE | - | 50 | point-to-point | level-2 | True | md5 | +| Ethernet2 | - | CORE | - | 50 | point-to-point | level-2 | True | md5 | +| Ethernet3 | - | CORE | - | 50 | point-to-point | level-2 | True | md5 | +| Ethernet4 | - | CORE | - | 50 | point-to-point | level-2 | True | md5 | #### Ethernet Interfaces Device Configuration diff --git a/ansible_collections/arista/avd/examples/isis-ldp-ipvpn/documentation/devices/p2.md b/ansible_collections/arista/avd/examples/isis-ldp-ipvpn/documentation/devices/p2.md index 8a113ff5ced..9cccfd5c03f 100644 --- a/ansible_collections/arista/avd/examples/isis-ldp-ipvpn/documentation/devices/p2.md +++ b/ansible_collections/arista/avd/examples/isis-ldp-ipvpn/documentation/devices/p2.md @@ -174,12 +174,12 @@ vlan internal order ascending range 1006 1199 ##### ISIS -| Interface | Channel Group | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | -| Ethernet1 | - | CORE | 50 | point-to-point | level-2 | True | md5 | -| Ethernet2 | - | CORE | 50 | point-to-point | level-2 | True | md5 | -| Ethernet3 | - | CORE | 50 | point-to-point | level-2 | True | md5 | -| Ethernet4 | - | CORE | 50 | point-to-point | level-2 | True | md5 | +| Interface | Channel Group | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Ethernet1 | - | CORE | - | 50 | point-to-point | level-2 | True | md5 | +| Ethernet2 | - | CORE | - | 50 | point-to-point | level-2 | True | md5 | +| Ethernet3 | - | CORE | - | 50 | point-to-point | level-2 | True | md5 | +| Ethernet4 | - | CORE | - | 50 | point-to-point | level-2 | True | md5 | #### Ethernet Interfaces Device Configuration diff --git a/ansible_collections/arista/avd/examples/isis-ldp-ipvpn/documentation/devices/p3.md b/ansible_collections/arista/avd/examples/isis-ldp-ipvpn/documentation/devices/p3.md index 9c35378ce88..d5e16cc8f89 100644 --- a/ansible_collections/arista/avd/examples/isis-ldp-ipvpn/documentation/devices/p3.md +++ b/ansible_collections/arista/avd/examples/isis-ldp-ipvpn/documentation/devices/p3.md @@ -173,11 +173,11 @@ vlan internal order ascending range 1006 1199 ##### ISIS -| Interface | Channel Group | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | -| Ethernet1 | - | CORE | 50 | point-to-point | level-2 | True | md5 | -| Ethernet2 | - | CORE | 50 | point-to-point | level-2 | True | md5 | -| Ethernet4 | - | CORE | 50 | point-to-point | level-2 | True | md5 | +| Interface | Channel Group | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Ethernet1 | - | CORE | - | 50 | point-to-point | level-2 | True | md5 | +| Ethernet2 | - | CORE | - | 50 | point-to-point | level-2 | True | md5 | +| Ethernet4 | - | CORE | - | 50 | point-to-point | level-2 | True | md5 | #### Ethernet Interfaces Device Configuration diff --git a/ansible_collections/arista/avd/examples/isis-ldp-ipvpn/documentation/devices/p4.md b/ansible_collections/arista/avd/examples/isis-ldp-ipvpn/documentation/devices/p4.md index 079e2aebb6e..67bbe763cb6 100644 --- a/ansible_collections/arista/avd/examples/isis-ldp-ipvpn/documentation/devices/p4.md +++ b/ansible_collections/arista/avd/examples/isis-ldp-ipvpn/documentation/devices/p4.md @@ -173,11 +173,11 @@ vlan internal order ascending range 1006 1199 ##### ISIS -| Interface | Channel Group | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | -| Ethernet2 | - | CORE | 50 | point-to-point | level-2 | True | md5 | -| Ethernet3 | - | CORE | 50 | point-to-point | level-2 | True | md5 | -| Ethernet4 | - | CORE | 50 | point-to-point | level-2 | True | md5 | +| Interface | Channel Group | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Ethernet2 | - | CORE | - | 50 | point-to-point | level-2 | True | md5 | +| Ethernet3 | - | CORE | - | 50 | point-to-point | level-2 | True | md5 | +| Ethernet4 | - | CORE | - | 50 | point-to-point | level-2 | True | md5 | #### Ethernet Interfaces Device Configuration diff --git a/ansible_collections/arista/avd/examples/isis-ldp-ipvpn/documentation/devices/pe1.md b/ansible_collections/arista/avd/examples/isis-ldp-ipvpn/documentation/devices/pe1.md index 859224290af..3d708327340 100644 --- a/ansible_collections/arista/avd/examples/isis-ldp-ipvpn/documentation/devices/pe1.md +++ b/ansible_collections/arista/avd/examples/isis-ldp-ipvpn/documentation/devices/pe1.md @@ -188,10 +188,10 @@ vlan internal order ascending range 1006 1199 ##### ISIS -| Interface | Channel Group | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | -| Ethernet1 | - | CORE | 50 | point-to-point | level-2 | True | md5 | -| Ethernet2 | - | CORE | 50 | point-to-point | level-2 | True | md5 | +| Interface | Channel Group | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Ethernet1 | - | CORE | - | 50 | point-to-point | level-2 | True | md5 | +| Ethernet2 | - | CORE | - | 50 | point-to-point | level-2 | True | md5 | #### Ethernet Interfaces Device Configuration @@ -467,7 +467,7 @@ ASN Notation: asplain | -------- | --------- | --- | -------- | -------------- | -------------- | ---------- | --- | --------------------- | ---------------------- | ------- | ------------ | | 10.255.2.1 | Inherited from peer group MPLS-OVERLAY-PEERS | default | - | Inherited from peer group MPLS-OVERLAY-PEERS | Inherited from peer group MPLS-OVERLAY-PEERS | - | Inherited from peer group MPLS-OVERLAY-PEERS | - | - | - | - | | 10.255.2.2 | Inherited from peer group MPLS-OVERLAY-PEERS | default | - | Inherited from peer group MPLS-OVERLAY-PEERS | Inherited from peer group MPLS-OVERLAY-PEERS | - | Inherited from peer group MPLS-OVERLAY-PEERS | - | - | - | - | -| 10.1.1.3 | 65123 | C2_VRF1 | - | standard | 100 | - | - | - | - | - | +| 10.1.1.3 | 65123 | C2_VRF1 | - | standard | 100 | - | - | - | - | - | - | #### Router BGP EVPN Address Family @@ -480,9 +480,9 @@ ASN Notation: asplain ##### VPN-IPv4 Peer Groups -| Peer Group | Activate | Route-map In | Route-map Out | -| ---------- | -------- | ------------ | ------------- | -| MPLS-OVERLAY-PEERS | True | - | - | +| Peer Group | Activate | Route-map In | Route-map Out | RCF In | RCF Out | +| ---------- | -------- | ------------ | ------------- | ------ | ------- | +| MPLS-OVERLAY-PEERS | True | - | - | - | - | #### Router BGP VRFs diff --git a/ansible_collections/arista/avd/examples/isis-ldp-ipvpn/documentation/devices/pe2.md b/ansible_collections/arista/avd/examples/isis-ldp-ipvpn/documentation/devices/pe2.md index 2f7346b3e19..399ed34d73f 100644 --- a/ansible_collections/arista/avd/examples/isis-ldp-ipvpn/documentation/devices/pe2.md +++ b/ansible_collections/arista/avd/examples/isis-ldp-ipvpn/documentation/devices/pe2.md @@ -188,10 +188,10 @@ vlan internal order ascending range 1006 1199 ##### ISIS -| Interface | Channel Group | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | -| Ethernet1 | - | CORE | 50 | point-to-point | level-2 | True | md5 | -| Ethernet2 | - | CORE | 50 | point-to-point | level-2 | True | md5 | +| Interface | Channel Group | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Ethernet1 | - | CORE | - | 50 | point-to-point | level-2 | True | md5 | +| Ethernet2 | - | CORE | - | 50 | point-to-point | level-2 | True | md5 | #### Ethernet Interfaces Device Configuration @@ -467,7 +467,7 @@ ASN Notation: asplain | -------- | --------- | --- | -------- | -------------- | -------------- | ---------- | --- | --------------------- | ---------------------- | ------- | ------------ | | 10.255.2.1 | Inherited from peer group MPLS-OVERLAY-PEERS | default | - | Inherited from peer group MPLS-OVERLAY-PEERS | Inherited from peer group MPLS-OVERLAY-PEERS | - | Inherited from peer group MPLS-OVERLAY-PEERS | - | - | - | - | | 10.255.2.2 | Inherited from peer group MPLS-OVERLAY-PEERS | default | - | Inherited from peer group MPLS-OVERLAY-PEERS | Inherited from peer group MPLS-OVERLAY-PEERS | - | Inherited from peer group MPLS-OVERLAY-PEERS | - | - | - | - | -| 10.1.1.3 | 65123 | C2_VRF1 | - | standard | 100 | - | - | - | - | - | +| 10.1.1.3 | 65123 | C2_VRF1 | - | standard | 100 | - | - | - | - | - | - | #### Router BGP EVPN Address Family @@ -480,9 +480,9 @@ ASN Notation: asplain ##### VPN-IPv4 Peer Groups -| Peer Group | Activate | Route-map In | Route-map Out | -| ---------- | -------- | ------------ | ------------- | -| MPLS-OVERLAY-PEERS | True | - | - | +| Peer Group | Activate | Route-map In | Route-map Out | RCF In | RCF Out | +| ---------- | -------- | ------------ | ------------- | ------ | ------- | +| MPLS-OVERLAY-PEERS | True | - | - | - | - | #### Router BGP VRFs diff --git a/ansible_collections/arista/avd/examples/isis-ldp-ipvpn/documentation/devices/pe3.md b/ansible_collections/arista/avd/examples/isis-ldp-ipvpn/documentation/devices/pe3.md index 70d2955badd..25aef29d6be 100644 --- a/ansible_collections/arista/avd/examples/isis-ldp-ipvpn/documentation/devices/pe3.md +++ b/ansible_collections/arista/avd/examples/isis-ldp-ipvpn/documentation/devices/pe3.md @@ -181,10 +181,10 @@ vlan internal order ascending range 1006 1199 ##### ISIS -| Interface | Channel Group | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | -| Ethernet1 | - | CORE | 50 | point-to-point | level-2 | True | md5 | -| Ethernet3 | - | CORE | 50 | point-to-point | level-2 | True | md5 | +| Interface | Channel Group | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Ethernet1 | - | CORE | - | 50 | point-to-point | level-2 | True | md5 | +| Ethernet3 | - | CORE | - | 50 | point-to-point | level-2 | True | md5 | #### Ethernet Interfaces Device Configuration @@ -456,7 +456,7 @@ ASN Notation: asplain | -------- | --------- | --- | -------- | -------------- | -------------- | ---------- | --- | --------------------- | ---------------------- | ------- | ------------ | | 10.255.2.1 | Inherited from peer group MPLS-OVERLAY-PEERS | default | - | Inherited from peer group MPLS-OVERLAY-PEERS | Inherited from peer group MPLS-OVERLAY-PEERS | - | Inherited from peer group MPLS-OVERLAY-PEERS | - | - | - | - | | 10.255.2.2 | Inherited from peer group MPLS-OVERLAY-PEERS | default | - | Inherited from peer group MPLS-OVERLAY-PEERS | Inherited from peer group MPLS-OVERLAY-PEERS | - | Inherited from peer group MPLS-OVERLAY-PEERS | - | - | - | - | -| 10.1.1.10 | 65124 | C2_VRF1 | - | standard | 100 | - | - | - | - | - | +| 10.1.1.10 | 65124 | C2_VRF1 | - | standard | 100 | - | - | - | - | - | - | #### Router BGP EVPN Address Family @@ -469,9 +469,9 @@ ASN Notation: asplain ##### VPN-IPv4 Peer Groups -| Peer Group | Activate | Route-map In | Route-map Out | -| ---------- | -------- | ------------ | ------------- | -| MPLS-OVERLAY-PEERS | True | - | - | +| Peer Group | Activate | Route-map In | Route-map Out | RCF In | RCF Out | +| ---------- | -------- | ------------ | ------------- | ------ | ------- | +| MPLS-OVERLAY-PEERS | True | - | - | - | - | #### Router BGP VRFs diff --git a/ansible_collections/arista/avd/examples/isis-ldp-ipvpn/documentation/devices/rr1.md b/ansible_collections/arista/avd/examples/isis-ldp-ipvpn/documentation/devices/rr1.md index 110f166a326..3bbcdbf3ade 100644 --- a/ansible_collections/arista/avd/examples/isis-ldp-ipvpn/documentation/devices/rr1.md +++ b/ansible_collections/arista/avd/examples/isis-ldp-ipvpn/documentation/devices/rr1.md @@ -176,11 +176,11 @@ vlan internal order ascending range 1006 1199 ##### ISIS -| Interface | Channel Group | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | -| Ethernet2 | - | CORE | 50 | point-to-point | level-2 | True | md5 | -| Ethernet3 | - | CORE | 50 | point-to-point | level-2 | True | md5 | -| Ethernet4 | - | CORE | 50 | point-to-point | level-2 | True | md5 | +| Interface | Channel Group | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Ethernet2 | - | CORE | - | 50 | point-to-point | level-2 | True | md5 | +| Ethernet3 | - | CORE | - | 50 | point-to-point | level-2 | True | md5 | +| Ethernet4 | - | CORE | - | 50 | point-to-point | level-2 | True | md5 | #### Ethernet Interfaces Device Configuration @@ -436,10 +436,10 @@ ASN Notation: asplain ##### VPN-IPv4 Peer Groups -| Peer Group | Activate | Route-map In | Route-map Out | -| ---------- | -------- | ------------ | ------------- | -| MPLS-OVERLAY-PEERS | True | - | - | -| RR-OVERLAY-PEERS | True | - | - | +| Peer Group | Activate | Route-map In | Route-map Out | RCF In | RCF Out | +| ---------- | -------- | ------------ | ------------- | ------ | ------- | +| MPLS-OVERLAY-PEERS | True | - | - | - | - | +| RR-OVERLAY-PEERS | True | - | - | - | - | #### Router BGP Device Configuration diff --git a/ansible_collections/arista/avd/examples/isis-ldp-ipvpn/documentation/devices/rr2.md b/ansible_collections/arista/avd/examples/isis-ldp-ipvpn/documentation/devices/rr2.md index df54eec96d4..4f8d8ba8df6 100644 --- a/ansible_collections/arista/avd/examples/isis-ldp-ipvpn/documentation/devices/rr2.md +++ b/ansible_collections/arista/avd/examples/isis-ldp-ipvpn/documentation/devices/rr2.md @@ -176,11 +176,11 @@ vlan internal order ascending range 1006 1199 ##### ISIS -| Interface | Channel Group | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | -| Ethernet2 | - | CORE | 50 | point-to-point | level-2 | True | md5 | -| Ethernet3 | - | CORE | 50 | point-to-point | level-2 | True | md5 | -| Ethernet4 | - | CORE | 50 | point-to-point | level-2 | True | md5 | +| Interface | Channel Group | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Ethernet2 | - | CORE | - | 50 | point-to-point | level-2 | True | md5 | +| Ethernet3 | - | CORE | - | 50 | point-to-point | level-2 | True | md5 | +| Ethernet4 | - | CORE | - | 50 | point-to-point | level-2 | True | md5 | #### Ethernet Interfaces Device Configuration @@ -436,10 +436,10 @@ ASN Notation: asplain ##### VPN-IPv4 Peer Groups -| Peer Group | Activate | Route-map In | Route-map Out | -| ---------- | -------- | ------------ | ------------- | -| MPLS-OVERLAY-PEERS | True | - | - | -| RR-OVERLAY-PEERS | True | - | - | +| Peer Group | Activate | Route-map In | Route-map Out | RCF In | RCF Out | +| ---------- | -------- | ------------ | ------------- | ------ | ------- | +| MPLS-OVERLAY-PEERS | True | - | - | - | - | +| RR-OVERLAY-PEERS | True | - | - | - | - | #### Router BGP Device Configuration diff --git a/ansible_collections/arista/avd/examples/l2ls-fabric/intended/structured_configs/LEAF1.yml b/ansible_collections/arista/avd/examples/l2ls-fabric/intended/structured_configs/LEAF1.yml index cc1bba8ead3..a136903b46a 100644 --- a/ansible_collections/arista/avd/examples/l2ls-fabric/intended/structured_configs/LEAF1.yml +++ b/ansible_collections/arista/avd/examples/l2ls-fabric/intended/structured_configs/LEAF1.yml @@ -71,9 +71,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 192.168.0.0/31 no_autostate: true mtu: 1500 + ip_address: 192.168.0.0/31 port_channel_interfaces: - name: Port-Channel47 description: MLAG_PEER_LEAF2_Po47 diff --git a/ansible_collections/arista/avd/examples/l2ls-fabric/intended/structured_configs/LEAF2.yml b/ansible_collections/arista/avd/examples/l2ls-fabric/intended/structured_configs/LEAF2.yml index 89fbd72bcb6..7e338933ecd 100644 --- a/ansible_collections/arista/avd/examples/l2ls-fabric/intended/structured_configs/LEAF2.yml +++ b/ansible_collections/arista/avd/examples/l2ls-fabric/intended/structured_configs/LEAF2.yml @@ -71,9 +71,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 192.168.0.1/31 no_autostate: true mtu: 1500 + ip_address: 192.168.0.1/31 port_channel_interfaces: - name: Port-Channel47 description: MLAG_PEER_LEAF1_Po47 diff --git a/ansible_collections/arista/avd/examples/l2ls-fabric/intended/structured_configs/LEAF3.yml b/ansible_collections/arista/avd/examples/l2ls-fabric/intended/structured_configs/LEAF3.yml index 15fa1435f9c..9ae76a6a229 100644 --- a/ansible_collections/arista/avd/examples/l2ls-fabric/intended/structured_configs/LEAF3.yml +++ b/ansible_collections/arista/avd/examples/l2ls-fabric/intended/structured_configs/LEAF3.yml @@ -71,9 +71,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 192.168.0.4/31 no_autostate: true mtu: 1500 + ip_address: 192.168.0.4/31 port_channel_interfaces: - name: Port-Channel47 description: MLAG_PEER_LEAF4_Po47 diff --git a/ansible_collections/arista/avd/examples/l2ls-fabric/intended/structured_configs/LEAF4.yml b/ansible_collections/arista/avd/examples/l2ls-fabric/intended/structured_configs/LEAF4.yml index ecb5206f30b..773c8b1a531 100644 --- a/ansible_collections/arista/avd/examples/l2ls-fabric/intended/structured_configs/LEAF4.yml +++ b/ansible_collections/arista/avd/examples/l2ls-fabric/intended/structured_configs/LEAF4.yml @@ -71,9 +71,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 192.168.0.5/31 no_autostate: true mtu: 1500 + ip_address: 192.168.0.5/31 port_channel_interfaces: - name: Port-Channel47 description: MLAG_PEER_LEAF3_Po47 diff --git a/ansible_collections/arista/avd/examples/l2ls-fabric/intended/structured_configs/SPINE1.yml b/ansible_collections/arista/avd/examples/l2ls-fabric/intended/structured_configs/SPINE1.yml index 568c4bb0d6a..866bc543e19 100644 --- a/ansible_collections/arista/avd/examples/l2ls-fabric/intended/structured_configs/SPINE1.yml +++ b/ansible_collections/arista/avd/examples/l2ls-fabric/intended/structured_configs/SPINE1.yml @@ -74,9 +74,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 192.168.0.0/31 no_autostate: true mtu: 1500 + ip_address: 192.168.0.0/31 port_channel_interfaces: - name: Port-Channel47 description: MLAG_PEER_SPINE2_Po47 diff --git a/ansible_collections/arista/avd/examples/l2ls-fabric/intended/structured_configs/SPINE2.yml b/ansible_collections/arista/avd/examples/l2ls-fabric/intended/structured_configs/SPINE2.yml index 878ab1753dd..33f713b7937 100644 --- a/ansible_collections/arista/avd/examples/l2ls-fabric/intended/structured_configs/SPINE2.yml +++ b/ansible_collections/arista/avd/examples/l2ls-fabric/intended/structured_configs/SPINE2.yml @@ -74,9 +74,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 192.168.0.1/31 no_autostate: true mtu: 1500 + ip_address: 192.168.0.1/31 port_channel_interfaces: - name: Port-Channel47 description: MLAG_PEER_SPINE1_Po47 diff --git a/ansible_collections/arista/avd/examples/single-dc-l3ls/documentation/devices/dc1-leaf1a.md b/ansible_collections/arista/avd/examples/single-dc-l3ls/documentation/devices/dc1-leaf1a.md index aafca3a2958..f236032240d 100644 --- a/ansible_collections/arista/avd/examples/single-dc-l3ls/documentation/devices/dc1-leaf1a.md +++ b/ansible_collections/arista/avd/examples/single-dc-l3ls/documentation/devices/dc1-leaf1a.md @@ -712,8 +712,8 @@ ASN Notation: asplain | 10.255.1.97 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | default | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | | 10.255.255.0 | 65100 | default | - | Inherited from peer group IPv4-UNDERLAY-PEERS | Inherited from peer group IPv4-UNDERLAY-PEERS | - | - | - | - | - | - | | 10.255.255.2 | 65100 | default | - | Inherited from peer group IPv4-UNDERLAY-PEERS | Inherited from peer group IPv4-UNDERLAY-PEERS | - | - | - | - | - | - | -| 10.255.1.97 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF10 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.1.97 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF11 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | +| 10.255.1.97 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF10 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.1.97 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF11 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | #### Router BGP EVPN Address Family diff --git a/ansible_collections/arista/avd/examples/single-dc-l3ls/documentation/devices/dc1-leaf1b.md b/ansible_collections/arista/avd/examples/single-dc-l3ls/documentation/devices/dc1-leaf1b.md index 702ad7f16fd..5cf60726297 100644 --- a/ansible_collections/arista/avd/examples/single-dc-l3ls/documentation/devices/dc1-leaf1b.md +++ b/ansible_collections/arista/avd/examples/single-dc-l3ls/documentation/devices/dc1-leaf1b.md @@ -712,8 +712,8 @@ ASN Notation: asplain | 10.255.1.96 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | default | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | | 10.255.255.4 | 65100 | default | - | Inherited from peer group IPv4-UNDERLAY-PEERS | Inherited from peer group IPv4-UNDERLAY-PEERS | - | - | - | - | - | - | | 10.255.255.6 | 65100 | default | - | Inherited from peer group IPv4-UNDERLAY-PEERS | Inherited from peer group IPv4-UNDERLAY-PEERS | - | - | - | - | - | - | -| 10.255.1.96 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF10 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.1.96 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF11 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | +| 10.255.1.96 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF10 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.1.96 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF11 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | #### Router BGP EVPN Address Family diff --git a/ansible_collections/arista/avd/examples/single-dc-l3ls/documentation/devices/dc1-leaf2a.md b/ansible_collections/arista/avd/examples/single-dc-l3ls/documentation/devices/dc1-leaf2a.md index dada1bc6bf8..85bf5f184eb 100644 --- a/ansible_collections/arista/avd/examples/single-dc-l3ls/documentation/devices/dc1-leaf2a.md +++ b/ansible_collections/arista/avd/examples/single-dc-l3ls/documentation/devices/dc1-leaf2a.md @@ -712,8 +712,8 @@ ASN Notation: asplain | 10.255.1.101 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | default | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | | 10.255.255.8 | 65100 | default | - | Inherited from peer group IPv4-UNDERLAY-PEERS | Inherited from peer group IPv4-UNDERLAY-PEERS | - | - | - | - | - | - | | 10.255.255.10 | 65100 | default | - | Inherited from peer group IPv4-UNDERLAY-PEERS | Inherited from peer group IPv4-UNDERLAY-PEERS | - | - | - | - | - | - | -| 10.255.1.101 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF10 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.1.101 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF11 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | +| 10.255.1.101 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF10 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.1.101 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF11 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | #### Router BGP EVPN Address Family diff --git a/ansible_collections/arista/avd/examples/single-dc-l3ls/documentation/devices/dc1-leaf2b.md b/ansible_collections/arista/avd/examples/single-dc-l3ls/documentation/devices/dc1-leaf2b.md index cdb790157f0..e2065445561 100644 --- a/ansible_collections/arista/avd/examples/single-dc-l3ls/documentation/devices/dc1-leaf2b.md +++ b/ansible_collections/arista/avd/examples/single-dc-l3ls/documentation/devices/dc1-leaf2b.md @@ -712,8 +712,8 @@ ASN Notation: asplain | 10.255.1.100 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | default | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | | 10.255.255.12 | 65100 | default | - | Inherited from peer group IPv4-UNDERLAY-PEERS | Inherited from peer group IPv4-UNDERLAY-PEERS | - | - | - | - | - | - | | 10.255.255.14 | 65100 | default | - | Inherited from peer group IPv4-UNDERLAY-PEERS | Inherited from peer group IPv4-UNDERLAY-PEERS | - | - | - | - | - | - | -| 10.255.1.100 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF10 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.1.100 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF11 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | +| 10.255.1.100 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF10 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.1.100 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | VRF11 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | #### Router BGP EVPN Address Family diff --git a/ansible_collections/arista/avd/examples/single-dc-l3ls/group_vars/FABRIC.yml b/ansible_collections/arista/avd/examples/single-dc-l3ls/group_vars/FABRIC.yml index c39814a6548..db4e87c2f93 100644 --- a/ansible_collections/arista/avd/examples/single-dc-l3ls/group_vars/FABRIC.yml +++ b/ansible_collections/arista/avd/examples/single-dc-l3ls/group_vars/FABRIC.yml @@ -76,7 +76,7 @@ terminattr_disable_aaa: true name_servers: - 192.168.1.1 -# NTP Servers IP or DNS name, first NTP server will be prefered, and sourced from Management VRF +# NTP Servers IP or DNS name, first NTP server will be preferred, and sourced from Management VRF ntp_settings: server_vrf: use_mgmt_interface_vrf servers: diff --git a/ansible_collections/arista/avd/examples/single-dc-l3ls/intended/structured_configs/dc1-leaf1a.yml b/ansible_collections/arista/avd/examples/single-dc-l3ls/intended/structured_configs/dc1-leaf1a.yml index d097a3c321e..33b2c59c281 100644 --- a/ansible_collections/arista/avd/examples/single-dc-l3ls/intended/structured_configs/dc1-leaf1a.yml +++ b/ansible_collections/arista/avd/examples/single-dc-l3ls/intended/structured_configs/dc1-leaf1a.yml @@ -272,9 +272,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.1.64/31 no_autostate: true mtu: 1500 + ip_address: 10.255.1.64/31 - name: Vlan11 tenant: TENANT1 description: VRF10_VLAN11 diff --git a/ansible_collections/arista/avd/examples/single-dc-l3ls/intended/structured_configs/dc1-leaf1b.yml b/ansible_collections/arista/avd/examples/single-dc-l3ls/intended/structured_configs/dc1-leaf1b.yml index 7b198ffd827..9ca6cf68e6b 100644 --- a/ansible_collections/arista/avd/examples/single-dc-l3ls/intended/structured_configs/dc1-leaf1b.yml +++ b/ansible_collections/arista/avd/examples/single-dc-l3ls/intended/structured_configs/dc1-leaf1b.yml @@ -272,9 +272,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.1.65/31 no_autostate: true mtu: 1500 + ip_address: 10.255.1.65/31 - name: Vlan11 tenant: TENANT1 description: VRF10_VLAN11 diff --git a/ansible_collections/arista/avd/examples/single-dc-l3ls/intended/structured_configs/dc1-leaf2a.yml b/ansible_collections/arista/avd/examples/single-dc-l3ls/intended/structured_configs/dc1-leaf2a.yml index c2e410c1968..8a9af753ba5 100644 --- a/ansible_collections/arista/avd/examples/single-dc-l3ls/intended/structured_configs/dc1-leaf2a.yml +++ b/ansible_collections/arista/avd/examples/single-dc-l3ls/intended/structured_configs/dc1-leaf2a.yml @@ -272,9 +272,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.1.68/31 no_autostate: true mtu: 1500 + ip_address: 10.255.1.68/31 - name: Vlan11 tenant: TENANT1 description: VRF10_VLAN11 diff --git a/ansible_collections/arista/avd/examples/single-dc-l3ls/intended/structured_configs/dc1-leaf2b.yml b/ansible_collections/arista/avd/examples/single-dc-l3ls/intended/structured_configs/dc1-leaf2b.yml index 61631590356..a8724ddc94e 100644 --- a/ansible_collections/arista/avd/examples/single-dc-l3ls/intended/structured_configs/dc1-leaf2b.yml +++ b/ansible_collections/arista/avd/examples/single-dc-l3ls/intended/structured_configs/dc1-leaf2b.yml @@ -272,9 +272,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.1.69/31 no_autostate: true mtu: 1500 + ip_address: 10.255.1.69/31 - name: Vlan11 tenant: TENANT1 description: VRF10_VLAN11 diff --git a/ansible_collections/arista/avd/galaxy.yml b/ansible_collections/arista/avd/galaxy.yml index d86525a3287..170b13dbde0 100644 --- a/ansible_collections/arista/avd/galaxy.yml +++ b/ansible_collections/arista/avd/galaxy.yml @@ -9,7 +9,7 @@ namespace: arista name: avd # The version of the collection. Must be compatible with semantic versioning -version: 4.8.0-dev0 +version: 4.10.0-dev0 # The path to the Markdown (.md) readme file. This path is relative to the root of the collection readme: README.md diff --git a/ansible_collections/arista/avd/index.md b/ansible_collections/arista/avd/index.md new file mode 100644 index 00000000000..baa0b631c55 --- /dev/null +++ b/ansible_collections/arista/avd/index.md @@ -0,0 +1,78 @@ + + +# Arista Validated Designs + +
Arista AVD Overview
+ +Arista Validated Designs (AVD) is an extensible data model that defines Arista's Unified Cloud Network architecture as "code". + +**[Documentation](https://avd.arista.com)** + +**[Source Code](https://github.com/aristanetworks/avd)** + +**[Examples](https://github.com/aristanetworks/avd/tree/devel/ansible_collections/arista/avd/examples)** + +## Features + +- **Flexibility with Open Data Models:** Extensible fabric-wide network models, simplifying configuration, delivering consistency, and reducing errors +- **Simplification through Multi-Domain Automation:** A framework that can automate the data center, campus or wide area network, enabled by a consistent EOS software image and management platform +- **Comprehensive Workflows:** Automating the full life cycle of network provisioning from config generation to pre and post-deployment validation, and self-documentation of the network + +## Reference designs + +- [L3LS VXLAN-EVPN, L2LS, and MPLS](roles/eos_designs/README.md) + +## AVD Ansible Collection + +[Arista Networks](https://www.arista.com/) supports Ansible for managing devices running Arista's **Extensible Operating System (EOS)** natively through it's **EOS API (eAPI)** or [**CloudVision Portal (CVP)**](https://www.arista.com/en/products/eos/eos-cloudvision). The collection includes a set of Ansible roles and modules to help kick-start your automation with Arista. The various roles and templates provided are designed to be customized and extended to your needs. + +### Collection installation + +Ansible galaxy hosts all stable versions of the `arista.avd` collection. Installation from ansible-galaxy is the most convenient approach for consuming `arista.avd` content. Please follow the collection installation [guide](docs/installation/collection-installation.md). + +```shell +ansible-galaxy collection install arista.avd +``` + +## PyAVD + +PyAVD is a python package providing some of the features from the arista.avd Ansible collection without requiring Ansible. PyAVD leverages the same logic as the Ansible collection, so the generated outputs should be exactly the same based on the same inputs. + +PyAVD does not provide any inventory or variable management, so PyAVD cannot replace a full Ansible based solution by itself. PyAVD could serve as an element in larger framework. + +```shell +pip3 install pyavd +``` + +## Examples + +- [Getting started](docs/getting-started/intro-to-ansible-and-avd.md) +- [Arista NetDevOps GitHub repository](https://github.com/aristanetworks/netdevops-examples) + +## Additional resources + +- Ansible [EOS modules](https://docs.ansible.com/ansible/latest/collections/arista/eos/index.html) on Ansible documentation +- Ansible [CloudVision modules](https://cvp.avd.sh/en/stable/) +- [CloudVision Portal](https://www.arista.com/en/products/eos/eos-cloudvision) +- [Arista Design and Deployment Guides](https://www.arista.com/en/solutions/design-guides) + +## Support + +- AVD version 4.x releases with full support from Arista TAC. If your organization has the [A-Care subscription](https://www.arista.com/assets/data/pdf/AVD-A-Care-TAC-Support-Overview.pdf) please don't hesitate to contact TAC with any questions or issues. +- Community support is provided via [Github discussions board](https://github.com/aristanetworks/avd/discussions). + +## Contributing + +Contributing pull requests are gladly welcomed for this repository. If you are planning a big change, please start a discussion first to make sure we'll be able to merge it. Please see [contribution guide](docs/contribution/overview.md) for additional details. + +You can also open an [issue](https://github.com/aristanetworks/avd/issues) to report any problems or submit enhancements. + +## License + +Copyright (c) 2019-2024 Arista Networks, Inc. + +The project is published under [Apache 2.0 License](LICENSE) diff --git a/ansible_collections/arista/avd/media/wan_direct_ha_no_lan.png b/ansible_collections/arista/avd/media/wan_direct_ha_no_lan.png new file mode 100644 index 00000000000..a432ff94970 Binary files /dev/null and b/ansible_collections/arista/avd/media/wan_direct_ha_no_lan.png differ diff --git a/ansible_collections/arista/avd/media/wan_ebgp_lan_ha.png b/ansible_collections/arista/avd/media/wan_ebgp_lan_ha.png new file mode 100644 index 00000000000..064ca774ffb Binary files /dev/null and b/ansible_collections/arista/avd/media/wan_ebgp_lan_ha.png differ diff --git a/ansible_collections/arista/avd/media/wan_ebgp_lan_ha_direct.png b/ansible_collections/arista/avd/media/wan_ebgp_lan_ha_direct.png new file mode 100644 index 00000000000..6607b8ae323 Binary files /dev/null and b/ansible_collections/arista/avd/media/wan_ebgp_lan_ha_direct.png differ diff --git a/ansible_collections/arista/avd/media/wan_ebgp_lan_single_router.png b/ansible_collections/arista/avd/media/wan_ebgp_lan_single_router.png new file mode 100644 index 00000000000..b77bd592644 Binary files /dev/null and b/ansible_collections/arista/avd/media/wan_ebgp_lan_single_router.png differ diff --git a/ansible_collections/arista/avd/media/wan_lan_common.png b/ansible_collections/arista/avd/media/wan_lan_common.png new file mode 100644 index 00000000000..dc580ee4ef5 Binary files /dev/null and b/ansible_collections/arista/avd/media/wan_lan_common.png differ diff --git a/ansible_collections/arista/avd/meta/runtime.yml b/ansible_collections/arista/avd/meta/runtime.yml index 853aa16c59a..8da9b617e2a 100644 --- a/ansible_collections/arista/avd/meta/runtime.yml +++ b/ansible_collections/arista/avd/meta/runtime.yml @@ -1,5 +1,5 @@ --- -requires_ansible: '>=2.14.0,<2.17.0' +requires_ansible: '>=2.15.0,<2.18.0' plugin_routing: filter: hash_passphrase: @@ -7,6 +7,18 @@ plugin_routing: deprecation: removal_version: 5.0.0 warning_text: Use arista.avd.snmp_hash instead + generate_esi: + deprecation: + removal_version: 5.0.0 + warning_text: Use Jinja string concatenation instead like `{{ ~ }}` + generate_lacp_id: + deprecation: + removal_version: 5.0.0 + warning_text: Use the builtin `replace` filter instead like `{{ | replace(':', '.') }}` + generate_route_target: + deprecation: + removal_version: 5.0.0 + warning_text: Use the builtin `ansible.builtin.regex_replace` filter instead like `{{ | ansible.builtin.regex_replace('(\\d{2})(\\d{2}):(\\d{2})(\\d{2}):(\\d{2})(\\d{2})', '\\1:\\2:\\3:\\4:\\5:\\6') }}` modules: deploy_to_cv: deprecation: @@ -15,6 +27,24 @@ plugin_routing: The preview module 'arista.avd.deploy_to_cv' has been released under the new name 'arista.avd.cv_workflow'. The module will be redirected automatically until AVD version 5.0.0 after which it will be removed. redirect: arista.avd.cv_workflow + batch_template: + deprecation: + removal_version: 5.0.0 + warning_text: |- + The internal 'arista.avd.batch_template' action plugin is no longer used by AVD. + The plugin is released as open source, so it can be copied and reused according to the license and copyright. + validate_and_template: + deprecation: + removal_version: 5.0.0 + warning_text: |- + The internal 'arista.avd.validate_and_template' action plugin is no longer used by AVD. + The plugin is released as open source, so it can be copied and reused according to the license and copyright. + yaml_templates_to_facts: + deprecation: + removal_version: 5.0.0 + warning_text: |- + The internal 'arista.avd.yaml_templates_to_facts' action plugin is no longer used by AVD. + The plugin is released as open source, so it can be copied and reused according to the license and copyright. action: deploy_to_cv: deprecation: @@ -23,3 +53,21 @@ plugin_routing: The preview module 'arista.avd.deploy_to_cv' has been released under the new name 'arista.avd.cv_workflow'. The module will be redirected automatically until AVD version 5.0.0 after which it will be removed. redirect: arista.avd.cv_workflow + batch_template: + deprecation: + removal_version: 5.0.0 + warning_text: |- + The internal 'arista.avd.batch_template' action plugin is no longer used by AVD. + The plugin is released as open source, so it can be copied and reused according to the license and copyright. + validate_and_template: + deprecation: + removal_version: 5.0.0 + warning_text: |- + The internal 'arista.avd.validate_and_template' action plugin is no longer used by AVD. + The plugin is released as open source, so it can be copied and reused according to the license and copyright. + yaml_templates_to_facts: + deprecation: + removal_version: 5.0.0 + warning_text: |- + The internal 'arista.avd.yaml_templates_to_facts' action plugin is no longer used by AVD. + The plugin is released as open source, so it can be copied and reused according to the license and copyright. diff --git a/ansible_collections/arista/avd/molecule/Makefile b/ansible_collections/arista/avd/molecule/Makefile index 86ccbb6da0c..0ffe6cf03c4 100644 --- a/ansible_collections/arista/avd/molecule/Makefile +++ b/ansible_collections/arista/avd/molecule/Makefile @@ -1,27 +1,27 @@ MOLECULE ?= eos_cli_config_gen -ANSIBLE_OPTIONS ?= +ANSIBLE_OPTIONS ?= --forks 5 .PHONY: help -help: ## Display help message +help: ## Display help message. @grep -E '^[0-9a-zA-Z_-]+\.*[0-9a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' -############################################################################### -# docker containers target # -############################################################################### +################################################################ +# Molecule Execution # +################################################################ -.PHONY: run -run: ## Execute molecule TEST sequence. By default eos_cli_config_gen. Can be set with MOLECULE= +.PHONY: test +test: ## Execute molecule "converge" sequence. Specify scenario name with `MOLECULE=` (default: `eos_cli_config_gen`) and Ansible options with `ANSIBLE_OPTIONS=` (default: `--forks 5`). cd .. && \ molecule test --scenario-name $(MOLECULE) -- $(ANSIBLE_OPTIONS) .PHONY: converge -converge: ## Execute molecule CONVERGE sequence. By default eos_cli_config_gen. Can be set with MOLECULE= +converge: ## Execute molecule "converge" sequence. Specify scenario name with `MOLECULE=` (default: `eos_cli_config_gen`) and Ansible options with `ANSIBLE_OPTIONS=` (default: `--forks 5`). cd .. && \ molecule converge --scenario-name $(MOLECULE) -- $(ANSIBLE_OPTIONS) .PHONY: refresh-facts -refresh-facts: ## Run all molecule scenarios +refresh-facts: ## Run all "eos_designs" and "eos_cli_config_gen" molecule scenarios. @while read -r MOLECULE_SCENARIO; do \ if [ -d "$$MOLECULE_SCENARIO" ]; then\ echo "Run scenario for "$$MOLECULE_SCENARIO && \ @@ -30,27 +30,3 @@ refresh-facts: ## Run all molecule scenarios cd ./molecule ; \ fi \ done FN=/mnt/flash/startup-config; LFN="`ls -1 $FN.*-* \| tail -n 1`"; if [ -z "$LFN" -o -n "`diff -I 'last modified' $FN $LFN`" ]; then cp $FN $FN.`date +%Y%m%d-%H%M%S`; ls -1r $FN.*-* \| tail -n +11 \| xargs -I % rm %; fi | on-startup-config | -| evpn-blacklist-recovery | bash | FastCli -p 15 -c "clear bgp evpn host-flap" | on-logging | -| trigger-on-boot | bash | echo "on-boot" | on-boot | -| trigger-on-maintenance1 | bash | echo "on-maintenance" | on-maintenance | -| trigger-on-maintenance2 | bash | echo "on-maintenance" | on-maintenance | -| trigger-on-maintenance3 | bash | echo "on-maintenance" | on-maintenance | +| Handler | Actions | Trigger | Trigger Config | +| ------- | ------- | ------- | -------------- | +| CONFIG_VERSIONING | bash FN=/mnt/flash/startup-config; LFN="`ls -1 $FN.*-* \| tail -n 1`"; if [ -z "$LFN" -o -n "`diff -I 'last modified' $FN $LFN`" ]; then cp $FN $FN.`date +%Y%m%d-%H%M%S`; ls -1r $FN.*-* \| tail -n +11 \| xargs -I % rm %; fi | on-startup-config | - | +| trigger-on-boot | bash if [ 15 -gt 10 ]\nthen\n echo "a is greater than 10"\nfi
increment device health metric Metric1 | on-boot | - | +| trigger-on-counters | log | on-counters | poll interval 10
condition ( Arad*.IptCrcErrCnt.delta > 100 ) and ( Arad*.UcFifoFullDrop.delta > 100 )
granularity per-source | +| trigger-on-counters2 | - | on-counters | condition ( Arad*.IptCrcErrCnt.delta > 100 ) and ( Arad*.UcFifoFullDrop.delta > 100 )
granularity per-source | +| trigger-on-counters3 | - | on-counters | - | +| trigger-on-intf | - | on-intf | trigger on-intf Ethernet4 operstatus ip ip6 | +| trigger-on-intf2 | - | on-intf | - | +| trigger-on-logging | increment device health metric Metric2 | on-logging | poll interval 10
regex ab* | +| trigger-on-logging2 | - | on-logging | regex ab* | +| trigger-on-logging3 | - | on-logging | - | +| trigger-on-maintenance1 | - | on-maintenance | trigger on-maintenance enter interface Management3 after stage linkdown | +| trigger-on-maintenance2 | bash echo "on-maintenance" | on-maintenance | trigger on-maintenance exit unit unit1 before stage bgp | +| trigger-on-maintenance3 | bash echo "on-maintenance" | on-maintenance | trigger on-maintenance enter bgp 10.0.0.2 vrf vrf1 all | +| trigger-on-maintenance4 | - | on-maintenance | - | +| trigger-on-maintenance5 | - | on-maintenance | - | +| trigger-vm-tracer | bash echo "vm-tracer vm" | vm-tracer vm | - | #### Event Handler Device Configuration @@ -59,26 +69,65 @@ event-handler CONFIG_VERSIONING action bash FN=/mnt/flash/startup-config; LFN="`ls -1 $FN.*-* | tail -n 1`"; if [ -z "$LFN" -o -n "`diff -I 'last modified' $FN $LFN`" ]; then cp $FN $FN.`date +%Y%m%d-%H%M%S`; ls -1r $FN.*-* | tail -n +11 | xargs -I % rm %; fi delay 0 ! -event-handler evpn-blacklist-recovery - trigger on-logging - regex EVPN-3-BLACKLISTED_DUPLICATE_MAC - action bash FastCli -p 15 -c "clear bgp evpn host-flap" - delay 300 - asynchronous -! event-handler trigger-on-boot trigger on-boot - action bash echo "on-boot" + action bash + if [ 15 -gt 10 ] + then + echo "a is greater than 10" + fi + EOF + action increment device-health metric Metric1 +! +event-handler trigger-on-counters + trigger on-counters + poll interval 10 + condition ( Arad*.IptCrcErrCnt.delta > 100 ) and ( Arad*.UcFifoFullDrop.delta > 100 ) + granularity per-source + action log +! +event-handler trigger-on-counters2 + trigger on-counters + condition ( Arad*.IptCrcErrCnt.delta > 100 ) and ( Arad*.UcFifoFullDrop.delta > 100 ) + granularity per-source +! +event-handler trigger-on-counters3 + trigger on-counters +! +event-handler trigger-on-intf + trigger on-intf Ethernet4 operstatus ip ip6 +! +event-handler trigger-on-intf2 +! +event-handler trigger-on-logging + trigger on-logging + poll interval 10 + regex ab* + action increment device-health metric Metric2 +! +event-handler trigger-on-logging2 + trigger on-logging + regex ab* +! +event-handler trigger-on-logging3 + trigger on-logging ! event-handler trigger-on-maintenance1 trigger on-maintenance enter interface Management3 after stage linkdown - action bash echo "on-maintenance" ! event-handler trigger-on-maintenance2 - trigger on-maintenance enter unit unit1 before stage bgp + trigger on-maintenance exit unit unit1 before stage bgp action bash echo "on-maintenance" ! event-handler trigger-on-maintenance3 trigger on-maintenance enter bgp 10.0.0.2 vrf vrf1 all action bash echo "on-maintenance" +! +event-handler trigger-on-maintenance4 +! +event-handler trigger-on-maintenance5 +! +event-handler trigger-vm-tracer + trigger vm-tracer vm + action bash echo "vm-tracer vm" ``` diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/flow-tracking.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/flow-tracking.md index b7e25be2ac4..3fb992a1d8f 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/flow-tracking.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/flow-tracking.md @@ -5,7 +5,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - [Monitoring](#monitoring) - - [Flow Tracking](#flow-tracking) + - [Flow Tracking](#flow-tracking-1) - [Interfaces](#interfaces) - [DPS Interfaces](#dps-interfaces) - [Ethernet Interfaces](#ethernet-interfaces) diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/generate-default-config.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/generate-default-config.md index 895fed56ca2..2d1d4143ad4 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/generate-default-config.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/generate-default-config.md @@ -2,4 +2,3 @@ ## Table of Contents - diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/hardware-counter.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/hardware-counter.md index 7c12330fb22..259762f1333 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/hardware-counter.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/hardware-counter.md @@ -43,7 +43,7 @@ interface Management1 ##### Hardware Counter Features -**NOTE:** Not all options (columns) in the table below are compatible with every available feature, it is the user responsability to configure valid options for each feature. +**NOTE:** Not all options (columns) in the table below are compatible with every available feature, it is the user responsibility to configure valid options for each feature. | Feature | Flow Direction | Address Type | Layer3 | VRF | Prefix | Units Packets | | ------- | -------------- | ------------ | ------ | --- | ------ | ------------- | @@ -54,6 +54,7 @@ interface Management1 | mpls lfib | - | - | - | - | - | True | | route | - | ipv4 | test | - | 192.168.0.0/24 | - | | route | - | ipv6 | - | - | 2001:db8:cafe::/64 | - | +| segment-security | in | - | - | - | - | - | #### Hardware Counters Device Configuration @@ -66,4 +67,5 @@ hardware counter feature ip out layer3 units packets hardware counter feature mpls lfib units packets hardware counter feature route ipv4 vrf test 192.168.0.0/24 hardware counter feature route ipv6 2001:db8:cafe::/64 +hardware counter feature segment-security in ``` diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/hide-passwords.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/hide-passwords.md index e88d52e3a62..5a1c15a0028 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/hide-passwords.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/hide-passwords.md @@ -144,7 +144,7 @@ ASN Notation: asplain | Neighbor | Remote AS | VRF | Shutdown | Send-community | Maximum-routes | Allowas-in | BFD | RIB Pre-Policy Retain | Route-Reflector Client | Passive | TTL Max Hops | | -------- | --------- | --- | -------- | -------------- | -------------- | ---------- | --- | --------------------- | ---------------------- | ------- | ------------ | -| 10.50.2.1 | 65000 | BLAH | - | - | - | - | - | - | - | - | +| 10.50.2.1 | 65000 | BLAH | - | - | - | - | - | - | - | - | - | #### Router BGP VRFs diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/interface-defaults.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/interface-defaults.md index ba33b4b8022..be9208a9e81 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/interface-defaults.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/interface-defaults.md @@ -6,7 +6,7 @@ - [Management Interfaces](#management-interfaces) - [Interfaces](#interfaces) - [Switchport Default](#switchport-default) - - [Interface Defaults](#interface-defaults) + - [Interface Defaults](#interface-defaults-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/interface-profiles.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/interface-profiles.md index ab0c8700389..555fbdc0ef3 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/interface-profiles.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/interface-profiles.md @@ -5,7 +5,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - [Interfaces](#interfaces) - - [Interface Profiles](#interface-profiles) + - [Interface Profiles](#interface-profiles-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ip-access-lists.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ip-access-lists.md index 18417c27484..39e699f287c 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ip-access-lists.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ip-access-lists.md @@ -5,7 +5,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - [ACL](#acl) - - [IP Access-lists](#ip-access-lists) + - [IP Access-lists](#ip-access-lists-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ip-client-source-interfaces.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ip-client-source-interfaces.md index 11ae8ebea0d..728a910ad4c 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ip-client-source-interfaces.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ip-client-source-interfaces.md @@ -4,7 +4,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - - [IP Client Source Interfaces](#ip-client-source-interfaces) + - [IP Client Source Interfaces](#ip-client-source-interfaces-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ip-community-lists.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ip-community-lists.md index 292d6565f1c..bc0bcb7e7c9 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ip-community-lists.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ip-community-lists.md @@ -6,7 +6,7 @@ - [Management Interfaces](#management-interfaces) - [Filters](#filters) - [Community-lists](#community-lists) - - [IP Community-lists](#ip-community-lists) + - [IP Community-lists](#ip-community-lists-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ip-dhcp-relay.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ip-dhcp-relay.md index 72ea7e891db..19c4ee97a7e 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ip-dhcp-relay.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ip-dhcp-relay.md @@ -4,8 +4,8 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) -- [IP DHCP Relay](#ip-dhcp-relay) - - [IP DHCP Relay](#ip-dhcp-relay-1) +- [IP DHCP Relay](#ip-dhcp-relay-1) + - [IP DHCP Relay Summary](#ip-dhcp-relay-summary) - [IP DHCP Relay Device Configuration](#ip-dhcp-relay-device-configuration) ## Management @@ -38,13 +38,19 @@ interface Management1 ## IP DHCP Relay -### IP DHCP Relay +### IP DHCP Relay Summary IP DHCP Relay Option 82 is enabled. +DhcpRelay Agent is in always-on mode. + +Forwarding requests with secondary IP addresses in the "giaddr" field is allowed. + ### IP DHCP Relay Device Configuration ```eos ! ip dhcp relay information option +ip dhcp relay always-on +ip dhcp relay all-subnets default ``` diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ip-dhcp-snooping.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ip-dhcp-snooping.md index c753df6916d..f1cd093dc49 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ip-dhcp-snooping.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ip-dhcp-snooping.md @@ -4,7 +4,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) -- [IP DHCP Snooping](#ip-dhcp-snooping) +- [IP DHCP Snooping](#ip-dhcp-snooping-1) - [IP DHCP Snooping Device Configuration](#ip-dhcp-snooping-device-configuration) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ip-extended-community-lists.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ip-extended-community-lists.md index 3640ef302b3..03b2a28122a 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ip-extended-community-lists.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ip-extended-community-lists.md @@ -5,7 +5,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - [Filters](#filters) - - [IP Extended Community Lists](#ip-extended-community-lists) + - [IP Extended Community Lists](#ip-extended-community-lists-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ip-nat.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ip-nat.md index 045e743ef5e..4bae4e89ce0 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ip-nat.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ip-nat.md @@ -4,7 +4,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) -- [IP NAT](#ip-nat) +- [IP NAT](#ip-nat-1) - [NAT Profiles](#nat-profiles) - [NAT Pools](#nat-pools) - [NAT Synchronization](#nat-synchronization) @@ -84,7 +84,7 @@ interface Management1 | --------- | ----------- | ------------- | ----------- | ------------- | --------------- | -------- | ----- | -------- | ------- | | - | 1.0.0.1 | - | - | 2.0.0.1 | - | - | - | 0 | - | | - | 1.0.0.2 | 22 | - | 2.0.0.2 | - | - | - | 0 | - | -| - | 1.0.0.3 | 22 | - | 2.0.0.3 | 23 | - | - | 0 | - | +| - | 1.0.0.2 | 23 | - | 2.0.0.3 | 23 | - | - | 0 | - | | - | 1.0.0.4 | 22 | - | 2.0.0.4 | 23 | udp | - | 0 | - | | - | 1.0.0.5 | 22 | - | 2.0.0.5 | 23 | tcp | 1 | 0 | - | | - | 1.0.0.6 | 22 | - | 2.0.0.6 | 23 | tcp | 2 | 5 | Comment Test | @@ -108,51 +108,20 @@ NAT profile VRF is: TEST ### NAT Pools -#### Pool: prefix_16 - -| Setting | Value | -| -------- | ----- | -| Pool Prefix Length | 16 | -| Pool Utilization Threshold | 1 % (action: log) | - -##### Pool Ranges - -| First IP Address | Last IP Address | First Port | Last Port | -| ----------------- | --------------- | ---------- | --------- | -| 10.0.0.1 | 10.0.255.254 | - | - | -| 10.1.0.0 | 10.1.255.255 | 1024 | 65535 | - -#### Pool: prefix_32 - -| Setting | Value | -| -------- | ----- | -| Pool Prefix Length | 32 | - -##### Pool Ranges - -| First IP Address | Last IP Address | First Port | Last Port | -| ----------------- | --------------- | ---------- | --------- | -| 10.2.0.1 | 10.2.0.1 | - | - | - -#### Pool: prefix_24 - -| Setting | Value | -| -------- | ----- | -| Pool Prefix Length | 24 | -| Pool Utilization Threshold | 100 % (action: log) | - -##### Pool Ranges - -| First IP Address | Last IP Address | First Port | Last Port | -| ----------------- | --------------- | ---------- | --------- | -| 10.3.0.1 | 10.3.0.254 | - | - | -| 10.3.1.0 | 10.3.1.255 | 1024 | 65535 | +| Pool Name | Pool Type | Prefix Length | Utilization Log Threshold | First-Last IP Addresses | First-Last Ports | +| --------- | --------- | ------------- | ------------------------- | ----------------------- | ---------------- | +| port_only_1 | port-only | - | - | - | - | +| port_only_2 | port-only | - | - | - | 10-15
1024-65535 | +| prefix_16 | ip-port | 16 | 91 | 10.0.0.1-10.0.255.254
10.1.0.0-10.1.255.255 | -
1024-65535 | +| prefix_21 | ip-port | 21 | - | - | - | +| prefix_24 | ip-port | 24 | 100 | - | - | +| prefix_32 | ip-port | 32 | - | 10.2.0.1-10.2.0.1
10.2.0.2-10.2.0.3 | 1024-65535
- | ### NAT Synchronization | Setting | Value | | -------- | ----- | -| State | Disabled ! +| State | Disabled | | Expiry Interval | 60 Seconds | | Interface | Ethernet1 | | Peer IP Address | 1.1.1.1 | @@ -213,7 +182,7 @@ ip nat profile NAT-PROFILE-NO-VRF-2 ip nat source dynamic access-list ACL19 pool POOL19 full-cone priority 10 comment Priority_10 ip nat destination static 1.0.0.1 2.0.0.1 ip nat destination static 1.0.0.2 22 2.0.0.2 - ip nat destination static 1.0.0.3 22 2.0.0.3 23 + ip nat destination static 1.0.0.2 23 2.0.0.3 23 ip nat destination static 1.0.0.4 22 2.0.0.4 23 protocol udp ip nat destination static 1.0.0.5 22 2.0.0.5 23 protocol tcp group 1 ip nat destination static 1.0.0.6 22 2.0.0.6 23 protocol tcp group 2 comment Comment Test @@ -231,13 +200,17 @@ ip nat profile NAT-PROFILE-TEST-VRF vrf NAT-PROFILE-TEST-VRF ip nat pool prefix_16 prefix-length 16 range 10.0.0.1 10.0.255.254 range 10.1.0.0 10.1.255.255 1024 65535 - utilization threshold 1 action log -ip nat pool prefix_32 prefix-length 32 - range 10.2.0.1 10.2.0.1 + utilization threshold 91 action log +ip nat pool prefix_21 prefix-length 21 ip nat pool prefix_24 prefix-length 24 - range 10.3.0.1 10.3.0.254 - range 10.3.1.0 10.3.1.255 1024 65535 utilization threshold 100 action log +ip nat pool prefix_32 prefix-length 32 + range 10.2.0.1 10.2.0.1 1024 65535 + range 10.2.0.2 10.2.0.3 +ip nat pool port_only_1 port-only +ip nat pool port_only_2 port-only + port range 10 15 + port range 1024 65535 ip nat synchronization description test sync config expiry-interval 60 diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ip-routing.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ip-routing.md index 3d5ab8b4fff..374d86fdbd3 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ip-routing.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ip-routing.md @@ -5,7 +5,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - [Routing](#routing) - - [IP Routing](#ip-routing) + - [IP Routing](#ip-routing-1) - [IPv6 Routing](#ipv6-routing) - [VRF Instances](#vrf-instances) - [VRF Instances Summary](#vrf-instances-summary) diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ip-security.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ip-security.md index a2623a3e4e9..5eb3e366b14 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ip-security.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ip-security.md @@ -4,7 +4,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) -- [IP Security](#ip-security) +- [IP Security](#ip-security-1) - [IKE policies](#ike-policies) - [Security Association policies](#security-association-policies) - [IPSec profiles](#ipsec-profiles) @@ -54,11 +54,11 @@ interface Management1 ### Security Association policies -| Policy name | ESP Integrity | ESP Encryption | PFS DH Group | -| ----------- | ------------- | -------------- | ------------ | -| SA-1 | - | aes128 | 14 | -| SA-2 | - | aes128 | 14 | -| SA-3 | disabled | disabled | 17 | +| Policy name | ESP Integrity | ESP Encryption | Lifetime | PFS DH Group | +| ----------- | ------------- | -------------- | -------- | ------------ | +| SA-1 | - | aes128 | - | 14 | +| SA-2 | - | aes128 | 42 gigabytes | 14 | +| SA-3 | disabled | disabled | 8 hours | 17 | ### IPSec profiles @@ -100,11 +100,13 @@ ip security ! sa policy SA-2 esp encryption aes128 + sa lifetime 42 gigabytes pfs dh-group 14 ! sa policy SA-3 esp integrity null esp encryption null + sa lifetime 8 hours pfs dh-group 17 ! profile Profile-1 diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ipv6-dhcp-relay.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ipv6-dhcp-relay.md new file mode 100644 index 00000000000..83c6f9146b4 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ipv6-dhcp-relay.md @@ -0,0 +1,59 @@ +# ipv6-dhcp-relay + +## Table of Contents + +- [Management](#management) + - [Management Interfaces](#management-interfaces) +- [IPv6 DHCP Relay](#ipv6-dhcp-relay-1) + - [IPv6 DHCP Relay Summary](#ipv6-dhcp-relay-summary) + - [IPv6 DHCP Relay Device Configuration](#ipv6-dhcp-relay-device-configuration) + +## Management + +### Management Interfaces + +#### Management Interfaces Summary + +##### IPv4 + +| Management Interface | Description | Type | VRF | IP Address | Gateway | +| -------------------- | ----------- | ---- | --- | ---------- | ------- | +| Management1 | oob_management | oob | MGMT | 10.73.255.122/24 | 10.73.255.2 | + +##### IPv6 + +| Management Interface | Description | Type | VRF | IPv6 Address | IPv6 Gateway | +| -------------------- | ----------- | ---- | --- | ------------ | ------------ | +| Management1 | oob_management | oob | MGMT | - | - | + +#### Management Interfaces Device Configuration + +```eos +! +interface Management1 + description oob_management + vrf MGMT + ip address 10.73.255.122/24 +``` + +## IPv6 DHCP Relay + +### IPv6 DHCP Relay Summary + +DhcpRelay Agent is in always-on mode. + +Forwarding requests with additional IPv6 addresses in the "giaddr" field is allowed. + +Add Option 79 - Link Layer Address Option. + +Add RemoteID option 37 in format MAC address and interface ID. + +### IPv6 DHCP Relay Device Configuration + +```eos +! +ipv6 dhcp relay always-on +ipv6 dhcp relay all-subnets default +ipv6 dhcp relay option link-layer address +ipv6 dhcp relay option remote-id format %m:%i +``` diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ipv6-neighbors.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ipv6-neighbors.md new file mode 100644 index 00000000000..84224034e3e --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ipv6-neighbors.md @@ -0,0 +1,58 @@ +# ipv6-neighbors + +## Table of Contents + +- [Management](#management) + - [Management Interfaces](#management-interfaces) +- [Routing](#routing) + - [IPv6 Neighbors](#ipv6-neighbors-1) + +## Management + +### Management Interfaces + +#### Management Interfaces Summary + +##### IPv4 + +| Management Interface | Description | Type | VRF | IP Address | Gateway | +| -------------------- | ----------- | ---- | --- | ---------- | ------- | +| Management1 | oob_management | oob | MGMT | 10.73.255.122/24 | 10.73.255.2 | + +##### IPv6 + +| Management Interface | Description | Type | VRF | IPv6 Address | IPv6 Gateway | +| -------------------- | ----------- | ---- | --- | ------------ | ------------ | +| Management1 | oob_management | oob | MGMT | - | - | + +#### Management Interfaces Device Configuration + +```eos +! +interface Management1 + description oob_management + vrf MGMT + ip address 10.73.255.122/24 +``` + +## Routing + +### IPv6 Neighbors + +IPv6 neighbor cache persistency is enabled. The refresh-delay is 1000 seconds after reboot. + +#### IPv6 Static Neighbors + +| VRF | IPv6 Address | Exit Interface | MAC Address | +| --- | ------------ | -------------- | ----------- | +| MGMT | 11:22:33:44:55:66:77:88 | Ethernet1 | 11:22:33:44:55:66 | +| - | ::ffff:192.1.56.10 | Loopback99 | aa:af:12:34:bc:bf | + +#### IPv6 Neighbor Configuration + +```eos +! +ipv6 neighbor persistent refresh-delay 1000 +ipv6 neighbor vrf MGMT 11:22:33:44:55:66:77:88 Ethernet1 11:22:33:44:55:66 +ipv6 neighbor ::ffff:192.1.56.10 Loopback99 aa:af:12:34:bc:bf +``` diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ipv6-static-routes.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ipv6-static-routes.md index 6ddd9fe5df8..ab085a4256c 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ipv6-static-routes.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ipv6-static-routes.md @@ -5,7 +5,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - [Routing](#routing) - - [IPv6 Static Routes](#ipv6-static-routes) + - [IPv6 Static Routes](#ipv6-static-routes-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/l2-protocol-forwarding.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/l2-protocol-forwarding.md index 673911b1376..0d3ee11f6d9 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/l2-protocol-forwarding.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/l2-protocol-forwarding.md @@ -4,7 +4,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) -- [L2 Protocol Forwarding](#l2-protocol-forwarding) +- [L2 Protocol Forwarding](#l2-protocol-forwarding-1) - [Forwarding Profiles](#forwarding-profiles) - [L2 Protocol Forwarding Device Configuration](#l2-protocol-forwarding-device-configuration) - [Interfaces](#interfaces) diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/lacp.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/lacp.md index 716c991e8b4..a30db9c7d83 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/lacp.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/lacp.md @@ -4,7 +4,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) -- [LACP](#lacp) +- [LACP](#lacp-1) - [LACP Summary](#lacp-summary) - [LACP Device Configuration](#lacp-device-configuration) diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/lldp.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/lldp.md index ef8e501e9af..62e47fa12b3 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/lldp.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/lldp.md @@ -4,7 +4,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) -- [LLDP](#lldp) +- [LLDP](#lldp-1) - [LLDP Summary](#lldp-summary) - [LLDP Device Configuration](#lldp-device-configuration) - [Interfaces](#interfaces) diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/local-users.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/local-users.md index 7d566d3cd7c..ff3427de457 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/local-users.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/local-users.md @@ -5,7 +5,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - [Authentication](#authentication) - - [Local Users](#local-users) + - [Local Users](#local-users-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/logging.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/logging.md index fd451c9f272..f8529b4f9f1 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/logging.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/logging.md @@ -5,7 +5,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - [Monitoring](#monitoring) - - [Logging](#logging) + - [Logging](#logging-1) ## Management @@ -65,10 +65,23 @@ interface Management1 | default | 20.20.20.7 | Default | UDP | | default | 50.50.50.7 | 100, 200 | TCP | | default | 60.60.60.7 | 100, 200 | UDP | +| default | 2001:db8::20:7 | Default | UDP | +| default | 2001:db8::50:7 | 100, 200 | TCP | +| default | 2001:db8::60:7 | 100, 200 | UDP | | mgt | 10.10.10.7 | Default | UDP | | mgt | 30.30.30.7 | 100, 200 | TCP | | mgt | 40.40.40.7 | 300, 400 | UDP | +| mgt | 2001:db8::10:7 | Default | UDP | +| mgt | 2001:db8::30:7 | 100, 200 | TCP | +| mgt | 2001:db8::40:7 | 300, 400 | UDP | | vrf_with_no_source_interface | 1.2.3.4 | Default | UDP | +| vrf_with_no_source_interface | 2001:db8::1:2:3:4 | Default | UDP | + +| Facility | Severity | +| -------- | -------- | +| AAA | warnings | +| ACL | critical | +| BGP | 0 | #### Logging Servers and Features Device Configuration @@ -83,12 +96,22 @@ logging synchronous level critical logging host 20.20.20.7 logging host 50.50.50.7 100 200 protocol tcp logging host 60.60.60.7 100 200 +logging host 2001:db8::20:7 +logging host 2001:db8::50:7 100 200 protocol tcp +logging host 2001:db8::60:7 100 200 logging vrf mgt host 10.10.10.7 logging vrf mgt host 30.30.30.7 100 200 protocol tcp logging vrf mgt host 40.40.40.7 300 400 +logging vrf mgt host 2001:db8::10:7 +logging vrf mgt host 2001:db8::30:7 100 200 protocol tcp +logging vrf mgt host 2001:db8::40:7 300 400 logging vrf vrf_with_no_source_interface host 1.2.3.4 +logging vrf vrf_with_no_source_interface host 2001:db8::1:2:3:4 logging format timestamp traditional year timezone logging format rfc5424 logging source-interface Loopback0 logging vrf mgt source-interface Management0 +logging level AAA warnings +logging level ACL critical +logging level BGP 0 ``` diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/loopbacks-interfaces.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/loopbacks-interfaces.md index 420a4382e71..e2bbe7d707e 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/loopbacks-interfaces.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/loopbacks-interfaces.md @@ -94,6 +94,7 @@ interface Loopback99 ipv6 enable ipv6 address 2002::CAFE/64 isis enable ISIS_TEST + isis bfd isis passive isis metric 100 isis network point-to-point diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/mac-access-lists.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/mac-access-lists.md index 95fc52c8818..7676823604a 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/mac-access-lists.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/mac-access-lists.md @@ -5,7 +5,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - [ACL](#acl) - - [MAC Access-lists](#mac-access-lists) + - [MAC Access-lists](#mac-access-lists-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/mac-address-table.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/mac-address-table.md index 9013945c226..b4acb4ea1d9 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/mac-address-table.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/mac-address-table.md @@ -4,7 +4,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) -- [MAC Address Table](#mac-address-table) +- [MAC Address Table](#mac-address-table-1) - [MAC Address Table Summary](#mac-address-table-summary) - [MAC Address Table Device Configuration](#mac-address-table-device-configuration) diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/mac-security-eth-po-entropy.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/mac-security-eth-po-entropy.md index a21c109b4d3..3d3dddeaf61 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/mac-security-eth-po-entropy.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/mac-security-eth-po-entropy.md @@ -49,7 +49,7 @@ interface Management1 | Settings | Value | | -------- | ----- | -| Entropy source | hardware | +| Entropy sources | hardware | | Common password encryption key | True | ### Management Security SSL Profiles @@ -140,9 +140,9 @@ FIPS restrictions enabled. ###### Settings -| Cipher | Key-Server Priority | Rekey-Period | SCI | -| ------ | ------------------- | ------------ | --- | -| aes128-gcm | 100 | 30 | True | +| Cipher | Key-Server Priority | Rekey-Period | SCI | Traffic Unprotected Fallback | +| ------ | ------------------- | ------------ | --- | ---------------------------- | +| aes128-gcm | 100 | 30 | True | allow | ###### Keys @@ -161,9 +161,9 @@ FIPS restrictions enabled. ###### Settings -| Cipher | Key-Server Priority | Rekey-Period | SCI | -| ------ | ------------------- | ------------ | --- | -| - | - | - | - | +| Cipher | Key-Server Priority | Rekey-Period | SCI | Traffic Unprotected Fallback | +| ------ | ------------------- | ------------ | --- | ---------------------------- | +| - | - | - | - | allow active-sak | ###### Keys @@ -175,9 +175,9 @@ FIPS restrictions enabled. ###### Settings -| Cipher | Key-Server Priority | Rekey-Period | SCI | -| ------ | ------------------- | ------------ | --- | -| aes256-gcm-xpn | - | - | - | +| Cipher | Key-Server Priority | Rekey-Period | SCI | Traffic Unprotected Fallback | +| ------ | ------------------- | ------------ | --- | ---------------------------- | +| aes256-gcm-xpn | - | - | - | drop | ###### Keys @@ -199,11 +199,14 @@ mac security key 1234c 7 fallback mka key-server priority 100 mka session rekey-period 30 + traffic unprotected allow sci l2-protocol lldp bypass unauthorized profile A2 key 1234b 7 + traffic unprotected allow active-sak profile A3 cipher aes256-gcm-xpn key ab 7 + traffic unprotected drop ``` diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/maintenance.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/maintenance.md index d3df8692344..13c56c1c1c4 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/maintenance.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/maintenance.md @@ -5,7 +5,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - [Maintenance Mode](#maintenance-mode) - - [Maintenance](#maintenance) + - [Maintenance](#maintenance-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/management-accounts.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/management-accounts.md index d6f9120b200..0bd9266d4bd 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/management-accounts.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/management-accounts.md @@ -4,7 +4,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - - [Management Accounts](#management-accounts) + - [Management Accounts](#management-accounts-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/management-api-http.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/management-api-http.md index 672993776cf..25485a3a7ae 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/management-api-http.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/management-api-http.md @@ -4,7 +4,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - - [Management API HTTP](#management-api-http) + - [Management API HTTP](#management-api-http-1) - [ACL](#acl) - [Standard Access-lists](#standard-access-lists) diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/management-api-models.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/management-api-models.md index 3fe614becb5..24e80fd1f0f 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/management-api-models.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/management-api-models.md @@ -4,7 +4,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - - [Management API Models](#management-api-models) + - [Management API Models](#management-api-models-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/management-console.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/management-console.md index ce526155426..95fa4fb36c2 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/management-console.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/management-console.md @@ -4,7 +4,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - - [Management Console](#management-console) + - [Management Console](#management-console-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/management-defaults.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/management-defaults.md index 297a7f02826..b2a83ac5b21 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/management-defaults.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/management-defaults.md @@ -5,7 +5,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - [Authentication](#authentication) - - [Management defaults](#management-defaults) + - [Management defaults](#management-defaults-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/management-interfaces.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/management-interfaces.md index c678b89c136..4f65bb1a942 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/management-interfaces.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/management-interfaces.md @@ -3,7 +3,7 @@ ## Table of Contents - [Management](#management) - - [Management Interfaces](#management-interfaces) + - [Management Interfaces](#management-interfaces-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/management-security.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/management-security.md index f6e6058f52f..7bd45ed9822 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/management-security.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/management-security.md @@ -4,7 +4,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) -- [Management Security](#management-security) +- [Management Security](#management-security-1) - [Management Security Summary](#management-security-summary) - [Management Security SSL Profiles](#management-security-ssl-profiles) - [SSL profile test1-chain-cert Certificates Summary](#ssl-profile-test1-chain-cert-certificates-summary) @@ -12,6 +12,7 @@ - [SSL profile test2-chain-cert Certificates Summary](#ssl-profile-test2-chain-cert-certificates-summary) - [SSL profile test2-trust-cert Certificates Summary](#ssl-profile-test2-trust-cert-certificates-summary) - [Password Policies](#password-policies) + - [Session Shared-secret Profiles](#session-shared-secret-profiles) - [Management Security Device Configuration](#management-security-device-configuration) ## Management @@ -48,7 +49,7 @@ interface Management1 | Settings | Value | | -------- | ----- | -| Entropy source | hardware | +| Entropy sources | hardware, haveged, cpu jitter, hardware exclusive | | Common password encryption key | True | | Reversible password encryption | aes-256-gcm | | Minimum password length | 17 | @@ -97,12 +98,34 @@ interface Management1 |-------------|--------|--------|-------------------|--------------------|-------------------|-----------------------|----------------------| | AVD_POLICY | > 1 | > 2 | > 3 | > 4 | > 5 | < 6 | < 7 | +### Session Shared-secret Profiles + +#### profile0 + +| Secret Name | Receive Lifetime | Transmit Lifetime | Timezone | +| ----------- | ---------------- | ----------------- | -------- | +| Secret1 | 12/20/2024 10:00:00 - 12/20/2025 10:00:00 | Infinite | Local Time | +| Secret2 | Infinite | Infinite | UTC | + +#### profile1 + +| Secret Name | Receive Lifetime | Transmit Lifetime | Timezone | +| ----------- | ---------------- | ----------------- | -------- | +| Secret3 | 2024-12-20 10:00:00 - 2025-12-20 10:00:00 | 12/20/2024 10:00:00 - 12/10/2025 10:00:00 | UTC | + +#### profile2 + +| Secret Name | Receive Lifetime | Transmit Lifetime | Timezone | +| ----------- | ---------------- | ----------------- | -------- | +| Secret4 | 2024-12-20 10:00:00 - 2025-12-20 10:00:00 | 2024-12-20 10:00:00 - 2025-12-20 10:00:00 | UTC | + ### Management Security Device Configuration ```eos ! management security - entropy source hardware + entropy source hardware haveged cpu jitter + entropy source hardware exclusive password encryption-key common password encryption reversible aes-256-gcm password minimum length 17 @@ -114,6 +137,16 @@ management security minimum upper 5 maximum repetitive 6 maximum sequential 7 + ! + session shared-secret profile profile0 + secret Secret1 7 receive-lifetime 12/20/2024 10:00:00 12/20/2025 10:00:00 transmit-lifetime infinite local-time + secret Secret2 7 receive-lifetime infinite transmit-lifetime infinite + ! + session shared-secret profile profile1 + secret Secret3 8a receive-lifetime 2024-12-20 10:00:00 2025-12-20 10:00:00 transmit-lifetime 12/20/2024 10:00:00 12/10/2025 10:00:00 + ! + session shared-secret profile profile2 + secret Secret4 0 receive-lifetime 2024-12-20 10:00:00 2025-12-20 10:00:00 transmit-lifetime 2024-12-20 10:00:00 2025-12-20 10:00:00 ssl profile certificate-profile certificate eAPI.crt key eAPI.key crl ca.crl diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/management-ssh.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/management-ssh.md index ed7f311484b..5d1f52b08a1 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/management-ssh.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/management-ssh.md @@ -4,7 +4,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - - [Management SSH](#management-ssh) + - [Management SSH](#management-ssh-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/management-tech-support.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/management-tech-support.md index 5f1eb00916b..81c12952547 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/management-tech-support.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/management-tech-support.md @@ -4,7 +4,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - - [Management Tech-Support](#management-tech-support) + - [Management Tech-Support](#management-tech-support-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/match-lists.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/match-lists.md index 90ba23b968e..3c874633d71 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/match-lists.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/match-lists.md @@ -5,7 +5,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - [Filters](#filters) - - [Match-lists](#match-lists) + - [Match-lists](#match-lists-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/monitor-connectivity.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/monitor-connectivity.md index 482df4f931e..578f001e15a 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/monitor-connectivity.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/monitor-connectivity.md @@ -4,7 +4,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) -- [Monitor Connectivity](#monitor-connectivity) +- [Monitor Connectivity](#monitor-connectivity-1) - [Global Configuration](#global-configuration) - [VRF Configuration](#vrf-configuration) - [Monitor Connectivity Device Configuration](#monitor-connectivity-device-configuration) @@ -50,21 +50,38 @@ interface Management1 #### Probing Configuration -| Enabled | Interval | Default Interface Set | -| ------- | -------- | --------------------- | -| True | 5 | GLOBAL_SET | +| Enabled | Interval | Default Interface Set | Address Only | +| ------- | -------- | --------------------- | ------------ | +| True | 5 | GLOBAL_SET | True | #### Host Parameters -| Host Name | Description | IPv4 Address | Probing Interface Set | URL | -| --------- | ----------- | ------------ | --------------------- | --- | -| server1 | server1_connectivity_monitor | 10.10.10.1 | HOST_SET | https://server1.local.com | +| Host Name | Description | IPv4 Address | Probing Interface Set | Address Only | URL | +| --------- | ----------- | ------------ | --------------------- | ------------ | --- | +| server1 | server1_connectivity_monitor | 10.10.10.1 | HOST_SET | True | https://server1.local.com | +| server2 | server2_connectivity_monitor | 10.10.10.2 | HOST_SET | True | https://server2.local.com | +| server3 | server3_connectivity_monitor | 10.10.10.3 | HOST_SET | False | - | ### VRF Configuration -| Name | Description | Default Interface Set | -| ---- | ----------- | --------------------- | -| red | vrf_connectivity_monitor | VRF_GLOBAL_SET | +| Name | Description | Default Interface Set | Address Only | +| ---- | ----------- | --------------------- | ------------ | +| blue | - | VRF_GLOBAL_SET | False | +| red | vrf_connectivity_monitor | VRF_GLOBAL_SET | True | + +#### Vrf blue Configuration + +##### Interface Sets + +| Name | Interfaces | +| ---- | ---------- | +| VRF_GLOBAL_SET | Vlan21-24, Vlan29-32 | + +##### Host Parameters + +| Host Name | Description | IPv4 Address | Probing Interface Set | Address Only | URL | +| --------- | ----------- | ------------ | --------------------- | ------------ | --- | +| server4 | server4_connectivity_monitor | 10.10.20.1 | VRF_HOST_SET | False | https://server2.local.com | #### Vrf red Configuration @@ -77,9 +94,9 @@ interface Management1 ##### Host Parameters -| Host Name | Description | IPv4 Address | Probing Interface Set | URL | -| --------- | ----------- | ------------ | --------------------- | --- | -| server2 | server2_connectivity_monitor | 10.10.20.1 | VRF_HOST_SET | https://server2.local.com | +| Host Name | Description | IPv4 Address | Probing Interface Set | Address Only | URL | +| --------- | ----------- | ------------ | --------------------- | ------------ | --- | +| server2 | server2_connectivity_monitor | 10.10.20.1 | VRF_HOST_SET | True | https://server2.local.com | ### Monitor Connectivity Device Configuration @@ -98,6 +115,29 @@ monitor connectivity local-interfaces HOST_SET address-only ip 10.10.10.1 url https://server1.local.com + ! + host server2 + description + server2_connectivity_monitor + local-interfaces HOST_SET address-only + ip 10.10.10.2 + url https://server2.local.com + ! + host server3 + description + server3_connectivity_monitor + local-interfaces HOST_SET + ip 10.10.10.3 + vrf blue + interface set VRF_GLOBAL_SET Vlan21-24, Vlan29-32 + local-interfaces VRF_GLOBAL_SET default + ! + host server4 + description + server4_connectivity_monitor + local-interfaces VRF_HOST_SET + ip 10.10.20.1 + url https://server2.local.com vrf red interface set VRF_GLOBAL_SET Vlan21-24, Vlan29-32 interface set VRF_HOST_SET Loopback12-14, 19-23 diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/monitor-layer1.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/monitor-layer1.md index f4840d5148f..dcd3af21ff3 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/monitor-layer1.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/monitor-layer1.md @@ -40,6 +40,7 @@ interface Management1 | Layer 1 Event | Logging | | ------------- | ------- | | MAC fault | True | +| Logging Transceiver | True | | Transceiver DOM | True | | Transceiver communication | True | @@ -48,6 +49,7 @@ interface Management1 ```eos ! monitor layer1 + logging transceiver logging transceiver dom logging transceiver communication logging mac fault diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/monitor-sessions.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/monitor-sessions.md index 86f6982f88a..8e5158793af 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/monitor-sessions.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/monitor-sessions.md @@ -5,7 +5,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - [Monitoring](#monitoring) - - [Monitor Sessions](#monitor-sessions) + - [Monitor Sessions](#monitor-sessions-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/monitor-telemetry-influx.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/monitor-telemetry-influx.md new file mode 100644 index 00000000000..221109f3352 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/monitor-telemetry-influx.md @@ -0,0 +1,95 @@ +# monitor-telemetry-influx + +## Table of Contents + +- [Management](#management) + - [Management Interfaces](#management-interfaces) +- [InfluxDB Telemetry](#influxdb-telemetry) + - [InfluxDB Telemetry Summary](#influxdb-telemetry-summary) + - [InfluxDB Telemetry Device Configuration](#influxdb-telemetry-device-configuration) + +## Management + +### Management Interfaces + +#### Management Interfaces Summary + +##### IPv4 + +| Management Interface | Description | Type | VRF | IP Address | Gateway | +| -------------------- | ----------- | ---- | --- | ---------- | ------- | +| Management1 | oob_management | oob | MGMT | 10.73.255.122/24 | 10.73.255.2 | + +##### IPv6 + +| Management Interface | Description | Type | VRF | IPv6 Address | IPv6 Gateway | +| -------------------- | ----------- | ---- | --- | ------------ | ------------ | +| Management1 | oob_management | oob | MGMT | - | - | + +#### Management Interfaces Device Configuration + +```eos +! +interface Management1 + description oob_management + vrf MGMT + ip address 10.73.255.122/24 +``` + +## InfluxDB Telemetry + +### InfluxDB Telemetry Summary + +Source Group Standard Disabled : True + +#### InfluxDB Telemetry Destinations + +| Destination | Database | URL | VRF | Username | +| ----------- | -------- | --- | --- | -------- | +| test | test | https://influx_test.localhost | test | test | +| test1 | test1 | https://influx_test1.localhost | test | test1 | + +#### InfluxDB Telemetry Sources + +| Source Name | URL | Connection Limit | +| ----------- | --- | ---------------- | +| socket1 | unix:///var/run/example2.sock | 100 | +| socket2 | unix:///var/run/example3.sock | 22222 | + +#### InfluxDB Telemetry Tags + +| Tag | Value | +| --- | ----- | +| tag1 | value1 | +| tag2 | value2 | + +### InfluxDB Telemetry Device Configuration + +```eos +! +monitor telemetry influx + destination influxdb test + url https://influx_test.localhost + database name test + retention policy test + vrf test + username test password 7 + ! + destination influxdb test1 + url https://influx_test1.localhost + database name test1 + retention policy test1 + vrf test + username test1 password 7 + ! + source socket socket1 + url unix:///var/run/example2.sock + connection limit 100 + ! + source socket socket2 + url unix:///var/run/example3.sock + connection limit 22222 + tag global tag1 value1 + tag global tag2 value2 + source group standard disabled +``` diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/monitor-telemetry-postcard-policy.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/monitor-telemetry-postcard-policy.md new file mode 100644 index 00000000000..fe17f700690 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/monitor-telemetry-postcard-policy.md @@ -0,0 +1,104 @@ +# monitor-telemetry-postcard-policy + +## Table of Contents + +- [Management](#management) + - [Management Interfaces](#management-interfaces) +- [Monitoring](#monitoring) + - [Monitor Telemetry Postcard Policy](#monitor-telemetry-postcard-policy-1) + +## Management + +### Management Interfaces + +#### Management Interfaces Summary + +##### IPv4 + +| Management Interface | Description | Type | VRF | IP Address | Gateway | +| -------------------- | ----------- | ---- | --- | ---------- | ------- | +| Management1 | oob_management | oob | MGMT | 10.73.255.122/24 | 10.73.255.2 | + +##### IPv6 + +| Management Interface | Description | Type | VRF | IPv6 Address | IPv6 Gateway | +| -------------------- | ----------- | ---- | --- | ------------ | ------------ | +| Management1 | oob_management | oob | MGMT | - | - | + +#### Management Interfaces Device Configuration + +```eos +! +interface Management1 + description oob_management + vrf MGMT + ip address 10.73.255.122/24 +``` + +## Monitoring + +### Monitor Telemetry Postcard Policy + +#### Sample Policy Summary + +##### samplepo1 + +###### Match rules + +| Rule Name | Rule Type | Source Prefix | Destination Prefix | Protocol | Source Ports | Destination Ports | +| --------- | --------- | ------------- | ------------------ | -------- | ------------ | ----------------- | +| rule1 | ipv4 | 3.4.5.0/24 | 10.3.3.0/24 | tcp
udp | -
98 | 77, 78-80, 82
99 | +| rule2 | ipv6 | 5::0/128 | 4::0/128 | udp | - | 747, 748-800 | +| rule3 | ipv4 | - | - | - | - | - | + +##### samplepo2 + +###### Match rules + +| Rule Name | Rule Type | Source Prefix | Destination Prefix | Protocol | Source Ports | Destination Ports | +| --------- | --------- | ------------- | ------------------ | -------- | ------------ | ----------------- | +| rule1 | ipv4 | 3.4.5.0/24 | 10.3.3.0/24 | udp | bgp | https | + +#### Telemetry Postcard Policy Profiles + +| Profile Name | Ingress Sample Policy | +| ------------ | --------------------- | +| profile1 | samplepo1 | +| profile2 | samplepo2 | + +#### Monitor Telemetry Postcard Policy Configuration + +```eos +! +monitor telemetry postcard policy + no disabled + ingress sample rate 16384 + marker vxlan header word 0 bit 30 + ingress collection gre source 10.3.3.3 destination 10.3.3.4 version 2 + ! + sample policy samplepo1 + match rule1 ipv4 + source prefix 3.4.5.0/24 + destination prefix 10.3.3.0/24 + protocol tcp destination port 77, 78-80, 82 + protocol udp source port 98 destination port 99 + ! + match rule2 ipv6 + source prefix 5::0/128 + destination prefix 4::0/128 + protocol udp destination port 747, 748-800 + ! + match rule3 ipv4 + ! + sample policy samplepo2 + match rule1 ipv4 + source prefix 3.4.5.0/24 + destination prefix 10.3.3.0/24 + protocol udp source port bgp destination port https + ! + profile profile1 + ingress sample policy samplepo1 + ! + profile profile2 + ingress sample policy samplepo2 +``` diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/mpls.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/mpls.md index 352b769f76d..77871dff042 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/mpls.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/mpls.md @@ -7,7 +7,7 @@ - [Interfaces](#interfaces) - [Ethernet Interfaces](#ethernet-interfaces) - [Loopback Interfaces](#loopback-interfaces) -- [MPLS](#mpls) +- [MPLS](#mpls-1) - [MPLS and LDP](#mpls-and-ldp) - [MPLS Interfaces](#mpls-interfaces) diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ntp.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ntp.md index a76e622d894..e3862cec77c 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ntp.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ntp.md @@ -4,7 +4,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - - [NTP](#ntp) + - [NTP](#ntp-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/object-tracking.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/object-tracking.md index 5d18f58537e..808096ca195 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/object-tracking.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/object-tracking.md @@ -5,7 +5,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - [Monitoring](#monitoring) - - [Object Tracking](#object-tracking) + - [Object Tracking](#object-tracking-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/patch-panel.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/patch-panel.md index a2bc184ad2a..0ecf9a779e5 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/patch-panel.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/patch-panel.md @@ -4,7 +4,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) -- [Patch Panel](#patch-panel) +- [Patch Panel](#patch-panel-1) - [Patch Panel Summary](#patch-panel-summary) - [Patch Panel Device Configuration](#patch-panel-device-configuration) @@ -40,6 +40,12 @@ interface Management1 ### Patch Panel Summary +Patch Panel Connector Interface Recovery Review Delay Min: 10s - Max: 900s + +Patch Panel Connector Interface Path BGP VPWS Remote Failure Errdisable is enabled. + +#### Patch Panel Connections + | Patch Name | Enabled | Connector A Type | Connector A Endpoint | Connector B Type | Connector B Endpoint | | ---------- | ------- | ---------------- | -------------------- | ---------------- | -------------------- | | TEN_B_site2_site5_eline | True | Interface | Ethernet5 | Pseudowire | bgp vpws TENANT_A pseudowire TEN_B_site2_site5_eline | @@ -50,6 +56,9 @@ interface Management1 ```eos ! patch panel + connector interface recovery review delay 10 900 + connector interface patch bgp vpws remote-failure errdisable + ! patch TEN_B_site2_site5_eline connector 1 interface Ethernet5 connector 2 pseudowire bgp vpws TENANT_A pseudowire TEN_B_site2_site5_eline diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/peer-filters.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/peer-filters.md index aff01b1a297..0464da47435 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/peer-filters.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/peer-filters.md @@ -5,7 +5,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - [Filters](#filters) - - [Peer Filters](#peer-filters) + - [Peer Filters](#peer-filters-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/platform.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/platform.md index 3a4cffbec1a..918715dc75c 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/platform.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/platform.md @@ -4,7 +4,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) -- [Platform](#platform) +- [Platform](#platform-1) - [Platform Summary](#platform-summary) - [Platform Device Configuration](#platform-device-configuration) diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/policy-maps.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/policy-maps.md index cdc65a8d6cb..d0b84faa583 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/policy-maps.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/policy-maps.md @@ -8,6 +8,7 @@ - [PBR Policy Maps](#pbr-policy-maps) - [Quality Of Service](#quality-of-service) - [QOS Policy Maps](#qos-policy-maps) + - [Control-plane Policy Map](#control-plane-policy-map) ## Management @@ -113,3 +114,31 @@ policy-map type quality-of-service PM_REPLICATION_LD3 set cos 6 police rate 10000 bps burst-size 260 kbytes ``` + +### Control-plane Policy Map + +#### Control-plane Policy Map Summary + +##### copp-system-policy + +| Class | Shape | Bandwidth | Rate Unit | +| ----- | ----- | --------- | --------- | +| copp-system-aaa | - | - | - | +| copp-system-cvx | 2000 | 2000 | pps | +| copp-system-OspfIsis | 1000 | 1000 | kbps | + +#### COPP Policy Maps Device Configuration + +```eos +! +policy-map type copp copp-system-policy + class copp-system-OspfIsis + shape kbps 1000 + bandwidth kbps 1000 + ! + class copp-system-cvx + shape pps 2000 + bandwidth pps 2000 + ! + class copp-system-aaa +``` diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/port-channel-interfaces.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/port-channel-interfaces.md index e0302011c03..40d4b4778c0 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/port-channel-interfaces.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/port-channel-interfaces.md @@ -8,7 +8,7 @@ - [SFlow](#sflow) - [Interfaces](#interfaces) - [Ethernet Interfaces](#ethernet-interfaces) - - [Port-Channel Interfaces](#port-channel-interfaces) + - [Port-Channel Interfaces](#port-channel-interfaces-1) - [BFD](#bfd) - [BFD Interfaces](#bfd-interfaces) - [MPLS](#mpls) @@ -88,6 +88,12 @@ sFlow is disabled. *Inherited from Port-Channel Interface +##### Transceiver Settings + +| Interface | Transceiver Frequency | Media Override | +| --------- | --------------------- | -------------- | +| Ethernet5 | - | 100gbase-ar4 | + ##### Phone Interfaces | Interface | Mode | Native VLAN | Phone VLAN | Phone VLAN Mode | @@ -99,14 +105,16 @@ sFlow is disabled. | Interface | Description | Type | Channel Group | IP Address | VRF | MTU | Shutdown | ACL In | ACL Out | | --------- | ----------- | -----| ------------- | ---------- | ----| ---- | -------- | ------ | ------- | | Ethernet17 | LAG Member | *routed | 17 | *192.0.2.3/31 | **default | **- | **- | **- | **- | + *Inherited from Port-Channel Interface ##### ISIS -| Interface | Channel Group | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | -| Ethernet10/10 | 110 | *ISIS_TEST | *99 | *point-to-point | *level-2 | *True | *text | - *Inherited from Port-Channel Interface +| Interface | Channel Group | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Ethernet10/10 | 110 | *ISIS_TEST | True | *99 | *point-to-point | *level-2 | *True | *text | + +*Inherited from Port-Channel Interface ##### Error Correction Encoding Interfaces @@ -233,7 +241,7 @@ interface Ethernet50 | Port-Channel121 | access_port_with_no_vlans | switched | access | - | - | - | - | - | - | - | | Port-Channel122 | trunk_port_with_no_vlans | switched | trunk | - | - | - | - | - | - | - | | Port-Channel130 | IP NAT Testing | switched | access | - | - | - | - | - | - | - | -| Port-Channel131 | dot1q-tunnel mode | switched | dot1q-tunnel | - | - | - | - | - | - | - | +| Port-Channel131 | dot1q-tunnel mode | switched | dot1q-tunnel | 115 | - | - | - | - | - | - | ##### Encapsulation Dot1q @@ -265,7 +273,7 @@ interface Ethernet50 | Interface | From VLAN ID(s) | To VLAN ID | Direction | | --------- | --------------- | -----------| --------- | -| Port-Channel102 | 111-112 | 110 | out +| Port-Channel102 | 111-112 | 110 | out | ##### EVPN Multihoming @@ -337,9 +345,9 @@ interface Ethernet50 ##### ISIS -| Interface | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | -| Port-Channel110 | ISIS_TEST | 99 | point-to-point | level-2 | True | text | +| Interface | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Port-Channel110 | ISIS_TEST | True | 99 | point-to-point | level-2 | True | text | #### Port-Channel Interfaces Device Configuration @@ -586,6 +594,7 @@ interface Port-Channel110 description isis_interface_knobs no switchport isis enable ISIS_TEST + isis bfd isis circuit-type level-2 isis metric 99 isis network point-to-point @@ -705,6 +714,7 @@ interface Port-Channel130 interface Port-Channel131 description dot1q-tunnel mode switchport + switchport access vlan 115 switchport mode dot1q-tunnel ``` diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/prefix-lists.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/prefix-lists.md index b60e108f1ce..e11019e1c2c 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/prefix-lists.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/prefix-lists.md @@ -6,7 +6,7 @@ - [Management Interfaces](#management-interfaces) - [Filters](#filters) - [Dynamic Prefix-lists](#dynamic-prefix-lists) - - [Prefix-lists](#prefix-lists) + - [Prefix-lists](#prefix-lists-1) - [IPv6 Prefix-lists](#ipv6-prefix-lists) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ptp.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ptp.md index da440116b38..d5a9f5fa273 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ptp.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/ptp.md @@ -4,7 +4,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - - [PTP](#ptp) + - [PTP](#ptp-1) - [Interfaces](#interfaces) - [Ethernet Interfaces](#ethernet-interfaces) - [Port-Channel Interfaces](#port-channel-interfaces) @@ -150,6 +150,7 @@ interface Port-Channel5 switchport mode trunk mlag 5 ptp enable + ptp mpass ptp delay-mechanism e2e ptp sync-message interval 1 ptp role dynamic diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/qos.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/qos.md index c3cfda76966..7f2fd8751d7 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/qos.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/qos.md @@ -11,7 +11,7 @@ - [Extended Access-lists](#extended-access-lists) - [IPv6 Extended Access-lists](#ipv6-extended-access-lists) - [Quality Of Service](#quality-of-service) - - [QOS](#qos) + - [QOS](#qos-1) - [QOS Class Maps](#qos-class-maps) - [QOS Policy Maps](#qos-policy-maps) - [QOS Profiles](#qos-profiles) @@ -481,9 +481,9 @@ Priority Flow Control is **enabled**. | 2 | All | 2 | 2 kbytes | 200 kbytes | 50 | 10 | | 3 | All | - | - | - | - | - | | 4 | All | - | 1 kbytes | 10 kbytes | 90 | - | -| 1 | Multicast | - | - | - | - | -| 2 | Multicast | - | - | - | - | -| 4 | Multicast | - | - | - | - | +| 1 | Multicast | - | - | - | - | - | +| 2 | Multicast | - | - | - | - | - | +| 4 | Multicast | - | - | - | - | - | ##### QOS Profile: **wred_uc_queues_test** diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/queue-monitor-length.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/queue-monitor-length.md index 4210a73b6fe..3c320c99e2c 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/queue-monitor-length.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/queue-monitor-length.md @@ -5,7 +5,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - [Queue Monitor](#queue-monitor) - - [Queue Monitor Length](#queue-monitor-length) + - [Queue Monitor Length](#queue-monitor-length-1) - [Queue Monitor Configuration](#queue-monitor-configuration) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/queue-monitor-streaming.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/queue-monitor-streaming.md index 03b2f47c525..94e66de07e4 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/queue-monitor-streaming.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/queue-monitor-streaming.md @@ -5,7 +5,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - [Queue Monitor](#queue-monitor) - - [Queue Monitor Streaming](#queue-monitor-streaming) + - [Queue Monitor Streaming](#queue-monitor-streaming-1) - [Queue Monitor Configuration](#queue-monitor-configuration) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/queue_monitor_length.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/queue_monitor_length.md deleted file mode 100644 index 191bffeb971..00000000000 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/queue_monitor_length.md +++ /dev/null @@ -1,64 +0,0 @@ -# queue_monitor_length - -## Table of Contents - -- [Management](#management) - - [Management Interfaces](#management-interfaces) -- [Queue Monitor](#queue-monitor) - - [Queue Monitor Length](#queue-monitor-length) - - [Queue Monitor Configuration](#queue-monitor-configuration) - -## Management - -### Management Interfaces - -#### Management Interfaces Summary - -##### IPv4 - -| Management Interface | description | Type | VRF | IP Address | Gateway | -| -------------------- | ----------- | ---- | --- | ---------- | ------- | -| Management1 | oob_management | oob | MGMT | 10.73.255.122/24 | 10.73.255.2 | - -##### IPv6 - -| Management Interface | description | Type | VRF | IPv6 Address | IPv6 Gateway | -| -------------------- | ----------- | ---- | --- | ------------ | ------------ | -| Management1 | oob_management | oob | MGMT | - | - | - -#### Management Interfaces Device Configuration - -```eos -! -interface Management1 - description oob_management - vrf MGMT - ip address 10.73.255.122/24 -``` - -## Queue Monitor - -### Queue Monitor Length - -| Setting | Value | -| ------- | ----- | -| Enabled | True -| Logging Interval | 100 | -| Default Thresholds High | 100 | -| Default Thresholds Low | 10 | -| Notifying | enabled | -| TX Latency | enabled | -| CPU Thresholds High | 200000 | -| CPU Thresholds Low | 100000 | - -### Queue Monitor Configuration - -```eos -! -queue-monitor length -queue-monitor length default thresholds 100 10 -queue-monitor length log 100 -queue-monitor length notifying -queue-monitor length tx-latency -queue-monitor length cpu thresholds 200000 100000 -``` diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/queue_monitor_length_notifying.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/queue_monitor_length_notifying.md deleted file mode 100644 index 7b0b7cca9f3..00000000000 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/queue_monitor_length_notifying.md +++ /dev/null @@ -1,61 +0,0 @@ -# queue_monitor_length_notifying - -## Table of Contents - -- [Management](#management) - - [Management Interfaces](#management-interfaces) -- [Queue Monitor](#queue-monitor) - - [Queue Monitor Length](#queue-monitor-length) - - [Queue Monitor Configuration](#queue-monitor-configuration) - -## Management - -### Management Interfaces - -#### Management Interfaces Summary - -##### IPv4 - -| Management Interface | description | Type | VRF | IP Address | Gateway | -| -------------------- | ----------- | ---- | --- | ---------- | ------- | -| Management1 | oob_management | oob | MGMT | 10.73.255.122/24 | 10.73.255.2 | - -##### IPv6 - -| Management Interface | description | Type | VRF | IPv6 Address | IPv6 Gateway | -| -------------------- | ----------- | ---- | --- | ------------ | ------------ | -| Management1 | oob_management | oob | MGMT | - | - | - -#### Management Interfaces Device Configuration - -```eos -! -interface Management1 - description oob_management - vrf MGMT - ip address 10.73.255.122/24 -``` - -## Queue Monitor - -### Queue Monitor Length - -| Setting | Value | -| ------- | ----- | -| Enabled | True -| Logging Interval | - | -| Default Thresholds High | 100 | -| Default Thresholds Low | - | -| Notifying | disabled | -| TX Latency | disabled | -| CPU Thresholds High | - | -| CPU Thresholds Low | - | - -### Queue Monitor Configuration - -```eos -! -queue-monitor length -queue-monitor length default threshold 100 -no queue-monitor length notifying -``` diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/queue_monitor_streaming.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/queue_monitor_streaming.md deleted file mode 100644 index 58127e7a1ca..00000000000 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/queue_monitor_streaming.md +++ /dev/null @@ -1,57 +0,0 @@ -# queue_monitor_streaming - -## Table of Contents - -- [Management](#management) - - [Management Interfaces](#management-interfaces) -- [Queue Monitor](#queue-monitor) - - [Queue Monitor Streaming](#queue-monitor-streaming) - - [Queue Monitor Configuration](#queue-monitor-configuration) - -## Management - -### Management Interfaces - -#### Management Interfaces Summary - -##### IPv4 - -| Management Interface | description | Type | VRF | IP Address | Gateway | -| -------------------- | ----------- | ---- | --- | ---------- | ------- | -| Management1 | oob_management | oob | MGMT | 10.73.255.122/24 | 10.73.255.2 | - -##### IPv6 - -| Management Interface | description | Type | VRF | IPv6 Address | IPv6 Gateway | -| -------------------- | ----------- | ---- | --- | ------------ | ------------ | -| Management1 | oob_management | oob | MGMT | - | - | - -#### Management Interfaces Device Configuration - -```eos -! -interface Management1 - description oob_management - vrf MGMT - ip address 10.73.255.122/24 -``` - -## Queue Monitor - -### Queue Monitor Streaming - -| Enabled | IP Access Group | IPv6 Access Group | Max Connections | VRF | -| ------- | --------------- | ----------------- | --------------- | --- | -| True | ACL-QMS | ACLv6-QMS | 5 | test | - -### Queue Monitor Configuration - -```eos -! -queue-monitor streaming - max-connections 5 - ip access-group ACL-QMS - ipv6 access-group ACLv6-QMS - vrf test - no shutdown -``` diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/radius-server.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/radius-server.md index 708a34896f6..4168dc0c0eb 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/radius-server.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/radius-server.md @@ -5,7 +5,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - [Authentication](#authentication) - - [RADIUS Server](#radius-server) + - [RADIUS Server](#radius-server-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/roles.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/roles.md index 34477542c7a..ecb5a0c1e20 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/roles.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/roles.md @@ -5,7 +5,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - [Authentication](#authentication) - - [Roles](#roles) + - [Roles](#roles-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/route-maps.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/route-maps.md index d7c9c6be07a..6db29977e4d 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/route-maps.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/route-maps.md @@ -5,7 +5,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - [Filters](#filters) - - [Route-maps](#route-maps) + - [Route-maps](#route-maps-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-adaptive-virtual-topology.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-adaptive-virtual-topology.md index 8ff8b12f27c..ad6e8a77c2b 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-adaptive-virtual-topology.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-adaptive-virtual-topology.md @@ -5,7 +5,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - [Routing](#routing) - - [Router Adaptive Virtual Topology](#router-adaptive-virtual-topology) + - [Router Adaptive Virtual Topology](#router-adaptive-virtual-topology-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-base.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-base.md index f729fb9c54a..ab0c3cc2a14 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-base.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-base.md @@ -58,6 +58,7 @@ ASN Notation: asplain | update wait-install | | no bgp default ipv4-unicast | | no bgp default ipv4-unicast transport ipv6 | +| no bgp redistribute-internal | | distance bgp 20 200 200 | | maximum-paths 32 ecmp 32 | | bgp route-reflector preserve-attributes always | @@ -126,11 +127,11 @@ ASN Notation: asplain #### BGP Route Aggregation -| Prefix | AS Set | Advertise Map | Supress Map | Summary Only | Attribute Map | Match Map | Advertise Only | -| ------ | ------ | ------------- | ----------- | ------------ | ------------- | --------- | -------------- | -| 1.1.1.0/24 | False | - | - | False | - | - | True | -| 1.12.1.0/24 | True | ADV-MAP | SUP-MAP | True | RM-ATTRIBUTE | RM-MATCH | True | -| 2.2.1.0/24 | False | - | - | False | - | - | False | +| Prefix | AS Set | Summary Only | Attribute Map | Match Map | Advertise Only | +| ------ | ------ | ------------ | ------------- | --------- | -------------- | +| 1.1.1.0/24 | False | False | - | - | True | +| 1.12.1.0/24 | True | True | RM-ATTRIBUTE | RM-MATCH | True | +| 2.2.1.0/24 | False | False | - | - | False | #### Router BGP Session Trackers @@ -164,6 +165,8 @@ router bgp 65101 neighbor TEST ttl maximum-hops 42 neighbor test-link-bandwidth1 peer group neighbor test-link-bandwidth1 ttl maximum-hops 1 + neighbor test-link-bandwidth1 missing-policy address-family all include community-list prefix-list direction in action deny + neighbor test-link-bandwidth1 missing-policy address-family all include community-list direction out action permit neighbor test-link-bandwidth1 link-bandwidth default 100G neighbor test-link-bandwidth2 peer group neighbor test-link-bandwidth2 link-bandwidth @@ -189,10 +192,13 @@ router bgp 65101 neighbor 192.0.3.2 default-originate route-map RM-FOO-MATCH3 neighbor 192.0.3.2 send-community extended neighbor 192.0.3.2 maximum-routes 10000 + neighbor 192.0.3.2 missing-policy address-family all include community-list prefix-list direction in action deny + neighbor 192.0.3.2 missing-policy address-family all include community-list direction out action permit neighbor 192.0.3.2 link-bandwidth neighbor 192.0.3.3 remote-as 65434 neighbor 192.0.3.3 rib-in pre-policy retain neighbor 192.0.3.3 send-community standard + neighbor 192.0.3.3 missing-policy address-family all include community-list prefix-list sub-route-map direction in action deny neighbor 192.0.3.4 remote-as 65435 neighbor 192.0.3.4 ttl maximum-hops 1 no neighbor 192.0.3.4 rib-in pre-policy retain @@ -218,31 +224,53 @@ router bgp 65101 neighbor 192.0.3.9 peer group TEST neighbor 192.0.3.9 remote-as 65438 no neighbor 192.0.3.9 bfd + no bgp redistribute-internal aggregate-address 1.1.1.0/24 advertise-only - aggregate-address 1.12.1.0/24 as-set advertise-map ADV-MAP supress-map SUP-MAP summary-only attribute-map RM-ATTRIBUTE match-map RM-MATCH advertise-only + aggregate-address 1.12.1.0/24 as-set summary-only attribute-map RM-ATTRIBUTE match-map RM-MATCH advertise-only aggregate-address 2.2.1.0/24 redistribute bgp leaked route-map RM-REDISTRIBUTE-BGP + redistribute connected rcf Router_BGP_Connected() redistribute ospf include leaked + redistribute ospf match internal + redistribute ospf match external + redistribute ospf match nssa-external 1 include leaked route-map RM-REDISTRIBUTE-OSPF-NSSA-1 + redistribute static rcf Router_BGP_Static() ! address-family ipv4 neighbor foo prefix-list PL-BAR-v4-IN in neighbor foo prefix-list PL-BAR-v4-OUT out neighbor foo default-originate route-map RM-FOO-MATCH always + neighbor 10.2.3.8 rcf in Address_Family_IPV4_In() + neighbor 10.2.3.9 rcf out Address_Family_IPV4_Out() neighbor 192.0.2.1 prefix-list PL-FOO-v4-IN in neighbor 192.0.2.1 prefix-list PL-FOO-v4-OUT out network 10.0.0.0/8 network 172.16.0.0/12 network 192.168.0.0/16 route-map RM-FOO-MATCH + no bgp redistribute-internal + redistribute bgp leaked + redistribute connected include leaked rcf Address_Family_IPV4_Connected() + redistribute dynamic route-map Address_Family_IPV4_Dynamic_RM + redistribute ospf match internal include leaked + redistribute ospf match external include leaked route-map RM-REDISTRIBUTE-OSPF-EXTERNAL + redistribute ospf match nssa-external + redistribute static rcf Address_Family_IPV4_Static() ! address-family ipv6 neighbor baz prefix-list PL-BAR-v6-IN in neighbor baz prefix-list PL-BAR-v6-OUT out neighbor 2001:db8::1 prefix-list PL-FOO-v6-IN in neighbor 2001:db8::1 prefix-list PL-FOO-v6-OUT out + neighbor 2001:db8::2 rcf in Address_Family_IPV6_In() + neighbor 2001:db8::2 rcf out Address_Family_IPV6_Out() network 2001:db8:100::/40 network 2001:db8:200::/40 route-map RM-BAR-MATCH + bgp redistribute-internal redistribute bgp leaked route-map RM-REDISTRIBUTE-BGP - redistribute ospf include leaked + redistribute connected rcf Address_Family_IPV6_Connected() + redistribute ospfv3 match external include leaked + redistribute ospfv3 match internal include leaked route-map RM-REDISTRIBUTE-OSPF-INTERNAL + redistribute ospfv3 match nssa-external 1 redistribute static route-map RM-IPV6-STATIC-TO-BGP session tracker ST1 recovery delay 666 seconds diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-evpn-mpls.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-evpn-mpls.md index 2b5ecb195a9..4a932182f62 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-evpn-mpls.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-evpn-mpls.md @@ -90,6 +90,7 @@ ASN Notation: asplain - Next-hop MPLS resolution Primary-RIB : tunnel-rib-colored system-colored-tunnel-rib - Next-hop MPLS resolution Secondary-RIB : tunnel-rib test-rib - Next-hop MPLS resolution Tertiary-RIB : system-connected +- Layer-2 In-place FEC update tracking timeout: 100 seconds ##### EVPN Peer Groups @@ -130,8 +131,12 @@ router bgp 65101 neighbor 192.168.255.2 peer group EVPN-OVERLAY-PEERS ! address-family evpn + bgp additional-paths send limit 10 neighbor default encapsulation mpls next-hop-self source-interface Loopback0 next-hop mpls resolution ribs tunnel-rib-colored system-colored-tunnel-rib tunnel-rib test-rib system-connected neighbor EVPN-OVERLAY-PEERS activate neighbor 192.168.255.3 activate + neighbor 192.168.255.4 rcf in Address_Family_EVPN_In() + neighbor 192.168.255.4 rcf out Address_Family_EVPN_Out() + layer-2 fec in-place update timeout 100 seconds ``` diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-evpn-vpn-import-pruning.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-evpn-vpn-import-pruning.md index d74531a7a0c..5a2c891f40f 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-evpn-vpn-import-pruning.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-evpn-vpn-import-pruning.md @@ -85,8 +85,8 @@ ASN Notation: asplain | -------- | --------- | --- | -------- | -------------- | -------------- | ---------- | --- | --------------------- | ---------------------- | ------- | ------------ | | 192.168.255.1 | Inherited from peer group EVPN-OVERLAY-PEERS | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.2 | Inherited from peer group EVPN-OVERLAY-PEERS | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | -| 10.255.251.1 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | TENANT_A_PROJECT01 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | True | - | - | -| 10.255.251.1 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | TENANT_A_PROJECT02 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | +| 10.255.251.1 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | TENANT_A_PROJECT01 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | True | - | - | - | +| 10.255.251.1 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | TENANT_A_PROJECT02 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | #### Router BGP EVPN Address Family @@ -117,7 +117,7 @@ ASN Notation: asplain | VRF | Route-Distinguisher | Redistribute | | --- | ------------------- | ------------ | -| TENANT_A_PROJECT01 | 192.168.255.3:11 | connected | +| TENANT_A_PROJECT01 | 192.168.255.3:11 | connected
static
isis | | TENANT_A_PROJECT02 | 192.168.255.3:12 | connected | #### Router BGP Device Configuration @@ -169,6 +169,7 @@ router bgp 65101 vlan 112 ! address-family evpn + bgp additional-paths send ecmp limit 20 host-flap detection window 10 threshold 1 domain identifier 65101:0 neighbor EVPN-OVERLAY-PEERS activate @@ -181,11 +182,15 @@ router bgp 65101 vrf TENANT_A_PROJECT01 rd 192.168.255.3:11 route-target import evpn 11:11 + route-target import evpn rcf RT_IMPORT_AF_RCF() route-target export evpn 11:11 + route-target export evpn rcf RT_EXPORT_AF_RCF() router-id 192.168.255.3 neighbor 10.255.251.1 peer group MLAG-IPv4-UNDERLAY-PEER neighbor 10.255.251.1 rib-in pre-policy retain redistribute connected + redistribute isis route-map Router_BGP_Isis + redistribute static rcf Router_BGP_Static() ! vrf TENANT_A_PROJECT02 rd 192.168.255.3:12 diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-evpn.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-evpn.md index 2a7ca2e9d0a..820aa6cf7bc 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-evpn.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-evpn.md @@ -89,8 +89,8 @@ ASN Notation: asplain | 192.168.255.1 | Inherited from peer group EVPN-OVERLAY-PEERS | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | Allowed, allowed 5 times | Inherited from peer group EVPN-OVERLAY-PEERS(interval: 2000, min_rx: 2000, multiplier: 3) | - | - | - | - | | 192.168.255.2 | Inherited from peer group EVPN-OVERLAY-PEERS | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS(interval: 2000, min_rx: 2000, multiplier: 3) | - | - | - | - | | 192.168.255.3 | - | default | - | - | 52000 (warning-limit 2000, warning-only) | Allowed, allowed 5 times | - | - | - | - | - | -| 10.255.251.1 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | TENANT_A_PROJECT01 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | 15000 (warning-limit 50 percent) | - | - | - | - | - | -| 10.255.251.1 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | TENANT_A_PROJECT02 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | +| 10.255.251.1 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | TENANT_A_PROJECT01 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | 15000 (warning-limit 50 percent) | - | - | - | - | - | - | +| 10.255.251.1 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | TENANT_A_PROJECT02 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | #### BGP Neighbor Interfaces @@ -103,6 +103,7 @@ ASN Notation: asplain - Next-hop resolution is **disabled** - Next-hop-unchanged is explicitly configured (default behaviour) +- Layer-2 In-place FEC update operation enabled ##### EVPN Peer Groups @@ -178,21 +179,27 @@ router bgp 65101 neighbor EVPN-OVERLAY-PEERS allowas-in neighbor EVPN-OVERLAY-PEERS ebgp-multihop 3 neighbor EVPN-OVERLAY-PEERS password 7 + neighbor EVPN-OVERLAY-PEERS password shared-secret profile profile2 algorithm aes-128-cmac-96 neighbor EVPN-OVERLAY-PEERS send-community neighbor EVPN-OVERLAY-PEERS maximum-routes 0 + neighbor EVPN-OVERLAY-PEERS missing-policy address-family all direction out action permit neighbor MLAG-IPv4-UNDERLAY-PEER peer group neighbor MLAG-IPv4-UNDERLAY-PEER remote-as 65101 neighbor MLAG-IPv4-UNDERLAY-PEER next-hop-self neighbor MLAG-IPv4-UNDERLAY-PEER password 7 neighbor MLAG-IPv4-UNDERLAY-PEER send-community neighbor MLAG-IPv4-UNDERLAY-PEER maximum-routes 12000 warning-limit 80 percent warning-only + neighbor MLAG-IPv4-UNDERLAY-PEER missing-policy address-family all direction in action deny neighbor MLAG-IPv4-UNDERLAY-PEER route-map RM-MLAG-PEER-IN in neighbor MLAG-IPv4-UNDERLAY-PEER route-map RM-MLAG-PEER-OUT out neighbor 192.168.255.1 peer group EVPN-OVERLAY-PEERS neighbor 192.168.255.1 allowas-in 5 + neighbor 192.168.255.1 password shared-secret profile profile1 algorithm aes-128-cmac-96 neighbor 192.168.255.2 peer group EVPN-OVERLAY-PEERS + neighbor 192.168.255.2 missing-policy address-family all direction out action deny-in-out neighbor 192.168.255.3 allowas-in 5 neighbor 192.168.255.3 maximum-routes 52000 warning-limit 2000 warning-only + neighbor 192.168.255.3 missing-policy address-family all direction in action deny ! vlan 2488 rd 145.245.21.0:1 @@ -245,6 +252,8 @@ router bgp 65101 vlan 112 ! address-family evpn + bgp additional-paths receive + bgp additional-paths send any bgp next-hop-unchanged host-flap detection window 10 threshold 1 expiry timeout 3 seconds domain identifier 65101:0 @@ -261,14 +270,23 @@ router bgp 65101 neighbor ADDITIONAL-PATH-PG-5 additional-paths send limit 42 neighbor ADDITIONAL-PATH-PG-6 activate no neighbor ADDITIONAL-PATH-PG-6 additional-paths send any + neighbor EVPN-OVERLAY-PEERS default-route neighbor EVPN-OVERLAY-PEERS activate neighbor EVPN-OVERLAY-PEERS domain remote neighbor EVPN-OVERLAY-PEERS encapsulation vxlan no neighbor MLAG-IPv4-UNDERLAY-PEER activate + neighbor 10.100.100.1 activate + neighbor 10.100.100.1 default-route + neighbor 10.100.100.2 activate + neighbor 10.100.100.2 default-route route-map RM_DEFAULT_ROUTE + neighbor 10.100.100.3 activate + neighbor 10.100.100.3 default-route rcf RCF_DEFAULT_ROUTE() next-hop resolution disabled neighbor default next-hop-self received-evpn-routes route-type ip-prefix inter-domain route import ethernet-segment ip mass-withdraw route export ethernet-segment ip mass-withdraw + layer-2 fec in-place update + route import overlay-index gateway ! address-family ipv4 no neighbor EVPN-OVERLAY-PEERS activate @@ -276,6 +294,7 @@ router bgp 65101 vrf TENANT_A_PROJECT01 rd 192.168.255.3:11 evpn multicast + default-route export evpn route-target import evpn 11:11 route-target export evpn 11:11 router-id 192.168.255.3 @@ -286,6 +305,7 @@ router bgp 65101 ! vrf TENANT_A_PROJECT02 rd 192.168.255.3:12 + default-route export evpn always route-target import evpn 12:12 route-target export evpn 12:12 router-id 192.168.255.3 @@ -299,6 +319,7 @@ router bgp 65101 evpn multicast address-family ipv4 transit + default-route export evpn always route-map TENANT_A_PROJECT03_RM_DEFAULT route-target import evpn 13:13 route-target export evpn 13:13 router-id 192.168.255.3 @@ -306,6 +327,7 @@ router bgp 65101 vrf TENANT_A_PROJECT04 rd 192.168.255.3:14 evpn multicast + default-route export evpn rcf TENANT_A_PROJECT03_RCF_DEFAULT() route-target import evpn 14:14 route-target export evpn 14:14 router-id 192.168.255.3 diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-rtc.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-rtc.md index 0a4add1d1cc..6fc732d69d1 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-rtc.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-rtc.md @@ -97,8 +97,8 @@ ASN Notation: asplain | -------- | --------- | --- | -------- | -------------- | -------------- | ---------- | --- | --------------------- | ---------------------- | ------- | ------------ | | 192.168.255.1 | Inherited from peer group EVPN-OVERLAY-PEERS | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.2 | Inherited from peer group EVPN-OVERLAY-PEERS | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | -| 10.255.251.1 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | TENANT_A_PROJECT01 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.251.1 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | TENANT_A_PROJECT02 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | +| 10.255.251.1 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | TENANT_A_PROJECT01 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.251.1 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | TENANT_A_PROJECT02 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | #### Router BGP EVPN Address Family diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-v4-evpn.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-v4-evpn.md index 17df2cb1e0c..a83a24ae802 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-v4-evpn.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-v4-evpn.md @@ -140,12 +140,12 @@ ASN Notation: asplain | 172.31.255.2 | Inherited from peer group IPv4-UNDERLAY-PEERS | default | - | Inherited from peer group IPv4-UNDERLAY-PEERS | Inherited from peer group IPv4-UNDERLAY-PEERS | - | - | - | - | - | - | | 192.168.255.1 | Inherited from peer group EVPN-OVERLAY-PEERS | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.2 | Inherited from peer group EVPN-OVERLAY-PEERS | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | -| 10.255.251.1 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | TENANT_A_PROJECT01 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.2.3.4 | 1234 | TENANT_A_PROJECT01 | - | all | 0 (no limit) | - | - | - | - | - | -| 10.255.251.1 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | TENANT_A_PROJECT02 | - | standard | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.251.2 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | TENANT_A_PROJECT02 | - | extended | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.251.3 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | TENANT_A_PROJECT02 | - | large | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.251.4 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | TENANT_A_PROJECT02 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | True | - | - | - | +| 10.255.251.1 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | TENANT_A_PROJECT01 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.2.3.4 | 1234 | TENANT_A_PROJECT01 | - | all | 0 (no limit) | - | - | - | - | - | - | +| 10.255.251.1 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | TENANT_A_PROJECT02 | - | standard | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.251.2 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | TENANT_A_PROJECT02 | - | extended | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.251.3 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | TENANT_A_PROJECT02 | - | large | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.251.4 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | TENANT_A_PROJECT02 | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | True | - | - | - | - | #### Router BGP EVPN Address Family @@ -244,6 +244,7 @@ router bgp 65101 vlan 112 ! address-family evpn + bgp additional-paths send backup neighbor EVPN-OVERLAY-PEERS activate no neighbor IPv4-UNDERLAY-PEERS activate no neighbor MLAG-IPv4-UNDERLAY-PEER activate @@ -290,8 +291,14 @@ router bgp 65101 neighbor 10.2.3.6 next-hop address-family ipv6 neighbor 10.2.3.7 next-hop address-family ipv6 originate no neighbor 10.2.3.8 next-hop address-family ipv6 + neighbor 10.2.3.9 activate + neighbor 10.2.3.9 rcf in VRF_AFIPV4_RCF_IN() + neighbor 10.2.3.10 activate + neighbor 10.2.3.10 rcf out VRF_AFIPV4_RCF_OUT() network 10.0.0.0/8 network 100.64.0.0/10 route-map RM-10.2.3.4 + redistribute connected rcf VRF_AFIPV4_RCF_CONNECTED() + redistribute static route-map VRF_AFIPV4_RM_STATIC ! vrf TENANT_A_PROJECT02 rd 192.168.255.3:12 diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-v4-v6-evpn.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-v4-v6-evpn.md index 3679f0f8cb2..766a2e38fc1 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-v4-v6-evpn.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-v4-v6-evpn.md @@ -126,6 +126,7 @@ ASN Notation: asplain | Peer Group | Activate | Encapsulation | | ---------- | -------- | ------------- | | EVPN-OVERLAY | True | default | +| RCF_TEST | False | default | #### Router BGP VLANs @@ -140,7 +141,7 @@ ASN Notation: asplain | VRF | Route-Distinguisher | Redistribute | | --- | ------------------- | ------------ | -| Tenant_A | 10.50.64.15:30001 | connected | +| Tenant_A | 10.50.64.15:30001 | ospf
ospfv3
ospfv3
connected | | Tenant_B | 10.50.64.15:30002 | - | #### Router BGP Device Configuration @@ -224,30 +225,47 @@ router bgp 65100 neighbor EVPN-OVERLAY route-map RM-HIDE-AS-PATH in neighbor EVPN-OVERLAY route-map RM-HIDE-AS-PATH out neighbor EVPN-OVERLAY activate + neighbor RCF_TEST rcf in Address_Family_EVPN_In() + neighbor RCF_TEST rcf out Address_Family_EVPN_Out() ! address-family ipv4 neighbor IPV4-UNDERLAY route-map RM-HIDE-AS-PATH in neighbor IPV4-UNDERLAY route-map RM-HIDE-AS-PATH out neighbor IPV4-UNDERLAY activate neighbor IPV4-UNDERLAY-MLAG activate + neighbor TEST_RCF rcf in Address_Family_IPV4_In() + neighbor TEST_RCF rcf out Address_Family_IPV4_Out() ! address-family ipv4 multicast neighbor IPV4-UNDERLAY activate neighbor IPV4-UNDERLAY-MLAG activate redistribute attached-host + redistribute isis rcf Router_BGP_Isis() + redistribute ospf match external + redistribute ospf match internal + redistribute ospf match nssa-external 2 ! address-family ipv6 neighbor IPV6-UNDERLAY route-map RM-HIDE-AS-PATH in neighbor IPV6-UNDERLAY route-map RM-HIDE-AS-PATH out neighbor IPV6-UNDERLAY activate neighbor IPV6-UNDERLAY-MLAG activate + neighbor TEST_RCF rcf in Address_Family_IPV6_In() + neighbor TEST_RCF rcf out Address_Family_IPV6_Out() ! vrf Tenant_A rd 10.50.64.15:30001 route-target import evpn 1:30001 route-target import evpn route-map RM-DENY-DEFAULT + route-target import vpn-ipv4 1:30011 + route-target import vpn-ipv4 rcf RT_IMPORT_AF_RCF() vpn-route filter-rcf RT_IMPORT_AF_RCF_FILTER() + route-target import vpn-ipv4 route-map RT_IMPORT_AF_RM route-target export evpn 1:30001 + route-target export evpn rcf RT_EXPORT_AF_RCF() redistribute connected + redistribute ospf match external include leaked + redistribute ospfv3 match internal + redistribute ospfv3 match nssa-external ! vrf Tenant_B rd 10.50.64.15:30002 diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-vpn-ipv4-vpn-ipv6.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-vpn-ipv4-vpn-ipv6.md index add3ea5097f..ec423598384 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-vpn-ipv4-vpn-ipv6.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-vpn-ipv4-vpn-ipv6.md @@ -82,15 +82,17 @@ ASN Notation: asplain ##### VPN-IPv4 Neighbors -| Neighbor | Activate | Route-map In | Route-map Out | -| -------- | -------- | ------------ | ------------- | -| 192.168.255.4 | True | RM-NEIGHBOR-PEER-IN4 | RM-NEIGHBOR-PEER-OUT4 | +| Neighbor | Activate | Route-map In | Route-map Out | RCF In | RCF Out | +| -------- | -------- | ------------ | ------------- | ------ | ------- | +| 192.168.255.4 | True | RM-NEIGHBOR-PEER-IN4 | RM-NEIGHBOR-PEER-OUT4 | - | - | +| 192.168.255.5 | False | - | - | Address_Family_VPN_IPV4_In() | Address_Family_VPN_IPV4_Out() | ##### VPN-IPv4 Peer Groups -| Peer Group | Activate | Route-map In | Route-map Out | -| ---------- | -------- | ------------ | ------------- | -| MPLS-IBGP-PEERS | True | RM-IBGP-PEER-IN4 | RM-IBGP-PEER-OUT4 | +| Peer Group | Activate | Route-map In | Route-map Out | RCF In | RCF Out | +| ---------- | -------- | ------------ | ------------- | ------ | ------- | +| MPLS-IBGP-PEERS | True | RM-IBGP-PEER-IN4 | RM-IBGP-PEER-OUT4 | - | - | +| Test_RCF | False | - | - | Address_Family_VPN_IPV4_In() | Address_Family_VPN_IPV4_Out() | #### Router BGP VPN-IPv6 Address Family @@ -98,15 +100,17 @@ ASN Notation: asplain ##### VPN-IPv6 Neighbors -| Neighbor | Activate | Route-map In | Route-map Out | -| -------- | -------- | ------------ | ------------- | -| 2001:cafe:192:168::4 | True | RM-NEIGHBOR-PEER-IN6 | RM-NEIGHBOR-PEER-OUT6 | +| Neighbor | Activate | Route-map In | Route-map Out | RCF In | RCF Out | +| -------- | -------- | ------------ | ------------- | ------ | ------- | +| 2001:cafe:192:168::4 | True | RM-NEIGHBOR-PEER-IN6 | RM-NEIGHBOR-PEER-OUT6 | - | - | +| 2001:cafe:192:168::5 | False | - | - | Address_Family_VPN_IPV6_In() | Address_Family_VPN_IPV6_Out() | ##### VPN-IPv6 Peer Groups -| Peer Group | Activate | Route-map In | Route-map Out | -| ---------- | -------- | ------------ | ------------- | -| MPLS-IBGP-PEERS | True | RM-IBGP-PEER-IN6 | RM-IBGP-PEER-OUT6 | +| Peer Group | Activate | Route-map In | Route-map Out | RCF In | RCF Out | +| ---------- | -------- | ------------ | ------------- | ------ | ------- | +| MPLS-IBGP-PEERS | True | RM-IBGP-PEER-IN6 | RM-IBGP-PEER-OUT6 | - | - | +| Test_RCF | False | - | - | Address_Family_VPN_IPV6_In() | Address_Family_VPN_IPV6_Out() | #### Router BGP Device Configuration @@ -137,9 +141,13 @@ router bgp 65103 neighbor MPLS-IBGP-PEERS activate neighbor MPLS-IBGP-PEERS route-map RM-IBGP-PEER-IN4 in neighbor MPLS-IBGP-PEERS route-map RM-IBGP-PEER-OUT4 out + neighbor Test_RCF rcf in Address_Family_VPN_IPV4_In() + neighbor Test_RCF rcf out Address_Family_VPN_IPV4_Out() neighbor 192.168.255.4 activate neighbor 192.168.255.4 route-map RM-NEIGHBOR-PEER-IN4 in neighbor 192.168.255.4 route-map RM-NEIGHBOR-PEER-OUT4 out + neighbor 192.168.255.5 rcf in Address_Family_VPN_IPV4_In() + neighbor 192.168.255.5 rcf out Address_Family_VPN_IPV4_Out() neighbor default encapsulation mpls next-hop-self source-interface Loopback0 route import match-failure action discard ! @@ -148,9 +156,13 @@ router bgp 65103 neighbor MPLS-IBGP-PEERS activate neighbor MPLS-IBGP-PEERS route-map RM-IBGP-PEER-IN6 in neighbor MPLS-IBGP-PEERS route-map RM-IBGP-PEER-OUT6 out + neighbor Test_RCF rcf in Address_Family_VPN_IPV6_In() + neighbor Test_RCF rcf out Address_Family_VPN_IPV6_Out() neighbor 2001:cafe:192:168::4 activate neighbor 2001:cafe:192:168::4 route-map RM-NEIGHBOR-PEER-IN6 in neighbor 2001:cafe:192:168::4 route-map RM-NEIGHBOR-PEER-OUT6 out + neighbor 2001:cafe:192:168::5 rcf in Address_Family_VPN_IPV6_In() + neighbor 2001:cafe:192:168::5 rcf out Address_Family_VPN_IPV6_Out() neighbor default encapsulation mpls next-hop-self source-interface Loopback0 route import match-failure action discard ``` diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-vrf-address-families.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-vrf-address-families.md index 0f0fa4e6ef3..a946f78b25b 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-vrf-address-families.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-vrf-address-families.md @@ -53,7 +53,7 @@ ASN Notation: asplain | --- | ------------------- | ------------ | | VRF01 | - | - | | VRF02 | - | - | -| VRF03 | - | - | +| VRF03 | - | dynamic | #### Router BGP Device Configuration @@ -80,8 +80,13 @@ router bgp 65001 ! address-family ipv6 multicast no neighbor FOOBAR activate + redistribute isis rcf Router_BGP_Isis() + redistribute ospf match internal + redistribute ospfv3 match external + redistribute ospfv3 match nssa-external 2 ! vrf VRF01 + no bgp redistribute-internal ! address-family flow-spec ipv4 bgp missing-policy direction in action permit @@ -103,6 +108,12 @@ router bgp 65001 neighbor 1.2.3.4 route-map FOO in neighbor 1.2.3.4 route-map BAR out network 2.3.4.0/24 route-map BARFOO + no bgp redistribute-internal + redistribute connected rcf VRF_AFIPV4_RCF_CONNECTED_1() + redistribute ospf match external + redistribute ospf match nssa-external 1 + redistribute ospfv3 match internal + redistribute static route-map VRF_AFIPV4_RM_STATIC_1 ! address-family ipv4 multicast bgp missing-policy direction in action permit @@ -111,6 +122,11 @@ router bgp 65001 neighbor 1.2.3.4 route-map FOO in neighbor 1.2.3.4 route-map BAR out network 239.0.0.0/24 route-map BARFOO + redistribute connected + redistribute ospf match internal + redistribute ospf match nssa-external 2 + redistribute ospfv3 match external + redistribute static route-map VRF_AFIPV4MULTI_RM_STATIC ! address-family ipv6 bgp missing-policy direction in action deny-in-out @@ -121,12 +137,27 @@ router bgp 65001 neighbor aa::1 activate neighbor aa::1 route-map FOO in neighbor aa::1 route-map BAR out + neighbor aa::2 activate + neighbor aa::2 rcf in VRF_AFIPV6_RCF_IN() + neighbor aa::2 rcf out VRF_AFIPV6_RCF_OUT() network aa::/64 + no bgp redistribute-internal + redistribute connected rcf VRF_AFIPV6_RCF_CONNECTED() + redistribute isis include leaked + redistribute ospfv3 match external + redistribute ospfv3 match internal include leaked + redistribute ospfv3 match nssa-external + redistribute static route-map VRF_AFIPV6_RM_STATIC ! address-family ipv6 multicast bgp missing-policy direction in action deny bgp missing-policy direction out action deny network ff08:1::/64 + redistribute connected + redistribute ospf match external + redistribute ospf match nssa-external + redistribute ospfv3 match internal + redistribute static route-map VRF_AFIPV6MULTI_RM_STATIC ! vrf VRF02 ! @@ -137,6 +168,7 @@ router bgp 65001 bgp additional-paths send limit 3 ! vrf VRF03 + redistribute dynamic rcf VRF_RCF_DYNAMIC() ! address-family ipv4 bgp additional-paths send ecmp diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-vrf-lite.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-vrf-lite.md index de1a2bbcfbf..847fa98a1c6 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-vrf-lite.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-bgp-vrf-lite.md @@ -131,18 +131,18 @@ ASN Notation: asplain | Neighbor | Remote AS | VRF | Shutdown | Send-community | Maximum-routes | Allowas-in | BFD | RIB Pre-Policy Retain | Route-Reflector Client | Passive | TTL Max Hops | | -------- | --------- | --- | -------- | -------------- | -------------- | ---------- | --- | --------------------- | ---------------------- | ------- | ------------ | -| 10.1.1.0 | Inherited from peer group OBS_WAN | BLUE-C1 | - | - | - | - | Inherited from peer group OBS_WAN(interval: 2000, min_rx: 2000, multiplier: 3) | - | - | - | -| 10.255.1.1 | Inherited from peer group WELCOME_ROUTERS | BLUE-C1 | - | - | - | - | - | - | True | - | -| 101.0.3.1 | Inherited from peer group SEDI | BLUE-C1 | - | - | - | - | - | - | - | - | -| 101.0.3.2 | Inherited from peer group SEDI | BLUE-C1 | True | - | - | Allowed, allowed 3 (default) times | - | - | - | - | -| 101.0.3.3 | - | BLUE-C1 | Inherited from peer group SEDI-shut | - | - | Allowed, allowed 5 times | - | - | - | - | -| 101.0.3.4 | Inherited from peer group TEST-PASSIVE | BLUE-C1 | - | - | - | - | - | - | - | Inherited from peer group TEST-PASSIVE | -| 101.0.3.5 | Inherited from peer group WELCOME_ROUTERS | BLUE-C1 | - | - | - | - | False | - | - | True | -| 101.0.3.6 | Inherited from peer group WELCOME_ROUTERS | BLUE-C1 | - | - | - | - | True(interval: 2500, min_rx: 2000, multiplier: 3) | - | - | - | -| 101.0.3.7 | - | BLUE-C1 | - | - | - | - | True | - | - | - | -| 101.0.3.8 | - | BLUE-C1 | - | - | - | - | False | - | - | - | -| 10.1.1.0 | Inherited from peer group OBS_WAN | RED-C1 | - | - | - | - | Inherited from peer group OBS_WAN(interval: 2000, min_rx: 2000, multiplier: 3) | - | - | - | -| 10.1.1.0 | Inherited from peer group OBS_WAN | YELLOW-C1 | - | - | - | - | Inherited from peer group OBS_WAN(interval: 2000, min_rx: 2000, multiplier: 3) | - | - | - | +| 10.1.1.0 | Inherited from peer group OBS_WAN | BLUE-C1 | - | - | - | - | Inherited from peer group OBS_WAN(interval: 2000, min_rx: 2000, multiplier: 3) | - | - | - | - | +| 10.255.1.1 | Inherited from peer group WELCOME_ROUTERS | BLUE-C1 | - | - | - | - | - | - | True | - | - | +| 101.0.3.1 | Inherited from peer group SEDI | BLUE-C1 | - | - | - | - | - | - | - | - | - | +| 101.0.3.2 | Inherited from peer group SEDI | BLUE-C1 | True | - | - | Allowed, allowed 3 (default) times | - | - | - | - | - | +| 101.0.3.3 | - | BLUE-C1 | Inherited from peer group SEDI-shut | - | - | Allowed, allowed 5 times | - | - | - | - | - | +| 101.0.3.4 | Inherited from peer group TEST-PASSIVE | BLUE-C1 | - | - | - | - | - | - | - | Inherited from peer group TEST-PASSIVE | - | +| 101.0.3.5 | Inherited from peer group WELCOME_ROUTERS | BLUE-C1 | - | - | - | - | False | - | - | True | - | +| 101.0.3.6 | Inherited from peer group WELCOME_ROUTERS | BLUE-C1 | - | - | - | - | True(interval: 2500, min_rx: 2000, multiplier: 3) | - | - | - | - | +| 101.0.3.7 | - | BLUE-C1 | - | - | - | - | True | - | - | - | - | +| 101.0.3.8 | - | BLUE-C1 | - | - | - | - | False | - | - | - | - | +| 10.1.1.0 | Inherited from peer group OBS_WAN | RED-C1 | - | - | - | - | Inherited from peer group OBS_WAN(interval: 2000, min_rx: 2000, multiplier: 3) | - | - | - | - | +| 10.1.1.0 | Inherited from peer group OBS_WAN | YELLOW-C1 | - | - | - | - | Inherited from peer group OBS_WAN(interval: 2000, min_rx: 2000, multiplier: 3) | - | - | - | - | #### Router BGP VRFs diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-general.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-general.md index 6b9405625eb..af14e357759 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-general.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-general.md @@ -5,7 +5,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - [Routing](#routing) - - [Router General](#router-general) + - [Router General](#router-general-1) ## Management @@ -75,5 +75,17 @@ router general routes dynamic prefix-list DYNAMIC_TEST_PREFIX_LIST_2 exit ! + control-functions + code unit code1 + function ACCEPT_ALL() { + return true; + } + EOF + code unit code2 + function DENY_ALL() { + return true; + } + EOF + ! exit ``` diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-igmp.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-igmp.md index eb467d2fb8f..6e83513152f 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-igmp.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-igmp.md @@ -5,7 +5,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - [Multicast](#multicast) - - [Router IGMP](#router-igmp) + - [Router IGMP](#router-igmp-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-internet-exit.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-internet-exit.md index e65a3037c4f..c770344a5df 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-internet-exit.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-internet-exit.md @@ -4,7 +4,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - - [Router Internet Exit](#router-internet-exit) + - [Router Internet Exit](#router-internet-exit-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-isis-new.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-isis-new.md index 396442d6e04..8f28c549b40 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-isis-new.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-isis-new.md @@ -62,10 +62,10 @@ interface Management1 ##### ISIS -| Interface | Channel Group | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | -| Ethernet1 | - | EVPN_UNDERLAY | 50 | point-to-point | - | - | - | -| Ethernet2 | - | EVPN_UNDERLAY | 50 | point-to-point | - | - | - | +| Interface | Channel Group | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Ethernet1 | - | EVPN_UNDERLAY | - | 50 | point-to-point | - | - | - | +| Ethernet2 | - | EVPN_UNDERLAY | - | 50 | point-to-point | - | - | - | #### Ethernet Interfaces Device Configuration @@ -156,9 +156,9 @@ interface Loopback1 ##### ISIS -| Interface | ISIS Instance | ISIS Metric | Mode | -| --------- | ------------- | ----------- | ---- | -| Vlan4093 | EVPN_UNDERLAY | 50 | point-to-point | +| Interface | ISIS Instance | ISIS BFD | ISIS Metric | Mode | +| --------- | ------------- | -------- | ----------- | ---- | +| Vlan4093 | EVPN_UNDERLAY | - | 50 | point-to-point | #### VLAN Interfaces Device Configuration @@ -201,8 +201,9 @@ interface Vlan4094 | Local Convergence Delay (ms) | 15000 | | Advertise Passive-only | True | | SR MPLS Enabled | True | -| SPF Interval | 250 | -| SPF Interval Wait Time| 10 | +| SPF Interval | 250 seconds | +| SPF Interval Wait Time| 10 milliseconds | +| SPF Interval Hold Time| 20 milliseconds | | Graceful-restart Enabled | True | | Graceful-restart t2 Level-1 | 10 | | Graceful-restart t2 Level-2 | 20 | @@ -281,7 +282,7 @@ router isis EVPN_UNDERLAY timers local-convergence-delay 15000 protected-prefixes set-overload-bit on-startup wait-for-bgp timeout 10 advertise passive-only - spf-interval 250 10 + spf-interval 250 seconds 10 milliseconds 20 milliseconds authentication mode md5 level-1 authentication mode sha key-id 2 level-2 graceful-restart diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-isis.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-isis.md index f0da1acf562..9f597738c8a 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-isis.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-isis.md @@ -10,7 +10,7 @@ - [Loopback Interfaces](#loopback-interfaces) - [VLAN Interfaces](#vlan-interfaces) - [Routing](#routing) - - [Router ISIS](#router-isis) + - [Router ISIS](#router-isis-1) ## Management @@ -63,18 +63,20 @@ interface Management1 | Ethernet4 | - | *routed | 4 | *10.9.2.3/31 | **default | **- | **- | **- | **- | | Ethernet5 | - | *routed | 5 | *10.9.2.5/31 | **default | **- | **- | **- | **- | | Ethernet6 | - | *routed | 6 | *10.9.2.7/31 | **default | **- | **- | **- | **- | + *Inherited from Port-Channel Interface ##### ISIS -| Interface | Channel Group | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | -| Ethernet1 | - | EVPN_UNDERLAY | 50 | point-to-point | - | - | - | -| Ethernet2 | - | EVPN_UNDERLAY | 50 | point-to-point | level-1-2 | - | - | -| Ethernet4 | 4 | *EVPN_UNDERLAY | *50 | *point-to-point | *level-2 | *- | *- | -| Ethernet5 | 5 | *EVPN_UNDERLAY | *50 | *passive | *- | *- | *- | -| Ethernet6 | 6 | *EVPN_UNDERLAY | *100 | *- | *level-1-2 | *- | *- | - *Inherited from Port-Channel Interface +| Interface | Channel Group | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Ethernet1 | - | EVPN_UNDERLAY | - | 50 | point-to-point | - | - | - | +| Ethernet2 | - | EVPN_UNDERLAY | - | 50 | point-to-point | level-1-2 | - | - | +| Ethernet4 | 4 | *EVPN_UNDERLAY | - | *50 | *point-to-point | *level-2 | *- | *- | +| Ethernet5 | 5 | *EVPN_UNDERLAY | - | *50 | *passive | *- | *- | *- | +| Ethernet6 | 6 | *EVPN_UNDERLAY | - | *100 | *- | *level-1-2 | *- | *- | + +*Inherited from Port-Channel Interface #### Ethernet Interfaces Device Configuration @@ -132,11 +134,11 @@ interface Ethernet6 ##### ISIS -| Interface | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | -| Port-Channel4 | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Port-Channel5 | EVPN_UNDERLAY | 50 | passive | - | - | - | -| Port-Channel6 | EVPN_UNDERLAY | 100 | - | level-1-2 | - | - | +| Interface | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Port-Channel4 | EVPN_UNDERLAY | - | 50 | point-to-point | level-2 | - | - | +| Port-Channel5 | EVPN_UNDERLAY | - | 50 | passive | - | - | - | +| Port-Channel6 | EVPN_UNDERLAY | - | 100 | - | level-1-2 | - | - | #### Port-Channel Interfaces Device Configuration @@ -239,9 +241,9 @@ interface Loopback2 ##### ISIS -| Interface | ISIS Instance | ISIS Metric | Mode | -| --------- | ------------- | ----------- | ---- | -| Vlan4093 | EVPN_UNDERLAY | 50 | point-to-point | +| Interface | ISIS Instance | ISIS BFD | ISIS Metric | Mode | +| --------- | ------------- | -------- | ----------- | ---- | +| Vlan4093 | EVPN_UNDERLAY | - | 50 | point-to-point | #### VLAN Interfaces Device Configuration diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-l2-vpn.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-l2-vpn.md index da0a35b0a0e..b661d77522f 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-l2-vpn.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-l2-vpn.md @@ -4,7 +4,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) -- [Router L2 VPN](#router-l2-vpn) +- [Router L2 VPN](#router-l2-vpn-1) - [Router L2 VPN Summary](#router-l2-vpn-summary) - [Router L2 VPN Device Configuration](#router-l2-vpn-device-configuration) diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-msdp.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-msdp.md index 39b010daf01..bc3ff3f7f3c 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-msdp.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-msdp.md @@ -5,7 +5,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - [Multicast](#multicast) - - [Router MSDP](#router-msdp) + - [Router MSDP](#router-msdp-1) ## Management @@ -85,7 +85,7 @@ router msdp local-interface Loopback13 keepalive 5 15 sa-filter in list ACL3 - sa-filter out list ACL3 + sa-filter out list ACL4 description Some other kind of MSDP Peer sa-limit 100 ``` diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-multicast.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-multicast.md index abc2d7802c5..91286566d40 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-multicast.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-multicast.md @@ -5,7 +5,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - [Multicast](#multicast) - - [Router Multicast](#router-multicast) + - [Router Multicast](#router-multicast-1) ## Management @@ -71,10 +71,14 @@ router multicast rpf route 10.10.10.1/32 Ethernet1 1 rpf route 10.10.10.2/32 Ethernet2 counters rate period decay 300 seconds + activity polling-interval 10 routing multipath deterministic router-id software-forwarding sfe ! + ipv6 + activity polling-interval 20 + ! vrf MCAST_VRF1 ipv4 routing diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-ospf.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-ospf.md index a29ac1e61fd..b3bf8289c87 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-ospf.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-ospf.md @@ -10,7 +10,7 @@ - [Loopback Interfaces](#loopback-interfaces) - [VLAN Interfaces](#vlan-interfaces) - [Routing](#routing) - - [Router OSPF](#router-ospf) + - [Router OSPF](#router-ospf-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-path-selection.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-path-selection.md index 4bc8900f8bb..6df2d3543d9 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-path-selection.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-path-selection.md @@ -4,7 +4,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - - [Router Path-selection](#router-path-selection) + - [Router Path-selection](#router-path-selection-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-segment-security.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-segment-security.md new file mode 100644 index 00000000000..41a0027e578 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-segment-security.md @@ -0,0 +1,150 @@ +# router-segment-security + +## Table of Contents + +- [Management](#management) + - [Management Interfaces](#management-interfaces) +- [Group-Based Multi-domain Segmentation Services (MSS-Group)](#group-based-multi-domain-segmentation-services-mss-group) + - [Segmentation Policies](#segmentation-policies) + - [Segment Definitions](#segment-definitions) + - [Router MSS-G Device Configuration](#router-mss-g-device-configuration) + +## Management + +### Management Interfaces + +#### Management Interfaces Summary + +##### IPv4 + +| Management Interface | Description | Type | VRF | IP Address | Gateway | +| -------------------- | ----------- | ---- | --- | ---------- | ------- | +| Management1 | oob_management | oob | MGMT | 10.73.255.122/24 | 10.73.255.2 | + +##### IPv6 + +| Management Interface | Description | Type | VRF | IPv6 Address | IPv6 Gateway | +| -------------------- | ----------- | ---- | --- | ------------ | ------------ | +| Management1 | oob_management | oob | MGMT | - | - | + +#### Management Interfaces Device Configuration + +```eos +! +interface Management1 + description oob_management + vrf MGMT + ip address 10.73.255.122/24 +``` + +## Group-Based Multi-domain Segmentation Services (MSS-Group) + +MSS-G is enabled. + +### Segmentation Policies + +#### POLICY-TEST1 + +| Sequence Number | Application Name | Action | Next-Hop | Log | Stateless | +| --------------- | ---------------- | ------ | -------- | --- | --------- | +| 10 | APP-TEST-1 | forward | - | - | False | +| 20 | APP-TEST-2 | drop | - | True | - | +| 25 | APP-TEST-3 | redirect | 198.51.100.1 | - | - | + +### Segment Definitions + +#### VRF default Segmentation + +##### Segment SEGMENT-TEST1 Definitions + +| Interface | Match-List Name | Covered Prefix-List Name | Address Family | +| --------- |---------------- | ------------------------ | -------------- | +| - | MATCH-LIST10 | - | ipv4 | +| - | MATCH-LIST11 | - | ipv6 | + +##### Segment SEGMENT-TEST1 Policies + +| Source Segment | Policy Applied | +| -------------- | -------------- | +| MATCH-LIST22 | POLICY-TEST1 | + +##### Segment SEGMENT-TEST2 Definitions + +| Interface | Match-List Name | Covered Prefix-List Name | Address Family | +| --------- |---------------- | ------------------------ | -------------- | +| - | MATCH-LIST4 | - | ipv4 | +| - | MATCH-LIST3 | - | ipv6 | + +##### Segment SEGMENT-TEST2 Policies + +| Source Segment | Policy Applied | +| -------------- | -------------- | +| MATCH-LIST20 | policy-forward-all | +| MATCH-LIST21 | POLICY-TEST1 | +| MATCH-LIST30 | policy-drop-all | + +#### VRF SECURE Segmentation + +##### Segment SEGMENT-TEST1 Definitions + +| Interface | Match-List Name | Covered Prefix-List Name | Address Family | +| --------- |---------------- | ------------------------ | -------------- | +| Ethernet1 | - | - | - | +| Ethernet2 | - | - | - | +| - | - | PREFIX-LIST10 | ipv4 | +| - | - | PREFIX-LIST1 | ipv6 | + +##### Segment SEGMENT-TEST1 Policies + +| Source Segment | Policy Applied | +| -------------- | -------------- | +| MATCH-LIST20 | policy-forward-all | +| MATCH-LIST30 | policy-drop-all | + +Configured Fallback Policy: policy-custom + +### Router MSS-G Device Configuration + +```eos +! +router segment-security + no shutdown + ! + policy POLICY-TEST1 + 10 application APP-TEST-1 action forward + 20 application APP-TEST-2 action drop stateless log + 25 application APP-TEST-3 action redirect next-hop 198.51.100.1 stateless + ! + vrf default + segment SEGMENT-TEST1 + definition + match prefix-ipv4 MATCH-LIST10 + match prefix-ipv6 MATCH-LIST11 + ! + policies + from MATCH-LIST22 policy POLICY-TEST1 + ! + segment SEGMENT-TEST2 + definition + match prefix-ipv4 MATCH-LIST4 + match prefix-ipv6 MATCH-LIST3 + ! + policies + from MATCH-LIST20 policy policy-forward-all + from MATCH-LIST21 policy POLICY-TEST1 + from MATCH-LIST30 policy policy-drop-all + ! + vrf SECURE + segment SEGMENT-TEST1 + definition + match interface Ethernet1 + match interface Ethernet2 + match covered prefix-list ipv4 PREFIX-LIST10 + match covered prefix-list ipv6 PREFIX-LIST1 + ! + policies + from MATCH-LIST20 policy policy-forward-all + from MATCH-LIST30 policy policy-drop-all + fallback policy policy-custom + ! +``` diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-service-insertion.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-service-insertion.md index 87863b9cafd..4344505527f 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-service-insertion.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-service-insertion.md @@ -5,7 +5,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - [Routing](#routing) -- [Router Service Insertion](#router-service-insertion) +- [Router Service Insertion](#router-service-insertion-1) - [Connections](#connections) - [Router Service Insertion Configuration](#router-service-insertion-configuration) diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-traffic-engineering.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-traffic-engineering.md index 61657b09494..a47c46b8148 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-traffic-engineering.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/router-traffic-engineering.md @@ -5,7 +5,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - [Routing](#routing) - - [Router Traffic-Engineering](#router-traffic-engineering) + - [Router Traffic-Engineering](#router-traffic-engineering-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/service-routing-configuration-bgp.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/service-routing-configuration-bgp.md index 062668d77b9..7763ad6ff2a 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/service-routing-configuration-bgp.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/service-routing-configuration-bgp.md @@ -5,7 +5,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - [Routing](#routing) - - [Service Routing Configuration BGP](#service-routing-configuration-bgp) + - [Service Routing Configuration BGP](#service-routing-configuration-bgp-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/service-routing-protocols-model.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/service-routing-protocols-model.md index 6bdb71511db..5e775176c54 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/service-routing-protocols-model.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/service-routing-protocols-model.md @@ -5,7 +5,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - [Routing](#routing) - - [Service Routing Protocols Model](#service-routing-protocols-model) + - [Service Routing Protocols Model](#service-routing-protocols-model-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/sflow.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/sflow.md index 5d6fa255896..84d0f27be7d 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/sflow.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/sflow.md @@ -5,7 +5,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - [Monitoring](#monitoring) - - [SFlow](#sflow) + - [SFlow](#sflow-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/snmp.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/snmp.md index ce33fdbfd47..bdc888b27a6 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/snmp.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/snmp.md @@ -5,7 +5,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - [Monitoring](#monitoring) - - [SNMP](#snmp) + - [SNMP](#snmp-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/spanning-tree.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/spanning-tree.md index 601e898eeb1..e7f5a87b373 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/spanning-tree.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/spanning-tree.md @@ -4,7 +4,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) -- [Spanning Tree](#spanning-tree) +- [Spanning Tree](#spanning-tree-1) - [Spanning Tree Summary](#spanning-tree-summary) - [Spanning Tree Device Configuration](#spanning-tree-device-configuration) diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/static-routes.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/static-routes.md index 5540982c33c..0a6dfd6de31 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/static-routes.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/static-routes.md @@ -5,7 +5,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - [Routing](#routing) - - [Static Routes](#static-routes) + - [Static Routes](#static-routes-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/stun.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/stun.md index f7eb619dda4..c3aad497068 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/stun.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/stun.md @@ -4,7 +4,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) -- [STUN](#stun) +- [STUN](#stun-1) - [STUN Client](#stun-client) - [STUN Server](#stun-server) - [STUN Device Configuration](#stun-device-configuration) diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/switchport-port-security.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/switchport-port-security.md index 1485f4311c0..648da4de014 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/switchport-port-security.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/switchport-port-security.md @@ -4,7 +4,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) -- [Switchport Port-security](#switchport-port-security) +- [Switchport Port-security](#switchport-port-security-1) - [Switchport Port-security Summary](#switchport-port-security-summary) - [Switchport Port-security Device Configuration](#switchport-port-security-device-configuration) diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/tap-aggregation.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/tap-aggregation.md index dd60a6efebf..e63564b1884 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/tap-aggregation.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/tap-aggregation.md @@ -5,7 +5,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - [Monitoring](#monitoring) - - [Tap Aggregation](#tap-aggregation) + - [Tap Aggregation](#tap-aggregation-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/tunnel-interfaces.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/tunnel-interfaces.md index 25da7408474..c63159d2f2e 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/tunnel-interfaces.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/tunnel-interfaces.md @@ -5,7 +5,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - [Interfaces](#interfaces) - - [Tunnel Interfaces](#tunnel-interfaces) + - [Tunnel Interfaces](#tunnel-interfaces-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/virtual-source-nat.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/virtual-source-nat.md index 669775b9dec..33b56cbf1a3 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/virtual-source-nat.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/virtual-source-nat.md @@ -4,7 +4,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) -- [Virtual Source NAT](#virtual-source-nat) +- [Virtual Source NAT](#virtual-source-nat-1) - [Virtual Source NAT Summary](#virtual-source-nat-summary) - [Virtual Source NAT Configuration](#virtual-source-nat-configuration) diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/vlan-interfaces.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/vlan-interfaces.md index 6d1f018b162..e0aebcfd922 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/vlan-interfaces.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/vlan-interfaces.md @@ -5,7 +5,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - [Interfaces](#interfaces) - - [VLAN Interfaces](#vlan-interfaces) + - [VLAN Interfaces](#vlan-interfaces-1) - [BFD](#bfd) - [BFD Interfaces](#bfd-interfaces) - [Multicast](#multicast) @@ -71,6 +71,9 @@ interface Management1 | Vlan334 | v6 attached host exports | default | - | - | | Vlan335 | v6 attached host exports | default | - | - | | Vlan336 | v6 attached host exports | default | - | - | +| Vlan337 | v4 dhcp relay all-subnets | default | - | - | +| Vlan338 | v6 dhcp relay all-subnets | default | - | - | +| Vlan339 | v6 nd options | default | - | - | | Vlan501 | SVI Description | default | - | False | | Vlan667 | Multiple VRIDs | default | - | False | | Vlan1001 | SVI Description | Tenant_A | - | False | @@ -113,6 +116,9 @@ interface Management1 | Vlan334 | default | - | - | - | - | - | - | | Vlan335 | default | - | - | - | - | - | - | | Vlan336 | default | - | - | - | - | - | - | +| Vlan337 | default | 10.0.2.2/25 | - | - | - | - | - | +| Vlan338 | default | - | - | - | - | - | - | +| Vlan339 | default | - | - | - | - | - | - | | Vlan501 | default | 10.50.26.29/27 | - | - | - | - | - | | Vlan667 | default | 192.0.2.2/25 | - | - | - | - | - | | Vlan1001 | Tenant_A | - | 10.1.1.1/24 | - | - | - | - | @@ -147,39 +153,41 @@ interface Management1 ##### IPv6 -| Interface | VRF | IPv6 Address | IPv6 Virtual Addresses | Virtual Router Address | VRRP | ND RA Disabled | Managed Config Flag | IPv6 ACL In | IPv6 ACL Out | -| --------- | --- | ------------ | ---------------------- | ---------------------- | ---- | -------------- | ------------------- | ----------- | ------------ | -| Vlan24 | default | 1b11:3a00:22b0:6::15/64 | - | 1b11:3a00:22b0:6::1 | - | - | True | - | - | -| Vlan25 | default | 1b11:3a00:22b0:16::16/64 | - | 1b11:3a00:22b0:16::15, 1b11:3a00:22b0:16::14 | - | - | - | - | - | -| Vlan43 | default | a0::1/64 | - | - | - | - | - | - | - | -| Vlan44 | default | a0::4/64 | - | - | - | - | - | - | - | -| Vlan75 | default | 1b11:3a00:22b0:1000::15/64 | - | 1b11:3a00:22b0:1000::1 | - | - | True | - | - | -| Vlan81 | Tenant_C | - | fc00:10:10:81::1/64, fc00:10:11:81::1/64, fc00:10:12:81::1/64 | - | - | - | - | - | - | -| Vlan89 | default | 1b11:3a00:22b0:5200::15/64 | - | 1b11:3a00:22b0:5200::3 | - | - | True | - | - | -| Vlan333 | default | 2001:db8::2/64 | - | - | - | - | - | - | - | -| Vlan334 | default | 2a00:1::1/64 | - | - | - | - | - | - | - | -| Vlan335 | default | 2a00:2::1/64 | - | - | - | - | - | - | - | -| Vlan336 | default | 2a00:3::1/64 | - | - | - | - | - | - | - | -| Vlan501 | default | 1b11:3a00:22b0:0088::207/127 | - | - | - | True | - | - | - | -| Vlan667 | default | 2001:db8::2/64 | - | - | - | - | - | - | - | -| Vlan1001 | Tenant_A | a1::1/64 | - | - | - | - | True | - | - | -| Vlan1002 | Tenant_A | a2::1/64 | - | - | - | True | True | - | - | +| Interface | VRF | IPv6 Address | IPv6 Virtual Addresses | Virtual Router Address | VRRP | ND RA Disabled | Managed Config Flag | Other Config Flag | IPv6 ACL In | IPv6 ACL Out | +| --------- | --- | ------------ | ---------------------- | ---------------------- | ---- | -------------- | ------------------- | ----------------- | ----------- | ------------ | +| Vlan24 | default | 1b11:3a00:22b0:6::15/64 | - | 1b11:3a00:22b0:6::1 | - | - | True | - | - | - | +| Vlan25 | default | 1b11:3a00:22b0:16::16/64 | - | 1b11:3a00:22b0:16::15, 1b11:3a00:22b0:16::14 | - | - | - | - | - | - | +| Vlan43 | default | a0::1/64 | - | - | - | - | - | - | - | - | +| Vlan44 | default | a0::4/64 | - | - | - | - | - | - | - | - | +| Vlan75 | default | 1b11:3a00:22b0:1000::15/64 | - | 1b11:3a00:22b0:1000::1 | - | - | True | - | - | - | +| Vlan81 | Tenant_C | - | fc00:10:10:81::1/64, fc00:10:11:81::1/64, fc00:10:12:81::1/64 | - | - | - | - | - | - | - | +| Vlan89 | default | 1b11:3a00:22b0:5200::15/64 | - | 1b11:3a00:22b0:5200::3 | - | - | True | - | - | - | +| Vlan333 | default | 2001:db8:333::2/64 | - | - | - | - | - | - | - | - | +| Vlan334 | default | 2001:db8:334::1/64 | - | - | - | - | - | - | - | - | +| Vlan335 | default | 2001:db8:335::1/64 | - | - | - | - | - | - | - | - | +| Vlan336 | default | 2001:db8:336::1/64 | - | - | - | - | - | - | - | - | +| Vlan338 | default | 2001:db8:338::1/64 | - | - | - | - | - | - | - | - | +| Vlan339 | default | 2001:db8:339::1/64 | - | - | - | - | - | True | - | - | +| Vlan501 | default | 1b11:3a00:22b0:0088::207/127 | - | - | - | True | - | - | - | - | +| Vlan667 | default | 2001:db8:667::2/64 | - | - | - | - | - | - | - | - | +| Vlan1001 | Tenant_A | a1::1/64 | - | - | - | - | True | - | - | - | +| Vlan1002 | Tenant_A | a2::1/64 | - | - | - | True | True | - | - | - | ##### VRRP Details | Interface | VRRP-ID | Priority | Advertisement Interval | Preempt | Tracked Object Name(s) | Tracked Object Action(s) | IPv4 Virtual IP | IPv4 VRRP Version | IPv6 Virtual IP | | --------- | ------- | -------- | ---------------------- | --------| ---------------------- | ------------------------ | --------------- | ----------------- | --------------- | | Vlan333 | 1 | 105 | 2 | Enabled | ID1-TrackedObjectDecrement, ID1-TrackedObjectShutdown | Decrement 5, Shutdown | 192.0.2.1 | 2 | - | -| Vlan333 | 2 | - | - | Enabled | ID2-TrackedObjectDecrement, ID2-TrackedObjectShutdown | Decrement 10, Shutdown | - | 2 | 2001:db8::1 | +| Vlan333 | 2 | - | - | Enabled | ID2-TrackedObjectDecrement, ID2-TrackedObjectShutdown | Decrement 10, Shutdown | - | 2 | 2001:db8:333::1 | | Vlan333 | 3 | - | - | Disabled | - | - | 100.64.0.1 | 3 | - | | Vlan667 | 1 | 105 | 2 | Enabled | - | - | 192.0.2.1 | 2 | - | -| Vlan667 | 2 | - | - | Enabled | - | - | - | 2 | 2001:db8::1 | +| Vlan667 | 2 | - | - | Enabled | - | - | - | 2 | 2001:db8:667::1 | ##### ISIS -| Interface | ISIS Instance | ISIS Metric | Mode | -| --------- | ------------- | ----------- | ---- | -| Vlan2002 | EVPN_UNDERLAY | - | - | +| Interface | ISIS Instance | ISIS BFD | ISIS Metric | Mode | +| --------- | ------------- | -------- | ----------- | ---- | +| Vlan2002 | EVPN_UNDERLAY | True | - | - | ##### Multicast Routing @@ -375,7 +383,7 @@ interface Vlan333 arp aging timeout 180 ip address 192.0.2.2/25 ipv6 enable - ipv6 address 2001:db8::2/64 + ipv6 address 2001:db8:333::2/64 ipv6 address fe80::2/64 link-local vrrp 1 priority-level 105 vrrp 1 advertisement interval 2 @@ -383,7 +391,7 @@ interface Vlan333 vrrp 1 ipv4 192.0.2.1 vrrp 1 tracked-object ID1-TrackedObjectDecrement decrement 5 vrrp 1 tracked-object ID1-TrackedObjectShutdown shutdown - vrrp 2 ipv6 2001:db8::1 + vrrp 2 ipv6 2001:db8:333::1 vrrp 2 tracked-object ID2-TrackedObjectDecrement decrement 10 vrrp 2 tracked-object ID2-TrackedObjectShutdown shutdown no vrrp 3 preempt @@ -395,19 +403,38 @@ interface Vlan334 description v6 attached host exports ipv6 attached-host route export 19 ipv6 enable - ipv6 address 2a00:1::1/64 + ipv6 address 2001:db8:334::1/64 ! interface Vlan335 description v6 attached host exports ipv6 attached-host route export prefix-length 64 ipv6 enable - ipv6 address 2a00:2::1/64 + ipv6 address 2001:db8:335::1/64 ! interface Vlan336 description v6 attached host exports ipv6 attached-host route export 18 prefix-length 64 ipv6 enable - ipv6 address 2a00:3::1/64 + ipv6 address 2001:db8:336::1/64 +! +interface Vlan337 + description v4 dhcp relay all-subnets + ip address 10.0.2.2/25 + ip dhcp relay all-subnets +! +interface Vlan338 + description v6 dhcp relay all-subnets + ipv6 dhcp relay all-subnets + ipv6 address 2001:db8:338::1/64 +! +interface Vlan339 + description v6 nd options + ipv6 nd cache expire 250 + ipv6 nd cache dynamic capacity 900 + ipv6 nd cache refresh always + ipv6 enable + ipv6 address 2001:db8:339::1/64 + ipv6 nd other-config-flag ! interface Vlan501 description SVI Description @@ -422,13 +449,13 @@ interface Vlan667 arp aging timeout 180 ip address 192.0.2.2/25 ipv6 enable - ipv6 address 2001:db8::2/64 + ipv6 address 2001:db8:667::2/64 ipv6 address fe80::2/64 link-local vrrp 1 priority-level 105 vrrp 1 advertisement interval 2 vrrp 1 preempt delay minimum 30 reload 800 vrrp 1 ipv4 192.0.2.1 - vrrp 2 ipv6 2001:db8::1 + vrrp 2 ipv6 2001:db8:667::1 ! interface Vlan1001 description SVI Description @@ -465,6 +492,7 @@ interface Vlan2002 vrf Tenant_B ip verify unicast source reachable-via rx isis enable EVPN_UNDERLAY + isis bfd ip address virtual 10.2.2.1/24 ! interface Vlan4094 diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/vlans.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/vlans.md index 9d361a39113..e472967d99f 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/vlans.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/vlans.md @@ -4,7 +4,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) -- [VLANs](#vlans) +- [VLANs](#vlans-1) - [VLANs Summary](#vlans-summary) - [VLANs Device Configuration](#vlans-device-configuration) diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/vrf-instances.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/vrf-instances.md index 33217edad56..12ad8c213f6 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/vrf-instances.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/vrf-instances.md @@ -7,7 +7,7 @@ - [Routing](#routing) - [IP Routing](#ip-routing) - [IPv6 Routing](#ipv6-routing) -- [VRF Instances](#vrf-instances) +- [VRF Instances](#vrf-instances-1) - [VRF Instances Summary](#vrf-instances-summary) - [VRF Instances Device Configuration](#vrf-instances-device-configuration) diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/vxlan-interface.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/vxlan-interface.md index 6e755af5758..575286e3115 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/vxlan-interface.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/documentation/devices/vxlan-interface.md @@ -5,7 +5,7 @@ - [Management](#management) - [Management Interfaces](#management-interfaces) - [Interfaces](#interfaces) - - [VXLAN Interface](#vxlan-interface) + - [VXLAN Interface](#vxlan-interface-1) ## Management diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/acl.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/acl.cfg index c687efd7e75..842086c8759 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/acl.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/acl.cfg @@ -27,6 +27,7 @@ ip access-list ACL-02 10 remark ACL to restrict access RFC1918 addresses 20 permit ip 10.0.0.0/8 any 30 permit ip 192.0.2.0/24 any + permit response traffic nat ! ip access-list ACL-03 10 remark ACL to restrict access RFC1918 addresses diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/application-traffic-recognition.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/application-traffic-recognition.cfg index 377cef081a6..00b44f39d0b 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/application-traffic-recognition.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/application-traffic-recognition.cfg @@ -34,6 +34,14 @@ application traffic recognition protocol tcp protocol 7-11, 21 ! + application l4 l4-app-1 + protocol tcp source port field-set src_port_set1 destination port field-set dest_port_set1 + protocol udp source port field-set src_port_set1 destination port field-set dest_port_set1 + ! + application l4 l4-app-2 + protocol tcp + protocol 27, 41-44 + ! category best-effort application aimini service peer-to-peer application apple_update service software-update diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/arp.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/arp.cfg index 99b4a80c3da..7897a498979 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/arp.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/arp.cfg @@ -12,6 +12,7 @@ interface Management1 vrf MGMT ip address 10.73.255.122/24 ! +arp persistent refresh-delay 700 arp aging timeout default 300 arp vrf BLAH 42.42.42.42 DEAD.BEEF.CAFE arpa arp vrf defauls 42.42.42.42 DEAD.BEEF.CAFE arpa diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/dhcp-servers.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/dhcp-servers.cfg index 1981af26a47..ca411903da0 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/dhcp-servers.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/dhcp-servers.cfg @@ -8,10 +8,17 @@ dhcp server vrf AVRF dhcp server vrf defauls ! dhcp server + dns server ipv4 10.0.0.1 192.168.255.254 + dns server ipv6 2001:db8::1 2001:db8::2 + tftp server file ipv4 https://www.arista.io/ztp/bootstrap + tftp server file ipv6 https://2001:0db8:fe/ztp/bootstrap ! subnet 2a00:2::/64 ! subnet 10.2.3.0/24 + ! + vendor-option ipv4 NTP + sub-option 42 type ipv4-address data 10.1.1.1 ! dhcp server vrf defaulu ! diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/dns-ntp.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/dns-ntp.cfg index 054cc1462ed..1cf7ff73b1a 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/dns-ntp.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/dns-ntp.cfg @@ -9,6 +9,10 @@ ip name-server 10.10.128.10 ip name-server vrf mgmt 10.10.128.10 ip name-server vrf TEST 10.10.128.10 priority 3 ip name-server 10.10.129.10 priority 0 +ip name-server 2001:db8::1 +ip name-server vrf mgmt 2001:db8::1 +ip name-server 2001:db8::2 priority 0 +ip name-server vrf TEST 2001:db8::2 priority 3 dns domain test.local ! ntp authentication-key 1 md5 044F0E151B @@ -18,6 +22,8 @@ ntp authenticate servers ntp local-interface vrf mgt Management0 ntp server vrf mgt 10.10.111.1 prefer ntp server vrf mgt 10.10.111.2 +ntp server vrf mgt 2001:db8::3 +ntp server vrf mgt 2001:db8::4 ! no enable password no aaa root diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/dot1x.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/dot1x.cfg index 75f72275da3..bd198645043 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/dot1x.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/dot1x.cfg @@ -16,13 +16,31 @@ dot1x system-auth-control dot1x protocol lldp bypass dot1x dynamic-authorization dot1x + supplicant profile Profile1 + identity user_id1 + eap-method tls + passphrase 0 1048080A02 + ssl profile PF1 + ! + supplicant profile Profile2 + identity user_id2 + passphrase 7 1048080A01 + ! + supplicant profile Profile3 + ssl profile PF2 aaa unresponsive phone action apply cached-results timeout 10 hours else traffic allow aaa unresponsive action traffic allow vlan 10 aaa unresponsive eap response success aaa unresponsive recovery action reauthenticate + aaa accounting update interval 6 seconds mac based authentication delay 300 seconds mac based authentication hold period 300 seconds radius av-pair service-type radius av-pair framed-mtu 1500 + supplicant disconnect cached-results timeout 79 seconds + captive-portal url http://portal-nacm08/captiveredirect/ ssl profile Profile1 + captive-portal access-list ipv4 ACL + captive-portal start limit infinite + supplicant logging ! end diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/ethernet-interfaces.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/ethernet-interfaces.cfg index 90ed1bf27c9..7be8c428e5a 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/ethernet-interfaces.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/ethernet-interfaces.cfg @@ -31,6 +31,7 @@ interface Ethernet1 ip igmp host-proxy access-list ACL2 ip igmp host-proxy report-interval 2 ip igmp host-proxy version 2 + tcp mss ceiling ipv4 70 ipv6 75 egress switchport port-security priority-flow-control on priority-flow-control priority 5 drop @@ -45,6 +46,7 @@ interface Ethernet2 switchport trunk allowed vlan 110-111,210-211 switchport mode trunk switchport + tcp mss ceiling ipv4 70 ingress multicast ipv4 boundary ACL_MULTICAST multicast ipv6 boundary ACL_V6_MULTICAST out multicast ipv4 static @@ -69,6 +71,7 @@ interface Ethernet3 ipv6 nd prefix 2345:ABCD:3FE0::1/96 infinite 50 no-autoconfig ipv6 nd prefix 2345:ABCD:3FE0::2/96 50 infinite ipv6 nd prefix 2345:ABCD:3FE0::3/96 100000 no-autoconfig + tcp mss ceiling ipv6 65 switchport port-security no switchport port-security mac-address maximum disabled switchport port-security vlan 1 mac-address maximum 3 @@ -90,6 +93,7 @@ interface Ethernet4 ipv6 address FE80:FEA::AB65/64 link-local ipv6 nd ra disabled ipv6 nd managed-config-flag + tcp mss ceiling ipv4 65 ipv6 access-group IPv6_ACL_IN in ipv6 access-group IPv6_ACL_OUT out multicast ipv4 boundary 224.0.1.0/24 out @@ -119,6 +123,7 @@ interface Ethernet5 pim ipv4 dr-priority 200 pim ipv4 bfd isis enable ISIS_TEST + isis bfd isis circuit-type level-2 isis metric 99 no isis hello padding @@ -648,6 +653,19 @@ interface Ethernet66 vrrp 3 ipv4 100.64.0.1 vrrp 3 ipv4 version 3 ! +interface Ethernet67 + description Custom_Transceiver_Frequency + no shutdown + switchport + transceiver frequency 190050.000 +! +interface Ethernet68 + description Custom_Transceiver_Frequency + no shutdown + switchport + transceiver media override 100gbase-ar4 + transceiver frequency 190080.000 ghz +! interface Ethernet69 description IP NAT service-profile switchport diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/event-handlers.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/event-handlers.cfg index 3d866bd22d1..b6e2a434fc9 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/event-handlers.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/event-handlers.cfg @@ -17,27 +17,66 @@ event-handler CONFIG_VERSIONING action bash FN=/mnt/flash/startup-config; LFN="`ls -1 $FN.*-* | tail -n 1`"; if [ -z "$LFN" -o -n "`diff -I 'last modified' $FN $LFN`" ]; then cp $FN $FN.`date +%Y%m%d-%H%M%S`; ls -1r $FN.*-* | tail -n +11 | xargs -I % rm %; fi delay 0 ! -event-handler evpn-blacklist-recovery - trigger on-logging - regex EVPN-3-BLACKLISTED_DUPLICATE_MAC - action bash FastCli -p 15 -c "clear bgp evpn host-flap" - delay 300 - asynchronous -! event-handler trigger-on-boot trigger on-boot - action bash echo "on-boot" + action bash + if [ 15 -gt 10 ] + then + echo "a is greater than 10" + fi + EOF + action increment device-health metric Metric1 +! +event-handler trigger-on-counters + trigger on-counters + poll interval 10 + condition ( Arad*.IptCrcErrCnt.delta > 100 ) and ( Arad*.UcFifoFullDrop.delta > 100 ) + granularity per-source + action log +! +event-handler trigger-on-counters2 + trigger on-counters + condition ( Arad*.IptCrcErrCnt.delta > 100 ) and ( Arad*.UcFifoFullDrop.delta > 100 ) + granularity per-source +! +event-handler trigger-on-counters3 + trigger on-counters +! +event-handler trigger-on-intf + trigger on-intf Ethernet4 operstatus ip ip6 +! +event-handler trigger-on-intf2 +! +event-handler trigger-on-logging + trigger on-logging + poll interval 10 + regex ab* + action increment device-health metric Metric2 +! +event-handler trigger-on-logging2 + trigger on-logging + regex ab* +! +event-handler trigger-on-logging3 + trigger on-logging ! event-handler trigger-on-maintenance1 trigger on-maintenance enter interface Management3 after stage linkdown - action bash echo "on-maintenance" ! event-handler trigger-on-maintenance2 - trigger on-maintenance enter unit unit1 before stage bgp + trigger on-maintenance exit unit unit1 before stage bgp action bash echo "on-maintenance" ! event-handler trigger-on-maintenance3 trigger on-maintenance enter bgp 10.0.0.2 vrf vrf1 all action bash echo "on-maintenance" ! +event-handler trigger-on-maintenance4 +! +event-handler trigger-on-maintenance5 +! +event-handler trigger-vm-tracer + trigger vm-tracer vm + action bash echo "vm-tracer vm" +! end diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/generate-default-config.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/generate-default-config.cfg index 8b137891791..e69de29bb2d 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/generate-default-config.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/generate-default-config.cfg @@ -1 +0,0 @@ - diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/hardware-counter.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/hardware-counter.cfg index 420d4a7db60..e5eca647e05 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/hardware-counter.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/hardware-counter.cfg @@ -7,6 +7,7 @@ hardware counter feature ip out layer3 units packets hardware counter feature mpls lfib units packets hardware counter feature route ipv4 vrf test 192.168.0.0/24 hardware counter feature route ipv6 2001:db8:cafe::/64 +hardware counter feature segment-security in ! transceiver qsfp default-mode 4x10G ! diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/ip-dhcp-relay.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/ip-dhcp-relay.cfg index f04076cd30d..a0c82d56e87 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/ip-dhcp-relay.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/ip-dhcp-relay.cfg @@ -1,6 +1,8 @@ !RANCID-CONTENT-TYPE: arista ! ip dhcp relay information option +ip dhcp relay always-on +ip dhcp relay all-subnets default ! transceiver qsfp default-mode 4x10G ! diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/ip-nat.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/ip-nat.cfg index 4383570e382..82c052a3fc5 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/ip-nat.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/ip-nat.cfg @@ -36,7 +36,7 @@ ip nat profile NAT-PROFILE-NO-VRF-2 ip nat source dynamic access-list ACL19 pool POOL19 full-cone priority 10 comment Priority_10 ip nat destination static 1.0.0.1 2.0.0.1 ip nat destination static 1.0.0.2 22 2.0.0.2 - ip nat destination static 1.0.0.3 22 2.0.0.3 23 + ip nat destination static 1.0.0.2 23 2.0.0.3 23 ip nat destination static 1.0.0.4 22 2.0.0.4 23 protocol udp ip nat destination static 1.0.0.5 22 2.0.0.5 23 protocol tcp group 1 ip nat destination static 1.0.0.6 22 2.0.0.6 23 protocol tcp group 2 comment Comment Test @@ -64,13 +64,17 @@ interface Management1 ip nat pool prefix_16 prefix-length 16 range 10.0.0.1 10.0.255.254 range 10.1.0.0 10.1.255.255 1024 65535 - utilization threshold 1 action log -ip nat pool prefix_32 prefix-length 32 - range 10.2.0.1 10.2.0.1 + utilization threshold 91 action log +ip nat pool prefix_21 prefix-length 21 ip nat pool prefix_24 prefix-length 24 - range 10.3.0.1 10.3.0.254 - range 10.3.1.0 10.3.1.255 1024 65535 utilization threshold 100 action log +ip nat pool prefix_32 prefix-length 32 + range 10.2.0.1 10.2.0.1 1024 65535 + range 10.2.0.2 10.2.0.3 +ip nat pool port_only_1 port-only +ip nat pool port_only_2 port-only + port range 10 15 + port range 1024 65535 ip nat synchronization description test sync config expiry-interval 60 diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/ip-security.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/ip-security.cfg index 6dd88cfe0b8..07575cbdf2a 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/ip-security.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/ip-security.cfg @@ -29,11 +29,13 @@ ip security ! sa policy SA-2 esp encryption aes128 + sa lifetime 42 gigabytes pfs dh-group 14 ! sa policy SA-3 esp integrity null esp encryption null + sa lifetime 8 hours pfs dh-group 17 ! profile Profile-1 diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/ipv6-dhcp-relay.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/ipv6-dhcp-relay.cfg new file mode 100644 index 00000000000..a861d158152 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/ipv6-dhcp-relay.cfg @@ -0,0 +1,20 @@ +!RANCID-CONTENT-TYPE: arista +! +ipv6 dhcp relay always-on +ipv6 dhcp relay all-subnets default +ipv6 dhcp relay option link-layer address +ipv6 dhcp relay option remote-id format %m:%i +! +transceiver qsfp default-mode 4x10G +! +hostname ipv6-dhcp-relay +! +no enable password +no aaa root +! +interface Management1 + description oob_management + vrf MGMT + ip address 10.73.255.122/24 +! +end diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/ipv6-neighbors.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/ipv6-neighbors.cfg new file mode 100644 index 00000000000..576885f08dc --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/ipv6-neighbors.cfg @@ -0,0 +1,19 @@ +!RANCID-CONTENT-TYPE: arista +! +transceiver qsfp default-mode 4x10G +! +hostname ipv6-neighbors +! +no enable password +no aaa root +! +interface Management1 + description oob_management + vrf MGMT + ip address 10.73.255.122/24 +! +ipv6 neighbor persistent refresh-delay 1000 +ipv6 neighbor vrf MGMT 11:22:33:44:55:66:77:88 Ethernet1 11:22:33:44:55:66 +ipv6 neighbor ::ffff:192.1.56.10 Loopback99 aa:af:12:34:bc:bf +! +end diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/logging.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/logging.cfg index 4455ee0ac0c..505b65e989f 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/logging.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/logging.cfg @@ -11,14 +11,24 @@ logging synchronous level critical logging host 20.20.20.7 logging host 50.50.50.7 100 200 protocol tcp logging host 60.60.60.7 100 200 +logging host 2001:db8::20:7 +logging host 2001:db8::50:7 100 200 protocol tcp +logging host 2001:db8::60:7 100 200 logging vrf mgt host 10.10.10.7 logging vrf mgt host 30.30.30.7 100 200 protocol tcp logging vrf mgt host 40.40.40.7 300 400 +logging vrf mgt host 2001:db8::10:7 +logging vrf mgt host 2001:db8::30:7 100 200 protocol tcp +logging vrf mgt host 2001:db8::40:7 300 400 logging vrf vrf_with_no_source_interface host 1.2.3.4 +logging vrf vrf_with_no_source_interface host 2001:db8::1:2:3:4 logging format timestamp traditional year timezone logging format rfc5424 logging source-interface Loopback0 logging vrf mgt source-interface Management0 +logging level AAA warnings +logging level ACL critical +logging level BGP 0 ! hostname logging ! diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/loopbacks-interfaces.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/loopbacks-interfaces.cfg index 03cc7d556ff..df1aad13467 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/loopbacks-interfaces.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/loopbacks-interfaces.cfg @@ -30,6 +30,7 @@ interface Loopback99 ipv6 enable ipv6 address 2002::CAFE/64 isis enable ISIS_TEST + isis bfd isis passive isis metric 100 isis network point-to-point diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/mac-security-eth-po-entropy.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/mac-security-eth-po-entropy.cfg index 4837b26d1c8..8bbe8a2fc06 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/mac-security-eth-po-entropy.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/mac-security-eth-po-entropy.cfg @@ -12,13 +12,16 @@ mac security key 1234c 7 10195F4C5144405A fallback mka key-server priority 100 mka session rekey-period 30 + traffic unprotected allow sci l2-protocol lldp bypass unauthorized profile A2 key 1234b 7 12485744465E5A53 + traffic unprotected allow active-sak profile A3 cipher aes256-gcm-xpn key ab 7 10195F4C5144405A + traffic unprotected drop ! hostname mac-security-eth-po-entropy ! diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/management-security.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/management-security.cfg index 4f4c47e1030..df09605b6f9 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/management-security.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/management-security.cfg @@ -13,7 +13,8 @@ interface Management1 ip address 10.73.255.122/24 ! management security - entropy source hardware + entropy source hardware haveged cpu jitter + entropy source hardware exclusive password encryption-key common password encryption reversible aes-256-gcm password minimum length 17 @@ -25,6 +26,16 @@ management security minimum upper 5 maximum repetitive 6 maximum sequential 7 + ! + session shared-secret profile profile0 + secret Secret1 7 $1c$mNvaIXPetcQ3hy7oUnTU3w== receive-lifetime 12/20/2024 10:00:00 12/20/2025 10:00:00 transmit-lifetime infinite local-time + secret Secret2 7 $1c$mNvaIXPetcSA2UnFwIaxwA== receive-lifetime infinite transmit-lifetime infinite + ! + session shared-secret profile profile1 + secret Secret3 8a $Ra3am9YZlbg5d65txucxTg==$DMoPxa9Wu5elK39pofFgaw==$zgEBfv+w/AIr1FnW receive-lifetime 2024-12-20 10:00:00 2025-12-20 10:00:00 transmit-lifetime 12/20/2024 10:00:00 12/10/2025 10:00:00 + ! + session shared-secret profile profile2 + secret Secret4 0 name1_secret receive-lifetime 2024-12-20 10:00:00 2025-12-20 10:00:00 transmit-lifetime 2024-12-20 10:00:00 2025-12-20 10:00:00 ssl profile certificate-profile certificate eAPI.crt key eAPI.key crl ca.crl diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/monitor-connectivity.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/monitor-connectivity.cfg index e238dde41a6..b816d6182a1 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/monitor-connectivity.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/monitor-connectivity.cfg @@ -25,6 +25,29 @@ monitor connectivity local-interfaces HOST_SET address-only ip 10.10.10.1 url https://server1.local.com + ! + host server2 + description + server2_connectivity_monitor + local-interfaces HOST_SET address-only + ip 10.10.10.2 + url https://server2.local.com + ! + host server3 + description + server3_connectivity_monitor + local-interfaces HOST_SET + ip 10.10.10.3 + vrf blue + interface set VRF_GLOBAL_SET Vlan21-24, Vlan29-32 + local-interfaces VRF_GLOBAL_SET default + ! + host server4 + description + server4_connectivity_monitor + local-interfaces VRF_HOST_SET + ip 10.10.20.1 + url https://server2.local.com vrf red interface set VRF_GLOBAL_SET Vlan21-24, Vlan29-32 interface set VRF_HOST_SET Loopback12-14, 19-23 diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/monitor-layer1.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/monitor-layer1.cfg index 82c559e1d5e..e4c0fbb54bd 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/monitor-layer1.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/monitor-layer1.cfg @@ -3,6 +3,7 @@ transceiver qsfp default-mode 4x10G ! monitor layer1 + logging transceiver logging transceiver dom logging transceiver communication logging mac fault diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/monitor-telemetry-influx.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/monitor-telemetry-influx.cfg new file mode 100644 index 00000000000..70eec6d7c4d --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/monitor-telemetry-influx.cfg @@ -0,0 +1,41 @@ +!RANCID-CONTENT-TYPE: arista +! +transceiver qsfp default-mode 4x10G +! +hostname monitor-telemetry-influx +! +no enable password +no aaa root +! +monitor telemetry influx + destination influxdb test + url https://influx_test.localhost + database name test + retention policy test + vrf test + username test password 7 + ! + destination influxdb test1 + url https://influx_test1.localhost + database name test1 + retention policy test1 + vrf test + username test1 password 7 131112011F5D + ! + source socket socket1 + url unix:///var/run/example2.sock + connection limit 100 + ! + source socket socket2 + url unix:///var/run/example3.sock + connection limit 22222 + tag global tag1 value1 + tag global tag2 value2 + source group standard disabled +! +interface Management1 + description oob_management + vrf MGMT + ip address 10.73.255.122/24 +! +end diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/monitor-telemetry-postcard-policy.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/monitor-telemetry-postcard-policy.cfg new file mode 100644 index 00000000000..966eb3ead0d --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/monitor-telemetry-postcard-policy.cfg @@ -0,0 +1,47 @@ +!RANCID-CONTENT-TYPE: arista +! +transceiver qsfp default-mode 4x10G +! +hostname monitor-telemetry-postcard-policy +! +no enable password +no aaa root +! +interface Management1 + description oob_management + vrf MGMT + ip address 10.73.255.122/24 +! +monitor telemetry postcard policy + no disabled + ingress sample rate 16384 + marker vxlan header word 0 bit 30 + ingress collection gre source 10.3.3.3 destination 10.3.3.4 version 2 + ! + sample policy samplepo1 + match rule1 ipv4 + source prefix 3.4.5.0/24 + destination prefix 10.3.3.0/24 + protocol tcp destination port 77, 78-80, 82 + protocol udp source port 98 destination port 99 + ! + match rule2 ipv6 + source prefix 5::0/128 + destination prefix 4::0/128 + protocol udp destination port 747, 748-800 + ! + match rule3 ipv4 + ! + sample policy samplepo2 + match rule1 ipv4 + source prefix 3.4.5.0/24 + destination prefix 10.3.3.0/24 + protocol udp source port bgp destination port https + ! + profile profile1 + ingress sample policy samplepo1 + ! + profile profile2 + ingress sample policy samplepo2 +! +end diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/patch-panel.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/patch-panel.cfg index 18b85373113..4b8b56555ce 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/patch-panel.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/patch-panel.cfg @@ -13,6 +13,9 @@ interface Management1 ip address 10.73.255.122/24 ! patch panel + connector interface recovery review delay 10 900 + connector interface patch bgp vpws remote-failure errdisable + ! patch TEN_B_site2_site5_eline connector 1 interface Ethernet5 connector 2 pseudowire bgp vpws TENANT_A pseudowire TEN_B_site2_site5_eline diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/policy-maps.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/policy-maps.cfg index e8e9967394b..95c8d0505c6 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/policy-maps.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/policy-maps.cfg @@ -12,6 +12,17 @@ interface Management1 vrf MGMT ip address 10.73.255.122/24 ! +policy-map type copp copp-system-policy + class copp-system-OspfIsis + shape kbps 1000 + bandwidth kbps 1000 + ! + class copp-system-cvx + shape pps 2000 + bandwidth pps 2000 + ! + class copp-system-aaa +! policy-map type pbr PM_PBR_BREAKOUT class CM_PBR_EXCLUDE ! diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/port-channel-interfaces.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/port-channel-interfaces.cfg index 0c6db8d39b2..2dcb815b60d 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/port-channel-interfaces.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/port-channel-interfaces.cfg @@ -248,6 +248,7 @@ interface Port-Channel110 description isis_interface_knobs no switchport isis enable ISIS_TEST + isis bfd isis circuit-type level-2 isis metric 99 isis network point-to-point @@ -367,6 +368,7 @@ interface Port-Channel130 interface Port-Channel131 description dot1q-tunnel mode switchport + switchport access vlan 115 switchport mode dot1q-tunnel ! interface Ethernet3 diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/ptp.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/ptp.cfg index ab305930c58..b951c3d4dea 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/ptp.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/ptp.cfg @@ -37,6 +37,7 @@ interface Port-Channel5 switchport mode trunk mlag 5 ptp enable + ptp mpass ptp delay-mechanism e2e ptp sync-message interval 1 ptp role dynamic diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-base.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-base.cfg index 285623fdf49..8d7edf75acd 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-base.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-base.cfg @@ -33,6 +33,8 @@ router bgp 65101 neighbor TEST ttl maximum-hops 42 neighbor test-link-bandwidth1 peer group neighbor test-link-bandwidth1 ttl maximum-hops 1 + neighbor test-link-bandwidth1 missing-policy address-family all include community-list prefix-list direction in action deny + neighbor test-link-bandwidth1 missing-policy address-family all include community-list direction out action permit neighbor test-link-bandwidth1 link-bandwidth default 100G neighbor test-link-bandwidth2 peer group neighbor test-link-bandwidth2 link-bandwidth @@ -58,10 +60,13 @@ router bgp 65101 neighbor 192.0.3.2 default-originate route-map RM-FOO-MATCH3 neighbor 192.0.3.2 send-community extended neighbor 192.0.3.2 maximum-routes 10000 + neighbor 192.0.3.2 missing-policy address-family all include community-list prefix-list direction in action deny + neighbor 192.0.3.2 missing-policy address-family all include community-list direction out action permit neighbor 192.0.3.2 link-bandwidth neighbor 192.0.3.3 remote-as 65434 neighbor 192.0.3.3 rib-in pre-policy retain neighbor 192.0.3.3 send-community standard + neighbor 192.0.3.3 missing-policy address-family all include community-list prefix-list sub-route-map direction in action deny neighbor 192.0.3.4 remote-as 65435 neighbor 192.0.3.4 ttl maximum-hops 1 no neighbor 192.0.3.4 rib-in pre-policy retain @@ -87,31 +92,53 @@ router bgp 65101 neighbor 192.0.3.9 peer group TEST neighbor 192.0.3.9 remote-as 65438 no neighbor 192.0.3.9 bfd + no bgp redistribute-internal aggregate-address 1.1.1.0/24 advertise-only - aggregate-address 1.12.1.0/24 as-set advertise-map ADV-MAP supress-map SUP-MAP summary-only attribute-map RM-ATTRIBUTE match-map RM-MATCH advertise-only + aggregate-address 1.12.1.0/24 as-set summary-only attribute-map RM-ATTRIBUTE match-map RM-MATCH advertise-only aggregate-address 2.2.1.0/24 redistribute bgp leaked route-map RM-REDISTRIBUTE-BGP + redistribute connected rcf Router_BGP_Connected() redistribute ospf include leaked + redistribute ospf match internal + redistribute ospf match external + redistribute ospf match nssa-external 1 include leaked route-map RM-REDISTRIBUTE-OSPF-NSSA-1 + redistribute static rcf Router_BGP_Static() ! address-family ipv4 neighbor foo prefix-list PL-BAR-v4-IN in neighbor foo prefix-list PL-BAR-v4-OUT out neighbor foo default-originate route-map RM-FOO-MATCH always + neighbor 10.2.3.8 rcf in Address_Family_IPV4_In() + neighbor 10.2.3.9 rcf out Address_Family_IPV4_Out() neighbor 192.0.2.1 prefix-list PL-FOO-v4-IN in neighbor 192.0.2.1 prefix-list PL-FOO-v4-OUT out network 10.0.0.0/8 network 172.16.0.0/12 network 192.168.0.0/16 route-map RM-FOO-MATCH + no bgp redistribute-internal + redistribute bgp leaked + redistribute connected include leaked rcf Address_Family_IPV4_Connected() + redistribute dynamic route-map Address_Family_IPV4_Dynamic_RM + redistribute ospf match internal include leaked + redistribute ospf match external include leaked route-map RM-REDISTRIBUTE-OSPF-EXTERNAL + redistribute ospf match nssa-external + redistribute static rcf Address_Family_IPV4_Static() ! address-family ipv6 neighbor baz prefix-list PL-BAR-v6-IN in neighbor baz prefix-list PL-BAR-v6-OUT out neighbor 2001:db8::1 prefix-list PL-FOO-v6-IN in neighbor 2001:db8::1 prefix-list PL-FOO-v6-OUT out + neighbor 2001:db8::2 rcf in Address_Family_IPV6_In() + neighbor 2001:db8::2 rcf out Address_Family_IPV6_Out() network 2001:db8:100::/40 network 2001:db8:200::/40 route-map RM-BAR-MATCH + bgp redistribute-internal redistribute bgp leaked route-map RM-REDISTRIBUTE-BGP - redistribute ospf include leaked + redistribute connected rcf Address_Family_IPV6_Connected() + redistribute ospfv3 match external include leaked + redistribute ospfv3 match internal include leaked route-map RM-REDISTRIBUTE-OSPF-INTERNAL + redistribute ospfv3 match nssa-external 1 redistribute static route-map RM-IPV6-STATIC-TO-BGP session tracker ST1 recovery delay 666 seconds diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-evpn-mpls.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-evpn-mpls.cfg index 84b80e4840e..25e222ff100 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-evpn-mpls.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-evpn-mpls.cfg @@ -35,9 +35,13 @@ router bgp 65101 neighbor 192.168.255.2 peer group EVPN-OVERLAY-PEERS ! address-family evpn + bgp additional-paths send limit 10 neighbor default encapsulation mpls next-hop-self source-interface Loopback0 next-hop mpls resolution ribs tunnel-rib-colored system-colored-tunnel-rib tunnel-rib test-rib system-connected neighbor EVPN-OVERLAY-PEERS activate neighbor 192.168.255.3 activate + neighbor 192.168.255.4 rcf in Address_Family_EVPN_In() + neighbor 192.168.255.4 rcf out Address_Family_EVPN_Out() + layer-2 fec in-place update timeout 100 seconds ! end diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-evpn-vpn-import-pruning.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-evpn-vpn-import-pruning.cfg index e0c8559ffe8..6c910e9aec2 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-evpn-vpn-import-pruning.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-evpn-vpn-import-pruning.cfg @@ -57,6 +57,7 @@ router bgp 65101 vlan 112 ! address-family evpn + bgp additional-paths send ecmp limit 20 host-flap detection window 10 threshold 1 domain identifier 65101:0 neighbor EVPN-OVERLAY-PEERS activate @@ -69,11 +70,15 @@ router bgp 65101 vrf TENANT_A_PROJECT01 rd 192.168.255.3:11 route-target import evpn 11:11 + route-target import evpn rcf RT_IMPORT_AF_RCF() route-target export evpn 11:11 + route-target export evpn rcf RT_EXPORT_AF_RCF() router-id 192.168.255.3 neighbor 10.255.251.1 peer group MLAG-IPv4-UNDERLAY-PEER neighbor 10.255.251.1 rib-in pre-policy retain redistribute connected + redistribute isis route-map Router_BGP_Isis + redistribute static rcf Router_BGP_Static() ! vrf TENANT_A_PROJECT02 rd 192.168.255.3:12 diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-evpn.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-evpn.cfg index 94d7aebf033..c07488642dc 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-evpn.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-evpn.cfg @@ -28,21 +28,27 @@ router bgp 65101 neighbor EVPN-OVERLAY-PEERS allowas-in neighbor EVPN-OVERLAY-PEERS ebgp-multihop 3 neighbor EVPN-OVERLAY-PEERS password 7 q+VNViP5i4rVjW1cxFv2wA== + neighbor EVPN-OVERLAY-PEERS password shared-secret profile profile2 algorithm aes-128-cmac-96 neighbor EVPN-OVERLAY-PEERS send-community neighbor EVPN-OVERLAY-PEERS maximum-routes 0 + neighbor EVPN-OVERLAY-PEERS missing-policy address-family all direction out action permit neighbor MLAG-IPv4-UNDERLAY-PEER peer group neighbor MLAG-IPv4-UNDERLAY-PEER remote-as 65101 neighbor MLAG-IPv4-UNDERLAY-PEER next-hop-self neighbor MLAG-IPv4-UNDERLAY-PEER password 7 vnEaG8gMeQf3d3cN6PktXQ== neighbor MLAG-IPv4-UNDERLAY-PEER send-community neighbor MLAG-IPv4-UNDERLAY-PEER maximum-routes 12000 warning-limit 80 percent warning-only + neighbor MLAG-IPv4-UNDERLAY-PEER missing-policy address-family all direction in action deny neighbor MLAG-IPv4-UNDERLAY-PEER route-map RM-MLAG-PEER-IN in neighbor MLAG-IPv4-UNDERLAY-PEER route-map RM-MLAG-PEER-OUT out neighbor 192.168.255.1 peer group EVPN-OVERLAY-PEERS neighbor 192.168.255.1 allowas-in 5 + neighbor 192.168.255.1 password shared-secret profile profile1 algorithm aes-128-cmac-96 neighbor 192.168.255.2 peer group EVPN-OVERLAY-PEERS + neighbor 192.168.255.2 missing-policy address-family all direction out action deny-in-out neighbor 192.168.255.3 allowas-in 5 neighbor 192.168.255.3 maximum-routes 52000 warning-limit 2000 warning-only + neighbor 192.168.255.3 missing-policy address-family all direction in action deny ! vlan 2488 rd 145.245.21.0:1 @@ -95,6 +101,8 @@ router bgp 65101 vlan 112 ! address-family evpn + bgp additional-paths receive + bgp additional-paths send any bgp next-hop-unchanged host-flap detection window 10 threshold 1 expiry timeout 3 seconds domain identifier 65101:0 @@ -111,14 +119,23 @@ router bgp 65101 neighbor ADDITIONAL-PATH-PG-5 additional-paths send limit 42 neighbor ADDITIONAL-PATH-PG-6 activate no neighbor ADDITIONAL-PATH-PG-6 additional-paths send any + neighbor EVPN-OVERLAY-PEERS default-route neighbor EVPN-OVERLAY-PEERS activate neighbor EVPN-OVERLAY-PEERS domain remote neighbor EVPN-OVERLAY-PEERS encapsulation vxlan no neighbor MLAG-IPv4-UNDERLAY-PEER activate + neighbor 10.100.100.1 activate + neighbor 10.100.100.1 default-route + neighbor 10.100.100.2 activate + neighbor 10.100.100.2 default-route route-map RM_DEFAULT_ROUTE + neighbor 10.100.100.3 activate + neighbor 10.100.100.3 default-route rcf RCF_DEFAULT_ROUTE() next-hop resolution disabled neighbor default next-hop-self received-evpn-routes route-type ip-prefix inter-domain route import ethernet-segment ip mass-withdraw route export ethernet-segment ip mass-withdraw + layer-2 fec in-place update + route import overlay-index gateway ! address-family ipv4 no neighbor EVPN-OVERLAY-PEERS activate @@ -126,6 +143,7 @@ router bgp 65101 vrf TENANT_A_PROJECT01 rd 192.168.255.3:11 evpn multicast + default-route export evpn route-target import evpn 11:11 route-target export evpn 11:11 router-id 192.168.255.3 @@ -136,6 +154,7 @@ router bgp 65101 ! vrf TENANT_A_PROJECT02 rd 192.168.255.3:12 + default-route export evpn always route-target import evpn 12:12 route-target export evpn 12:12 router-id 192.168.255.3 @@ -149,6 +168,7 @@ router bgp 65101 evpn multicast address-family ipv4 transit + default-route export evpn always route-map TENANT_A_PROJECT03_RM_DEFAULT route-target import evpn 13:13 route-target export evpn 13:13 router-id 192.168.255.3 @@ -156,6 +176,7 @@ router bgp 65101 vrf TENANT_A_PROJECT04 rd 192.168.255.3:14 evpn multicast + default-route export evpn rcf TENANT_A_PROJECT03_RCF_DEFAULT() route-target import evpn 14:14 route-target export evpn 14:14 router-id 192.168.255.3 diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-v4-evpn.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-v4-evpn.cfg index ab1ac634538..c9e4248eeaf 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-v4-evpn.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-v4-evpn.cfg @@ -80,6 +80,7 @@ router bgp 65101 vlan 112 ! address-family evpn + bgp additional-paths send backup neighbor EVPN-OVERLAY-PEERS activate no neighbor IPv4-UNDERLAY-PEERS activate no neighbor MLAG-IPv4-UNDERLAY-PEER activate @@ -126,8 +127,14 @@ router bgp 65101 neighbor 10.2.3.6 next-hop address-family ipv6 neighbor 10.2.3.7 next-hop address-family ipv6 originate no neighbor 10.2.3.8 next-hop address-family ipv6 + neighbor 10.2.3.9 activate + neighbor 10.2.3.9 rcf in VRF_AFIPV4_RCF_IN() + neighbor 10.2.3.10 activate + neighbor 10.2.3.10 rcf out VRF_AFIPV4_RCF_OUT() network 10.0.0.0/8 network 100.64.0.0/10 route-map RM-10.2.3.4 + redistribute connected rcf VRF_AFIPV4_RCF_CONNECTED() + redistribute static route-map VRF_AFIPV4_RM_STATIC ! vrf TENANT_A_PROJECT02 rd 192.168.255.3:12 diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-v4-v6-evpn.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-v4-v6-evpn.cfg index d85cc08cf24..ba764ff73d5 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-v4-v6-evpn.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-v4-v6-evpn.cfg @@ -89,30 +89,47 @@ router bgp 65100 neighbor EVPN-OVERLAY route-map RM-HIDE-AS-PATH in neighbor EVPN-OVERLAY route-map RM-HIDE-AS-PATH out neighbor EVPN-OVERLAY activate + neighbor RCF_TEST rcf in Address_Family_EVPN_In() + neighbor RCF_TEST rcf out Address_Family_EVPN_Out() ! address-family ipv4 neighbor IPV4-UNDERLAY route-map RM-HIDE-AS-PATH in neighbor IPV4-UNDERLAY route-map RM-HIDE-AS-PATH out neighbor IPV4-UNDERLAY activate neighbor IPV4-UNDERLAY-MLAG activate + neighbor TEST_RCF rcf in Address_Family_IPV4_In() + neighbor TEST_RCF rcf out Address_Family_IPV4_Out() ! address-family ipv4 multicast neighbor IPV4-UNDERLAY activate neighbor IPV4-UNDERLAY-MLAG activate redistribute attached-host + redistribute isis rcf Router_BGP_Isis() + redistribute ospf match external + redistribute ospf match internal + redistribute ospf match nssa-external 2 ! address-family ipv6 neighbor IPV6-UNDERLAY route-map RM-HIDE-AS-PATH in neighbor IPV6-UNDERLAY route-map RM-HIDE-AS-PATH out neighbor IPV6-UNDERLAY activate neighbor IPV6-UNDERLAY-MLAG activate + neighbor TEST_RCF rcf in Address_Family_IPV6_In() + neighbor TEST_RCF rcf out Address_Family_IPV6_Out() ! vrf Tenant_A rd 10.50.64.15:30001 route-target import evpn 1:30001 route-target import evpn route-map RM-DENY-DEFAULT + route-target import vpn-ipv4 1:30011 + route-target import vpn-ipv4 rcf RT_IMPORT_AF_RCF() vpn-route filter-rcf RT_IMPORT_AF_RCF_FILTER() + route-target import vpn-ipv4 route-map RT_IMPORT_AF_RM route-target export evpn 1:30001 + route-target export evpn rcf RT_EXPORT_AF_RCF() redistribute connected + redistribute ospf match external include leaked + redistribute ospfv3 match internal + redistribute ospfv3 match nssa-external ! vrf Tenant_B rd 10.50.64.15:30002 diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-vpn-ipv4-vpn-ipv6.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-vpn-ipv4-vpn-ipv6.cfg index 5fd5b48cddc..f7cb3dec7c2 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-vpn-ipv4-vpn-ipv6.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-vpn-ipv4-vpn-ipv6.cfg @@ -37,9 +37,13 @@ router bgp 65103 neighbor MPLS-IBGP-PEERS activate neighbor MPLS-IBGP-PEERS route-map RM-IBGP-PEER-IN4 in neighbor MPLS-IBGP-PEERS route-map RM-IBGP-PEER-OUT4 out + neighbor Test_RCF rcf in Address_Family_VPN_IPV4_In() + neighbor Test_RCF rcf out Address_Family_VPN_IPV4_Out() neighbor 192.168.255.4 activate neighbor 192.168.255.4 route-map RM-NEIGHBOR-PEER-IN4 in neighbor 192.168.255.4 route-map RM-NEIGHBOR-PEER-OUT4 out + neighbor 192.168.255.5 rcf in Address_Family_VPN_IPV4_In() + neighbor 192.168.255.5 rcf out Address_Family_VPN_IPV4_Out() neighbor default encapsulation mpls next-hop-self source-interface Loopback0 route import match-failure action discard ! @@ -48,9 +52,13 @@ router bgp 65103 neighbor MPLS-IBGP-PEERS activate neighbor MPLS-IBGP-PEERS route-map RM-IBGP-PEER-IN6 in neighbor MPLS-IBGP-PEERS route-map RM-IBGP-PEER-OUT6 out + neighbor Test_RCF rcf in Address_Family_VPN_IPV6_In() + neighbor Test_RCF rcf out Address_Family_VPN_IPV6_Out() neighbor 2001:cafe:192:168::4 activate neighbor 2001:cafe:192:168::4 route-map RM-NEIGHBOR-PEER-IN6 in neighbor 2001:cafe:192:168::4 route-map RM-NEIGHBOR-PEER-OUT6 out + neighbor 2001:cafe:192:168::5 rcf in Address_Family_VPN_IPV6_In() + neighbor 2001:cafe:192:168::5 rcf out Address_Family_VPN_IPV6_Out() neighbor default encapsulation mpls next-hop-self source-interface Loopback0 route import match-failure action discard ! diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-vrf-address-families.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-vrf-address-families.cfg index a227f476735..5c350a203bb 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-vrf-address-families.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-bgp-vrf-address-families.cfg @@ -33,8 +33,13 @@ router bgp 65001 ! address-family ipv6 multicast no neighbor FOOBAR activate + redistribute isis rcf Router_BGP_Isis() + redistribute ospf match internal + redistribute ospfv3 match external + redistribute ospfv3 match nssa-external 2 ! vrf VRF01 + no bgp redistribute-internal ! address-family flow-spec ipv4 bgp missing-policy direction in action permit @@ -56,6 +61,12 @@ router bgp 65001 neighbor 1.2.3.4 route-map FOO in neighbor 1.2.3.4 route-map BAR out network 2.3.4.0/24 route-map BARFOO + no bgp redistribute-internal + redistribute connected rcf VRF_AFIPV4_RCF_CONNECTED_1() + redistribute ospf match external + redistribute ospf match nssa-external 1 + redistribute ospfv3 match internal + redistribute static route-map VRF_AFIPV4_RM_STATIC_1 ! address-family ipv4 multicast bgp missing-policy direction in action permit @@ -64,6 +75,11 @@ router bgp 65001 neighbor 1.2.3.4 route-map FOO in neighbor 1.2.3.4 route-map BAR out network 239.0.0.0/24 route-map BARFOO + redistribute connected + redistribute ospf match internal + redistribute ospf match nssa-external 2 + redistribute ospfv3 match external + redistribute static route-map VRF_AFIPV4MULTI_RM_STATIC ! address-family ipv6 bgp missing-policy direction in action deny-in-out @@ -74,12 +90,27 @@ router bgp 65001 neighbor aa::1 activate neighbor aa::1 route-map FOO in neighbor aa::1 route-map BAR out + neighbor aa::2 activate + neighbor aa::2 rcf in VRF_AFIPV6_RCF_IN() + neighbor aa::2 rcf out VRF_AFIPV6_RCF_OUT() network aa::/64 + no bgp redistribute-internal + redistribute connected rcf VRF_AFIPV6_RCF_CONNECTED() + redistribute isis include leaked + redistribute ospfv3 match external + redistribute ospfv3 match internal include leaked + redistribute ospfv3 match nssa-external + redistribute static route-map VRF_AFIPV6_RM_STATIC ! address-family ipv6 multicast bgp missing-policy direction in action deny bgp missing-policy direction out action deny network ff08:1::/64 + redistribute connected + redistribute ospf match external + redistribute ospf match nssa-external + redistribute ospfv3 match internal + redistribute static route-map VRF_AFIPV6MULTI_RM_STATIC ! vrf VRF02 ! @@ -90,6 +121,7 @@ router bgp 65001 bgp additional-paths send limit 3 ! vrf VRF03 + redistribute dynamic rcf VRF_RCF_DYNAMIC() ! address-family ipv4 bgp additional-paths send ecmp diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-general.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-general.cfg index 5a2169de83e..3366960c831 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-general.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-general.cfg @@ -24,6 +24,18 @@ router general routes dynamic prefix-list DYNAMIC_TEST_PREFIX_LIST_2 exit ! + control-functions + code unit code1 + function ACCEPT_ALL() { + return true; + } + EOF + code unit code2 + function DENY_ALL() { + return true; + } + EOF + ! exit ! end diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-isis-new.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-isis-new.cfg index c90ce2c35aa..c2888149a4a 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-isis-new.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-isis-new.cfg @@ -79,7 +79,7 @@ router isis EVPN_UNDERLAY timers local-convergence-delay 15000 protected-prefixes set-overload-bit on-startup wait-for-bgp timeout 10 advertise passive-only - spf-interval 250 10 + spf-interval 250 seconds 10 milliseconds 20 milliseconds authentication mode md5 level-1 authentication mode sha key-id 2 level-2 graceful-restart diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-msdp.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-msdp.cfg index 57fcc4524d4..9ece12465e4 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-msdp.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-msdp.cfg @@ -46,7 +46,7 @@ router msdp local-interface Loopback13 keepalive 5 15 sa-filter in list ACL3 - sa-filter out list ACL3 + sa-filter out list ACL4 description Some other kind of MSDP Peer sa-limit 100 ! diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-multicast.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-multicast.cfg index fcb20a20034..fdfc0fb5514 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-multicast.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-multicast.cfg @@ -18,10 +18,14 @@ router multicast rpf route 10.10.10.1/32 Ethernet1 1 rpf route 10.10.10.2/32 Ethernet2 counters rate period decay 300 seconds + activity polling-interval 10 routing multipath deterministic router-id software-forwarding sfe ! + ipv6 + activity polling-interval 20 + ! vrf MCAST_VRF1 ipv4 routing diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-segment-security.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-segment-security.cfg new file mode 100644 index 00000000000..3c408a8dec3 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/router-segment-security.cfg @@ -0,0 +1,56 @@ +!RANCID-CONTENT-TYPE: arista +! +transceiver qsfp default-mode 4x10G +! +hostname router-segment-security +! +no enable password +no aaa root +! +interface Management1 + description oob_management + vrf MGMT + ip address 10.73.255.122/24 +! +router segment-security + no shutdown + ! + policy POLICY-TEST1 + 10 application APP-TEST-1 action forward + 20 application APP-TEST-2 action drop stateless log + 25 application APP-TEST-3 action redirect next-hop 198.51.100.1 stateless + ! + vrf default + segment SEGMENT-TEST1 + definition + match prefix-ipv4 MATCH-LIST10 + match prefix-ipv6 MATCH-LIST11 + ! + policies + from MATCH-LIST22 policy POLICY-TEST1 + ! + segment SEGMENT-TEST2 + definition + match prefix-ipv4 MATCH-LIST4 + match prefix-ipv6 MATCH-LIST3 + ! + policies + from MATCH-LIST20 policy policy-forward-all + from MATCH-LIST21 policy POLICY-TEST1 + from MATCH-LIST30 policy policy-drop-all + ! + vrf SECURE + segment SEGMENT-TEST1 + definition + match interface Ethernet1 + match interface Ethernet2 + match covered prefix-list ipv4 PREFIX-LIST10 + match covered prefix-list ipv6 PREFIX-LIST1 + ! + policies + from MATCH-LIST20 policy policy-forward-all + from MATCH-LIST30 policy policy-drop-all + fallback policy policy-custom + ! +! +end diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/vlan-interfaces.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/vlan-interfaces.cfg index 60a4e537126..64e882dee94 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/vlan-interfaces.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/intended/configs/vlan-interfaces.cfg @@ -191,7 +191,7 @@ interface Vlan333 arp aging timeout 180 ip address 192.0.2.2/25 ipv6 enable - ipv6 address 2001:db8::2/64 + ipv6 address 2001:db8:333::2/64 ipv6 address fe80::2/64 link-local vrrp 1 priority-level 105 vrrp 1 advertisement interval 2 @@ -199,7 +199,7 @@ interface Vlan333 vrrp 1 ipv4 192.0.2.1 vrrp 1 tracked-object ID1-TrackedObjectDecrement decrement 5 vrrp 1 tracked-object ID1-TrackedObjectShutdown shutdown - vrrp 2 ipv6 2001:db8::1 + vrrp 2 ipv6 2001:db8:333::1 vrrp 2 tracked-object ID2-TrackedObjectDecrement decrement 10 vrrp 2 tracked-object ID2-TrackedObjectShutdown shutdown no vrrp 3 preempt @@ -211,19 +211,38 @@ interface Vlan334 description v6 attached host exports ipv6 attached-host route export 19 ipv6 enable - ipv6 address 2a00:1::1/64 + ipv6 address 2001:db8:334::1/64 ! interface Vlan335 description v6 attached host exports ipv6 attached-host route export prefix-length 64 ipv6 enable - ipv6 address 2a00:2::1/64 + ipv6 address 2001:db8:335::1/64 ! interface Vlan336 description v6 attached host exports ipv6 attached-host route export 18 prefix-length 64 ipv6 enable - ipv6 address 2a00:3::1/64 + ipv6 address 2001:db8:336::1/64 +! +interface Vlan337 + description v4 dhcp relay all-subnets + ip address 10.0.2.2/25 + ip dhcp relay all-subnets +! +interface Vlan338 + description v6 dhcp relay all-subnets + ipv6 dhcp relay all-subnets + ipv6 address 2001:db8:338::1/64 +! +interface Vlan339 + description v6 nd options + ipv6 nd cache expire 250 + ipv6 nd cache dynamic capacity 900 + ipv6 nd cache refresh always + ipv6 enable + ipv6 address 2001:db8:339::1/64 + ipv6 nd other-config-flag ! interface Vlan501 description SVI Description @@ -238,13 +257,13 @@ interface Vlan667 arp aging timeout 180 ip address 192.0.2.2/25 ipv6 enable - ipv6 address 2001:db8::2/64 + ipv6 address 2001:db8:667::2/64 ipv6 address fe80::2/64 link-local vrrp 1 priority-level 105 vrrp 1 advertisement interval 2 vrrp 1 preempt delay minimum 30 reload 800 vrrp 1 ipv4 192.0.2.1 - vrrp 2 ipv6 2001:db8::1 + vrrp 2 ipv6 2001:db8:667::1 ! interface Vlan1001 description SVI Description @@ -281,6 +300,7 @@ interface Vlan2002 vrf Tenant_B ip verify unicast source reachable-via rx isis enable EVPN_UNDERLAY + isis bfd ip address virtual 10.2.2.1/24 ! interface Vlan4094 diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/acl.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/acl.yml index 57a77106c5e..5a53f83189e 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/acl.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/acl.yml @@ -10,6 +10,7 @@ access_lists: action: "permit ip 192.0.2.0/24 any" - name: ACL-02 counters_per_entry: true + permit_response_traffic: nat sequence_numbers: - sequence: 10 action: "remark ACL to restrict access RFC1918 addresses" diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/application-traffic-recognition.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/application-traffic-recognition.yml index 2c9ee531b6c..b922ac3aae2 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/application-traffic-recognition.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/application-traffic-recognition.yml @@ -89,6 +89,21 @@ application_traffic_recognition: dest_prefix_set_name: dest_prefix_set1 tcp_src_port_set_name: src_port_set1 tcp_dest_port_set_name: dest_port_set1 + l4_applications: + - name: l4-app-1 + protocols: + - tcp + - udp + tcp_src_port_set_name: src_port_set1 + tcp_dest_port_set_name: dest_port_set1 + udp_src_port_set_name: src_port_set1 + udp_dest_port_set_name: dest_port_set1 + - name: l4-app-2 + protocols: + - tcp + protocol_ranges: + - "27" + - "41-44" application_profiles: - name: app_profile_2 applications: diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/arp.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/arp.yml index 1d866984d2a..0e214f830e1 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/arp.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/arp.yml @@ -1,5 +1,8 @@ # test arp arp: + persistent: + enabled: true + refresh_delay: 700 aging: timeout_default: 300 static_entries: diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/dhcp-servers.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/dhcp-servers.yml index fa3a2b3f848..ebb25fac019 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/dhcp-servers.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/dhcp-servers.yml @@ -32,9 +32,23 @@ dhcp_servers: default_gateway: 10.0.0.1 - vrf: default + dns_servers_ipv4: + - 10.0.0.1 + - 192.168.255.254 + dns_servers_ipv6: + - 2001:db8::1 + - 2001:db8::2 + tftp_server: + file_ipv4: "https://www.arista.io/ztp/bootstrap" + file_ipv6: "https://2001:0db8:fe/ztp/bootstrap" subnets: - subnet: 10.2.3.0/24 - subnet: 2a00:2::/64 + ipv4_vendor_options: + - vendor_id: NTP + sub_options: + - code: 42 + ipv4_address: "10.1.1.1" - vrf: VRF01 subnets: diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/dns-ntp.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/dns-ntp.yml index 150a2454c79..9cfd3086c2e 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/dns-ntp.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/dns-ntp.yml @@ -21,6 +21,18 @@ ip_name_servers: - ip_address: 10.10.128.10 vrf: TEST priority: 3 + # no VRF + - ip_address: 2001:db8::1 + # no VRF priority + - ip_address: 2001:db8::2 + priority: 0 + # Same DNS management VRF + - ip_address: 2001:db8::1 + vrf: mgmt + # Same DNS different VRF and priority + - ip_address: 2001:db8::2 + vrf: TEST + priority: 3 ### DNS Domain ### dns_domain: test.local @@ -36,6 +48,10 @@ ntp: vrf: mgt - name: 10.10.111.2 vrf: mgt + - name: 2001:db8::4 + vrf: mgt + - name: 2001:db8::3 + vrf: mgt authenticate_servers_only: true authentication_keys: - id: 1 diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/dot1x.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/dot1x.yml index 798916187b2..55467eae2cb 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/dot1x.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/dot1x.yml @@ -23,3 +23,25 @@ dot1x: traffic_allow: true apply_alternate: true recovery_action_reauthenticate: true + accounting_update_interval: 6 + captive_portal: + enabled: true + url: http://portal-nacm08/captiveredirect/ + ssl_profile: Profile1 + start_limit_infinite: true + access_list_ipv4: ACL + supplicant: + profiles: + - name: Profile1 + eap_method: tls + identity: user_id1 + passphrase_type: 0 + passphrase: 1048080A02 + ssl_profile: PF1 + - name: Profile2 + identity: user_id2 + passphrase: 1048080A01 + - name: Profile3 + ssl_profile: PF2 + logging: true + disconnect_cached_results_timeout: 79 diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/ethernet-interfaces.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/ethernet-interfaces.yml index 53cc4738811..f7b6a7174b1 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/ethernet-interfaces.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/ethernet-interfaces.yml @@ -29,6 +29,10 @@ ethernet_interfaces: bgp: session_tracker: ST1 ip_verify_unicast_source_reachable_via: rx + tcp_mss_ceiling: + ipv4_segment_size: 70 + ipv6_segment_size: 75 + direction: egress switchport: port_security: enabled: true @@ -66,6 +70,9 @@ ethernet_interfaces: description: SRV-POD02_Eth1 mode: trunk vlans: 110-111,210-211 + tcp_mss_ceiling: + ipv4_segment_size: 70 + direction: ingress multicast: ipv4: static: true @@ -128,6 +135,8 @@ ethernet_interfaces: priority_flow_control: enabled: false spanning_tree_guard: root + tcp_mss_ceiling: + ipv6_segment_size: 65 switchport: port_security: mac_address_maximum: @@ -155,6 +164,8 @@ ethernet_interfaces: priority_flow_control: enabled: true spanning_tree_guard: disabled + tcp_mss_ceiling: + ipv4_segment_size: 65 multicast: ipv4: static: true @@ -192,6 +203,7 @@ ethernet_interfaces: count: 2.5 interval: 10 isis_enable: ISIS_TEST + isis_bfd: true isis_passive: false isis_metric: 99 isis_network_point_to_point: true @@ -997,3 +1009,17 @@ ethernet_interfaces: ipv4: address: 100.64.0.1 version: 3 +# Transceiver Frequency + - name: Ethernet67 + description: Custom_Transceiver_Frequency + shutdown: false + transceiver: + frequency: 190050 + - name: Ethernet68 + description: Custom_Transceiver_Frequency + shutdown: false + transceiver: + frequency: 190080 + frequency_unit: ghz + media: + override: 100gbase-ar4 diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/event-handlers.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/event-handlers.yml index 2f02a9a13c8..33b1da44eac 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/event-handlers.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/event-handlers.yml @@ -1,20 +1,18 @@ event_handlers: - - name: evpn-blacklist-recovery - action_type: bash - action: FastCli -p 15 -c "clear bgp evpn host-flap" - delay: 300 - trigger: on-logging - regex: EVPN-3-BLACKLISTED_DUPLICATE_MAC - asynchronous: true - name: CONFIG_VERSIONING - action_type: bash - action: FN=/mnt/flash/startup-config; LFN="`ls -1 $FN.*-* | tail -n 1`"; if [ -z "$LFN" -o -n "`diff -I 'last modified' $FN $LFN`" ]; then cp $FN $FN.`date +%Y%m%d-%H%M%S`; ls -1r $FN.*-* | tail -n +11 | xargs -I % rm %; fi + actions: + bash_command: FN=/mnt/flash/startup-config; LFN="`ls -1 $FN.*-* | tail -n 1`"; if [ -z "$LFN" -o -n "`diff -I 'last modified' $FN $LFN`" ]; then cp $FN $FN.`date +%Y%m%d-%H%M%S`; ls -1r $FN.*-* | tail -n +11 | xargs -I % rm %; fi delay: 0 trigger: on-startup-config - name: trigger-on-boot trigger: on-boot - action_type: bash - action: echo "on-boot" + actions: + bash_command: |- + if [ 15 -gt 10 ] + then + echo "a is greater than 10" + fi + increment_device_health_metric: Metric1 - name: trigger-on-maintenance1 trigger: on-maintenance trigger_on_maintenance: @@ -22,17 +20,15 @@ event_handlers: interface: Management3 action: after stage: linkdown - action_type: bash - action: echo "on-maintenance" - name: trigger-on-maintenance2 trigger: on-maintenance trigger_on_maintenance: - operation: enter + operation: exit unit: unit1 action: before stage: bgp - action_type: bash - action: echo "on-maintenance" + actions: + bash_command: echo "on-maintenance" - name: trigger-on-maintenance3 trigger: on-maintenance trigger_on_maintenance: @@ -40,5 +36,57 @@ event_handlers: bgp_peer: 10.0.0.2 vrf: vrf1 action: all - action_type: bash - action: echo "on-maintenance" + actions: + bash_command: echo "on-maintenance" + - name: trigger-on-maintenance4 + trigger: on-maintenance + trigger_on_maintenance: + operation: enter + action: all + - name: trigger-on-maintenance5 + trigger: on-maintenance + trigger_on_maintenance: + operation: enter + action: before + bgp_peer: test + - name: trigger-on-logging + trigger: on-logging + trigger_on_logging: + poll_interval: 10 + regex: "ab*" + actions: + increment_device_health_metric: Metric2 + - name: trigger-on-logging2 + trigger: on-logging + trigger_on_logging: + regex: "ab*" + - name: trigger-on-logging3 + trigger: on-logging + - name: trigger-on-counters + trigger: on-counters + trigger_on_counters: + poll_interval: 10 + condition: ( Arad*.IptCrcErrCnt.delta > 100 ) and ( Arad*.UcFifoFullDrop.delta > 100 ) + granularity_per_source: true + actions: + log: true + - name: trigger-on-counters2 + trigger: on-counters + trigger_on_counters: + condition: ( Arad*.IptCrcErrCnt.delta > 100 ) and ( Arad*.UcFifoFullDrop.delta > 100 ) + granularity_per_source: true + - name: trigger-on-counters3 + trigger: on-counters + - name: trigger-on-intf + trigger: on-intf + trigger_on_intf: + interface: Ethernet4 + ip: true + ipv6: true + operstatus: true + - name: trigger-on-intf2 + trigger: on-intf + - name: trigger-vm-tracer + trigger: "vm-tracer vm" + actions: + bash_command: echo "vm-tracer vm" diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/hardware-counter.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/hardware-counter.yml index c9ea0de7e5f..a0b58003fb1 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/hardware-counter.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/hardware-counter.yml @@ -23,3 +23,5 @@ hardware_counters: - name: route address_type: ipv6 prefix: 2001:db8:cafe::/64 + - name: segment-security + direction: in diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/ip-dhcp-relay.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/ip-dhcp-relay.yml index f4960a8141a..406b1b08757 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/ip-dhcp-relay.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/ip-dhcp-relay.yml @@ -2,3 +2,5 @@ ip_dhcp_relay: information_option: true + always_on: true + all_subnets: true diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/ip-nat.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/ip-nat.yml index 00e55ad37d3..c77748be66e 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/ip-nat.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/ip-nat.yml @@ -3,6 +3,7 @@ ip_nat: kernel_buffer_size: 64 pools: - name: prefix_16 + type: ip-port prefix_length: 16 ranges: - first_ip: 10.0.0.1 @@ -11,22 +12,33 @@ ip_nat: last_ip: 10.1.255.255 first_port: 1024 last_port: 65535 - utilization_log_threshold: 1 + utilization_log_threshold: 91 - name: prefix_32 + type: ip-port prefix_length: 32 ranges: - first_ip: 10.2.0.1 last_ip: 10.2.0.1 + first_port: 1024 + last_port: 65535 + - first_ip: 10.2.0.2 + last_ip: 10.2.0.3 - name: prefix_24 prefix_length: 24 + utilization_log_threshold: 100 + - name: prefix_21 + prefix_length: 21 + - name: port_only_1 + type: port-only + - name: port_only_2 + type: port-only ranges: - - first_ip: 10.3.0.1 - last_ip: 10.3.0.254 - - first_ip: 10.3.1.0 - last_ip: 10.3.1.255 + - first_port: 10 + last_port: 15 + - first_ip: 10.1.0.0 # first_ip and last_ip will be ignored for port-only. + last_ip: 10.1.255.255 first_port: 1024 last_port: 65535 - utilization_log_threshold: 100 synchronization: description: 'test sync config' expiry_interval: 60 @@ -88,9 +100,9 @@ ip_nat: - original_ip: 1.0.0.2 translated_ip: 2.0.0.2 original_port: 22 - - original_ip: 1.0.0.3 + - original_ip: 1.0.0.2 translated_ip: 2.0.0.3 - original_port: 22 + original_port: 23 translated_port: 23 - original_ip: 1.0.0.4 translated_ip: 2.0.0.4 diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/ip-security.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/ip-security.yml index d76e51b270d..bae3ff76946 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/ip-security.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/ip-security.yml @@ -21,11 +21,17 @@ ip_security: - name: SA-2 esp: encryption: aes128 + sa_lifetime: + value: 42 + unit: gigabytes pfs_dh_group: 14 - name: SA-3 esp: integrity: disabled encryption: disabled + sa_lifetime: + value: 8 + # default unit is hours pfs_dh_group: 17 profiles: - name: Profile-1 diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/ipv6-dhcp-relay.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/ipv6-dhcp-relay.yml new file mode 100644 index 00000000000..211dbad0b60 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/ipv6-dhcp-relay.yml @@ -0,0 +1,8 @@ +### IPv6 DHCP Relay ### + +ipv6_dhcp_relay: + always_on: true + all_subnets: true + option: + link_layer_address: true + remote_id_format: "%m:%i" diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/ipv6-neighbors.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/ipv6-neighbors.yml new file mode 100644 index 00000000000..4457f8ecb6d --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/ipv6-neighbors.yml @@ -0,0 +1,12 @@ +ipv6_neighbor: + static_entries: + - ipv6_address: 11:22:33:44:55:66:77:88 + interface: Ethernet1 + mac_address: 11:22:33:44:55:66 + vrf: MGMT + - ipv6_address: ::ffff:192.1.56.10 + interface: Loopback99 + mac_address: aa:af:12:34:bc:bf + persistent: + enabled: true + refresh_delay: 1000 diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/logging.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/logging.yml index 2285d8889d8..51cd492453f 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/logging.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/logging.yml @@ -16,35 +16,65 @@ logging: source_interface: Management0 hosts: - name: 10.10.10.7 + - name: 2001:db8::10:7 - name: 30.30.30.7 protocol: tcp ports: - 100 - 200 + - name: 2001:db8::30:7 + protocol: tcp + ports: + - 100 + - 200 - name: 40.40.40.7 ports: - 300 - 400 + - name: 2001:db8::40:7 + ports: + - 300 + - 400 - name: vrf_with_no_source_interface hosts: - name: 1.2.3.4 protocol: udp + - name: 2001:db8::1:2:3:4 + protocol: udp - name: default source_interface: Loopback0 hosts: - name: 20.20.20.7 + - name: 2001:db8::20:7 - name: 50.50.50.7 protocol: tcp ports: - 100 - 200 + - name: 2001:db8::50:7 + protocol: tcp + ports: + - 100 + - 200 - name: 60.60.60.7 protocol: udp ports: - 100 - 200 + - name: 2001:db8::60:7 + protocol: udp + ports: + - 100 + - 200 event: storm_control: discards: global: true interval: 10 + level: + - facility: BGP + severity: 0 + - facility: AAA + severity: warnings + - facility: ACL + severity: critical diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/loopbacks-interfaces.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/loopbacks-interfaces.yml index 714839e661b..ef1ca6698e4 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/loopbacks-interfaces.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/loopbacks-interfaces.yml @@ -28,6 +28,7 @@ loopback_interfaces: ipv6_enable: true ipv6_address: 2002::CAFE/64 isis_enable: ISIS_TEST + isis_bfd: true isis_passive: true isis_metric: 100 isis_network_point_to_point: true diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/mac-security-eth-po-entropy.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/mac-security-eth-po-entropy.yml index 07fd8260053..0963bb68091 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/mac-security-eth-po-entropy.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/mac-security-eth-po-entropy.yml @@ -20,20 +20,28 @@ mac_security: l2_protocols: lldp: mode: bypass unauthorized + traffic_unprotected: + action: allow - name: A2 connection_keys: - id: 1234b encrypted_key: 12485744465E5A53 + traffic_unprotected: + action: allow + allow_active_sak: true - name: A3 cipher: aes256-gcm-xpn connection_keys: - id: ab encrypted_key: 10195F4C5144405A fallback: false + traffic_unprotected: + action: drop ### Mgmt sec management_security: - entropy_source: hardware + entropy_sources: + hardware: true password: encryption_key_common: true ssl_profiles: diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/management-security.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/management-security.yml index 394ab54daa4..4980e7eef54 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/management-security.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/management-security.yml @@ -1,6 +1,10 @@ ### Management Security ### management_security: - entropy_source: hardware + entropy_sources: + hardware: true + haveged: true + cpu_jitter: true + hardware_exclusive: true password: minimum_length: 17 encryption_key_common: true @@ -56,3 +60,43 @@ management_security: chain_certificate: requirement: include_root_ca: true + shared_secret_profiles: + - profile: profile0 + secrets: + - name: Secret1 + secret: $1c$mNvaIXPetcQ3hy7oUnTU3w== + receive_lifetime: + start_date_time: 12/20/2024 10:00:00 + end_date_time: 12/20/2025 10:00:00 + transmit_lifetime: + infinite: true + local_time: true + - name: Secret2 + secret: $1c$mNvaIXPetcSA2UnFwIaxwA== + secret_type: "7" + receive_lifetime: + infinite: true + transmit_lifetime: + infinite: true + - profile: profile1 + secrets: + - name: Secret3 + secret: $Ra3am9YZlbg5d65txucxTg==$DMoPxa9Wu5elK39pofFgaw==$zgEBfv+w/AIr1FnW + secret_type: "8a" + receive_lifetime: + start_date_time: "2024-12-20 10:00:00" + end_date_time: "2025-12-20 10:00:00" + transmit_lifetime: + start_date_time: "12/20/2024 10:00:00" + end_date_time: "12/10/2025 10:00:00" + - profile: profile2 + secrets: + - name: Secret4 + secret: name1_secret + secret_type: "0" + receive_lifetime: + start_date_time: "2024-12-20 10:00:00" + end_date_time: "2025-12-20 10:00:00" + transmit_lifetime: + start_date_time: "2024-12-20 10:00:00" + end_date_time: "2025-12-20 10:00:00" diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/monitor-connectivity.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/monitor-connectivity.yml index 3918a8cd059..075acd2dede 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/monitor-connectivity.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/monitor-connectivity.yml @@ -13,7 +13,20 @@ monitor_connectivity: description: server1_connectivity_monitor ip: 10.10.10.1 local_interfaces: HOST_SET + address_only: true url: https://server1.local.com + - name: server2 + description: server2_connectivity_monitor + ip: 10.10.10.2 + local_interfaces: HOST_SET + # This is default in AVD 4.x + # address_only: true + url: https://server2.local.com + - name: server3 + description: server3_connectivity_monitor + ip: 10.10.10.3 + local_interfaces: HOST_SET + address_only: false vrfs: - name: red description: vrf_connectivity_monitor @@ -29,3 +42,16 @@ monitor_connectivity: ip: 10.10.20.1 local_interfaces: VRF_HOST_SET url: https://server2.local.com + - name: blue + local_interfaces: VRF_GLOBAL_SET + address_only: false + interface_sets: + - name: VRF_GLOBAL_SET + interfaces: Vlan21-24, Vlan29-32 + hosts: + - name: server4 + description: server4_connectivity_monitor + ip: 10.10.20.1 + address_only: false + local_interfaces: VRF_HOST_SET + url: https://server2.local.com diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/monitor-layer1.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/monitor-layer1.yml index 582870e8c9c..6d9082f7f56 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/monitor-layer1.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/monitor-layer1.yml @@ -5,3 +5,4 @@ monitor_layer1: logging_transceiver: dom: true communication: true + enabled: true diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/monitor-telemetry-influx.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/monitor-telemetry-influx.yml new file mode 100644 index 00000000000..61791c051df --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/monitor-telemetry-influx.yml @@ -0,0 +1,29 @@ +monitor_telemetry_influx: + vrf: test + destinations: + - name: test + database: test + data_retention_policy: test + url: https://influx_test.localhost + username: test + password: + - name: test1 + database: test1 + data_retention_policy: test1 + url: https://influx_test1.localhost + username: test1 + password: 131112011F5D + password_type: "7" + source_group_standard_disabled: true + source_sockets: + - name: socket1 + connection_limit: 100 + url: unix:///var/run/example2.sock + - name: socket2 + connection_limit: 22222 + url: unix:///var/run/example3.sock + tags: + - name: tag1 + value: value1 + - name: tag2 + value: value2 diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/monitor-telemetry-postcard-policy.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/monitor-telemetry-postcard-policy.yml new file mode 100644 index 00000000000..f090634d6d5 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/monitor-telemetry-postcard-policy.yml @@ -0,0 +1,61 @@ +monitor_telemetry_postcard_policy: + disabled: false + ingress: + collection: + source: 10.3.3.3 + destination: 10.3.3.4 + version: 2 + sample: + rate: 16384 + tcp_udp_checksum: + value: 65000 + mask: "0xffff" + marker_vxlan: + enabled: true + header_word_zero_bit: 30 + profiles: + - name: profile1 + ingress_sample_policy: samplepo1 + - name: profile2 + ingress_sample_policy: samplepo2 + sample_policies: + - name: samplepo1 + match_rules: + - name: rule1 + type: ipv4 + destination_prefix: 10.3.3.0/24 + source_prefix: 3.4.5.0/24 + protocols: + - protocol: tcp + destination_ports: + - '77' + - 78-80 + - 82 + - protocol: udp + destination_ports: + - "99" + source_ports: + - "98" + - name: rule2 + type: ipv6 + destination_prefix: 4::0/128 + source_prefix: 5::0/128 + protocols: + - protocol: udp + destination_ports: + - '747' + - 748-800 + - name: rule3 + type: ipv4 + - name: samplepo2 + match_rules: + - name: rule1 + type: ipv4 + destination_prefix: 10.3.3.0/24 + source_prefix: 3.4.5.0/24 + protocols: + - protocol: udp + source_ports: + - bgp + destination_ports: + - https diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/patch-panel.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/patch-panel.yml index 16fefacacee..eae65a12d27 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/patch-panel.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/patch-panel.yml @@ -1,4 +1,12 @@ patch_panel: + connector: + interface: + patch: + bgp_vpws_remote_failure_errdisable: true + recovery: + review_delay: + min: 10 + max: 900 patches: - name: TEN_B_site2_site5_eline connectors: diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/policy-maps.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/policy-maps.yml index 9dce6d208d2..bba0e326e02 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/policy-maps.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/policy-maps.yml @@ -57,3 +57,14 @@ policy_maps: nexthop: ip_address: 192.168.4.2 recursive: true + copp_system_policy: + classes: + - name: copp-system-OspfIsis + shape: 1000 + bandwidth: 1000 + rate_unit: kbps + - name: copp-system-cvx + shape: 2000 + bandwidth: 2000 + rate_unit: pps + - name: copp-system-aaa diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/port-channel-interfaces.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/port-channel-interfaces.yml index ee929be99f3..2ea480d1b47 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/port-channel-interfaces.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/port-channel-interfaces.yml @@ -284,6 +284,7 @@ port_channel_interfaces: description: isis_interface_knobs type: routed isis_enable: ISIS_TEST + isis_bfd: true isis_passive: false isis_metric: 99 isis_network_point_to_point: true @@ -451,6 +452,7 @@ port_channel_interfaces: description: dot1q-tunnel mode type: switched mode: dot1q-tunnel + vlans: 115 # Children interfaces diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/ptp.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/ptp.yml index 9ae77187c01..20b4e7fa5f9 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/ptp.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/ptp.yml @@ -46,6 +46,7 @@ port_channel_interfaces: mlag: 5 ptp: enable: true + mpass: true delay_mechanism: e2e sync_message: interval: 1 diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-base.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-base.yml index a1353df0e9a..5646e2445de 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-base.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-base.yml @@ -28,6 +28,7 @@ router_bgp: always: true bestpath: d_path: true + redistribute_internal: false listen_ranges: # should render - prefix: 10.10.10.0/24 @@ -52,6 +53,14 @@ router_bgp: enabled: true default: 100G ttl_maximum_hops: 1 + missing_policy: + direction_in: + action: deny + include_prefix_list: true + include_community_list: true + direction_out: + action: permit + include_community_list: true - name: test-link-bandwidth2 link_bandwidth: enabled: true @@ -67,8 +76,6 @@ router_bgp: - prefix: 2.2.1.0/24 - prefix: 1.12.1.0/24 as_set: true - advertise_map: ADV-MAP - supress_map: SUP-MAP summary_only: true attribute_map: RM-ATTRIBUTE match_map: RM-MATCH @@ -76,16 +83,30 @@ router_bgp: redistribute_routes: - source_protocol: ospf include_leaked: true + - source_protocol: ospf + ospf_route_type: internal + - source_protocol: ospf + ospf_route_type: external + - source_protocol: ospf + ospf_route_type: nssa-external 1 + route_map: RM-REDISTRIBUTE-OSPF-NSSA-1 + include_leaked: true - source_protocol: bgp route_map: RM-REDISTRIBUTE-BGP # this should not do anything as leaked is generated when source protocol is bgp include_leaked: true + - source_protocol: connected + rcf: Router_BGP_Connected() + - source_protocol: static + rcf: Router_BGP_Static() address_family_ipv4: networks: - prefix: 10.0.0.0/8 - prefix: 172.16.0.0/12 - prefix: 192.168.0.0/16 route_map: RM-FOO-MATCH + bgp: + redistribute_internal: false peer_groups: - name: foo prefix_list_in: PL-BAR-v4-IN @@ -97,11 +118,35 @@ router_bgp: - ip_address: 192.0.2.1 prefix_list_in: PL-FOO-v4-IN prefix_list_out: PL-FOO-v4-OUT + - ip_address: 10.2.3.8 + rcf_in: Address_Family_IPV4_In() + - ip_address: 10.2.3.9 + rcf_out: Address_Family_IPV4_Out() + redistribute_routes: + - source_protocol: ospf + include_leaked: true + ospf_route_type: internal + - source_protocol: ospf + ospf_route_type: external + route_map: RM-REDISTRIBUTE-OSPF-EXTERNAL + include_leaked: true + - source_protocol: ospf + ospf_route_type: nssa-external + - source_protocol: connected + include_leaked: true + rcf: Address_Family_IPV4_Connected() + - source_protocol: bgp + - source_protocol: static + rcf: Address_Family_IPV4_Static() + - source_protocol: dynamic + route_map: Address_Family_IPV4_Dynamic_RM address_family_ipv6: networks: - prefix: 2001:db8:100::/40 - prefix: 2001:db8:200::/40 route_map: RM-BAR-MATCH + bgp: + redistribute_internal: true peer_groups: - name: baz prefix_list_in: PL-BAR-v6-IN @@ -110,15 +155,27 @@ router_bgp: - ip_address: 2001:db8::1 prefix_list_in: PL-FOO-v6-IN prefix_list_out: PL-FOO-v6-OUT + - ip_address: 2001:db8::2 + rcf_in: Address_Family_IPV6_In() + rcf_out: Address_Family_IPV6_Out() redistribute_routes: + - source_protocol: ospfv3 + include_leaked: true + ospf_route_type: external + - source_protocol: ospfv3 + ospf_route_type: internal + route_map: RM-REDISTRIBUTE-OSPF-INTERNAL + include_leaked: true + - source_protocol: ospfv3 + ospf_route_type: nssa-external 1 - source_protocol: static route_map: RM-IPV6-STATIC-TO-BGP - - source_protocol: ospf - include_leaked: true - source_protocol: bgp route_map: RM-REDISTRIBUTE-BGP # this should not do anything as leaked is generated when source protocol is bgp include_leaked: true + - source_protocol: connected + rcf: Address_Family_IPV6_Connected() neighbors: - ip_address: 192.0.3.1 remote_as: 65432 @@ -157,6 +214,14 @@ router_bgp: all: true # Testing bfd false OUTSIDE a peer group that should NOT render bfd: false + missing_policy: + direction_in: + action: deny + include_prefix_list: true + include_community_list: true + direction_out: + action: permit + include_community_list: true - ip_address: 192.0.3.3 remote_as: 65434 send_community: standard @@ -165,6 +230,12 @@ router_bgp: all: false # Test no config generation default_originate: + missing_policy: + direction_in: + action: deny + include_prefix_list: true + include_community_list: true + include_sub_route_map: true - ip_address: 192.0.3.4 remote_as: 65435 send_community: large diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-evpn-mpls.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-evpn-mpls.yml index 22bef5a9a24..e0d3b932a71 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-evpn-mpls.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-evpn-mpls.yml @@ -37,6 +37,9 @@ router_bgp: - ip_address: 192.168.255.2 peer_group: EVPN-OVERLAY-PEERS address_family_evpn: + bgp_additional_paths: + send: + limit: 10 next_hop_mpls_resolution_ribs: - rib_type: "tunnel-rib-colored" - rib_type: "tunnel-rib" @@ -48,6 +51,12 @@ router_bgp: neighbors: - ip_address: 192.168.255.3 activate: true + - ip_address: 192.168.255.4 + rcf_in: Address_Family_EVPN_In() + rcf_out: Address_Family_EVPN_Out() peer_groups: - name: EVPN-OVERLAY-PEERS activate: true + layer_2_fec_in_place_update: + enabled: true + timeout: 100 diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-evpn-vpn-import-pruning.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-evpn-vpn-import-pruning.yml index fda88081ff4..8323d8e5eba 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-evpn-vpn-import-pruning.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-evpn-vpn-import-pruning.yml @@ -33,6 +33,9 @@ router_bgp: peer_group: EVPN-OVERLAY-PEERS redistribute_routes: address_family_evpn: + bgp_additional_paths: + send: + ecmp_limit: 20 domain_identifier: "65101:0" peer_groups: - name: EVPN-OVERLAY-PEERS @@ -88,10 +91,12 @@ router_bgp: - address_family: evpn route_targets: - "11:11" + rcf: RT_IMPORT_AF_RCF() export: - address_family: evpn route_targets: - "11:11" + rcf: RT_EXPORT_AF_RCF() neighbors: - ip_address: 10.255.251.1 peer_group: MLAG-IPv4-UNDERLAY-PEER @@ -100,6 +105,10 @@ router_bgp: all: false redistribute_routes: - source_protocol: connected + - source_protocol: static + rcf: Router_BGP_Static() + - source_protocol: isis + route_map: Router_BGP_Isis - name: TENANT_A_PROJECT02 router_id: 192.168.255.3 rd: "192.168.255.3:12" diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-evpn.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-evpn.yml index 8bcfbd0aff8..3fec1ba5eaf 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-evpn.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-evpn.yml @@ -24,8 +24,14 @@ router_bgp: password: "q+VNViP5i4rVjW1cxFv2wA==" send_community: all maximum_routes: 0 + missing_policy: + direction_out: + action: permit allowas_in: enabled: true + shared_secret: + profile: profile2 + hash_algorithm: aes-128-cmac-96 - name: MLAG-IPv4-UNDERLAY-PEER type: ipv4 remote_as: 65101 @@ -34,6 +40,9 @@ router_bgp: maximum_routes: 12000 maximum_routes_warning_limit: 80 percent maximum_routes_warning_only: true + missing_policy: + direction_in: + action: deny send_community: all route_map_in: RM-MLAG-PEER-IN route_map_out: RM-MLAG-PEER-OUT @@ -43,13 +52,22 @@ router_bgp: allowas_in: enabled: true times: 5 + shared_secret: + profile: profile1 + hash_algorithm: aes-128-cmac-96 - ip_address: 192.168.255.2 peer_group: EVPN-OVERLAY-PEERS + missing_policy: + direction_out: + action: deny-in-out - ip_address: 192.168.255.3 allowas_in: enabled: true times: 5 maximum_routes: 52000 + missing_policy: + direction_in: + action: deny maximum_routes_warning_limit: 2000 maximum_routes_warning_only: true redistribute_routes: @@ -59,9 +77,26 @@ router_bgp: enable: true inter_domain: true domain_identifier: "65101:0" + neighbors: + - ip_address: 10.100.100.1 + activate: true + default_route: + enabled: true + - ip_address: 10.100.100.2 + activate: true + default_route: + enabled: true + route_map: RM_DEFAULT_ROUTE + - ip_address: 10.100.100.3 + activate: true + default_route: + enabled: true + rcf: RCF_DEFAULT_ROUTE() peer_groups: - name: EVPN-OVERLAY-PEERS activate: true + default_route: + enabled: true domain_remote: true encapsulation: vxlan - name: MLAG-IPv4-UNDERLAY-PEER @@ -109,6 +144,13 @@ router_bgp: route: import_ethernet_segment_ip_mass_withdraw: true export_ethernet_segment_ip_mass_withdraw: true + import_overlay_index_gateway: true + bgp_additional_paths: + receive: true + send: + any: true + layer_2_fec_in_place_update: + enabled: true address_family_ipv4: peer_groups: - name: EVPN-OVERLAY-PEERS @@ -200,6 +242,8 @@ router_bgp: router_id: 192.168.255.3 rd: "192.168.255.3:11" evpn_multicast: true + default_route_exports: + - address_family: evpn route_targets: import: - address_family: evpn @@ -223,6 +267,9 @@ router_bgp: - name: TENANT_A_PROJECT02 router_id: 192.168.255.3 rd: "192.168.255.3:12" + default_route_exports: + - address_family: evpn + always: true route_targets: import: - address_family: evpn @@ -251,6 +298,10 @@ router_bgp: evpn_multicast_address_family: ipv4: transit: true + default_route_exports: + - address_family: evpn + always: true + route_map: TENANT_A_PROJECT03_RM_DEFAULT route_targets: import: - address_family: evpn @@ -267,6 +318,9 @@ router_bgp: evpn_multicast_address_family: ipv4: transit: false + default_route_exports: + - address_family: evpn + rcf: TENANT_A_PROJECT03_RCF_DEFAULT() route_targets: import: - address_family: evpn diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-v4-evpn.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-v4-evpn.yml index 03a14b9dbb9..bfa0b182821 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-v4-evpn.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-v4-evpn.yml @@ -74,6 +74,9 @@ router_bgp: - source_protocol: connected route_map: RM-CONN-2-BGP address_family_evpn: + bgp_additional_paths: + send: + backup: true peer_groups: - name: EVPN-OVERLAY-PEERS activate: true @@ -193,10 +196,21 @@ router_bgp: address_family_ipv6: enabled: false originate: true # this should not get added to the configuration + - ip_address: 10.2.3.9 + activate: true + rcf_in: VRF_AFIPV4_RCF_IN() + - ip_address: 10.2.3.10 + activate: true + rcf_out: VRF_AFIPV4_RCF_OUT() networks: - prefix: 10.0.0.0/8 - prefix: 100.64.0.0/10 route_map: RM-10.2.3.4 + redistribute_routes: + - source_protocol: connected + rcf: VRF_AFIPV4_RCF_CONNECTED() + - source_protocol: static + route_map: VRF_AFIPV4_RM_STATIC redistribute_routes: - source_protocol: connected - source_protocol: static diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-v4-v6-evpn.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-v4-v6-evpn.yml index 0256a78bec9..b91a18877ac 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-v4-v6-evpn.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-v4-v6-evpn.yml @@ -77,6 +77,9 @@ router_bgp: route_map_in: RM-HIDE-AS-PATH route_map_out: RM-HIDE-AS-PATH activate: true + - name: RCF_TEST + rcf_in: Address_Family_EVPN_In() + rcf_out: Address_Family_EVPN_Out() address_family_ipv4: peer_groups: - name: IPV4-UNDERLAY @@ -85,6 +88,9 @@ router_bgp: route_map_out: RM-HIDE-AS-PATH - name: IPV4-UNDERLAY-MLAG activate: true + - name: TEST_RCF + rcf_in: Address_Family_IPV4_In() + rcf_out: Address_Family_IPV4_Out() address_family_ipv4_multicast: peer_groups: - name: IPV4-UNDERLAY @@ -92,7 +98,15 @@ router_bgp: - name: IPV4-UNDERLAY-MLAG activate: true redistribute_routes: + - source_protocol: ospf + ospf_route_type: external + - source_protocol: ospf + ospf_route_type: internal + - source_protocol: ospf + ospf_route_type: nssa-external 2 - source_protocol: attached-host + - source_protocol: isis + rcf: Router_BGP_Isis() address_family_ipv6: peer_groups: - name: IPV6-UNDERLAY @@ -101,6 +115,9 @@ router_bgp: route_map_out: RM-HIDE-AS-PATH - name: IPV6-UNDERLAY-MLAG activate: true + - name: TEST_RCF + rcf_in: Address_Family_IPV6_In() + rcf_out: Address_Family_IPV6_Out() vlans: - id: 24 rd: "10.50.64.15:10024" @@ -139,11 +156,25 @@ router_bgp: route_targets: - "1:30001" route_map: RM-DENY-DEFAULT + - address_family: vpn-ipv4 + route_targets: + - "1:30011" + rcf: RT_IMPORT_AF_RCF() + route_map: RT_IMPORT_AF_RM + vpn_route_filter_rcf: RT_IMPORT_AF_RCF_FILTER() export: - address_family: evpn route_targets: - "1:30001" + rcf: RT_EXPORT_AF_RCF() redistribute_routes: + - source_protocol: ospf + include_leaked: true + ospf_route_type: external + - source_protocol: ospfv3 + ospf_route_type: internal + - source_protocol: ospfv3 + ospf_route_type: nssa-external - source_protocol: connected - name: Tenant_B rd: "10.50.64.15:30002" diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-vpn-ipv4-vpn-ipv6.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-vpn-ipv4-vpn-ipv6.yml index 26a26677b14..82f793538e3 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-vpn-ipv4-vpn-ipv6.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-vpn-ipv4-vpn-ipv6.yml @@ -36,11 +36,17 @@ router_bgp: activate: true route_map_in: RM-IBGP-PEER-IN4 route_map_out: RM-IBGP-PEER-OUT4 + - name: Test_RCF + rcf_in: Address_Family_VPN_IPV4_In() + rcf_out: Address_Family_VPN_IPV4_Out() neighbors: - ip_address: 192.168.255.4 activate: true route_map_in: RM-NEIGHBOR-PEER-IN4 route_map_out: RM-NEIGHBOR-PEER-OUT4 + - ip_address: 192.168.255.5 + rcf_in: Address_Family_VPN_IPV4_In() + rcf_out: Address_Family_VPN_IPV4_Out() neighbor_default_encapsulation_mpls_next_hop_self: source_interface: Loopback0 address_family_vpn_ipv6: @@ -52,10 +58,16 @@ router_bgp: activate: true route_map_in: RM-IBGP-PEER-IN6 route_map_out: RM-IBGP-PEER-OUT6 + - name: Test_RCF + rcf_in: Address_Family_VPN_IPV6_In() + rcf_out: Address_Family_VPN_IPV6_Out() neighbors: - ip_address: 2001:cafe:192:168::4 activate: true route_map_in: RM-NEIGHBOR-PEER-IN6 route_map_out: RM-NEIGHBOR-PEER-OUT6 + - ip_address: 2001:cafe:192:168::5 + rcf_in: Address_Family_VPN_IPV6_In() + rcf_out: Address_Family_VPN_IPV6_Out() neighbor_default_encapsulation_mpls_next_hop_self: source_interface: Loopback0 diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-vrf-address-families.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-vrf-address-families.yml index bc085dc1328..f8866197d5f 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-vrf-address-families.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-bgp-vrf-address-families.yml @@ -21,6 +21,15 @@ router_bgp: peer_groups: - name: FOOBAR activate: false + redistribute_routes: + - source_protocol: ospfv3 + ospf_route_type: external + - source_protocol: ospf + ospf_route_type: internal + - source_protocol: ospfv3 + ospf_route_type: nssa-external 2 + - source_protocol: isis + rcf: Router_BGP_Isis() address_family_flow_spec_ipv4: peer_groups: - name: FOOBAR @@ -31,6 +40,8 @@ router_bgp: activate: false vrfs: - name: VRF01 + bgp: + redistribute_internal: false address_family_ipv4: bgp: missing_policy: @@ -41,6 +52,7 @@ router_bgp: receive: true send: ecmp_limit: 4 + redistribute_internal: false neighbors: - ip_address: 1.2.3.4 activate: true @@ -49,6 +61,17 @@ router_bgp: networks: - prefix: 2.3.4.0/24 route_map: BARFOO + redistribute_routes: + - source_protocol: ospf + ospf_route_type: external + - source_protocol: ospfv3 + ospf_route_type: internal + - source_protocol: ospf + ospf_route_type: nssa-external 1 + - source_protocol: connected + rcf: VRF_AFIPV4_RCF_CONNECTED_1() + - source_protocol: static + route_map: VRF_AFIPV4_RM_STATIC_1 address_family_ipv6: bgp: missing_policy: @@ -59,13 +82,32 @@ router_bgp: receive: true send: any: true + redistribute_internal: false neighbors: - ip_address: aa::1 activate: true route_map_in: FOO route_map_out: BAR + - ip_address: aa::2 + activate: true + rcf_in: VRF_AFIPV6_RCF_IN() + rcf_out: VRF_AFIPV6_RCF_OUT() networks: - prefix: aa::/64 + redistribute_routes: + - source_protocol: ospfv3 + ospf_route_type: external + - source_protocol: ospfv3 + include_leaked: true + ospf_route_type: internal + - source_protocol: ospfv3 + ospf_route_type: nssa-external + - source_protocol: connected + rcf: VRF_AFIPV6_RCF_CONNECTED() + - source_protocol: static + route_map: VRF_AFIPV6_RM_STATIC + - source_protocol: isis + include_leaked: true address_family_ipv4_multicast: bgp: missing_policy: @@ -81,6 +123,17 @@ router_bgp: networks: - prefix: 239.0.0.0/24 route_map: BARFOO + redistribute_routes: + - source_protocol: ospfv3 + ospf_route_type: external + - source_protocol: ospf + ospf_route_type: internal + - source_protocol: ospf + ospf_route_type: nssa-external 2 + - source_protocol: connected + rcf: VRF_AFIPV4MULTI_RCF_CONNECTED() + - source_protocol: static + route_map: VRF_AFIPV4MULTI_RM_STATIC address_family_ipv6_multicast: bgp: missing_policy: @@ -91,6 +144,17 @@ router_bgp: activate: false networks: - prefix: ff08:1::/64 + redistribute_routes: + - source_protocol: ospf + ospf_route_type: external + - source_protocol: ospfv3 + ospf_route_type: internal + - source_protocol: ospf + ospf_route_type: nssa-external + - source_protocol: connected + rcf: VRF_AFIPV6MULTI_RCF_CONNECTED() + - source_protocol: static + route_map: VRF_AFIPV6MULTI_RM_STATIC address_family_flow_spec_ipv4: bgp: missing_policy: @@ -126,3 +190,6 @@ router_bgp: additional_paths: send: ecmp: true + redistribute_routes: + - source_protocol: dynamic + rcf: VRF_RCF_DYNAMIC() diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-general.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-general.yml index 7ac74ea1cfa..e8f9161de4b 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-general.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-general.yml @@ -14,3 +14,16 @@ router_general: dynamic_prefix_lists: - name: DYNAMIC_TEST_PREFIX_LIST_2 - name: DYNAMIC_TEST_PREFIX_LIST_1 + control_functions: + code_units: + - name: code1 + content: |- + function ACCEPT_ALL() { + return true; + } + EOF + - name: code2 + content: |- + function DENY_ALL() { + return true; + } diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-isis-new.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-isis-new.yml index a7439ab7e3d..93c93778920 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-isis-new.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-isis-new.yml @@ -8,7 +8,9 @@ router_isis: mpls_ldp_sync_default: true spf_interval: interval: 250 + interval_unit: seconds wait_interval: 10 + hold_interval: 20 graceful_restart: enabled: true restart_hold_time: 10 diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-multicast.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-multicast.yml index 92d7537fbb9..fbe9ae9dd78 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-multicast.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-multicast.yml @@ -2,6 +2,7 @@ router_multicast: ipv4: + activity_polling_interval: 10 rpf: routes: - source_prefix: 10.10.10.1/32 @@ -18,6 +19,8 @@ router_multicast: routing: true multipath: "deterministic router-id" software_forwarding: sfe + ipv6: + activity_polling_interval: 20 vrfs: - name: MCAST_VRF1 ipv4: diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-segment-security.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-segment-security.yml new file mode 100644 index 00000000000..a8beade1872 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/router-segment-security.yml @@ -0,0 +1,64 @@ +### Router Segment-Security + +router_segment_security: + enabled: true + policies: + - name: POLICY-TEST1 + sequence_numbers: + - sequence: 10 + application: APP-TEST-1 + action: forward + stateless: false + - sequence: 20 + application: APP-TEST-2 + action: drop + log: true + - sequence: 25 + application: APP-TEST-3 + action: redirect + next_hop: 198.51.100.1 + vrfs: + - name: default + segments: + - name: SEGMENT-TEST1 + definition: + match_lists: + - prefix: MATCH-LIST10 + address_family: ipv4 + - prefix: MATCH-LIST11 + address_family: ipv6 + policies: + - from: MATCH-LIST22 + policy: POLICY-TEST1 + - name: SEGMENT-TEST2 + definition: + match_lists: + - prefix: MATCH-LIST4 + address_family: ipv4 + - prefix: MATCH-LIST3 + address_family: ipv6 + policies: + - from: MATCH-LIST20 + policy: policy-forward-all + - from: MATCH-LIST21 + policy: POLICY-TEST1 + - from: MATCH-LIST30 + policy: policy-drop-all + - name: SECURE + segments: + - name: SEGMENT-TEST1 + definition: + match_lists: + - covered_prefix_list: PREFIX-LIST10 + address_family: ipv4 + - covered_prefix_list: PREFIX-LIST1 + address_family: ipv6 + interfaces: + - Ethernet1 + - Ethernet2 + policies: + - from: MATCH-LIST20 + policy: policy-forward-all + - from: MATCH-LIST30 + policy: policy-drop-all + fallback_policy: policy-custom diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/vlan-interfaces.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/vlan-interfaces.yml index a2a6e638762..ce6784b94bf 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/vlan-interfaces.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/host_vars/vlan-interfaces.yml @@ -19,6 +19,7 @@ vlan_interfaces: ip_address_virtual: 10.2.2.1/24 no_autostate: true isis_enable: "EVPN_UNDERLAY" + isis_bfd: true ip_verify_unicast_source_reachable_via: rx - name: Vlan81 @@ -348,7 +349,7 @@ vlan_interfaces: arp_aging_timeout: 180 ip_address: 192.0.2.2/25 ipv6_enable: true - ipv6_address: 2001:db8::2/64 + ipv6_address: 2001:db8:667::2/64 ipv6_address_link_local: fe80::2/64 vrrp_ids: - id: 1 @@ -367,7 +368,7 @@ vlan_interfaces: enabled: true delay: ipv6: - address: 2001:db8::1 + address: 2001:db8:667::1 - name: Vlan333 description: Multiple VRIDs and tracking @@ -375,7 +376,7 @@ vlan_interfaces: arp_aging_timeout: 180 ip_address: 192.0.2.2/25 ipv6_enable: true - ipv6_address: 2001:db8::2/64 + ipv6_address: 2001:db8:333::2/64 ipv6_address_link_local: fe80::2/64 vrrp_ids: - id: 1 @@ -399,7 +400,7 @@ vlan_interfaces: enabled: true delay: ipv6: - address: 2001:db8::1 + address: 2001:db8:333::1 tracked_object: - name: ID2-TrackedObjectDecrement decrement: 10 @@ -418,7 +419,7 @@ vlan_interfaces: - name: Vlan334 description: v6 attached host exports ipv6_enable: true - ipv6_address: 2a00:1::1/64 + ipv6_address: 2001:db8:334::1/64 ipv6_attached_host_route_export: enabled: true distance: 19 @@ -426,7 +427,7 @@ vlan_interfaces: - name: Vlan335 description: v6 attached host exports ipv6_enable: true - ipv6_address: 2a00:2::1/64 + ipv6_address: 2001:db8:335::1/64 ipv6_attached_host_route_export: enabled: true prefix_length: 64 @@ -434,8 +435,28 @@ vlan_interfaces: - name: Vlan336 description: v6 attached host exports ipv6_enable: true - ipv6_address: 2a00:3::1/64 + ipv6_address: 2001:db8:336::1/64 ipv6_attached_host_route_export: enabled: true distance: 18 prefix_length: 64 + + - name: Vlan337 + description: v4 dhcp relay all-subnets + ip_address: 10.0.2.2/25 + ip_dhcp_relay_all_subnets: true + + - name: Vlan338 + description: v6 dhcp relay all-subnets + ipv6_address: 2001:db8:338::1/64 + ipv6_dhcp_relay_all_subnets: true + + - name: Vlan339 + description: v6 nd options + ipv6_enable: true + ipv6_address: 2001:db8:339::1/64 + ipv6_nd_other_config_flag: true + ipv6_nd_cache: + dynamic_capacity: 900 + expire: 250 + refresh_always: true diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/hosts.ini b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/hosts.ini index 6e51350f3d3..d0475ea5236 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/hosts.ini +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/hosts.ini @@ -1,4 +1,4 @@ -[test-hosts] +[test_hosts] ; ls -l | gawk -F ' ' '{print $9}'| gawk -F '.' '{print $1}' aaa aaa-2 @@ -57,6 +57,8 @@ ip-radius-source-interface ip-tacacs-source-interface ip-client-source-interfaces ipv6-access-lists +ipv6-dhcp-relay +ipv6-neighbors ipv6-static-routes l2-protocol-forwarding lacp @@ -92,6 +94,8 @@ mlag-configuration monitor-layer1 monitor-connectivity monitor-sessions +monitor-telemetry-influx +monitor-telemetry-postcard-policy mpls none_configuration ntp @@ -149,6 +153,7 @@ service-routing-protocols-model service-routing-protocols-model-2 router-general router-traffic-engineering +router-segment-security sflow snmp snmp-server-traps diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen_deprecated_vars/converge.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen_deprecated_vars/converge.yml index 29b2b0637e5..7cf935c5b7b 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen_deprecated_vars/converge.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen_deprecated_vars/converge.yml @@ -1,6 +1,6 @@ --- - name: Converge - hosts: test-hosts + hosts: test_hosts gather_facts: false connection: local tasks: diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen_deprecated_vars/create.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen_deprecated_vars/create.yml index c8798d2acb1..4f7582d5a49 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen_deprecated_vars/create.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen_deprecated_vars/create.yml @@ -1,6 +1,6 @@ --- - name: Configure local folders - hosts: test-hosts + hosts: test_hosts gather_facts: false connection: local tasks: diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen_deprecated_vars/destroy.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen_deprecated_vars/destroy.yml index 6971829f170..ef414eee898 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen_deprecated_vars/destroy.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen_deprecated_vars/destroy.yml @@ -1,6 +1,6 @@ --- - name: Remove output folders - hosts: test-hosts + hosts: test_hosts gather_facts: false connection: local tasks: diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen_deprecated_vars/documentation/devices/host1.md b/ansible_collections/arista/avd/molecule/eos_cli_config_gen_deprecated_vars/documentation/devices/host1.md index 023f9823fa2..e5a9f0af838 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen_deprecated_vars/documentation/devices/host1.md +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen_deprecated_vars/documentation/devices/host1.md @@ -12,6 +12,9 @@ - [Authentication](#authentication) - [Local Users](#local-users) - [RADIUS Server](#radius-server) +- [Management Security](#management-security) + - [Management Security Summary](#management-security-summary) + - [Management Security Device Configuration](#management-security-device-configuration) - [Monitoring](#monitoring) - [TerminAttr Daemon](#terminattr-daemon) - [Custom daemons](#custom-daemons) @@ -270,6 +273,22 @@ radius-server host 10.10.10.249 key 7 radius-server host 10.10.10.158 key 7 ``` +## Management Security + +### Management Security Summary + +| Settings | Value | +| -------- | ----- | +| Entropy source | hardware | + +### Management Security Device Configuration + +```eos +! +management security + entropy source hardware +``` + ## Monitoring ### TerminAttr Daemon @@ -431,10 +450,10 @@ vmtracer session session_2 #### Event Handler Summary -| Handler | Action Type | Action | Trigger | -| ------- | ----------- | ------ | ------- | -| CONFIG_VERSIONING | bash | FN=/mnt/flash/startup-config; LFN="`ls -1 $FN.*-* \| tail -n 1`"; if [ -z "$LFN" -o -n "`diff -I 'last modified' $FN $LFN`" ]; then cp $FN $FN.`date +%Y%m%d-%H%M%S`; ls -1r $FN.*-* \| tail -n +11 \| xargs -I % rm %; fi | on-startup-config | -| evpn-blacklist-recovery | bash | FastCli -p 15 -c "clear bgp evpn host-flap" | on-logging | +| Handler | Actions | Trigger | Trigger Config | +| ------- | ------- | ------- | -------------- | +| CONFIG_VERSIONING | bash FN=/mnt/flash/startup-config; LFN="`ls -1 $FN.*-* \| tail -n 1`"; if [ -z "$LFN" -o -n "`diff -I 'last modified' $FN $LFN`" ]; then cp $FN $FN.`date +%Y%m%d-%H%M%S`; ls -1r $FN.*-* \| tail -n +11 \| xargs -I % rm %; fi | on-startup-config | - | +| evpn-blacklist-recovery | bash FastCli -p 15 -c "clear bgp evpn host-flap" | on-logging | - | #### Event Handler Device Configuration @@ -849,11 +868,11 @@ interface Tunnel4 ##### IPv6 -| Interface | VRF | IPv6 Address | IPv6 Virtual Addresses | Virtual Router Address | VRRP | ND RA Disabled | Managed Config Flag | IPv6 ACL In | IPv6 ACL Out | -| --------- | --- | ------------ | ---------------------- | ---------------------- | ---- | -------------- | ------------------- | ----------- | ------------ | -| Vlan1 | default | - | fc00:10:10:1::1/64 | - | - | - | - | - | - | -| Vlan2 | default | 1b11:3a00:22b0:5200::15/64 | fc00:10:10:2::1/64, fc00:10:11:2::1/64, fc00:10:12:2::1/64 | - | - | - | True | - | - | -| Vlan3 | default | 1b11:3a00:22b3:5200::15/64 | - | fc00:10:10:3::1/64 | - | - | - | - | - | +| Interface | VRF | IPv6 Address | IPv6 Virtual Addresses | Virtual Router Address | VRRP | ND RA Disabled | Managed Config Flag | Other Config Flag | IPv6 ACL In | IPv6 ACL Out | +| --------- | --- | ------------ | ---------------------- | ---------------------- | ---- | -------------- | ------------------- | ----------------- | ----------- | ------------ | +| Vlan1 | default | - | fc00:10:10:1::1/64 | - | - | - | - | - | - | - | +| Vlan2 | default | 1b11:3a00:22b0:5200::15/64 | fc00:10:10:2::1/64, fc00:10:11:2::1/64, fc00:10:12:2::1/64 | - | - | - | True | - | - | - | +| Vlan3 | default | 1b11:3a00:22b3:5200::15/64 | - | fc00:10:10:3::1/64 | - | - | - | - | - | - | #### VLAN Interfaces Device Configuration @@ -1068,9 +1087,9 @@ ASN Notation: asplain | -------- | --------- | --- | -------- | -------------- | -------------- | ---------- | --- | --------------------- | ---------------------- | ------- | ------------ | | 192.168.255.1 | Inherited from peer group EVPN-OVERLAY-PEERS | default | - | - | - | - | - | - | - | - | - | | 192.168.255.2 | Inherited from peer group EVPN-OVERLAY-PEERS | default | - | - | - | - | - | - | - | - | - | -| 10.255.251.1 | Inherited from peer group EVPN-OVERLAY-PEERS | TENANT_A_PROJECT01 | - | - | - | - | - | - | - | - | -| 10.2.3.4 | - | TENANT_A_PROJECT01 | - | - | - | - | - | - | - | - | -| 10.2.3.5 | - | TENANT_A_PROJECT01 | - | - | - | - | - | - | - | - | +| 10.255.251.1 | Inherited from peer group EVPN-OVERLAY-PEERS | TENANT_A_PROJECT01 | - | - | - | - | - | - | - | - | - | +| 10.2.3.4 | - | TENANT_A_PROJECT01 | - | - | - | - | - | - | - | - | - | +| 10.2.3.5 | - | TENANT_A_PROJECT01 | - | - | - | - | - | - | - | - | - | #### BGP Neighbor Interfaces @@ -1081,10 +1100,10 @@ ASN Notation: asplain #### BGP Route Aggregation -| Prefix | AS Set | Advertise Map | Supress Map | Summary Only | Attribute Map | Match Map | Advertise Only | -| ------ | ------ | ------------- | ----------- | ------------ | ------------- | --------- | -------------- | -| 1.1.1.0/24 | False | - | - | False | - | - | True | -| 2.2.1.0/24 | False | - | - | False | - | - | False | +| Prefix | AS Set | Summary Only | Attribute Map | Match Map | Advertise Only | +| ------ | ------ | ------------ | ------------- | --------- | -------------- | +| 1.1.1.0/24 | False | False | - | - | True | +| 2.2.1.0/24 | False | False | - | - | False | #### Router BGP EVPN Address Family @@ -1098,29 +1117,29 @@ ASN Notation: asplain ##### VPN-IPv4 Neighbors -| Neighbor | Activate | Route-map In | Route-map Out | -| -------- | -------- | ------------ | ------------- | -| 192.168.255.4 | True | - | - | +| Neighbor | Activate | Route-map In | Route-map Out | RCF In | RCF Out | +| -------- | -------- | ------------ | ------------- | ------ | ------- | +| 192.168.255.4 | True | - | - | - | - | ##### VPN-IPv4 Peer Groups -| Peer Group | Activate | Route-map In | Route-map Out | -| ---------- | -------- | ------------ | ------------- | -| EVPN-OVERLAY-PEERS | True | - | - | +| Peer Group | Activate | Route-map In | Route-map Out | RCF In | RCF Out | +| ---------- | -------- | ------------ | ------------- | ------ | ------- | +| EVPN-OVERLAY-PEERS | True | - | - | - | - | #### Router BGP VPN-IPv6 Address Family ##### VPN-IPv6 Neighbors -| Neighbor | Activate | Route-map In | Route-map Out | -| -------- | -------- | ------------ | ------------- | -| 2001:cafe:192:168::4 | True | - | - | +| Neighbor | Activate | Route-map In | Route-map Out | RCF In | RCF Out | +| -------- | -------- | ------------ | ------------- | ------ | ------- | +| 2001:cafe:192:168::4 | True | - | - | - | - | ##### VPN-IPv6 Peer Groups -| Peer Group | Activate | Route-map In | Route-map Out | -| ---------- | -------- | ------------ | ------------- | -| EVPN-OVERLAY-PEERS | True | - | - | +| Peer Group | Activate | Route-map In | Route-map Out | RCF In | RCF Out | +| ---------- | -------- | ------------ | ------------- | ------ | ------- | +| EVPN-OVERLAY-PEERS | True | - | - | - | - | #### Router BGP VLAN Aware Bundles @@ -1648,17 +1667,17 @@ FIPS restrictions enabled. ###### Settings -| Cipher | Key-Server Priority | Rekey-Period | SCI | -| ------ | ------------------- | ------------ | --- | -| - | - | - | True | +| Cipher | Key-Server Priority | Rekey-Period | SCI | Traffic Unprotected Fallback | +| ------ | ------------------- | ------------ | --- | ---------------------------- | +| - | - | - | True | - | ##### Profile A2 ###### Settings -| Cipher | Key-Server Priority | Rekey-Period | SCI | -| ------ | ------------------- | ------------ | --- | -| - | - | - | - | +| Cipher | Key-Server Priority | Rekey-Period | SCI | Traffic Unprotected Fallback | +| ------ | ------------------- | ------------ | --- | ---------------------------- | +| - | - | - | - | - | ###### Keys diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen_deprecated_vars/intended/configs/host1.cfg b/ansible_collections/arista/avd/molecule/eos_cli_config_gen_deprecated_vars/intended/configs/host1.cfg index cc531ccc3c8..5405be908d7 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen_deprecated_vars/intended/configs/host1.cfg +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen_deprecated_vars/intended/configs/host1.cfg @@ -619,6 +619,9 @@ management api gnmi vrf MONITORING provider eos-native ! +management security + entropy source hardware +! stun server local-interface Ethernet1 diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen_deprecated_vars/inventory/host_vars/host1/event-handlers.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen_deprecated_vars/inventory/host_vars/host1/event-handlers.yml index 2a2500be7ba..0c1d34a8bbc 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen_deprecated_vars/inventory/host_vars/host1/event-handlers.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen_deprecated_vars/inventory/host_vars/host1/event-handlers.yml @@ -4,10 +4,12 @@ # Dict type is deprecated in 4.0.0. To be removed in 5.0.0 event_handlers: evpn-blacklist-recovery: + # Testing "action_type" and "action" key which are deprecared and will be removed in 5.0.0 action_type: bash action: FastCli -p 15 -c "clear bgp evpn host-flap" delay: 300 trigger: on-logging + # Testing "regex" key which is deprecared and will be removed in 5.0.0 regex: EVPN-3-BLACKLISTED_DUPLICATE_MAC asynchronous: true CONFIG_VERSIONING: diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen_deprecated_vars/inventory/host_vars/host1/management-security.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen_deprecated_vars/inventory/host_vars/host1/management-security.yml new file mode 100644 index 00000000000..702ce8b1740 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen_deprecated_vars/inventory/host_vars/host1/management-security.yml @@ -0,0 +1,6 @@ +### Management Security + +management_security: + # Testing entropy source as string + # String type is deprecated. To be removed in 5.0.0 + entropy_source: hardware diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen_deprecated_vars/inventory/hosts.ini b/ansible_collections/arista/avd/molecule/eos_cli_config_gen_deprecated_vars/inventory/hosts.ini index 16977f31cd9..232d6940908 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen_deprecated_vars/inventory/hosts.ini +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen_deprecated_vars/inventory/hosts.ini @@ -1,3 +1,3 @@ -[test-hosts] +[test_hosts] host1 host2 diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen_negative_unit_tests/inventory/host_vars/hardware-counters.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen_negative_unit_tests/inventory/host_vars/hardware-counters.yml index 79da5961b79..459a8dacc1d 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen_negative_unit_tests/inventory/host_vars/hardware-counters.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen_negative_unit_tests/inventory/host_vars/hardware-counters.yml @@ -5,4 +5,4 @@ hardware_counters: features: - qos: in -expected_error_message: "The data model 'hardware_counters' changed in AVD4.0.0. 'hardware_counters.features.name' was expected but not set!" +expected_error_message: "The data model 'hardware_counters' changed in AVD4.0.0. 'hardware_counters.features.name' was expected but not set." diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen_negative_unit_tests/inventory/host_vars/router-bfd-dangerous-interval-false.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen_negative_unit_tests/inventory/host_vars/router-bfd-dangerous-interval-false.yml index 3116ac453ab..6e2172a8173 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen_negative_unit_tests/inventory/host_vars/router-bfd-dangerous-interval-false.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen_negative_unit_tests/inventory/host_vars/router-bfd-dangerous-interval-false.yml @@ -4,4 +4,4 @@ router_bfd: session_snapshot_interval: 6 session_snapshot_interval_dangerous: false -expected_error_message: "router_bfd.session_snapshot_interval_dangerous was set to False but we expected True!" +expected_error_message: "Error during plugin execution: router_bfd.session_snapshot_interval_dangerous was set to False but we expected True!" diff --git a/ansible_collections/arista/avd/molecule/eos_cli_config_gen_negative_unit_tests/inventory/host_vars/router-bfd-dangerous-interval-not-set.yml b/ansible_collections/arista/avd/molecule/eos_cli_config_gen_negative_unit_tests/inventory/host_vars/router-bfd-dangerous-interval-not-set.yml index c8da6513fdc..d62e905807f 100644 --- a/ansible_collections/arista/avd/molecule/eos_cli_config_gen_negative_unit_tests/inventory/host_vars/router-bfd-dangerous-interval-not-set.yml +++ b/ansible_collections/arista/avd/molecule/eos_cli_config_gen_negative_unit_tests/inventory/host_vars/router-bfd-dangerous-interval-not-set.yml @@ -3,4 +3,4 @@ router_bfd: session_snapshot_interval: 3 -expected_error_message: "router_bfd.session_snapshot_interval_dangerous was expected but not set!" +expected_error_message: "Error during plugin execution: router_bfd.session_snapshot_interval_dangerous was expected but not set!" diff --git a/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/documentation/devices/DC1-BL1A.md b/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/documentation/devices/DC1-BL1A.md index e4fa1fcd815..a309b185688 100644 --- a/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/documentation/devices/DC1-BL1A.md +++ b/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/documentation/devices/DC1-BL1A.md @@ -678,9 +678,9 @@ ASN Notation: asplain | 192.168.255.2 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.3 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.4 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | -| 10.255.251.11 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_WAN_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.251.11 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_B_WAN_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.251.11 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_C_WAN_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | +| 10.255.251.11 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_WAN_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.251.11 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_B_WAN_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.251.11 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_C_WAN_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | #### Router BGP EVPN Address Family diff --git a/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/documentation/devices/DC1-BL1B.md b/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/documentation/devices/DC1-BL1B.md index c405ffb88c2..ac231d46e15 100644 --- a/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/documentation/devices/DC1-BL1B.md +++ b/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/documentation/devices/DC1-BL1B.md @@ -678,9 +678,9 @@ ASN Notation: asplain | 192.168.255.2 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.3 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.4 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | -| 10.255.251.10 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_WAN_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.251.10 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_B_WAN_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.251.10 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_C_WAN_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | +| 10.255.251.10 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_WAN_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.251.10 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_B_WAN_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.251.10 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_C_WAN_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | #### Router BGP EVPN Address Family diff --git a/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/documentation/devices/DC1-LEAF2A.md b/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/documentation/devices/DC1-LEAF2A.md index 1a84b470a0b..1183374fb69 100644 --- a/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/documentation/devices/DC1-LEAF2A.md +++ b/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/documentation/devices/DC1-LEAF2A.md @@ -905,12 +905,12 @@ ASN Notation: asplain | 192.168.255.2 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.3 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.4 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | -| 10.255.251.3 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_APP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.251.3 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_DB_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.251.3 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_OP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.251.3 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_WEB_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.251.3 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_B_OP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.251.3 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_C_OP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | +| 10.255.251.3 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_APP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.251.3 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_DB_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.251.3 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_OP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.251.3 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_WEB_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.251.3 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_B_OP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.251.3 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_C_OP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | #### Router BGP EVPN Address Family diff --git a/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/documentation/devices/DC1-LEAF2B.md b/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/documentation/devices/DC1-LEAF2B.md index b2189ce11cf..8f350c7631e 100644 --- a/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/documentation/devices/DC1-LEAF2B.md +++ b/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/documentation/devices/DC1-LEAF2B.md @@ -905,12 +905,12 @@ ASN Notation: asplain | 192.168.255.2 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.3 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.4 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | -| 10.255.251.2 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_APP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.251.2 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_DB_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.251.2 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_OP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.251.2 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_WEB_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.251.2 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_B_OP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.251.2 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_C_OP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | +| 10.255.251.2 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_APP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.251.2 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_DB_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.251.2 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_OP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.251.2 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_WEB_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.251.2 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_B_OP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.251.2 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_C_OP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | #### Router BGP EVPN Address Family diff --git a/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/documentation/devices/DC1-SVC3A.md b/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/documentation/devices/DC1-SVC3A.md index e48d47c6060..6860f40a801 100644 --- a/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/documentation/devices/DC1-SVC3A.md +++ b/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/documentation/devices/DC1-SVC3A.md @@ -1021,15 +1021,15 @@ ASN Notation: asplain | 192.168.255.2 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.3 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.4 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | -| 10.255.251.7 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_APP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.251.7 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_DB_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.251.7 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_OP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.251.7 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_WAN_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.251.7 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_WEB_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.251.7 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_B_OP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.251.7 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_B_WAN_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.251.7 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_C_OP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.251.7 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_C_WAN_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | +| 10.255.251.7 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_APP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.251.7 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_DB_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.251.7 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_OP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.251.7 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_WAN_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.251.7 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_WEB_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.251.7 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_B_OP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.251.7 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_B_WAN_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.251.7 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_C_OP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.251.7 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_C_WAN_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | #### Router BGP EVPN Address Family diff --git a/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/documentation/devices/DC1-SVC3B.md b/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/documentation/devices/DC1-SVC3B.md index c9314ada7c7..ff9f3a8aee1 100644 --- a/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/documentation/devices/DC1-SVC3B.md +++ b/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/documentation/devices/DC1-SVC3B.md @@ -995,15 +995,15 @@ ASN Notation: asplain | 192.168.255.2 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.3 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.4 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | -| 10.255.251.6 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_APP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.251.6 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_DB_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.251.6 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_OP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.251.6 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_WAN_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.251.6 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_WEB_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.251.6 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_B_OP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.251.6 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_B_WAN_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.251.6 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_C_OP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | -| 10.255.251.6 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_C_WAN_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | +| 10.255.251.6 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_APP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.251.6 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_DB_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.251.6 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_OP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.251.6 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_WAN_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.251.6 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_A_WEB_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.251.6 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_B_OP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.251.6 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_B_WAN_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.251.6 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_C_OP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | +| 10.255.251.6 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_C_WAN_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | #### Router BGP EVPN Address Family diff --git a/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/intended/structured_configs/DC1-BL1A.yml b/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/intended/structured_configs/DC1-BL1A.yml index 10da6567cc5..34e61dddb04 100644 --- a/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/intended/structured_configs/DC1-BL1A.yml +++ b/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/intended/structured_configs/DC1-BL1A.yml @@ -296,9 +296,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.10/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.10/31 - name: Vlan150 tenant: Tenant_A tags: diff --git a/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/intended/structured_configs/DC1-BL1B.yml b/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/intended/structured_configs/DC1-BL1B.yml index e09bff271aa..9bb7ad77582 100644 --- a/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/intended/structured_configs/DC1-BL1B.yml +++ b/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/intended/structured_configs/DC1-BL1B.yml @@ -296,9 +296,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.11/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.11/31 - name: Vlan150 tenant: Tenant_A tags: diff --git a/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/intended/structured_configs/DC1-L2LEAF2A.yml b/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/intended/structured_configs/DC1-L2LEAF2A.yml index 25297b09622..cc4d4b7d2d3 100644 --- a/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/intended/structured_configs/DC1-L2LEAF2A.yml +++ b/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/intended/structured_configs/DC1-L2LEAF2A.yml @@ -118,9 +118,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.16/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.16/31 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_DC1-L2LEAF2B_Po3 diff --git a/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/intended/structured_configs/DC1-L2LEAF2B.yml b/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/intended/structured_configs/DC1-L2LEAF2B.yml index feeeb113bc9..d61aefce92a 100644 --- a/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/intended/structured_configs/DC1-L2LEAF2B.yml +++ b/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/intended/structured_configs/DC1-L2LEAF2B.yml @@ -118,9 +118,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.17/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.17/31 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_DC1-L2LEAF2A_Po3 diff --git a/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/intended/structured_configs/DC1-LEAF2A.yml b/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/intended/structured_configs/DC1-LEAF2A.yml index 3fdcab59bac..d48b8951777 100644 --- a/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/intended/structured_configs/DC1-LEAF2A.yml +++ b/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/intended/structured_configs/DC1-LEAF2A.yml @@ -428,9 +428,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.2/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.2/31 - name: Vlan130 tenant: Tenant_A tags: diff --git a/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/intended/structured_configs/DC1-LEAF2B.yml b/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/intended/structured_configs/DC1-LEAF2B.yml index 2a8a606a3a4..fede5822f45 100644 --- a/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/intended/structured_configs/DC1-LEAF2B.yml +++ b/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/intended/structured_configs/DC1-LEAF2B.yml @@ -428,9 +428,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.3/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.3/31 - name: Vlan130 tenant: Tenant_A tags: diff --git a/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/intended/structured_configs/DC1-SVC3A.yml b/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/intended/structured_configs/DC1-SVC3A.yml index 374b1b8ea39..b8ed17a7a40 100644 --- a/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/intended/structured_configs/DC1-SVC3A.yml +++ b/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/intended/structured_configs/DC1-SVC3A.yml @@ -542,9 +542,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.6/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.6/31 - name: Vlan130 tenant: Tenant_A tags: diff --git a/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/intended/structured_configs/DC1-SVC3B.yml b/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/intended/structured_configs/DC1-SVC3B.yml index 8f1609290d6..ca66b1b3694 100644 --- a/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/intended/structured_configs/DC1-SVC3B.yml +++ b/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/intended/structured_configs/DC1-SVC3B.yml @@ -542,9 +542,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.7/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.7/31 - name: Vlan130 tenant: Tenant_A tags: diff --git a/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/inventory/host_vars/cv_server.yml b/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/inventory/host_vars/cv_server.yml deleted file mode 100644 index 4faf7e96480..00000000000 --- a/ansible_collections/arista/avd/molecule/eos_config_deploy_cvp/inventory/host_vars/cv_server.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -ansible_python_interpreter: $(which python3) diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/BGP-LEAF1.md b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/BGP-LEAF1.md index aa107ef97b5..2a5764d7e6d 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/BGP-LEAF1.md +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/BGP-LEAF1.md @@ -13,6 +13,7 @@ - [Interfaces](#interfaces) - [Ethernet Interfaces](#ethernet-interfaces) - [Port-Channel Interfaces](#port-channel-interfaces) + - [VLAN Interfaces](#vlan-interfaces) - [Routing](#routing) - [Service Routing Protocols Model](#service-routing-protocols-model) - [IP Routing](#ip-routing) @@ -76,6 +77,7 @@ vlan internal order ascending range 1006 1199 | 1 | SVI_1 | - | | 100 | SVI_100 | - | | 200 | SVI_200 | - | +| 4092 | INBAND_MGMT | - | ### VLANs Device Configuration @@ -89,6 +91,9 @@ vlan 100 ! vlan 200 name SVI_200 +! +vlan 4092 + name INBAND_MGMT ``` ## Interfaces @@ -101,8 +106,8 @@ vlan 200 | Interface | Description | Mode | VLANs | Native VLAN | Trunk Group | Channel-Group | | --------- | ----------- | ---- | ----- | ----------- | ----------- | ------------- | -| Ethernet1 | BGP-SPINE1_Ethernet1 | *trunk | *1,100,200 | *- | *- | 1 | -| Ethernet2 | BGP-SPINE2_Ethernet1 | *trunk | *1,100,200 | *- | *- | 1 | +| Ethernet1 | BGP-SPINE1_Ethernet1 | *trunk | *1,100,200,4092 | *- | *- | 1 | +| Ethernet2 | BGP-SPINE2_Ethernet1 | *trunk | *1,100,200,4092 | *- | *- | 1 | | Ethernet10 | Endpoint | access | 100 | - | - | - | | Ethernet11 | Endpoint | access | 100 | - | - | - | | Ethernet12 | IP Phone | trunk phone | - | 100 | - | - | @@ -182,7 +187,7 @@ interface Ethernet14 | Interface | Description | Type | Mode | VLANs | Native VLAN | Trunk Group | LACP Fallback Timeout | LACP Fallback Mode | MLAG ID | EVPN ESI | | --------- | ----------- | ---- | ---- | ----- | ----------- | ------------| --------------------- | ------------------ | ------- | -------- | -| Port-Channel1 | BGP_SPINES_Po1 | switched | trunk | 1,100,200 | - | - | - | - | - | - | +| Port-Channel1 | BGP_SPINES_Po1 | switched | trunk | 1,100,200,4092 | - | - | - | - | - | - | #### Port-Channel Interfaces Device Configuration @@ -192,10 +197,35 @@ interface Port-Channel1 description BGP_SPINES_Po1 no shutdown switchport - switchport trunk allowed vlan 1,100,200 + switchport trunk allowed vlan 1,100,200,4092 switchport mode trunk ``` +### VLAN Interfaces + +#### VLAN Interfaces Summary + +| Interface | Description | VRF | MTU | Shutdown | +| --------- | ----------- | --- | ---- | -------- | +| Vlan4092 | Inband Management | default | 1500 | False | + +##### IPv4 + +| Interface | VRF | IP Address | IP Address Virtual | IP Router Virtual Address | VRRP | ACL In | ACL Out | +| --------- | --- | ---------- | ------------------ | ------------------------- | ---- | ------ | ------- | +| Vlan4092 | default | 172.23.254.4/24 | - | - | - | - | - | + +#### VLAN Interfaces Device Configuration + +```eos +! +interface Vlan4092 + description Inband Management + no shutdown + mtu 1500 + ip address 172.23.254.4/24 +``` + ## Routing ### Service Routing Protocols Model @@ -238,12 +268,14 @@ no ip routing vrf MGMT | VRF | Destination Prefix | Next Hop IP | Exit interface | Administrative Distance | Tag | Route Name | Metric | | --- | ------------------ | ----------- | -------------- | ----------------------- | --- | ---------- | ------ | | MGMT | 0.0.0.0/0 | 172.31.0.1 | - | 1 | - | - | - | +| default | 0.0.0.0/0 | 172.23.254.1 | - | 1 | - | - | - | #### Static Routes Device Configuration ```eos ! ip route vrf MGMT 0.0.0.0/0 172.31.0.1 +ip route 0.0.0.0/0 172.23.254.1 ``` ## Multicast diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/BGP-LEAF2.md b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/BGP-LEAF2.md index 356e6f53122..028ec7f1881 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/BGP-LEAF2.md +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/BGP-LEAF2.md @@ -13,6 +13,7 @@ - [Interfaces](#interfaces) - [Ethernet Interfaces](#ethernet-interfaces) - [Port-Channel Interfaces](#port-channel-interfaces) + - [VLAN Interfaces](#vlan-interfaces) - [Routing](#routing) - [Service Routing Protocols Model](#service-routing-protocols-model) - [IP Routing](#ip-routing) @@ -74,6 +75,7 @@ vlan internal order ascending range 1006 1199 | VLAN ID | Name | Trunk Groups | | ------- | ---- | ------------ | | 100 | SVI_100 | - | +| 4092 | INBAND_MGMT | - | ### VLANs Device Configuration @@ -81,6 +83,9 @@ vlan internal order ascending range 1006 1199 ! vlan 100 name SVI_100 +! +vlan 4092 + name INBAND_MGMT ``` ## Interfaces @@ -93,8 +98,8 @@ vlan 100 | Interface | Description | Mode | VLANs | Native VLAN | Trunk Group | Channel-Group | | --------- | ----------- | ---- | ----- | ----------- | ----------- | ------------- | -| Ethernet1 | BGP-SPINE1_Ethernet2 | *trunk | *100 | *- | *- | 1 | -| Ethernet2 | BGP-SPINE2_Ethernet2 | *trunk | *100 | *- | *- | 1 | +| Ethernet1 | BGP-SPINE1_Ethernet2 | *trunk | *100,4092 | *- | *- | 1 | +| Ethernet2 | BGP-SPINE2_Ethernet2 | *trunk | *100,4092 | *- | *- | 1 | | Ethernet10 | Endpoint | access | 100 | - | - | - | | Ethernet11 | Endpoint | access | 100 | - | - | - | @@ -137,7 +142,7 @@ interface Ethernet11 | Interface | Description | Type | Mode | VLANs | Native VLAN | Trunk Group | LACP Fallback Timeout | LACP Fallback Mode | MLAG ID | EVPN ESI | | --------- | ----------- | ---- | ---- | ----- | ----------- | ------------| --------------------- | ------------------ | ------- | -------- | -| Port-Channel1 | BGP_SPINES_Po2 | switched | trunk | 100 | - | - | - | - | - | - | +| Port-Channel1 | BGP_SPINES_Po2 | switched | trunk | 100,4092 | - | - | - | - | - | - | #### Port-Channel Interfaces Device Configuration @@ -147,10 +152,35 @@ interface Port-Channel1 description BGP_SPINES_Po2 no shutdown switchport - switchport trunk allowed vlan 100 + switchport trunk allowed vlan 100,4092 switchport mode trunk ``` +### VLAN Interfaces + +#### VLAN Interfaces Summary + +| Interface | Description | VRF | MTU | Shutdown | +| --------- | ----------- | --- | ---- | -------- | +| Vlan4092 | Inband Management | default | 1500 | False | + +##### IPv4 + +| Interface | VRF | IP Address | IP Address Virtual | IP Router Virtual Address | VRRP | ACL In | ACL Out | +| --------- | --- | ---------- | ------------------ | ------------------------- | ---- | ------ | ------- | +| Vlan4092 | default | 172.23.254.5/24 | - | - | - | - | - | + +#### VLAN Interfaces Device Configuration + +```eos +! +interface Vlan4092 + description Inband Management + no shutdown + mtu 1500 + ip address 172.23.254.5/24 +``` + ## Routing ### Service Routing Protocols Model @@ -193,12 +223,14 @@ no ip routing vrf MGMT | VRF | Destination Prefix | Next Hop IP | Exit interface | Administrative Distance | Tag | Route Name | Metric | | --- | ------------------ | ----------- | -------------- | ----------------------- | --- | ---------- | ------ | | MGMT | 0.0.0.0/0 | 172.31.0.1 | - | 1 | - | - | - | +| default | 0.0.0.0/0 | 172.23.254.1 | - | 1 | - | - | - | #### Static Routes Device Configuration ```eos ! ip route vrf MGMT 0.0.0.0/0 172.31.0.1 +ip route 0.0.0.0/0 172.23.254.1 ``` ## Multicast diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/BGP-SPINE1.md b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/BGP-SPINE1.md index 77e5f7ab3d5..fa7c410cc9e 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/BGP-SPINE1.md +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/BGP-SPINE1.md @@ -129,6 +129,7 @@ vlan internal order ascending range 1006 1199 | 100 | SVI_100 | - | | 200 | SVI_200 | - | | 220 | SVI_220 | - | +| 4092 | INBAND_MGMT | - | | 4094 | MLAG_PEER | MLAG | ### VLANs Device Configuration @@ -147,6 +148,9 @@ vlan 200 vlan 220 name SVI_220 ! +vlan 4092 + name INBAND_MGMT +! vlan 4094 name MLAG_PEER trunk group MLAG @@ -162,8 +166,8 @@ vlan 4094 | Interface | Description | Mode | VLANs | Native VLAN | Trunk Group | Channel-Group | | --------- | ----------- | ---- | ----- | ----------- | ----------- | ------------- | -| Ethernet1 | BGP-LEAF1_Ethernet1 | *trunk | *1,100,200 | *- | *- | 1 | -| Ethernet2 | BGP-LEAF2_Ethernet1 | *trunk | *100 | *- | *- | 2 | +| Ethernet1 | BGP-LEAF1_Ethernet1 | *trunk | *1,100,200,4092 | *- | *- | 1 | +| Ethernet2 | BGP-LEAF2_Ethernet1 | *trunk | *100,4092 | *- | *- | 2 | | Ethernet3 | MLAG_PEER_BGP-SPINE2_Ethernet3 | *trunk | *- | *- | *['LEAF_PEER_L3', 'MLAG'] | 3 | | Ethernet4 | MLAG_PEER_BGP-SPINE2_Ethernet4 | *trunk | *- | *- | *['LEAF_PEER_L3', 'MLAG'] | 3 | @@ -215,8 +219,8 @@ interface Ethernet5 | Interface | Description | Type | Mode | VLANs | Native VLAN | Trunk Group | LACP Fallback Timeout | LACP Fallback Mode | MLAG ID | EVPN ESI | | --------- | ----------- | ---- | ---- | ----- | ----------- | ------------| --------------------- | ------------------ | ------- | -------- | -| Port-Channel1 | BGP-LEAF1_Po1 | switched | trunk | 1,100,200 | - | - | - | - | 1 | - | -| Port-Channel2 | BGP-LEAF2_Po1 | switched | trunk | 100 | - | - | - | - | 2 | - | +| Port-Channel1 | BGP-LEAF1_Po1 | switched | trunk | 1,100,200,4092 | - | - | - | - | 1 | - | +| Port-Channel2 | BGP-LEAF2_Po1 | switched | trunk | 100,4092 | - | - | - | - | 2 | - | | Port-Channel3 | MLAG_PEER_BGP-SPINE2_Po3 | switched | trunk | - | - | ['LEAF_PEER_L3', 'MLAG'] | - | - | - | - | #### Port-Channel Interfaces Device Configuration @@ -227,7 +231,7 @@ interface Port-Channel1 description BGP-LEAF1_Po1 no shutdown switchport - switchport trunk allowed vlan 1,100,200 + switchport trunk allowed vlan 1,100,200,4092 switchport mode trunk mlag 1 ! @@ -235,7 +239,7 @@ interface Port-Channel2 description BGP-LEAF2_Po1 no shutdown switchport - switchport trunk allowed vlan 100 + switchport trunk allowed vlan 100,4092 switchport mode trunk mlag 2 ! @@ -284,6 +288,7 @@ interface Loopback0 | Vlan100 | SVI_100 | default | - | False | | Vlan200 | SVI_200 | default | - | False | | Vlan220 | SVI_220 | default | - | False | +| Vlan4092 | Inband Management | default | 1500 | False | | Vlan4094 | MLAG_PEER | default | 9214 | False | ##### IPv4 @@ -294,6 +299,7 @@ interface Loopback0 | Vlan100 | default | - | 10.1.100.1/24 | - | - | - | - | | Vlan200 | default | - | 10.1.200.1/24 | - | - | - | - | | Vlan220 | default | - | 10.1.220.1/24 | - | - | - | - | +| Vlan4092 | default | 172.23.254.2/24 | - | 172.23.254.1 | - | - | - | | Vlan4094 | default | 192.168.254.0/31 | - | - | - | - | - | #### VLAN Interfaces Device Configuration @@ -320,6 +326,14 @@ interface Vlan220 no shutdown ip address virtual 10.1.220.1/24 ! +interface Vlan4092 + description Inband Management + no shutdown + mtu 1500 + ip address 172.23.254.2/24 + ip attached-host route export 19 + ip virtual-router address 172.23.254.1 +! interface Vlan4094 description MLAG_PEER no shutdown @@ -460,6 +474,7 @@ router bgp 65001 neighbor 192.168.253.5 description DUMMY-CORE neighbor 192.168.254.1 peer group MLAG-IPv4-UNDERLAY-PEER neighbor 192.168.254.1 description BGP-SPINE2 + redistribute attached-host redistribute connected ! address-family ipv4 diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/BGP-SPINE2.md b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/BGP-SPINE2.md index 718de6ec1ac..b1444ac5e63 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/BGP-SPINE2.md +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/BGP-SPINE2.md @@ -129,6 +129,7 @@ vlan internal order ascending range 1006 1199 | 100 | SVI_100 | - | | 200 | SVI_200 | - | | 220 | SVI_220 | - | +| 4092 | INBAND_MGMT | - | | 4094 | MLAG_PEER | MLAG | ### VLANs Device Configuration @@ -147,6 +148,9 @@ vlan 200 vlan 220 name SVI_220 ! +vlan 4092 + name INBAND_MGMT +! vlan 4094 name MLAG_PEER trunk group MLAG @@ -162,8 +166,8 @@ vlan 4094 | Interface | Description | Mode | VLANs | Native VLAN | Trunk Group | Channel-Group | | --------- | ----------- | ---- | ----- | ----------- | ----------- | ------------- | -| Ethernet1 | BGP-LEAF1_Ethernet2 | *trunk | *1,100,200 | *- | *- | 1 | -| Ethernet2 | BGP-LEAF2_Ethernet2 | *trunk | *100 | *- | *- | 2 | +| Ethernet1 | BGP-LEAF1_Ethernet2 | *trunk | *1,100,200,4092 | *- | *- | 1 | +| Ethernet2 | BGP-LEAF2_Ethernet2 | *trunk | *100,4092 | *- | *- | 2 | | Ethernet3 | MLAG_PEER_BGP-SPINE1_Ethernet3 | *trunk | *- | *- | *['LEAF_PEER_L3', 'MLAG'] | 3 | | Ethernet4 | MLAG_PEER_BGP-SPINE1_Ethernet4 | *trunk | *- | *- | *['LEAF_PEER_L3', 'MLAG'] | 3 | @@ -215,8 +219,8 @@ interface Ethernet5 | Interface | Description | Type | Mode | VLANs | Native VLAN | Trunk Group | LACP Fallback Timeout | LACP Fallback Mode | MLAG ID | EVPN ESI | | --------- | ----------- | ---- | ---- | ----- | ----------- | ------------| --------------------- | ------------------ | ------- | -------- | -| Port-Channel1 | BGP-LEAF1_Po1 | switched | trunk | 1,100,200 | - | - | - | - | 1 | - | -| Port-Channel2 | BGP-LEAF2_Po1 | switched | trunk | 100 | - | - | - | - | 2 | - | +| Port-Channel1 | BGP-LEAF1_Po1 | switched | trunk | 1,100,200,4092 | - | - | - | - | 1 | - | +| Port-Channel2 | BGP-LEAF2_Po1 | switched | trunk | 100,4092 | - | - | - | - | 2 | - | | Port-Channel3 | MLAG_PEER_BGP-SPINE1_Po3 | switched | trunk | - | - | ['LEAF_PEER_L3', 'MLAG'] | - | - | - | - | #### Port-Channel Interfaces Device Configuration @@ -227,7 +231,7 @@ interface Port-Channel1 description BGP-LEAF1_Po1 no shutdown switchport - switchport trunk allowed vlan 1,100,200 + switchport trunk allowed vlan 1,100,200,4092 switchport mode trunk mlag 1 ! @@ -235,7 +239,7 @@ interface Port-Channel2 description BGP-LEAF2_Po1 no shutdown switchport - switchport trunk allowed vlan 100 + switchport trunk allowed vlan 100,4092 switchport mode trunk mlag 2 ! @@ -284,6 +288,7 @@ interface Loopback0 | Vlan100 | SVI_100 | default | - | False | | Vlan200 | SVI_200 | default | - | False | | Vlan220 | SVI_220 | default | - | False | +| Vlan4092 | Inband Management | default | 1500 | False | | Vlan4094 | MLAG_PEER | default | 9214 | False | ##### IPv4 @@ -294,6 +299,7 @@ interface Loopback0 | Vlan100 | default | - | 10.1.100.1/24 | - | - | - | - | | Vlan200 | default | - | 10.1.200.1/24 | - | - | - | - | | Vlan220 | default | - | 10.1.220.1/24 | - | - | - | - | +| Vlan4092 | default | 172.23.254.3/24 | - | 172.23.254.1 | - | - | - | | Vlan4094 | default | 192.168.254.1/31 | - | - | - | - | - | #### VLAN Interfaces Device Configuration @@ -320,6 +326,14 @@ interface Vlan220 no shutdown ip address virtual 10.1.220.1/24 ! +interface Vlan4092 + description Inband Management + no shutdown + mtu 1500 + ip address 172.23.254.3/24 + ip attached-host route export 19 + ip virtual-router address 172.23.254.1 +! interface Vlan4094 description MLAG_PEER no shutdown @@ -462,6 +476,7 @@ router bgp 65001 neighbor 192.168.253.7 description DUMMY-CORE neighbor 192.168.254.0 peer group MLAG-IPv4-UNDERLAY-PEER neighbor 192.168.254.0 description BGP-SPINE1 + redistribute attached-host redistribute connected redistribute static ! diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/ISIS-LEAF1.md b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/ISIS-LEAF1.md index 07dd3074045..16ee4c1178b 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/ISIS-LEAF1.md +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/ISIS-LEAF1.md @@ -14,6 +14,7 @@ - [Interfaces](#interfaces) - [Ethernet Interfaces](#ethernet-interfaces) - [Port-Channel Interfaces](#port-channel-interfaces) + - [VLAN Interfaces](#vlan-interfaces) - [Routing](#routing) - [Service Routing Protocols Model](#service-routing-protocols-model) - [IP Routing](#ip-routing) @@ -102,6 +103,7 @@ vlan internal order ascending range 1006 1199 | VLAN ID | Name | Trunk Groups | | ------- | ---- | ------------ | | 110 | SVI_110 | - | +| 4092 | INBAND_MGMT | - | ### VLANs Device Configuration @@ -109,6 +111,9 @@ vlan internal order ascending range 1006 1199 ! vlan 110 name SVI_110 +! +vlan 4092 + name INBAND_MGMT ``` ## Interfaces @@ -121,7 +126,7 @@ vlan 110 | Interface | Description | Mode | VLANs | Native VLAN | Trunk Group | Channel-Group | | --------- | ----------- | ---- | ----- | ----------- | ----------- | ------------- | -| Ethernet1 | ISIS-SPINE1_Ethernet1 | *trunk | *110 | *- | *- | 1 | +| Ethernet1 | ISIS-SPINE1_Ethernet1 | *trunk | *110,4092 | *- | *- | 1 | *Inherited from Port-Channel Interface @@ -143,7 +148,7 @@ interface Ethernet1 | Interface | Description | Type | Mode | VLANs | Native VLAN | Trunk Group | LACP Fallback Timeout | LACP Fallback Mode | MLAG ID | EVPN ESI | | --------- | ----------- | ---- | ---- | ----- | ----------- | ------------| --------------------- | ------------------ | ------- | -------- | -| Port-Channel1 | ISIS-SPINE1_Po1 | switched | trunk | 110 | - | - | - | - | - | - | +| Port-Channel1 | ISIS-SPINE1_Po1 | switched | trunk | 110,4092 | - | - | - | - | - | - | #### Port-Channel Interfaces Device Configuration @@ -153,10 +158,35 @@ interface Port-Channel1 description ISIS-SPINE1_Po1 no shutdown switchport - switchport trunk allowed vlan 110 + switchport trunk allowed vlan 110,4092 switchport mode trunk ``` +### VLAN Interfaces + +#### VLAN Interfaces Summary + +| Interface | Description | VRF | MTU | Shutdown | +| --------- | ----------- | --- | ---- | -------- | +| Vlan4092 | Inband Management | default | 1500 | False | + +##### IPv4 + +| Interface | VRF | IP Address | IP Address Virtual | IP Router Virtual Address | VRRP | ACL In | ACL Out | +| --------- | --- | ---------- | ------------------ | ------------------------- | ---- | ------ | ------- | +| Vlan4092 | default | 172.23.254.4/24 | - | - | - | - | - | + +#### VLAN Interfaces Device Configuration + +```eos +! +interface Vlan4092 + description Inband Management + no shutdown + mtu 1500 + ip address 172.23.254.4/24 +``` + ## Routing ### Service Routing Protocols Model @@ -199,12 +229,14 @@ no ip routing vrf MGMT | VRF | Destination Prefix | Next Hop IP | Exit interface | Administrative Distance | Tag | Route Name | Metric | | --- | ------------------ | ----------- | -------------- | ----------------------- | --- | ---------- | ------ | | MGMT | 0.0.0.0/0 | 172.31.0.1 | - | 1 | - | - | - | +| default | 0.0.0.0/0 | 172.23.254.1 | - | 1 | - | - | - | #### Static Routes Device Configuration ```eos ! ip route vrf MGMT 0.0.0.0/0 172.31.0.1 +ip route 0.0.0.0/0 172.23.254.1 ``` ## Multicast diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/ISIS-SPINE1.md b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/ISIS-SPINE1.md index 9ac32df61a0..ad5ac3830a5 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/ISIS-SPINE1.md +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/ISIS-SPINE1.md @@ -106,6 +106,7 @@ vlan internal order ascending range 1006 1199 | VLAN ID | Name | Trunk Groups | | ------- | ---- | ------------ | | 110 | SVI_110 | - | +| 4092 | INBAND_MGMT | - | ### VLANs Device Configuration @@ -113,6 +114,9 @@ vlan internal order ascending range 1006 1199 ! vlan 110 name SVI_110 +! +vlan 4092 + name INBAND_MGMT ``` ## Interfaces @@ -125,7 +129,7 @@ vlan 110 | Interface | Description | Mode | VLANs | Native VLAN | Trunk Group | Channel-Group | | --------- | ----------- | ---- | ----- | ----------- | ----------- | ------------- | -| Ethernet1 | ISIS-LEAF1_Ethernet1 | *trunk | *110 | *- | *- | 1 | +| Ethernet1 | ISIS-LEAF1_Ethernet1 | *trunk | *110,4092 | *- | *- | 1 | | Ethernet10 | Endpoint | access | 110 | - | - | - | *Inherited from Port-Channel Interface @@ -155,7 +159,7 @@ interface Ethernet10 | Interface | Description | Type | Mode | VLANs | Native VLAN | Trunk Group | LACP Fallback Timeout | LACP Fallback Mode | MLAG ID | EVPN ESI | | --------- | ----------- | ---- | ---- | ----- | ----------- | ------------| --------------------- | ------------------ | ------- | -------- | -| Port-Channel1 | ISIS-LEAF1_Po1 | switched | trunk | 110 | - | - | - | - | - | - | +| Port-Channel1 | ISIS-LEAF1_Po1 | switched | trunk | 110,4092 | - | - | - | - | - | - | #### Port-Channel Interfaces Device Configuration @@ -165,7 +169,7 @@ interface Port-Channel1 description ISIS-LEAF1_Po1 no shutdown switchport - switchport trunk allowed vlan 110 + switchport trunk allowed vlan 110,4092 switchport mode trunk ``` @@ -210,12 +214,14 @@ interface Loopback0 | Interface | Description | VRF | MTU | Shutdown | | --------- | ----------- | --- | ---- | -------- | | Vlan110 | SVI_110 | default | - | False | +| Vlan4092 | Inband Management | default | 1500 | False | ##### IPv4 | Interface | VRF | IP Address | IP Address Virtual | IP Router Virtual Address | VRRP | ACL In | ACL Out | | --------- | --- | ---------- | ------------------ | ------------------------- | ---- | ------ | ------- | | Vlan110 | default | - | 10.0.110.1/24 | - | - | - | - | +| Vlan4092 | default | 172.23.254.2/24 | - | 172.23.254.1 | - | - | - | #### VLAN Interfaces Device Configuration @@ -225,6 +231,14 @@ interface Vlan110 description SVI_110 no shutdown ip address virtual 10.0.110.1/24 +! +interface Vlan4092 + description Inband Management + no shutdown + mtu 1500 + ip address 172.23.254.2/24 + ip attached-host route export 19 + ip virtual-router address 172.23.254.1 ``` ## Routing diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/L2ONLY-LEAF1.md b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/L2ONLY-LEAF1.md index 607a5110c3a..9d309b0ed75 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/L2ONLY-LEAF1.md +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/L2ONLY-LEAF1.md @@ -13,6 +13,7 @@ - [Interfaces](#interfaces) - [Ethernet Interfaces](#ethernet-interfaces) - [Port-Channel Interfaces](#port-channel-interfaces) + - [VLAN Interfaces](#vlan-interfaces) - [Routing](#routing) - [Service Routing Protocols Model](#service-routing-protocols-model) - [IP Routing](#ip-routing) @@ -74,6 +75,7 @@ vlan internal order ascending range 1006 1199 | VLAN ID | Name | Trunk Groups | | ------- | ---- | ------------ | | 100 | L2VLAN_100 | - | +| 4092 | INBAND_MGMT | - | ### VLANs Device Configuration @@ -81,6 +83,9 @@ vlan internal order ascending range 1006 1199 ! vlan 100 name L2VLAN_100 +! +vlan 4092 + name INBAND_MGMT ``` ## Interfaces @@ -93,8 +98,8 @@ vlan 100 | Interface | Description | Mode | VLANs | Native VLAN | Trunk Group | Channel-Group | | --------- | ----------- | ---- | ----- | ----------- | ----------- | ------------- | -| Ethernet1 | L2ONLY-SPINE1_Ethernet1 | *trunk | *100 | *- | *- | 1 | -| Ethernet2 | L2ONLY-SPINE2_Ethernet1 | *trunk | *100 | *- | *- | 1 | +| Ethernet1 | L2ONLY-SPINE1_Ethernet1 | *trunk | *100,4092 | *- | *- | 1 | +| Ethernet2 | L2ONLY-SPINE2_Ethernet1 | *trunk | *100,4092 | *- | *- | 1 | | Ethernet10 | Endpoint | access | 100 | - | - | - | | Ethernet11 | Endpoint | access | 100 | - | - | - | @@ -137,7 +142,7 @@ interface Ethernet11 | Interface | Description | Type | Mode | VLANs | Native VLAN | Trunk Group | LACP Fallback Timeout | LACP Fallback Mode | MLAG ID | EVPN ESI | | --------- | ----------- | ---- | ---- | ----- | ----------- | ------------| --------------------- | ------------------ | ------- | -------- | -| Port-Channel1 | L2ONLY_SPINES_Po1 | switched | trunk | 100 | - | - | - | - | - | - | +| Port-Channel1 | L2ONLY_SPINES_Po1 | switched | trunk | 100,4092 | - | - | - | - | - | - | #### Port-Channel Interfaces Device Configuration @@ -147,10 +152,35 @@ interface Port-Channel1 description L2ONLY_SPINES_Po1 no shutdown switchport - switchport trunk allowed vlan 100 + switchport trunk allowed vlan 100,4092 switchport mode trunk ``` +### VLAN Interfaces + +#### VLAN Interfaces Summary + +| Interface | Description | VRF | MTU | Shutdown | +| --------- | ----------- | --- | ---- | -------- | +| Vlan4092 | Inband Management | default | 1500 | False | + +##### IPv4 + +| Interface | VRF | IP Address | IP Address Virtual | IP Router Virtual Address | VRRP | ACL In | ACL Out | +| --------- | --- | ---------- | ------------------ | ------------------------- | ---- | ------ | ------- | +| Vlan4092 | default | 172.23.254.4/24 | - | - | - | - | - | + +#### VLAN Interfaces Device Configuration + +```eos +! +interface Vlan4092 + description Inband Management + no shutdown + mtu 1500 + ip address 172.23.254.4/24 +``` + ## Routing ### Service Routing Protocols Model @@ -193,12 +223,14 @@ no ip routing vrf MGMT | VRF | Destination Prefix | Next Hop IP | Exit interface | Administrative Distance | Tag | Route Name | Metric | | --- | ------------------ | ----------- | -------------- | ----------------------- | --- | ---------- | ------ | | MGMT | 0.0.0.0/0 | 172.31.0.1 | - | 1 | - | - | - | +| default | 0.0.0.0/0 | 172.23.254.1 | - | 1 | - | - | - | #### Static Routes Device Configuration ```eos ! ip route vrf MGMT 0.0.0.0/0 172.31.0.1 +ip route 0.0.0.0/0 172.23.254.1 ``` ## Multicast diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/L2ONLY-LEAF2.md b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/L2ONLY-LEAF2.md index 5dc198867dc..a861206bf78 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/L2ONLY-LEAF2.md +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/L2ONLY-LEAF2.md @@ -13,6 +13,7 @@ - [Interfaces](#interfaces) - [Ethernet Interfaces](#ethernet-interfaces) - [Port-Channel Interfaces](#port-channel-interfaces) + - [VLAN Interfaces](#vlan-interfaces) - [Routing](#routing) - [Service Routing Protocols Model](#service-routing-protocols-model) - [IP Routing](#ip-routing) @@ -74,6 +75,7 @@ vlan internal order ascending range 1006 1199 | VLAN ID | Name | Trunk Groups | | ------- | ---- | ------------ | | 100 | L2VLAN_100 | - | +| 4092 | INBAND_MGMT | - | ### VLANs Device Configuration @@ -81,6 +83,9 @@ vlan internal order ascending range 1006 1199 ! vlan 100 name L2VLAN_100 +! +vlan 4092 + name INBAND_MGMT ``` ## Interfaces @@ -93,8 +98,8 @@ vlan 100 | Interface | Description | Mode | VLANs | Native VLAN | Trunk Group | Channel-Group | | --------- | ----------- | ---- | ----- | ----------- | ----------- | ------------- | -| Ethernet1 | L2ONLY-SPINE1_Ethernet2 | *trunk | *100 | *- | *- | 1 | -| Ethernet2 | L2ONLY-SPINE2_Ethernet2 | *trunk | *100 | *- | *- | 1 | +| Ethernet1 | L2ONLY-SPINE1_Ethernet2 | *trunk | *100,4092 | *- | *- | 1 | +| Ethernet2 | L2ONLY-SPINE2_Ethernet2 | *trunk | *100,4092 | *- | *- | 1 | | Ethernet10 | Endpoint | access | 100 | - | - | - | | Ethernet11 | Endpoint | access | 100 | - | - | - | @@ -137,7 +142,7 @@ interface Ethernet11 | Interface | Description | Type | Mode | VLANs | Native VLAN | Trunk Group | LACP Fallback Timeout | LACP Fallback Mode | MLAG ID | EVPN ESI | | --------- | ----------- | ---- | ---- | ----- | ----------- | ------------| --------------------- | ------------------ | ------- | -------- | -| Port-Channel1 | L2ONLY_SPINES_Po2 | switched | trunk | 100 | - | - | - | - | - | - | +| Port-Channel1 | L2ONLY_SPINES_Po2 | switched | trunk | 100,4092 | - | - | - | - | - | - | #### Port-Channel Interfaces Device Configuration @@ -147,10 +152,35 @@ interface Port-Channel1 description L2ONLY_SPINES_Po2 no shutdown switchport - switchport trunk allowed vlan 100 + switchport trunk allowed vlan 100,4092 switchport mode trunk ``` +### VLAN Interfaces + +#### VLAN Interfaces Summary + +| Interface | Description | VRF | MTU | Shutdown | +| --------- | ----------- | --- | ---- | -------- | +| Vlan4092 | Inband Management | default | 1500 | False | + +##### IPv4 + +| Interface | VRF | IP Address | IP Address Virtual | IP Router Virtual Address | VRRP | ACL In | ACL Out | +| --------- | --- | ---------- | ------------------ | ------------------------- | ---- | ------ | ------- | +| Vlan4092 | default | 172.23.254.5/24 | - | - | - | - | - | + +#### VLAN Interfaces Device Configuration + +```eos +! +interface Vlan4092 + description Inband Management + no shutdown + mtu 1500 + ip address 172.23.254.5/24 +``` + ## Routing ### Service Routing Protocols Model @@ -193,12 +223,14 @@ no ip routing vrf MGMT | VRF | Destination Prefix | Next Hop IP | Exit interface | Administrative Distance | Tag | Route Name | Metric | | --- | ------------------ | ----------- | -------------- | ----------------------- | --- | ---------- | ------ | | MGMT | 0.0.0.0/0 | 172.31.0.1 | - | 1 | - | - | - | +| default | 0.0.0.0/0 | 172.23.254.1 | - | 1 | - | - | - | #### Static Routes Device Configuration ```eos ! ip route vrf MGMT 0.0.0.0/0 172.31.0.1 +ip route 0.0.0.0/0 172.23.254.1 ``` ## Multicast diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/L2ONLY-SPINE1.md b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/L2ONLY-SPINE1.md index fc7ebed0aab..6aa3c137f85 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/L2ONLY-SPINE1.md +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/L2ONLY-SPINE1.md @@ -145,8 +145,8 @@ vlan 4094 | Interface | Description | Mode | VLANs | Native VLAN | Trunk Group | Channel-Group | | --------- | ----------- | ---- | ----- | ----------- | ----------- | ------------- | -| Ethernet1 | L2ONLY-LEAF1_Ethernet1 | *trunk | *100 | *- | *- | 1 | -| Ethernet2 | L2ONLY-LEAF2_Ethernet1 | *trunk | *100 | *- | *- | 2 | +| Ethernet1 | L2ONLY-LEAF1_Ethernet1 | *trunk | *100,4092 | *- | *- | 1 | +| Ethernet2 | L2ONLY-LEAF2_Ethernet1 | *trunk | *100,4092 | *- | *- | 2 | | Ethernet3 | MLAG_PEER_L2ONLY-SPINE2_Ethernet3 | *trunk | *- | *- | *['MLAG'] | 3 | | Ethernet4 | MLAG_PEER_L2ONLY-SPINE2_Ethernet4 | *trunk | *- | *- | *['MLAG'] | 3 | @@ -185,8 +185,8 @@ interface Ethernet4 | Interface | Description | Type | Mode | VLANs | Native VLAN | Trunk Group | LACP Fallback Timeout | LACP Fallback Mode | MLAG ID | EVPN ESI | | --------- | ----------- | ---- | ---- | ----- | ----------- | ------------| --------------------- | ------------------ | ------- | -------- | -| Port-Channel1 | L2ONLY-LEAF1_Po1 | switched | trunk | 100 | - | - | - | - | 1 | - | -| Port-Channel2 | L2ONLY-LEAF2_Po1 | switched | trunk | 100 | - | - | - | - | 2 | - | +| Port-Channel1 | L2ONLY-LEAF1_Po1 | switched | trunk | 100,4092 | - | - | - | - | 1 | - | +| Port-Channel2 | L2ONLY-LEAF2_Po1 | switched | trunk | 100,4092 | - | - | - | - | 2 | - | | Port-Channel3 | MLAG_PEER_L2ONLY-SPINE2_Po3 | switched | trunk | - | - | ['MLAG'] | - | - | - | - | #### Port-Channel Interfaces Device Configuration @@ -197,7 +197,7 @@ interface Port-Channel1 description L2ONLY-LEAF1_Po1 no shutdown switchport - switchport trunk allowed vlan 100 + switchport trunk allowed vlan 100,4092 switchport mode trunk mlag 1 ! @@ -205,7 +205,7 @@ interface Port-Channel2 description L2ONLY-LEAF2_Po1 no shutdown switchport - switchport trunk allowed vlan 100 + switchport trunk allowed vlan 100,4092 switchport mode trunk mlag 2 ! diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/L2ONLY-SPINE2.md b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/L2ONLY-SPINE2.md index 92c55fa0582..c8d0609ead0 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/L2ONLY-SPINE2.md +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/L2ONLY-SPINE2.md @@ -145,8 +145,8 @@ vlan 4094 | Interface | Description | Mode | VLANs | Native VLAN | Trunk Group | Channel-Group | | --------- | ----------- | ---- | ----- | ----------- | ----------- | ------------- | -| Ethernet1 | L2ONLY-LEAF1_Ethernet2 | *trunk | *100 | *- | *- | 1 | -| Ethernet2 | L2ONLY-LEAF2_Ethernet2 | *trunk | *100 | *- | *- | 2 | +| Ethernet1 | L2ONLY-LEAF1_Ethernet2 | *trunk | *100,4092 | *- | *- | 1 | +| Ethernet2 | L2ONLY-LEAF2_Ethernet2 | *trunk | *100,4092 | *- | *- | 2 | | Ethernet3 | MLAG_PEER_L2ONLY-SPINE1_Ethernet3 | *trunk | *- | *- | *['MLAG'] | 3 | | Ethernet4 | MLAG_PEER_L2ONLY-SPINE1_Ethernet4 | *trunk | *- | *- | *['MLAG'] | 3 | @@ -185,8 +185,8 @@ interface Ethernet4 | Interface | Description | Type | Mode | VLANs | Native VLAN | Trunk Group | LACP Fallback Timeout | LACP Fallback Mode | MLAG ID | EVPN ESI | | --------- | ----------- | ---- | ---- | ----- | ----------- | ------------| --------------------- | ------------------ | ------- | -------- | -| Port-Channel1 | L2ONLY-LEAF1_Po1 | switched | trunk | 100 | - | - | - | - | 1 | - | -| Port-Channel2 | L2ONLY-LEAF2_Po1 | switched | trunk | 100 | - | - | - | - | 2 | - | +| Port-Channel1 | L2ONLY-LEAF1_Po1 | switched | trunk | 100,4092 | - | - | - | - | 1 | - | +| Port-Channel2 | L2ONLY-LEAF2_Po1 | switched | trunk | 100,4092 | - | - | - | - | 2 | - | | Port-Channel3 | MLAG_PEER_L2ONLY-SPINE1_Po3 | switched | trunk | - | - | ['MLAG'] | - | - | - | - | #### Port-Channel Interfaces Device Configuration @@ -197,7 +197,7 @@ interface Port-Channel1 description L2ONLY-LEAF1_Po1 no shutdown switchport - switchport trunk allowed vlan 100 + switchport trunk allowed vlan 100,4092 switchport mode trunk mlag 1 ! @@ -205,7 +205,7 @@ interface Port-Channel2 description L2ONLY-LEAF2_Po1 no shutdown switchport - switchport trunk allowed vlan 100 + switchport trunk allowed vlan 100,4092 switchport mode trunk mlag 2 ! diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/OSPF-LEAF1.md b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/OSPF-LEAF1.md index 3ab0e6b348f..96d5f5f40f3 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/OSPF-LEAF1.md +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/OSPF-LEAF1.md @@ -13,6 +13,7 @@ - [Interfaces](#interfaces) - [Ethernet Interfaces](#ethernet-interfaces) - [Port-Channel Interfaces](#port-channel-interfaces) + - [VLAN Interfaces](#vlan-interfaces) - [Routing](#routing) - [Service Routing Protocols Model](#service-routing-protocols-model) - [IP Routing](#ip-routing) @@ -74,6 +75,7 @@ vlan internal order ascending range 1006 1199 | VLAN ID | Name | Trunk Groups | | ------- | ---- | ------------ | | 100 | SVI_100 | - | +| 4092 | INBAND_MGMT | - | ### VLANs Device Configuration @@ -81,6 +83,9 @@ vlan internal order ascending range 1006 1199 ! vlan 100 name SVI_100 +! +vlan 4092 + name INBAND_MGMT ``` ## Interfaces @@ -93,8 +98,8 @@ vlan 100 | Interface | Description | Mode | VLANs | Native VLAN | Trunk Group | Channel-Group | | --------- | ----------- | ---- | ----- | ----------- | ----------- | ------------- | -| Ethernet1 | OSPF-SPINE1_Ethernet1 | *trunk | *100 | *- | *- | 1 | -| Ethernet2 | OSPF-SPINE2_Ethernet1 | *trunk | *100 | *- | *- | 1 | +| Ethernet1 | OSPF-SPINE1_Ethernet1 | *trunk | *100,4092 | *- | *- | 1 | +| Ethernet2 | OSPF-SPINE2_Ethernet1 | *trunk | *100,4092 | *- | *- | 1 | | Ethernet10 | Endpoint | access | 100 | - | - | - | | Ethernet11 | Endpoint | access | 100 | - | - | - | @@ -137,7 +142,7 @@ interface Ethernet11 | Interface | Description | Type | Mode | VLANs | Native VLAN | Trunk Group | LACP Fallback Timeout | LACP Fallback Mode | MLAG ID | EVPN ESI | | --------- | ----------- | ---- | ---- | ----- | ----------- | ------------| --------------------- | ------------------ | ------- | -------- | -| Port-Channel1 | OSPF_SPINES_Po1 | switched | trunk | 100 | - | - | - | - | - | - | +| Port-Channel1 | OSPF_SPINES_Po1 | switched | trunk | 100,4092 | - | - | - | - | - | - | #### Port-Channel Interfaces Device Configuration @@ -147,10 +152,35 @@ interface Port-Channel1 description OSPF_SPINES_Po1 no shutdown switchport - switchport trunk allowed vlan 100 + switchport trunk allowed vlan 100,4092 switchport mode trunk ``` +### VLAN Interfaces + +#### VLAN Interfaces Summary + +| Interface | Description | VRF | MTU | Shutdown | +| --------- | ----------- | --- | ---- | -------- | +| Vlan4092 | Inband Management | default | 1500 | False | + +##### IPv4 + +| Interface | VRF | IP Address | IP Address Virtual | IP Router Virtual Address | VRRP | ACL In | ACL Out | +| --------- | --- | ---------- | ------------------ | ------------------------- | ---- | ------ | ------- | +| Vlan4092 | default | 172.23.254.4/24 | - | - | - | - | - | + +#### VLAN Interfaces Device Configuration + +```eos +! +interface Vlan4092 + description Inband Management + no shutdown + mtu 1500 + ip address 172.23.254.4/24 +``` + ## Routing ### Service Routing Protocols Model @@ -193,12 +223,14 @@ no ip routing vrf MGMT | VRF | Destination Prefix | Next Hop IP | Exit interface | Administrative Distance | Tag | Route Name | Metric | | --- | ------------------ | ----------- | -------------- | ----------------------- | --- | ---------- | ------ | | MGMT | 0.0.0.0/0 | 172.31.0.1 | - | 1 | - | - | - | +| default | 0.0.0.0/0 | 172.23.254.1 | - | 1 | - | - | - | #### Static Routes Device Configuration ```eos ! ip route vrf MGMT 0.0.0.0/0 172.31.0.1 +ip route 0.0.0.0/0 172.23.254.1 ``` ## Multicast diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/OSPF-LEAF2.md b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/OSPF-LEAF2.md index e6d3b1bb8af..12ff035d553 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/OSPF-LEAF2.md +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/OSPF-LEAF2.md @@ -13,6 +13,7 @@ - [Interfaces](#interfaces) - [Ethernet Interfaces](#ethernet-interfaces) - [Port-Channel Interfaces](#port-channel-interfaces) + - [VLAN Interfaces](#vlan-interfaces) - [Routing](#routing) - [Service Routing Protocols Model](#service-routing-protocols-model) - [IP Routing](#ip-routing) @@ -74,6 +75,7 @@ vlan internal order ascending range 1006 1199 | VLAN ID | Name | Trunk Groups | | ------- | ---- | ------------ | | 100 | SVI_100 | - | +| 4092 | INBAND_MGMT | - | ### VLANs Device Configuration @@ -81,6 +83,9 @@ vlan internal order ascending range 1006 1199 ! vlan 100 name SVI_100 +! +vlan 4092 + name INBAND_MGMT ``` ## Interfaces @@ -93,8 +98,8 @@ vlan 100 | Interface | Description | Mode | VLANs | Native VLAN | Trunk Group | Channel-Group | | --------- | ----------- | ---- | ----- | ----------- | ----------- | ------------- | -| Ethernet1 | OSPF-SPINE1_Ethernet2 | *trunk | *100 | *- | *- | 1 | -| Ethernet2 | OSPF-SPINE2_Ethernet2 | *trunk | *100 | *- | *- | 1 | +| Ethernet1 | OSPF-SPINE1_Ethernet2 | *trunk | *100,4092 | *- | *- | 1 | +| Ethernet2 | OSPF-SPINE2_Ethernet2 | *trunk | *100,4092 | *- | *- | 1 | | Ethernet10 | Endpoint | access | 100 | - | - | - | | Ethernet11 | Endpoint | access | 100 | - | - | - | @@ -137,7 +142,7 @@ interface Ethernet11 | Interface | Description | Type | Mode | VLANs | Native VLAN | Trunk Group | LACP Fallback Timeout | LACP Fallback Mode | MLAG ID | EVPN ESI | | --------- | ----------- | ---- | ---- | ----- | ----------- | ------------| --------------------- | ------------------ | ------- | -------- | -| Port-Channel1 | OSPF_SPINES_Po2 | switched | trunk | 100 | - | - | - | - | - | - | +| Port-Channel1 | OSPF_SPINES_Po2 | switched | trunk | 100,4092 | - | - | - | - | - | - | #### Port-Channel Interfaces Device Configuration @@ -147,10 +152,35 @@ interface Port-Channel1 description OSPF_SPINES_Po2 no shutdown switchport - switchport trunk allowed vlan 100 + switchport trunk allowed vlan 100,4092 switchport mode trunk ``` +### VLAN Interfaces + +#### VLAN Interfaces Summary + +| Interface | Description | VRF | MTU | Shutdown | +| --------- | ----------- | --- | ---- | -------- | +| Vlan4092 | Inband Management | default | 1500 | False | + +##### IPv4 + +| Interface | VRF | IP Address | IP Address Virtual | IP Router Virtual Address | VRRP | ACL In | ACL Out | +| --------- | --- | ---------- | ------------------ | ------------------------- | ---- | ------ | ------- | +| Vlan4092 | default | 172.23.254.5/24 | - | - | - | - | - | + +#### VLAN Interfaces Device Configuration + +```eos +! +interface Vlan4092 + description Inband Management + no shutdown + mtu 1500 + ip address 172.23.254.5/24 +``` + ## Routing ### Service Routing Protocols Model @@ -193,12 +223,14 @@ no ip routing vrf MGMT | VRF | Destination Prefix | Next Hop IP | Exit interface | Administrative Distance | Tag | Route Name | Metric | | --- | ------------------ | ----------- | -------------- | ----------------------- | --- | ---------- | ------ | | MGMT | 0.0.0.0/0 | 172.31.0.1 | - | 1 | - | - | - | +| default | 0.0.0.0/0 | 172.23.254.1 | - | 1 | - | - | - | #### Static Routes Device Configuration ```eos ! ip route vrf MGMT 0.0.0.0/0 172.31.0.1 +ip route 0.0.0.0/0 172.23.254.1 ``` ## Multicast diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/OSPF-SPINE1.md b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/OSPF-SPINE1.md index 5e446e4631b..c7c6f824cef 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/OSPF-SPINE1.md +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/OSPF-SPINE1.md @@ -124,6 +124,7 @@ vlan internal order ascending range 1006 1199 | VLAN ID | Name | Trunk Groups | | ------- | ---- | ------------ | | 100 | SVI_100 | - | +| 4092 | INBAND_MGMT | - | | 4094 | MLAG_PEER | MLAG | ### VLANs Device Configuration @@ -133,6 +134,9 @@ vlan internal order ascending range 1006 1199 vlan 100 name SVI_100 ! +vlan 4092 + name INBAND_MGMT +! vlan 4094 name MLAG_PEER trunk group MLAG @@ -148,8 +152,8 @@ vlan 4094 | Interface | Description | Mode | VLANs | Native VLAN | Trunk Group | Channel-Group | | --------- | ----------- | ---- | ----- | ----------- | ----------- | ------------- | -| Ethernet1 | OSPF-LEAF1_Ethernet1 | *trunk | *100 | *- | *- | 1 | -| Ethernet2 | OSPF-LEAF2_Ethernet1 | *trunk | *100 | *- | *- | 2 | +| Ethernet1 | OSPF-LEAF1_Ethernet1 | *trunk | *100,4092 | *- | *- | 1 | +| Ethernet2 | OSPF-LEAF2_Ethernet1 | *trunk | *100,4092 | *- | *- | 2 | | Ethernet3 | MLAG_PEER_OSPF-SPINE2_Ethernet3 | *trunk | *- | *- | *['LEAF_PEER_L3', 'MLAG'] | 3 | | Ethernet4 | MLAG_PEER_OSPF-SPINE2_Ethernet4 | *trunk | *- | *- | *['LEAF_PEER_L3', 'MLAG'] | 3 | @@ -203,8 +207,8 @@ interface Ethernet5 | Interface | Description | Type | Mode | VLANs | Native VLAN | Trunk Group | LACP Fallback Timeout | LACP Fallback Mode | MLAG ID | EVPN ESI | | --------- | ----------- | ---- | ---- | ----- | ----------- | ------------| --------------------- | ------------------ | ------- | -------- | -| Port-Channel1 | OSPF-LEAF1_Po1 | switched | trunk | 100 | - | - | - | - | 1 | - | -| Port-Channel2 | OSPF-LEAF2_Po1 | switched | trunk | 100 | - | - | - | - | 2 | - | +| Port-Channel1 | OSPF-LEAF1_Po1 | switched | trunk | 100,4092 | - | - | - | - | 1 | - | +| Port-Channel2 | OSPF-LEAF2_Po1 | switched | trunk | 100,4092 | - | - | - | - | 2 | - | | Port-Channel3 | MLAG_PEER_OSPF-SPINE2_Po3 | switched | trunk | - | - | ['LEAF_PEER_L3', 'MLAG'] | - | - | - | - | #### Port-Channel Interfaces Device Configuration @@ -215,7 +219,7 @@ interface Port-Channel1 description OSPF-LEAF1_Po1 no shutdown switchport - switchport trunk allowed vlan 100 + switchport trunk allowed vlan 100,4092 switchport mode trunk mlag 1 ! @@ -223,7 +227,7 @@ interface Port-Channel2 description OSPF-LEAF2_Po1 no shutdown switchport - switchport trunk allowed vlan 100 + switchport trunk allowed vlan 100,4092 switchport mode trunk mlag 2 ! @@ -270,6 +274,7 @@ interface Loopback0 | Interface | Description | VRF | MTU | Shutdown | | --------- | ----------- | --- | ---- | -------- | | Vlan100 | SVI_100 | default | - | False | +| Vlan4092 | Inband Management | default | 1500 | False | | Vlan4094 | MLAG_PEER | default | 9214 | False | ##### IPv4 @@ -277,6 +282,7 @@ interface Loopback0 | Interface | VRF | IP Address | IP Address Virtual | IP Router Virtual Address | VRRP | ACL In | ACL Out | | --------- | --- | ---------- | ------------------ | ------------------------- | ---- | ------ | ------- | | Vlan100 | default | - | 10.0.100.1/24 | - | - | - | - | +| Vlan4092 | default | 172.23.254.2/24 | - | 172.23.254.1 | - | - | - | | Vlan4094 | default | 192.168.254.0/31 | - | - | - | - | - | #### VLAN Interfaces Device Configuration @@ -288,6 +294,14 @@ interface Vlan100 no shutdown ip address virtual 10.0.100.1/24 ! +interface Vlan4092 + description Inband Management + no shutdown + mtu 1500 + ip address 172.23.254.2/24 + ip attached-host route export 19 + ip virtual-router address 172.23.254.1 +! interface Vlan4094 description MLAG_PEER no shutdown diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/OSPF-SPINE2.md b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/OSPF-SPINE2.md index e68b1be729e..26baf94427c 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/OSPF-SPINE2.md +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/devices/OSPF-SPINE2.md @@ -124,6 +124,7 @@ vlan internal order ascending range 1006 1199 | VLAN ID | Name | Trunk Groups | | ------- | ---- | ------------ | | 100 | SVI_100 | - | +| 4092 | INBAND_MGMT | - | | 4094 | MLAG_PEER | MLAG | ### VLANs Device Configuration @@ -133,6 +134,9 @@ vlan internal order ascending range 1006 1199 vlan 100 name SVI_100 ! +vlan 4092 + name INBAND_MGMT +! vlan 4094 name MLAG_PEER trunk group MLAG @@ -148,8 +152,8 @@ vlan 4094 | Interface | Description | Mode | VLANs | Native VLAN | Trunk Group | Channel-Group | | --------- | ----------- | ---- | ----- | ----------- | ----------- | ------------- | -| Ethernet1 | OSPF-LEAF1_Ethernet2 | *trunk | *100 | *- | *- | 1 | -| Ethernet2 | OSPF-LEAF2_Ethernet2 | *trunk | *100 | *- | *- | 2 | +| Ethernet1 | OSPF-LEAF1_Ethernet2 | *trunk | *100,4092 | *- | *- | 1 | +| Ethernet2 | OSPF-LEAF2_Ethernet2 | *trunk | *100,4092 | *- | *- | 2 | | Ethernet3 | MLAG_PEER_OSPF-SPINE1_Ethernet3 | *trunk | *- | *- | *['LEAF_PEER_L3', 'MLAG'] | 3 | | Ethernet4 | MLAG_PEER_OSPF-SPINE1_Ethernet4 | *trunk | *- | *- | *['LEAF_PEER_L3', 'MLAG'] | 3 | @@ -203,8 +207,8 @@ interface Ethernet5 | Interface | Description | Type | Mode | VLANs | Native VLAN | Trunk Group | LACP Fallback Timeout | LACP Fallback Mode | MLAG ID | EVPN ESI | | --------- | ----------- | ---- | ---- | ----- | ----------- | ------------| --------------------- | ------------------ | ------- | -------- | -| Port-Channel1 | OSPF-LEAF1_Po1 | switched | trunk | 100 | - | - | - | - | 1 | - | -| Port-Channel2 | OSPF-LEAF2_Po1 | switched | trunk | 100 | - | - | - | - | 2 | - | +| Port-Channel1 | OSPF-LEAF1_Po1 | switched | trunk | 100,4092 | - | - | - | - | 1 | - | +| Port-Channel2 | OSPF-LEAF2_Po1 | switched | trunk | 100,4092 | - | - | - | - | 2 | - | | Port-Channel3 | MLAG_PEER_OSPF-SPINE1_Po3 | switched | trunk | - | - | ['LEAF_PEER_L3', 'MLAG'] | - | - | - | - | #### Port-Channel Interfaces Device Configuration @@ -215,7 +219,7 @@ interface Port-Channel1 description OSPF-LEAF1_Po1 no shutdown switchport - switchport trunk allowed vlan 100 + switchport trunk allowed vlan 100,4092 switchport mode trunk mlag 1 ! @@ -223,7 +227,7 @@ interface Port-Channel2 description OSPF-LEAF2_Po1 no shutdown switchport - switchport trunk allowed vlan 100 + switchport trunk allowed vlan 100,4092 switchport mode trunk mlag 2 ! @@ -270,6 +274,7 @@ interface Loopback0 | Interface | Description | VRF | MTU | Shutdown | | --------- | ----------- | --- | ---- | -------- | | Vlan100 | SVI_100 | default | - | False | +| Vlan4092 | Inband Management | default | 1500 | False | | Vlan4094 | MLAG_PEER | default | 9214 | False | ##### IPv4 @@ -277,6 +282,7 @@ interface Loopback0 | Interface | VRF | IP Address | IP Address Virtual | IP Router Virtual Address | VRRP | ACL In | ACL Out | | --------- | --- | ---------- | ------------------ | ------------------------- | ---- | ------ | ------- | | Vlan100 | default | - | 10.0.100.1/24 | - | - | - | - | +| Vlan4092 | default | 172.23.254.3/24 | - | 172.23.254.1 | - | - | - | | Vlan4094 | default | 192.168.254.1/31 | - | - | - | - | - | #### VLAN Interfaces Device Configuration @@ -288,6 +294,14 @@ interface Vlan100 no shutdown ip address virtual 10.0.100.1/24 ! +interface Vlan4092 + description Inband Management + no shutdown + mtu 1500 + ip address 172.23.254.3/24 + ip attached-host route export 19 + ip virtual-router address 172.23.254.1 +! interface Vlan4094 description MLAG_PEER no shutdown diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/fabric/L2LS-documentation.md b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/fabric/L2LS-documentation.md index 0da6af80da4..eae4ba2d5af 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/fabric/L2LS-documentation.md +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/documentation/fabric/L2LS-documentation.md @@ -39,6 +39,13 @@ | POD | Type | Node | Management IP | Inband Interface | | --- | ---- | ---- | ------------- | ---------------- | +| L2LS_BGP | leaf | BGP-LEAF1 | 172.23.254.4/24 | Vlan4092 | +| L2LS_BGP | leaf | BGP-LEAF2 | 172.23.254.5/24 | Vlan4092 | +| L2LS_ISIS | leaf | ISIS-LEAF1 | 172.23.254.4/24 | Vlan4092 | +| L2LS_L2ONLY | leaf | L2ONLY-LEAF1 | 172.23.254.4/24 | Vlan4092 | +| L2LS_L2ONLY | leaf | L2ONLY-LEAF2 | 172.23.254.5/24 | Vlan4092 | +| L2LS_OSPF | leaf | OSPF-LEAF1 | 172.23.254.4/24 | Vlan4092 | +| L2LS_OSPF | leaf | OSPF-LEAF2 | 172.23.254.5/24 | Vlan4092 | ## Fabric Topology diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/BGP-LEAF1.cfg b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/BGP-LEAF1.cfg index 09792d9737f..a324d0f7b8b 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/BGP-LEAF1.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/BGP-LEAF1.cfg @@ -20,13 +20,16 @@ vlan 100 vlan 200 name SVI_200 ! +vlan 4092 + name INBAND_MGMT +! vrf instance MGMT ! interface Port-Channel1 description BGP_SPINES_Po1 no shutdown switchport - switchport trunk allowed vlan 1,100,200 + switchport trunk allowed vlan 1,100,200,4092 switchport mode trunk ! interface Ethernet1 @@ -78,9 +81,16 @@ interface Ethernet14 switchport phone trunk untagged switchport mode trunk phone switchport +! +interface Vlan4092 + description Inband Management + no shutdown + mtu 1500 + ip address 172.23.254.4/24 no ip routing vrf MGMT ! ip route vrf MGMT 0.0.0.0/0 172.31.0.1 +ip route 0.0.0.0/0 172.23.254.1 ! management api http-commands protocol https diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/BGP-LEAF2.cfg b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/BGP-LEAF2.cfg index 35c6dbecbc7..1f68fab4514 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/BGP-LEAF2.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/BGP-LEAF2.cfg @@ -14,13 +14,16 @@ no aaa root vlan 100 name SVI_100 ! +vlan 4092 + name INBAND_MGMT +! vrf instance MGMT ! interface Port-Channel1 description BGP_SPINES_Po2 no shutdown switchport - switchport trunk allowed vlan 100 + switchport trunk allowed vlan 100,4092 switchport mode trunk ! interface Ethernet1 @@ -46,9 +49,16 @@ interface Ethernet11 switchport access vlan 100 switchport mode access switchport +! +interface Vlan4092 + description Inband Management + no shutdown + mtu 1500 + ip address 172.23.254.5/24 no ip routing vrf MGMT ! ip route vrf MGMT 0.0.0.0/0 172.31.0.1 +ip route 0.0.0.0/0 172.23.254.1 ! management api http-commands protocol https diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/BGP-SPINE1.cfg b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/BGP-SPINE1.cfg index f0b60dfa62f..54265013668 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/BGP-SPINE1.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/BGP-SPINE1.cfg @@ -25,6 +25,9 @@ vlan 200 vlan 220 name SVI_220 ! +vlan 4092 + name INBAND_MGMT +! vlan 4094 name MLAG_PEER trunk group MLAG @@ -35,7 +38,7 @@ interface Port-Channel1 description BGP-LEAF1_Po1 no shutdown switchport - switchport trunk allowed vlan 1,100,200 + switchport trunk allowed vlan 1,100,200,4092 switchport mode trunk mlag 1 ! @@ -43,7 +46,7 @@ interface Port-Channel2 description BGP-LEAF2_Po1 no shutdown switchport - switchport trunk allowed vlan 100 + switchport trunk allowed vlan 100,4092 switchport mode trunk mlag 2 ! @@ -107,6 +110,14 @@ interface Vlan220 no shutdown ip address virtual 10.1.220.1/24 ! +interface Vlan4092 + description Inband Management + no shutdown + mtu 1500 + ip address 172.23.254.2/24 + ip attached-host route export 19 + ip virtual-router address 172.23.254.1 +! interface Vlan4094 description MLAG_PEER no shutdown @@ -153,6 +164,7 @@ router bgp 65001 neighbor 192.168.253.5 description DUMMY-CORE neighbor 192.168.254.1 peer group MLAG-IPv4-UNDERLAY-PEER neighbor 192.168.254.1 description BGP-SPINE2 + redistribute attached-host redistribute connected ! address-family ipv4 diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/BGP-SPINE2.cfg b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/BGP-SPINE2.cfg index 1ee66d705a1..7f2141a03f7 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/BGP-SPINE2.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/BGP-SPINE2.cfg @@ -25,6 +25,9 @@ vlan 200 vlan 220 name SVI_220 ! +vlan 4092 + name INBAND_MGMT +! vlan 4094 name MLAG_PEER trunk group MLAG @@ -35,7 +38,7 @@ interface Port-Channel1 description BGP-LEAF1_Po1 no shutdown switchport - switchport trunk allowed vlan 1,100,200 + switchport trunk allowed vlan 1,100,200,4092 switchport mode trunk mlag 1 ! @@ -43,7 +46,7 @@ interface Port-Channel2 description BGP-LEAF2_Po1 no shutdown switchport - switchport trunk allowed vlan 100 + switchport trunk allowed vlan 100,4092 switchport mode trunk mlag 2 ! @@ -107,6 +110,14 @@ interface Vlan220 no shutdown ip address virtual 10.1.220.1/24 ! +interface Vlan4092 + description Inband Management + no shutdown + mtu 1500 + ip address 172.23.254.3/24 + ip attached-host route export 19 + ip virtual-router address 172.23.254.1 +! interface Vlan4094 description MLAG_PEER no shutdown @@ -154,6 +165,7 @@ router bgp 65001 neighbor 192.168.253.7 description DUMMY-CORE neighbor 192.168.254.0 peer group MLAG-IPv4-UNDERLAY-PEER neighbor 192.168.254.0 description BGP-SPINE1 + redistribute attached-host redistribute connected redistribute static ! diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/ISIS-LEAF1.cfg b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/ISIS-LEAF1.cfg index ce85039e714..60dfaa01dac 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/ISIS-LEAF1.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/ISIS-LEAF1.cfg @@ -14,13 +14,16 @@ no aaa root vlan 110 name SVI_110 ! +vlan 4092 + name INBAND_MGMT +! vrf instance MGMT ! interface Port-Channel1 description ISIS-SPINE1_Po1 no shutdown switchport - switchport trunk allowed vlan 110 + switchport trunk allowed vlan 110,4092 switchport mode trunk ! interface Ethernet1 @@ -33,9 +36,16 @@ interface Management1 no shutdown vrf MGMT ip address 192.168.200.105/24 +! +interface Vlan4092 + description Inband Management + no shutdown + mtu 1500 + ip address 172.23.254.4/24 no ip routing vrf MGMT ! ip route vrf MGMT 0.0.0.0/0 172.31.0.1 +ip route 0.0.0.0/0 172.23.254.1 ! management api http-commands protocol https diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/ISIS-SPINE1.cfg b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/ISIS-SPINE1.cfg index 921afcd6ae4..50bd47ea326 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/ISIS-SPINE1.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/ISIS-SPINE1.cfg @@ -14,13 +14,16 @@ no aaa root vlan 110 name SVI_110 ! +vlan 4092 + name INBAND_MGMT +! vrf instance MGMT ! interface Port-Channel1 description ISIS-LEAF1_Po1 no shutdown switchport - switchport trunk allowed vlan 110 + switchport trunk allowed vlan 110,4092 switchport mode trunk ! interface Ethernet1 @@ -53,6 +56,14 @@ interface Vlan110 no shutdown ip address virtual 10.0.110.1/24 ! +interface Vlan4092 + description Inband Management + no shutdown + mtu 1500 + ip address 172.23.254.2/24 + ip attached-host route export 19 + ip virtual-router address 172.23.254.1 +! ip virtual-router mac-address 00:1c:73:00:00:9a ! ip routing diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/L2ONLY-LEAF1.cfg b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/L2ONLY-LEAF1.cfg index 5a3a9f97109..739ca7e2eda 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/L2ONLY-LEAF1.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/L2ONLY-LEAF1.cfg @@ -14,13 +14,16 @@ no aaa root vlan 100 name L2VLAN_100 ! +vlan 4092 + name INBAND_MGMT +! vrf instance MGMT ! interface Port-Channel1 description L2ONLY_SPINES_Po1 no shutdown switchport - switchport trunk allowed vlan 100 + switchport trunk allowed vlan 100,4092 switchport mode trunk ! interface Ethernet1 @@ -46,9 +49,16 @@ interface Ethernet11 switchport access vlan 100 switchport mode access switchport +! +interface Vlan4092 + description Inband Management + no shutdown + mtu 1500 + ip address 172.23.254.4/24 no ip routing vrf MGMT ! ip route vrf MGMT 0.0.0.0/0 172.31.0.1 +ip route 0.0.0.0/0 172.23.254.1 ! management api http-commands protocol https diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/L2ONLY-LEAF2.cfg b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/L2ONLY-LEAF2.cfg index 98c53e81ea2..1a20006b1e1 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/L2ONLY-LEAF2.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/L2ONLY-LEAF2.cfg @@ -14,13 +14,16 @@ no aaa root vlan 100 name L2VLAN_100 ! +vlan 4092 + name INBAND_MGMT +! vrf instance MGMT ! interface Port-Channel1 description L2ONLY_SPINES_Po2 no shutdown switchport - switchport trunk allowed vlan 100 + switchport trunk allowed vlan 100,4092 switchport mode trunk ! interface Ethernet1 @@ -46,9 +49,16 @@ interface Ethernet11 switchport access vlan 100 switchport mode access switchport +! +interface Vlan4092 + description Inband Management + no shutdown + mtu 1500 + ip address 172.23.254.5/24 no ip routing vrf MGMT ! ip route vrf MGMT 0.0.0.0/0 172.31.0.1 +ip route 0.0.0.0/0 172.23.254.1 ! management api http-commands protocol https diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/L2ONLY-SPINE1.cfg b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/L2ONLY-SPINE1.cfg index 5437eee6de5..807ed424ee8 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/L2ONLY-SPINE1.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/L2ONLY-SPINE1.cfg @@ -26,7 +26,7 @@ interface Port-Channel1 description L2ONLY-LEAF1_Po1 no shutdown switchport - switchport trunk allowed vlan 100 + switchport trunk allowed vlan 100,4092 switchport mode trunk mlag 1 ! @@ -34,7 +34,7 @@ interface Port-Channel2 description L2ONLY-LEAF2_Po1 no shutdown switchport - switchport trunk allowed vlan 100 + switchport trunk allowed vlan 100,4092 switchport mode trunk mlag 2 ! diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/L2ONLY-SPINE2.cfg b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/L2ONLY-SPINE2.cfg index 1e8640c4849..d2f5fb485c4 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/L2ONLY-SPINE2.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/L2ONLY-SPINE2.cfg @@ -26,7 +26,7 @@ interface Port-Channel1 description L2ONLY-LEAF1_Po1 no shutdown switchport - switchport trunk allowed vlan 100 + switchport trunk allowed vlan 100,4092 switchport mode trunk mlag 1 ! @@ -34,7 +34,7 @@ interface Port-Channel2 description L2ONLY-LEAF2_Po1 no shutdown switchport - switchport trunk allowed vlan 100 + switchport trunk allowed vlan 100,4092 switchport mode trunk mlag 2 ! diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/OSPF-LEAF1.cfg b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/OSPF-LEAF1.cfg index ff1b92bffd1..4d92ec750c1 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/OSPF-LEAF1.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/OSPF-LEAF1.cfg @@ -14,13 +14,16 @@ no aaa root vlan 100 name SVI_100 ! +vlan 4092 + name INBAND_MGMT +! vrf instance MGMT ! interface Port-Channel1 description OSPF_SPINES_Po1 no shutdown switchport - switchport trunk allowed vlan 100 + switchport trunk allowed vlan 100,4092 switchport mode trunk ! interface Ethernet1 @@ -46,9 +49,16 @@ interface Ethernet11 switchport access vlan 100 switchport mode access switchport +! +interface Vlan4092 + description Inband Management + no shutdown + mtu 1500 + ip address 172.23.254.4/24 no ip routing vrf MGMT ! ip route vrf MGMT 0.0.0.0/0 172.31.0.1 +ip route 0.0.0.0/0 172.23.254.1 ! management api http-commands protocol https diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/OSPF-LEAF2.cfg b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/OSPF-LEAF2.cfg index a31702eef0a..436ae55dc33 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/OSPF-LEAF2.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/OSPF-LEAF2.cfg @@ -14,13 +14,16 @@ no aaa root vlan 100 name SVI_100 ! +vlan 4092 + name INBAND_MGMT +! vrf instance MGMT ! interface Port-Channel1 description OSPF_SPINES_Po2 no shutdown switchport - switchport trunk allowed vlan 100 + switchport trunk allowed vlan 100,4092 switchport mode trunk ! interface Ethernet1 @@ -46,9 +49,16 @@ interface Ethernet11 switchport access vlan 100 switchport mode access switchport +! +interface Vlan4092 + description Inband Management + no shutdown + mtu 1500 + ip address 172.23.254.5/24 no ip routing vrf MGMT ! ip route vrf MGMT 0.0.0.0/0 172.31.0.1 +ip route 0.0.0.0/0 172.23.254.1 ! management api http-commands protocol https diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/OSPF-SPINE1.cfg b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/OSPF-SPINE1.cfg index 639a4c563f8..afb71a70927 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/OSPF-SPINE1.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/OSPF-SPINE1.cfg @@ -16,6 +16,9 @@ no aaa root vlan 100 name SVI_100 ! +vlan 4092 + name INBAND_MGMT +! vlan 4094 name MLAG_PEER trunk group MLAG @@ -26,7 +29,7 @@ interface Port-Channel1 description OSPF-LEAF1_Po1 no shutdown switchport - switchport trunk allowed vlan 100 + switchport trunk allowed vlan 100,4092 switchport mode trunk mlag 1 ! @@ -34,7 +37,7 @@ interface Port-Channel2 description OSPF-LEAF2_Po1 no shutdown switchport - switchport trunk allowed vlan 100 + switchport trunk allowed vlan 100,4092 switchport mode trunk mlag 2 ! @@ -86,6 +89,14 @@ interface Vlan100 no shutdown ip address virtual 10.0.100.1/24 ! +interface Vlan4092 + description Inband Management + no shutdown + mtu 1500 + ip address 172.23.254.2/24 + ip attached-host route export 19 + ip virtual-router address 172.23.254.1 +! interface Vlan4094 description MLAG_PEER no shutdown diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/OSPF-SPINE2.cfg b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/OSPF-SPINE2.cfg index c9cc0152930..4ddbed10bbb 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/OSPF-SPINE2.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/configs/OSPF-SPINE2.cfg @@ -16,6 +16,9 @@ no aaa root vlan 100 name SVI_100 ! +vlan 4092 + name INBAND_MGMT +! vlan 4094 name MLAG_PEER trunk group MLAG @@ -26,7 +29,7 @@ interface Port-Channel1 description OSPF-LEAF1_Po1 no shutdown switchport - switchport trunk allowed vlan 100 + switchport trunk allowed vlan 100,4092 switchport mode trunk mlag 1 ! @@ -34,7 +37,7 @@ interface Port-Channel2 description OSPF-LEAF2_Po1 no shutdown switchport - switchport trunk allowed vlan 100 + switchport trunk allowed vlan 100,4092 switchport mode trunk mlag 2 ! @@ -86,6 +89,14 @@ interface Vlan100 no shutdown ip address virtual 10.0.100.1/24 ! +interface Vlan4092 + description Inband Management + no shutdown + mtu 1500 + ip address 172.23.254.3/24 + ip attached-host route export 19 + ip virtual-router address 172.23.254.1 +! interface Vlan4094 description MLAG_PEER no shutdown diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/BGP-LEAF1.yml b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/BGP-LEAF1.yml index 42a58945197..90a87b0f8b2 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/BGP-LEAF1.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/BGP-LEAF1.yml @@ -4,6 +4,8 @@ static_routes: - vrf: MGMT destination_address_prefix: 0.0.0.0/0 gateway: 172.31.0.1 +- destination_address_prefix: 0.0.0.0/0 + gateway: 172.23.254.1 service_routing_protocols_model: multi-agent vlan_internal_order: allocation: ascending @@ -92,7 +94,7 @@ port_channel_interfaces: type: switched shutdown: false mode: trunk - vlans: 1,100,200 + vlans: 1,100,200,4092 vlans: - id: 1 name: SVI_1 @@ -103,5 +105,15 @@ vlans: - id: 200 name: SVI_200 tenant: L2LS_BGP +- id: 4092 + tenant: system + name: INBAND_MGMT ip_igmp_snooping: globally_enabled: true +vlan_interfaces: +- name: Vlan4092 + description: Inband Management + shutdown: false + mtu: 1500 + ip_address: 172.23.254.4/24 + type: inband_mgmt diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/BGP-LEAF2.yml b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/BGP-LEAF2.yml index 218b3f56d95..374d6329d7a 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/BGP-LEAF2.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/BGP-LEAF2.yml @@ -4,6 +4,8 @@ static_routes: - vrf: MGMT destination_address_prefix: 0.0.0.0/0 gateway: 172.31.0.1 +- destination_address_prefix: 0.0.0.0/0 + gateway: 172.23.254.1 service_routing_protocols_model: multi-agent vlan_internal_order: allocation: ascending @@ -60,10 +62,20 @@ port_channel_interfaces: type: switched shutdown: false mode: trunk - vlans: '100' + vlans: 100,4092 vlans: - id: 100 name: SVI_100 tenant: L2LS_BGP +- id: 4092 + tenant: system + name: INBAND_MGMT ip_igmp_snooping: globally_enabled: true +vlan_interfaces: +- name: Vlan4092 + description: Inband Management + shutdown: false + mtu: 1500 + ip_address: 172.23.254.5/24 + type: inband_mgmt diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/BGP-SPINE1.yml b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/BGP-SPINE1.yml index 8231be1bf26..561e6a8631c 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/BGP-SPINE1.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/BGP-SPINE1.yml @@ -42,6 +42,7 @@ router_bgp: peer_group: IPv4-UNDERLAY-PEERS redistribute_routes: - source_protocol: connected + - source_protocol: attached-host static_routes: - vrf: MGMT destination_address_prefix: 0.0.0.0/0 @@ -80,13 +81,16 @@ vlans: - id: 220 name: SVI_220 tenant: L2LS_BGP +- id: 4092 + tenant: system + name: INBAND_MGMT vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 192.168.254.0/31 no_autostate: true mtu: 9214 + ip_address: 192.168.254.0/31 - name: Vlan1 tenant: L2LS_BGP description: SVI_1 @@ -107,6 +111,16 @@ vlan_interfaces: description: SVI_220 shutdown: false ip_address_virtual: 10.1.220.1/24 +- name: Vlan4092 + description: Inband Management + shutdown: false + mtu: 1500 + ip_attached_host_route_export: + enabled: true + distance: 19 + ip_address: 172.23.254.2/24 + ip_virtual_router_addresses: + - 172.23.254.1 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_BGP-SPINE2_Po3 @@ -121,14 +135,14 @@ port_channel_interfaces: type: switched shutdown: false mode: trunk - vlans: 1,100,200 + vlans: 1,100,200,4092 mlag: 1 - name: Port-Channel2 description: BGP-LEAF2_Po1 type: switched shutdown: false mode: trunk - vlans: '100' + vlans: 100,4092 mlag: 2 ethernet_interfaces: - name: Ethernet3 diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/BGP-SPINE2.yml b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/BGP-SPINE2.yml index f550150da72..d73e3931c34 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/BGP-SPINE2.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/BGP-SPINE2.yml @@ -43,6 +43,7 @@ router_bgp: redistribute_routes: - source_protocol: connected - source_protocol: static + - source_protocol: attached-host static_routes: - vrf: MGMT destination_address_prefix: 0.0.0.0/0 @@ -84,13 +85,16 @@ vlans: - id: 220 name: SVI_220 tenant: L2LS_BGP +- id: 4092 + tenant: system + name: INBAND_MGMT vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 192.168.254.1/31 no_autostate: true mtu: 9214 + ip_address: 192.168.254.1/31 - name: Vlan1 tenant: L2LS_BGP description: SVI_1 @@ -111,6 +115,16 @@ vlan_interfaces: description: SVI_220 shutdown: false ip_address_virtual: 10.1.220.1/24 +- name: Vlan4092 + description: Inband Management + shutdown: false + mtu: 1500 + ip_attached_host_route_export: + enabled: true + distance: 19 + ip_address: 172.23.254.3/24 + ip_virtual_router_addresses: + - 172.23.254.1 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_BGP-SPINE1_Po3 @@ -125,14 +139,14 @@ port_channel_interfaces: type: switched shutdown: false mode: trunk - vlans: 1,100,200 + vlans: 1,100,200,4092 mlag: 1 - name: Port-Channel2 description: BGP-LEAF2_Po1 type: switched shutdown: false mode: trunk - vlans: '100' + vlans: 100,4092 mlag: 2 ethernet_interfaces: - name: Ethernet3 diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/ISIS-LEAF1.yml b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/ISIS-LEAF1.yml index 573284f7ad9..f99a6234cba 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/ISIS-LEAF1.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/ISIS-LEAF1.yml @@ -4,6 +4,8 @@ static_routes: - vrf: MGMT destination_address_prefix: 0.0.0.0/0 gateway: 172.31.0.1 +- destination_address_prefix: 0.0.0.0/0 + gateway: 172.23.254.1 service_routing_protocols_model: multi-agent vlan_internal_order: allocation: ascending @@ -42,12 +44,22 @@ port_channel_interfaces: type: switched shutdown: false mode: trunk - vlans: '110' + vlans: 110,4092 vlans: - id: 110 name: SVI_110 tenant: L2LS_ISIS +- id: 4092 + tenant: system + name: INBAND_MGMT ip_igmp_snooping: globally_enabled: true +vlan_interfaces: +- name: Vlan4092 + description: Inband Management + shutdown: false + mtu: 1500 + ip_address: 172.23.254.4/24 + type: inband_mgmt metadata: platform: vEOS-LAB diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/ISIS-SPINE1.yml b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/ISIS-SPINE1.yml index bfd81385942..eb4f3eb8b4f 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/ISIS-SPINE1.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/ISIS-SPINE1.yml @@ -54,7 +54,7 @@ port_channel_interfaces: type: switched shutdown: false mode: trunk - vlans: '110' + vlans: 110,4092 loopback_interfaces: - name: Loopback0 description: Router_ID @@ -78,6 +78,9 @@ vlans: - id: 110 name: SVI_110 tenant: L2LS_ISIS +- id: 4092 + tenant: system + name: INBAND_MGMT ip_igmp_snooping: globally_enabled: true ip_virtual_router_mac_address: 00:1c:73:00:00:9a @@ -87,5 +90,15 @@ vlan_interfaces: description: SVI_110 shutdown: false ip_address_virtual: 10.0.110.1/24 +- name: Vlan4092 + description: Inband Management + shutdown: false + mtu: 1500 + ip_attached_host_route_export: + enabled: true + distance: 19 + ip_address: 172.23.254.2/24 + ip_virtual_router_addresses: + - 172.23.254.1 metadata: platform: vEOS-LAB diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/L2ONLY-LEAF1.yml b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/L2ONLY-LEAF1.yml index 52efcbb57fc..a8e45025f06 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/L2ONLY-LEAF1.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/L2ONLY-LEAF1.yml @@ -4,6 +4,8 @@ static_routes: - vrf: MGMT destination_address_prefix: 0.0.0.0/0 gateway: 172.31.0.1 +- destination_address_prefix: 0.0.0.0/0 + gateway: 172.23.254.1 service_routing_protocols_model: multi-agent vlan_internal_order: allocation: ascending @@ -60,10 +62,20 @@ port_channel_interfaces: type: switched shutdown: false mode: trunk - vlans: '100' + vlans: 100,4092 vlans: - id: 100 name: L2VLAN_100 tenant: L2LS_L2ONLY +- id: 4092 + tenant: system + name: INBAND_MGMT ip_igmp_snooping: globally_enabled: true +vlan_interfaces: +- name: Vlan4092 + description: Inband Management + shutdown: false + mtu: 1500 + ip_address: 172.23.254.4/24 + type: inband_mgmt diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/L2ONLY-LEAF2.yml b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/L2ONLY-LEAF2.yml index b95696f222c..f0898aac80e 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/L2ONLY-LEAF2.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/L2ONLY-LEAF2.yml @@ -4,6 +4,8 @@ static_routes: - vrf: MGMT destination_address_prefix: 0.0.0.0/0 gateway: 172.31.0.1 +- destination_address_prefix: 0.0.0.0/0 + gateway: 172.23.254.1 service_routing_protocols_model: multi-agent vlan_internal_order: allocation: ascending @@ -60,10 +62,20 @@ port_channel_interfaces: type: switched shutdown: false mode: trunk - vlans: '100' + vlans: 100,4092 vlans: - id: 100 name: L2VLAN_100 tenant: L2LS_L2ONLY +- id: 4092 + tenant: system + name: INBAND_MGMT ip_igmp_snooping: globally_enabled: true +vlan_interfaces: +- name: Vlan4092 + description: Inband Management + shutdown: false + mtu: 1500 + ip_address: 172.23.254.5/24 + type: inband_mgmt diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/L2ONLY-SPINE1.yml b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/L2ONLY-SPINE1.yml index 73dc55209cb..65c2e24784e 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/L2ONLY-SPINE1.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/L2ONLY-SPINE1.yml @@ -33,9 +33,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 192.168.254.0/31 no_autostate: true mtu: 9214 + ip_address: 192.168.254.0/31 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_L2ONLY-SPINE2_Po3 @@ -49,14 +49,14 @@ port_channel_interfaces: type: switched shutdown: false mode: trunk - vlans: '100' + vlans: 100,4092 mlag: 1 - name: Port-Channel2 description: L2ONLY-LEAF2_Po1 type: switched shutdown: false mode: trunk - vlans: '100' + vlans: 100,4092 mlag: 2 ethernet_interfaces: - name: Ethernet3 diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/L2ONLY-SPINE2.yml b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/L2ONLY-SPINE2.yml index a67eaf96475..1c9b99a16e2 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/L2ONLY-SPINE2.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/L2ONLY-SPINE2.yml @@ -33,9 +33,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 192.168.254.1/31 no_autostate: true mtu: 9214 + ip_address: 192.168.254.1/31 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_L2ONLY-SPINE1_Po3 @@ -49,14 +49,14 @@ port_channel_interfaces: type: switched shutdown: false mode: trunk - vlans: '100' + vlans: 100,4092 mlag: 1 - name: Port-Channel2 description: L2ONLY-LEAF2_Po1 type: switched shutdown: false mode: trunk - vlans: '100' + vlans: 100,4092 mlag: 2 ethernet_interfaces: - name: Ethernet3 diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/OSPF-LEAF1.yml b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/OSPF-LEAF1.yml index 1f532b3adc5..2bc0a736f3e 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/OSPF-LEAF1.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/OSPF-LEAF1.yml @@ -4,6 +4,8 @@ static_routes: - vrf: MGMT destination_address_prefix: 0.0.0.0/0 gateway: 172.31.0.1 +- destination_address_prefix: 0.0.0.0/0 + gateway: 172.23.254.1 service_routing_protocols_model: multi-agent vlan_internal_order: allocation: ascending @@ -60,10 +62,20 @@ port_channel_interfaces: type: switched shutdown: false mode: trunk - vlans: '100' + vlans: 100,4092 vlans: - id: 100 name: SVI_100 tenant: L2LS_OSPF +- id: 4092 + tenant: system + name: INBAND_MGMT ip_igmp_snooping: globally_enabled: true +vlan_interfaces: +- name: Vlan4092 + description: Inband Management + shutdown: false + mtu: 1500 + ip_address: 172.23.254.4/24 + type: inband_mgmt diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/OSPF-LEAF2.yml b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/OSPF-LEAF2.yml index f6424b579fd..5762a9fe025 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/OSPF-LEAF2.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/OSPF-LEAF2.yml @@ -4,6 +4,8 @@ static_routes: - vrf: MGMT destination_address_prefix: 0.0.0.0/0 gateway: 172.31.0.1 +- destination_address_prefix: 0.0.0.0/0 + gateway: 172.23.254.1 service_routing_protocols_model: multi-agent vlan_internal_order: allocation: ascending @@ -60,10 +62,20 @@ port_channel_interfaces: type: switched shutdown: false mode: trunk - vlans: '100' + vlans: 100,4092 vlans: - id: 100 name: SVI_100 tenant: L2LS_OSPF +- id: 4092 + tenant: system + name: INBAND_MGMT ip_igmp_snooping: globally_enabled: true +vlan_interfaces: +- name: Vlan4092 + description: Inband Management + shutdown: false + mtu: 1500 + ip_address: 172.23.254.5/24 + type: inband_mgmt diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/OSPF-SPINE1.yml b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/OSPF-SPINE1.yml index 1f527f26e96..cf793e943aa 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/OSPF-SPINE1.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/OSPF-SPINE1.yml @@ -29,13 +29,16 @@ vlans: - id: 100 name: SVI_100 tenant: L2LS_OSPF +- id: 4092 + tenant: system + name: INBAND_MGMT vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 192.168.254.0/31 no_autostate: true mtu: 9214 + ip_address: 192.168.254.0/31 ospf_network_point_to_point: true ospf_area: 0.0.0.0 - name: Vlan100 @@ -43,6 +46,16 @@ vlan_interfaces: description: SVI_100 shutdown: false ip_address_virtual: 10.0.100.1/24 +- name: Vlan4092 + description: Inband Management + shutdown: false + mtu: 1500 + ip_attached_host_route_export: + enabled: true + distance: 19 + ip_address: 172.23.254.2/24 + ip_virtual_router_addresses: + - 172.23.254.1 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_OSPF-SPINE2_Po3 @@ -57,14 +70,14 @@ port_channel_interfaces: type: switched shutdown: false mode: trunk - vlans: '100' + vlans: 100,4092 mlag: 1 - name: Port-Channel2 description: OSPF-LEAF2_Po1 type: switched shutdown: false mode: trunk - vlans: '100' + vlans: 100,4092 mlag: 2 ethernet_interfaces: - name: Ethernet3 diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/OSPF-SPINE2.yml b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/OSPF-SPINE2.yml index f30e09c4fdc..713e560fb60 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/OSPF-SPINE2.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/intended/structured_configs/OSPF-SPINE2.yml @@ -32,13 +32,16 @@ vlans: - id: 100 name: SVI_100 tenant: L2LS_OSPF +- id: 4092 + tenant: system + name: INBAND_MGMT vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 192.168.254.1/31 no_autostate: true mtu: 9214 + ip_address: 192.168.254.1/31 ospf_network_point_to_point: true ospf_area: 0.0.0.0 - name: Vlan100 @@ -46,6 +49,16 @@ vlan_interfaces: description: SVI_100 shutdown: false ip_address_virtual: 10.0.100.1/24 +- name: Vlan4092 + description: Inband Management + shutdown: false + mtu: 1500 + ip_attached_host_route_export: + enabled: true + distance: 19 + ip_address: 172.23.254.3/24 + ip_virtual_router_addresses: + - 172.23.254.1 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_OSPF-SPINE1_Po3 @@ -60,14 +73,14 @@ port_channel_interfaces: type: switched shutdown: false mode: trunk - vlans: '100' + vlans: 100,4092 mlag: 1 - name: Port-Channel2 description: OSPF-LEAF2_Po1 type: switched shutdown: false mode: trunk - vlans: '100' + vlans: 100,4092 mlag: 2 ethernet_interfaces: - name: Ethernet3 diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/inventory/group_vars/BGP_LEAFS.yml b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/inventory/group_vars/BGP_LEAFS.yml index e274ff983df..22ec54cbb04 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/inventory/group_vars/BGP_LEAFS.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/inventory/group_vars/BGP_LEAFS.yml @@ -7,6 +7,7 @@ leaf: uplink_interfaces: [ Ethernet1, Ethernet2 ] filter: only_vlans_in_use: true + inband_mgmt_subnet: 172.23.254.0/24 nodes: - name: BGP-LEAF1 id: 1 diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/inventory/group_vars/ISIS_LEAFS.yml b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/inventory/group_vars/ISIS_LEAFS.yml index 6bedb59c994..d0fb7541e55 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/inventory/group_vars/ISIS_LEAFS.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/inventory/group_vars/ISIS_LEAFS.yml @@ -9,6 +9,7 @@ leaf: isis_system_id_prefix: '0001.0001' isis_maximum_paths: 4 platform: vEOS-LAB + inband_mgmt_subnet: 172.23.254.0/24 node_groups: - group: ISIS_LEAFS vtep_loopback: Loopback0 diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/inventory/group_vars/L2ONLY_LEAFS.yml b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/inventory/group_vars/L2ONLY_LEAFS.yml index 0ff02369f31..9d22cd4f3db 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/inventory/group_vars/L2ONLY_LEAFS.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/inventory/group_vars/L2ONLY_LEAFS.yml @@ -5,6 +5,7 @@ leaf: defaults: uplink_switches: [ L2ONLY-SPINE1, L2ONLY-SPINE2 ] uplink_interfaces: [ Ethernet1, Ethernet2 ] + inband_mgmt_subnet: 172.23.254.0/24 nodes: - name: L2ONLY-LEAF1 id: 1 diff --git a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/inventory/group_vars/OSPF_LEAFS.yml b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/inventory/group_vars/OSPF_LEAFS.yml index 9fa7462e1ae..72395541e6e 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-l2ls/inventory/group_vars/OSPF_LEAFS.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs-l2ls/inventory/group_vars/OSPF_LEAFS.yml @@ -5,6 +5,7 @@ leaf: defaults: uplink_switches: [ OSPF-SPINE1, OSPF-SPINE2 ] uplink_interfaces: [ Ethernet1, Ethernet2 ] + inband_mgmt_subnet: 172.23.254.0/24 nodes: - name: OSPF-LEAF1 id: 1 diff --git a/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/documentation/devices/SITE1-LER1.md b/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/documentation/devices/SITE1-LER1.md index 6f2e8aeab64..449e8d9855c 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/documentation/devices/SITE1-LER1.md +++ b/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/documentation/devices/SITE1-LER1.md @@ -193,10 +193,10 @@ vlan 2020 ##### ISIS -| Interface | Channel Group | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | -| Ethernet1 | - | CORE | 60 | point-to-point | level-2 | False | md5 | -| Ethernet2 | - | CORE | 500 | point-to-point | level-2 | False | md5 | +| Interface | Channel Group | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Ethernet1 | - | CORE | - | 60 | point-to-point | level-2 | False | md5 | +| Ethernet2 | - | CORE | - | 500 | point-to-point | level-2 | False | md5 | #### Ethernet Interfaces Device Configuration @@ -303,10 +303,6 @@ interface Ethernet8 | Interface | Ethernet Segment Identifier | Multihoming Redundancy Mode | Route Target | | --------- | --------------------------- | --------------------------- | ------------ | | Port-Channel3 | 0000:0000:0102:0000:0034 | all-active | 01:02:00:00:00:34 | -| Port-Channel8 | 0000:0000:0303:0202:0101 | all-active | 03:03:02:02:01:01 | -| Port-Channel8.111 | 0000:0000:0303:0202:0111 | all-active | 03:03:02:02:01:11 | -| Port-Channel8.222 | 0000:0000:0303:0202:0222 | all-active | 03:03:02:02:02:22 | -| Port-Channel8.333 | 0000:0000:0303:0202:0333 | all-active | 03:03:02:02:03:33 | #### Port-Channel Interfaces Device Configuration @@ -349,34 +345,21 @@ interface Port-Channel8 description CPE_TENANT_A_SITE1_EVPN-A-A-PortChannel no shutdown no switchport - evpn ethernet-segment - identifier 0000:0000:0303:0202:0101 - route-target import 03:03:02:02:01:01 - lacp system-id 0303.0202.0101 ! interface Port-Channel8.111 vlan id 111 encapsulation vlan client dot1q 111 network client - evpn ethernet-segment - identifier 0000:0000:0303:0202:0111 - route-target import 03:03:02:02:01:11 ! interface Port-Channel8.222 vlan id 222 encapsulation vlan client dot1q 222 network client - evpn ethernet-segment - identifier 0000:0000:0303:0202:0222 - route-target import 03:03:02:02:02:22 ! interface Port-Channel8.333 vlan id 434 encapsulation vlan client dot1q 333 network client - evpn ethernet-segment - identifier 0000:0000:0303:0202:0333 - route-target import 03:03:02:02:03:33 ``` ### Loopback Interfaces @@ -831,6 +814,8 @@ mpls ldp ### Patch Panel Summary +#### Patch Panel Connections + | Patch Name | Enabled | Connector A Type | Connector A Endpoint | Connector B Type | Connector B Endpoint | | ---------- | ------- | ---------------- | -------------------- | ---------------- | -------------------- | | TEN_A_site2_site5_eline_port_based | True | Interface | Ethernet6 | Pseudowire | bgp vpws TENANT_A pseudowire TEN_A_site2_site5_eline_port_based | diff --git a/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/documentation/devices/SITE1-LER2.md b/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/documentation/devices/SITE1-LER2.md index 3f334a8937a..aacf885452a 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/documentation/devices/SITE1-LER2.md +++ b/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/documentation/devices/SITE1-LER2.md @@ -192,10 +192,10 @@ vlan 2020 ##### ISIS -| Interface | Channel Group | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | -| Ethernet1 | - | CORE | 50 | point-to-point | level-1-2 | False | md5 | -| Ethernet2 | - | CORE | 500 | point-to-point | level-2 | False | md5 | +| Interface | Channel Group | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Ethernet1 | - | CORE | - | 50 | point-to-point | level-1-2 | False | md5 | +| Ethernet2 | - | CORE | - | 500 | point-to-point | level-2 | False | md5 | #### Ethernet Interfaces Device Configuration @@ -297,10 +297,6 @@ interface Ethernet8 | Interface | Ethernet Segment Identifier | Multihoming Redundancy Mode | Route Target | | --------- | --------------------------- | --------------------------- | ------------ | | Port-Channel3 | 0000:0000:0102:0000:0034 | all-active | 01:02:00:00:00:34 | -| Port-Channel8 | 0000:0000:0303:0202:0101 | all-active | 03:03:02:02:01:01 | -| Port-Channel8.111 | 0000:0000:0303:0202:0111 | all-active | 03:03:02:02:01:11 | -| Port-Channel8.222 | 0000:0000:0303:0202:0222 | all-active | 03:03:02:02:02:22 | -| Port-Channel8.333 | 0000:0000:0303:0202:0333 | all-active | 03:03:02:02:03:33 | #### Port-Channel Interfaces Device Configuration @@ -343,34 +339,21 @@ interface Port-Channel8 description CPE_TENANT_A_SITE1_EVPN-A-A-PortChannel no shutdown no switchport - evpn ethernet-segment - identifier 0000:0000:0303:0202:0101 - route-target import 03:03:02:02:01:01 - lacp system-id 0303.0202.0101 ! interface Port-Channel8.111 vlan id 111 encapsulation vlan client dot1q 111 network client - evpn ethernet-segment - identifier 0000:0000:0303:0202:0111 - route-target import 03:03:02:02:01:11 ! interface Port-Channel8.222 vlan id 222 encapsulation vlan client dot1q 222 network client - evpn ethernet-segment - identifier 0000:0000:0303:0202:0222 - route-target import 03:03:02:02:02:22 ! interface Port-Channel8.333 vlan id 434 encapsulation vlan client dot1q 333 network client - evpn ethernet-segment - identifier 0000:0000:0303:0202:0333 - route-target import 03:03:02:02:03:33 ``` ### Loopback Interfaces @@ -622,7 +605,7 @@ ASN Notation: asplain | 100.70.0.7 | Inherited from peer group MPLS-OVERLAY-PEERS | default | - | Inherited from peer group MPLS-OVERLAY-PEERS | Inherited from peer group MPLS-OVERLAY-PEERS | - | Inherited from peer group MPLS-OVERLAY-PEERS | - | - | - | - | | 100.70.0.8 | Inherited from peer group MPLS-OVERLAY-PEERS | default | - | Inherited from peer group MPLS-OVERLAY-PEERS | Inherited from peer group MPLS-OVERLAY-PEERS | - | Inherited from peer group MPLS-OVERLAY-PEERS | - | - | - | - | | 100.70.0.9 | Inherited from peer group MPLS-OVERLAY-PEERS | default | - | Inherited from peer group MPLS-OVERLAY-PEERS | Inherited from peer group MPLS-OVERLAY-PEERS | - | Inherited from peer group MPLS-OVERLAY-PEERS | - | - | - | - | -| 192.168.48.1 | 65201 | TENANT_B_WAN | - | - | - | - | - | - | - | - | +| 192.168.48.1 | 65201 | TENANT_B_WAN | - | - | - | - | - | - | - | - | - | #### Router BGP EVPN Address Family @@ -642,17 +625,17 @@ ASN Notation: asplain ##### VPN-IPv4 Peer Groups -| Peer Group | Activate | Route-map In | Route-map Out | -| ---------- | -------- | ------------ | ------------- | -| MPLS-OVERLAY-PEERS | True | - | - | +| Peer Group | Activate | Route-map In | Route-map Out | RCF In | RCF Out | +| ---------- | -------- | ------------ | ------------- | ------ | ------- | +| MPLS-OVERLAY-PEERS | True | - | - | - | - | #### Router BGP VPN-IPv6 Address Family ##### VPN-IPv6 Peer Groups -| Peer Group | Activate | Route-map In | Route-map Out | -| ---------- | -------- | ------------ | ------------- | -| MPLS-OVERLAY-PEERS | True | - | - | +| Peer Group | Activate | Route-map In | Route-map Out | RCF In | RCF Out | +| ---------- | -------- | ------------ | ------------- | ------ | ------- | +| MPLS-OVERLAY-PEERS | True | - | - | - | - | #### Router BGP VLANs @@ -835,6 +818,8 @@ mpls ldp ### Patch Panel Summary +#### Patch Panel Connections + | Patch Name | Enabled | Connector A Type | Connector A Endpoint | Connector B Type | Connector B Endpoint | | ---------- | ------- | ---------------- | -------------------- | ---------------- | -------------------- | | TEN_B_site3_site5_eline_vlan_based_1000 | True | Interface | Port-Channel3.1000 | Pseudowire | bgp vpws TENANT_B pseudowire TEN_B_site3_site5_eline_vlan_based_1000 | diff --git a/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/documentation/devices/SITE1-LSR1.md b/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/documentation/devices/SITE1-LSR1.md index eb9476215c4..7d6bba193c7 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/documentation/devices/SITE1-LSR1.md +++ b/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/documentation/devices/SITE1-LSR1.md @@ -142,11 +142,11 @@ vlan internal order ascending range 1006 1199 ##### ISIS -| Interface | Channel Group | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | -| Ethernet1 | - | CORE | 60 | point-to-point | level-2 | False | md5 | -| Ethernet3 | - | CORE | 60 | point-to-point | level-2 | False | md5 | -| Ethernet4 | - | CORE | 60 | point-to-point | level-2 | False | md5 | +| Interface | Channel Group | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Ethernet1 | - | CORE | - | 60 | point-to-point | level-2 | False | md5 | +| Ethernet3 | - | CORE | - | 60 | point-to-point | level-2 | False | md5 | +| Ethernet4 | - | CORE | - | 60 | point-to-point | level-2 | False | md5 | #### Ethernet Interfaces Device Configuration diff --git a/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/documentation/devices/SITE1-LSR2.md b/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/documentation/devices/SITE1-LSR2.md index b74a3b7cbc9..626c03f9d12 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/documentation/devices/SITE1-LSR2.md +++ b/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/documentation/devices/SITE1-LSR2.md @@ -140,10 +140,10 @@ vlan internal order ascending range 1006 1199 ##### ISIS -| Interface | Channel Group | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | -| Ethernet1 | - | CORE | 50 | point-to-point | level-1-2 | False | md5 | -| Ethernet3 | - | CORE | 60 | point-to-point | level-2 | False | md5 | +| Interface | Channel Group | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Ethernet1 | - | CORE | - | 50 | point-to-point | level-1-2 | False | md5 | +| Ethernet3 | - | CORE | - | 60 | point-to-point | level-2 | False | md5 | #### Ethernet Interfaces Device Configuration diff --git a/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/documentation/devices/SITE1-RR1.md b/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/documentation/devices/SITE1-RR1.md index 89e68b2548e..79e8075ac4c 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/documentation/devices/SITE1-RR1.md +++ b/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/documentation/devices/SITE1-RR1.md @@ -141,9 +141,9 @@ vlan internal order ascending range 1006 1199 ##### ISIS -| Interface | Channel Group | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | -| Ethernet4 | - | CORE | 60 | point-to-point | level-2 | False | md5 | +| Interface | Channel Group | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Ethernet4 | - | CORE | - | 60 | point-to-point | level-2 | False | md5 | #### Ethernet Interfaces Device Configuration @@ -413,19 +413,19 @@ ASN Notation: asplain ##### VPN-IPv4 Peer Groups -| Peer Group | Activate | Route-map In | Route-map Out | -| ---------- | -------- | ------------ | ------------- | -| MPLS-OVERLAY-PEERS | True | - | - | -| RR-OVERLAY-PEERS | True | - | - | +| Peer Group | Activate | Route-map In | Route-map Out | RCF In | RCF Out | +| ---------- | -------- | ------------ | ------------- | ------ | ------- | +| MPLS-OVERLAY-PEERS | True | - | - | - | - | +| RR-OVERLAY-PEERS | True | - | - | - | - | #### Router BGP VPN-IPv6 Address Family ##### VPN-IPv6 Peer Groups -| Peer Group | Activate | Route-map In | Route-map Out | -| ---------- | -------- | ------------ | ------------- | -| MPLS-OVERLAY-PEERS | True | - | - | -| RR-OVERLAY-PEERS | True | - | - | +| Peer Group | Activate | Route-map In | Route-map Out | RCF In | RCF Out | +| ---------- | -------- | ------------ | ------------- | ------ | ------- | +| MPLS-OVERLAY-PEERS | True | - | - | - | - | +| RR-OVERLAY-PEERS | True | - | - | - | - | #### Router BGP Device Configuration diff --git a/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/documentation/devices/SITE2-LER1.md b/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/documentation/devices/SITE2-LER1.md index 5029513a8a3..18309e6e88f 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/documentation/devices/SITE2-LER1.md +++ b/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/documentation/devices/SITE2-LER1.md @@ -192,6 +192,7 @@ vlan 2020 | Ethernet12 | P2P_LINK_TO_SITE2-LSR2_Ethernet13 | *routed | 11 | *100.64.49.2/30 | **default | *9178 | *False | **- | **- | | Ethernet13 | P2P_LINK_TO_SITE2-LSR2_Ethernet14 | *routed | 220 | *100.64.49.6/30 | **default | *9178 | *False | **- | **- | | Ethernet14 | P2P_LINK_TO_SITE2-LSR2_Ethernet15 | *routed | 220 | *100.64.49.6/30 | **default | *9178 | *False | **- | **- | + *Inherited from Port-Channel Interface ##### IPv6 @@ -203,18 +204,20 @@ vlan 2020 | Ethernet12 | P2P_LINK_TO_SITE2-LSR2_Ethernet13 | *routed | 11 | *- | *default | *9178 | *False | *- | *- | *- | *- | | Ethernet13 | P2P_LINK_TO_SITE2-LSR2_Ethernet14 | *routed | 220 | *- | *default | *9178 | *False | *- | *- | *- | *- | | Ethernet14 | P2P_LINK_TO_SITE2-LSR2_Ethernet15 | *routed | 220 | *- | *default | *9178 | *False | *- | *- | *- | *- | - *Inherited from Port-Channel Interface + +*Inherited from Port-Channel Interface ##### ISIS -| Interface | Channel Group | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | -| Ethernet1 | - | CORE | 60 | point-to-point | level-2 | False | md5 | -| Ethernet11 | 11 | *CORE | *60 | *point-to-point | *level-2 | *False | *md5 | -| Ethernet12 | 11 | *CORE | *60 | *point-to-point | *level-2 | *False | *md5 | -| Ethernet13 | 220 | *CORE | *60 | *point-to-point | *level-2 | *False | *md5 | -| Ethernet14 | 220 | *CORE | *60 | *point-to-point | *level-2 | *False | *md5 | - *Inherited from Port-Channel Interface +| Interface | Channel Group | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Ethernet1 | - | CORE | - | 60 | point-to-point | level-2 | False | md5 | +| Ethernet11 | 11 | *CORE | - | *60 | *point-to-point | *level-2 | *False | *md5 | +| Ethernet12 | 11 | *CORE | - | *60 | *point-to-point | *level-2 | *False | *md5 | +| Ethernet13 | 220 | *CORE | - | *60 | *point-to-point | *level-2 | *False | *md5 | +| Ethernet14 | 220 | *CORE | - | *60 | *point-to-point | *level-2 | *False | *md5 | + +*Inherited from Port-Channel Interface #### Ethernet Interfaces Device Configuration @@ -347,10 +350,10 @@ interface Ethernet14 ##### ISIS -| Interface | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | -| Port-Channel11 | CORE | 60 | point-to-point | level-2 | False | md5 | -| Port-Channel220 | CORE | 60 | point-to-point | level-2 | False | md5 | +| Interface | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Port-Channel11 | CORE | - | 60 | point-to-point | level-2 | False | md5 | +| Port-Channel220 | CORE | - | 60 | point-to-point | level-2 | False | md5 | #### Port-Channel Interfaces Device Configuration @@ -706,7 +709,7 @@ ASN Notation: asplain | -------- | --------- | --- | -------- | -------------- | -------------- | ---------- | --- | --------------------- | ---------------------- | ------- | ------------ | | 100.70.0.8 | Inherited from peer group MPLS-OVERLAY-PEERS | default | - | Inherited from peer group MPLS-OVERLAY-PEERS | Inherited from peer group MPLS-OVERLAY-PEERS | - | Inherited from peer group MPLS-OVERLAY-PEERS | - | - | - | - | | 100.70.0.9 | Inherited from peer group MPLS-OVERLAY-PEERS | default | - | Inherited from peer group MPLS-OVERLAY-PEERS | Inherited from peer group MPLS-OVERLAY-PEERS | - | Inherited from peer group MPLS-OVERLAY-PEERS | - | - | - | - | -| 192.168.48.3 | 65202 | TENANT_B_WAN | - | - | - | - | - | - | - | - | +| 192.168.48.3 | 65202 | TENANT_B_WAN | - | - | - | - | - | - | - | - | - | #### Router BGP EVPN Address Family @@ -726,17 +729,17 @@ ASN Notation: asplain ##### VPN-IPv4 Peer Groups -| Peer Group | Activate | Route-map In | Route-map Out | -| ---------- | -------- | ------------ | ------------- | -| MPLS-OVERLAY-PEERS | True | - | - | +| Peer Group | Activate | Route-map In | Route-map Out | RCF In | RCF Out | +| ---------- | -------- | ------------ | ------------- | ------ | ------- | +| MPLS-OVERLAY-PEERS | True | - | - | - | - | #### Router BGP VPN-IPv6 Address Family ##### VPN-IPv6 Peer Groups -| Peer Group | Activate | Route-map In | Route-map Out | -| ---------- | -------- | ------------ | ------------- | -| MPLS-OVERLAY-PEERS | True | - | - | +| Peer Group | Activate | Route-map In | Route-map Out | RCF In | RCF Out | +| ---------- | -------- | ------------ | ------------- | ------ | ------- | +| MPLS-OVERLAY-PEERS | True | - | - | - | - | #### Router BGP VLANs @@ -926,6 +929,8 @@ mpls ldp ### Patch Panel Summary +#### Patch Panel Connections + | Patch Name | Enabled | Connector A Type | Connector A Endpoint | Connector B Type | Connector B Endpoint | | ---------- | ------- | ---------------- | -------------------- | ---------------- | -------------------- | | TEN_A_site2_site5_eline_port_based | True | Interface | Ethernet7 | Pseudowire | bgp vpws TENANT_A pseudowire TEN_A_site2_site5_eline_port_based | diff --git a/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/documentation/devices/SITE2-LSR1.md b/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/documentation/devices/SITE2-LSR1.md index 037f4acde20..b31b1c19ec2 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/documentation/devices/SITE2-LSR1.md +++ b/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/documentation/devices/SITE2-LSR1.md @@ -142,11 +142,11 @@ vlan internal order ascending range 1006 1199 ##### ISIS -| Interface | Channel Group | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | -| Ethernet1 | - | CUSTOM_NAME | 60 | point-to-point | level-2 | False | md5 | -| Ethernet3 | - | CUSTOM_NAME | 60 | point-to-point | level-2 | False | md5 | -| Ethernet4 | - | CUSTOM_NAME | 60 | point-to-point | level-2 | False | md5 | +| Interface | Channel Group | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Ethernet1 | - | CUSTOM_NAME | - | 60 | point-to-point | level-2 | False | md5 | +| Ethernet3 | - | CUSTOM_NAME | - | 60 | point-to-point | level-2 | False | md5 | +| Ethernet4 | - | CUSTOM_NAME | - | 60 | point-to-point | level-2 | False | md5 | #### Ethernet Interfaces Device Configuration diff --git a/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/documentation/devices/SITE2-LSR2.md b/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/documentation/devices/SITE2-LSR2.md index 2901417c67b..2c3b5625793 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/documentation/devices/SITE2-LSR2.md +++ b/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/documentation/devices/SITE2-LSR2.md @@ -134,6 +134,7 @@ vlan internal order ascending range 1006 1199 | Ethernet13 | P2P_LINK_TO_SITE2-LER1_Ethernet12 | *routed | 12 | *100.64.49.1/30 | **default | *9178 | *False | **- | **- | | Ethernet14 | P2P_LINK_TO_SITE2-LER1_Ethernet13 | *routed | 110 | *100.64.49.5/30 | **default | *9178 | *False | **- | **- | | Ethernet15 | P2P_LINK_TO_SITE2-LER1_Ethernet14 | *routed | 110 | *100.64.49.5/30 | **default | *9178 | *False | **- | **- | + *Inherited from Port-Channel Interface ##### IPv6 @@ -145,18 +146,20 @@ vlan internal order ascending range 1006 1199 | Ethernet13 | P2P_LINK_TO_SITE2-LER1_Ethernet12 | *routed | 12 | *- | *default | *9178 | *False | *- | *- | *- | *- | | Ethernet14 | P2P_LINK_TO_SITE2-LER1_Ethernet13 | *routed | 110 | *- | *default | *9178 | *False | *- | *- | *- | *- | | Ethernet15 | P2P_LINK_TO_SITE2-LER1_Ethernet14 | *routed | 110 | *- | *default | *9178 | *False | *- | *- | *- | *- | - *Inherited from Port-Channel Interface + +*Inherited from Port-Channel Interface ##### ISIS -| Interface | Channel Group | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | -| Ethernet3 | - | CUSTOM_NAME | 60 | point-to-point | level-2 | False | md5 | -| Ethernet12 | 12 | *CUSTOM_NAME | *60 | *point-to-point | *level-2 | *False | *md5 | -| Ethernet13 | 12 | *CUSTOM_NAME | *60 | *point-to-point | *level-2 | *False | *md5 | -| Ethernet14 | 110 | *CUSTOM_NAME | *60 | *point-to-point | *level-2 | *False | *md5 | -| Ethernet15 | 110 | *CUSTOM_NAME | *60 | *point-to-point | *level-2 | *False | *md5 | - *Inherited from Port-Channel Interface +| Interface | Channel Group | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Ethernet3 | - | CUSTOM_NAME | - | 60 | point-to-point | level-2 | False | md5 | +| Ethernet12 | 12 | *CUSTOM_NAME | - | *60 | *point-to-point | *level-2 | *False | *md5 | +| Ethernet13 | 12 | *CUSTOM_NAME | - | *60 | *point-to-point | *level-2 | *False | *md5 | +| Ethernet14 | 110 | *CUSTOM_NAME | - | *60 | *point-to-point | *level-2 | *False | *md5 | +| Ethernet15 | 110 | *CUSTOM_NAME | - | *60 | *point-to-point | *level-2 | *False | *md5 | + +*Inherited from Port-Channel Interface #### Ethernet Interfaces Device Configuration @@ -226,10 +229,10 @@ interface Ethernet15 ##### ISIS -| Interface | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | -| Port-Channel12 | CUSTOM_NAME | 60 | point-to-point | level-2 | False | md5 | -| Port-Channel110 | CUSTOM_NAME | 60 | point-to-point | level-2 | False | md5 | +| Interface | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Port-Channel12 | CUSTOM_NAME | - | 60 | point-to-point | level-2 | False | md5 | +| Port-Channel110 | CUSTOM_NAME | - | 60 | point-to-point | level-2 | False | md5 | #### Port-Channel Interfaces Device Configuration diff --git a/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/documentation/devices/SITE2-RR1.md b/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/documentation/devices/SITE2-RR1.md index d2affa9d7c6..879aa3a2d7c 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/documentation/devices/SITE2-RR1.md +++ b/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/documentation/devices/SITE2-RR1.md @@ -141,9 +141,9 @@ vlan internal order ascending range 1006 1199 ##### ISIS -| Interface | Channel Group | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | -| Ethernet4 | - | CORE | 60 | point-to-point | level-2 | False | md5 | +| Interface | Channel Group | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Ethernet4 | - | CORE | - | 60 | point-to-point | level-2 | False | md5 | #### Ethernet Interfaces Device Configuration @@ -413,19 +413,19 @@ ASN Notation: asplain ##### VPN-IPv4 Peer Groups -| Peer Group | Activate | Route-map In | Route-map Out | -| ---------- | -------- | ------------ | ------------- | -| MPLS-OVERLAY-PEERS | True | - | - | -| RR-OVERLAY-PEERS | True | - | - | +| Peer Group | Activate | Route-map In | Route-map Out | RCF In | RCF Out | +| ---------- | -------- | ------------ | ------------- | ------ | ------- | +| MPLS-OVERLAY-PEERS | True | - | - | - | - | +| RR-OVERLAY-PEERS | True | - | - | - | - | #### Router BGP VPN-IPv6 Address Family ##### VPN-IPv6 Peer Groups -| Peer Group | Activate | Route-map In | Route-map Out | -| ---------- | -------- | ------------ | ------------- | -| MPLS-OVERLAY-PEERS | True | - | - | -| RR-OVERLAY-PEERS | True | - | - | +| Peer Group | Activate | Route-map In | Route-map Out | RCF In | RCF Out | +| ---------- | -------- | ------------ | ------------- | ------ | ------- | +| MPLS-OVERLAY-PEERS | True | - | - | - | - | +| RR-OVERLAY-PEERS | True | - | - | - | - | #### Router BGP Device Configuration diff --git a/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/intended/configs/SITE1-LER1.cfg b/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/intended/configs/SITE1-LER1.cfg index 2abb7797d4b..6438665c8eb 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/intended/configs/SITE1-LER1.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/intended/configs/SITE1-LER1.cfg @@ -64,34 +64,21 @@ interface Port-Channel8 description CPE_TENANT_A_SITE1_EVPN-A-A-PortChannel no shutdown no switchport - evpn ethernet-segment - identifier 0000:0000:0303:0202:0101 - route-target import 03:03:02:02:01:01 - lacp system-id 0303.0202.0101 ! interface Port-Channel8.111 vlan id 111 encapsulation vlan client dot1q 111 network client - evpn ethernet-segment - identifier 0000:0000:0303:0202:0111 - route-target import 03:03:02:02:01:11 ! interface Port-Channel8.222 vlan id 222 encapsulation vlan client dot1q 222 network client - evpn ethernet-segment - identifier 0000:0000:0303:0202:0222 - route-target import 03:03:02:02:02:22 ! interface Port-Channel8.333 vlan id 434 encapsulation vlan client dot1q 333 network client - evpn ethernet-segment - identifier 0000:0000:0303:0202:0333 - route-target import 03:03:02:02:03:33 ! interface Ethernet1 description P2P_LINK_TO_SITE1-LSR1_Ethernet1 diff --git a/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/intended/configs/SITE1-LER2.cfg b/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/intended/configs/SITE1-LER2.cfg index 926115fd6cf..ecac99bc0be 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/intended/configs/SITE1-LER2.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/intended/configs/SITE1-LER2.cfg @@ -66,34 +66,21 @@ interface Port-Channel8 description CPE_TENANT_A_SITE1_EVPN-A-A-PortChannel no shutdown no switchport - evpn ethernet-segment - identifier 0000:0000:0303:0202:0101 - route-target import 03:03:02:02:01:01 - lacp system-id 0303.0202.0101 ! interface Port-Channel8.111 vlan id 111 encapsulation vlan client dot1q 111 network client - evpn ethernet-segment - identifier 0000:0000:0303:0202:0111 - route-target import 03:03:02:02:01:11 ! interface Port-Channel8.222 vlan id 222 encapsulation vlan client dot1q 222 network client - evpn ethernet-segment - identifier 0000:0000:0303:0202:0222 - route-target import 03:03:02:02:02:22 ! interface Port-Channel8.333 vlan id 434 encapsulation vlan client dot1q 333 network client - evpn ethernet-segment - identifier 0000:0000:0303:0202:0333 - route-target import 03:03:02:02:03:33 ! interface Ethernet1 description P2P_LINK_TO_SITE1-LSR2_Ethernet1 diff --git a/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/intended/structured_configs/SITE1-LER1.yml b/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/intended/structured_configs/SITE1-LER1.yml index 838f35575a9..423d9203e27 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/intended/structured_configs/SITE1-LER1.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/intended/structured_configs/SITE1-LER1.yml @@ -436,10 +436,6 @@ port_channel_interfaces: description: CPE_TENANT_A_SITE1_EVPN-A-A-PortChannel type: routed shutdown: false - evpn_ethernet_segment: - identifier: 0000:0000:0303:0202:0101 - route_target: 03:03:02:02:01:01 - lacp_id: 0303.0202.0101 - name: Port-Channel8.111 type: l2dot1q vlan_id: 111 @@ -449,9 +445,6 @@ port_channel_interfaces: vlan: 111 network: client: true - evpn_ethernet_segment: - identifier: 0000:0000:0303:0202:0111 - route_target: 03:03:02:02:01:11 - name: Port-Channel8.222 type: l2dot1q vlan_id: 222 @@ -461,9 +454,6 @@ port_channel_interfaces: vlan: 222 network: client: true - evpn_ethernet_segment: - identifier: 0000:0000:0303:0202:0222 - route_target: 03:03:02:02:02:22 - name: Port-Channel8.333 type: l2dot1q vlan_id: 434 @@ -473,9 +463,6 @@ port_channel_interfaces: vlan: 333 network: client: true - evpn_ethernet_segment: - identifier: 0000:0000:0303:0202:0333 - route_target: 03:03:02:02:03:33 router_ospf: process_ids: - id: 19 diff --git a/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/intended/structured_configs/SITE1-LER2.yml b/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/intended/structured_configs/SITE1-LER2.yml index 13b7a736853..0bde18b06c9 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/intended/structured_configs/SITE1-LER2.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs-mpls-isis-sr-ldp/intended/structured_configs/SITE1-LER2.yml @@ -466,10 +466,6 @@ port_channel_interfaces: description: CPE_TENANT_A_SITE1_EVPN-A-A-PortChannel type: routed shutdown: false - evpn_ethernet_segment: - identifier: 0000:0000:0303:0202:0101 - route_target: 03:03:02:02:01:01 - lacp_id: 0303.0202.0101 - name: Port-Channel8.111 type: l2dot1q vlan_id: 111 @@ -479,9 +475,6 @@ port_channel_interfaces: vlan: 111 network: client: true - evpn_ethernet_segment: - identifier: 0000:0000:0303:0202:0111 - route_target: 03:03:02:02:01:11 - name: Port-Channel8.222 type: l2dot1q vlan_id: 222 @@ -491,9 +484,6 @@ port_channel_interfaces: vlan: 222 network: client: true - evpn_ethernet_segment: - identifier: 0000:0000:0303:0202:0222 - route_target: 03:03:02:02:02:22 - name: Port-Channel8.333 type: l2dot1q vlan_id: 434 @@ -503,8 +493,5 @@ port_channel_interfaces: vlan: 333 network: client: true - evpn_ethernet_segment: - identifier: 0000:0000:0303:0202:0333 - route_target: 03:03:02:02:03:33 metadata: platform: 7280SR3 diff --git a/ansible_collections/arista/avd/molecule/eos_designs-twodc-5stage-clos/intended/structured_configs/DC1-POD1-L2LEAF2A.yml b/ansible_collections/arista/avd/molecule/eos_designs-twodc-5stage-clos/intended/structured_configs/DC1-POD1-L2LEAF2A.yml index 17e7380ca36..1772f195c2c 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-twodc-5stage-clos/intended/structured_configs/DC1-POD1-L2LEAF2A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs-twodc-5stage-clos/intended/structured_configs/DC1-POD1-L2LEAF2A.yml @@ -78,8 +78,8 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 172.20.110.2/31 no_autostate: true + ip_address: 172.20.110.2/31 - name: Vlan4085 description: L2LEAF_INBAND_MGMT shutdown: false diff --git a/ansible_collections/arista/avd/molecule/eos_designs-twodc-5stage-clos/intended/structured_configs/DC1-POD1-L2LEAF2B.yml b/ansible_collections/arista/avd/molecule/eos_designs-twodc-5stage-clos/intended/structured_configs/DC1-POD1-L2LEAF2B.yml index ef319bfb5bf..b4662042681 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-twodc-5stage-clos/intended/structured_configs/DC1-POD1-L2LEAF2B.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs-twodc-5stage-clos/intended/structured_configs/DC1-POD1-L2LEAF2B.yml @@ -86,8 +86,8 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 172.20.110.3/31 no_autostate: true + ip_address: 172.20.110.3/31 - name: Vlan4085 description: L2LEAF_INBAND_MGMT shutdown: false diff --git a/ansible_collections/arista/avd/molecule/eos_designs-twodc-5stage-clos/intended/structured_configs/DC1-POD1-LEAF2B.yml b/ansible_collections/arista/avd/molecule/eos_designs-twodc-5stage-clos/intended/structured_configs/DC1-POD1-LEAF2B.yml index 0e16c3418fe..ba07e9e2daa 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-twodc-5stage-clos/intended/structured_configs/DC1-POD1-LEAF2B.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs-twodc-5stage-clos/intended/structured_configs/DC1-POD1-LEAF2B.yml @@ -395,8 +395,8 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 172.20.110.3/31 no_autostate: true + ip_address: 172.20.110.3/31 - name: Vlan110 tenant: Tenant_A tags: diff --git a/ansible_collections/arista/avd/molecule/eos_designs-twodc-5stage-clos/intended/structured_configs/DC1.POD1.LEAF2A.yml b/ansible_collections/arista/avd/molecule/eos_designs-twodc-5stage-clos/intended/structured_configs/DC1.POD1.LEAF2A.yml index f2ac3539ba4..95581df170d 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs-twodc-5stage-clos/intended/structured_configs/DC1.POD1.LEAF2A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs-twodc-5stage-clos/intended/structured_configs/DC1.POD1.LEAF2A.yml @@ -355,8 +355,8 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 172.20.110.2/31 no_autostate: true + ip_address: 172.20.110.2/31 - name: Vlan110 tenant: Tenant_A tags: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/converge.yml b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/converge.yml index 78b9ab412cd..0e08413d4cb 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/converge.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/converge.yml @@ -99,7 +99,7 @@ - ansible_failed_result.msg == expected_error_message - name: Converge Negative tests for 'eos_designs_facts' - hosts: fabric_invalid_uplink_port_channel_id_1 + hosts: FABRIC_INVALID_UPLINK_PORT_CHANNEL_ID_1 connection: local tasks: - name: Run failure scenario Test @@ -120,7 +120,7 @@ - ansible_failed_result.msg == expected_error_message - name: Converge Negative tests for 'eos_designs_facts' - hosts: fabric_invalid_uplink_port_channel_id_2 + hosts: FABRIC_INVALID_UPLINK_PORT_CHANNEL_ID_2 connection: local tasks: - name: Run failure scenario Test @@ -141,7 +141,7 @@ - ansible_failed_result.msg == expected_error_message - name: Converge Negative tests for 'eos_designs_facts' - hosts: fabric_invalid_uplink_port_channel_id_3 + hosts: FABRIC_INVALID_UPLINK_PORT_CHANNEL_ID_3 connection: local tasks: - name: Run failure scenario Test @@ -162,7 +162,7 @@ - ansible_failed_result.msg == expected_error_message - name: Converge Negative tests for 'eos_designs_facts' - hosts: fabric_p2p_vrfs + hosts: FABRIC_P2P_VRFS connection: local tasks: - name: Run failure scenario Test @@ -183,7 +183,7 @@ - ansible_failed_result.msg == expected_error_message - name: Converge Negative tests for 'eos_designs_facts' - hosts: fabric_downlink_pools_duplicate + hosts: FABRIC_DOWNLINK_POOLS_DUPLICATE connection: local tasks: - name: Run failure scenario Test @@ -204,7 +204,7 @@ - ansible_failed_result.msg == expected_error_message - name: Converge Negative tests for 'eos_designs_facts' - hosts: fabric_downlink_pools_missing + hosts: FABRIC_DOWNLINK_POOLS_MISSING connection: local tasks: - name: Run failure scenario Test @@ -225,7 +225,7 @@ - ansible_failed_result.msg == expected_error_message - name: Converge Negative tests for 'eos_designs_structured_config' - hosts: EOS_DESIGNS_FAILURES + hosts: EOS_DESIGNS_FAILURES_INCLUDED gather_facts: false connection: local tasks: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/duplicate-ip-address-router-bgp.yml b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/DUPLICATE_IP_ADDRESS_ROUTER_BGP.yml similarity index 100% rename from ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/duplicate-ip-address-router-bgp.yml rename to ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/DUPLICATE_IP_ADDRESS_ROUTER_BGP.yml diff --git a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/duplicate-vlans-mlag.yml b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/DUPLICATE_VLANS_MLAG.yml similarity index 100% rename from ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/duplicate-vlans-mlag.yml rename to ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/DUPLICATE_VLANS_MLAG.yml diff --git a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/fabric_downlink_pools_duplicate.yml b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/FABRIC_DOWNLINK_POOLS_DUPLICATE.yml similarity index 95% rename from ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/fabric_downlink_pools_duplicate.yml rename to ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/FABRIC_DOWNLINK_POOLS_DUPLICATE.yml index 561794b041f..344898d1504 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/fabric_downlink_pools_duplicate.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/FABRIC_DOWNLINK_POOLS_DUPLICATE.yml @@ -1,5 +1,5 @@ --- -fabric_name: fabric_downlink_pools_duplicate +fabric_name: FABRIC_DOWNLINK_POOLS_DUPLICATE default_node_types: - node_type: spine diff --git a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/fabric_downlink_pools_missing.yml b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/FABRIC_DOWNLINK_POOLS_MISSING.yml similarity index 95% rename from ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/fabric_downlink_pools_missing.yml rename to ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/FABRIC_DOWNLINK_POOLS_MISSING.yml index 1c03b3fb4ed..c67553c527a 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/fabric_downlink_pools_missing.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/FABRIC_DOWNLINK_POOLS_MISSING.yml @@ -1,5 +1,5 @@ --- -fabric_name: fabric_downlink_pools_missing +fabric_name: FABRIC_DOWNLINK_POOLS_MISSING default_node_types: - node_type: spine diff --git a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/fabric_invalid_uplink_port_channel_id_1.yml b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/FABRIC_INVALID_UPLINK_PORT_CHANNEL_ID_1.yml similarity index 96% rename from ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/fabric_invalid_uplink_port_channel_id_1.yml rename to ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/FABRIC_INVALID_UPLINK_PORT_CHANNEL_ID_1.yml index 68d415cea0b..3ece9603964 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/fabric_invalid_uplink_port_channel_id_1.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/FABRIC_INVALID_UPLINK_PORT_CHANNEL_ID_1.yml @@ -6,7 +6,7 @@ default_node_types: match_hostnames: - ".*l3leaf-." -fabric_name: fabric_invalid_uplink_port_channel_id_1 +fabric_name: FABRIC_INVALID_UPLINK_PORT_CHANNEL_ID_1 l3leaf: defaults: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/fabric_invalid_uplink_port_channel_id_2.yml b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/FABRIC_INVALID_UPLINK_PORT_CHANNEL_ID_2.yml similarity index 96% rename from ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/fabric_invalid_uplink_port_channel_id_2.yml rename to ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/FABRIC_INVALID_UPLINK_PORT_CHANNEL_ID_2.yml index d56cf634f7a..d5197a6dff8 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/fabric_invalid_uplink_port_channel_id_2.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/FABRIC_INVALID_UPLINK_PORT_CHANNEL_ID_2.yml @@ -6,7 +6,7 @@ default_node_types: match_hostnames: - ".*l3leaf-." -fabric_name: fabric_invalid_uplink_port_channel_id_2 +fabric_name: FABRIC_INVALID_UPLINK_PORT_CHANNEL_ID_2 l3leaf: defaults: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/fabric_invalid_uplink_port_channel_id_3.yml b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/FABRIC_INVALID_UPLINK_PORT_CHANNEL_ID_3.yml similarity index 96% rename from ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/fabric_invalid_uplink_port_channel_id_3.yml rename to ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/FABRIC_INVALID_UPLINK_PORT_CHANNEL_ID_3.yml index 312789deef7..b2269a60940 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/fabric_invalid_uplink_port_channel_id_3.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/FABRIC_INVALID_UPLINK_PORT_CHANNEL_ID_3.yml @@ -6,7 +6,7 @@ default_node_types: match_hostnames: - ".*l3leaf-." -fabric_name: fabric_invalid_uplink_port_channel_id_3 +fabric_name: FABRIC_INVALID_UPLINK_PORT_CHANNEL_ID_3 l3leaf: defaults: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/fabric_ip_addressing_mlag_odd_id.yml b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/FABRIC_IP_ADDRESSING_MLAG_ODD_ID.yml similarity index 94% rename from ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/fabric_ip_addressing_mlag_odd_id.yml rename to ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/FABRIC_IP_ADDRESSING_MLAG_ODD_ID.yml index c921e85b694..0eb4bdcce3d 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/fabric_ip_addressing_mlag_odd_id.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/FABRIC_IP_ADDRESSING_MLAG_ODD_ID.yml @@ -1,5 +1,5 @@ --- -fabric_name: fabric_ip_addressing_mlag_odd_id +fabric_name: FABRIC_IP_ADDRESSING_MLAG_ODD_ID mlag_support: true type: l3leaf fabric_ip_addressing: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/fabric_ip_addressing_mlag_same_subnet.yml b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/FABRIC_IP_ADDRESSING_MLAG_SAME_SUBNET.yml similarity index 93% rename from ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/fabric_ip_addressing_mlag_same_subnet.yml rename to ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/FABRIC_IP_ADDRESSING_MLAG_SAME_SUBNET.yml index 416eb544f69..38e6e4e0a5a 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/fabric_ip_addressing_mlag_same_subnet.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/group_vars/FABRIC_IP_ADDRESSING_MLAG_SAME_SUBNET.yml @@ -1,5 +1,5 @@ --- -fabric_name: fabric_ip_addressing_mlag_same_subnet +fabric_name: FABRIC_IP_ADDRESSING_MLAG_SAME_SUBNET mlag_support: true type: l3leaf fabric_ip_addressing: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/connected-endpoints-wrong-profile-lacp-fallback.yml b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/connected-endpoints-wrong-profile-lacp-fallback.yml index 0b65295697c..eb44eeaa1e7 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/connected-endpoints-wrong-profile-lacp-fallback.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/connected-endpoints-wrong-profile-lacp-fallback.yml @@ -27,4 +27,4 @@ port_profiles: native_vlan_tag: False native_vlan: 123 -expected_error_message: "The 'profile' of every port-channel lacp fallback individual setting must be defined in the 'port_profiles'. First occurence seen of a missing profile is 'INDIVIDUAL_TRUNK' for the connected endpoint with the name 'INDIVIDUAL_1'." +expected_error_message: "The 'profile' of every port-channel lacp fallback individual setting must be defined in the 'port_profiles'. First occurrence seen of a missing profile is 'INDIVIDUAL_TRUNK' for the connected endpoint with the name 'INDIVIDUAL_1'." diff --git a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/core-interfaces-p2p-links-as.yml b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/core-interfaces-p2p-links-as.yml new file mode 100644 index 00000000000..7ca70a5724f --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/core-interfaces-p2p-links-as.yml @@ -0,0 +1,32 @@ +# Testing "core_interfaces.p2p_links.[].as" not defined + +# Fabric node type keys +node_type_keys: + - key: core_router + type: core_router + +bgp_as: 65000 + +# Nodes +type: core_router +core_router: + defaults: + loopback_ipv4_pool: 10.0.0.0/24 + loopback_ipv6_pool: "2000:1234:ffff:ffff::/64" + nodes: + - name: core-interfaces-p2p-links-as + id: 1 + +core_interfaces: + p2p_links_profiles: + - name: isis_bb_profile + speed: "forced 1000full" + mtu: 1500 + p2p_links: + - nodes: [ core-interfaces-p2p-links-as, peer1 ] + id: 10 + interfaces: [ Ethernet1, Ethernet1 ] + include_in_underlay_protocol: true + underlay_multicast: true + +expected_error_message: "core_interfaces.p2p_links.[].as or core_interfaces.p2p_links_profiles.[].as" diff --git a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/duplicate-peer-ip-address-network-services.yml b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/duplicate-peer-ip-address-network-services.yml new file mode 100644 index 00000000000..a26e4b2f908 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/duplicate-peer-ip-address-network-services.yml @@ -0,0 +1,37 @@ +type: l3leaf +l3leaf: + defaults: + loopback_ipv4_pool: 10.42.0.0/24 + vtep_loopback_ipv4_pool: 10.43.0.0/24 + bgp_as: 42 + nodes: + - name: duplicate-peer-ip-address-network-services + id: 42 + +tenants: + - name: Tenant_C + mac_vrf_vni_base: 30000 + evpn_l2_multi_domain: false + bgp_peer_groups: + - name: Tenant_C_BGP_PEER_GROUP + remote_as: "666" + - name: Tenant_C_BGP_PEER_GROUP2 + remote_as: "667" + vrfs: + - name: Tenant_C_WAN_Zone + vrf_vni: 31 + svis: + - id: 350 + name: Tenant_C_WAN_Zone_1 + tags: ['wan'] + enabled: True + bgp_peers: + - ip_address: 2.2.2.2 + peer_group: Tenant_C_BGP_PEER_GROUP + nodes: [ duplicate-peer-ip-address-network-services ] + - ip_address: 2.2.2.2 + peer_group: Tenant_C_BGP_PEER_GROUP2 + nodes: [ duplicate-peer-ip-address-network-services ] + +expected_error_message: |- + Found duplicate objects with conflicting data while generating configuration for BGP peer defined under VRFs. {'ip_address': '2.2.2.2', 'peer_group': 'Tenant_C_BGP_PEER_GROUP2'} conflicts with {'ip_address': '2.2.2.2', 'peer_group': 'Tenant_C_BGP_PEER_GROUP'}. diff --git a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/duplicate-tunnel-interface-internet-exit.yml b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/duplicate-tunnel-interface-internet-exit.yml new file mode 100644 index 00000000000..75d1029c9bd --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/duplicate-tunnel-interface-internet-exit.yml @@ -0,0 +1,148 @@ +--- +wan_mode: cv-pathfinder +# Disabling underlay for tests +underlay_routing_protocol: none + +type: wan_router + +bgp_as: 65000 + +cv_pathfinder_regions: + - name: AVD_Land_West + id: 42 + description: AVD Region + sites: + - name: Site422 + id: 422 + location: Somewhere + +bgp_peer_groups: + wan_overlay_peers: + password: "htm4AZe9mIQOO1uiMuGgYQ==" + listen_range_prefixes: + - 192.168.255.0/24 + +wan_route_servers: + - hostname: cv-pathfinder-pathfinder + vtep_ip: 10.10.10.10 + path_groups: + - name: INET + interfaces: + - name: Ethernet1 + public_ip: 192.168.55.55 + +wan_ipsec_profiles: + control_plane: + shared_key: ABCDEF1234567890 + data_plane: + shared_key: ABCDEF1234567890666 + +wan_router: + defaults: + loopback_ipv4_pool: 192.168.42.0/24 + vtep_loopback_ipv4_pool: 192.168.255.0/24 + filter: + always_include_vrfs_in_tenants: [TenantA] + nodes: + - name: duplicate-tunnel-interface-internet-exit + cv_pathfinder_region: AVD_Land_West + cv_pathfinder_site: Site422 + id: 1 + l3_interfaces: + - name: Ethernet1 + wan_carrier: ATT + wan_circuit_id: 666 + dhcp_accept_default_route: true + ip_address: dhcp + peer_ip: 10.254.254.1 + cv_pathfinder_internet_exit: + policies: + - name: ZSCALER-EXIT-POLICY-1 + tunnel_interface_numbers: 100-102 + - name: Ethernet2 + wan_carrier: ATT + wan_circuit_id: 777 + dhcp_accept_default_route: true + ip_address: dhcp + peer_ip: 10.254.254.5 + cv_pathfinder_internet_exit: + policies: + - name: ZSCALER-EXIT-POLICY-2 + # Clashing IDs with Ethernet1 + tunnel_interface_numbers: 100-102 + +wan_path_groups: + - name: INET + id: 101 + +wan_carriers: + - name: ATT + path_group: INET + trusted: true + +tenants: + - name: TenantA + vrfs: + - name: default + vrf_id: 1 + - name: PROD + vrf_id: 42 + +wan_virtual_topologies: + vrfs: + - name: PROD + wan_vni: 42 + policies: + - name: DEFAULT-POLICY + default_virtual_topology: + drop_unmatched: true + application_virtual_topologies: + - application_profile: TEST + path_groups: + - names: [ INET ] + internet_exit: + policy: ZSCALER-EXIT-POLICY-1 + id: 42 + - application_profile: TEST2 + path_groups: + - names: [ INET ] + internet_exit: + policy: ZSCALER-EXIT-POLICY-2 + id: 43 + +application_classification: + application_profiles: + - name: TEST + - name: TEST2 + +cv_pathfinder_internet_exit_policies: + - name: ZSCALER-EXIT-POLICY-1 + type: zscaler + zscaler: + domain_name: test.local + ipsec_key_salt: THIS_SHOULD_BE_VAULTED + - name: ZSCALER-EXIT-POLICY-2 + fallback_to_system_default: False + type: zscaler + zscaler: + domain_name: test.local + ipsec_key_salt: THIS_SHOULD_BE_VAULTED + +zscaler_endpoints: + cloud_name: zscalerbeta + device_location: + city: Santa Clara, CA + country: United States + primary: + city: Fremont, CA + datacenter: FMT1 + country: United States + latitude: 37 + longitude: -121 + ip_address: 10.37.121.1 # Not the correct address + +expected_error_message: >- + Found duplicate objects with conflicting data while generating configuration for Tunnel interface for Internet Exit policy. + {'name': 'Tunnel100', 'description': 'Internet Exit ZSCALER-EXIT-POLICY-2 PRI', 'ipsec_profile': 'IE-ZSCALER-EXIT-POLICY-2-PROFILE', 'source_interface': 'Ethernet2'} + conflicts with + {'name': 'Tunnel100', 'description': 'Internet Exit ZSCALER-EXIT-POLICY-1 PRI', 'ipsec_profile': 'IE-ZSCALER-EXIT-POLICY-1-PROFILE', 'source_interface': 'Ethernet1'}. diff --git a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/failure-missing-evpn-vlan-bundle.yml b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/failure-missing-evpn-vlan-bundle.yml index 8936cf789bf..4e9926b39b3 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/failure-missing-evpn-vlan-bundle.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/failure-missing-evpn-vlan-bundle.yml @@ -36,4 +36,4 @@ evpn_vlan_bundles: id: 1 expected_error_message: >- - The 'evpn_vlan_bundle' of the svis/l2vlans must be defined in the common 'evpn_vlan_bundles' setting. First occurence seen for svi/l2vlan 60 in Tenant 'FABRIC' and evpn_vlan_bundle 'bundle2'. + The 'evpn_vlan_bundle' of the svis/l2vlans must be defined in the common 'evpn_vlan_bundles' setting. First occurrence seen for svi/l2vlan 60 in Tenant 'FABRIC' and evpn_vlan_bundle 'bundle2'. diff --git a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/failure-missing-evpn-vlan-bundle_svi.yml b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/failure-missing-evpn-vlan-bundle_svi.yml index 445800cb368..3dcde29f766 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/failure-missing-evpn-vlan-bundle_svi.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/failure-missing-evpn-vlan-bundle_svi.yml @@ -41,4 +41,4 @@ evpn_vlan_bundles: id: 1 expected_error_message: >- - The 'evpn_vlan_bundle' of the svis/l2vlans must be defined in the common 'evpn_vlan_bundles' setting. First occurence seen for svi/l2vlan 1009 in Tenant 'SIT' and evpn_vlan_bundle 'bundle2'. + The 'evpn_vlan_bundle' of the svis/l2vlans must be defined in the common 'evpn_vlan_bundles' setting. First occurrence seen for svi/l2vlan 1009 in Tenant 'SIT' and evpn_vlan_bundle 'bundle2'. diff --git a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/invalid-schema-connected-endpoints.yml b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/invalid-schema-connected-endpoints.yml index a0e14372e35..256f149a57f 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/invalid-schema-connected-endpoints.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/invalid-schema-connected-endpoints.yml @@ -1,4 +1,4 @@ -fabric_name: fabric_invalid_schema_connected_endpoints +fabric_name: FABRIC_INVALID_SCHEMA_CONNECTED_ENDPOINTS type: l2leaf l2leaf: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/invalid-schema.yml b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/invalid-schema.yml index c520ff9f573..363f27bf323 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/invalid-schema.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/invalid-schema.yml @@ -1,4 +1,4 @@ -fabric_name: fabric_invalid_schema +fabric_name: FABRIC_INVALID_SCHEMA type: l2leaf l2leaf: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/invalid-uplink-type-p2p-vrfs-underlay-router-false.yml b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/invalid-uplink-type-p2p-vrfs-underlay-router-false.yml index 2e0a85c3a38..00159f3d28a 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/invalid-uplink-type-p2p-vrfs-underlay-router-false.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/invalid-uplink-type-p2p-vrfs-underlay-router-false.yml @@ -1,5 +1,5 @@ --- -fabric_name: fabric_p2p_vrfs +fabric_name: FABRIC_P2P_VRFS default_node_types: - node_type: not_underlay_router diff --git a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/invalid-wan-role-overlay-routing-protocol.yml b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/invalid-wan-role-overlay-routing-protocol.yml index 24c1f150250..26f78e6f2ce 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/invalid-wan-role-overlay-routing-protocol.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/invalid-wan-role-overlay-routing-protocol.yml @@ -1,7 +1,7 @@ --- wan_mode: autovpn type: wan_router -fabric_name: fabric_wan_role_overlay_routing_protocol +fabric_name: FABRIC_WAN_ROLE_OVERLAY_ROUTING_PROTOCOL # Not ibgp overlay_routing_protocol: none diff --git a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/missing-mlag-peer.yml b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/missing-mlag-peer.yml index 468de53220f..d40d204ca60 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/missing-mlag-peer.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/missing-mlag-peer.yml @@ -1,4 +1,4 @@ -fabric_name: fabric_missing_mlag_peer +fabric_name: FABRIC_MISSING_MLAG_PEER type: l2leaf l2leaf: @@ -12,4 +12,7 @@ l2leaf: - name: some-missing-device id: 2 -expected_error_message: "Facts not found for node 'some-missing-device'. Something in the input vars is pointing to this node. Check that 'some-missing-device' is in the inventory and is part of the group set by 'fabric_name'. Node is required but was not found for host 'missing-mlag-peer'" +expected_error_message: >- + Facts not found for node 'some-missing-device'. Something in the input vars is pointing to this node. + Check that 'some-missing-device' is in the inventory and is part of the group set by 'fabric_name'. + Node is required but was not found for host 'missing-mlag-peer' diff --git a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/missing-prefix-list-definition-cv-pathfinder.yml b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/missing-prefix-list-definition-cv-pathfinder.yml new file mode 100644 index 00000000000..3ced2688db9 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/missing-prefix-list-definition-cv-pathfinder.yml @@ -0,0 +1,88 @@ +--- +# Testing cv-pathfinder +wan_mode: cv-pathfinder +# Have all the router in the examples use eBGP as underlay routing protocol - +# the default is "none" for WAN routers" +underlay_routing_protocol: ebgp + +wan_ipsec_profiles: + control_plane: + shared_key: ABCDEF1234567890 + data_plane: + shared_key: ABCDEF1234567890666 + +cv_pathfinder_regions: + - name: AVD_Land_West + id: 42 + description: AVD Region + sites: + - name: Site422 + id: 422 + location: Somewhere + +bgp_peer_groups: + wan_overlay_peers: + password: "htm4AZe9mIQOO1uiMuGgYQ==" + listen_range_prefixes: + - 192.168.142.0/24 + +ipv4_prefix_list_catalog: + - name: ALLOW-DEFAULT + sequence_numbers: + - sequence: 10 + action: permit 0.0.0.0/0 + - name: PL2 + sequence_numbers: + - sequence: 10 + action: permit 5.0.0.0/0 + - sequence: 20 + action: deny 10.00.0.0/24 + +default_node_types: + - node_type: wan_router + match_hostnames: + - missing-prefix-list-definition-cv-pathfinder + +wan_router: + defaults: + loopback_ipv4_pool: 192.168.42.0/24 + vtep_loopback_ipv4_pool: 192.168.142.0/24 + bgp_as: 65000 + # Testing HA and disabling HA + node_groups: + # SITE_HA_DISABLED + - group: Site511 + uplink_type: p2p-vrfs + cv_pathfinder_region: AVD_Land_West + cv_pathfinder_site: Site422 + wan_ha: + enabled: False + nodes: + - name: missing-prefix-list-definition-cv-pathfinder + id: 1 + uplink_switch_interfaces: [Ethernet1] + l3_interfaces: + - name: Ethernet1 + peer: peer3 + peer_interface: Ethernet42 + wan_carrier: Comcast + wan_circuit_id: 666 + dhcp_accept_default_route: true + ip_address: dhcp + flow_tracking: + enabled: true + peer_ip: 172.16.9.4 + bgp: + peer_as: 64520 + ipv4_prefix_list_in: PL1 + +wan_path_groups: + - name: INET + id: 101 + +wan_carriers: + - name: Comcast + path_group: INET + trusted: true + +expected_error_message: "ipv4_prefix_list_catalog[name=PL1]" diff --git a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/missing-prefix-list-in-cv-pathfinder.yml b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/missing-prefix-list-in-cv-pathfinder.yml new file mode 100644 index 00000000000..a8d5d73d0e1 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/missing-prefix-list-in-cv-pathfinder.yml @@ -0,0 +1,87 @@ +--- +# Testing cv-pathfinder +wan_mode: cv-pathfinder +# Have all the router in the examples use eBGP as underlay routing protocol - +# the default is "none" for WAN routers" +underlay_routing_protocol: ebgp + +wan_ipsec_profiles: + control_plane: + shared_key: ABCDEF1234567890 + data_plane: + shared_key: ABCDEF1234567890666 + +cv_pathfinder_regions: + - name: AVD_Land_West + id: 42 + description: AVD Region + sites: + - name: Site422 + id: 422 + location: Somewhere + +bgp_peer_groups: + wan_overlay_peers: + password: "htm4AZe9mIQOO1uiMuGgYQ==" + listen_range_prefixes: + - 192.168.142.0/24 + +ipv4_prefix_list_catalog: + - name: ALLOW-DEFAULT + sequence_numbers: + - sequence: 10 + action: permit 0.0.0.0/0 + - name: PL2 + sequence_numbers: + - sequence: 10 + action: permit 5.0.0.0/0 + - sequence: 20 + action: deny 10.00.0.0/24 + +default_node_types: + - node_type: wan_router + match_hostnames: + - missing-prefix-list-in-cv-pathfinder + +wan_router: + defaults: + loopback_ipv4_pool: 192.168.42.0/24 + vtep_loopback_ipv4_pool: 192.168.142.0/24 + bgp_as: 65000 + # Testing HA and disabling HA + node_groups: + # SITE_HA_DISABLED + - group: Site511 + uplink_type: p2p-vrfs + cv_pathfinder_region: AVD_Land_West + cv_pathfinder_site: Site422 + wan_ha: + enabled: False + nodes: + - name: missing-prefix-list-in-cv-pathfinder + id: 1 + uplink_switch_interfaces: [Ethernet1] + l3_interfaces: + - name: Ethernet1 + peer: peer3 + peer_interface: Ethernet42 + wan_carrier: Comcast + wan_circuit_id: 666 + dhcp_accept_default_route: true + ip_address: dhcp + flow_tracking: + enabled: true + peer_ip: 172.16.9.4 + bgp: + peer_as: 64520 + +wan_path_groups: + - name: INET + id: 101 + +wan_carriers: + - name: Comcast + path_group: INET + trusted: true + +expected_error_message: "BGP is enabled but 'bgp.ipv4_prefix_list_in' is not configured for l3_interfaces[Ethernet1]" diff --git a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/removed-schema-connected-endpoints.yml b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/removed-schema-connected-endpoints.yml index 4e27b30be2b..de175b5c338 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/removed-schema-connected-endpoints.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/host_vars/removed-schema-connected-endpoints.yml @@ -1,4 +1,4 @@ -fabric_name: fabric_removed_schema_connected_endpoints +fabric_name: FABRIC_REMOVED_SCHEMA_CONNECTED_ENDPOINTS type: l2leaf l2leaf: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/hosts.yml b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/hosts.yml index e1719fe2d88..ebe5116c2d7 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/hosts.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/inventory/hosts.yml @@ -5,125 +5,138 @@ all: # Each case _must_ be in it's own 'fabric' group set as 'fabric_name' in the hostvars # Each case must be added to converge.yml as a separate play - otherwise the eos_designs_facts fabric_name check will fail. children: - fabric_missing_mlag_peer: + FABRIC_MISSING_MLAG_PEER: hosts: missing-mlag-peer: - fabric_ip_addressing_mlag_odd_id: + FABRIC_IP_ADDRESSING_MLAG_ODD_ID: hosts: mlag_odd_id_oddodd1: mlag_odd_id_oddodd2: - fabric_ip_addressing_mlag_same_subnet: + FABRIC_IP_ADDRESSING_MLAG_SAME_SUBNET: hosts: mlag_same_subnet_1: mlag_same_subnet_2: - fabric_invalid_schema: + FABRIC_INVALID_SCHEMA: hosts: invalid-schema: - fabric_invalid_schema_connected_endpoints: + FABRIC_INVALID_SCHEMA_CONNECTED_ENDPOINTS: hosts: invalid-schema-connected-endpoints: - fabric_removed_schema_connected_endpoints: + FABRIC_REMOVED_SCHEMA_CONNECTED_ENDPOINTS: hosts: removed-schema-connected-endpoints: - fabric_invalid_uplink_port_channel_id_1: + FABRIC_INVALID_UPLINK_PORT_CHANNEL_ID_1: hosts: invalid-uplink-port-channel-id-l3leaf-1: invalid-uplink-port-channel-id-l3leaf-2: invalid-uplink-port-channel-id-l2leaf-1: invalid-uplink-port-channel-id-l2leaf-2: - fabric_invalid_uplink_port_channel_id_2: + FABRIC_INVALID_UPLINK_PORT_CHANNEL_ID_2: # Notice the same hosts since all vars are given in group var hosts: invalid-uplink-port-channel-id-l3leaf-1: invalid-uplink-port-channel-id-l3leaf-2: invalid-uplink-port-channel-id-l2leaf-1: invalid-uplink-port-channel-id-l2leaf-2: - fabric_invalid_uplink_port_channel_id_3: + FABRIC_INVALID_UPLINK_PORT_CHANNEL_ID_3: # Notice the same hosts since all vars are given in group var hosts: invalid-uplink-port-channel-id-l3leaf-1: invalid-uplink-port-channel-id-l3leaf-2: invalid-uplink-port-channel-id-l2leaf-1: invalid-uplink-port-channel-id-l2leaf-2: - fabric_wan_role_overlay_routing_protocol: + FABRIC_WAN_ROLE_OVERLAY_ROUTING_PROTOCOL: hosts: invalid-wan-role-overlay-routing-protocol: - fabric_p2p_vrfs: + FABRIC_P2P_VRFS: hosts: invalid-uplink-type-p2p-vrfs-underlay-router-false: - fabric_downlink_pools_missing: + FABRIC_DOWNLINK_POOLS_MISSING: hosts: downlink-pools-missing-spine: downlink-pools-missing-l3leaf: - fabric_downlink_pools_duplicate: + FABRIC_DOWNLINK_POOLS_DUPLICATE: hosts: downlink-pools-duplicate-spine: downlink-pools-duplicate-l3leaf: EOS_DESIGNS_FAILURES: # Add cases that fail during 'eos_designs_structured_config' phase - hosts: - failure-port-channel: - connected-endpoints-mismatched-descriptions: - connected-endpoints-missing-profile-lacp-fallback: - connected-endpoints-wrong-profile-lacp-fallback: - connected-endpoints-phone-vlan-mode: - connected-endpoints-phone-vlan-vlans: - connected-endpoints-monitor-sessions-mismatch-direction: - duplicate-vlans-l2vlans: - duplicate-vlans-svi-id: - duplicate-vrfs-duplicate-svi-name-conflict: - duplicate-vrfs-id-conflict: - duplicate-vrfs-vni-conflict: - duplicate-vrfs-tenant-igmp-snooping-conflict: - duplicate-interface-l3-edge: - duplicate-l3-interfaces-network-services: - duplicate-interfaces-point-to-point-services-1: - duplicate-interfaces-point-to-point-services-2: - duplicate-interfaces-point-to-point-services-3: - duplicate-interfaces-point-to-point-services-4: - duplicate-interfaces-connected-endpoints: - duplicate-interfaces-core-interfaces: - duplicate-interfaces-core-interfaces-with-port-channel: - duplicate-vni-vxlan-interface: - duplicate-vni-l3-interfaces-in-vxlan-interface: - duplicate-vni-l2vlans-vxlan-interface: - duplicate-interfaces-underlay: - duplicate-ip-address-uplink-switch-router-bgp: - failure-missing-evpn-vlan-bundle: - failure-missing-evpn-vlan-bundle_svi: - failure-missing-evpn-multicast-l3-with-pim: - failure-missing-evpn-multicast-peg-rps: - failure-duplicate-evpn-vlan-bundle-name: - failure-no-local-path-group-in-default-policy: - ipv4-acl-in-missing-on-wan-interface: - ipv4-acls: - missing-avt-id-cv-pathfinder: - missing-data-plane_cpu-allocation-max: - ntp-settings-server-vrf-missing-mgmt-ip: - ntp-settings-server-vrf-missing-inband-mgmt-interface: - source-interfaces-domain-lookup-duplicate-vrf: - source-interfaces-domain-lookup-missing-inband-mgmt-interface: - source-interfaces-domain-lookup-missing-mgmt-ip: - source-interfaces-http-client-duplicate-vrf: - source-interfaces-http-client-missing-inband-mgmt-interface: - source-interfaces-http-client-missing-mgmt-ip: - source-interfaces-radius-duplicate-vrf: - source-interfaces-radius-missing-inband-mgmt-interface: - source-interfaces-radius-missing-mgmt-ip: - source-interfaces-ssh-client-duplicate-vrf: - source-interfaces-ssh-client-missing-inband-mgmt-interface: - source-interfaces-ssh-client-missing-mgmt-ip: - source-interfaces-tacacs-duplicate-vrf: - source-interfaces-tacacs-missing-inband-mgmt-interface: - source-interfaces-tacacs-missing-mgmt-ip: - ul-filter-evpn-default-vrf-services: - sflow-settings-missing-inband-mgmt-interface: - sflow-settings-missing-mgmt-ip: children: - duplicate-ip-address-router-bgp: + EOS_DESIGNS_FAILURES_INCLUDED: hosts: - duplicate-ip-address-1: - duplicate-ip-address-2: - duplicate-vlans-mlag: - hosts: - duplicate-vlans-mlag-a: - duplicate-vlans-mlag-b: + failure-port-channel: + connected-endpoints-mismatched-descriptions: + connected-endpoints-missing-profile-lacp-fallback: + connected-endpoints-wrong-profile-lacp-fallback: + connected-endpoints-phone-vlan-mode: + connected-endpoints-phone-vlan-vlans: + connected-endpoints-monitor-sessions-mismatch-direction: + duplicate-vlans-l2vlans: + duplicate-vlans-svi-id: + duplicate-vrfs-duplicate-svi-name-conflict: + duplicate-vrfs-id-conflict: + duplicate-vrfs-vni-conflict: + duplicate-vrfs-tenant-igmp-snooping-conflict: + duplicate-interface-l3-edge: + duplicate-l3-interfaces-network-services: + duplicate-peer-ip-address-network-services: + duplicate-interfaces-point-to-point-services-1: + duplicate-interfaces-point-to-point-services-2: + duplicate-interfaces-point-to-point-services-3: + duplicate-interfaces-point-to-point-services-4: + duplicate-interfaces-connected-endpoints: + duplicate-interfaces-core-interfaces: + duplicate-interfaces-core-interfaces-with-port-channel: + duplicate-vni-vxlan-interface: + duplicate-vni-l3-interfaces-in-vxlan-interface: + duplicate-vni-l2vlans-vxlan-interface: + duplicate-interfaces-underlay: + duplicate-ip-address-uplink-switch-router-bgp: + duplicate-tunnel-interface-internet-exit: + failure-missing-evpn-vlan-bundle: + failure-missing-evpn-vlan-bundle_svi: + failure-missing-evpn-multicast-l3-with-pim: + failure-missing-evpn-multicast-peg-rps: + failure-duplicate-evpn-vlan-bundle-name: + failure-no-local-path-group-in-default-policy: + ipv4-acl-in-missing-on-wan-interface: + ipv4-acls: + missing-avt-id-cv-pathfinder: + missing-prefix-list-in-cv-pathfinder: + missing-prefix-list-definition-cv-pathfinder: + missing-data-plane_cpu-allocation-max: + ntp-settings-server-vrf-missing-mgmt-ip: + ntp-settings-server-vrf-missing-inband-mgmt-interface: + source-interfaces-domain-lookup-duplicate-vrf: + source-interfaces-domain-lookup-missing-inband-mgmt-interface: + source-interfaces-domain-lookup-missing-mgmt-ip: + source-interfaces-http-client-duplicate-vrf: + source-interfaces-http-client-missing-inband-mgmt-interface: + source-interfaces-http-client-missing-mgmt-ip: + source-interfaces-radius-duplicate-vrf: + source-interfaces-radius-missing-inband-mgmt-interface: + source-interfaces-radius-missing-mgmt-ip: + source-interfaces-ssh-client-duplicate-vrf: + source-interfaces-ssh-client-missing-inband-mgmt-interface: + source-interfaces-ssh-client-missing-mgmt-ip: + source-interfaces-tacacs-duplicate-vrf: + source-interfaces-tacacs-missing-inband-mgmt-interface: + source-interfaces-tacacs-missing-mgmt-ip: + ul-filter-evpn-default-vrf-services: + sflow-settings-missing-inband-mgmt-interface: + sflow-settings-missing-mgmt-ip: + core-interfaces-p2p-links-as: + + children: + DUPLICATE_VLANS_MLAG: + hosts: + duplicate-vlans-mlag-a: + duplicate-vlans-mlag-b: + + EOS_DESIGNS_FAILURES_EXCLUDED: + # These hosts are included in the vars and facts, but will not be included in the structured config run, + # since they are not present to trigger a failure on a different device. + children: + DUPLICATE_IP_ADDRESS_ROUTER_BGP: + hosts: + duplicate-ip-address-1: + duplicate-ip-address-2: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/custom_modules/custom_interface_descriptions.py b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/custom_modules/custom_interface_descriptions.py index 5fedd2a1b8f..d096a85fd88 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/custom_modules/custom_interface_descriptions.py +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/custom_modules/custom_interface_descriptions.py @@ -3,7 +3,10 @@ # that can be found in the LICENSE file. from functools import cached_property +# TODO: AVD5.0 change this to import from PyAVD instead and remove the utils from Ansible. from ansible_collections.arista.avd.plugins.plugin_utils.utils import get + +# TODO: AVD5.0 change this to import from PyAVD instead and remove the python_modules folder. from ansible_collections.arista.avd.roles.eos_designs.python_modules.interface_descriptions import AvdInterfaceDescriptions diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/custom_modules/custom_interface_descriptions_with_data.py b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/custom_modules/custom_interface_descriptions_with_data.py index bdc057f3c6c..121d9cecd99 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/custom_modules/custom_interface_descriptions_with_data.py +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/custom_modules/custom_interface_descriptions_with_data.py @@ -3,7 +3,10 @@ # that can be found in the LICENSE file. from functools import cached_property +# TODO: AVD5.0 change this to import from PyAVD instead and remove the utils from Ansible. from ansible_collections.arista.avd.plugins.plugin_utils.utils import get + +# TODO: AVD5.0 change this to import from PyAVD instead and remove the python_modules folder. from ansible_collections.arista.avd.roles.eos_designs.python_modules.interface_descriptions import AvdInterfaceDescriptions, InterfaceDescriptionData diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/custom_modules/custom_ip_addressing.py b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/custom_modules/custom_ip_addressing.py index db38f031e0b..a19d844d781 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/custom_modules/custom_ip_addressing.py +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/custom_modules/custom_ip_addressing.py @@ -3,6 +3,7 @@ # that can be found in the LICENSE file. from functools import cached_property +# TODO: AVD5.0 change this to import from PyAVD instead and remove the python_modules folder. from ansible_collections.arista.avd.roles.eos_designs.python_modules.ip_addressing import AvdIpAddressing diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/7010TX-LEAF1.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/7010TX-LEAF1.cfg new file mode 100644 index 00000000000..9eb5b4a64e4 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/7010TX-LEAF1.cfg @@ -0,0 +1,142 @@ +!RANCID-CONTENT-TYPE: arista +! +vlan internal order ascending range 1006 1199 +! +transceiver qsfp default-mode 4x10G +! +service routing protocols model multi-agent +! +hostname 7010TX-LEAF1 +! +no spanning-tree vlan-id 4093-4094 +! +no enable password +no aaa root +! +vlan 4093 + name LEAF_PEER_L3 + trunk group LEAF_PEER_L3 +! +vlan 4094 + name MLAG_PEER + trunk group MLAG +! +vrf instance MGMT +! +interface Port-Channel5 + description MLAG_PEER_7010TX-LEAF2_Po5 + no shutdown + switchport + switchport mode trunk + switchport trunk group LEAF_PEER_L3 + switchport trunk group MLAG +! +interface Ethernet5 + description MLAG_PEER_7010TX-LEAF2_Ethernet5 + no shutdown + channel-group 5 mode active +! +interface Ethernet6 + description MLAG_PEER_7010TX-LEAF2_Ethernet6 + no shutdown + channel-group 5 mode active +! +interface Loopback0 + description EVPN_Overlay_Peering + no shutdown + ip address 192.168.255.35/32 +! +interface Loopback1 + description VTEP_VXLAN_Tunnel_Source + no shutdown + ip address 192.168.254.35/32 +! +interface Management1 + description oob_management + no shutdown + vrf MGMT + ip address 192.168.201.116/24 +! +interface Vlan4093 + description MLAG_PEER_L3_PEERING + no shutdown + ip address 10.10.224.4/31 +! +interface Vlan4094 + description MLAG_PEER + no shutdown + no autostate + ip address 10.10.255.4/31 +! +interface Vxlan1 + description 7010TX-LEAF1_VTEP + vxlan source-interface Loopback1 + vxlan virtual-router encapsulation mac-address mlag-system-id + vxlan udp-port 4789 +! +ip routing +no ip routing vrf MGMT +! +ip prefix-list PL-LOOPBACKS-EVPN-OVERLAY + seq 10 permit 192.168.255.0/24 eq 32 + seq 20 permit 192.168.254.0/24 eq 32 +! +mlag configuration + domain-id MLAG_PER_MTU_INTERFACE + local-interface Vlan4094 + peer-address 10.10.255.5 + peer-link Port-Channel5 + reload-delay mlag 300 + reload-delay non-mlag 330 +! +route-map RM-CONN-2-BGP permit 10 + match ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY +! +route-map RM-MLAG-PEER-IN permit 10 + description Make routes learned over MLAG Peer-link less preferred on spines to ensure optimal routing + set origin incomplete +! +router bfd + multihop interval 300 min-rx 300 multiplier 3 +! +router bgp 923 + router-id 192.168.255.35 + maximum-paths 4 ecmp 4 + update wait-install + no bgp default ipv4-unicast + neighbor EVPN-OVERLAY-PEERS peer group + neighbor EVPN-OVERLAY-PEERS update-source Loopback0 + neighbor EVPN-OVERLAY-PEERS bfd + neighbor EVPN-OVERLAY-PEERS ebgp-multihop 3 + neighbor EVPN-OVERLAY-PEERS send-community + neighbor EVPN-OVERLAY-PEERS maximum-routes 0 + neighbor IPv4-UNDERLAY-PEERS peer group + neighbor IPv4-UNDERLAY-PEERS send-community + neighbor IPv4-UNDERLAY-PEERS maximum-routes 12000 + neighbor MLAG-IPv4-UNDERLAY-PEER peer group + neighbor MLAG-IPv4-UNDERLAY-PEER remote-as 923 + neighbor MLAG-IPv4-UNDERLAY-PEER next-hop-self + neighbor MLAG-IPv4-UNDERLAY-PEER description 7010TX-LEAF2 + neighbor MLAG-IPv4-UNDERLAY-PEER send-community + neighbor MLAG-IPv4-UNDERLAY-PEER maximum-routes 12000 + neighbor MLAG-IPv4-UNDERLAY-PEER route-map RM-MLAG-PEER-IN in + neighbor 10.10.224.5 peer group MLAG-IPv4-UNDERLAY-PEER + neighbor 10.10.224.5 description 7010TX-LEAF2 + redistribute connected route-map RM-CONN-2-BGP + ! + address-family evpn + neighbor EVPN-OVERLAY-PEERS activate + ! + address-family ipv4 + no neighbor EVPN-OVERLAY-PEERS activate + neighbor IPv4-UNDERLAY-PEERS activate + neighbor MLAG-IPv4-UNDERLAY-PEER activate +! +management api http-commands + protocol https + no shutdown + ! + vrf MGMT + no shutdown +! +end diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/7010TX-LEAF2.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/7010TX-LEAF2.cfg new file mode 100644 index 00000000000..492804b4ca1 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/7010TX-LEAF2.cfg @@ -0,0 +1,130 @@ +!RANCID-CONTENT-TYPE: arista +! +vlan internal order ascending range 1006 1199 +! +transceiver qsfp default-mode 4x10G +! +service routing protocols model multi-agent +! +hostname 7010TX-LEAF2 +! +no spanning-tree vlan-id 4093-4094 +! +no enable password +no aaa root +! +vlan 4093 + name LEAF_PEER_L3 + trunk group LEAF_PEER_L3 +! +vlan 4094 + name MLAG_PEER + trunk group MLAG +! +vrf instance MGMT +! +interface Port-Channel5 + description MLAG_PEER_7010TX-LEAF1_Po5 + no shutdown + switchport + switchport mode trunk + switchport trunk group LEAF_PEER_L3 + switchport trunk group MLAG +! +interface Ethernet5 + description MLAG_PEER_7010TX-LEAF1_Ethernet5 + no shutdown + channel-group 5 mode active +! +interface Ethernet6 + description MLAG_PEER_7010TX-LEAF1_Ethernet6 + no shutdown + channel-group 5 mode active +! +interface Loopback0 + description EVPN_Overlay_Peering + no shutdown + ip address 192.168.255.36/32 +! +interface Management1 + description oob_management + no shutdown + vrf MGMT + ip address 192.168.201.117/24 +! +interface Vlan4093 + description MLAG_PEER_L3_PEERING + no shutdown + ip address 10.10.224.5/31 +! +interface Vlan4094 + description MLAG_PEER + no shutdown + no autostate + ip address 10.10.255.5/31 +! +ip routing +no ip routing vrf MGMT +! +ip prefix-list PL-LOOPBACKS-EVPN-OVERLAY + seq 10 permit 192.168.255.0/24 eq 32 +! +mlag configuration + domain-id MLAG_PER_MTU_INTERFACE + local-interface Vlan4094 + peer-address 10.10.255.4 + peer-link Port-Channel5 + reload-delay mlag 300 + reload-delay non-mlag 330 +! +route-map RM-CONN-2-BGP permit 10 + match ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY +! +route-map RM-MLAG-PEER-IN permit 10 + description Make routes learned over MLAG Peer-link less preferred on spines to ensure optimal routing + set origin incomplete +! +router bfd + multihop interval 300 min-rx 300 multiplier 3 +! +router bgp 923 + router-id 192.168.255.36 + maximum-paths 4 ecmp 4 + update wait-install + no bgp default ipv4-unicast + neighbor EVPN-OVERLAY-PEERS peer group + neighbor EVPN-OVERLAY-PEERS update-source Loopback0 + neighbor EVPN-OVERLAY-PEERS bfd + neighbor EVPN-OVERLAY-PEERS ebgp-multihop 3 + neighbor EVPN-OVERLAY-PEERS send-community + neighbor EVPN-OVERLAY-PEERS maximum-routes 0 + neighbor IPv4-UNDERLAY-PEERS peer group + neighbor IPv4-UNDERLAY-PEERS send-community + neighbor IPv4-UNDERLAY-PEERS maximum-routes 12000 + neighbor MLAG-IPv4-UNDERLAY-PEER peer group + neighbor MLAG-IPv4-UNDERLAY-PEER remote-as 923 + neighbor MLAG-IPv4-UNDERLAY-PEER next-hop-self + neighbor MLAG-IPv4-UNDERLAY-PEER description 7010TX-LEAF1 + neighbor MLAG-IPv4-UNDERLAY-PEER send-community + neighbor MLAG-IPv4-UNDERLAY-PEER maximum-routes 12000 + neighbor MLAG-IPv4-UNDERLAY-PEER route-map RM-MLAG-PEER-IN in + neighbor 10.10.224.4 peer group MLAG-IPv4-UNDERLAY-PEER + neighbor 10.10.224.4 description 7010TX-LEAF1 + redistribute connected route-map RM-CONN-2-BGP + ! + address-family evpn + neighbor EVPN-OVERLAY-PEERS activate + ! + address-family ipv4 + no neighbor EVPN-OVERLAY-PEERS activate + neighbor IPv4-UNDERLAY-PEERS activate + neighbor MLAG-IPv4-UNDERLAY-PEER activate +! +management api http-commands + protocol https + no shutdown + ! + vrf MGMT + no shutdown +! +end diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-BL1A.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-BL1A.cfg index 2d109167659..3923fbf615c 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-BL1A.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-BL1A.cfg @@ -16,6 +16,8 @@ hostname DC1-BL1A ip name-server vrf MGMT 1.1.1.1 ip name-server vrf MGMT 8.8.8.8 ip name-server vrf MGMT 192.168.200.5 +ip name-server vrf MGMT 2001:db8::1 +ip name-server vrf MGMT 2001:db8::2 ! sflow vrf OOB destination 10.0.200.90 sflow vrf OOB destination 192.168.200.10 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-BL1B.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-BL1B.cfg index 3dd9c27d389..593f784c3d7 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-BL1B.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-BL1B.cfg @@ -15,6 +15,8 @@ service routing protocols model multi-agent hostname DC1-BL1B ip name-server vrf MGMT 8.8.8.8 ip name-server vrf MGMT 192.168.200.5 +ip name-server vrf MGMT 2001:db8::1 +ip name-server vrf MGMT 2001:db8::2 ! sflow vrf OOB destination 10.0.200.90 sflow vrf OOB destination 192.168.200.10 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-BL2A.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-BL2A.cfg index f7cbe7b25ce..1713d7717da 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-BL2A.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-BL2A.cfg @@ -15,9 +15,12 @@ service routing protocols model multi-agent hostname DC1-BL2A ip name-server vrf MGMT 8.8.8.8 ip name-server vrf MGMT 192.168.200.5 +ip name-server vrf MGMT 2001:db8::1 +ip name-server vrf MGMT 2001:db8::2 ! ntp local-interface vrf MGMT Management1 ntp server vrf MGMT 192.168.200.5 prefer +ntp server vrf MGMT 2001:db8::3 ! snmp-server contact example@example.com snmp-server location EOS_DESIGNS_UNIT_TESTS DC1-BL2A @@ -262,8 +265,17 @@ router bgp 65106 address-family ipv4 no neighbor EVPN-OVERLAY-PEERS activate no neighbor IPVPN-INTERWORKING-PEERS activate + neighbor Tenant_C_BGP_PEER_GROUP prefix-list PL_In_Test_1 in + neighbor Tenant_C_BGP_PEER_GROUP prefix-list PL_Out_Test_1 out + neighbor Tenant_C_BGP_PEER_GROUP activate + neighbor Tenant_C_BGP_PEER_GROUP2 route-map TEST_IN in + neighbor Tenant_C_BGP_PEER_GROUP2 route-map TEST_OUT out + neighbor Tenant_C_BGP_PEER_GROUP2 activate neighbor UNDERLAY-PEERS activate ! + address-family ipv6 + no neighbor Tenant_C_BGP_PEER_GROUP activate + ! address-family vpn-ipv4 domain identifier 65000:4 neighbor IPVPN-INTERWORKING-PEERS activate diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-BL2B.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-BL2B.cfg index 15689c1204a..eb28cfbc0cc 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-BL2B.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-BL2B.cfg @@ -15,9 +15,12 @@ service routing protocols model multi-agent hostname DC1-BL2B ip name-server vrf MGMT 8.8.8.8 ip name-server vrf MGMT 192.168.200.5 +ip name-server vrf MGMT 2001:db8::1 +ip name-server vrf MGMT 2001:db8::2 ! ntp local-interface vrf MGMT Management1 ntp server vrf MGMT 192.168.200.5 prefer +ntp server vrf MGMT 2001:db8::3 ! snmp-server contact example@example.com snmp-server location EOS_DESIGNS_UNIT_TESTS DC1-BL2B @@ -256,8 +259,12 @@ router bgp 65107 address-family ipv4 no neighbor EVPN-OVERLAY-PEERS activate no neighbor IPVPN-INTERWORKING-PEERS activate + neighbor Tenant_C_WAN_Zone_BGP_PEER_GROUP activate neighbor UNDERLAY-PEERS activate ! + address-family ipv6 + neighbor Tenant_C_WAN_Zone_BGP_PEER_GROUP activate + ! address-family vpn-ipv4 domain identifier 65000:4 neighbor IPVPN-INTERWORKING-PEERS activate @@ -302,12 +309,15 @@ router bgp 65107 neighbor 1.1.1.1 peer group Tenant_C_WAN_Zone_BGP_PEER_GROUP neighbor 1.1.1.1 description test_description neighbor 1.1.1.1 route-map RM-Tenant_C_WAN_Zone-1.1.1.1-SET-NEXT-HOP-OUT out + neighbor 2.2.2.3 peer group Tenant_C_WAN_Zone_BGP_PEER_GROUP + neighbor 2.2.2.3 description test_duplicate_peer_ip_address neighbor BEBA::C0CA:C07A peer group Tenant_C_WAN_Zone_BGP_PEER_GROUP neighbor BEBA::C0CA:C07A description test_ipv6 redistribute connected ! address-family ipv4 neighbor 1.1.1.1 activate + neighbor 2.2.2.3 activate ! address-family ipv6 neighbor BEBA::C0CA:C07A activate diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-CL1A.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-CL1A.cfg index 3cb05459b89..367e1e95ad5 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-CL1A.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-CL1A.cfg @@ -17,9 +17,12 @@ service routing protocols model multi-agent hostname DC1-CL1A ip name-server vrf MGMT 8.8.8.8 ip name-server vrf MGMT 192.168.200.5 +ip name-server vrf MGMT 2001:db8::1 +ip name-server vrf MGMT 2001:db8::2 ! ntp local-interface vrf MGMT Management0 ntp server vrf MGMT 192.168.200.5 prefer +ntp server vrf MGMT 2001:db8::3 ! snmp-server contact example@example.com snmp-server location EOS_DESIGNS_UNIT_TESTS DC1-CL1A diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-CL1B.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-CL1B.cfg index e43de661755..f2d7a46d356 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-CL1B.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-CL1B.cfg @@ -17,9 +17,12 @@ service routing protocols model multi-agent hostname DC1-CL1B ip name-server vrf MGMT 8.8.8.8 ip name-server vrf MGMT 192.168.200.5 +ip name-server vrf MGMT 2001:db8::1 +ip name-server vrf MGMT 2001:db8::2 ! ntp local-interface vrf MGMT Management0 ntp server vrf MGMT 192.168.200.5 prefer +ntp server vrf MGMT 2001:db8::3 ! snmp-server contact example@example.com snmp-server location EOS_DESIGNS_UNIT_TESTS DC1-CL1B diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-L2LEAF1A.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-L2LEAF1A.cfg index 1b6641bb516..5f895218cce 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-L2LEAF1A.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-L2LEAF1A.cfg @@ -17,9 +17,12 @@ service routing protocols model multi-agent hostname DC1-L2LEAF1A ip name-server vrf MGMT 8.8.8.8 ip name-server vrf MGMT 192.168.200.5 +ip name-server vrf MGMT 2001:db8::1 +ip name-server vrf MGMT 2001:db8::2 ! ntp local-interface vrf MGMT Management1 ntp server vrf MGMT 192.168.200.5 prefer +ntp server vrf MGMT 2001:db8::3 ! snmp-server contact example@example.com snmp-server location EOS_DESIGNS_UNIT_TESTS rackE DC1-L2LEAF1A @@ -84,6 +87,14 @@ interface Port-Channel3 switchport mode trunk switchport trunk group MLAG ! +interface Port-Channel5 + description server03_ESI_L2LEAF_PortChanne1 + no shutdown + switchport + switchport trunk allowed vlan 110-111,210-211 + switchport mode trunk + mlag 5 +! interface Ethernet1 description DC1-LEAF2A_Ethernet7 no shutdown @@ -108,6 +119,11 @@ interface Ethernet4 speed forced 40gfull channel-group 3 mode active ! +interface Ethernet5 + description server03_ESI_L2LEAF_Eth1 + no shutdown + channel-group 5 mode active +! interface Management1 description oob_management no shutdown @@ -117,7 +133,7 @@ interface Management1 interface Vlan4091 description MLAG_PEER no shutdown - mtu 1500 + mtu 1498 no autostate ip address 10.255.252.14/31 no ip routing vrf MGMT diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-L2LEAF1B.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-L2LEAF1B.cfg index a5416208074..0f06f3c4a77 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-L2LEAF1B.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-L2LEAF1B.cfg @@ -17,9 +17,12 @@ service routing protocols model multi-agent hostname DC1-L2LEAF1B ip name-server vrf MGMT 8.8.8.8 ip name-server vrf MGMT 192.168.200.5 +ip name-server vrf MGMT 2001:db8::1 +ip name-server vrf MGMT 2001:db8::2 ! ntp local-interface vrf MGMT Management1 ntp server vrf MGMT 192.168.200.5 prefer +ntp server vrf MGMT 2001:db8::3 ! snmp-server contact example@example.com snmp-server location EOS_DESIGNS_UNIT_TESTS rackE DC1-L2LEAF1B @@ -84,6 +87,14 @@ interface Port-Channel3 switchport mode trunk switchport trunk group MLAG ! +interface Port-Channel5 + description server03_ESI_L2LEAF_PortChanne1 + no shutdown + switchport + switchport trunk allowed vlan 110-111,210-211 + switchport mode trunk + mlag 5 +! interface Ethernet1 description DC1-LEAF2A_Ethernet8 no shutdown @@ -108,6 +119,11 @@ interface Ethernet4 speed forced 40gfull channel-group 3 mode active ! +interface Ethernet5 + description server03_ESI_L2LEAF_Eth2 + no shutdown + channel-group 5 mode active +! interface Management1 description oob_management no shutdown @@ -117,7 +133,7 @@ interface Management1 interface Vlan4091 description MLAG_PEER no shutdown - mtu 1500 + mtu 1499 no autostate ip address 10.255.252.15/31 no ip routing vrf MGMT diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-L2LEAF2A.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-L2LEAF2A.cfg index c75ad51a807..b77e7c4b585 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-L2LEAF2A.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-L2LEAF2A.cfg @@ -17,9 +17,12 @@ service routing protocols model multi-agent hostname DC1-L2LEAF2A ip name-server vrf MGMT 8.8.8.8 ip name-server vrf MGMT 192.168.200.5 +ip name-server vrf MGMT 2001:db8::1 +ip name-server vrf MGMT 2001:db8::2 ! ntp local-interface vrf MGMT Management1 ntp server vrf MGMT 192.168.200.5 prefer +ntp server vrf MGMT 2001:db8::3 ! snmp-server contact example@example.com snmp-server location EOS_DESIGNS_UNIT_TESTS rackE DC1-L2LEAF2A diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-L2LEAF2B.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-L2LEAF2B.cfg index 9e5a8f50337..a92e9031964 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-L2LEAF2B.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-L2LEAF2B.cfg @@ -17,9 +17,12 @@ service routing protocols model multi-agent hostname DC1-L2LEAF2B ip name-server vrf MGMT 8.8.8.8 ip name-server vrf MGMT 192.168.200.5 +ip name-server vrf MGMT 2001:db8::1 +ip name-server vrf MGMT 2001:db8::2 ! ntp local-interface vrf MGMT Management1 ntp server vrf MGMT 192.168.200.5 prefer +ntp server vrf MGMT 2001:db8::3 ! snmp-server contact example@example.com snmp-server location EOS_DESIGNS_UNIT_TESTS rackE DC1-L2LEAF2B diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-L2LEAF3A.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-L2LEAF3A.cfg index a2fc6182e71..e172d622202 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-L2LEAF3A.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-L2LEAF3A.cfg @@ -17,9 +17,12 @@ service routing protocols model multi-agent hostname DC1-L2LEAF3A ip name-server vrf MGMT 8.8.8.8 ip name-server vrf MGMT 192.168.200.5 +ip name-server vrf MGMT 2001:db8::1 +ip name-server vrf MGMT 2001:db8::2 ! ntp local-interface vrf MGMT Management1 ntp server vrf MGMT 192.168.200.5 prefer +ntp server vrf MGMT 2001:db8::3 ! snmp-server contact example@example.com snmp-server location EOS_DESIGNS_UNIT_TESTS rackE DC1-L2LEAF3A diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-L2LEAF4A.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-L2LEAF4A.cfg index 27a9ef7d166..a81cbe4a7e0 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-L2LEAF4A.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-L2LEAF4A.cfg @@ -17,9 +17,12 @@ service routing protocols model multi-agent hostname DC1-L2LEAF4A ip name-server vrf MGMT 8.8.8.8 ip name-server vrf MGMT 192.168.200.5 +ip name-server vrf MGMT 2001:db8::1 +ip name-server vrf MGMT 2001:db8::2 ! ntp local-interface vrf MGMT Management1 ntp server vrf MGMT 192.168.200.5 prefer +ntp server vrf MGMT 2001:db8::3 ! snmp-server contact example@example.com snmp-server location EOS_DESIGNS_UNIT_TESTS rackE DC1-L2LEAF4A diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-LEAF1A.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-LEAF1A.cfg index 1d25f8f99eb..178d2801922 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-LEAF1A.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-LEAF1A.cfg @@ -17,9 +17,12 @@ service routing protocols model multi-agent hostname DC1-LEAF1A ip name-server vrf MGMT 8.8.8.8 ip name-server vrf MGMT 192.168.200.5 +ip name-server vrf MGMT 2001:db8::1 +ip name-server vrf MGMT 2001:db8::2 ! ntp local-interface vrf MGMT Management1 ntp server vrf MGMT 192.168.200.5 prefer +ntp server vrf MGMT 2001:db8::3 ! snmp-server contact example@example.com snmp-server location EOS_DESIGNS_UNIT_TESTS rackA DC1-LEAF1A diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-LEAF2A.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-LEAF2A.cfg index 5ff21b7de6d..3e57272da6e 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-LEAF2A.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-LEAF2A.cfg @@ -17,9 +17,12 @@ service routing protocols model multi-agent hostname DC1-LEAF2A ip name-server vrf MGMT 8.8.8.8 ip name-server vrf MGMT 192.168.200.5 +ip name-server vrf MGMT 2001:db8::1 +ip name-server vrf MGMT 2001:db8::2 ! ntp local-interface vrf MGMT Management1 ntp server vrf MGMT 192.168.200.5 prefer +ntp server vrf MGMT 2001:db8::3 ! snmp-server contact example@example.com snmp-server location EOS_DESIGNS_UNIT_TESTS rackC DC1-LEAF2A @@ -428,6 +431,8 @@ interface Vlan110 description Tenant_A_OP_Zone_1 no shutdown vrf Tenant_A_OP_Zone + ip access-group TEST-IPV4-ACL-WITH-IP-FIELDS-IN_Vlan110 in + ip access-group TEST-IPV4-ACL-WITH-IP-FIELDS-OUT_Vlan110 out ip address virtual 10.1.10.1/24 ! interface Vlan111 @@ -613,6 +618,13 @@ ip virtual-router mac-address 00:dc:00:00:00:0a ip address virtual source-nat vrf Tenant_A_OP_Zone address 10.255.1.10 ip address virtual source-nat vrf Tenant_A_OSPF address 10.255.11.10 ! +ip access-list TEST-IPV4-ACL-WITH-IP-FIELDS-IN_Vlan110 + 15 deny ip any host 10.1.10.1 +! +ip access-list TEST-IPV4-ACL-WITH-IP-FIELDS-OUT_Vlan110 + remark Some remark will not require source and destination fields. + permit ip host 10.1.10.1 any +! ip routing ip routing vrf 12345678 no ip routing vrf MGMT diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-LEAF2B.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-LEAF2B.cfg index 89a0f19fe4e..3c3640b2161 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-LEAF2B.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-LEAF2B.cfg @@ -17,9 +17,12 @@ service routing protocols model multi-agent hostname DC1-LEAF2B ip name-server vrf MGMT 8.8.8.8 ip name-server vrf MGMT 192.168.200.5 +ip name-server vrf MGMT 2001:db8::1 +ip name-server vrf MGMT 2001:db8::2 ! ntp local-interface vrf MGMT Management1 ntp server vrf MGMT 192.168.200.5 prefer +ntp server vrf MGMT 2001:db8::3 ! snmp-server contact example@example.com snmp-server location EOS_DESIGNS_UNIT_TESTS rackD DC1-LEAF2B @@ -393,6 +396,8 @@ interface Vlan110 description Tenant_A_OP_Zone_1 no shutdown vrf Tenant_A_OP_Zone + ip access-group TEST-IPV4-ACL-WITH-IP-FIELDS-IN_Vlan110 in + ip access-group TEST-IPV4-ACL-WITH-IP-FIELDS-OUT_Vlan110 out ip address virtual 10.1.10.1/24 ! interface Vlan111 @@ -578,6 +583,13 @@ ip virtual-router mac-address 00:dc:00:00:00:0a ip address virtual source-nat vrf Tenant_A_OP_Zone address 10.255.1.11 ip address virtual source-nat vrf Tenant_A_OSPF address 10.255.11.11 ! +ip access-list TEST-IPV4-ACL-WITH-IP-FIELDS-IN_Vlan110 + 15 deny ip any host 10.1.10.1 +! +ip access-list TEST-IPV4-ACL-WITH-IP-FIELDS-OUT_Vlan110 + remark Some remark will not require source and destination fields. + permit ip host 10.1.10.1 any +! ip routing ip routing vrf 12345678 no ip routing vrf MGMT diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-SPINE1.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-SPINE1.cfg index f663ecb0e6e..0febcd4f343 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-SPINE1.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-SPINE1.cfg @@ -15,9 +15,12 @@ service routing protocols model multi-agent hostname DC1-SPINE1 ip name-server vrf MGMT 8.8.8.8 ip name-server vrf MGMT 192.168.200.5 +ip name-server vrf MGMT 2001:db8::1 +ip name-server vrf MGMT 2001:db8::2 ! ntp local-interface vrf MGMT Management1 ntp server vrf MGMT 192.168.200.5 prefer +ntp server vrf MGMT 2001:db8::3 ! snmp-server contact example@example.com snmp-server location EOS_DESIGNS_UNIT_TESTS DC1-SPINE1 @@ -288,9 +291,11 @@ router bgp 65001 neighbor 172.31.255.65 description DC1-CL1B_Ethernet1 neighbor 172.31.255.129 peer group UNDERLAY-PEERS neighbor 172.31.255.129 remote-as 65110 + neighbor 172.31.255.129 shutdown neighbor 172.31.255.129 description DC1_UNDEPLOYED_LEAF1A_Ethernet49/1 neighbor 172.31.255.161 peer group UNDERLAY-PEERS neighbor 172.31.255.161 remote-as 65111 + neighbor 172.31.255.161 shutdown neighbor 172.31.255.161 description DC1_UNDEPLOYED_LEAF1B_Ethernet49/1 neighbor 192.168.255.9 peer group EVPN-OVERLAY-PEERS neighbor 192.168.255.9 remote-as 65101 @@ -327,9 +332,11 @@ router bgp 65001 neighbor 192.168.255.19 description DC1-CL1B neighbor 192.168.255.21 peer group EVPN-OVERLAY-PEERS neighbor 192.168.255.21 remote-as 65110 + neighbor 192.168.255.21 shutdown neighbor 192.168.255.21 description DC1_UNDEPLOYED_LEAF1A neighbor 192.168.255.22 peer group EVPN-OVERLAY-PEERS neighbor 192.168.255.22 remote-as 65111 + neighbor 192.168.255.22 shutdown neighbor 192.168.255.22 description DC1_UNDEPLOYED_LEAF1B neighbor 192.168.255.33 peer group EVPN-OVERLAY-PEERS neighbor 192.168.255.33 remote-as 65151 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-SPINE2.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-SPINE2.cfg index 708c51a2932..827e2d45793 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-SPINE2.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-SPINE2.cfg @@ -15,9 +15,12 @@ service routing protocols model multi-agent hostname DC1-SPINE2 ip name-server vrf MGMT 8.8.8.8 ip name-server vrf MGMT 192.168.200.5 +ip name-server vrf MGMT 2001:db8::1 +ip name-server vrf MGMT 2001:db8::2 ! ntp local-interface vrf MGMT Management0 ntp server vrf MGMT 192.168.200.5 prefer +ntp server vrf MGMT 2001:db8::3 ! snmp-server contact example@example.com snmp-server location EOS_DESIGNS_UNIT_TESTS DC1-SPINE2 @@ -243,9 +246,11 @@ router bgp 65001 neighbor 172.31.255.67 description DC1-CL1B_Ethernet2 neighbor 172.31.255.131 peer group UNDERLAY-PEERS neighbor 172.31.255.131 remote-as 65110 + neighbor 172.31.255.131 shutdown neighbor 172.31.255.131 description DC1_UNDEPLOYED_LEAF1A_Ethernet50/1 neighbor 172.31.255.163 peer group UNDERLAY-PEERS neighbor 172.31.255.163 remote-as 65111 + neighbor 172.31.255.163 shutdown neighbor 172.31.255.163 description DC1_UNDEPLOYED_LEAF1B_Ethernet50/1 neighbor 192.168.255.9 peer group EVPN-OVERLAY-PEERS neighbor 192.168.255.9 remote-as 65101 @@ -282,9 +287,11 @@ router bgp 65001 neighbor 192.168.255.19 description DC1-CL1B neighbor 192.168.255.21 peer group EVPN-OVERLAY-PEERS neighbor 192.168.255.21 remote-as 65110 + neighbor 192.168.255.21 shutdown neighbor 192.168.255.21 description DC1_UNDEPLOYED_LEAF1A neighbor 192.168.255.22 peer group EVPN-OVERLAY-PEERS neighbor 192.168.255.22 remote-as 65111 + neighbor 192.168.255.22 shutdown neighbor 192.168.255.22 description DC1_UNDEPLOYED_LEAF1B redistribute connected route-map RM-CONN-2-BGP ! diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-SPINE3.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-SPINE3.cfg index d5ae2cbbcb9..03b4277140c 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-SPINE3.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-SPINE3.cfg @@ -15,9 +15,12 @@ service routing protocols model multi-agent hostname DC1-SPINE3 ip name-server vrf MGMT 8.8.8.8 ip name-server vrf MGMT 192.168.200.5 +ip name-server vrf MGMT 2001:db8::1 +ip name-server vrf MGMT 2001:db8::2 ! ntp local-interface vrf MGMT Management0 ntp server vrf MGMT 192.168.200.5 prefer +ntp server vrf MGMT 2001:db8::3 ! snmp-server contact example@example.com snmp-server location EOS_DESIGNS_UNIT_TESTS DC1-SPINE3 @@ -238,9 +241,11 @@ router bgp 65001 neighbor 172.31.255.69 description DC1-CL1B_Ethernet3 neighbor 172.31.255.133 peer group UNDERLAY-PEERS neighbor 172.31.255.133 remote-as 65110 + neighbor 172.31.255.133 shutdown neighbor 172.31.255.133 description DC1_UNDEPLOYED_LEAF1A_Ethernet51/1 neighbor 172.31.255.165 peer group UNDERLAY-PEERS neighbor 172.31.255.165 remote-as 65111 + neighbor 172.31.255.165 shutdown neighbor 172.31.255.165 description DC1_UNDEPLOYED_LEAF1B_Ethernet51/1 neighbor 192.168.255.9 peer group EVPN-OVERLAY-PEERS neighbor 192.168.255.9 remote-as 65101 @@ -277,9 +282,11 @@ router bgp 65001 neighbor 192.168.255.19 description DC1-CL1B neighbor 192.168.255.21 peer group EVPN-OVERLAY-PEERS neighbor 192.168.255.21 remote-as 65110 + neighbor 192.168.255.21 shutdown neighbor 192.168.255.21 description DC1_UNDEPLOYED_LEAF1A neighbor 192.168.255.22 peer group EVPN-OVERLAY-PEERS neighbor 192.168.255.22 remote-as 65111 + neighbor 192.168.255.22 shutdown neighbor 192.168.255.22 description DC1_UNDEPLOYED_LEAF1B redistribute connected route-map RM-CONN-2-BGP ! diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-SPINE4.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-SPINE4.cfg index ce350e62306..1c17f02cbb5 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-SPINE4.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-SPINE4.cfg @@ -15,9 +15,12 @@ service routing protocols model multi-agent hostname DC1-SPINE4 ip name-server vrf MGMT 8.8.8.8 ip name-server vrf MGMT 192.168.200.5 +ip name-server vrf MGMT 2001:db8::1 +ip name-server vrf MGMT 2001:db8::2 ! ntp local-interface vrf MGMT Management1 ntp server vrf MGMT 192.168.200.5 prefer +ntp server vrf MGMT 2001:db8::3 ! snmp-server contact example@example.com snmp-server location EOS_DESIGNS_UNIT_TESTS DC1-SPINE4 @@ -238,9 +241,11 @@ router bgp 65001 neighbor 172.31.255.71 description DC1-CL1B_Ethernet4 neighbor 172.31.255.135 peer group UNDERLAY-PEERS neighbor 172.31.255.135 remote-as 65110 + neighbor 172.31.255.135 shutdown neighbor 172.31.255.135 description DC1_UNDEPLOYED_LEAF1A_Ethernet52/1 neighbor 172.31.255.167 peer group UNDERLAY-PEERS neighbor 172.31.255.167 remote-as 65111 + neighbor 172.31.255.167 shutdown neighbor 172.31.255.167 description DC1_UNDEPLOYED_LEAF1B_Ethernet52/1 neighbor 192.168.255.9 peer group EVPN-OVERLAY-PEERS neighbor 192.168.255.9 remote-as 65101 @@ -277,9 +282,11 @@ router bgp 65001 neighbor 192.168.255.19 description DC1-CL1B neighbor 192.168.255.21 peer group EVPN-OVERLAY-PEERS neighbor 192.168.255.21 remote-as 65110 + neighbor 192.168.255.21 shutdown neighbor 192.168.255.21 description DC1_UNDEPLOYED_LEAF1A neighbor 192.168.255.22 peer group EVPN-OVERLAY-PEERS neighbor 192.168.255.22 remote-as 65111 + neighbor 192.168.255.22 shutdown neighbor 192.168.255.22 description DC1_UNDEPLOYED_LEAF1B redistribute connected route-map RM-CONN-2-BGP ! diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-SVC3A.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-SVC3A.cfg index f2a97aa668b..dad517d8a80 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-SVC3A.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-SVC3A.cfg @@ -17,9 +17,12 @@ service routing protocols model multi-agent hostname DC1-SVC3A ip name-server vrf MGMT 8.8.8.8 ip name-server vrf MGMT 192.168.200.5 +ip name-server vrf MGMT 2001:db8::1 +ip name-server vrf MGMT 2001:db8::2 ! ntp local-interface vrf MGMT Management1 ntp server vrf MGMT 192.168.200.5 prefer +ntp server vrf MGMT 2001:db8::3 ! snmp-server contact example@example.com snmp-server location EOS_DESIGNS_UNIT_TESTS DC1-SVC3A @@ -625,6 +628,8 @@ interface Vlan110 description Tenant_A_OP_Zone_1 no shutdown vrf Tenant_A_OP_Zone + ip access-group TEST-IPV4-ACL-WITH-IP-FIELDS-IN_Vlan110 in + ip access-group TEST-IPV4-ACL-WITH-IP-FIELDS-OUT_Vlan110 out ip address virtual 10.1.10.1/24 ! interface Vlan111 @@ -833,6 +838,13 @@ ip virtual-router mac-address 00:dc:00:00:00:0a ! ip address virtual source-nat vrf Tenant_A_OP_Zone address 10.255.1.12 ! +ip access-list TEST-IPV4-ACL-WITH-IP-FIELDS-IN_Vlan110 + 15 deny ip any host 10.1.10.1 +! +ip access-list TEST-IPV4-ACL-WITH-IP-FIELDS-OUT_Vlan110 + remark Some remark will not require source and destination fields. + permit ip host 10.1.10.1 any +! ip routing no ip routing vrf MGMT ip routing vrf Tenant_A_APP_Zone diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-SVC3B.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-SVC3B.cfg index e2cceb721e4..182a6387d61 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-SVC3B.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1-SVC3B.cfg @@ -17,9 +17,12 @@ service routing protocols model multi-agent hostname DC1-SVC3B ip name-server vrf MGMT 8.8.8.8 ip name-server vrf MGMT 192.168.200.5 +ip name-server vrf MGMT 2001:db8::1 +ip name-server vrf MGMT 2001:db8::2 ! ntp local-interface vrf MGMT Management1 ntp server vrf MGMT 192.168.200.5 prefer +ntp server vrf MGMT 2001:db8::3 ! snmp-server contact example@example.com snmp-server location EOS_DESIGNS_UNIT_TESTS DC1-SVC3B @@ -591,6 +594,8 @@ interface Vlan110 description Tenant_A_OP_Zone_1 no shutdown vrf Tenant_A_OP_Zone + ip access-group TEST-IPV4-ACL-WITH-IP-FIELDS-IN_Vlan110 in + ip access-group TEST-IPV4-ACL-WITH-IP-FIELDS-OUT_Vlan110 out ip address virtual 10.1.10.1/24 ! interface Vlan111 @@ -799,6 +804,13 @@ ip virtual-router mac-address 00:dc:00:00:00:0a ! ip address virtual source-nat vrf Tenant_A_OP_Zone address 10.255.1.13 ! +ip access-list TEST-IPV4-ACL-WITH-IP-FIELDS-IN_Vlan110 + 15 deny ip any host 10.1.10.1 +! +ip access-list TEST-IPV4-ACL-WITH-IP-FIELDS-OUT_Vlan110 + remark Some remark will not require source and destination fields. + permit ip host 10.1.10.1 any +! ip routing no ip routing vrf MGMT ip routing vrf Tenant_A_APP_Zone diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1.L2LEAF5A.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1.L2LEAF5A.cfg index 113ffc8442e..f30da111566 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1.L2LEAF5A.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1.L2LEAF5A.cfg @@ -17,9 +17,12 @@ service routing protocols model multi-agent hostname DC1.L2LEAF5A ip name-server vrf MGMT 8.8.8.8 ip name-server vrf MGMT 192.168.200.5 +ip name-server vrf MGMT 2001:db8::1 +ip name-server vrf MGMT 2001:db8::2 ! ntp local-interface vrf MGMT Management1 ntp server vrf MGMT 192.168.200.5 prefer +ntp server vrf MGMT 2001:db8::3 ! snmp-server contact example@example.com snmp-server location EOS_DESIGNS_UNIT_TESTS rackE DC1.L2LEAF5A diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1.L2LEAF5B.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1.L2LEAF5B.cfg index 71a72779672..9ca3de8aa0c 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1.L2LEAF5B.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1.L2LEAF5B.cfg @@ -17,9 +17,12 @@ service routing protocols model multi-agent hostname DC1.L2LEAF5B ip name-server vrf MGMT 8.8.8.8 ip name-server vrf MGMT 192.168.200.5 +ip name-server vrf MGMT 2001:db8::1 +ip name-server vrf MGMT 2001:db8::2 ! ntp local-interface vrf MGMT Management1 ntp server vrf MGMT 192.168.200.5 prefer +ntp server vrf MGMT 2001:db8::3 ! snmp-server contact example@example.com snmp-server location EOS_DESIGNS_UNIT_TESTS rackE DC1.L2LEAF5B diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1_UNDEPLOYED_LEAF1A.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1_UNDEPLOYED_LEAF1A.cfg index df7330a94a0..1856fb9f876 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1_UNDEPLOYED_LEAF1A.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1_UNDEPLOYED_LEAF1A.cfg @@ -17,9 +17,12 @@ service routing protocols model multi-agent hostname DC1_UNDEPLOYED_LEAF1A ip name-server vrf MGMT 8.8.8.8 ip name-server vrf MGMT 192.168.200.5 +ip name-server vrf MGMT 2001:db8::1 +ip name-server vrf MGMT 2001:db8::2 ! ntp local-interface vrf MGMT Management1 ntp server vrf MGMT 192.168.200.5 prefer +ntp server vrf MGMT 2001:db8::3 ! snmp-server contact example@example.com snmp-server location EOS_DESIGNS_UNIT_TESTS DC1_UNDEPLOYED_LEAF1A @@ -250,6 +253,8 @@ interface Vlan110 description Tenant_A_OP_Zone_1 no shutdown vrf Tenant_A_OP_Zone + ip access-group TEST-IPV4-ACL-WITH-IP-FIELDS-IN_Vlan110 in + ip access-group TEST-IPV4-ACL-WITH-IP-FIELDS-OUT_Vlan110 out ip address virtual 10.1.10.1/24 ! interface Vlan111 @@ -461,6 +466,13 @@ ip virtual-router mac-address 00:dc:00:00:00:0a ! ip address virtual source-nat vrf Tenant_A_OP_Zone address 10.255.1.21 ! +ip access-list TEST-IPV4-ACL-WITH-IP-FIELDS-IN_Vlan110 + 15 deny ip any host 10.1.10.1 +! +ip access-list TEST-IPV4-ACL-WITH-IP-FIELDS-OUT_Vlan110 + remark Some remark will not require source and destination fields. + permit ip host 10.1.10.1 any +! ip routing no ip routing vrf MGMT ip routing vrf Tenant_A_APP_Zone diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1_UNDEPLOYED_LEAF1B.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1_UNDEPLOYED_LEAF1B.cfg index 0bf02a4b778..b696275a42d 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1_UNDEPLOYED_LEAF1B.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/DC1_UNDEPLOYED_LEAF1B.cfg @@ -17,9 +17,12 @@ service routing protocols model multi-agent hostname DC1_UNDEPLOYED_LEAF1B ip name-server vrf MGMT 8.8.8.8 ip name-server vrf MGMT 192.168.200.5 +ip name-server vrf MGMT 2001:db8::1 +ip name-server vrf MGMT 2001:db8::2 ! ntp local-interface vrf MGMT Management1 ntp server vrf MGMT 192.168.200.5 prefer +ntp server vrf MGMT 2001:db8::3 ! snmp-server contact example@example.com snmp-server location EOS_DESIGNS_UNIT_TESTS DC1_UNDEPLOYED_LEAF1B @@ -250,6 +253,8 @@ interface Vlan110 description Tenant_A_OP_Zone_1 no shutdown vrf Tenant_A_OP_Zone + ip access-group TEST-IPV4-ACL-WITH-IP-FIELDS-IN_Vlan110 in + ip access-group TEST-IPV4-ACL-WITH-IP-FIELDS-OUT_Vlan110 out ip address virtual 10.1.10.1/24 ! interface Vlan111 @@ -461,6 +466,13 @@ ip virtual-router mac-address 00:dc:00:00:00:0a ! ip address virtual source-nat vrf Tenant_A_OP_Zone address 10.255.1.22 ! +ip access-list TEST-IPV4-ACL-WITH-IP-FIELDS-IN_Vlan110 + 15 deny ip any host 10.1.10.1 +! +ip access-list TEST-IPV4-ACL-WITH-IP-FIELDS-OUT_Vlan110 + remark Some remark will not require source and destination fields. + permit ip host 10.1.10.1 any +! ip routing no ip routing vrf MGMT ip routing vrf Tenant_A_APP_Zone diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/MH-L2LEAF1A.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/MH-L2LEAF1A.cfg index 050586ed412..c02a429b8d7 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/MH-L2LEAF1A.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/MH-L2LEAF1A.cfg @@ -15,9 +15,12 @@ service routing protocols model multi-agent hostname MH-L2LEAF1A ip name-server vrf MGMT 8.8.8.8 ip name-server vrf MGMT 192.168.200.5 +ip name-server vrf MGMT 2001:db8::1 +ip name-server vrf MGMT 2001:db8::2 ! ntp local-interface vrf MGMT Management1 ntp server vrf MGMT 192.168.200.5 prefer +ntp server vrf MGMT 2001:db8::3 ! snmp-server contact example@example.com snmp-server location EOS_DESIGNS_UNIT_TESTS MH-L2LEAF1A diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/MH-LEAF1A.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/MH-LEAF1A.cfg index 699328e6493..02ed421126e 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/MH-LEAF1A.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/MH-LEAF1A.cfg @@ -17,9 +17,12 @@ lacp port-id range 1 128 hostname MH-LEAF1A ip name-server vrf MGMT 8.8.8.8 ip name-server vrf MGMT 192.168.200.5 +ip name-server vrf MGMT 2001:db8::1 +ip name-server vrf MGMT 2001:db8::2 ! ntp local-interface vrf MGMT Management1 ntp server vrf MGMT 192.168.200.5 prefer +ntp server vrf MGMT 2001:db8::3 ! snmp-server contact example@example.com snmp-server location EOS_DESIGNS_UNIT_TESTS MH-LEAF1A diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/MH-LEAF1B.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/MH-LEAF1B.cfg index fca0ff48e8c..3d9a1b8c13a 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/MH-LEAF1B.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/MH-LEAF1B.cfg @@ -17,9 +17,12 @@ lacp port-id range 129 256 hostname MH-LEAF1B ip name-server vrf MGMT 8.8.8.8 ip name-server vrf MGMT 192.168.200.5 +ip name-server vrf MGMT 2001:db8::1 +ip name-server vrf MGMT 2001:db8::2 ! ntp local-interface vrf MGMT Management1 ntp server vrf MGMT 192.168.200.5 prefer +ntp server vrf MGMT 2001:db8::3 ! snmp-server contact example@example.com snmp-server location EOS_DESIGNS_UNIT_TESTS MH-LEAF1B diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/MH-LEAF2A.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/MH-LEAF2A.cfg index f8330261013..feaa7089e7e 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/MH-LEAF2A.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/MH-LEAF2A.cfg @@ -17,9 +17,12 @@ lacp port-id range 257 768 hostname MH-LEAF2A ip name-server vrf MGMT 8.8.8.8 ip name-server vrf MGMT 192.168.200.5 +ip name-server vrf MGMT 2001:db8::1 +ip name-server vrf MGMT 2001:db8::2 ! ntp local-interface vrf MGMT Management1 ntp server vrf MGMT 192.168.200.5 prefer +ntp server vrf MGMT 2001:db8::3 ! snmp-server contact example@example.com snmp-server location EOS_DESIGNS_UNIT_TESTS MH-LEAF2A diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/MLAG-OSPF-L3LEAF1A.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/MLAG-OSPF-L3LEAF1A.cfg index c81418a777c..7b91c0af3cc 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/MLAG-OSPF-L3LEAF1A.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/MLAG-OSPF-L3LEAF1A.cfg @@ -15,9 +15,12 @@ service routing protocols model multi-agent hostname MLAG-OSPF-L3LEAF1A ip name-server vrf MGMT 8.8.8.8 ip name-server vrf MGMT 192.168.200.5 +ip name-server vrf MGMT 2001:db8::1 +ip name-server vrf MGMT 2001:db8::2 ! ntp local-interface vrf MGMT Management1 ntp server vrf MGMT 192.168.200.5 prefer +ntp server vrf MGMT 2001:db8::3 ! snmp-server contact example@example.com snmp-server location EOS_DESIGNS_UNIT_TESTS MLAG-OSPF-L3LEAF1A diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/MLAG-OSPF-L3LEAF1B.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/MLAG-OSPF-L3LEAF1B.cfg index bde57668e24..784b51e55be 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/MLAG-OSPF-L3LEAF1B.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/MLAG-OSPF-L3LEAF1B.cfg @@ -15,9 +15,12 @@ service routing protocols model multi-agent hostname MLAG-OSPF-L3LEAF1B ip name-server vrf MGMT 8.8.8.8 ip name-server vrf MGMT 192.168.200.5 +ip name-server vrf MGMT 2001:db8::1 +ip name-server vrf MGMT 2001:db8::2 ! ntp local-interface vrf MGMT Management1 ntp server vrf MGMT 192.168.200.5 prefer +ntp server vrf MGMT 2001:db8::3 ! snmp-server contact example@example.com snmp-server location EOS_DESIGNS_UNIT_TESTS MLAG-OSPF-L3LEAF1B diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/MLAG_IPV6_L3LEAF1A.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/MLAG_IPV6_L3LEAF1A.cfg new file mode 100644 index 00000000000..2b4872e4c48 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/MLAG_IPV6_L3LEAF1A.cfg @@ -0,0 +1,144 @@ +!RANCID-CONTENT-TYPE: arista +! +vlan internal order ascending range 1006 1199 +! +transceiver qsfp default-mode 4x10G +! +service routing protocols model multi-agent +! +hostname MLAG_IPV6_L3LEAF1A +! +no spanning-tree vlan-id 4093-4094 +! +no enable password +no aaa root +! +vlan 4093 + name LEAF_PEER_L3 + trunk group LEAF_PEER_L3 +! +vlan 4094 + name MLAG_PEER + trunk group MLAG +! +vrf instance MGMT +! +interface Port-Channel5 + description MLAG_PEER_MLAG_IPV6_L3LEAF1B_Po5 + no shutdown + switchport + switchport mode trunk + switchport trunk group LEAF_PEER_L3 + switchport trunk group MLAG +! +interface Ethernet5 + description MLAG_PEER_MLAG_IPV6_L3LEAF1B_Ethernet5 + no shutdown + channel-group 5 mode active +! +interface Ethernet6 + description MLAG_PEER_MLAG_IPV6_L3LEAF1B_Ethernet6 + no shutdown + channel-group 5 mode active +! +interface Loopback0 + description EVPN_Overlay_Peering + no shutdown + ip address 192.168.255.35/32 +! +interface Loopback1 + description VTEP_VXLAN_Tunnel_Source + no shutdown + ip address 192.168.254.35/32 +! +interface Management1 + description oob_management + no shutdown + vrf MGMT + ip address 192.168.201.116/24 +! +interface Vlan4093 + description MLAG_PEER_L3_PEERING + no shutdown + mtu 9214 + ip address 10.10.224.4/31 +! +interface Vlan4094 + description MLAG_PEER + no shutdown + mtu 9214 + no autostate + ipv6 address 2001:db8:0:2::1/64 +! +interface Vxlan1 + description MLAG_IPV6_L3LEAF1A_VTEP + vxlan source-interface Loopback1 + vxlan virtual-router encapsulation mac-address mlag-system-id + vxlan udp-port 4789 +! +ip routing +no ip routing vrf MGMT +! +ip prefix-list PL-LOOPBACKS-EVPN-OVERLAY + seq 10 permit 192.168.255.0/24 eq 32 + seq 20 permit 192.168.254.0/24 eq 32 +! +mlag configuration + domain-id MLAG_IPV6 + local-interface Vlan4094 + peer-address 2001:db8:0:2::2 + peer-link Port-Channel5 + reload-delay mlag 300 + reload-delay non-mlag 330 +! +route-map RM-CONN-2-BGP permit 10 + match ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY +! +route-map RM-MLAG-PEER-IN permit 10 + description Make routes learned over MLAG Peer-link less preferred on spines to ensure optimal routing + set origin incomplete +! +router bfd + multihop interval 300 min-rx 300 multiplier 3 +! +router bgp 65001 + router-id 192.168.255.35 + maximum-paths 4 ecmp 4 + update wait-install + no bgp default ipv4-unicast + neighbor EVPN-OVERLAY-PEERS peer group + neighbor EVPN-OVERLAY-PEERS update-source Loopback0 + neighbor EVPN-OVERLAY-PEERS bfd + neighbor EVPN-OVERLAY-PEERS ebgp-multihop 3 + neighbor EVPN-OVERLAY-PEERS send-community + neighbor EVPN-OVERLAY-PEERS maximum-routes 0 + neighbor IPv4-UNDERLAY-PEERS peer group + neighbor IPv4-UNDERLAY-PEERS send-community + neighbor IPv4-UNDERLAY-PEERS maximum-routes 12000 + neighbor MLAG-IPv4-UNDERLAY-PEER peer group + neighbor MLAG-IPv4-UNDERLAY-PEER remote-as 65001 + neighbor MLAG-IPv4-UNDERLAY-PEER next-hop-self + neighbor MLAG-IPv4-UNDERLAY-PEER description MLAG_IPV6_L3LEAF1B + neighbor MLAG-IPv4-UNDERLAY-PEER send-community + neighbor MLAG-IPv4-UNDERLAY-PEER maximum-routes 12000 + neighbor MLAG-IPv4-UNDERLAY-PEER route-map RM-MLAG-PEER-IN in + neighbor 10.10.224.5 peer group MLAG-IPv4-UNDERLAY-PEER + neighbor 10.10.224.5 description MLAG_IPV6_L3LEAF1B + redistribute connected route-map RM-CONN-2-BGP + ! + address-family evpn + neighbor EVPN-OVERLAY-PEERS activate + ! + address-family ipv4 + no neighbor EVPN-OVERLAY-PEERS activate + neighbor IPv4-UNDERLAY-PEERS activate + neighbor MLAG-IPv4-UNDERLAY-PEER activate +! +management api http-commands + protocol https + no shutdown + ! + vrf MGMT + no shutdown +! +end diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/MLAG_IPV6_L3LEAF1B.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/MLAG_IPV6_L3LEAF1B.cfg new file mode 100644 index 00000000000..813bca47156 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/MLAG_IPV6_L3LEAF1B.cfg @@ -0,0 +1,144 @@ +!RANCID-CONTENT-TYPE: arista +! +vlan internal order ascending range 1006 1199 +! +transceiver qsfp default-mode 4x10G +! +service routing protocols model multi-agent +! +hostname MLAG_IPV6_L3LEAF1B +! +no spanning-tree vlan-id 4093-4094 +! +no enable password +no aaa root +! +vlan 4093 + name LEAF_PEER_L3 + trunk group LEAF_PEER_L3 +! +vlan 4094 + name MLAG_PEER + trunk group MLAG +! +vrf instance MGMT +! +interface Port-Channel5 + description MLAG_PEER_MLAG_IPV6_L3LEAF1A_Po5 + no shutdown + switchport + switchport mode trunk + switchport trunk group LEAF_PEER_L3 + switchport trunk group MLAG +! +interface Ethernet5 + description MLAG_PEER_MLAG_IPV6_L3LEAF1A_Ethernet5 + no shutdown + channel-group 5 mode active +! +interface Ethernet6 + description MLAG_PEER_MLAG_IPV6_L3LEAF1A_Ethernet6 + no shutdown + channel-group 5 mode active +! +interface Loopback0 + description EVPN_Overlay_Peering + no shutdown + ip address 192.168.255.36/32 +! +interface Loopback1 + description VTEP_VXLAN_Tunnel_Source + no shutdown + ip address 192.168.254.35/32 +! +interface Management1 + description oob_management + no shutdown + vrf MGMT + ip address 192.168.201.117/24 +! +interface Vlan4093 + description MLAG_PEER_L3_PEERING + no shutdown + mtu 9214 + ip address 10.10.224.5/31 +! +interface Vlan4094 + description MLAG_PEER + no shutdown + mtu 9214 + no autostate + ipv6 address 2001:db8:0:2::2/64 +! +interface Vxlan1 + description MLAG_IPV6_L3LEAF1B_VTEP + vxlan source-interface Loopback1 + vxlan virtual-router encapsulation mac-address mlag-system-id + vxlan udp-port 4789 +! +ip routing +no ip routing vrf MGMT +! +ip prefix-list PL-LOOPBACKS-EVPN-OVERLAY + seq 10 permit 192.168.255.0/24 eq 32 + seq 20 permit 192.168.254.0/24 eq 32 +! +mlag configuration + domain-id MLAG_IPV6 + local-interface Vlan4094 + peer-address 2001:db8:0:2::1 + peer-link Port-Channel5 + reload-delay mlag 300 + reload-delay non-mlag 330 +! +route-map RM-CONN-2-BGP permit 10 + match ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY +! +route-map RM-MLAG-PEER-IN permit 10 + description Make routes learned over MLAG Peer-link less preferred on spines to ensure optimal routing + set origin incomplete +! +router bfd + multihop interval 300 min-rx 300 multiplier 3 +! +router bgp 65001 + router-id 192.168.255.36 + maximum-paths 4 ecmp 4 + update wait-install + no bgp default ipv4-unicast + neighbor EVPN-OVERLAY-PEERS peer group + neighbor EVPN-OVERLAY-PEERS update-source Loopback0 + neighbor EVPN-OVERLAY-PEERS bfd + neighbor EVPN-OVERLAY-PEERS ebgp-multihop 3 + neighbor EVPN-OVERLAY-PEERS send-community + neighbor EVPN-OVERLAY-PEERS maximum-routes 0 + neighbor IPv4-UNDERLAY-PEERS peer group + neighbor IPv4-UNDERLAY-PEERS send-community + neighbor IPv4-UNDERLAY-PEERS maximum-routes 12000 + neighbor MLAG-IPv4-UNDERLAY-PEER peer group + neighbor MLAG-IPv4-UNDERLAY-PEER remote-as 65001 + neighbor MLAG-IPv4-UNDERLAY-PEER next-hop-self + neighbor MLAG-IPv4-UNDERLAY-PEER description MLAG_IPV6_L3LEAF1A + neighbor MLAG-IPv4-UNDERLAY-PEER send-community + neighbor MLAG-IPv4-UNDERLAY-PEER maximum-routes 12000 + neighbor MLAG-IPv4-UNDERLAY-PEER route-map RM-MLAG-PEER-IN in + neighbor 10.10.224.4 peer group MLAG-IPv4-UNDERLAY-PEER + neighbor 10.10.224.4 description MLAG_IPV6_L3LEAF1A + redistribute connected route-map RM-CONN-2-BGP + ! + address-family evpn + neighbor EVPN-OVERLAY-PEERS activate + ! + address-family ipv4 + no neighbor EVPN-OVERLAY-PEERS activate + neighbor IPv4-UNDERLAY-PEERS activate + neighbor MLAG-IPv4-UNDERLAY-PEER activate +! +management api http-commands + protocol https + no shutdown + ! + vrf MGMT + no shutdown +! +end diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/TEST-MGMT-GATEWAY-IN-NODE-GROUP.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/TEST-MGMT-GATEWAY-IN-NODE-GROUP.cfg new file mode 100644 index 00000000000..774dbdb553d --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/TEST-MGMT-GATEWAY-IN-NODE-GROUP.cfg @@ -0,0 +1,36 @@ +!RANCID-CONTENT-TYPE: arista +! +vlan internal order ascending range 1006 1199 +! +transceiver qsfp default-mode 4x10G +! +service routing protocols model multi-agent +! +hostname TEST-MGMT-GATEWAY-IN-NODE-GROUP +! +no enable password +no aaa root +! +vrf instance MGMT +! +interface Management1 + description oob_management + no shutdown + vrf MGMT + ip address 192.168.201.202/24 + ipv6 enable + ipv6 address 2001:db8::105/64 +no ip routing vrf MGMT +! +ip route vrf MGMT 0.0.0.0/0 192.168.201.254 +! +ipv6 route vrf MGMT ::/0 2001:db8::2 +! +management api http-commands + protocol https + no shutdown + ! + vrf MGMT + no shutdown +! +end diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/UNDERLAY-MULTICAST-L3LEAF2B.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/UNDERLAY-MULTICAST-L3LEAF2B.cfg index b798f2e6906..c7cacc2596b 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/UNDERLAY-MULTICAST-L3LEAF2B.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/UNDERLAY-MULTICAST-L3LEAF2B.cfg @@ -191,7 +191,7 @@ router pim sparse-mode router msdp originator-id local-interface Loopback0 ! - peer 192.168.255.6 + peer 192.168.255.5 mesh-group ANYCAST-RP local-interface Loopback0 description UNDERLAY-MULTICAST-L3LEAF2A diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/autovpn-edge-no-default-policy.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/autovpn-edge-no-default-policy.cfg index 5c35acec0db..e75f712289f 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/autovpn-edge-no-default-policy.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/autovpn-edge-no-default-policy.cfg @@ -2,6 +2,16 @@ ! agent KernelFib environment KERNELFIB_PROGRAM_ALL_ECMP=1 ! +flow tracking hardware + tracker FLOW-TRACKER + record export on inactive timeout 70000 + record export on interval 300000 + exporter CV-TELEMETRY + collector 127.0.0.1 + local interface Loopback0 + template interval 3600000 + no shutdown +! service routing protocols model multi-agent ! hostname autovpn-edge-no-default-policy @@ -78,6 +88,7 @@ ip security interface Dps1 description DPS Interface mtu 9214 + flow tracker hardware FLOW-TRACKER ip address 192.168.255.1/32 ! interface Ethernet1 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/autovpn-edge.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/autovpn-edge.cfg index 3e08edb549f..809ecbbd019 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/autovpn-edge.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/autovpn-edge.cfg @@ -2,6 +2,16 @@ ! agent KernelFib environment KERNELFIB_PROGRAM_ALL_ECMP=1 ! +flow tracking hardware + tracker FLOW-TRACKER + record export on inactive timeout 70000 + record export on interval 300000 + exporter CV-TELEMETRY + collector 127.0.0.1 + local interface Loopback0 + template interval 3600000 + no shutdown +! service routing protocols model multi-agent ! hostname autovpn-edge @@ -101,6 +111,7 @@ ip security interface Dps1 description DPS Interface mtu 9214 + flow tracker hardware FLOW-TRACKER ip address 192.168.130.1/32 ! interface Ethernet1 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/autovpn-rr1.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/autovpn-rr1.cfg index d976e6fe5ed..32c31da91b7 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/autovpn-rr1.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/autovpn-rr1.cfg @@ -2,6 +2,16 @@ ! agent KernelFib environment KERNELFIB_PROGRAM_ALL_ECMP=1 ! +flow tracking hardware + tracker FLOW-TRACKER + record export on inactive timeout 70000 + record export on interval 300000 + exporter CV-TELEMETRY + collector 127.0.0.1 + local interface Loopback0 + template interval 3600000 + no shutdown +! service routing protocols model multi-agent ! hostname autovpn-rr1 @@ -87,6 +97,7 @@ ip security interface Dps1 description DPS Interface mtu 9214 + flow tracker hardware FLOW-TRACKER ip address 192.168.131.1/32 ! interface Ethernet1 @@ -163,6 +174,7 @@ router bgp 65000 neighbor WAN-RR-OVERLAY-PEERS peer group neighbor WAN-RR-OVERLAY-PEERS remote-as 65000 neighbor WAN-RR-OVERLAY-PEERS update-source Dps1 + neighbor WAN-RR-OVERLAY-PEERS route-reflector-client neighbor WAN-RR-OVERLAY-PEERS bfd neighbor WAN-RR-OVERLAY-PEERS bfd interval 1000 min-rx 1000 multiplier 10 neighbor WAN-RR-OVERLAY-PEERS ttl maximum-hops 1 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/autovpn-rr2.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/autovpn-rr2.cfg index 1908774ab0f..9634970e9aa 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/autovpn-rr2.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/autovpn-rr2.cfg @@ -2,6 +2,16 @@ ! agent KernelFib environment KERNELFIB_PROGRAM_ALL_ECMP=1 ! +flow tracking hardware + tracker FLOW-TRACKER + record export on inactive timeout 70000 + record export on interval 300000 + exporter CV-TELEMETRY + collector 127.0.0.1 + local interface Loopback0 + template interval 3600000 + no shutdown +! service routing protocols model multi-agent ! hostname autovpn-rr2 @@ -87,6 +97,7 @@ ip security interface Dps1 description DPS Interface mtu 9214 + flow tracker hardware FLOW-TRACKER ip address 192.168.131.2/32 ! interface Ethernet1 @@ -164,6 +175,7 @@ router bgp 65000 neighbor WAN-RR-OVERLAY-PEERS peer group neighbor WAN-RR-OVERLAY-PEERS remote-as 65000 neighbor WAN-RR-OVERLAY-PEERS update-source Dps1 + neighbor WAN-RR-OVERLAY-PEERS route-reflector-client neighbor WAN-RR-OVERLAY-PEERS bfd neighbor WAN-RR-OVERLAY-PEERS bfd interval 1000 min-rx 1000 multiplier 10 neighbor WAN-RR-OVERLAY-PEERS ttl maximum-hops 1 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/connected_endpoints.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/connected_endpoints.cfg index bd77f45deaa..e5d4cdc50e9 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/connected_endpoints.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/connected_endpoints.cfg @@ -13,6 +13,9 @@ no aaa root ! vrf instance MGMT ! +link tracking group LT_GROUP1 + recovery delay 300 +! interface Port-Channel5 description OLD_SW-1/5_PORT_CHANNEL_DESCRIPTION no shutdown @@ -35,6 +38,13 @@ interface Port-Channel12 port-channel lacp fallback timeout 90 port-channel lacp fallback individual ! +interface Port-Channel15 + description INDIVIDUAL_2_TRUNK_PHONE + no shutdown + switchport + port-channel lacp fallback timeout 90 + port-channel lacp fallback individual +! interface Ethernet4 description PHYSICAL_PORT_DESCRIPTION no shutdown @@ -82,9 +92,21 @@ interface Ethernet12 switchport trunk allowed vlan 1,2,3,4,5,6,7,123,234 switchport mode trunk switchport + dot1x unauthorized access vlan membership egress + dot1x unauthorized native vlan membership egress channel-group 12 mode active + poe disabled + ptp enable + ptp sync-message interval -3 + ptp announce interval 0 + ptp transport ipv4 + ptp announce timeout 3 + ptp delay-req interval -3 + ptp role master + service-profile MYQOS spanning-tree portfast spanning-tree bpdufilter enable + no sflow enable ! interface Ethernet13 description INDIVIDUAL_1 @@ -93,9 +115,21 @@ interface Ethernet13 switchport trunk allowed vlan 1,2,3,4,5,6,7,123,234 switchport mode trunk switchport + dot1x unauthorized access vlan membership egress + dot1x unauthorized native vlan membership egress channel-group 12 mode active + poe disabled + ptp enable + ptp sync-message interval -3 + ptp announce interval 0 + ptp transport ipv4 + ptp announce timeout 3 + ptp delay-req interval -3 + ptp role master + service-profile MYQOS spanning-tree portfast spanning-tree bpdufilter enable + no sflow enable ! interface Ethernet14 description DOT1X_UNAUTHORIZED @@ -106,8 +140,38 @@ interface Ethernet14 switchport dot1x unauthorized access vlan membership egress dot1x unauthorized native vlan membership egress + poe disabled + ptp enable + ptp sync-message interval -3 + ptp announce interval 0 + ptp transport ipv4 + ptp announce timeout 3 + ptp delay-req interval -3 + ptp role master + service-profile MYQOS spanning-tree portfast spanning-tree bpdufilter enable + no sflow enable +! +interface Ethernet15 + description INDIVIDUAL_2_TRUNK_PHONE + no shutdown + switchport trunk native vlan 123 + switchport phone vlan 321 + switchport mode trunk phone + switchport + channel-group 15 mode active + link tracking group LT_GROUP1 downstream +! +interface Ethernet16 + description INDIVIDUAL_2_TRUNK_PHONE + no shutdown + switchport trunk native vlan 123 + switchport phone vlan 321 + switchport mode trunk phone + switchport + channel-group 15 mode active + link tracking group LT_GROUP1 downstream no ip routing vrf MGMT ! management api http-commands diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/core-4-multicast.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/core-4-multicast.cfg new file mode 100644 index 00000000000..408306ae9fe --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/core-4-multicast.cfg @@ -0,0 +1,107 @@ +!RANCID-CONTENT-TYPE: arista +! +vlan internal order ascending range 1006 1199 +! +transceiver qsfp default-mode 4x10G +! +service routing protocols model multi-agent +! +hostname core-4-multicast +! +spanning-tree mode none +! +no enable password +no aaa root +! +vrf instance MGMT +! +interface Ethernet1 + description P2P_LINK_TO_peer1_Ethernet1 + no shutdown + mtu 1600 + no switchport + ip address 100.64.48.18/31 + mpls ip + pim ipv4 sparse-mode +! +interface Ethernet2 + description P2P_LINK_TO_peer2_Ethernet2 + no shutdown + mtu 1600 + no switchport + ip address 100.64.48.20/31 + mpls ip +! +interface Ethernet3 + description P2P_LINK_TO_peer3_Ethernet3 + no shutdown + mtu 1600 + no switchport + ip address 100.64.48.22/31 + mpls ip +! +interface Loopback0 + description LSR_Router_ID + no shutdown + ip address 10.0.0.4/32 + ipv6 address 2000:1234:ffff:ffff::4/128 +! +ip routing +no ip routing vrf MGMT +! +ipv6 unicast-routing +! +ip prefix-list PL-LOOPBACKS-EVPN-OVERLAY + seq 10 permit 10.0.0.0/24 eq 32 +! +ipv6 prefix-list PL-LOOPBACKS-EVPN-OVERLAY-V6 + seq 10 permit 2000:1234:ffff:ffff::/64 eq 128 +! +ip route vrf MGMT 0.0.0.0/0 192.168.0.1 +! +route-map RM-CONN-2-BGP permit 10 + match ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY +! +route-map RM-CONN-2-BGP permit 30 + match ipv6 address prefix-list PL-LOOPBACKS-EVPN-OVERLAY-V6 +! +router bgp 65000 + router-id 10.0.0.4 + maximum-paths 4 ecmp 4 + update wait-install + no bgp default ipv4-unicast + neighbor IPv4-UNDERLAY-PEERS peer group + neighbor IPv4-UNDERLAY-PEERS send-community + neighbor IPv4-UNDERLAY-PEERS maximum-routes 12000 + neighbor 100.64.48.19 peer group IPv4-UNDERLAY-PEERS + neighbor 100.64.48.19 remote-as 65002 + neighbor 100.64.48.19 local-as 65001 no-prepend replace-as + neighbor 100.64.48.19 description peer1 + neighbor 100.64.48.21 peer group IPv4-UNDERLAY-PEERS + neighbor 100.64.48.21 remote-as 65003 + neighbor 100.64.48.21 local-as 65001 no-prepend replace-as + neighbor 100.64.48.21 description peer2 + neighbor 100.64.48.23 peer group IPv4-UNDERLAY-PEERS + neighbor 100.64.48.23 remote-as 65004 + neighbor 100.64.48.23 local-as 65001 no-prepend replace-as + neighbor 100.64.48.23 description peer3 + redistribute connected route-map RM-CONN-2-BGP + ! + address-family ipv4 + neighbor IPv4-UNDERLAY-PEERS activate + ! + address-family ipv6 + neighbor IPv4-UNDERLAY-PEERS activate +! +router multicast + ipv4 + routing +! +management api http-commands + protocol https + no shutdown + ! + vrf MGMT + no shutdown +! +end diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-custom-control-plane-policy-edge-1.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-custom-control-plane-policy-edge-1.cfg index 16dd06eb2c5..90b5326d3b8 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-custom-control-plane-policy-edge-1.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-custom-control-plane-policy-edge-1.cfg @@ -14,8 +14,6 @@ flow tracking hardware ! service routing protocols model multi-agent ! -ip as-path access-list ASPATH-WAN permit 65000 any -! hostname cv-pathfinder-custom-control-plane-policy-edge-1 ! router adaptive-virtual-topology @@ -217,14 +215,6 @@ route-map RM-BGP-UNDERLAY-PEERS-IN permit 40 description Mark prefixes originated from the LAN set extcommunity soo 192.168.42.1:511 additive ! -route-map RM-BGP-UNDERLAY-PEERS-OUT permit 10 - description Advertise local routes towards LAN - match extcommunity ECL-EVPN-SOO -! -route-map RM-BGP-UNDERLAY-PEERS-OUT permit 20 - description Advertise routes received from WAN iBGP towards LAN - match route-type internal -! route-map RM-CONN-2-BGP permit 10 match ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY set extcommunity soo 192.168.42.1:511 additive @@ -252,7 +242,6 @@ router bgp 65000 neighbor IPv4-UNDERLAY-PEERS send-community neighbor IPv4-UNDERLAY-PEERS maximum-routes 12000 neighbor IPv4-UNDERLAY-PEERS route-map RM-BGP-UNDERLAY-PEERS-IN in - neighbor IPv4-UNDERLAY-PEERS route-map RM-BGP-UNDERLAY-PEERS-OUT out neighbor WAN-OVERLAY-PEERS peer group neighbor WAN-OVERLAY-PEERS remote-as 65000 neighbor WAN-OVERLAY-PEERS update-source Dps1 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-custom-control-plane-policy-edge-2.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-custom-control-plane-policy-edge-2.cfg index 77c1e4c8e31..bd946fdf25b 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-custom-control-plane-policy-edge-2.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-custom-control-plane-policy-edge-2.cfg @@ -14,8 +14,6 @@ flow tracking hardware ! service routing protocols model multi-agent ! -ip as-path access-list ASPATH-WAN permit 65000 any -! hostname cv-pathfinder-custom-control-plane-policy-edge-2 ! router adaptive-virtual-topology @@ -217,14 +215,6 @@ route-map RM-BGP-UNDERLAY-PEERS-IN permit 40 description Mark prefixes originated from the LAN set extcommunity soo 192.168.42.2:511 additive ! -route-map RM-BGP-UNDERLAY-PEERS-OUT permit 10 - description Advertise local routes towards LAN - match extcommunity ECL-EVPN-SOO -! -route-map RM-BGP-UNDERLAY-PEERS-OUT permit 20 - description Advertise routes received from WAN iBGP towards LAN - match route-type internal -! route-map RM-CONN-2-BGP permit 10 match ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY set extcommunity soo 192.168.42.2:511 additive @@ -252,7 +242,6 @@ router bgp 65000 neighbor IPv4-UNDERLAY-PEERS send-community neighbor IPv4-UNDERLAY-PEERS maximum-routes 12000 neighbor IPv4-UNDERLAY-PEERS route-map RM-BGP-UNDERLAY-PEERS-IN in - neighbor IPv4-UNDERLAY-PEERS route-map RM-BGP-UNDERLAY-PEERS-OUT out neighbor WAN-OVERLAY-PEERS peer group neighbor WAN-OVERLAY-PEERS remote-as 65000 neighbor WAN-OVERLAY-PEERS update-source Dps1 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-custom-control-plane-policy-edge-3.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-custom-control-plane-policy-edge-3.cfg index 41b470d732d..d5f629c5028 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-custom-control-plane-policy-edge-3.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-custom-control-plane-policy-edge-3.cfg @@ -14,8 +14,6 @@ flow tracking hardware ! service routing protocols model multi-agent ! -ip as-path access-list ASPATH-WAN permit 65000 any -! hostname cv-pathfinder-custom-control-plane-policy-edge-3 ! router adaptive-virtual-topology @@ -186,14 +184,6 @@ route-map RM-BGP-UNDERLAY-PEERS-IN permit 40 description Mark prefixes originated from the LAN set extcommunity soo 192.168.42.3:511 additive ! -route-map RM-BGP-UNDERLAY-PEERS-OUT permit 10 - description Advertise local routes towards LAN - match extcommunity ECL-EVPN-SOO -! -route-map RM-BGP-UNDERLAY-PEERS-OUT permit 20 - description Advertise routes received from WAN iBGP towards LAN - match route-type internal -! route-map RM-CONN-2-BGP permit 10 match ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY set extcommunity soo 192.168.42.3:511 additive @@ -221,7 +211,6 @@ router bgp 65000 neighbor IPv4-UNDERLAY-PEERS send-community neighbor IPv4-UNDERLAY-PEERS maximum-routes 12000 neighbor IPv4-UNDERLAY-PEERS route-map RM-BGP-UNDERLAY-PEERS-IN in - neighbor IPv4-UNDERLAY-PEERS route-map RM-BGP-UNDERLAY-PEERS-OUT out neighbor WAN-OVERLAY-PEERS peer group neighbor WAN-OVERLAY-PEERS remote-as 65000 neighbor WAN-OVERLAY-PEERS update-source Dps1 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-custom-control-plane-policy-pathfinder-1.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-custom-control-plane-policy-pathfinder-1.cfg index fae77b66b83..4200b6f3e98 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-custom-control-plane-policy-pathfinder-1.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-custom-control-plane-policy-pathfinder-1.cfg @@ -251,7 +251,6 @@ router bgp 65000 neighbor IPv4-UNDERLAY-PEERS send-community neighbor IPv4-UNDERLAY-PEERS maximum-routes 12000 neighbor IPv4-UNDERLAY-PEERS route-map RM-BGP-UNDERLAY-PEERS-IN in - neighbor IPv4-UNDERLAY-PEERS route-map RM-BGP-UNDERLAY-PEERS-OUT out neighbor WAN-OVERLAY-PEERS peer group neighbor WAN-OVERLAY-PEERS remote-as 65000 neighbor WAN-OVERLAY-PEERS update-source Dps1 @@ -265,6 +264,7 @@ router bgp 65000 neighbor WAN-RR-OVERLAY-PEERS peer group neighbor WAN-RR-OVERLAY-PEERS remote-as 65000 neighbor WAN-RR-OVERLAY-PEERS update-source Dps1 + neighbor WAN-RR-OVERLAY-PEERS route-reflector-client neighbor WAN-RR-OVERLAY-PEERS bfd neighbor WAN-RR-OVERLAY-PEERS bfd interval 1000 min-rx 1000 multiplier 10 neighbor WAN-RR-OVERLAY-PEERS ttl maximum-hops 1 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-edge-custom-default-policy.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-edge-custom-default-policy.cfg index 9966eb6cac0..620767bd7c3 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-edge-custom-default-policy.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-edge-custom-default-policy.cfg @@ -87,7 +87,7 @@ router path-selection path-group MPLS id 100 ! local interface Ethernet2 - stun server-profile MPLS-cv-pathfinder-pathfinder-Ethernet2 + stun server-profile MPLS-cv-pathfinder-pathfinder-Ethernet2_2 ! peer dynamic ! @@ -300,7 +300,7 @@ stun server-profile INET-cv-pathfinder-pathfinder-Ethernet3 ip address 10.9.9.9 ssl profile STUN-DTLS - server-profile MPLS-cv-pathfinder-pathfinder-Ethernet2 + server-profile MPLS-cv-pathfinder-pathfinder-Ethernet2_2 ip address 172.16.0.1 ssl profile STUN-DTLS ! diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-edge-no-default-policy.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-edge-no-default-policy.cfg index 22603dcd51b..58df86958d6 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-edge-no-default-policy.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-edge-no-default-policy.cfg @@ -81,7 +81,7 @@ router path-selection ipsec profile CP-PROFILE ! local interface Ethernet2 - stun server-profile MPLS-cv-pathfinder-pathfinder-Ethernet2 + stun server-profile MPLS-cv-pathfinder-pathfinder-Ethernet2_2 ! peer dynamic ipsec disabled @@ -299,7 +299,7 @@ stun server-profile INET-cv-pathfinder-pathfinder-Ethernet3 ip address 10.9.9.9 ssl profile STUN-DTLS - server-profile MPLS-cv-pathfinder-pathfinder-Ethernet2 + server-profile MPLS-cv-pathfinder-pathfinder-Ethernet2_2 ip address 172.16.0.1 ssl profile STUN-DTLS ! diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-edge.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-edge.cfg index a51865733f0..de2f3e9e913 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-edge.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-edge.cfg @@ -14,7 +14,12 @@ flow tracking hardware ! service routing protocols model multi-agent ! -ip as-path access-list ASPATH-WAN permit 65000 any +! +ip nat profile NAT-IE-DIRECT + ip nat source dynamic access-list ACL-NAT-IE-DIRECT overload +! +ip nat profile NAT-IE-ZSCALER + ip nat source dynamic access-list ACL-NAT-IE-ZSCALER pool PORT-ONLY-POOL ! hostname cv-pathfinder-edge ! @@ -69,6 +74,7 @@ router adaptive-virtual-topology path-selection load-balance LB-DEFAULT-AVT-POLICY-DEFAULT ! profile DEFAULT-AVT-POLICY-VIDEO + internet-exit policy DIRECT-EXIT-POLICY-1 path-selection load-balance LB-DEFAULT-AVT-POLICY-VIDEO ! profile DEFAULT-POLICY-DEFAULT @@ -84,6 +90,7 @@ router adaptive-virtual-topology path-selection load-balance LB-PROD-AVT-POLICY-VIDEO ! profile PROD-AVT-POLICY-VOICE + internet-exit policy ZSCALER-EXIT-POLICY-1 path-selection load-balance LB-PROD-AVT-POLICY-VOICE ! vrf ATTRACTED-VRF-FROM-UPLINK @@ -108,6 +115,30 @@ router adaptive-virtual-topology avt profile PROD-AVT-POLICY-VIDEO id 4 avt profile PROD-AVT-POLICY-MPLS-ONLY id 5 ! +router internet-exit + ! + exit-group DIRECT-EXIT-POLICY-1 + local connection IE-Ethernet2 + local connection IE-Ethernet2_1 + ! + exit-group ZSCALER-EXIT-POLICY-1_PRI + local connection IE-Tunnel100 + ! + exit-group ZSCALER-EXIT-POLICY-1_SEC + local connection IE-Tunnel101 + ! + exit-group ZSCALER-EXIT-POLICY-1_TER + local connection IE-Tunnel102 + ! + policy DIRECT-EXIT-POLICY-1 + exit-group DIRECT-EXIT-POLICY-1 + ! + policy ZSCALER-EXIT-POLICY-1 + exit-group ZSCALER-EXIT-POLICY-1_PRI + exit-group ZSCALER-EXIT-POLICY-1_SEC + exit-group ZSCALER-EXIT-POLICY-1_TER + exit-group system-default-exit-group +! router path-selection tcp mss ceiling ipv4 ingress ! @@ -136,7 +167,10 @@ router path-selection keepalive interval 300 milliseconds failure-threshold 5 intervals ! local interface Ethernet2 - stun server-profile MPLS-cv-pathfinder-pathfinder-Ethernet2 + stun server-profile MPLS-cv-pathfinder-pathfinder-Ethernet2_2 + ! + local interface Ethernet2/1 + stun server-profile MPLS-cv-pathfinder-pathfinder-Ethernet2_2 ! peer dynamic ipsec disabled @@ -180,6 +214,23 @@ router path-selection path-group MPLS path-group INET priority 2 ! +router service-insertion + connection IE-Ethernet2 + interface Ethernet2 next-hop 172.16.5.4 + monitor connectivity host IE-Ethernet2 + connection IE-Ethernet2_1 + interface Ethernet2/1 next-hop 172.16.5.9 + monitor connectivity host IE-Ethernet2_1 + connection IE-Tunnel100 + interface Tunnel100 primary + monitor connectivity host IE-Tunnel100 + connection IE-Tunnel101 + interface Tunnel101 primary + monitor connectivity host IE-Tunnel101 + connection IE-Tunnel102 + interface Tunnel102 primary + monitor connectivity host IE-Tunnel102 +! spanning-tree mode none ! no enable password @@ -198,6 +249,12 @@ ip security ike policy CP-IKE-POLICY local-id 192.168.142.1 ! + ike policy IE-ZSCALER-EXIT-POLICY-1-IKE-POLICY + local-id fqdn cv-pathfinder-edge_ZSCALER-EXIT-POLICY-1@test.local + ike-lifetime 24 + encryption aes256 + dh-group 24 + ! sa policy DP-SA-POLICY esp encryption aes256gcm128 pfs dh-group 14 @@ -206,6 +263,12 @@ ip security esp encryption aes256gcm128 pfs dh-group 14 ! + sa policy IE-ZSCALER-EXIT-POLICY-1-SA-POLICY + esp integrity sha256 + esp encryption aes256 + sa lifetime 8 hours + pfs dh-group 24 + ! profile DP-PROFILE sa-policy DP-SA-POLICY connection start @@ -221,6 +284,13 @@ ip security dpd 10 50 clear mode transport ! + profile IE-ZSCALER-EXIT-POLICY-1-PROFILE + ike-policy IE-ZSCALER-EXIT-POLICY-1-IKE-POLICY + sa-policy IE-ZSCALER-EXIT-POLICY-1-SA-POLICY + connection start + shared-key 7 0007054B145A1F0E0928424A0C0B4812160C093B101807091F10105E222E2A351B69777F7D2D3A5547666C7F7A616A672374332B7C68263639327A3E2A3B0468 + dpd 10 60 clear + ! key controller profile DP-PROFILE ! @@ -234,6 +304,7 @@ interface Ethernet1 description ATT_666_peer3_Ethernet42 no shutdown no switchport + flow tracker hardware FLOW-TRACKER ip address dhcp dhcp client accept default-route ! @@ -242,6 +313,14 @@ interface Ethernet2 no shutdown no switchport ip address 172.15.5.5/31 + ip nat service-profile NAT-IE-DIRECT +! +interface Ethernet2/1 + description Colt_10555 + no shutdown + no switchport + ip address 172.15.5.6/31 + ip nat service-profile NAT-IE-DIRECT ! interface Ethernet3 description Comcast-5G_AF830 @@ -285,6 +364,36 @@ interface Loopback0 no shutdown ip address 192.168.42.1/32 ! +interface Tunnel100 + description Internet Exit ZSCALER-EXIT-POLICY-1 PRI + mtu 1394 + ip address unnumbered Loopback0 + ip nat service-profile NAT-IE-ZSCALER + tunnel mode ipsec + tunnel source interface Ethernet3 + tunnel destination 10.37.121.1 + tunnel ipsec profile IE-ZSCALER-EXIT-POLICY-1-PROFILE +! +interface Tunnel101 + description Internet Exit ZSCALER-EXIT-POLICY-1 SEC + mtu 1394 + ip address unnumbered Loopback0 + ip nat service-profile NAT-IE-ZSCALER + tunnel mode ipsec + tunnel source interface Ethernet3 + tunnel destination 10.39.77.1 + tunnel ipsec profile IE-ZSCALER-EXIT-POLICY-1-PROFILE +! +interface Tunnel102 + description Internet Exit ZSCALER-EXIT-POLICY-1 TER + mtu 1394 + ip address unnumbered Loopback0 + ip nat service-profile NAT-IE-ZSCALER + tunnel mode ipsec + tunnel source interface Ethernet3 + tunnel destination 10.50.9.1 + tunnel ipsec profile IE-ZSCALER-EXIT-POLICY-1-PROFILE +! interface Vxlan1 description cv-pathfinder-edge_VTEP vxlan source-interface Dps1 @@ -339,6 +448,55 @@ application traffic recognition field-set l4-port TCP-SRC-2 42 ! +monitor connectivity + no shutdown + interface set SET-Ethernet2 Ethernet2 + interface set SET-Ethernet2_1 Ethernet2/1 + interface set SET-Tunnel100 Tunnel100 + interface set SET-Tunnel101 Tunnel101 + interface set SET-Tunnel102 Tunnel102 + ! + host IE-Ethernet2 + description + Internet Exit DIRECT-EXIT-POLICY-1 + local-interfaces SET-Ethernet2 + ip 172.16.5.4 + ! + host IE-Ethernet2_1 + description + Internet Exit DIRECT-EXIT-POLICY-1 + local-interfaces SET-Ethernet2_1 + ip 172.16.5.9 + ! + host IE-Tunnel100 + description + Internet Exit ZSCALER-EXIT-POLICY-1 PRI + local-interfaces SET-Tunnel100 + ip 10.37.121.1 + url http://gateway.zscalerbeta.net/vpntest + ! + host IE-Tunnel101 + description + Internet Exit ZSCALER-EXIT-POLICY-1 SEC + local-interfaces SET-Tunnel101 + ip 10.39.77.1 + url http://gateway.zscalerbeta.net/vpntest + ! + host IE-Tunnel102 + description + Internet Exit ZSCALER-EXIT-POLICY-1 TER + local-interfaces SET-Tunnel102 + ip 10.50.9.1 + url http://gateway.zscalerbeta.net/vpntest +! +ip access-list ACL-NAT-IE-DIRECT + 10 deny ip host 172.15.5.5 any + 20 deny ip host 172.15.5.6 any + 30 permit ip any any +! +ip access-list ACL-NAT-IE-ZSCALER + 10 permit ip any any +! ip routing ip routing vrf ATTRACTED-VRF-FROM-UPLINK ip routing vrf IT @@ -347,6 +505,9 @@ ip routing vrf PROD ! ip extcommunity-list ECL-EVPN-SOO permit soo 192.168.42.1:511 ! +ip prefix-list ALLOW-DEFAULT + seq 10 permit 0.0.0.0/0 +! ip prefix-list PL-LOOPBACKS-EVPN-OVERLAY seq 10 permit 192.168.42.0/24 eq 32 ! @@ -354,20 +515,34 @@ ip prefix-list PL-STATIC-VRF-DEFAULT seq 10 permit 66.66.66.0/24 ! ip route 172.16.0.0/16 172.16.5.4 +ip route 172.16.0.0/16 172.16.5.9 ip route 66.66.66.0/24 172.17.0.0 +ip route 10.37.121.1/32 172.20.20.21 name IE-ZSCALER-PRI +ip route 10.39.77.1/32 172.20.20.21 name IE-ZSCALER-SEC +ip route 10.50.9.1/32 172.20.20.21 name IE-ZSCALER-TER +! +ip nat pool PORT-ONLY-POOL port-only + port range 1500 65535 +! +route-map RM-BGP-172.16.5.4-IN permit 10 + match ip address prefix-list ALLOW-DEFAULT + set community no-advertise additive +! +route-map RM-BGP-172.16.5.4-OUT permit 10 + match ip address prefix-list ALLOW-DEFAULT +! +route-map RM-BGP-172.16.5.4-OUT deny 20 +! +route-map RM-BGP-172.16.9.4-IN permit 10 + match ip address prefix-list ALLOW-DEFAULT + set community no-advertise additive +! +route-map RM-BGP-172.16.9.4-OUT deny 10 ! route-map RM-BGP-UNDERLAY-PEERS-IN permit 40 description Mark prefixes originated from the LAN set extcommunity soo 192.168.42.1:511 additive ! -route-map RM-BGP-UNDERLAY-PEERS-OUT permit 10 - description Advertise local routes towards LAN - match extcommunity ECL-EVPN-SOO -! -route-map RM-BGP-UNDERLAY-PEERS-OUT permit 20 - description Advertise routes received from WAN iBGP towards LAN - match route-type internal -! route-map RM-CONN-2-BGP permit 10 match ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY set extcommunity soo 192.168.42.1:511 additive @@ -409,6 +584,14 @@ router bgp 65000 neighbor WAN-OVERLAY-PEERS password 7 htm4AZe9mIQOO1uiMuGgYQ== neighbor WAN-OVERLAY-PEERS send-community neighbor WAN-OVERLAY-PEERS maximum-routes 0 + neighbor 172.16.5.4 remote-as 64520 + neighbor 172.16.5.4 description Colt_10555 + neighbor 172.16.5.4 route-map RM-BGP-172.16.5.4-IN in + neighbor 172.16.5.4 route-map RM-BGP-172.16.5.4-OUT out + neighbor 172.16.9.4 remote-as 64520 + neighbor 172.16.9.4 description ATT_666_peer3_Ethernet42 + neighbor 172.16.9.4 route-map RM-BGP-172.16.9.4-IN in + neighbor 172.16.9.4 route-map RM-BGP-172.16.9.4-OUT out neighbor 172.17.0.0 peer group IPv4-UNDERLAY-PEERS neighbor 172.17.0.0 remote-as 65199 neighbor 172.17.0.0 description site-ha-disabled-leaf_Ethernet1 @@ -497,7 +680,7 @@ stun server-profile INET-cv-pathfinder-pathfinder-Ethernet3 ip address 10.9.9.9 ssl profile profileA - server-profile MPLS-cv-pathfinder-pathfinder-Ethernet2 + server-profile MPLS-cv-pathfinder-pathfinder-Ethernet2_2 ip address 172.16.0.1 ssl profile profileA ! diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-edge1.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-edge1.cfg index 6ecf428799b..6f9a71b5bde 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-edge1.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-edge1.cfg @@ -14,7 +14,12 @@ flow tracking hardware ! service routing protocols model multi-agent ! -ip as-path access-list ASPATH-WAN permit 65000 any +! +ip nat profile NAT-IE-DIRECT + ip nat source dynamic access-list ACL-NAT-IE-DIRECT overload +! +ip nat profile NAT-IE-ZSCALER + ip nat source dynamic access-list ACL-NAT-IE-ZSCALER pool PORT-ONLY-POOL ! hostname cv-pathfinder-edge1 ! @@ -66,6 +71,7 @@ router adaptive-virtual-topology path-selection load-balance LB-DEFAULT-AVT-POLICY-DEFAULT ! profile DEFAULT-AVT-POLICY-VIDEO + internet-exit policy DIRECT-EXIT-POLICY-1 path-selection load-balance LB-DEFAULT-AVT-POLICY-VIDEO ! profile DEFAULT-POLICY-DEFAULT @@ -75,9 +81,11 @@ router adaptive-virtual-topology path-selection load-balance LB-PROD-AVT-POLICY-DEFAULT ! profile PROD-AVT-POLICY-VIDEO + internet-exit policy ZSCALER-EXIT-POLICY-2 path-selection load-balance LB-PROD-AVT-POLICY-VIDEO ! profile PROD-AVT-POLICY-VOICE + internet-exit policy ZSCALER-EXIT-POLICY-1 path-selection load-balance LB-PROD-AVT-POLICY-VOICE ! vrf ATTRACTED-VRF-FROM-UPLINK @@ -101,6 +109,43 @@ router adaptive-virtual-topology avt profile PROD-AVT-POLICY-VOICE id 2 avt profile PROD-AVT-POLICY-VIDEO id 4 ! +router internet-exit + ! + exit-group DIRECT-EXIT-POLICY-1 + local connection IE-Ethernet3 + ! + exit-group ZSCALER-EXIT-POLICY-1_PRI + local connection IE-Tunnel100 + ! + exit-group ZSCALER-EXIT-POLICY-1_SEC + local connection IE-Tunnel101 + ! + exit-group ZSCALER-EXIT-POLICY-1_TER + local connection IE-Tunnel102 + ! + exit-group ZSCALER-EXIT-POLICY-2_PRI + local connection IE-Tunnel110 + ! + exit-group ZSCALER-EXIT-POLICY-2_SEC + local connection IE-Tunnel111 + ! + exit-group ZSCALER-EXIT-POLICY-2_TER + local connection IE-Tunnel112 + ! + policy DIRECT-EXIT-POLICY-1 + exit-group DIRECT-EXIT-POLICY-1 + ! + policy ZSCALER-EXIT-POLICY-1 + exit-group ZSCALER-EXIT-POLICY-1_PRI + exit-group ZSCALER-EXIT-POLICY-1_SEC + exit-group ZSCALER-EXIT-POLICY-1_TER + exit-group system-default-exit-group + ! + policy ZSCALER-EXIT-POLICY-2 + exit-group ZSCALER-EXIT-POLICY-2_PRI + exit-group ZSCALER-EXIT-POLICY-2_SEC + exit-group ZSCALER-EXIT-POLICY-2_TER +! router path-selection tcp mss ceiling ipv4 ingress ! @@ -115,20 +160,23 @@ router path-selection ipsec profile CP-PROFILE ! local interface Ethernet3 - stun server-profile INET-cv-pathfinder-pathfinder-Ethernet1 INET-cv-pathfinder-pathfinder-Ethernet3 + stun server-profile INET-cv-pathfinder-pathfinder1-Ethernet1 INET-cv-pathfinder-pathfinder2-Ethernet1 ! peer dynamic ! - peer static router-ip 192.168.144.1 - name cv-pathfinder-pathfinder - ipv4 address 172.17.7.7 - ipv4 address 10.9.9.9 + peer static router-ip 192.168.144.2 + name cv-pathfinder-pathfinder1 + ipv4 address 10.8.8.8 + ! + peer static router-ip 192.168.144.3 + name cv-pathfinder-pathfinder2 + ipv4 address 10.9.9.6 ! path-group Satellite id 104 ipsec profile CP-PROFILE keepalive interval auto ! - local interface Ethernet1 + local interface Ethernet1/49.3 ! peer dynamic ! @@ -159,6 +207,29 @@ router path-selection jitter 42 path-group INET priority 2 ! +router service-insertion + connection IE-Ethernet3 + interface Ethernet3 next-hop 172.31.0.1 + monitor connectivity host IE-Ethernet3 + connection IE-Tunnel100 + interface Tunnel100 primary + monitor connectivity host IE-Tunnel100 + connection IE-Tunnel101 + interface Tunnel101 primary + monitor connectivity host IE-Tunnel101 + connection IE-Tunnel102 + interface Tunnel102 primary + monitor connectivity host IE-Tunnel102 + connection IE-Tunnel110 + interface Tunnel110 primary + monitor connectivity host IE-Tunnel110 + connection IE-Tunnel111 + interface Tunnel111 primary + monitor connectivity host IE-Tunnel111 + connection IE-Tunnel112 + interface Tunnel112 primary + monitor connectivity host IE-Tunnel112 +! spanning-tree mode none ! no enable password @@ -177,6 +248,18 @@ ip security ike policy CP-IKE-POLICY local-id 192.168.142.2 ! + ike policy IE-ZSCALER-EXIT-POLICY-1-IKE-POLICY + local-id fqdn cv-pathfinder-edge1_ZSCALER-EXIT-POLICY-1@test.local + ike-lifetime 24 + encryption aes256 + dh-group 24 + ! + ike policy IE-ZSCALER-EXIT-POLICY-2-IKE-POLICY + local-id fqdn cv-pathfinder-edge1_ZSCALER-EXIT-POLICY-2@test.local + ike-lifetime 24 + encryption aes256 + dh-group 24 + ! sa policy DP-SA-POLICY esp encryption aes256gcm128 pfs dh-group 14 @@ -185,6 +268,18 @@ ip security esp encryption aes256gcm128 pfs dh-group 14 ! + sa policy IE-ZSCALER-EXIT-POLICY-1-SA-POLICY + esp integrity sha256 + esp encryption aes256 + sa lifetime 8 hours + pfs dh-group 24 + ! + sa policy IE-ZSCALER-EXIT-POLICY-2-SA-POLICY + esp integrity sha256 + esp encryption aes256 + sa lifetime 8 hours + pfs dh-group 24 + ! profile DP-PROFILE sa-policy DP-SA-POLICY connection start @@ -200,6 +295,20 @@ ip security dpd 10 50 clear mode transport ! + profile IE-ZSCALER-EXIT-POLICY-1-PROFILE + ike-policy IE-ZSCALER-EXIT-POLICY-1-IKE-POLICY + sa-policy IE-ZSCALER-EXIT-POLICY-1-SA-POLICY + connection start + shared-key 7 0007054B145A1F0E0928424A0C0B4812160C09551511170B121907214A333B286214687C782720215B0867637B7B666B3873293274733B31233B6D2A332315696A + dpd 10 60 clear + ! + profile IE-ZSCALER-EXIT-POLICY-2-PROFILE + ike-policy IE-ZSCALER-EXIT-POLICY-2-IKE-POLICY + sa-policy IE-ZSCALER-EXIT-POLICY-2-SA-POLICY + connection start + shared-key 7 0007054B145A1F0E0928424A0C0B4812160C09551511170B121907214A333B286214687C782720215B0B67637B7B666B3873293274733B31233B6D2A332315696A + dpd 10 60 clear + ! key controller profile DP-PROFILE ! @@ -209,11 +318,16 @@ interface Dps1 flow tracker hardware FLOW-TRACKER ip address 192.168.142.2/32 ! -interface Ethernet1 - description Inmrasat_S511 +interface Ethernet1/49 no shutdown no switchport +! +interface Ethernet1/49.3 + description Inmrasat_S511 + no shutdown + encapsulation dot1q vlan 3 ip address dhcp + ip access-group TEST-IPV4-ACL-WITH-IP-FIELDS-IN_Ethernet1_49.3 in ! interface Ethernet2 description AWS-1_212 @@ -228,6 +342,19 @@ interface Ethernet3 no switchport ip address dhcp dhcp client accept default-route + ip nat service-profile NAT-IE-DIRECT +! +interface Ethernet4 + no shutdown + no switchport + ip address dhcp + dhcp client accept default-route +! +interface Ethernet5 + no shutdown + no switchport + ip address dhcp + dhcp client accept default-route ! interface Ethernet52 description P2P_LINK_TO_SITE-HA-DISABLED-LEAF_Ethernet2 @@ -265,6 +392,66 @@ interface Loopback0 no shutdown ip address 192.168.42.2/32 ! +interface Tunnel100 + description Internet Exit ZSCALER-EXIT-POLICY-1 PRI + mtu 1394 + ip address unnumbered Loopback0 + ip nat service-profile NAT-IE-ZSCALER + tunnel mode ipsec + tunnel source interface Ethernet3 + tunnel destination 10.37.121.1 + tunnel ipsec profile IE-ZSCALER-EXIT-POLICY-1-PROFILE +! +interface Tunnel101 + description Internet Exit ZSCALER-EXIT-POLICY-1 SEC + mtu 1394 + ip address unnumbered Loopback0 + ip nat service-profile NAT-IE-ZSCALER + tunnel mode ipsec + tunnel source interface Ethernet3 + tunnel destination 10.39.77.1 + tunnel ipsec profile IE-ZSCALER-EXIT-POLICY-1-PROFILE +! +interface Tunnel102 + description Internet Exit ZSCALER-EXIT-POLICY-1 TER + mtu 1394 + ip address unnumbered Loopback0 + ip nat service-profile NAT-IE-ZSCALER + tunnel mode ipsec + tunnel source interface Ethernet3 + tunnel destination 10.50.9.1 + tunnel ipsec profile IE-ZSCALER-EXIT-POLICY-1-PROFILE +! +interface Tunnel110 + description Internet Exit ZSCALER-EXIT-POLICY-2 PRI + mtu 1394 + ip address unnumbered Loopback0 + ip nat service-profile NAT-IE-ZSCALER + tunnel mode ipsec + tunnel source interface Ethernet3 + tunnel destination 10.37.121.1 + tunnel ipsec profile IE-ZSCALER-EXIT-POLICY-2-PROFILE +! +interface Tunnel111 + description Internet Exit ZSCALER-EXIT-POLICY-2 SEC + mtu 1394 + ip address unnumbered Loopback0 + ip nat service-profile NAT-IE-ZSCALER + tunnel mode ipsec + tunnel source interface Ethernet3 + tunnel destination 10.39.77.1 + tunnel ipsec profile IE-ZSCALER-EXIT-POLICY-2-PROFILE +! +interface Tunnel112 + description Internet Exit ZSCALER-EXIT-POLICY-2 TER + mtu 1394 + ip address unnumbered Loopback0 + ip nat service-profile NAT-IE-ZSCALER + tunnel mode ipsec + tunnel source interface Ethernet3 + tunnel destination 10.50.9.1 + tunnel ipsec profile IE-ZSCALER-EXIT-POLICY-2-PROFILE +! interface Vxlan1 description cv-pathfinder-edge1_VTEP vxlan source-interface Dps1 @@ -309,7 +496,7 @@ application traffic recognition 42.42.42.0/24 ! field-set ipv4 prefix PFX-PATHFINDERS - 192.168.144.1/32 + 192.168.144.2/32 192.168.144.3/32 ! field-set l4-port TCP-DEST-2 666, 777 @@ -317,6 +504,76 @@ application traffic recognition field-set l4-port TCP-SRC-2 42 ! +monitor connectivity + no shutdown + interface set SET-Ethernet3 Ethernet3 + interface set SET-Tunnel100 Tunnel100 + interface set SET-Tunnel101 Tunnel101 + interface set SET-Tunnel102 Tunnel102 + interface set SET-Tunnel110 Tunnel110 + interface set SET-Tunnel111 Tunnel111 + interface set SET-Tunnel112 Tunnel112 + ! + host IE-Ethernet3 + description + Internet Exit DIRECT-EXIT-POLICY-1 + local-interfaces SET-Ethernet3 + ip 172.31.0.1 + ! + host IE-Tunnel100 + description + Internet Exit ZSCALER-EXIT-POLICY-1 PRI + local-interfaces SET-Tunnel100 + ip 10.37.121.1 + url http://gateway.zscalerbeta.net/vpntest + ! + host IE-Tunnel101 + description + Internet Exit ZSCALER-EXIT-POLICY-1 SEC + local-interfaces SET-Tunnel101 + ip 10.39.77.1 + url http://gateway.zscalerbeta.net/vpntest + ! + host IE-Tunnel102 + description + Internet Exit ZSCALER-EXIT-POLICY-1 TER + local-interfaces SET-Tunnel102 + ip 10.50.9.1 + url http://gateway.zscalerbeta.net/vpntest + ! + host IE-Tunnel110 + description + Internet Exit ZSCALER-EXIT-POLICY-2 PRI + local-interfaces SET-Tunnel110 + ip 10.37.121.1 + url http://gateway.zscalerbeta.net/vpntest + ! + host IE-Tunnel111 + description + Internet Exit ZSCALER-EXIT-POLICY-2 SEC + local-interfaces SET-Tunnel111 + ip 10.39.77.1 + url http://gateway.zscalerbeta.net/vpntest + ! + host IE-Tunnel112 + description + Internet Exit ZSCALER-EXIT-POLICY-2 TER + local-interfaces SET-Tunnel112 + ip 10.50.9.1 + url http://gateway.zscalerbeta.net/vpntest +! +ip access-list TEST-IPV4-ACL-WITH-IP-FIELDS-IN_Ethernet1_49.3 + 15 deny ip any host 172.24.49.3 + permit ip host 172.24.49.2 host 172.24.49.3 +! +ip access-list ACL-NAT-IE-DIRECT + 10 deny ip any 5.0.0.0/24 + 20 permit ip any any +! +ip access-list ACL-NAT-IE-ZSCALER + 10 permit ip any 10.0.0.0/24 + 20 deny ip any any +! ip routing ip routing vrf ATTRACTED-VRF-FROM-UPLINK ip routing vrf IT @@ -325,21 +582,40 @@ ip routing vrf PROD ! ip extcommunity-list ECL-EVPN-SOO permit soo 192.168.42.2:511 ! +ip prefix-list ALLOW-DEFAULT + seq 10 permit 0.0.0.0/0 +! +ip prefix-list PL2 + seq 10 permit 5.0.0.0/0 + seq 20 deny 10.00.0.0/24 +! ip prefix-list PL-LOOPBACKS-EVPN-OVERLAY seq 10 permit 192.168.42.0/24 eq 32 ! +ip route 10.37.121.1/32 172.31.0.1 name IE-ZSCALER-PRI +ip route 10.39.77.1/32 172.31.0.1 name IE-ZSCALER-SEC +ip route 10.50.9.1/32 172.31.0.1 name IE-ZSCALER-TER +! +ip nat pool PORT-ONLY-POOL port-only + port range 1500 65535 +! +route-map RM-BGP-172.28.0.14-OUT permit 10 + match ip address prefix-list PL2 +! +route-map RM-BGP-172.28.0.14-OUT deny 20 +! +route-map RM-BGP-172.29.0.13-IN permit 10 + match ip address prefix-list PL2 +! +route-map RM-BGP-172.29.0.13-OUT permit 10 + match ip address prefix-list ALLOW-DEFAULT +! +route-map RM-BGP-172.29.0.13-OUT deny 20 +! route-map RM-BGP-UNDERLAY-PEERS-IN permit 40 description Mark prefixes originated from the LAN set extcommunity soo 192.168.42.2:511 additive ! -route-map RM-BGP-UNDERLAY-PEERS-OUT permit 10 - description Advertise local routes towards LAN - match extcommunity ECL-EVPN-SOO -! -route-map RM-BGP-UNDERLAY-PEERS-OUT permit 20 - description Advertise routes received from WAN iBGP towards LAN - match route-type internal -! route-map RM-CONN-2-BGP permit 10 match ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY set extcommunity soo 192.168.42.2:511 additive @@ -367,7 +643,6 @@ router bgp 65000 neighbor IPv4-UNDERLAY-PEERS send-community neighbor IPv4-UNDERLAY-PEERS maximum-routes 12000 neighbor IPv4-UNDERLAY-PEERS route-map RM-BGP-UNDERLAY-PEERS-IN in - neighbor IPv4-UNDERLAY-PEERS route-map RM-BGP-UNDERLAY-PEERS-OUT out neighbor WAN-OVERLAY-PEERS peer group neighbor WAN-OVERLAY-PEERS remote-as 65000 neighbor WAN-OVERLAY-PEERS update-source Dps1 @@ -380,8 +655,15 @@ router bgp 65000 neighbor 172.17.0.2 peer group IPv4-UNDERLAY-PEERS neighbor 172.17.0.2 remote-as 65199 neighbor 172.17.0.2 description site-ha-disabled-leaf_Ethernet2 - neighbor 192.168.144.1 peer group WAN-OVERLAY-PEERS - neighbor 192.168.144.1 description cv-pathfinder-pathfinder + neighbor 172.28.0.14 remote-as 64520 + neighbor 172.28.0.14 route-map RM-BGP-172.28.0.14-OUT out + neighbor 172.29.0.13 remote-as 64520 + neighbor 172.29.0.13 route-map RM-BGP-172.29.0.13-IN in + neighbor 172.29.0.13 route-map RM-BGP-172.29.0.13-OUT out + neighbor 192.168.144.2 peer group WAN-OVERLAY-PEERS + neighbor 192.168.144.2 description cv-pathfinder-pathfinder1 + neighbor 192.168.144.3 peer group WAN-OVERLAY-PEERS + neighbor 192.168.144.3 description cv-pathfinder-pathfinder2 redistribute connected route-map RM-CONN-2-BGP ! address-family evpn @@ -458,11 +740,11 @@ management security ! stun client - server-profile INET-cv-pathfinder-pathfinder-Ethernet1 - ip address 172.17.7.7 + server-profile INET-cv-pathfinder-pathfinder1-Ethernet1 + ip address 10.8.8.8 ssl profile profileA - server-profile INET-cv-pathfinder-pathfinder-Ethernet3 - ip address 10.9.9.9 + server-profile INET-cv-pathfinder-pathfinder2-Ethernet1 + ip address 10.9.9.6 ssl profile profileA ! end diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-edge2A.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-edge2A.cfg index 9c79c02ec28..f7e1f1a922d 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-edge2A.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-edge2A.cfg @@ -364,31 +364,21 @@ route-map RM-BGP-UNDERLAY-PEERS-IN permit 10 description Allow WAN HA peer interface prefixes match ip address prefix-list PL-WAN-HA-PEER-PREFIXES ! -route-map RM-BGP-UNDERLAY-PEERS-IN permit 20 - description Allow prefixes originated from the HA peer - match extcommunity ECL-EVPN-SOO - set as-path match all replacement auto auto -! -route-map RM-BGP-UNDERLAY-PEERS-IN permit 30 - description Use WAN routes from HA peer as backup +route-map RM-BGP-UNDERLAY-PEERS-IN deny 20 + description Deny other routes from the HA peer match as-path ASPATH-WAN - set community no-advertise ! route-map RM-BGP-UNDERLAY-PEERS-IN permit 40 description Mark prefixes originated from the LAN set extcommunity soo 192.168.42.2:423 additive ! route-map RM-BGP-UNDERLAY-PEERS-OUT permit 10 - description Advertise local routes towards LAN - match extcommunity ECL-EVPN-SOO -! -route-map RM-BGP-UNDERLAY-PEERS-OUT permit 20 - description Advertise routes received from WAN iBGP towards LAN + description Make routes learned from WAN HA peer less preferred on LAN routers match route-type internal + match tag 50 + set metric 50 ! -route-map RM-BGP-UNDERLAY-PEERS-OUT permit 30 - description Advertise WAN HA prefixes towards LAN - match ip address prefix-list PL-WAN-HA-PREFIXES +route-map RM-BGP-UNDERLAY-PEERS-OUT permit 20 ! route-map RM-CONN-2-BGP permit 10 match ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY @@ -408,6 +398,19 @@ route-map RM-EVPN-SOO-IN permit 20 route-map RM-EVPN-SOO-OUT permit 10 set extcommunity soo 192.168.42.2:423 additive ! +route-map RM-WAN-HA-PEER-IN permit 10 + description Set tag 50 on routes received from HA peer over EVPN + set tag 50 +! +route-map RM-WAN-HA-PEER-OUT permit 10 + description Make EVPN routes learned from WAN less preferred on HA peer + match route-type internal + set local-preference 50 +! +route-map RM-WAN-HA-PEER-OUT permit 20 + description Make locally injected routes less preferred on HA peer + set local-preference 75 +! router bfd multihop interval 300 min-rx 300 multiplier 3 ! @@ -437,6 +440,13 @@ router bgp 65000 neighbor 172.17.0.6 peer group IPv4-UNDERLAY-PEERS neighbor 172.17.0.6 remote-as 65199 neighbor 172.17.0.6 description site-ha-enabled-leaf2B_Ethernet1 + neighbor 192.168.142.3 remote-as 65000 + neighbor 192.168.142.3 description cv-pathfinder-edge2B + neighbor 192.168.142.3 route-reflector-client + neighbor 192.168.142.3 update-source Dps1 + neighbor 192.168.142.3 route-map RM-WAN-HA-PEER-IN in + neighbor 192.168.142.3 route-map RM-WAN-HA-PEER-OUT out + neighbor 192.168.142.3 send-community neighbor 192.168.144.1 peer group WAN-OVERLAY-PEERS neighbor 192.168.144.1 description cv-pathfinder-pathfinder redistribute connected route-map RM-CONN-2-BGP @@ -445,6 +455,8 @@ router bgp 65000 neighbor WAN-OVERLAY-PEERS route-map RM-EVPN-SOO-IN in neighbor WAN-OVERLAY-PEERS route-map RM-EVPN-SOO-OUT out neighbor WAN-OVERLAY-PEERS activate + neighbor 192.168.142.3 activate + neighbor default next-hop-self received-evpn-routes route-type ip-prefix ! address-family ipv4 neighbor IPv4-UNDERLAY-PEERS activate diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-edge2B.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-edge2B.cfg index 8c1f9af6934..e2012f4c4fa 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-edge2B.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-edge2B.cfg @@ -128,7 +128,7 @@ router path-selection keepalive interval 300 milliseconds failure-threshold 5 intervals ! local interface Ethernet2 - stun server-profile MPLS-cv-pathfinder-pathfinder-Ethernet2 + stun server-profile MPLS-cv-pathfinder-pathfinder-Ethernet2_2 ! peer dynamic ipsec disabled @@ -376,31 +376,21 @@ route-map RM-BGP-UNDERLAY-PEERS-IN permit 10 description Allow WAN HA peer interface prefixes match ip address prefix-list PL-WAN-HA-PEER-PREFIXES ! -route-map RM-BGP-UNDERLAY-PEERS-IN permit 20 - description Allow prefixes originated from the HA peer - match extcommunity ECL-EVPN-SOO - set as-path match all replacement auto auto -! -route-map RM-BGP-UNDERLAY-PEERS-IN permit 30 - description Use WAN routes from HA peer as backup +route-map RM-BGP-UNDERLAY-PEERS-IN deny 20 + description Deny other routes from the HA peer match as-path ASPATH-WAN - set community no-advertise ! route-map RM-BGP-UNDERLAY-PEERS-IN permit 40 description Mark prefixes originated from the LAN set extcommunity soo 192.168.42.2:423 additive ! route-map RM-BGP-UNDERLAY-PEERS-OUT permit 10 - description Advertise local routes towards LAN - match extcommunity ECL-EVPN-SOO -! -route-map RM-BGP-UNDERLAY-PEERS-OUT permit 20 - description Advertise routes received from WAN iBGP towards LAN + description Make routes learned from WAN HA peer less preferred on LAN routers match route-type internal + match tag 50 + set metric 50 ! -route-map RM-BGP-UNDERLAY-PEERS-OUT permit 30 - description Advertise WAN HA prefixes towards LAN - match ip address prefix-list PL-WAN-HA-PREFIXES +route-map RM-BGP-UNDERLAY-PEERS-OUT permit 20 ! route-map RM-CONN-2-BGP permit 10 match ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY @@ -420,6 +410,19 @@ route-map RM-EVPN-SOO-IN permit 20 route-map RM-EVPN-SOO-OUT permit 10 set extcommunity soo 192.168.42.2:423 additive ! +route-map RM-WAN-HA-PEER-IN permit 10 + description Set tag 50 on routes received from HA peer over EVPN + set tag 50 +! +route-map RM-WAN-HA-PEER-OUT permit 10 + description Make EVPN routes learned from WAN less preferred on HA peer + match route-type internal + set local-preference 50 +! +route-map RM-WAN-HA-PEER-OUT permit 20 + description Make locally injected routes less preferred on HA peer + set local-preference 75 +! router bfd multihop interval 300 min-rx 300 multiplier 3 ! @@ -449,6 +452,13 @@ router bgp 65000 neighbor 172.17.0.10 peer group IPv4-UNDERLAY-PEERS neighbor 172.17.0.10 remote-as 65199 neighbor 172.17.0.10 description site-ha-enabled-leaf2B_Ethernet2 + neighbor 192.168.142.2 remote-as 65000 + neighbor 192.168.142.2 description cv-pathfinder-edge2A + neighbor 192.168.142.2 route-reflector-client + neighbor 192.168.142.2 update-source Dps1 + neighbor 192.168.142.2 route-map RM-WAN-HA-PEER-IN in + neighbor 192.168.142.2 route-map RM-WAN-HA-PEER-OUT out + neighbor 192.168.142.2 send-community neighbor 192.168.144.1 peer group WAN-OVERLAY-PEERS neighbor 192.168.144.1 description cv-pathfinder-pathfinder redistribute connected route-map RM-CONN-2-BGP @@ -457,6 +467,8 @@ router bgp 65000 neighbor WAN-OVERLAY-PEERS route-map RM-EVPN-SOO-IN in neighbor WAN-OVERLAY-PEERS route-map RM-EVPN-SOO-OUT out neighbor WAN-OVERLAY-PEERS activate + neighbor 192.168.142.2 activate + neighbor default next-hop-self received-evpn-routes route-type ip-prefix ! address-family ipv4 neighbor IPv4-UNDERLAY-PEERS activate @@ -536,7 +548,7 @@ management security ! stun client - server-profile MPLS-cv-pathfinder-pathfinder-Ethernet2 + server-profile MPLS-cv-pathfinder-pathfinder-Ethernet2_2 ip address 172.16.0.1 ssl profile profileA ! diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-edge3A.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-edge3A.cfg new file mode 100644 index 00000000000..90df3a8e488 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-edge3A.cfg @@ -0,0 +1,414 @@ +!RANCID-CONTENT-TYPE: arista +! +agent KernelFib environment KERNELFIB_PROGRAM_ALL_ECMP=1 +! +flow tracking hardware + tracker FLOW-TRACKER + record export on inactive timeout 70000 + record export on interval 300000 + exporter CV-TELEMETRY + collector 127.0.0.1 + local interface Loopback0 + template interval 3600000 + no shutdown +! +service routing protocols model multi-agent +! +hostname cv-pathfinder-edge3A +! +router adaptive-virtual-topology + topology role edge + region AVD_Land_West id 42 + zone AVD_Land_West-ZONE id 1 + site Site404 id 404 + ! + policy DEFAULT-AVT-POLICY + ! + match application-profile VIDEO + avt profile DEFAULT-AVT-POLICY-VIDEO + ! + match application-profile default + avt profile DEFAULT-AVT-POLICY-DEFAULT + ! + policy DEFAULT-AVT-POLICY-WITH-CP + ! + match application-profile APP-PROFILE-CONTROL-PLANE + avt profile DEFAULT-AVT-POLICY-CONTROL-PLANE + ! + match application-profile VIDEO + avt profile DEFAULT-AVT-POLICY-VIDEO + ! + match application-profile default + avt profile DEFAULT-AVT-POLICY-DEFAULT + ! + policy PROD-AVT-POLICY + ! + match application-profile VOICE + avt profile PROD-AVT-POLICY-VOICE + ! + match application-profile VIDEO + avt profile PROD-AVT-POLICY-VIDEO + ! + match application-profile default + avt profile PROD-AVT-POLICY-DEFAULT + ! + profile DEFAULT-AVT-POLICY-CONTROL-PLANE + path-selection load-balance LB-DEFAULT-AVT-POLICY-CONTROL-PLANE + ! + profile DEFAULT-AVT-POLICY-DEFAULT + path-selection load-balance LB-DEFAULT-AVT-POLICY-DEFAULT + ! + profile DEFAULT-AVT-POLICY-VIDEO + path-selection load-balance LB-DEFAULT-AVT-POLICY-VIDEO + ! + profile PROD-AVT-POLICY-DEFAULT + path-selection load-balance LB-PROD-AVT-POLICY-DEFAULT + ! + profile PROD-AVT-POLICY-VIDEO + path-selection load-balance LB-PROD-AVT-POLICY-VIDEO + ! + profile PROD-AVT-POLICY-VOICE + path-selection load-balance LB-PROD-AVT-POLICY-VOICE + ! + vrf default + avt policy DEFAULT-AVT-POLICY-WITH-CP + avt profile DEFAULT-AVT-POLICY-DEFAULT id 1 + avt profile DEFAULT-AVT-POLICY-VIDEO id 3 + avt profile DEFAULT-AVT-POLICY-CONTROL-PLANE id 254 + ! + vrf IT + avt policy DEFAULT-AVT-POLICY + avt profile DEFAULT-AVT-POLICY-DEFAULT id 1 + avt profile DEFAULT-AVT-POLICY-VIDEO id 3 + ! + vrf PROD + avt policy PROD-AVT-POLICY + avt profile PROD-AVT-POLICY-DEFAULT id 1 + avt profile PROD-AVT-POLICY-VOICE id 2 + avt profile PROD-AVT-POLICY-VIDEO id 4 +! +router path-selection + tcp mss ceiling ipv4 ingress + ! + path-group INET id 101 + ipsec profile CP-PROFILE + ! + local interface Ethernet1 + stun server-profile INET-cv-pathfinder-pathfinder-Ethernet1 INET-cv-pathfinder-pathfinder-Ethernet3 + ! + peer dynamic + ! + peer static router-ip 192.168.144.1 + name cv-pathfinder-pathfinder + ipv4 address 172.17.7.7 + ipv4 address 10.9.9.9 + ! + path-group LAN_HA id 65535 + ipsec profile DP-PROFILE + flow assignment lan + ! + local interface Ethernet52 + ! + peer static router-ip 192.168.142.7 + name cv-pathfinder-edge3B + ipv4 address 10.10.10.1 + ! + load-balance policy LB-DEFAULT-AVT-POLICY-CONTROL-PLANE + path-group INET + path-group LAN_HA + ! + load-balance policy LB-DEFAULT-AVT-POLICY-DEFAULT + path-group INET + path-group LAN_HA + ! + load-balance policy LB-DEFAULT-AVT-POLICY-VIDEO + path-group INET + path-group LAN_HA + ! + load-balance policy LB-PROD-AVT-POLICY-DEFAULT + path-group INET + path-group LAN_HA + ! + load-balance policy LB-PROD-AVT-POLICY-VIDEO + loss-rate 42.0 + path-group LAN_HA + path-group INET priority 2 + ! + load-balance policy LB-PROD-AVT-POLICY-VOICE + hop count lowest + jitter 42 + path-group LAN_HA + path-group INET priority 2 +! +spanning-tree mode none +! +no enable password +no aaa root +! +vrf instance IT +! +vrf instance MGMT +! +vrf instance PROD +! +ip security + ! + ike policy DP-IKE-POLICY + local-id 192.168.142.6 + ! + ike policy CP-IKE-POLICY + local-id 192.168.142.6 + ! + sa policy DP-SA-POLICY + esp encryption aes256gcm128 + pfs dh-group 14 + ! + sa policy CP-SA-POLICY + esp encryption aes256gcm128 + pfs dh-group 14 + ! + profile DP-PROFILE + ike-policy DP-IKE-POLICY + sa-policy DP-SA-POLICY + connection start + shared-key 7 ABCDEF1234567890666 + dpd 10 50 clear + mode transport + ! + profile CP-PROFILE + ike-policy CP-IKE-POLICY + sa-policy CP-SA-POLICY + connection start + shared-key 7 ABCDEF1234567890 + dpd 10 50 clear + mode transport + ! + key controller + profile DP-PROFILE +! +interface Dps1 + description DPS Interface + mtu 9214 + flow tracker hardware FLOW-TRACKER + ip address 192.168.142.6/32 +! +interface Ethernet1 + description ATT_404-01 + no shutdown + no switchport + ip address dhcp + dhcp client accept default-route +! +interface Ethernet52 + description DIRECT LAN HA LINK + no shutdown + no switchport + ip address 10.10.10.0/31 +! +interface Loopback0 + description Router_ID + no shutdown + ip address 192.168.42.6/32 +! +interface Vxlan1 + description cv-pathfinder-edge3A_VTEP + vxlan source-interface Dps1 + vxlan udp-port 4789 + vxlan vrf default vni 1 + vxlan vrf IT vni 100 + vxlan vrf PROD vni 42 +! +application traffic recognition + ! + application ipv4 APP-CONTROL-PLANE + destination prefix field-set PFX-PATHFINDERS + ! + application ipv4 CUSTOM-APPLICATION-1 + source prefix field-set CUSTOM-SRC-PREFIX-1 + destination prefix field-set CUSTOM-DEST-PREFIX-1 + protocol tcp + ! + application ipv4 CUSTOM-APPLICATION-2 + protocol tcp source port field-set TCP-SRC-2 destination port field-set TCP-DEST-2 + ! + category VIDEO1 + application CUSTOM-APPLICATION-2 + application microsoft-teams + ! + application-profile APP-PROFILE-CONTROL-PLANE + application APP-CONTROL-PLANE + ! + application-profile VIDEO + application CUSTOM-APPLICATION-1 + application skype + category VIDEO1 + ! + application-profile VOICE + application CUSTOM-VOICE-APPLICATION + ! + field-set ipv4 prefix CUSTOM-DEST-PREFIX-1 + 6.6.6.0/24 + ! + field-set ipv4 prefix CUSTOM-SRC-PREFIX-1 + 42.42.42.0/24 + ! + field-set ipv4 prefix PFX-PATHFINDERS + 192.168.144.1/32 + ! + field-set l4-port TCP-DEST-2 + 666, 777 + ! + field-set l4-port TCP-SRC-2 + 42 +! +ip routing +ip routing vrf IT +no ip routing vrf MGMT +ip routing vrf PROD +! +ip extcommunity-list ECL-EVPN-SOO permit soo 192.168.42.6:404 +! +ip prefix-list PL-LOOPBACKS-EVPN-OVERLAY + seq 10 permit 192.168.42.0/24 eq 32 +! +route-map RM-BGP-UNDERLAY-PEERS-IN permit 40 + description Mark prefixes originated from the LAN + set extcommunity soo 192.168.42.6:404 additive +! +route-map RM-BGP-UNDERLAY-PEERS-OUT permit 10 + description Make routes learned from WAN HA peer less preferred on LAN routers + match route-type internal + match tag 50 + set metric 50 +! +route-map RM-BGP-UNDERLAY-PEERS-OUT permit 20 +! +route-map RM-CONN-2-BGP permit 10 + match ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY + set extcommunity soo 192.168.42.6:404 additive +! +route-map RM-EVPN-EXPORT-VRF-DEFAULT permit 10 + match extcommunity ECL-EVPN-SOO +! +route-map RM-EVPN-SOO-IN deny 10 + match extcommunity ECL-EVPN-SOO +! +route-map RM-EVPN-SOO-IN permit 20 +! +route-map RM-EVPN-SOO-OUT permit 10 + set extcommunity soo 192.168.42.6:404 additive +! +route-map RM-WAN-HA-PEER-IN permit 10 + description Set tag 50 on routes received from HA peer over EVPN + set tag 50 +! +route-map RM-WAN-HA-PEER-OUT permit 10 + description Make EVPN routes learned from WAN less preferred on HA peer + match route-type internal + set local-preference 50 +! +route-map RM-WAN-HA-PEER-OUT permit 20 + description Make locally injected routes less preferred on HA peer + set local-preference 75 +! +router bfd + multihop interval 300 min-rx 300 multiplier 3 +! +router bgp 65000 + router-id 192.168.42.6 + maximum-paths 16 + update wait-install + no bgp default ipv4-unicast + neighbor IPv4-UNDERLAY-PEERS peer group + neighbor IPv4-UNDERLAY-PEERS send-community + neighbor IPv4-UNDERLAY-PEERS maximum-routes 12000 + neighbor IPv4-UNDERLAY-PEERS route-map RM-BGP-UNDERLAY-PEERS-IN in + neighbor IPv4-UNDERLAY-PEERS route-map RM-BGP-UNDERLAY-PEERS-OUT out + neighbor WAN-OVERLAY-PEERS peer group + neighbor WAN-OVERLAY-PEERS remote-as 65000 + neighbor WAN-OVERLAY-PEERS update-source Dps1 + neighbor WAN-OVERLAY-PEERS bfd + neighbor WAN-OVERLAY-PEERS bfd interval 1000 min-rx 1000 multiplier 10 + neighbor WAN-OVERLAY-PEERS ttl maximum-hops 1 + neighbor WAN-OVERLAY-PEERS password 7 htm4AZe9mIQOO1uiMuGgYQ== + neighbor WAN-OVERLAY-PEERS send-community + neighbor WAN-OVERLAY-PEERS maximum-routes 0 + neighbor 192.168.142.7 remote-as 65000 + neighbor 192.168.142.7 description cv-pathfinder-edge3B + neighbor 192.168.142.7 route-reflector-client + neighbor 192.168.142.7 update-source Dps1 + neighbor 192.168.142.7 route-map RM-WAN-HA-PEER-IN in + neighbor 192.168.142.7 route-map RM-WAN-HA-PEER-OUT out + neighbor 192.168.142.7 send-community + neighbor 192.168.144.1 peer group WAN-OVERLAY-PEERS + neighbor 192.168.144.1 description cv-pathfinder-pathfinder + redistribute connected route-map RM-CONN-2-BGP + ! + address-family evpn + neighbor WAN-OVERLAY-PEERS route-map RM-EVPN-SOO-IN in + neighbor WAN-OVERLAY-PEERS route-map RM-EVPN-SOO-OUT out + neighbor WAN-OVERLAY-PEERS activate + neighbor 192.168.142.7 activate + neighbor default next-hop-self received-evpn-routes route-type ip-prefix + ! + address-family ipv4 + neighbor IPv4-UNDERLAY-PEERS activate + no neighbor WAN-OVERLAY-PEERS activate + ! + address-family ipv4 sr-te + neighbor WAN-OVERLAY-PEERS activate + ! + address-family link-state + neighbor WAN-OVERLAY-PEERS activate + path-selection + ! + address-family path-selection + bgp additional-paths receive + bgp additional-paths send any + neighbor WAN-OVERLAY-PEERS activate + ! + vrf default + rd 192.168.42.6:1 + route-target import evpn 1:1 + route-target export evpn 1:1 + route-target export evpn route-map RM-EVPN-EXPORT-VRF-DEFAULT + ! + vrf IT + rd 192.168.42.6:1000 + route-target import evpn 1000:1000 + route-target export evpn 1000:1000 + router-id 192.168.42.6 + redistribute connected + ! + vrf PROD + rd 192.168.42.6:142 + route-target import evpn 142:142 + route-target export evpn 142:142 + router-id 192.168.42.6 + redistribute connected +! +router traffic-engineering +! +management api http-commands + protocol https + no shutdown + ! + vrf MGMT + no shutdown +! +management security + ssl profile profileA + tls versions 1.2 + trust certificate aristaDeviceCertProvisionerDefaultRootCA.crt + certificate profileA.crt key profileA.key +! +stun + client + server-profile INET-cv-pathfinder-pathfinder-Ethernet1 + ip address 172.17.7.7 + ssl profile profileA + server-profile INET-cv-pathfinder-pathfinder-Ethernet3 + ip address 10.9.9.9 + ssl profile profileA +! +end diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-edge3B.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-edge3B.cfg new file mode 100644 index 00000000000..de984aff98f --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-edge3B.cfg @@ -0,0 +1,423 @@ +!RANCID-CONTENT-TYPE: arista +! +agent KernelFib environment KERNELFIB_PROGRAM_ALL_ECMP=1 +! +flow tracking hardware + tracker FLOW-TRACKER + record export on inactive timeout 70000 + record export on interval 300000 + exporter CV-TELEMETRY + collector 127.0.0.1 + local interface Loopback0 + template interval 3600000 + no shutdown +! +service routing protocols model multi-agent +! +hostname cv-pathfinder-edge3B +! +router adaptive-virtual-topology + topology role edge + region AVD_Land_West id 42 + zone AVD_Land_West-ZONE id 1 + site Site404 id 404 + ! + policy DEFAULT-AVT-POLICY + ! + match application-profile VIDEO + avt profile DEFAULT-AVT-POLICY-VIDEO + ! + match application-profile default + avt profile DEFAULT-AVT-POLICY-DEFAULT + ! + policy DEFAULT-AVT-POLICY-WITH-CP + ! + match application-profile APP-PROFILE-CONTROL-PLANE + avt profile DEFAULT-AVT-POLICY-CONTROL-PLANE + ! + match application-profile VIDEO + avt profile DEFAULT-AVT-POLICY-VIDEO + ! + match application-profile default + avt profile DEFAULT-AVT-POLICY-DEFAULT + ! + policy PROD-AVT-POLICY + ! + match application-profile VOICE + avt profile PROD-AVT-POLICY-VOICE + ! + match application-profile VIDEO + avt profile PROD-AVT-POLICY-VIDEO + ! + match application-profile MPLS-ONLY + avt profile PROD-AVT-POLICY-MPLS-ONLY + ! + match application-profile default + avt profile PROD-AVT-POLICY-DEFAULT + ! + profile DEFAULT-AVT-POLICY-CONTROL-PLANE + path-selection load-balance LB-DEFAULT-AVT-POLICY-CONTROL-PLANE + ! + profile DEFAULT-AVT-POLICY-DEFAULT + path-selection load-balance LB-DEFAULT-AVT-POLICY-DEFAULT + ! + profile DEFAULT-AVT-POLICY-VIDEO + path-selection load-balance LB-DEFAULT-AVT-POLICY-VIDEO + ! + profile PROD-AVT-POLICY-DEFAULT + path-selection load-balance LB-PROD-AVT-POLICY-DEFAULT + ! + profile PROD-AVT-POLICY-MPLS-ONLY + path-selection load-balance LB-PROD-AVT-POLICY-MPLS-ONLY + ! + profile PROD-AVT-POLICY-VIDEO + path-selection load-balance LB-PROD-AVT-POLICY-VIDEO + ! + profile PROD-AVT-POLICY-VOICE + path-selection load-balance LB-PROD-AVT-POLICY-VOICE + ! + vrf default + avt policy DEFAULT-AVT-POLICY-WITH-CP + avt profile DEFAULT-AVT-POLICY-DEFAULT id 1 + avt profile DEFAULT-AVT-POLICY-VIDEO id 3 + avt profile DEFAULT-AVT-POLICY-CONTROL-PLANE id 254 + ! + vrf IT + avt policy DEFAULT-AVT-POLICY + avt profile DEFAULT-AVT-POLICY-DEFAULT id 1 + avt profile DEFAULT-AVT-POLICY-VIDEO id 3 + ! + vrf PROD + avt policy PROD-AVT-POLICY + avt profile PROD-AVT-POLICY-DEFAULT id 1 + avt profile PROD-AVT-POLICY-VOICE id 2 + avt profile PROD-AVT-POLICY-VIDEO id 4 + avt profile PROD-AVT-POLICY-MPLS-ONLY id 5 +! +router path-selection + tcp mss ceiling ipv4 ingress + ! + path-group LAN_HA id 65535 + ipsec profile DP-PROFILE + flow assignment lan + ! + local interface Ethernet52 + ! + peer static router-ip 192.168.142.6 + name cv-pathfinder-edge3A + ipv4 address 10.10.10.0 + ! + path-group MPLS id 100 + keepalive interval 300 milliseconds failure-threshold 5 intervals + ! + local interface Ethernet2 + stun server-profile MPLS-cv-pathfinder-pathfinder-Ethernet2_2 + ! + peer dynamic + ipsec disabled + ! + peer static router-ip 192.168.144.1 + name cv-pathfinder-pathfinder + ipv4 address 172.16.0.1 + ! + load-balance policy LB-DEFAULT-AVT-POLICY-CONTROL-PLANE + path-group LAN_HA + path-group MPLS + ! + load-balance policy LB-DEFAULT-AVT-POLICY-DEFAULT + path-group LAN_HA + path-group MPLS priority 4223 + ! + load-balance policy LB-DEFAULT-AVT-POLICY-VIDEO + path-group LAN_HA + path-group MPLS + ! + load-balance policy LB-PROD-AVT-POLICY-DEFAULT + path-group LAN_HA + path-group MPLS priority 2 + ! + load-balance policy LB-PROD-AVT-POLICY-MPLS-ONLY + path-group LAN_HA + path-group MPLS + ! + load-balance policy LB-PROD-AVT-POLICY-VIDEO + loss-rate 42.0 + path-group LAN_HA + path-group MPLS + ! + load-balance policy LB-PROD-AVT-POLICY-VOICE + hop count lowest + jitter 42 + path-group LAN_HA + path-group MPLS +! +spanning-tree mode none +! +no enable password +no aaa root +! +vrf instance IT +! +vrf instance MGMT +! +vrf instance PROD +! +ip security + ! + ike policy DP-IKE-POLICY + local-id 192.168.142.7 + ! + ike policy CP-IKE-POLICY + local-id 192.168.142.7 + ! + sa policy DP-SA-POLICY + esp encryption aes256gcm128 + pfs dh-group 14 + ! + sa policy CP-SA-POLICY + esp encryption aes256gcm128 + pfs dh-group 14 + ! + profile DP-PROFILE + ike-policy DP-IKE-POLICY + sa-policy DP-SA-POLICY + connection start + shared-key 7 ABCDEF1234567890666 + dpd 10 50 clear + mode transport + ! + profile CP-PROFILE + ike-policy CP-IKE-POLICY + sa-policy CP-SA-POLICY + connection start + shared-key 7 ABCDEF1234567890 + dpd 10 50 clear + mode transport + ! + key controller + profile DP-PROFILE +! +interface Dps1 + description DPS Interface + mtu 9214 + flow tracker hardware FLOW-TRACKER + ip address 192.168.142.7/32 +! +interface Ethernet2 + description Colt_10423 + no shutdown + no switchport + ip address 172.15.6.6/31 +! +interface Ethernet52 + description DIRECT LAN HA LINK + no shutdown + no switchport + ip address 10.10.10.1/31 +! +interface Loopback0 + description Router_ID + no shutdown + ip address 192.168.42.7/32 +! +interface Vxlan1 + description cv-pathfinder-edge3B_VTEP + vxlan source-interface Dps1 + vxlan udp-port 4789 + vxlan vrf default vni 1 + vxlan vrf IT vni 100 + vxlan vrf PROD vni 42 +! +application traffic recognition + ! + application ipv4 APP-CONTROL-PLANE + destination prefix field-set PFX-PATHFINDERS + ! + application ipv4 CUSTOM-APPLICATION-1 + source prefix field-set CUSTOM-SRC-PREFIX-1 + destination prefix field-set CUSTOM-DEST-PREFIX-1 + protocol tcp + ! + application ipv4 CUSTOM-APPLICATION-2 + protocol tcp source port field-set TCP-SRC-2 destination port field-set TCP-DEST-2 + ! + category VIDEO1 + application CUSTOM-APPLICATION-2 + application microsoft-teams + ! + application-profile APP-PROFILE-CONTROL-PLANE + application APP-CONTROL-PLANE + ! + application-profile MPLS-ONLY + ! + application-profile VIDEO + application CUSTOM-APPLICATION-1 + application skype + category VIDEO1 + ! + application-profile VOICE + application CUSTOM-VOICE-APPLICATION + ! + field-set ipv4 prefix CUSTOM-DEST-PREFIX-1 + 6.6.6.0/24 + ! + field-set ipv4 prefix CUSTOM-SRC-PREFIX-1 + 42.42.42.0/24 + ! + field-set ipv4 prefix PFX-PATHFINDERS + 192.168.144.1/32 + ! + field-set l4-port TCP-DEST-2 + 666, 777 + ! + field-set l4-port TCP-SRC-2 + 42 +! +ip routing +ip routing vrf IT +no ip routing vrf MGMT +ip routing vrf PROD +! +ip extcommunity-list ECL-EVPN-SOO permit soo 192.168.42.6:404 +! +ip prefix-list PL-LOOPBACKS-EVPN-OVERLAY + seq 10 permit 192.168.42.0/24 eq 32 +! +route-map RM-BGP-UNDERLAY-PEERS-IN permit 40 + description Mark prefixes originated from the LAN + set extcommunity soo 192.168.42.6:404 additive +! +route-map RM-BGP-UNDERLAY-PEERS-OUT permit 10 + description Make routes learned from WAN HA peer less preferred on LAN routers + match route-type internal + match tag 50 + set metric 50 +! +route-map RM-BGP-UNDERLAY-PEERS-OUT permit 20 +! +route-map RM-CONN-2-BGP permit 10 + match ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY + set extcommunity soo 192.168.42.6:404 additive +! +route-map RM-EVPN-EXPORT-VRF-DEFAULT permit 10 + match extcommunity ECL-EVPN-SOO +! +route-map RM-EVPN-SOO-IN deny 10 + match extcommunity ECL-EVPN-SOO +! +route-map RM-EVPN-SOO-IN permit 20 +! +route-map RM-EVPN-SOO-OUT permit 10 + set extcommunity soo 192.168.42.6:404 additive +! +route-map RM-WAN-HA-PEER-IN permit 10 + description Set tag 50 on routes received from HA peer over EVPN + set tag 50 +! +route-map RM-WAN-HA-PEER-OUT permit 10 + description Make EVPN routes learned from WAN less preferred on HA peer + match route-type internal + set local-preference 50 +! +route-map RM-WAN-HA-PEER-OUT permit 20 + description Make locally injected routes less preferred on HA peer + set local-preference 75 +! +router bfd + multihop interval 300 min-rx 300 multiplier 3 +! +router bgp 65000 + router-id 192.168.42.7 + maximum-paths 16 + update wait-install + no bgp default ipv4-unicast + neighbor IPv4-UNDERLAY-PEERS peer group + neighbor IPv4-UNDERLAY-PEERS send-community + neighbor IPv4-UNDERLAY-PEERS maximum-routes 12000 + neighbor IPv4-UNDERLAY-PEERS route-map RM-BGP-UNDERLAY-PEERS-IN in + neighbor IPv4-UNDERLAY-PEERS route-map RM-BGP-UNDERLAY-PEERS-OUT out + neighbor WAN-OVERLAY-PEERS peer group + neighbor WAN-OVERLAY-PEERS remote-as 65000 + neighbor WAN-OVERLAY-PEERS update-source Dps1 + neighbor WAN-OVERLAY-PEERS bfd + neighbor WAN-OVERLAY-PEERS bfd interval 1000 min-rx 1000 multiplier 10 + neighbor WAN-OVERLAY-PEERS ttl maximum-hops 1 + neighbor WAN-OVERLAY-PEERS password 7 htm4AZe9mIQOO1uiMuGgYQ== + neighbor WAN-OVERLAY-PEERS send-community + neighbor WAN-OVERLAY-PEERS maximum-routes 0 + neighbor 192.168.142.6 remote-as 65000 + neighbor 192.168.142.6 description cv-pathfinder-edge3A + neighbor 192.168.142.6 route-reflector-client + neighbor 192.168.142.6 update-source Dps1 + neighbor 192.168.142.6 route-map RM-WAN-HA-PEER-IN in + neighbor 192.168.142.6 route-map RM-WAN-HA-PEER-OUT out + neighbor 192.168.142.6 send-community + neighbor 192.168.144.1 peer group WAN-OVERLAY-PEERS + neighbor 192.168.144.1 description cv-pathfinder-pathfinder + redistribute connected route-map RM-CONN-2-BGP + ! + address-family evpn + neighbor WAN-OVERLAY-PEERS route-map RM-EVPN-SOO-IN in + neighbor WAN-OVERLAY-PEERS route-map RM-EVPN-SOO-OUT out + neighbor WAN-OVERLAY-PEERS activate + neighbor 192.168.142.6 activate + neighbor default next-hop-self received-evpn-routes route-type ip-prefix + ! + address-family ipv4 + neighbor IPv4-UNDERLAY-PEERS activate + no neighbor WAN-OVERLAY-PEERS activate + ! + address-family ipv4 sr-te + neighbor WAN-OVERLAY-PEERS activate + ! + address-family link-state + neighbor WAN-OVERLAY-PEERS activate + path-selection + ! + address-family path-selection + bgp additional-paths receive + bgp additional-paths send any + neighbor WAN-OVERLAY-PEERS activate + ! + vrf default + rd 192.168.42.7:1 + route-target import evpn 1:1 + route-target export evpn 1:1 + route-target export evpn route-map RM-EVPN-EXPORT-VRF-DEFAULT + ! + vrf IT + rd 192.168.42.7:1000 + route-target import evpn 1000:1000 + route-target export evpn 1000:1000 + router-id 192.168.42.7 + redistribute connected + ! + vrf PROD + rd 192.168.42.7:142 + route-target import evpn 142:142 + route-target export evpn 142:142 + router-id 192.168.42.7 + redistribute connected +! +router traffic-engineering +! +management api http-commands + protocol https + no shutdown + ! + vrf MGMT + no shutdown +! +management security + ssl profile profileA + tls versions 1.2 + trust certificate aristaDeviceCertProvisionerDefaultRootCA.crt + certificate profileA.crt key profileA.key +! +stun + client + server-profile MPLS-cv-pathfinder-pathfinder-Ethernet2_2 + ip address 172.16.0.1 + ssl profile profileA +! +end diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-pathfinder.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-pathfinder.cfg index fc2e76bfa58..cc8efb2d7b7 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-pathfinder.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-pathfinder.cfg @@ -145,7 +145,7 @@ router path-selection path-group MPLS id 100 keepalive interval 300 milliseconds failure-threshold 5 intervals ! - local interface Ethernet2 + local interface Ethernet2/2 ! path-group Satellite id 104 ! @@ -248,7 +248,7 @@ interface Ethernet1 no switchport ip address 10.7.7.7/31 ! -interface Ethernet2 +interface Ethernet2/2 description Colt_10000 no shutdown no switchport @@ -352,7 +352,6 @@ router bgp 65000 neighbor IPv4-UNDERLAY-PEERS send-community neighbor IPv4-UNDERLAY-PEERS maximum-routes 12000 neighbor IPv4-UNDERLAY-PEERS route-map RM-BGP-UNDERLAY-PEERS-IN in - neighbor IPv4-UNDERLAY-PEERS route-map RM-BGP-UNDERLAY-PEERS-OUT out neighbor WAN-OVERLAY-PEERS peer group neighbor WAN-OVERLAY-PEERS remote-as 65000 neighbor WAN-OVERLAY-PEERS update-source Dps1 @@ -410,7 +409,7 @@ management security stun server local-interface Ethernet1 - local-interface Ethernet2 + local-interface Ethernet2/2 local-interface Ethernet3 ssl profile profileA ! diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-pathfinder1.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-pathfinder1.cfg index 31ac9e2cc55..ed25dd564b0 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-pathfinder1.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-pathfinder1.cfg @@ -341,7 +341,6 @@ router bgp 65000 neighbor IPv4-UNDERLAY-PEERS send-community neighbor IPv4-UNDERLAY-PEERS maximum-routes 12000 neighbor IPv4-UNDERLAY-PEERS route-map RM-BGP-UNDERLAY-PEERS-IN in - neighbor IPv4-UNDERLAY-PEERS route-map RM-BGP-UNDERLAY-PEERS-OUT out neighbor WAN-OVERLAY-PEERS peer group neighbor WAN-OVERLAY-PEERS remote-as 65000 neighbor WAN-OVERLAY-PEERS update-source Dps1 @@ -355,6 +354,7 @@ router bgp 65000 neighbor WAN-RR-OVERLAY-PEERS peer group neighbor WAN-RR-OVERLAY-PEERS remote-as 65000 neighbor WAN-RR-OVERLAY-PEERS update-source Dps1 + neighbor WAN-RR-OVERLAY-PEERS route-reflector-client neighbor WAN-RR-OVERLAY-PEERS bfd neighbor WAN-RR-OVERLAY-PEERS bfd interval 2020 min-rx 2000 multiplier 3 neighbor WAN-RR-OVERLAY-PEERS ttl maximum-hops 42 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-pathfinder2.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-pathfinder2.cfg index 68636459ca4..ddb5c58fd13 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-pathfinder2.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-pathfinder2.cfg @@ -354,7 +354,6 @@ router bgp 65000 neighbor IPv4-UNDERLAY-PEERS send-community neighbor IPv4-UNDERLAY-PEERS maximum-routes 12000 neighbor IPv4-UNDERLAY-PEERS route-map RM-BGP-UNDERLAY-PEERS-IN in - neighbor IPv4-UNDERLAY-PEERS route-map RM-BGP-UNDERLAY-PEERS-OUT out neighbor WAN-OVERLAY-PEERS peer group neighbor WAN-OVERLAY-PEERS remote-as 65000 neighbor WAN-OVERLAY-PEERS update-source Dps1 @@ -368,6 +367,7 @@ router bgp 65000 neighbor WAN-RR-OVERLAY-PEERS peer group neighbor WAN-RR-OVERLAY-PEERS remote-as 65000 neighbor WAN-RR-OVERLAY-PEERS update-source Dps1 + neighbor WAN-RR-OVERLAY-PEERS route-reflector-client neighbor WAN-RR-OVERLAY-PEERS bfd neighbor WAN-RR-OVERLAY-PEERS bfd interval 2020 min-rx 2000 multiplier 3 neighbor WAN-RR-OVERLAY-PEERS ttl maximum-hops 42 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-transit1A.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-transit1A.cfg index 51f35157d12..7e2c7c9b64e 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-transit1A.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-transit1A.cfg @@ -16,6 +16,10 @@ service routing protocols model multi-agent ! ip as-path access-list ASPATH-WAN permit 65000 any ! +! +ip nat profile NAT-IE-DIRECT + ip nat source dynamic access-list ACL-NAT-IE-DIRECT overload +! hostname cv-pathfinder-transit1A ! router adaptive-virtual-topology @@ -71,6 +75,7 @@ router adaptive-virtual-topology avt profile TRANSIT-AVT-POLICY-DEFAULT ! profile CUSTOM-VOICE-PROFILE-NAME + internet-exit policy DIRECT-EXIT-POLICY-2 path-selection load-balance LB-CUSTOM-VOICE-PROFILE-NAME ! profile DEFAULT-AVT-POLICY-CONTROL-PLANE @@ -127,6 +132,15 @@ router adaptive-virtual-topology avt profile TRANSIT-AVT-POLICY-DEFAULT id 1 avt profile CUSTOM-VOICE-PROFILE-NAME id 42 ! +router internet-exit + ! + exit-group DIRECT-EXIT-POLICY-2 + local connection IE-Ethernet2.42 + ! + policy DIRECT-EXIT-POLICY-2 + exit-group DIRECT-EXIT-POLICY-2 + exit-group system-default-exit-group +! router path-selection tcp mss ceiling ipv4 ingress ! @@ -156,7 +170,7 @@ router path-selection keepalive interval 300 milliseconds failure-threshold 5 intervals ! local interface Ethernet2.42 - stun server-profile MPLS-cv-pathfinder-pathfinder-Ethernet2 + stun server-profile MPLS-cv-pathfinder-pathfinder-Ethernet2_2 ! peer dynamic ipsec disabled @@ -217,6 +231,11 @@ router path-selection path-group LAN_HA path-group MPLS priority 2 ! +router service-insertion + connection IE-Ethernet2.42 + interface Ethernet2.42 next-hop 123.12.3.4 + monitor connectivity host IE-Ethernet2.42 +! spanning-tree mode none ! no enable password @@ -291,6 +310,7 @@ interface Ethernet2.42 no shutdown encapsulation dot1q vlan 666 ip address 172.16.6.6/31 + ip nat service-profile NAT-IE-DIRECT ! interface Ethernet52 description P2P_LINK_TO_SITE-HA-ENABLED-LEAF1_Ethernet1 @@ -383,6 +403,20 @@ application traffic recognition field-set l4-port TCP-SRC-2 42 ! +monitor connectivity + no shutdown + interface set SET-Ethernet2.42 Ethernet2.42 + ! + host IE-Ethernet2.42 + description + Internet Exit DIRECT-EXIT-POLICY-2 + local-interfaces SET-Ethernet2.42 + ip 123.12.3.4 +! +ip access-list ACL-NAT-IE-DIRECT + 10 deny ip host 172.16.6.6 any + 20 permit ip any any +! ip routing ip routing vrf ATTRACTED-VRF-FROM-UPLINK ip routing vrf IT @@ -402,35 +436,26 @@ ip prefix-list PL-WAN-HA-PEER-PREFIXES ip prefix-list PL-WAN-HA-PREFIXES seq 10 permit 172.17.0.0/31 ! +! route-map RM-BGP-UNDERLAY-PEERS-IN permit 10 description Allow WAN HA peer interface prefixes match ip address prefix-list PL-WAN-HA-PEER-PREFIXES ! -route-map RM-BGP-UNDERLAY-PEERS-IN permit 20 - description Allow prefixes originated from the HA peer - match extcommunity ECL-EVPN-SOO - set as-path match all replacement auto auto -! -route-map RM-BGP-UNDERLAY-PEERS-IN permit 30 - description Use WAN routes from HA peer as backup +route-map RM-BGP-UNDERLAY-PEERS-IN deny 20 + description Deny other routes from the HA peer match as-path ASPATH-WAN - set community no-advertise ! route-map RM-BGP-UNDERLAY-PEERS-IN permit 40 description Mark prefixes originated from the LAN set extcommunity soo 192.168.43.1:422 additive ! route-map RM-BGP-UNDERLAY-PEERS-OUT permit 10 - description Advertise local routes towards LAN - match extcommunity ECL-EVPN-SOO -! -route-map RM-BGP-UNDERLAY-PEERS-OUT permit 20 - description Advertise routes received from WAN iBGP towards LAN + description Make routes learned from WAN HA peer less preferred on LAN routers match route-type internal + match tag 50 + set metric 50 ! -route-map RM-BGP-UNDERLAY-PEERS-OUT permit 30 - description Advertise WAN HA prefixes towards LAN - match ip address prefix-list PL-WAN-HA-PREFIXES +route-map RM-BGP-UNDERLAY-PEERS-OUT permit 20 ! route-map RM-CONN-2-BGP permit 10 match ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY @@ -450,6 +475,19 @@ route-map RM-EVPN-SOO-IN permit 20 route-map RM-EVPN-SOO-OUT permit 10 set extcommunity soo 192.168.43.1:422 additive ! +route-map RM-WAN-HA-PEER-IN permit 10 + description Set tag 50 on routes received from HA peer over EVPN + set tag 50 +! +route-map RM-WAN-HA-PEER-OUT permit 10 + description Make EVPN routes learned from WAN less preferred on HA peer + match route-type internal + set local-preference 50 +! +route-map RM-WAN-HA-PEER-OUT permit 20 + description Make locally injected routes less preferred on HA peer + set local-preference 75 +! router bfd multihop interval 300 min-rx 300 multiplier 3 ! @@ -476,6 +514,13 @@ router bgp 65000 neighbor 172.17.0.0 peer group IPv4-UNDERLAY-PEERS neighbor 172.17.0.0 remote-as 65199 neighbor 172.17.0.0 description site-ha-enabled-leaf1_Ethernet1 + neighbor 192.168.143.2 remote-as 65000 + neighbor 192.168.143.2 description cv-pathfinder-transit1B + neighbor 192.168.143.2 route-reflector-client + neighbor 192.168.143.2 update-source Dps1 + neighbor 192.168.143.2 route-map RM-WAN-HA-PEER-IN in + neighbor 192.168.143.2 route-map RM-WAN-HA-PEER-OUT out + neighbor 192.168.143.2 send-community neighbor 192.168.144.1 peer group WAN-OVERLAY-PEERS neighbor 192.168.144.1 description cv-pathfinder-pathfinder redistribute connected route-map RM-CONN-2-BGP @@ -484,6 +529,8 @@ router bgp 65000 neighbor WAN-OVERLAY-PEERS route-map RM-EVPN-SOO-IN in neighbor WAN-OVERLAY-PEERS route-map RM-EVPN-SOO-OUT out neighbor WAN-OVERLAY-PEERS activate + neighbor 192.168.143.2 activate + neighbor default next-hop-self received-evpn-routes route-type ip-prefix ! address-family ipv4 neighbor IPv4-UNDERLAY-PEERS activate @@ -571,7 +618,7 @@ stun server-profile INET-cv-pathfinder-pathfinder-Ethernet3 ip address 10.9.9.9 ssl profile profileA - server-profile MPLS-cv-pathfinder-pathfinder-Ethernet2 + server-profile MPLS-cv-pathfinder-pathfinder-Ethernet2_2 ip address 172.16.0.1 ssl profile profileA ! diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-transit1B.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-transit1B.cfg index 6af7a26db61..0f69e5f73c3 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-transit1B.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/cv-pathfinder-transit1B.cfg @@ -156,7 +156,7 @@ router path-selection keepalive interval 300 milliseconds failure-threshold 5 intervals ! local interface Ethernet2.42 - stun server-profile MPLS-cv-pathfinder-pathfinder-Ethernet2 + stun server-profile MPLS-cv-pathfinder-pathfinder-Ethernet2_2 ! peer dynamic ipsec disabled @@ -406,31 +406,21 @@ route-map RM-BGP-UNDERLAY-PEERS-IN permit 10 description Allow WAN HA peer interface prefixes match ip address prefix-list PL-WAN-HA-PEER-PREFIXES ! -route-map RM-BGP-UNDERLAY-PEERS-IN permit 20 - description Allow prefixes originated from the HA peer - match extcommunity ECL-EVPN-SOO - set as-path match all replacement auto auto -! -route-map RM-BGP-UNDERLAY-PEERS-IN permit 30 - description Use WAN routes from HA peer as backup +route-map RM-BGP-UNDERLAY-PEERS-IN deny 20 + description Deny other routes from the HA peer match as-path ASPATH-WAN - set community no-advertise ! route-map RM-BGP-UNDERLAY-PEERS-IN permit 40 description Mark prefixes originated from the LAN set extcommunity soo 192.168.43.1:422 additive ! route-map RM-BGP-UNDERLAY-PEERS-OUT permit 10 - description Advertise local routes towards LAN - match extcommunity ECL-EVPN-SOO -! -route-map RM-BGP-UNDERLAY-PEERS-OUT permit 20 - description Advertise routes received from WAN iBGP towards LAN + description Make routes learned from WAN HA peer less preferred on LAN routers match route-type internal + match tag 50 + set metric 50 ! -route-map RM-BGP-UNDERLAY-PEERS-OUT permit 30 - description Advertise WAN HA prefixes towards LAN - match ip address prefix-list PL-WAN-HA-PREFIXES +route-map RM-BGP-UNDERLAY-PEERS-OUT permit 20 ! route-map RM-CONN-2-BGP permit 10 match ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY @@ -450,6 +440,19 @@ route-map RM-EVPN-SOO-IN permit 20 route-map RM-EVPN-SOO-OUT permit 10 set extcommunity soo 192.168.43.1:422 additive ! +route-map RM-WAN-HA-PEER-IN permit 10 + description Set tag 50 on routes received from HA peer over EVPN + set tag 50 +! +route-map RM-WAN-HA-PEER-OUT permit 10 + description Make EVPN routes learned from WAN less preferred on HA peer + match route-type internal + set local-preference 50 +! +route-map RM-WAN-HA-PEER-OUT permit 20 + description Make locally injected routes less preferred on HA peer + set local-preference 75 +! router bfd multihop interval 300 min-rx 300 multiplier 3 ! @@ -476,6 +479,13 @@ router bgp 65000 neighbor 172.17.0.2 peer group IPv4-UNDERLAY-PEERS neighbor 172.17.0.2 remote-as 65199 neighbor 172.17.0.2 description site-ha-enabled-leaf1_Ethernet2 + neighbor 192.168.143.1 remote-as 65000 + neighbor 192.168.143.1 description cv-pathfinder-transit1A + neighbor 192.168.143.1 route-reflector-client + neighbor 192.168.143.1 update-source Dps1 + neighbor 192.168.143.1 route-map RM-WAN-HA-PEER-IN in + neighbor 192.168.143.1 route-map RM-WAN-HA-PEER-OUT out + neighbor 192.168.143.1 send-community neighbor 192.168.144.1 peer group WAN-OVERLAY-PEERS neighbor 192.168.144.1 description cv-pathfinder-pathfinder redistribute connected route-map RM-CONN-2-BGP @@ -484,6 +494,8 @@ router bgp 65000 neighbor WAN-OVERLAY-PEERS route-map RM-EVPN-SOO-IN in neighbor WAN-OVERLAY-PEERS route-map RM-EVPN-SOO-OUT out neighbor WAN-OVERLAY-PEERS activate + neighbor 192.168.143.1 activate + neighbor default next-hop-self received-evpn-routes route-type ip-prefix ! address-family ipv4 neighbor IPv4-UNDERLAY-PEERS activate @@ -571,7 +583,7 @@ stun server-profile INET-cv-pathfinder-pathfinder-Ethernet3 ip address 10.9.9.9 ssl profile profileA - server-profile MPLS-cv-pathfinder-pathfinder-Ethernet2 + server-profile MPLS-cv-pathfinder-pathfinder-Ethernet2_2 ip address 172.16.0.1 ssl profile profileA ! diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/evpn_services_l2_only_false.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/evpn_services_l2_only_false.cfg index fab320e9bcc..56b3d209d5a 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/evpn_services_l2_only_false.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/evpn_services_l2_only_false.cfg @@ -17,9 +17,12 @@ service routing protocols model multi-agent hostname evpn_services_l2_only_false ip name-server vrf MGMT 8.8.8.8 ip name-server vrf MGMT 192.168.200.5 +ip name-server vrf MGMT 2001:db8::1 +ip name-server vrf MGMT 2001:db8::2 ! ntp local-interface vrf MGMT Management1 ntp server vrf MGMT 192.168.200.5 prefer +ntp server vrf MGMT 2001:db8::3 ! snmp-server contact example@example.com snmp-server location EOS_DESIGNS_UNIT_TESTS evpn_services_l2_only_false @@ -179,6 +182,8 @@ interface Vlan110 description Tenant_A_OP_Zone_1 no shutdown vrf Tenant_A_OP_Zone + ip access-group TEST-IPV4-ACL-WITH-IP-FIELDS-IN_Vlan110 in + ip access-group TEST-IPV4-ACL-WITH-IP-FIELDS-OUT_Vlan110 out ip address virtual 10.1.10.1/24 ! interface Vlan111 @@ -415,6 +420,13 @@ ip virtual-router mac-address 00:dc:00:00:00:0a ! ip address virtual source-nat vrf Tenant_A_OP_Zone address 10.255.1.109 ! +ip access-list TEST-IPV4-ACL-WITH-IP-FIELDS-IN_Vlan110 + 15 deny ip any host 10.1.10.1 +! +ip access-list TEST-IPV4-ACL-WITH-IP-FIELDS-OUT_Vlan110 + remark Some remark will not require source and destination fields. + permit ip host 10.1.10.1 any +! ip routing ip routing vrf 12345678 no ip routing vrf MGMT diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/evpn_services_l2_only_true.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/evpn_services_l2_only_true.cfg index b34532bc7a0..6c88f826745 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/evpn_services_l2_only_true.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/evpn_services_l2_only_true.cfg @@ -17,9 +17,12 @@ service routing protocols model multi-agent hostname evpn_services_l2_only_true ip name-server vrf MGMT 8.8.8.8 ip name-server vrf MGMT 192.168.200.5 +ip name-server vrf MGMT 2001:db8::1 +ip name-server vrf MGMT 2001:db8::2 ! ntp local-interface vrf MGMT Management1 ntp server vrf MGMT 192.168.200.5 prefer +ntp server vrf MGMT 2001:db8::3 ! snmp-server contact example@example.com snmp-server location EOS_DESIGNS_UNIT_TESTS evpn_services_l2_only_true diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/evpn_vlan_bundle.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/evpn_vlan_bundle.cfg index 0fe5e51358a..795d6c194e7 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/evpn_vlan_bundle.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/evpn_vlan_bundle.cfg @@ -35,6 +35,12 @@ vlan 90 vlan 100 name vlan100 ! +vlan 110 + name research1 +! +vlan 120 + name research2 +! vlan 1008 name SVI_1 ! @@ -59,8 +65,16 @@ vlan 1014 vlan 1015 name SVI_8 ! +vlan 1016 + name SVI_9 +! +vlan 1017 + name SVI_10 +! vrf instance MGMT ! +vrf instance research1 +! vrf instance SIT2 ! vrf instance SIT3 @@ -117,6 +131,16 @@ interface Vlan1015 no shutdown vrf SIT3 ! +interface Vlan1016 + description SVI_9 + no shutdown + vrf research1 +! +interface Vlan1017 + description SVI_10 + no shutdown + vrf research1 +! interface Vxlan1 description evpn_vlan_bundle_VTEP vxlan source-interface Loopback1 @@ -129,6 +153,8 @@ interface Vxlan1 vxlan vlan 80 vni 10080 vxlan vlan 90 vni 20090 vxlan vlan 100 vni 20100 + vxlan vlan 110 vni 10110 + vxlan vlan 120 vni 10120 vxlan vlan 1008 vni 21008 vxlan vlan 1009 vni 21009 vxlan vlan 1010 vni 21010 @@ -137,12 +163,16 @@ interface Vxlan1 vxlan vlan 1013 vni 21013 vxlan vlan 1014 vni 21014 vxlan vlan 1015 vni 21015 + vxlan vlan 1016 vni 11016 + vxlan vlan 1017 vni 11017 + vxlan vrf research1 vni 654556 vxlan vrf SIT2 vni 654789 vxlan vrf SIT3 vni 654555 vxlan vrf SIT_VRF vni 789654 ! ip routing no ip routing vrf MGMT +ip routing vrf research1 ip routing vrf SIT2 ip routing vrf SIT3 ip routing vrf SIT_VRF @@ -200,6 +230,18 @@ router bgp 65101 redistribute learned vlan 1014-1015 ! + vlan-aware-bundle bundle5 + rd 1.1.1.1:555 + route-target both 405:555 + redistribute learned + vlan 120,1017 + ! + vlan-aware-bundle bundle6 + rd 1.1.1.1:666 + route-target both 406:666 + redistribute learned + vlan 110,1016 + ! vlan-aware-bundle SIT2 rd 10.10.0.3:655089 route-target both 655089:655089 @@ -225,6 +267,13 @@ router bgp 65101 no neighbor EVPN-OVERLAY-PEERS activate neighbor IPv4-UNDERLAY-PEERS activate ! + vrf research1 + rd 10.10.0.3:654556 + route-target import evpn 654556:654556 + route-target export evpn 654556:654556 + router-id 10.10.0.3 + redistribute connected + ! vrf SIT2 rd 10.10.0.3:654789 route-target import evpn 654789:654789 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/evpn_vlan_bundle_svi_l2vlan.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/evpn_vlan_bundle_svi_l2vlan.cfg new file mode 100644 index 00000000000..154c48a0beb --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/evpn_vlan_bundle_svi_l2vlan.cfg @@ -0,0 +1,149 @@ +!RANCID-CONTENT-TYPE: arista +! +vlan internal order ascending range 1006 1199 +! +transceiver qsfp default-mode 4x10G +! +service routing protocols model multi-agent +! +hostname evpn_vlan_bundle_svi_l2vlan +! +no enable password +no aaa root +! +vlan 10 + name storage_prod +! +vlan 20 + name storage_prod +! +vlan 90 + name vlan90 +! +vlan 100 + name vlan100 +! +vlan 1008 + name SVI_1 +! +vlan 1009 + name SVI_2 +! +vlan 1010 + name SVI_3 +! +vrf instance MGMT +! +vrf instance SIT_VRF +! +interface Loopback0 + description EVPN_Overlay_Peering + no shutdown + ip address 10.10.0.3/32 +! +interface Loopback1 + description VTEP_VXLAN_Tunnel_Source + no shutdown + ip address 10.11.0.3/32 +! +interface Vlan1008 + description SVI_1 + no shutdown + vrf SIT_VRF +! +interface Vlan1009 + description SVI_2 + no shutdown + vrf SIT_VRF +! +interface Vlan1010 + description SVI_3 + no shutdown + vrf SIT_VRF +! +interface Vxlan1 + description evpn_vlan_bundle_svi_l2vlan_VTEP + vxlan source-interface Loopback1 + vxlan udp-port 4789 + vxlan vlan 10 vni 20010 + vxlan vlan 20 vni 20020 + vxlan vlan 90 vni 20090 + vxlan vlan 100 vni 20100 + vxlan vlan 1008 vni 21008 + vxlan vlan 1009 vni 21009 + vxlan vlan 1010 vni 21010 + vxlan vrf SIT_VRF vni 789654 +! +ip routing +no ip routing vrf MGMT +ip routing vrf SIT_VRF +! +ip prefix-list PL-LOOPBACKS-EVPN-OVERLAY + seq 10 permit 10.10.0.0/24 eq 32 + seq 20 permit 10.11.0.0/24 eq 32 +! +route-map RM-CONN-2-BGP permit 10 + match ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY +! +router bfd + multihop interval 300 min-rx 300 multiplier 3 +! +router bgp 65101 + router-id 10.10.0.3 + maximum-paths 4 ecmp 4 + update wait-install + no bgp default ipv4-unicast + neighbor EVPN-OVERLAY-PEERS peer group + neighbor EVPN-OVERLAY-PEERS update-source Loopback0 + neighbor EVPN-OVERLAY-PEERS bfd + neighbor EVPN-OVERLAY-PEERS ebgp-multihop 3 + neighbor EVPN-OVERLAY-PEERS send-community + neighbor EVPN-OVERLAY-PEERS maximum-routes 0 + neighbor IPv4-UNDERLAY-PEERS peer group + neighbor IPv4-UNDERLAY-PEERS send-community + neighbor IPv4-UNDERLAY-PEERS maximum-routes 12000 + redistribute connected route-map RM-CONN-2-BGP + ! + vlan 10 + rd 10.10.0.3:20010 + route-target both 20010:20010 + redistribute learned + ! + vlan 1010 + rd 10.10.0.3:21010 + route-target both 21010:21010 + redistribute learned + ! + vlan 20 + rd 10.10.0.3:20020 + route-target both 20020:20020 + redistribute learned + ! + vlan-aware-bundle bundle3 + rd 1.1.1.1:333 + route-target both 303:333 + redistribute learned + vlan 90,100,1008-1009 + ! + address-family evpn + neighbor EVPN-OVERLAY-PEERS activate + ! + address-family ipv4 + no neighbor EVPN-OVERLAY-PEERS activate + neighbor IPv4-UNDERLAY-PEERS activate + ! + vrf SIT_VRF + rd 10.10.0.3:789654 + route-target import evpn 789654:789654 + route-target export evpn 789654:789654 + router-id 10.10.0.3 + redistribute connected +! +management api http-commands + protocol https + no shutdown + ! + vrf MGMT + no shutdown +! +end diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/flow-tracking-tests-l2-leaf1.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/flow-tracking-tests-l2-leaf1.cfg new file mode 100644 index 00000000000..50a5de9e5ac --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/flow-tracking-tests-l2-leaf1.cfg @@ -0,0 +1,74 @@ +!RANCID-CONTENT-TYPE: arista +! +vlan internal order ascending range 1006 1199 +! +flow tracking sampled + sample 10000 + tracker FLOW-TRACKER + record export on inactive timeout 70000 + record export on interval 300000 + exporter CV-TELEMETRY + collector 127.0.0.1 + local interface Loopback0 + template interval 3600000 + no shutdown +! +transceiver qsfp default-mode 4x10G +! +service routing protocols model multi-agent +! +hostname flow-tracking-tests-l2-leaf1 +! +no enable password +no aaa root +! +vlan 11 + name VLAN11 +! +vlan 4092 + name INBAND_MGMT +! +vrf instance MGMT +! +interface Port-Channel1 + description FLOW-TRACKING-TESTS-LEAF-MLAG_Po31 + no shutdown + switchport + switchport trunk allowed vlan 11,4092 + switchport mode trunk + flow tracker sampled FLOW-TRACKER +! +interface Ethernet1 + description FLOW-TRACKING-TESTS-LEAF3_Ethernet31 + no shutdown + channel-group 1 mode active +! +interface Ethernet2 + description FLOW-TRACKING-TESTS-LEAF4_Ethernet31 + no shutdown + channel-group 1 mode active +! +interface Management1 + description oob_management + no shutdown + vrf MGMT + ip address 192.168.0.201/24 +! +interface Vlan4092 + description Inband Management + no shutdown + mtu 1500 + ip address 10.254.254.4/24 +no ip routing vrf MGMT +! +ip route vrf MGMT 0.0.0.0/0 192.168.0.1 +ip route 0.0.0.0/0 10.254.254.1 +! +management api http-commands + protocol https + no shutdown + ! + vrf MGMT + no shutdown +! +end diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/flow-tracking-tests-l2-leaf2.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/flow-tracking-tests-l2-leaf2.cfg new file mode 100644 index 00000000000..fd315f8ed8f --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/flow-tracking-tests-l2-leaf2.cfg @@ -0,0 +1,74 @@ +!RANCID-CONTENT-TYPE: arista +! +vlan internal order ascending range 1006 1199 +! +flow tracking sampled + sample 10000 + tracker FLOW-TRACKER + record export on inactive timeout 70000 + record export on interval 300000 + exporter CV-TELEMETRY + collector 127.0.0.1 + local interface Loopback0 + template interval 3600000 + no shutdown +! +transceiver qsfp default-mode 4x10G +! +service routing protocols model multi-agent +! +hostname flow-tracking-tests-l2-leaf2 +! +no enable password +no aaa root +! +vlan 11 + name VLAN11 +! +vlan 4092 + name INBAND_MGMT +! +vrf instance MGMT +! +interface Port-Channel1 + description FLOW-TRACKING-TESTS-LEAF-MLAG_Po32 + no shutdown + switchport + switchport trunk allowed vlan 11,4092 + switchport mode trunk + flow tracker sampled FLOW-TRACKER +! +interface Ethernet1 + description FLOW-TRACKING-TESTS-LEAF3_Ethernet32 + no shutdown + channel-group 1 mode active +! +interface Ethernet2 + description FLOW-TRACKING-TESTS-LEAF4_Ethernet32 + no shutdown + channel-group 1 mode active +! +interface Management1 + description oob_management + no shutdown + vrf MGMT + ip address 192.168.0.202/24 +! +interface Vlan4092 + description Inband Management + no shutdown + mtu 1500 + ip address 10.254.254.5/24 +no ip routing vrf MGMT +! +ip route vrf MGMT 0.0.0.0/0 192.168.0.1 +ip route 0.0.0.0/0 10.254.254.1 +! +management api http-commands + protocol https + no shutdown + ! + vrf MGMT + no shutdown +! +end diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/flow-tracking-tests-leaf1.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/flow-tracking-tests-leaf1.cfg new file mode 100644 index 00000000000..45c93366691 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/flow-tracking-tests-leaf1.cfg @@ -0,0 +1,215 @@ +!RANCID-CONTENT-TYPE: arista +! +vlan internal order ascending range 1006 1199 +! +flow tracking hardware + tracker FLOW-TRACKER + record export on inactive timeout 50001 + record export on interval 300332 + exporter ayush_exporter + collector 127.0.0.2 + local interface Loopback0 + template interval 40002 + tracker FLOW-TRACKER-3 + record export on inactive timeout 50000 + record export on interval 300331 + exporter ayush_exporter + collector 127.0.0.1 + local interface Loopback0 + template interval 40000 + no shutdown +! +transceiver qsfp default-mode 4x10G +! +service routing protocols model multi-agent +! +hostname flow-tracking-tests-leaf1 +! +spanning-tree mode mstp +spanning-tree mst 0 priority 4096 +! +no enable password +no aaa root +! +vlan 11 + name VLAN11 +! +vrf instance MGMT +! +vrf instance VRF1 +! +interface Ethernet1 + description P2P_LINK_TO_FLOW-TRACKING-TESTS-SPINE1_Ethernet1 + no shutdown + mtu 9214 + no switchport + flow tracker hardware FLOW-TRACKER + ip address 10.254.2.1/31 +! +interface Ethernet2 + description P2P_LINK_TO_FLOW-TRACKING-TESTS-SPINE2_Ethernet2 + no shutdown + mtu 9214 + no switchport + flow tracker hardware FLOW-TRACKER + ip address 10.254.2.3/31 +! +interface Ethernet10 + description single-interface-true_eth1 + no shutdown + switchport access vlan 11 + switchport mode access + switchport + flow tracker hardware FLOW-TRACKER-3 +! +interface Ethernet11 + description single-interface-false_eth11 + no shutdown + switchport access vlan 11 + switchport mode access + switchport +! +interface Ethernet12 + description single-interface-no-definition_eth12 + no shutdown + switchport access vlan 11 + switchport mode access + switchport + flow tracker hardware FLOW-TRACKER +! +interface Ethernet13 + description single-interface-true4_eth1 + no shutdown + switchport access vlan 11 + switchport mode access + switchport + flow tracker hardware FLOW-TRACKER +! +interface Ethernet81 + no shutdown + no switchport + flow tracker hardware FLOW-TRACKER-3 + vrf VRF1 + ip address 10.1.55.0/31 +! +interface Ethernet82 + no shutdown + no switchport + vrf VRF1 + ip address 10.1.55.0/31 +! +interface Ethernet83 + no shutdown + no switchport + flow tracker hardware FLOW-TRACKER + vrf VRF1 + ip address 10.1.55.0/31 +! +interface Ethernet84 + no shutdown + no switchport + flow tracker hardware FLOW-TRACKER + vrf VRF1 + ip address 10.1.55.0/31 +! +interface Loopback0 + description EVPN_Overlay_Peering + no shutdown + ip address 10.254.1.1/32 +! +interface Loopback1 + description VTEP_VXLAN_Tunnel_Source + no shutdown + ip address 10.254.11.1/32 +! +interface Management1 + description oob_management + no shutdown + vrf MGMT + ip address 192.168.0.101/24 +! +interface Vlan11 + description VLAN11 + no shutdown + vrf VRF1 + ip address 172.16.11.1/24 +! +interface Vxlan1 + description flow-tracking-tests-leaf1_VTEP + vxlan source-interface Loopback1 + vxlan udp-port 4789 + vxlan vlan 11 vni 10011 + vxlan vrf VRF1 vni 1 +! +ip virtual-router mac-address 00:11:22:33:44:55 +! +ip routing +no ip routing vrf MGMT +ip routing vrf VRF1 +! +ip prefix-list PL-LOOPBACKS-EVPN-OVERLAY + seq 10 permit 10.254.1.0/27 eq 32 + seq 20 permit 10.254.11.0/27 eq 32 +! +ip route vrf MGMT 0.0.0.0/0 192.168.0.1 +! +route-map RM-CONN-2-BGP permit 10 + match ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY +! +router bfd + multihop interval 300 min-rx 300 multiplier 3 +! +router bgp 65101 + router-id 10.254.1.1 + maximum-paths 4 ecmp 4 + no bgp default ipv4-unicast + neighbor EVPN-OVERLAY-PEERS peer group + neighbor EVPN-OVERLAY-PEERS update-source Loopback0 + neighbor EVPN-OVERLAY-PEERS bfd + neighbor EVPN-OVERLAY-PEERS ebgp-multihop 3 + neighbor EVPN-OVERLAY-PEERS send-community + neighbor EVPN-OVERLAY-PEERS maximum-routes 0 + neighbor IPv4-UNDERLAY-PEERS peer group + neighbor IPv4-UNDERLAY-PEERS send-community + neighbor IPv4-UNDERLAY-PEERS maximum-routes 12000 + neighbor 10.254.2.0 peer group IPv4-UNDERLAY-PEERS + neighbor 10.254.2.0 remote-as 65200 + neighbor 10.254.2.0 description flow-tracking-tests-spine1_Ethernet1 + neighbor 10.254.2.2 peer group IPv4-UNDERLAY-PEERS + neighbor 10.254.2.2 remote-as 65200 + neighbor 10.254.2.2 description flow-tracking-tests-spine2_Ethernet2 + neighbor 10.255.0.1 peer group EVPN-OVERLAY-PEERS + neighbor 10.255.0.1 remote-as 65200 + neighbor 10.255.0.1 description flow-tracking-tests-spine1 + neighbor 10.255.0.2 peer group EVPN-OVERLAY-PEERS + neighbor 10.255.0.2 remote-as 65200 + neighbor 10.255.0.2 description flow-tracking-tests-spine2 + redistribute connected route-map RM-CONN-2-BGP + ! + vlan 11 + rd 10.254.1.1:10011 + route-target both 10011:10011 + redistribute learned + ! + address-family evpn + neighbor EVPN-OVERLAY-PEERS activate + ! + address-family ipv4 + no neighbor EVPN-OVERLAY-PEERS activate + neighbor IPv4-UNDERLAY-PEERS activate + ! + vrf VRF1 + rd 10.254.1.1:1 + route-target import evpn 1:1 + route-target export evpn 1:1 + router-id 10.254.1.1 + redistribute connected +! +management api http-commands + protocol https + no shutdown + ! + vrf MGMT + no shutdown +! +end diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/flow-tracking-tests-leaf2.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/flow-tracking-tests-leaf2.cfg new file mode 100644 index 00000000000..cf7a0447088 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/flow-tracking-tests-leaf2.cfg @@ -0,0 +1,214 @@ +!RANCID-CONTENT-TYPE: arista +! +vlan internal order ascending range 1006 1199 +! +flow tracking sampled + encapsulation + sample 50000 + hardware offload ipv4 ipv6 + hardware offload threshold minimum 1332 samples + tracker FLOW-TRACKER-3 + record export on inactive timeout 50000 + record export on interval 300331 + exporter ayush_exporter + collector 127.0.0.1 + local interface Loopback0 + template interval 40000 + tracker FLOW-TRACKER-4 + record export on inactive timeout 50020 + record export on interval 300321 + exporter ayush_exporter + collector 127.0.2.1 + local interface Loopback0 + template interval 40020 + no shutdown +! +transceiver qsfp default-mode 4x10G +! +service routing protocols model multi-agent +! +hostname flow-tracking-tests-leaf2 +! +spanning-tree mode mstp +spanning-tree mst 0 priority 4096 +! +no enable password +no aaa root +! +vlan 11 + name VLAN11 +! +vrf instance MGMT +! +vrf instance VRF1 +! +interface Ethernet1 + description P2P_LINK_TO_FLOW-TRACKING-TESTS-SPINE1_Ethernet3 + no shutdown + mtu 9214 + no switchport + ip address 10.254.2.5/31 +! +interface Ethernet2 + description P2P_LINK_TO_FLOW-TRACKING-TESTS-SPINE2_Ethernet4 + no shutdown + mtu 9214 + no switchport + ip address 10.254.2.7/31 +! +interface Ethernet10 + description single-interface-true_eth2 + no shutdown + switchport access vlan 11 + switchport mode access + switchport +! +interface Ethernet11 + description single-interface-false_eth12 + no shutdown + switchport access vlan 11 + switchport mode access + switchport +! +interface Ethernet12 + description single-interface-no-definition_eth13 + no shutdown + switchport access vlan 11 + switchport mode access + switchport + flow tracker sampled FLOW-TRACKER-3 +! +interface Ethernet13 + description single-interface-true4_eth1 + no shutdown + switchport access vlan 11 + switchport mode access + switchport +! +interface Ethernet81 + no shutdown + no switchport + flow tracker sampled FLOW-TRACKER-3 + vrf VRF1 + ip address 10.1.55.2/31 +! +interface Ethernet82 + no shutdown + no switchport + vrf VRF1 + ip address 10.1.55.2/31 +! +interface Ethernet83 + no shutdown + no switchport + vrf VRF1 + ip address 10.1.55.2/31 +! +interface Ethernet84 + no shutdown + no switchport + flow tracker sampled FLOW-TRACKER-4 + vrf VRF1 + ip address 10.1.55.2/31 +! +interface Loopback0 + description EVPN_Overlay_Peering + no shutdown + ip address 10.254.1.2/32 +! +interface Loopback1 + description VTEP_VXLAN_Tunnel_Source + no shutdown + ip address 10.254.11.2/32 +! +interface Management1 + description oob_management + no shutdown + vrf MGMT + ip address 192.168.0.102/24 +! +interface Vlan11 + description VLAN11 + no shutdown + vrf VRF1 + ip address 172.17.11.1/24 +! +interface Vxlan1 + description flow-tracking-tests-leaf2_VTEP + vxlan source-interface Loopback1 + vxlan udp-port 4789 + vxlan vlan 11 vni 10011 + vxlan vrf VRF1 vni 1 +! +ip virtual-router mac-address 00:11:22:33:44:55 +! +ip routing +no ip routing vrf MGMT +ip routing vrf VRF1 +! +ip prefix-list PL-LOOPBACKS-EVPN-OVERLAY + seq 10 permit 10.254.1.0/27 eq 32 + seq 20 permit 10.254.11.0/27 eq 32 +! +ip route vrf MGMT 0.0.0.0/0 192.168.0.1 +! +route-map RM-CONN-2-BGP permit 10 + match ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY +! +router bfd + multihop interval 300 min-rx 300 multiplier 3 +! +router bgp 65102 + router-id 10.254.1.2 + maximum-paths 4 ecmp 4 + no bgp default ipv4-unicast + neighbor EVPN-OVERLAY-PEERS peer group + neighbor EVPN-OVERLAY-PEERS update-source Loopback0 + neighbor EVPN-OVERLAY-PEERS bfd + neighbor EVPN-OVERLAY-PEERS ebgp-multihop 3 + neighbor EVPN-OVERLAY-PEERS send-community + neighbor EVPN-OVERLAY-PEERS maximum-routes 0 + neighbor IPv4-UNDERLAY-PEERS peer group + neighbor IPv4-UNDERLAY-PEERS send-community + neighbor IPv4-UNDERLAY-PEERS maximum-routes 12000 + neighbor 10.254.2.4 peer group IPv4-UNDERLAY-PEERS + neighbor 10.254.2.4 remote-as 65200 + neighbor 10.254.2.4 description flow-tracking-tests-spine1_Ethernet3 + neighbor 10.254.2.6 peer group IPv4-UNDERLAY-PEERS + neighbor 10.254.2.6 remote-as 65200 + neighbor 10.254.2.6 description flow-tracking-tests-spine2_Ethernet4 + neighbor 10.255.0.1 peer group EVPN-OVERLAY-PEERS + neighbor 10.255.0.1 remote-as 65200 + neighbor 10.255.0.1 description flow-tracking-tests-spine1 + neighbor 10.255.0.2 peer group EVPN-OVERLAY-PEERS + neighbor 10.255.0.2 remote-as 65200 + neighbor 10.255.0.2 description flow-tracking-tests-spine2 + redistribute connected route-map RM-CONN-2-BGP + ! + vlan 11 + rd 10.254.1.2:10011 + route-target both 10011:10011 + redistribute learned + ! + address-family evpn + neighbor EVPN-OVERLAY-PEERS activate + ! + address-family ipv4 + no neighbor EVPN-OVERLAY-PEERS activate + neighbor IPv4-UNDERLAY-PEERS activate + ! + vrf VRF1 + rd 10.254.1.2:1 + route-target import evpn 1:1 + route-target export evpn 1:1 + router-id 10.254.1.2 + redistribute connected +! +management api http-commands + protocol https + no shutdown + ! + vrf MGMT + no shutdown +! +end diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/flow-tracking-tests-leaf3.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/flow-tracking-tests-leaf3.cfg new file mode 100644 index 00000000000..515caae12ac --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/flow-tracking-tests-leaf3.cfg @@ -0,0 +1,317 @@ +!RANCID-CONTENT-TYPE: arista +! +vlan internal order ascending range 1006 1199 +! +flow tracking hardware + tracker FLOW-TRACKER + record export on inactive timeout 50001 + record export on interval 300332 + exporter ayush_exporter + collector 127.0.0.2 + local interface Loopback0 + template interval 40002 + tracker FLOW-TRACKER-3 + record export on inactive timeout 50000 + record export on interval 300331 + exporter ayush_exporter + collector 127.0.0.1 + local interface Loopback0 + template interval 40000 + no shutdown +! +transceiver qsfp default-mode 4x10G +! +service routing protocols model multi-agent +! +hostname flow-tracking-tests-leaf3 +! +spanning-tree mode mstp +no spanning-tree vlan-id 4093-4094 +spanning-tree mst 0 priority 4096 +! +no enable password +no aaa root +! +vlan 11 + name VLAN11 +! +vlan 3000 + name MLAG_iBGP_VRF1 + trunk group LEAF_PEER_L3 +! +vlan 4092 + name INBAND_MGMT +! +vlan 4093 + name LEAF_PEER_L3 + trunk group LEAF_PEER_L3 +! +vlan 4094 + name MLAG_PEER + trunk group MLAG +! +vrf instance MGMT +! +vrf instance VRF1 +! +interface Port-Channel14 + description port-channel-interface-true + no shutdown + switchport + switchport access vlan 11 + mlag 14 + spanning-tree portfast +! +interface Port-Channel15 + description port-channel-interface-false + no shutdown + switchport + switchport access vlan 11 + flow tracker hardware FLOW-TRACKER + mlag 15 + spanning-tree portfast +! +interface Port-Channel16 + description port-channel-interface-no-definition + no shutdown + switchport + switchport access vlan 11 + mlag 16 + spanning-tree portfast +! +interface Port-Channel21 + description MLAG_PEER_flow-tracking-tests-leaf4_Po21 + no shutdown + switchport + switchport mode trunk + switchport trunk group LEAF_PEER_L3 + switchport trunk group MLAG +! +interface Port-Channel31 + description FLOW-TRACKING-TESTS-L2-LEAF1_Po1 + no shutdown + switchport + switchport trunk allowed vlan 11,4092 + switchport mode trunk + flow tracker hardware FLOW-TRACKER + mlag 31 +! +interface Port-Channel32 + description FLOW-TRACKING-TESTS-L2-LEAF2_Po1 + no shutdown + switchport + switchport trunk allowed vlan 11,4092 + switchport mode trunk + flow tracker hardware FLOW-TRACKER + mlag 32 +! +interface Ethernet1 + description P2P_LINK_TO_FLOW-TRACKING-TESTS-SPINE1_Ethernet5 + no shutdown + mtu 9214 + no switchport + flow tracker hardware FLOW-TRACKER-3 + ip address 10.254.2.17/31 +! +interface Ethernet2 + description P2P_LINK_TO_FLOW-TRACKING-TESTS-SPINE2_Ethernet6 + no shutdown + mtu 9214 + no switchport + flow tracker hardware FLOW-TRACKER-3 + ip address 10.254.2.19/31 +! +interface Ethernet14 + description port-channel-interface-true_PCI1 + no shutdown + channel-group 14 mode on +! +interface Ethernet15 + description port-channel-interface-false_PCI11 + no shutdown + channel-group 15 mode on +! +interface Ethernet16 + description port-channel-interface-no-definition_PCI13 + no shutdown + channel-group 16 mode on +! +interface Ethernet21 + description MLAG_PEER_flow-tracking-tests-leaf4_Ethernet21 + no shutdown + channel-group 21 mode active +! +interface Ethernet22 + description MLAG_PEER_flow-tracking-tests-leaf4_Ethernet22 + no shutdown + channel-group 21 mode active +! +interface Ethernet31 + description FLOW-TRACKING-TESTS-L2-LEAF1_Ethernet1 + no shutdown + channel-group 31 mode active +! +interface Ethernet32 + description FLOW-TRACKING-TESTS-L2-LEAF2_Ethernet1 + no shutdown + channel-group 32 mode active +! +interface Loopback0 + description EVPN_Overlay_Peering + no shutdown + ip address 10.254.1.5/32 +! +interface Loopback1 + description VTEP_VXLAN_Tunnel_Source + no shutdown + ip address 10.254.11.5/32 +! +interface Management1 + description oob_management + no shutdown + vrf MGMT + ip address 192.168.0.103/24 +! +interface Vlan11 + description VLAN11 + no shutdown + vrf VRF1 +! +interface Vlan3000 + description MLAG_PEER_L3_iBGP: vrf VRF1 + no shutdown + mtu 9214 + vrf VRF1 + ip address 10.254.1.104/31 +! +interface Vlan4092 + description Inband Management + no shutdown + mtu 1500 + ip address 10.254.254.2/24 + ip attached-host route export 19 + ip virtual-router address 10.254.254.1 +! +interface Vlan4093 + description MLAG_PEER_L3_PEERING + no shutdown + mtu 9214 + ip address 10.254.1.104/31 +! +interface Vlan4094 + description MLAG_PEER + no shutdown + mtu 9214 + no autostate + ip address 10.254.1.72/31 +! +interface Vxlan1 + description flow-tracking-tests-leaf3_VTEP + vxlan source-interface Loopback1 + vxlan virtual-router encapsulation mac-address mlag-system-id + vxlan udp-port 4789 + vxlan vlan 11 vni 10011 + vxlan vrf VRF1 vni 1 +! +ip virtual-router mac-address 00:11:22:33:44:55 +! +ip routing +no ip routing vrf MGMT +ip routing vrf VRF1 +! +ip prefix-list PL-L2LEAF-INBAND-MGMT + seq 10 permit 10.254.254.0/24 +! +ip prefix-list PL-LOOPBACKS-EVPN-OVERLAY + seq 10 permit 10.254.1.0/27 eq 32 + seq 20 permit 10.254.11.0/27 eq 32 +! +mlag configuration + domain-id flow-tracking-tests-leaf-mlag + local-interface Vlan4094 + peer-address 10.254.1.73 + peer-link Port-Channel21 + reload-delay mlag 300 + reload-delay non-mlag 330 +! +ip route vrf MGMT 0.0.0.0/0 192.168.0.1 +! +route-map RM-CONN-2-BGP permit 10 + match ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY +! +route-map RM-CONN-2-BGP permit 20 + match ip address prefix-list PL-L2LEAF-INBAND-MGMT +! +route-map RM-MLAG-PEER-IN permit 10 + description Make routes learned over MLAG Peer-link less preferred on spines to ensure optimal routing + set origin incomplete +! +router bfd + multihop interval 300 min-rx 300 multiplier 3 +! +router bgp 65105 + router-id 10.254.1.5 + maximum-paths 4 ecmp 4 + no bgp default ipv4-unicast + neighbor EVPN-OVERLAY-PEERS peer group + neighbor EVPN-OVERLAY-PEERS update-source Loopback0 + neighbor EVPN-OVERLAY-PEERS bfd + neighbor EVPN-OVERLAY-PEERS ebgp-multihop 3 + neighbor EVPN-OVERLAY-PEERS send-community + neighbor EVPN-OVERLAY-PEERS maximum-routes 0 + neighbor IPv4-UNDERLAY-PEERS peer group + neighbor IPv4-UNDERLAY-PEERS send-community + neighbor IPv4-UNDERLAY-PEERS maximum-routes 12000 + neighbor MLAG-IPv4-UNDERLAY-PEER peer group + neighbor MLAG-IPv4-UNDERLAY-PEER remote-as 65105 + neighbor MLAG-IPv4-UNDERLAY-PEER next-hop-self + neighbor MLAG-IPv4-UNDERLAY-PEER description flow-tracking-tests-leaf4 + neighbor MLAG-IPv4-UNDERLAY-PEER send-community + neighbor MLAG-IPv4-UNDERLAY-PEER maximum-routes 12000 + neighbor MLAG-IPv4-UNDERLAY-PEER route-map RM-MLAG-PEER-IN in + neighbor 10.254.1.105 peer group MLAG-IPv4-UNDERLAY-PEER + neighbor 10.254.1.105 description flow-tracking-tests-leaf4 + neighbor 10.254.2.16 peer group IPv4-UNDERLAY-PEERS + neighbor 10.254.2.16 remote-as 65200 + neighbor 10.254.2.16 description flow-tracking-tests-spine1_Ethernet5 + neighbor 10.254.2.18 peer group IPv4-UNDERLAY-PEERS + neighbor 10.254.2.18 remote-as 65200 + neighbor 10.254.2.18 description flow-tracking-tests-spine2_Ethernet6 + neighbor 10.255.0.1 peer group EVPN-OVERLAY-PEERS + neighbor 10.255.0.1 remote-as 65200 + neighbor 10.255.0.1 description flow-tracking-tests-spine1 + neighbor 10.255.0.2 peer group EVPN-OVERLAY-PEERS + neighbor 10.255.0.2 remote-as 65200 + neighbor 10.255.0.2 description flow-tracking-tests-spine2 + redistribute attached-host + redistribute connected route-map RM-CONN-2-BGP + ! + vlan 11 + rd 10.254.1.5:10011 + route-target both 10011:10011 + redistribute learned + ! + address-family evpn + neighbor EVPN-OVERLAY-PEERS activate + ! + address-family ipv4 + no neighbor EVPN-OVERLAY-PEERS activate + neighbor IPv4-UNDERLAY-PEERS activate + neighbor MLAG-IPv4-UNDERLAY-PEER activate + ! + vrf VRF1 + rd 10.254.1.5:1 + route-target import evpn 1:1 + route-target export evpn 1:1 + router-id 10.254.1.5 + neighbor 10.254.1.105 peer group MLAG-IPv4-UNDERLAY-PEER + redistribute connected +! +management api http-commands + protocol https + no shutdown + ! + vrf MGMT + no shutdown +! +end diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/flow-tracking-tests-leaf4.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/flow-tracking-tests-leaf4.cfg new file mode 100644 index 00000000000..edcc79c1377 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/flow-tracking-tests-leaf4.cfg @@ -0,0 +1,317 @@ +!RANCID-CONTENT-TYPE: arista +! +vlan internal order ascending range 1006 1199 +! +flow tracking hardware + tracker FLOW-TRACKER + record export on inactive timeout 50001 + record export on interval 300332 + exporter ayush_exporter + collector 127.0.0.2 + local interface Loopback0 + template interval 40002 + tracker FLOW-TRACKER-4 + record export on inactive timeout 50020 + record export on interval 300321 + exporter ayush_exporter + collector 127.0.2.1 + local interface Loopback0 + template interval 40020 + no shutdown +! +transceiver qsfp default-mode 4x10G +! +service routing protocols model multi-agent +! +hostname flow-tracking-tests-leaf4 +! +spanning-tree mode mstp +no spanning-tree vlan-id 4093-4094 +spanning-tree mst 0 priority 4096 +! +no enable password +no aaa root +! +vlan 11 + name VLAN11 +! +vlan 3000 + name MLAG_iBGP_VRF1 + trunk group LEAF_PEER_L3 +! +vlan 4092 + name INBAND_MGMT +! +vlan 4093 + name LEAF_PEER_L3 + trunk group LEAF_PEER_L3 +! +vlan 4094 + name MLAG_PEER + trunk group MLAG +! +vrf instance MGMT +! +vrf instance VRF1 +! +interface Port-Channel14 + description port-channel-interface-true + no shutdown + switchport + switchport access vlan 11 + flow tracker hardware FLOW-TRACKER-4 + mlag 14 + spanning-tree portfast +! +interface Port-Channel15 + description port-channel-interface-false + no shutdown + switchport + switchport access vlan 11 + flow tracker hardware FLOW-TRACKER + mlag 15 + spanning-tree portfast +! +interface Port-Channel16 + description port-channel-interface-no-definition + no shutdown + switchport + switchport access vlan 11 + mlag 16 + spanning-tree portfast +! +interface Port-Channel21 + description MLAG_PEER_flow-tracking-tests-leaf3_Po21 + no shutdown + switchport + switchport mode trunk + switchport trunk group LEAF_PEER_L3 + switchport trunk group MLAG + flow tracker hardware FLOW-TRACKER +! +interface Port-Channel31 + description FLOW-TRACKING-TESTS-L2-LEAF1_Po1 + no shutdown + switchport + switchport trunk allowed vlan 11,4092 + switchport mode trunk + mlag 31 +! +interface Port-Channel32 + description FLOW-TRACKING-TESTS-L2-LEAF2_Po1 + no shutdown + switchport + switchport trunk allowed vlan 11,4092 + switchport mode trunk + mlag 32 +! +interface Ethernet1 + description P2P_LINK_TO_FLOW-TRACKING-TESTS-SPINE1_Ethernet7 + no shutdown + mtu 9214 + no switchport + flow tracker hardware FLOW-TRACKER + ip address 10.254.2.21/31 +! +interface Ethernet2 + description P2P_LINK_TO_FLOW-TRACKING-TESTS-SPINE2_Ethernet8 + no shutdown + mtu 9214 + no switchport + flow tracker hardware FLOW-TRACKER + ip address 10.254.2.23/31 +! +interface Ethernet14 + description port-channel-interface-true_PCI2 + no shutdown + channel-group 14 mode on +! +interface Ethernet15 + description port-channel-interface-false_PCI12 + no shutdown + channel-group 15 mode on +! +interface Ethernet16 + description port-channel-interface-no-definition_PCI14 + no shutdown + channel-group 16 mode on +! +interface Ethernet21 + description MLAG_PEER_flow-tracking-tests-leaf3_Ethernet21 + no shutdown + channel-group 21 mode active +! +interface Ethernet22 + description MLAG_PEER_flow-tracking-tests-leaf3_Ethernet22 + no shutdown + channel-group 21 mode active +! +interface Ethernet31 + description FLOW-TRACKING-TESTS-L2-LEAF1_Ethernet2 + no shutdown + channel-group 31 mode active +! +interface Ethernet32 + description FLOW-TRACKING-TESTS-L2-LEAF2_Ethernet2 + no shutdown + channel-group 32 mode active +! +interface Loopback0 + description EVPN_Overlay_Peering + no shutdown + ip address 10.254.1.6/32 +! +interface Loopback1 + description VTEP_VXLAN_Tunnel_Source + no shutdown + ip address 10.254.11.5/32 +! +interface Management1 + description oob_management + no shutdown + vrf MGMT + ip address 192.168.0.104/24 +! +interface Vlan11 + description VLAN11 + no shutdown + vrf VRF1 +! +interface Vlan3000 + description MLAG_PEER_L3_iBGP: vrf VRF1 + no shutdown + mtu 9214 + vrf VRF1 + ip address 10.254.1.105/31 +! +interface Vlan4092 + description Inband Management + no shutdown + mtu 1500 + ip address 10.254.254.3/24 + ip attached-host route export 19 + ip virtual-router address 10.254.254.1 +! +interface Vlan4093 + description MLAG_PEER_L3_PEERING + no shutdown + mtu 9214 + ip address 10.254.1.105/31 +! +interface Vlan4094 + description MLAG_PEER + no shutdown + mtu 9214 + no autostate + ip address 10.254.1.73/31 +! +interface Vxlan1 + description flow-tracking-tests-leaf4_VTEP + vxlan source-interface Loopback1 + vxlan virtual-router encapsulation mac-address mlag-system-id + vxlan udp-port 4789 + vxlan vlan 11 vni 10011 + vxlan vrf VRF1 vni 1 +! +ip virtual-router mac-address 00:11:22:33:44:55 +! +ip routing +no ip routing vrf MGMT +ip routing vrf VRF1 +! +ip prefix-list PL-L2LEAF-INBAND-MGMT + seq 10 permit 10.254.254.0/24 +! +ip prefix-list PL-LOOPBACKS-EVPN-OVERLAY + seq 10 permit 10.254.1.0/27 eq 32 + seq 20 permit 10.254.11.0/27 eq 32 +! +mlag configuration + domain-id flow-tracking-tests-leaf-mlag + local-interface Vlan4094 + peer-address 10.254.1.72 + peer-link Port-Channel21 + reload-delay mlag 300 + reload-delay non-mlag 330 +! +ip route vrf MGMT 0.0.0.0/0 192.168.0.1 +! +route-map RM-CONN-2-BGP permit 10 + match ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY +! +route-map RM-CONN-2-BGP permit 20 + match ip address prefix-list PL-L2LEAF-INBAND-MGMT +! +route-map RM-MLAG-PEER-IN permit 10 + description Make routes learned over MLAG Peer-link less preferred on spines to ensure optimal routing + set origin incomplete +! +router bfd + multihop interval 300 min-rx 300 multiplier 3 +! +router bgp 65105 + router-id 10.254.1.6 + maximum-paths 4 ecmp 4 + no bgp default ipv4-unicast + neighbor EVPN-OVERLAY-PEERS peer group + neighbor EVPN-OVERLAY-PEERS update-source Loopback0 + neighbor EVPN-OVERLAY-PEERS bfd + neighbor EVPN-OVERLAY-PEERS ebgp-multihop 3 + neighbor EVPN-OVERLAY-PEERS send-community + neighbor EVPN-OVERLAY-PEERS maximum-routes 0 + neighbor IPv4-UNDERLAY-PEERS peer group + neighbor IPv4-UNDERLAY-PEERS send-community + neighbor IPv4-UNDERLAY-PEERS maximum-routes 12000 + neighbor MLAG-IPv4-UNDERLAY-PEER peer group + neighbor MLAG-IPv4-UNDERLAY-PEER remote-as 65105 + neighbor MLAG-IPv4-UNDERLAY-PEER next-hop-self + neighbor MLAG-IPv4-UNDERLAY-PEER description flow-tracking-tests-leaf3 + neighbor MLAG-IPv4-UNDERLAY-PEER send-community + neighbor MLAG-IPv4-UNDERLAY-PEER maximum-routes 12000 + neighbor MLAG-IPv4-UNDERLAY-PEER route-map RM-MLAG-PEER-IN in + neighbor 10.254.1.104 peer group MLAG-IPv4-UNDERLAY-PEER + neighbor 10.254.1.104 description flow-tracking-tests-leaf3 + neighbor 10.254.2.20 peer group IPv4-UNDERLAY-PEERS + neighbor 10.254.2.20 remote-as 65200 + neighbor 10.254.2.20 description flow-tracking-tests-spine1_Ethernet7 + neighbor 10.254.2.22 peer group IPv4-UNDERLAY-PEERS + neighbor 10.254.2.22 remote-as 65200 + neighbor 10.254.2.22 description flow-tracking-tests-spine2_Ethernet8 + neighbor 10.255.0.1 peer group EVPN-OVERLAY-PEERS + neighbor 10.255.0.1 remote-as 65200 + neighbor 10.255.0.1 description flow-tracking-tests-spine1 + neighbor 10.255.0.2 peer group EVPN-OVERLAY-PEERS + neighbor 10.255.0.2 remote-as 65200 + neighbor 10.255.0.2 description flow-tracking-tests-spine2 + redistribute attached-host + redistribute connected route-map RM-CONN-2-BGP + ! + vlan 11 + rd 10.254.1.6:10011 + route-target both 10011:10011 + redistribute learned + ! + address-family evpn + neighbor EVPN-OVERLAY-PEERS activate + ! + address-family ipv4 + no neighbor EVPN-OVERLAY-PEERS activate + neighbor IPv4-UNDERLAY-PEERS activate + neighbor MLAG-IPv4-UNDERLAY-PEER activate + ! + vrf VRF1 + rd 10.254.1.6:1 + route-target import evpn 1:1 + route-target export evpn 1:1 + router-id 10.254.1.6 + neighbor 10.254.1.104 peer group MLAG-IPv4-UNDERLAY-PEER + redistribute connected +! +management api http-commands + protocol https + no shutdown + ! + vrf MGMT + no shutdown +! +end diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/flow-tracking-tests-spine1.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/flow-tracking-tests-spine1.cfg new file mode 100644 index 00000000000..3854ce2cc32 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/flow-tracking-tests-spine1.cfg @@ -0,0 +1,204 @@ +!RANCID-CONTENT-TYPE: arista +! +vlan internal order ascending range 1006 1199 +! +flow tracking sampled + sample 10000 + tracker FLOW-TRACKER + record export on inactive timeout 50001 + record export on interval 300332 + exporter ayush_exporter + collector 127.0.0.2 + local interface Loopback0 + template interval 40002 + tracker FLOW-TRACKER-1 + record export on inactive timeout 50000 + record export on interval 300331 + record export mpls + exporter ayush_exporter + collector 127.0.0.1 + local interface Loopback0 + template interval 40000 + flow table size 4331 entries + no shutdown +! +transceiver qsfp default-mode 4x10G +! +service routing protocols model multi-agent +! +hostname flow-tracking-tests-spine1 +! +spanning-tree mode none +! +no enable password +no aaa root +! +vrf instance MGMT +! +interface Ethernet1 + description P2P_LINK_TO_FLOW-TRACKING-TESTS-LEAF1_Ethernet1 + no shutdown + mtu 9214 + no switchport + flow tracker sampled FLOW-TRACKER + ip address 10.254.2.0/31 +! +interface Ethernet3 + description P2P_LINK_TO_FLOW-TRACKING-TESTS-LEAF2_Ethernet1 + no shutdown + mtu 9214 + no switchport + flow tracker sampled FLOW-TRACKER + ip address 10.254.2.4/31 +! +interface Ethernet5 + description P2P_LINK_TO_FLOW-TRACKING-TESTS-LEAF3_Ethernet1 + no shutdown + mtu 9214 + no switchport + flow tracker sampled FLOW-TRACKER + ip address 10.254.2.16/31 +! +interface Ethernet7 + description P2P_LINK_TO_FLOW-TRACKING-TESTS-LEAF4_Ethernet1 + no shutdown + mtu 9214 + no switchport + flow tracker sampled FLOW-TRACKER + ip address 10.254.2.20/31 +! +interface Ethernet9 + description P2P_LINK_TO_flow-tracking-tests-spine2_Ethernet9 + no shutdown + mtu 9214 + no switchport + flow tracker sampled FLOW-TRACKER +! +interface Ethernet10 + description P2P_LINK_TO_flow-tracking-tests-spine2_Ethernet10 + no shutdown + mtu 9214 + no switchport + flow tracker sampled FLOW-TRACKER-1 +! +interface Ethernet11 + description P2P_LINK_TO_flow-tracking-tests-spine2_Ethernet11 + no shutdown + mtu 9214 + no switchport +! +interface Ethernet12 + description P2P_LINK_TO_flow-tracking-tests-spine2_Ethernet12 + no shutdown + mtu 9214 + no switchport + flow tracker sampled FLOW-TRACKER +! +interface Ethernet13 + description P2P_LINK_TO_flow-tracking-tests-spine2_Ethernet13 + no shutdown + mtu 9214 + no switchport + flow tracker sampled FLOW-TRACKER +! +interface Ethernet14 + description P2P_LINK_TO_flow-tracking-tests-spine2_Ethernet14 + no shutdown + mtu 9214 + no switchport + flow tracker sampled FLOW-TRACKER-1 +! +interface Ethernet15 + description P2P_LINK_TO_flow-tracking-tests-spine2_Ethernet15 + no shutdown + mtu 9214 + no switchport +! +interface Ethernet16 + description P2P_LINK_TO_flow-tracking-tests-spine2_Ethernet16 + no shutdown + mtu 9214 + no switchport + flow tracker sampled FLOW-TRACKER +! +interface Loopback0 + description EVPN_Overlay_Peering + no shutdown + ip address 10.255.0.1/32 +! +interface Management1 + description oob_management + no shutdown + vrf MGMT + ip address 192.168.0.11/24 +! +ip routing +no ip routing vrf MGMT +! +ip prefix-list PL-LOOPBACKS-EVPN-OVERLAY + seq 10 permit 10.255.0.0/27 eq 32 +! +ip route vrf MGMT 0.0.0.0/0 192.168.0.1 +! +route-map RM-CONN-2-BGP permit 10 + match ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY +! +router bfd + multihop interval 300 min-rx 300 multiplier 3 +! +router bgp 65200 + router-id 10.255.0.1 + maximum-paths 4 ecmp 4 + update wait-install + no bgp default ipv4-unicast + neighbor EVPN-OVERLAY-PEERS peer group + neighbor EVPN-OVERLAY-PEERS next-hop-unchanged + neighbor EVPN-OVERLAY-PEERS update-source Loopback0 + neighbor EVPN-OVERLAY-PEERS bfd + neighbor EVPN-OVERLAY-PEERS ebgp-multihop 3 + neighbor EVPN-OVERLAY-PEERS send-community + neighbor EVPN-OVERLAY-PEERS maximum-routes 0 + neighbor IPv4-UNDERLAY-PEERS peer group + neighbor IPv4-UNDERLAY-PEERS send-community + neighbor IPv4-UNDERLAY-PEERS maximum-routes 12000 + neighbor 10.254.1.1 peer group EVPN-OVERLAY-PEERS + neighbor 10.254.1.1 remote-as 65101 + neighbor 10.254.1.1 description flow-tracking-tests-leaf1 + neighbor 10.254.1.2 peer group EVPN-OVERLAY-PEERS + neighbor 10.254.1.2 remote-as 65102 + neighbor 10.254.1.2 description flow-tracking-tests-leaf2 + neighbor 10.254.1.5 peer group EVPN-OVERLAY-PEERS + neighbor 10.254.1.5 remote-as 65105 + neighbor 10.254.1.5 description flow-tracking-tests-leaf3 + neighbor 10.254.1.6 peer group EVPN-OVERLAY-PEERS + neighbor 10.254.1.6 remote-as 65105 + neighbor 10.254.1.6 description flow-tracking-tests-leaf4 + neighbor 10.254.2.1 peer group IPv4-UNDERLAY-PEERS + neighbor 10.254.2.1 remote-as 65101 + neighbor 10.254.2.1 description flow-tracking-tests-leaf1_Ethernet1 + neighbor 10.254.2.5 peer group IPv4-UNDERLAY-PEERS + neighbor 10.254.2.5 remote-as 65102 + neighbor 10.254.2.5 description flow-tracking-tests-leaf2_Ethernet1 + neighbor 10.254.2.17 peer group IPv4-UNDERLAY-PEERS + neighbor 10.254.2.17 remote-as 65105 + neighbor 10.254.2.17 description flow-tracking-tests-leaf3_Ethernet1 + neighbor 10.254.2.21 peer group IPv4-UNDERLAY-PEERS + neighbor 10.254.2.21 remote-as 65105 + neighbor 10.254.2.21 description flow-tracking-tests-leaf4_Ethernet1 + redistribute connected route-map RM-CONN-2-BGP + ! + address-family evpn + neighbor EVPN-OVERLAY-PEERS activate + ! + address-family ipv4 + no neighbor EVPN-OVERLAY-PEERS activate + neighbor IPv4-UNDERLAY-PEERS activate +! +management api http-commands + protocol https + no shutdown + ! + vrf MGMT + no shutdown +! +end diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/flow-tracking-tests-spine2.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/flow-tracking-tests-spine2.cfg new file mode 100644 index 00000000000..8ef2294e772 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/flow-tracking-tests-spine2.cfg @@ -0,0 +1,200 @@ +!RANCID-CONTENT-TYPE: arista +! +vlan internal order ascending range 1006 1199 +! +flow tracking hardware + tracker FLOW-TRACKER-1 + record export on inactive timeout 50000 + record export on interval 300331 + exporter ayush_exporter + collector 127.0.0.1 + local interface Loopback0 + template interval 40000 + tracker FLOW-TRACKER-2 + record export on inactive timeout 50020 + record export on interval 300321 + exporter ayush_exporter + collector 127.0.2.1 + local interface Loopback0 + template interval 40020 + record format ipfix standard timestamps counters + no shutdown +! +transceiver qsfp default-mode 4x10G +! +service routing protocols model multi-agent +! +hostname flow-tracking-tests-spine2 +! +spanning-tree mode none +! +no enable password +no aaa root +! +vrf instance MGMT +! +interface Ethernet2 + description P2P_LINK_TO_FLOW-TRACKING-TESTS-LEAF1_Ethernet2 + no shutdown + mtu 9214 + no switchport + flow tracker hardware FLOW-TRACKER-2 + ip address 10.254.2.2/31 +! +interface Ethernet4 + description P2P_LINK_TO_FLOW-TRACKING-TESTS-LEAF2_Ethernet2 + no shutdown + mtu 9214 + no switchport + flow tracker hardware FLOW-TRACKER-2 + ip address 10.254.2.6/31 +! +interface Ethernet6 + description P2P_LINK_TO_FLOW-TRACKING-TESTS-LEAF3_Ethernet2 + no shutdown + mtu 9214 + no switchport + flow tracker hardware FLOW-TRACKER-2 + ip address 10.254.2.18/31 +! +interface Ethernet8 + description P2P_LINK_TO_FLOW-TRACKING-TESTS-LEAF4_Ethernet2 + no shutdown + mtu 9214 + no switchport + flow tracker hardware FLOW-TRACKER-2 + ip address 10.254.2.22/31 +! +interface Ethernet9 + description P2P_LINK_TO_flow-tracking-tests-spine1_Ethernet9 + no shutdown + mtu 9214 + no switchport + flow tracker hardware FLOW-TRACKER-2 +! +interface Ethernet10 + description P2P_LINK_TO_flow-tracking-tests-spine1_Ethernet10 + no shutdown + mtu 9214 + no switchport + flow tracker hardware FLOW-TRACKER-1 +! +interface Ethernet11 + description P2P_LINK_TO_flow-tracking-tests-spine1_Ethernet11 + no shutdown + mtu 9214 + no switchport +! +interface Ethernet12 + description P2P_LINK_TO_flow-tracking-tests-spine1_Ethernet12 + no shutdown + mtu 9214 + no switchport +! +interface Ethernet13 + description P2P_LINK_TO_flow-tracking-tests-spine1_Ethernet13 + no shutdown + mtu 9214 + no switchport + flow tracker hardware FLOW-TRACKER-2 +! +interface Ethernet14 + description P2P_LINK_TO_flow-tracking-tests-spine1_Ethernet14 + no shutdown + mtu 9214 + no switchport + flow tracker hardware FLOW-TRACKER-1 +! +interface Ethernet15 + description P2P_LINK_TO_flow-tracking-tests-spine1_Ethernet15 + no shutdown + mtu 9214 + no switchport +! +interface Ethernet16 + description P2P_LINK_TO_flow-tracking-tests-spine1_Ethernet16 + no shutdown + mtu 9214 + no switchport +! +interface Loopback0 + description EVPN_Overlay_Peering + no shutdown + ip address 10.255.0.2/32 +! +interface Management1 + description oob_management + no shutdown + vrf MGMT + ip address 192.168.0.21/24 +! +ip routing +no ip routing vrf MGMT +! +ip prefix-list PL-LOOPBACKS-EVPN-OVERLAY + seq 10 permit 10.255.0.0/27 eq 32 +! +ip route vrf MGMT 0.0.0.0/0 192.168.0.1 +! +route-map RM-CONN-2-BGP permit 10 + match ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY +! +router bfd + multihop interval 300 min-rx 300 multiplier 3 +! +router bgp 65200 + router-id 10.255.0.2 + maximum-paths 4 ecmp 4 + update wait-install + no bgp default ipv4-unicast + neighbor EVPN-OVERLAY-PEERS peer group + neighbor EVPN-OVERLAY-PEERS next-hop-unchanged + neighbor EVPN-OVERLAY-PEERS update-source Loopback0 + neighbor EVPN-OVERLAY-PEERS bfd + neighbor EVPN-OVERLAY-PEERS ebgp-multihop 3 + neighbor EVPN-OVERLAY-PEERS send-community + neighbor EVPN-OVERLAY-PEERS maximum-routes 0 + neighbor IPv4-UNDERLAY-PEERS peer group + neighbor IPv4-UNDERLAY-PEERS send-community + neighbor IPv4-UNDERLAY-PEERS maximum-routes 12000 + neighbor 10.254.1.1 peer group EVPN-OVERLAY-PEERS + neighbor 10.254.1.1 remote-as 65101 + neighbor 10.254.1.1 description flow-tracking-tests-leaf1 + neighbor 10.254.1.2 peer group EVPN-OVERLAY-PEERS + neighbor 10.254.1.2 remote-as 65102 + neighbor 10.254.1.2 description flow-tracking-tests-leaf2 + neighbor 10.254.1.5 peer group EVPN-OVERLAY-PEERS + neighbor 10.254.1.5 remote-as 65105 + neighbor 10.254.1.5 description flow-tracking-tests-leaf3 + neighbor 10.254.1.6 peer group EVPN-OVERLAY-PEERS + neighbor 10.254.1.6 remote-as 65105 + neighbor 10.254.1.6 description flow-tracking-tests-leaf4 + neighbor 10.254.2.3 peer group IPv4-UNDERLAY-PEERS + neighbor 10.254.2.3 remote-as 65101 + neighbor 10.254.2.3 description flow-tracking-tests-leaf1_Ethernet2 + neighbor 10.254.2.7 peer group IPv4-UNDERLAY-PEERS + neighbor 10.254.2.7 remote-as 65102 + neighbor 10.254.2.7 description flow-tracking-tests-leaf2_Ethernet2 + neighbor 10.254.2.19 peer group IPv4-UNDERLAY-PEERS + neighbor 10.254.2.19 remote-as 65105 + neighbor 10.254.2.19 description flow-tracking-tests-leaf3_Ethernet2 + neighbor 10.254.2.23 peer group IPv4-UNDERLAY-PEERS + neighbor 10.254.2.23 remote-as 65105 + neighbor 10.254.2.23 description flow-tracking-tests-leaf4_Ethernet2 + redistribute connected route-map RM-CONN-2-BGP + ! + address-family evpn + neighbor EVPN-OVERLAY-PEERS activate + ! + address-family ipv4 + no neighbor EVPN-OVERLAY-PEERS activate + neighbor IPv4-UNDERLAY-PEERS activate +! +management api http-commands + protocol https + no shutdown + ! + vrf MGMT + no shutdown +! +end diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/inband-mgmt-mlag-a.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/inband-mgmt-mlag-a.cfg new file mode 100644 index 00000000000..14471965e2a --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/inband-mgmt-mlag-a.cfg @@ -0,0 +1,153 @@ +!RANCID-CONTENT-TYPE: arista +! +vlan internal order ascending range 1006 1199 +! +transceiver qsfp default-mode 4x10G +! +service routing protocols model multi-agent +! +hostname inband-mgmt-mlag-a +! +no spanning-tree vlan-id 4094 +! +no enable password +no aaa root +! +vlan 101 + name INBAND_MGMT +! +vlan 4094 + name MLAG_PEER + trunk group MLAG +! +vrf instance MGMT +! +interface Port-Channel1 + description INBAND-MGMT-PARENT_Po101 + no shutdown + switchport + switchport trunk allowed vlan 101 + switchport mode trunk + mlag 1 +! +interface Port-Channel11 + description MLAG_PEER_inband-mgmt-mlag-b_Po11 + no shutdown + switchport + switchport mode trunk + switchport trunk group MLAG + port-channel lacp fallback timeout 30 + port-channel lacp fallback individual +! +interface Ethernet1 + description INBAND-MGMT-PARENT_Ethernet101 + no shutdown + channel-group 1 mode active +! +interface Ethernet2 + description INBAND-MGMT-PARENT-VRF_Ethernet101 + no shutdown + channel-group 1 mode active +! +interface Ethernet11 + description MLAG_PEER_inband-mgmt-mlag-b_Ethernet11 + no shutdown + switchport access vlan 101 + switchport mode access + channel-group 11 mode active +! +interface Ethernet12 + description MLAG_PEER_inband-mgmt-mlag-b_Ethernet12 + no shutdown + switchport access vlan 101 + switchport mode access + channel-group 11 mode active +! +interface Ethernet13 + description MLAG_PEER_inband-mgmt-mlag-b_Ethernet13 + no shutdown + switchport access vlan 101 + switchport mode access + channel-group 11 mode active +! +interface Ethernet14 + description MLAG_PEER_inband-mgmt-mlag-b_Ethernet14 + no shutdown + switchport access vlan 101 + switchport mode access + channel-group 11 mode active +! +interface Ethernet15 + description MLAG_PEER_inband-mgmt-mlag-b_Ethernet15 + no shutdown + switchport access vlan 101 + switchport mode access + channel-group 11 mode active +! +interface Ethernet16 + description MLAG_PEER_inband-mgmt-mlag-b_Ethernet16 + no shutdown + switchport access vlan 101 + switchport mode access + channel-group 11 mode active +! +interface Ethernet17 + description MLAG_PEER_inband-mgmt-mlag-b_Ethernet17 + no shutdown + switchport access vlan 101 + switchport mode access + channel-group 11 mode active +! +interface Ethernet18 + description MLAG_PEER_inband-mgmt-mlag-b_Ethernet18 + no shutdown + switchport access vlan 101 + switchport mode access + channel-group 11 mode active +! +interface Ethernet19 + description MLAG_PEER_inband-mgmt-mlag-b_Ethernet19 + no shutdown + switchport access vlan 101 + switchport mode access + channel-group 11 mode active +! +interface Ethernet20 + description MLAG_PEER_inband-mgmt-mlag-b_Ethernet20 + no shutdown + switchport access vlan 101 + switchport mode access + channel-group 11 mode active +! +interface Vlan101 + description Inband Management + no shutdown + mtu 1500 + ip address 192.168.101.22/24 +! +interface Vlan4094 + description MLAG_PEER + no shutdown + mtu 9214 + no autostate + ip address 100.64.0.200/31 +no ip routing vrf MGMT +! +mlag configuration + domain-id inband-mgmt-mlag-test + local-interface Vlan4094 + peer-address 100.64.0.201 + peer-link Port-Channel11 + reload-delay mlag 300 + reload-delay non-mlag 330 +! +ip route 0.0.0.0/0 192.168.101.21 +! +management api http-commands + protocol https + no shutdown + ! + vrf MGMT + no shutdown +! +end diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/inband-mgmt-mlag-b.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/inband-mgmt-mlag-b.cfg new file mode 100644 index 00000000000..1261564eed8 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/inband-mgmt-mlag-b.cfg @@ -0,0 +1,153 @@ +!RANCID-CONTENT-TYPE: arista +! +vlan internal order ascending range 1006 1199 +! +transceiver qsfp default-mode 4x10G +! +service routing protocols model multi-agent +! +hostname inband-mgmt-mlag-b +! +no spanning-tree vlan-id 4094 +! +no enable password +no aaa root +! +vlan 101 + name INBAND_MGMT +! +vlan 4094 + name MLAG_PEER + trunk group MLAG +! +vrf instance MGMT +! +interface Port-Channel1 + description INBAND-MGMT-PARENT_Po101 + no shutdown + switchport + switchport trunk allowed vlan 101 + switchport mode trunk + mlag 1 +! +interface Port-Channel11 + description MLAG_PEER_inband-mgmt-mlag-a_Po11 + no shutdown + switchport + switchport mode trunk + switchport trunk group MLAG + port-channel lacp fallback timeout 30 + port-channel lacp fallback individual +! +interface Ethernet1 + description INBAND-MGMT-PARENT_Ethernet102 + no shutdown + channel-group 1 mode active +! +interface Ethernet2 + description INBAND-MGMT-PARENT-VRF_Ethernet102 + no shutdown + channel-group 1 mode active +! +interface Ethernet11 + description MLAG_PEER_inband-mgmt-mlag-a_Ethernet11 + no shutdown + switchport access vlan 101 + switchport mode access + channel-group 11 mode active +! +interface Ethernet12 + description MLAG_PEER_inband-mgmt-mlag-a_Ethernet12 + no shutdown + switchport access vlan 101 + switchport mode access + channel-group 11 mode active +! +interface Ethernet13 + description MLAG_PEER_inband-mgmt-mlag-a_Ethernet13 + no shutdown + switchport access vlan 101 + switchport mode access + channel-group 11 mode active +! +interface Ethernet14 + description MLAG_PEER_inband-mgmt-mlag-a_Ethernet14 + no shutdown + switchport access vlan 101 + switchport mode access + channel-group 11 mode active +! +interface Ethernet15 + description MLAG_PEER_inband-mgmt-mlag-a_Ethernet15 + no shutdown + switchport access vlan 101 + switchport mode access + channel-group 11 mode active +! +interface Ethernet16 + description MLAG_PEER_inband-mgmt-mlag-a_Ethernet16 + no shutdown + switchport access vlan 101 + switchport mode access + channel-group 11 mode active +! +interface Ethernet17 + description MLAG_PEER_inband-mgmt-mlag-a_Ethernet17 + no shutdown + switchport access vlan 101 + switchport mode access + channel-group 11 mode active +! +interface Ethernet18 + description MLAG_PEER_inband-mgmt-mlag-a_Ethernet18 + no shutdown + switchport access vlan 101 + switchport mode access + channel-group 11 mode active +! +interface Ethernet19 + description MLAG_PEER_inband-mgmt-mlag-a_Ethernet19 + no shutdown + switchport access vlan 101 + switchport mode access + channel-group 11 mode active +! +interface Ethernet20 + description MLAG_PEER_inband-mgmt-mlag-a_Ethernet20 + no shutdown + switchport access vlan 101 + switchport mode access + channel-group 11 mode active +! +interface Vlan101 + description Inband Management + no shutdown + mtu 1500 + ip address 192.168.101.23/24 +! +interface Vlan4094 + description MLAG_PEER + no shutdown + mtu 9214 + no autostate + ip address 100.64.0.201/31 +no ip routing vrf MGMT +! +mlag configuration + domain-id inband-mgmt-mlag-test + local-interface Vlan4094 + peer-address 100.64.0.200 + peer-link Port-Channel11 + reload-delay mlag 300 + reload-delay non-mlag 330 +! +ip route 0.0.0.0/0 192.168.101.21 +! +management api http-commands + protocol https + no shutdown + ! + vrf MGMT + no shutdown +! +end diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/inband-mgmt-parent-dualstack1.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/inband-mgmt-parent-dualstack1.cfg index 26f169ce68e..04c7be18a4f 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/inband-mgmt-parent-dualstack1.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/inband-mgmt-parent-dualstack1.cfg @@ -59,6 +59,8 @@ interface Port-Channel25 switchport switchport trunk allowed vlan 105 switchport mode trunk + port-channel lacp fallback timeout 30 + port-channel lacp fallback individual mlag 25 ! interface Ethernet11 @@ -121,6 +123,8 @@ interface Ethernet24 interface Ethernet25 description INBAND-MGMT-DUALSTACK-IPS_Ethernet1 no shutdown + switchport access vlan 105 + switchport mode access channel-group 25 mode active ! interface Loopback0 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/inband-mgmt-parent-dualstack2.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/inband-mgmt-parent-dualstack2.cfg index a2669d722fd..85065649726 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/inband-mgmt-parent-dualstack2.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/inband-mgmt-parent-dualstack2.cfg @@ -59,6 +59,8 @@ interface Port-Channel25 switchport switchport trunk allowed vlan 105 switchport mode trunk + port-channel lacp fallback timeout 30 + port-channel lacp fallback individual mlag 25 ! interface Ethernet11 @@ -121,6 +123,8 @@ interface Ethernet24 interface Ethernet25 description INBAND-MGMT-DUALSTACK-IPS_Ethernet2 no shutdown + switchport access vlan 105 + switchport mode access channel-group 25 mode active ! interface Loopback0 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/inband-mgmt-parent-vrf.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/inband-mgmt-parent-vrf.cfg index 3f3a338d634..34ef2663723 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/inband-mgmt-parent-vrf.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/inband-mgmt-parent-vrf.cfg @@ -49,6 +49,15 @@ interface Port-Channel23 switchport trunk allowed vlan 103 switchport mode trunk ! +interface Port-Channel101 + description INBAND-MGMT-MLAG-TEST_Po1 + no shutdown + switchport + switchport trunk allowed vlan 101 + switchport mode trunk + port-channel lacp fallback timeout 30 + port-channel lacp fallback individual +! interface Ethernet21 description INBAND-MGMT-SUBNET_Ethernet2 no shutdown @@ -68,6 +77,20 @@ interface Ethernet23 no shutdown channel-group 23 mode active ! +interface Ethernet101 + description INBAND-MGMT-MLAG-A_Ethernet2 + no shutdown + switchport access vlan 101 + switchport mode access + channel-group 101 mode active +! +interface Ethernet102 + description INBAND-MGMT-MLAG-B_Ethernet2 + no shutdown + switchport access vlan 101 + switchport mode access + channel-group 101 mode active +! interface Loopback0 description EVPN_Overlay_Peering no shutdown diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/inband-mgmt-parent.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/inband-mgmt-parent.cfg index deb65d27a67..3ac6270d075 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/inband-mgmt-parent.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/inband-mgmt-parent.cfg @@ -49,6 +49,15 @@ interface Port-Channel23 switchport trunk allowed vlan 103 switchport mode trunk ! +interface Port-Channel101 + description INBAND-MGMT-MLAG-TEST_Po1 + no shutdown + switchport + switchport trunk allowed vlan 101 + switchport mode trunk + port-channel lacp fallback timeout 30 + port-channel lacp fallback individual +! interface Ethernet21 description INBAND-MGMT-SUBNET_Ethernet1 no shutdown @@ -68,6 +77,20 @@ interface Ethernet23 no shutdown channel-group 23 mode active ! +interface Ethernet101 + description INBAND-MGMT-MLAG-A_Ethernet1 + no shutdown + switchport access vlan 101 + switchport mode access + channel-group 101 mode active +! +interface Ethernet102 + description INBAND-MGMT-MLAG-B_Ethernet1 + no shutdown + switchport access vlan 101 + switchport mode access + channel-group 101 mode active +! interface Loopback0 description EVPN_Overlay_Peering no shutdown diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/ipv4-acls.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/ipv4-acls.cfg index e745b199c20..34b36a7bbc5 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/ipv4-acls.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/ipv4-acls.cfg @@ -45,6 +45,22 @@ interface Ethernet4 ip access-group TEST-IPV4-ACL-WITH-NO-FIELDS-IN in ip access-group TEST-IPV4-ACL-WITH-NO-FIELDS-OUT out ! +interface Ethernet5/1 + no shutdown + no switchport + ip address 172.20.20.0/31 + ip access-group TEST-IPV4-ACL-WITH-IP-FIELDS-IN_Ethernet5_1 in +! +interface Ethernet6/6 + no shutdown + no switchport +! +interface Ethernet6/6.6 + no shutdown + encapsulation dot1q vlan 6 + ip address 172.21.21.0/31 + ip access-group TEST-IPV4-ACL-WITH-IP-FIELDS-OUT_Ethernet6_6.6 out +! interface Loopback0 description EVPN_Overlay_Peering no shutdown @@ -58,6 +74,10 @@ ip access-list TEST-IPV4-ACL-WITH-IP-FIELDS-IN_Ethernet2 15 deny ip any host 172.17.17.17 permit ip host 172.17.17.1 host 172.17.17.17 ! +ip access-list TEST-IPV4-ACL-WITH-IP-FIELDS-IN_Ethernet5_1 + 15 deny ip any host 172.20.20.0 + permit ip 172.20.20.1/30 host 172.20.20.0 +! ip access-list TEST-IPV4-ACL-WITH-IP-FIELDS-OUT_Ethernet1 remark Some remark will not require source and destination fields. permit ip host 172.16.0.2 any @@ -66,6 +86,10 @@ ip access-list TEST-IPV4-ACL-WITH-IP-FIELDS-OUT_Ethernet2 remark Some remark will not require source and destination fields. permit ip host 172.17.17.17 any ! +ip access-list TEST-IPV4-ACL-WITH-IP-FIELDS-OUT_Ethernet6_6.6 + remark Some remark will not require source and destination fields. + permit ip host 172.21.21.0 any +! ip access-list TEST-IPV4-ACL-WITH-NO-FIELDS-IN permit ip host 172.18.18.18 any ! diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/l3_edge_isis.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/l3_edge_isis.cfg index 0e8f449f043..f24be4164f6 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/l3_edge_isis.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/l3_edge_isis.cfg @@ -33,6 +33,7 @@ interface ethernet2 no switchport ip address 192.168.0.2/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 60 no isis hello padding @@ -47,6 +48,7 @@ interface ethernet3 no switchport ip address 192.168.0.4/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis hello padding @@ -59,6 +61,7 @@ interface ethernet4 no switchport ip address 192.168.0.6/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis hello padding diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/l3_edge_multicast.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/l3_edge_multicast.cfg new file mode 100644 index 00000000000..adad08c3b00 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/l3_edge_multicast.cfg @@ -0,0 +1,64 @@ +!RANCID-CONTENT-TYPE: arista +! +vlan internal order ascending range 1006 1199 +! +transceiver qsfp default-mode 4x10G +! +service routing protocols model multi-agent +! +hostname l3_edge_multicast +! +spanning-tree mode none +! +no enable password +no aaa root +! +vrf instance MGMT +! +interface ethernet1 + description P2P_LINK_TO_peer1_ethernet1 + no shutdown + mtu 9214 + no switchport + ip address 192.168.0.4/31 + ip ospf network point-to-point + ip ospf area 0.0.0.0 +! +interface ethernet2 + description P2P_LINK_TO_peer2_ethernet2 + no shutdown + mtu 9214 + no switchport + ip address 192.168.0.2/31 + ip ospf network point-to-point + ip ospf area 0.0.0.0 + pim ipv4 sparse-mode +! +interface Loopback0 + description EVPN_Overlay_Peering + no shutdown + ip address 1.2.3.1/32 + ip ospf area 0.0.0.0 +! +ip routing +no ip routing vrf MGMT +! +router multicast + ipv4 + routing +! +router ospf 100 + router-id 1.2.3.1 + passive-interface default + no passive-interface ethernet1 + no passive-interface ethernet2 + max-lsa 12000 +! +management api http-commands + protocol https + no shutdown + ! + vrf MGMT + no shutdown +! +end diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/mgmt_interface_default.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/mgmt_interface_default.cfg index 78e6423ea4d..ff427587c47 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/mgmt_interface_default.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/mgmt_interface_default.cfg @@ -17,9 +17,12 @@ service routing protocols model multi-agent hostname mgmt_interface_default ip name-server vrf MGMT 8.8.8.8 ip name-server vrf MGMT 192.168.200.5 +ip name-server vrf MGMT 2001:db8::1 +ip name-server vrf MGMT 2001:db8::2 ! ntp local-interface vrf MGMT Management1 ntp server vrf MGMT 192.168.200.5 prefer +ntp server vrf MGMT 2001:db8::3 ! snmp-server contact example@example.com snmp-server location EOS_DESIGNS_UNIT_TESTS mgmt_interface_default diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/mgmt_interface_description.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/mgmt_interface_description.cfg index f856f1677b7..004d9b247af 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/mgmt_interface_description.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/mgmt_interface_description.cfg @@ -17,10 +17,10 @@ interface Management1 description Custom Management Interface Description no shutdown vrf MGMT - ip address 1.1.1.2 + ip address 1.1.1.2/24 no ip routing vrf MGMT ! -ip route vrf MGMT 0.0.0.0/0 1.1.1.1 +ip route vrf MGMT 0.0.0.0/0 1.1.1.254 ! management api http-commands protocol https diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/mgmt_interface_fabric.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/mgmt_interface_fabric.cfg index 66ca8fa9e7c..345411cb0c9 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/mgmt_interface_fabric.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/mgmt_interface_fabric.cfg @@ -17,9 +17,12 @@ service routing protocols model multi-agent hostname mgmt_interface_fabric ip name-server vrf MGMT 8.8.8.8 ip name-server vrf MGMT 192.168.200.5 +ip name-server vrf MGMT 2001:db8::1 +ip name-server vrf MGMT 2001:db8::2 ! ntp local-interface vrf MGMT MY_INTERFACE_FABRIC ntp server vrf MGMT 192.168.200.5 prefer +ntp server vrf MGMT 2001:db8::3 ! snmp-server contact example@example.com snmp-server location EOS_DESIGNS_UNIT_TESTS mgmt_interface_fabric diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/mgmt_interface_host.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/mgmt_interface_host.cfg index abd2074ac85..6e96df07616 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/mgmt_interface_host.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/mgmt_interface_host.cfg @@ -17,9 +17,12 @@ service routing protocols model multi-agent hostname mgmt_interface_host ip name-server vrf MGMT 8.8.8.8 ip name-server vrf MGMT 192.168.200.5 +ip name-server vrf MGMT 2001:db8::1 +ip name-server vrf MGMT 2001:db8::2 ! ntp local-interface vrf MGMT MY_INTERFACE_HOST ntp server vrf MGMT 192.168.200.5 prefer +ntp server vrf MGMT 2001:db8::3 ! snmp-server contact example@example.com snmp-server location EOS_DESIGNS_UNIT_TESTS mgmt_interface_host diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/mgmt_interface_ipv6.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/mgmt_interface_ipv6.cfg index c5983637eb4..ad7f88e154e 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/mgmt_interface_ipv6.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/mgmt_interface_ipv6.cfg @@ -21,7 +21,7 @@ interface Management1 ipv6 address 0200::105/64 no ip routing vrf MGMT ! -ipv6 route vrf MGMT ::/0 0200::1 +ipv6 route vrf MGMT ::/0 0200::2 ! management api http-commands protocol https diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/mgmt_interface_platform.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/mgmt_interface_platform.cfg index 9db9052ebca..f1679831ad8 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/mgmt_interface_platform.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/mgmt_interface_platform.cfg @@ -17,9 +17,12 @@ service routing protocols model multi-agent hostname mgmt_interface_platform ip name-server vrf MGMT 8.8.8.8 ip name-server vrf MGMT 192.168.200.5 +ip name-server vrf MGMT 2001:db8::1 +ip name-server vrf MGMT 2001:db8::2 ! ntp local-interface vrf MGMT Management0 ntp server vrf MGMT 192.168.200.5 prefer +ntp server vrf MGMT 2001:db8::3 ! snmp-server contact example@example.com snmp-server location EOS_DESIGNS_UNIT_TESTS mgmt_interface_platform diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/platform_settings.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/platform_settings.cfg index fe6d034c0a4..40f2c224220 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/platform_settings.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/platform_settings.cfg @@ -25,4 +25,8 @@ management api http-commands vrf MGMT no shutdown ! +management security + entropy source hardware haveged cpu jitter + entropy source hardware exclusive +! end diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/ptp-tests-leaf1.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/ptp-tests-leaf1.cfg index 73999545ec7..4a4cb4f1802 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/ptp-tests-leaf1.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/ptp-tests-leaf1.cfg @@ -47,6 +47,21 @@ vrf instance MGMT ! vrf instance VRF1 ! +interface Port-Channel6 + description Endpoint-with-mpass + no shutdown + switchport + switchport access vlan 11 + mlag 6 + ptp enable + ptp mpass + ptp announce interval 0 + ptp announce timeout 3 + ptp delay-req interval -3 + ptp sync-message interval -3 + ptp role master + ptp transport ipv4 +! interface Port-Channel9 description MLAG_PEER_ptp-tests-leaf2_Po9 no shutdown @@ -146,6 +161,11 @@ interface Ethernet5 ptp role master spanning-tree portfast ! +interface Ethernet6 + description Endpoint-with-mpass_PCI1 + no shutdown + channel-group 6 mode active +! interface Ethernet9 description MLAG_PEER_ptp-tests-leaf2_Ethernet9 no shutdown diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/ptp-tests-leaf2.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/ptp-tests-leaf2.cfg index 81906c99090..0e0510d5219 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/ptp-tests-leaf2.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/ptp-tests-leaf2.cfg @@ -54,6 +54,21 @@ vrf instance MGMT ! vrf instance VRF1 ! +interface Port-Channel6 + description Endpoint-with-mpass + no shutdown + switchport + switchport access vlan 11 + mlag 6 + ptp enable + ptp mpass + ptp announce interval 0 + ptp announce timeout 3 + ptp delay-req interval -3 + ptp sync-message interval -3 + ptp role master + ptp transport ipv4 +! interface Port-Channel9 description MLAG_PEER_ptp-tests-leaf1_Po9 no shutdown @@ -139,6 +154,11 @@ interface Ethernet5 ptp role master spanning-tree portfast ! +interface Ethernet6 + description Endpoint-with-mpass_PCI2 + no shutdown + channel-group 6 mode active +! interface Ethernet9 description MLAG_PEER_ptp-tests-leaf1_Ethernet9 no shutdown diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/sflow-tests-l2-leaf1.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/sflow-tests-l2-leaf1.cfg index d63a8b5ea67..6e55ebc1f06 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/sflow-tests-l2-leaf1.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/sflow-tests-l2-leaf1.cfg @@ -8,6 +8,7 @@ service routing protocols model multi-agent ! hostname sflow-tests-l2-leaf1 ! +sflow sample 10 sflow vrf MGMT destination 10.10.10.12 sflow vrf MGMT source-interface Management1 sflow destination 10.10.10.10 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/sflow-tests-l2-leaf2.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/sflow-tests-l2-leaf2.cfg index cf94e9f258a..c7e2d4844df 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/sflow-tests-l2-leaf2.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/sflow-tests-l2-leaf2.cfg @@ -8,6 +8,7 @@ service routing protocols model multi-agent ! hostname sflow-tests-l2-leaf2 ! +sflow sample 10 sflow vrf MGMT destination 10.10.10.12 sflow vrf MGMT source-interface Management1 sflow destination 10.10.10.10 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/uplink_lan_l2leaf.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/uplink_lan_l2leaf.cfg index 7b43398c5de..47536f9aebd 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/uplink_lan_l2leaf.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/uplink_lan_l2leaf.cfg @@ -2,6 +2,17 @@ ! vlan internal order ascending range 1006 1199 ! +flow tracking sampled + sample 10000 + tracker FLOW-TRACKER + record export on inactive timeout 70000 + record export on interval 300000 + exporter CV-TELEMETRY + collector 127.0.0.1 + local interface Loopback0 + template interval 3600000 + no shutdown +! transceiver qsfp default-mode 4x10G ! service routing protocols model multi-agent @@ -29,6 +40,7 @@ interface Ethernet1 switchport trunk allowed vlan 10,100 switchport mode trunk switchport + flow tracker sampled FLOW-TRACKER spanning-tree portfast ! interface Ethernet2 @@ -37,6 +49,7 @@ interface Ethernet2 switchport trunk allowed vlan 10,100 switchport mode trunk switchport + flow tracker sampled FLOW-TRACKER spanning-tree portfast no ip routing vrf MGMT ! diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/uplink_lan_wan_router1.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/uplink_lan_wan_router1.cfg index b211c9a8c5d..2565469d1db 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/uplink_lan_wan_router1.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/uplink_lan_wan_router1.cfg @@ -111,6 +111,7 @@ interface Ethernet2 no shutdown mtu 9214 no switchport + flow tracker hardware FLOW-TRACKER vrf VRF1 ip address 10.0.10.1/24 ! @@ -118,6 +119,7 @@ interface Ethernet2.100 description My vlan 100 no shutdown encapsulation dot1q vlan 100 + flow tracker hardware FLOW-TRACKER vrf VRF1 ip address 10.0.100.1/24 ipv6 enable diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/uplink_lan_wan_router2.cfg b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/uplink_lan_wan_router2.cfg index a8f1f9d8a41..b90d09917b6 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/uplink_lan_wan_router2.cfg +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/configs/uplink_lan_wan_router2.cfg @@ -117,6 +117,7 @@ interface Ethernet2.10 no shutdown mtu 9214 encapsulation dot1q vlan 10 + flow tracker hardware FLOW-TRACKER vrf VRF1 ip address 10.0.10.1/24 ! @@ -124,6 +125,7 @@ interface Ethernet2.100 description My vlan 100 no shutdown encapsulation dot1q vlan 100 + flow tracker hardware FLOW-TRACKER vrf VRF1 ip address 10.0.100.1/24 ipv6 enable diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/7010TX-LEAF1.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/7010TX-LEAF1.yml new file mode 100644 index 00000000000..d09b25fa722 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/7010TX-LEAF1.yml @@ -0,0 +1,181 @@ +hostname: 7010TX-LEAF1 +is_deployed: true +router_bgp: + as: '923' + router_id: 192.168.255.35 + bgp: + default: + ipv4_unicast: false + maximum_paths: + paths: 4 + ecmp: 4 + updates: + wait_install: true + peer_groups: + - name: MLAG-IPv4-UNDERLAY-PEER + type: ipv4 + remote_as: '923' + next_hop_self: true + description: 7010TX-LEAF2 + maximum_routes: 12000 + send_community: all + route_map_in: RM-MLAG-PEER-IN + - name: IPv4-UNDERLAY-PEERS + type: ipv4 + maximum_routes: 12000 + send_community: all + - name: EVPN-OVERLAY-PEERS + type: evpn + update_source: Loopback0 + bfd: true + send_community: all + maximum_routes: 0 + ebgp_multihop: 3 + address_family_ipv4: + peer_groups: + - name: MLAG-IPv4-UNDERLAY-PEER + activate: true + - name: IPv4-UNDERLAY-PEERS + activate: true + - name: EVPN-OVERLAY-PEERS + activate: false + neighbors: + - ip_address: 10.10.224.5 + peer_group: MLAG-IPv4-UNDERLAY-PEER + peer: 7010TX-LEAF2 + description: 7010TX-LEAF2 + redistribute_routes: + - source_protocol: connected + route_map: RM-CONN-2-BGP + address_family_evpn: + peer_groups: + - name: EVPN-OVERLAY-PEERS + activate: true +service_routing_protocols_model: multi-agent +ip_routing: true +vlan_internal_order: + allocation: ascending + range: + beginning: 1006 + ending: 1199 +vrfs: +- name: MGMT + ip_routing: false +management_interfaces: +- name: Management1 + description: oob_management + shutdown: false + vrf: MGMT + ip_address: 192.168.201.116/24 + gateway: null + type: oob +management_api_http: + enable_vrfs: + - name: MGMT + enable_https: true +spanning_tree: + no_spanning_tree_vlan: 4093-4094 +vlans: +- id: 4093 + tenant: system + name: LEAF_PEER_L3 + trunk_groups: + - LEAF_PEER_L3 +- id: 4094 + tenant: system + name: MLAG_PEER + trunk_groups: + - MLAG +vlan_interfaces: +- name: Vlan4093 + description: MLAG_PEER_L3_PEERING + shutdown: false + ip_address: 10.10.224.4/31 +- name: Vlan4094 + description: MLAG_PEER + shutdown: false + no_autostate: true + ip_address: 10.10.255.4/31 +port_channel_interfaces: +- name: Port-Channel5 + description: MLAG_PEER_7010TX-LEAF2_Po5 + type: switched + shutdown: false + mode: trunk + trunk_groups: + - LEAF_PEER_L3 + - MLAG +ethernet_interfaces: +- name: Ethernet5 + peer: 7010TX-LEAF2 + peer_interface: Ethernet5 + peer_type: mlag_peer + description: MLAG_PEER_7010TX-LEAF2_Ethernet5 + type: port-channel-member + shutdown: false + channel_group: + id: 5 + mode: active +- name: Ethernet6 + peer: 7010TX-LEAF2 + peer_interface: Ethernet6 + peer_type: mlag_peer + description: MLAG_PEER_7010TX-LEAF2_Ethernet6 + type: port-channel-member + shutdown: false + channel_group: + id: 5 + mode: active +mlag_configuration: + domain_id: MLAG_PER_MTU_INTERFACE + local_interface: Vlan4094 + peer_address: 10.10.255.5 + peer_link: Port-Channel5 + reload_delay_mlag: '300' + reload_delay_non_mlag: '330' +route_maps: +- name: RM-MLAG-PEER-IN + sequence_numbers: + - sequence: 10 + type: permit + set: + - origin incomplete + description: Make routes learned over MLAG Peer-link less preferred on spines to ensure optimal routing +- name: RM-CONN-2-BGP + sequence_numbers: + - sequence: 10 + type: permit + match: + - ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY +loopback_interfaces: +- name: Loopback0 + description: EVPN_Overlay_Peering + shutdown: false + ip_address: 192.168.255.35/32 +- name: Loopback1 + description: VTEP_VXLAN_Tunnel_Source + shutdown: false + ip_address: 192.168.254.35/32 +prefix_lists: +- name: PL-LOOPBACKS-EVPN-OVERLAY + sequence_numbers: + - sequence: 10 + action: permit 192.168.255.0/24 eq 32 + - sequence: 20 + action: permit 192.168.254.0/24 eq 32 +router_bfd: + multihop: + interval: 300 + min_rx: 300 + multiplier: 3 +ip_igmp_snooping: + globally_enabled: true +vxlan_interface: + Vxlan1: + description: 7010TX-LEAF1_VTEP + vxlan: + udp_port: 4789 + source_interface: Loopback1 + virtual_router_encapsulation_mac_address: mlag-system-id +metadata: + platform: 7010TX diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/7010TX-LEAF2.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/7010TX-LEAF2.yml new file mode 100644 index 00000000000..1804b53a5bd --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/7010TX-LEAF2.yml @@ -0,0 +1,168 @@ +hostname: 7010TX-LEAF2 +is_deployed: true +router_bgp: + as: '923' + router_id: 192.168.255.36 + bgp: + default: + ipv4_unicast: false + maximum_paths: + paths: 4 + ecmp: 4 + updates: + wait_install: true + peer_groups: + - name: MLAG-IPv4-UNDERLAY-PEER + type: ipv4 + remote_as: '923' + next_hop_self: true + description: 7010TX-LEAF1 + maximum_routes: 12000 + send_community: all + route_map_in: RM-MLAG-PEER-IN + - name: IPv4-UNDERLAY-PEERS + type: ipv4 + maximum_routes: 12000 + send_community: all + - name: EVPN-OVERLAY-PEERS + type: evpn + update_source: Loopback0 + bfd: true + send_community: all + maximum_routes: 0 + ebgp_multihop: 3 + address_family_ipv4: + peer_groups: + - name: MLAG-IPv4-UNDERLAY-PEER + activate: true + - name: IPv4-UNDERLAY-PEERS + activate: true + - name: EVPN-OVERLAY-PEERS + activate: false + neighbors: + - ip_address: 10.10.224.4 + peer_group: MLAG-IPv4-UNDERLAY-PEER + peer: 7010TX-LEAF1 + description: 7010TX-LEAF1 + redistribute_routes: + - source_protocol: connected + route_map: RM-CONN-2-BGP + address_family_evpn: + peer_groups: + - name: EVPN-OVERLAY-PEERS + activate: true +service_routing_protocols_model: multi-agent +ip_routing: true +vlan_internal_order: + allocation: ascending + range: + beginning: 1006 + ending: 1199 +vrfs: +- name: MGMT + ip_routing: false +management_interfaces: +- name: Management1 + description: oob_management + shutdown: false + vrf: MGMT + ip_address: 192.168.201.117/24 + gateway: null + type: oob +management_api_http: + enable_vrfs: + - name: MGMT + enable_https: true +spanning_tree: + no_spanning_tree_vlan: 4093-4094 +vlans: +- id: 4093 + tenant: system + name: LEAF_PEER_L3 + trunk_groups: + - LEAF_PEER_L3 +- id: 4094 + tenant: system + name: MLAG_PEER + trunk_groups: + - MLAG +vlan_interfaces: +- name: Vlan4093 + description: MLAG_PEER_L3_PEERING + shutdown: false + ip_address: 10.10.224.5/31 +- name: Vlan4094 + description: MLAG_PEER + shutdown: false + no_autostate: true + ip_address: 10.10.255.5/31 +port_channel_interfaces: +- name: Port-Channel5 + description: MLAG_PEER_7010TX-LEAF1_Po5 + type: switched + shutdown: false + mode: trunk + trunk_groups: + - LEAF_PEER_L3 + - MLAG +ethernet_interfaces: +- name: Ethernet5 + peer: 7010TX-LEAF1 + peer_interface: Ethernet5 + peer_type: mlag_peer + description: MLAG_PEER_7010TX-LEAF1_Ethernet5 + type: port-channel-member + shutdown: false + channel_group: + id: 5 + mode: active +- name: Ethernet6 + peer: 7010TX-LEAF1 + peer_interface: Ethernet6 + peer_type: mlag_peer + description: MLAG_PEER_7010TX-LEAF1_Ethernet6 + type: port-channel-member + shutdown: false + channel_group: + id: 5 + mode: active +mlag_configuration: + domain_id: MLAG_PER_MTU_INTERFACE + local_interface: Vlan4094 + peer_address: 10.10.255.4 + peer_link: Port-Channel5 + reload_delay_mlag: '300' + reload_delay_non_mlag: '330' +route_maps: +- name: RM-MLAG-PEER-IN + sequence_numbers: + - sequence: 10 + type: permit + set: + - origin incomplete + description: Make routes learned over MLAG Peer-link less preferred on spines to ensure optimal routing +- name: RM-CONN-2-BGP + sequence_numbers: + - sequence: 10 + type: permit + match: + - ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY +loopback_interfaces: +- name: Loopback0 + description: EVPN_Overlay_Peering + shutdown: false + ip_address: 192.168.255.36/32 +prefix_lists: +- name: PL-LOOPBACKS-EVPN-OVERLAY + sequence_numbers: + - sequence: 10 + action: permit 192.168.255.0/24 eq 32 +router_bfd: + multihop: + interval: 300 + min_rx: 300 + multiplier: 3 +ip_igmp_snooping: + globally_enabled: true +metadata: + platform: 7010TX diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/AUTO_BGP_ASN_LEAF3A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/AUTO_BGP_ASN_LEAF3A.yml index 2eb51c48e1f..49b968d16a5 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/AUTO_BGP_ASN_LEAF3A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/AUTO_BGP_ASN_LEAF3A.yml @@ -105,9 +105,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.8/31 no_autostate: true mtu: 9214 + ip_address: 10.255.252.8/31 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_AUTO_BGP_ASN_LEAF3B_Po3 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/AUTO_BGP_ASN_LEAF3B.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/AUTO_BGP_ASN_LEAF3B.yml index 0b1a1e6fc5b..1198f8a8b28 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/AUTO_BGP_ASN_LEAF3B.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/AUTO_BGP_ASN_LEAF3B.yml @@ -105,9 +105,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.9/31 no_autostate: true mtu: 9214 + ip_address: 10.255.252.9/31 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_AUTO_BGP_ASN_LEAF3A_Po3 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/AUTO_BGP_ASN_LEAF4A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/AUTO_BGP_ASN_LEAF4A.yml index 678dd3cf586..1170dc14e0e 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/AUTO_BGP_ASN_LEAF4A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/AUTO_BGP_ASN_LEAF4A.yml @@ -105,9 +105,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.12/31 no_autostate: true mtu: 9214 + ip_address: 10.255.252.12/31 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_AUTO_BGP_ASN_LEAF4B_Po3 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/AUTO_BGP_ASN_LEAF4B.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/AUTO_BGP_ASN_LEAF4B.yml index 47cc8081070..d5bbabbb086 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/AUTO_BGP_ASN_LEAF4B.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/AUTO_BGP_ASN_LEAF4B.yml @@ -105,9 +105,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.13/31 no_autostate: true mtu: 9214 + ip_address: 10.255.252.13/31 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_AUTO_BGP_ASN_LEAF4A_Po3 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/AUTO_BGP_ASN_LEAF7A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/AUTO_BGP_ASN_LEAF7A.yml index 6b77602f40b..7096b4e6f41 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/AUTO_BGP_ASN_LEAF7A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/AUTO_BGP_ASN_LEAF7A.yml @@ -105,9 +105,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.20/31 no_autostate: true mtu: 9214 + ip_address: 10.255.252.20/31 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_AUTO_BGP_ASN_LEAF7B_Po3 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/AUTO_BGP_ASN_LEAF7B.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/AUTO_BGP_ASN_LEAF7B.yml index 5cf18459ac4..cde4b585e57 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/AUTO_BGP_ASN_LEAF7B.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/AUTO_BGP_ASN_LEAF7B.yml @@ -105,9 +105,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.21/31 no_autostate: true mtu: 9214 + ip_address: 10.255.252.21/31 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_AUTO_BGP_ASN_LEAF7A_Po3 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/CUSTOM-PYTHON_MODULES-L3LEAF1A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/CUSTOM-PYTHON_MODULES-L3LEAF1A.yml index db489db9b14..f340654c9bc 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/CUSTOM-PYTHON_MODULES-L3LEAF1A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/CUSTOM-PYTHON_MODULES-L3LEAF1A.yml @@ -149,9 +149,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.10/31 no_autostate: true mtu: 9214 + ip_address: 10.255.252.10/31 - name: Vlan110 tenant: CUSTOM_PYTHON_MODULES_TENANT tags: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/CUSTOM-PYTHON_MODULES-L3LEAF1B.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/CUSTOM-PYTHON_MODULES-L3LEAF1B.yml index 7d5c25c5f99..a70ccc8e90e 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/CUSTOM-PYTHON_MODULES-L3LEAF1B.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/CUSTOM-PYTHON_MODULES-L3LEAF1B.yml @@ -149,9 +149,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.11/31 no_autostate: true mtu: 9214 + ip_address: 10.255.252.11/31 - name: Vlan110 tenant: CUSTOM_PYTHON_MODULES_TENANT tags: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/CUSTOM-TEMPLATES-L3LEAF1A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/CUSTOM-TEMPLATES-L3LEAF1A.yml index f5008889a19..324ffb153db 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/CUSTOM-TEMPLATES-L3LEAF1A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/CUSTOM-TEMPLATES-L3LEAF1A.yml @@ -149,9 +149,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.10/31 no_autostate: true mtu: 9214 + ip_address: 10.255.252.10/31 - name: Vlan110 tenant: CUSTOM_TEMPLATES_TENANT tags: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/CUSTOM-TEMPLATES-L3LEAF1B.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/CUSTOM-TEMPLATES-L3LEAF1B.yml index e2101fbc900..56e4f157a44 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/CUSTOM-TEMPLATES-L3LEAF1B.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/CUSTOM-TEMPLATES-L3LEAF1B.yml @@ -149,9 +149,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.11/31 no_autostate: true mtu: 9214 + ip_address: 10.255.252.11/31 - name: Vlan110 tenant: CUSTOM_TEMPLATES_TENANT tags: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-BL1A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-BL1A.yml index ecc9064bef5..f6ed2bb2606 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-BL1A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-BL1A.yml @@ -318,17 +318,22 @@ vlan_internal_order: ending: 1199 event_handlers: - name: evpn-blacklist-recovery - action_type: bash - action: FastCli -p 15 -c "clear bgp evpn host-flap" + actions: + bash_command: FastCli -p 15 -c "clear bgp evpn host-flap" delay: 300 trigger: on-logging - regex: EVPN-3-BLACKLISTED_DUPLICATE_MAC + trigger_on_logging: + regex: EVPN-3-BLACKLISTED_DUPLICATE_MAC asynchronous: true ip_name_servers: - ip_address: 192.168.200.5 vrf: MGMT - ip_address: 8.8.8.8 vrf: MGMT +- ip_address: 2001:db8::1 + vrf: MGMT +- ip_address: 2001:db8::2 + vrf: MGMT - ip_address: 1.1.1.1 vrf: MGMT spanning_tree: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-BL1B.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-BL1B.yml index 257013f24ae..029acd282db 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-BL1B.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-BL1B.yml @@ -326,6 +326,10 @@ ip_name_servers: vrf: MGMT - ip_address: 8.8.8.8 vrf: MGMT +- ip_address: 2001:db8::1 + vrf: MGMT +- ip_address: 2001:db8::2 + vrf: MGMT spanning_tree: root_super: true mode: mstp diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-BL2A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-BL2A.yml index a9d0fcb5fe0..9ef1d23dc59 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-BL2A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-BL2A.yml @@ -64,6 +64,14 @@ router_bgp: activate: false - name: IPVPN-INTERWORKING-PEERS activate: false + - name: Tenant_C_BGP_PEER_GROUP + activate: true + prefix_list_in: PL_In_Test_1 + prefix_list_out: PL_Out_Test_1 + - name: Tenant_C_BGP_PEER_GROUP2 + activate: true + route_map_in: TEST_IN + route_map_out: TEST_OUT redistribute_routes: - source_protocol: connected route_map: RM-CONN-2-BGP @@ -144,6 +152,10 @@ router_bgp: - name: IPVPN-INTERWORKING-PEERS activate: true domain_identifier: '65000:4' + address_family_ipv6: + peer_groups: + - name: Tenant_C_BGP_PEER_GROUP + activate: false vrfs: - name: Tenant_A_WAN_Zone router_id: 192.168.255.16 @@ -275,6 +287,10 @@ ip_name_servers: vrf: MGMT - ip_address: 8.8.8.8 vrf: MGMT +- ip_address: 2001:db8::1 + vrf: MGMT +- ip_address: 2001:db8::2 + vrf: MGMT spanning_tree: root_super: true mode: mstp @@ -337,6 +353,8 @@ ntp: - name: 192.168.200.5 vrf: MGMT preferred: true + - name: 2001:db8::3 + vrf: MGMT snmp_server: contact: example@example.com location: EOS_DESIGNS_UNIT_TESTS DC1-BL2A diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-BL2B.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-BL2B.yml index 75c433a71bf..c23cdc5a691 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-BL2B.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-BL2B.yml @@ -60,6 +60,8 @@ router_bgp: activate: false - name: IPVPN-INTERWORKING-PEERS activate: false + - name: Tenant_C_WAN_Zone_BGP_PEER_GROUP + activate: true redistribute_routes: - source_protocol: connected route_map: RM-CONN-2-BGP @@ -140,6 +142,10 @@ router_bgp: - name: IPVPN-INTERWORKING-PEERS activate: true domain_identifier: '65000:4' + address_family_ipv6: + peer_groups: + - name: Tenant_C_WAN_Zone_BGP_PEER_GROUP + activate: true vrfs: - name: Tenant_A_WAN_Zone router_id: 192.168.255.17 @@ -209,11 +215,16 @@ router_bgp: neighbors: - ip_address: 1.1.1.1 activate: true + - ip_address: 2.2.2.3 + activate: true neighbors: - ip_address: 1.1.1.1 peer_group: Tenant_C_WAN_Zone_BGP_PEER_GROUP description: test_description route_map_out: RM-Tenant_C_WAN_Zone-1.1.1.1-SET-NEXT-HOP-OUT + - ip_address: 2.2.2.3 + peer_group: Tenant_C_WAN_Zone_BGP_PEER_GROUP + description: test_duplicate_peer_ip_address - ip_address: BEBA::C0CA:C07A peer_group: Tenant_C_WAN_Zone_BGP_PEER_GROUP description: test_ipv6 @@ -274,6 +285,10 @@ ip_name_servers: vrf: MGMT - ip_address: 8.8.8.8 vrf: MGMT +- ip_address: 2001:db8::1 + vrf: MGMT +- ip_address: 2001:db8::2 + vrf: MGMT spanning_tree: root_super: true mode: mstp @@ -330,6 +345,8 @@ ntp: - name: 192.168.200.5 vrf: MGMT preferred: true + - name: 2001:db8::3 + vrf: MGMT snmp_server: contact: example@example.com location: EOS_DESIGNS_UNIT_TESTS DC1-BL2B diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-CL1A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-CL1A.yml index da4fbfa7658..1e88579b7e1 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-CL1A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-CL1A.yml @@ -217,6 +217,10 @@ ip_name_servers: vrf: MGMT - ip_address: 8.8.8.8 vrf: MGMT +- ip_address: 2001:db8::1 + vrf: MGMT +- ip_address: 2001:db8::2 + vrf: MGMT spanning_tree: root_super: true mode: mstp @@ -262,6 +266,8 @@ ntp: - name: 192.168.200.5 vrf: MGMT preferred: true + - name: 2001:db8::3 + vrf: MGMT snmp_server: contact: example@example.com location: EOS_DESIGNS_UNIT_TESTS DC1-CL1A @@ -339,9 +345,9 @@ vlan_interfaces: - name: Vlan4092 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.18/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.18/31 port_channel_interfaces: - name: Port-Channel1151 description: MLAG_PEER_DC1-CL1B_Po1151 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-CL1B.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-CL1B.yml index 0e787284c30..bd70701b2bf 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-CL1B.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-CL1B.yml @@ -218,6 +218,10 @@ ip_name_servers: vrf: MGMT - ip_address: 8.8.8.8 vrf: MGMT +- ip_address: 2001:db8::1 + vrf: MGMT +- ip_address: 2001:db8::2 + vrf: MGMT spanning_tree: root_super: true mode: mstp @@ -263,6 +267,8 @@ ntp: - name: 192.168.200.5 vrf: MGMT preferred: true + - name: 2001:db8::3 + vrf: MGMT snmp_server: contact: example@example.com location: EOS_DESIGNS_UNIT_TESTS DC1-CL1B @@ -340,9 +346,9 @@ vlan_interfaces: - name: Vlan4092 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.19/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.19/31 port_channel_interfaces: - name: Port-Channel1311 description: MLAG_PEER_DC1-CL1A_Po1311 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-L2LEAF1A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-L2LEAF1A.yml index 7138f4e23e6..b579d71d29a 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-L2LEAF1A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-L2LEAF1A.yml @@ -25,6 +25,10 @@ ip_name_servers: vrf: MGMT - ip_address: 8.8.8.8 vrf: MGMT +- ip_address: 2001:db8::1 + vrf: MGMT +- ip_address: 2001:db8::2 + vrf: MGMT spanning_tree: mode: mstp mst_instances: @@ -69,6 +73,8 @@ ntp: - name: 192.168.200.5 vrf: MGMT preferred: true + - name: 2001:db8::3 + vrf: MGMT snmp_server: contact: example@example.com location: EOS_DESIGNS_UNIT_TESTS rackE DC1-L2LEAF1A @@ -109,9 +115,9 @@ vlan_interfaces: - name: Vlan4091 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.14/31 no_autostate: true - mtu: 1500 + mtu: 1498 + ip_address: 10.255.252.14/31 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_DC1-L2LEAF1B_Po3 @@ -127,6 +133,13 @@ port_channel_interfaces: mode: trunk vlans: 110-112,120-121,130-131,160-161 mlag: 1 +- name: Port-Channel5 + description: server03_ESI_L2LEAF_PortChanne1 + type: switched + shutdown: false + mode: trunk + vlans: 110-111,210-211 + mlag: 5 ethernet_interfaces: - name: Ethernet3 peer: DC1-L2LEAF1B @@ -172,6 +185,17 @@ ethernet_interfaces: channel_group: id: 1 mode: active +- name: Ethernet5 + peer: server03_ESI_L2LEAF + peer_interface: Eth1 + peer_type: server + port_profile: TENANT_A_B + description: server03_ESI_L2LEAF_Eth1 + shutdown: false + type: port-channel-member + channel_group: + id: 5 + mode: active mlag_configuration: domain_id: DC1_L2LEAF1 local_interface: Vlan4091 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-L2LEAF1B.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-L2LEAF1B.yml index e5921fb6148..d821787eaf7 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-L2LEAF1B.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-L2LEAF1B.yml @@ -25,6 +25,10 @@ ip_name_servers: vrf: MGMT - ip_address: 8.8.8.8 vrf: MGMT +- ip_address: 2001:db8::1 + vrf: MGMT +- ip_address: 2001:db8::2 + vrf: MGMT spanning_tree: mode: mstp mst_instances: @@ -69,6 +73,8 @@ ntp: - name: 192.168.200.5 vrf: MGMT preferred: true + - name: 2001:db8::3 + vrf: MGMT snmp_server: contact: example@example.com location: EOS_DESIGNS_UNIT_TESTS rackE DC1-L2LEAF1B @@ -109,9 +115,9 @@ vlan_interfaces: - name: Vlan4091 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.15/31 no_autostate: true - mtu: 1500 + mtu: 1499 + ip_address: 10.255.252.15/31 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_DC1-L2LEAF1A_Po3 @@ -127,6 +133,13 @@ port_channel_interfaces: mode: trunk vlans: 110-112,120-121,130-131,160-161 mlag: 1 +- name: Port-Channel5 + description: server03_ESI_L2LEAF_PortChanne1 + type: switched + shutdown: false + mode: trunk + vlans: 110-111,210-211 + mlag: 5 ethernet_interfaces: - name: Ethernet3 peer: DC1-L2LEAF1A @@ -172,6 +185,17 @@ ethernet_interfaces: channel_group: id: 1 mode: active +- name: Ethernet5 + peer: server03_ESI_L2LEAF + peer_interface: Eth2 + peer_type: server + port_profile: TENANT_A_B + description: server03_ESI_L2LEAF_Eth2 + shutdown: false + type: port-channel-member + channel_group: + id: 5 + mode: active mlag_configuration: domain_id: DC1_L2LEAF1 local_interface: Vlan4091 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-L2LEAF2A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-L2LEAF2A.yml index 9a67ea28859..1adaa588e15 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-L2LEAF2A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-L2LEAF2A.yml @@ -25,6 +25,10 @@ ip_name_servers: vrf: MGMT - ip_address: 8.8.8.8 vrf: MGMT +- ip_address: 2001:db8::1 + vrf: MGMT +- ip_address: 2001:db8::2 + vrf: MGMT spanning_tree: mode: mstp mst_instances: @@ -69,6 +73,8 @@ ntp: - name: 192.168.200.5 vrf: MGMT preferred: true + - name: 2001:db8::3 + vrf: MGMT snmp_server: contact: example@example.com location: EOS_DESIGNS_UNIT_TESTS rackE DC1-L2LEAF2A @@ -136,9 +142,9 @@ vlan_interfaces: - name: Vlan4091 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.16/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.16/31 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_DC1-L2LEAF2B_Po3 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-L2LEAF2B.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-L2LEAF2B.yml index d9178f9db30..eaeca579254 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-L2LEAF2B.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-L2LEAF2B.yml @@ -25,6 +25,10 @@ ip_name_servers: vrf: MGMT - ip_address: 8.8.8.8 vrf: MGMT +- ip_address: 2001:db8::1 + vrf: MGMT +- ip_address: 2001:db8::2 + vrf: MGMT spanning_tree: mode: mstp mst_instances: @@ -69,6 +73,8 @@ ntp: - name: 192.168.200.5 vrf: MGMT preferred: true + - name: 2001:db8::3 + vrf: MGMT snmp_server: contact: example@example.com location: EOS_DESIGNS_UNIT_TESTS rackE DC1-L2LEAF2B @@ -136,9 +142,9 @@ vlan_interfaces: - name: Vlan4091 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.17/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.17/31 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_DC1-L2LEAF2A_Po3 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-L2LEAF3A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-L2LEAF3A.yml index 7b7eb7cec1c..0f90ef94bdb 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-L2LEAF3A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-L2LEAF3A.yml @@ -25,6 +25,10 @@ ip_name_servers: vrf: MGMT - ip_address: 8.8.8.8 vrf: MGMT +- ip_address: 2001:db8::1 + vrf: MGMT +- ip_address: 2001:db8::2 + vrf: MGMT spanning_tree: mode: mstp mst_instances: @@ -68,6 +72,8 @@ ntp: - name: 192.168.200.5 vrf: MGMT preferred: true + - name: 2001:db8::3 + vrf: MGMT snmp_server: contact: example@example.com location: EOS_DESIGNS_UNIT_TESTS rackE DC1-L2LEAF3A diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-L2LEAF4A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-L2LEAF4A.yml index 04ee716ddeb..487b7a8d701 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-L2LEAF4A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-L2LEAF4A.yml @@ -25,6 +25,10 @@ ip_name_servers: vrf: MGMT - ip_address: 8.8.8.8 vrf: MGMT +- ip_address: 2001:db8::1 + vrf: MGMT +- ip_address: 2001:db8::2 + vrf: MGMT spanning_tree: mode: mstp mst_instances: @@ -68,6 +72,8 @@ ntp: - name: 192.168.200.5 vrf: MGMT preferred: true + - name: 2001:db8::3 + vrf: MGMT snmp_server: contact: example@example.com location: EOS_DESIGNS_UNIT_TESTS rackE DC1-L2LEAF4A diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-LEAF1A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-LEAF1A.yml index d53bec1c8ac..3bc52b6be21 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-LEAF1A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-LEAF1A.yml @@ -212,6 +212,10 @@ ip_name_servers: vrf: MGMT - ip_address: 8.8.8.8 vrf: MGMT +- ip_address: 2001:db8::1 + vrf: MGMT +- ip_address: 2001:db8::2 + vrf: MGMT spanning_tree: root_super: true mode: mstp @@ -270,6 +274,8 @@ ntp: - name: 192.168.200.5 vrf: MGMT preferred: true + - name: 2001:db8::3 + vrf: MGMT snmp_server: contact: example@example.com location: EOS_DESIGNS_UNIT_TESTS rackA DC1-LEAF1A diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-LEAF2A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-LEAF2A.yml index 5547f8a8b3b..5ef7a1b56d2 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-LEAF2A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-LEAF2A.yml @@ -369,6 +369,10 @@ ip_name_servers: vrf: MGMT - ip_address: 8.8.8.8 vrf: MGMT +- ip_address: 2001:db8::1 + vrf: MGMT +- ip_address: 2001:db8::2 + vrf: MGMT spanning_tree: root_super: true mode: mstp @@ -449,6 +453,8 @@ ntp: - name: 192.168.200.5 vrf: MGMT preferred: true + - name: 2001:db8::3 + vrf: MGMT snmp_server: contact: example@example.com location: EOS_DESIGNS_UNIT_TESTS rackC DC1-LEAF2A @@ -914,6 +920,21 @@ vlans: - id: 413 name: Tenant_D_v6_OP_Zone_3 tenant: Tenant_D +ip_access_lists: +- name: TEST-IPV4-ACL-WITH-IP-FIELDS-IN_Vlan110 + entries: + - sequence: 15 + action: deny + protocol: ip + source: any + destination: 10.1.10.1 +- name: TEST-IPV4-ACL-WITH-IP-FIELDS-OUT_Vlan110 + entries: + - remark: Some remark will not require source and destination fields. + - action: permit + protocol: ip + source: 10.1.10.1 + destination: any ip_igmp_snooping: globally_enabled: true vlans: @@ -961,6 +982,8 @@ vlan_interfaces: - opzone description: Tenant_A_OP_Zone_1 shutdown: false + access_group_in: TEST-IPV4-ACL-WITH-IP-FIELDS-IN_Vlan110 + access_group_out: TEST-IPV4-ACL-WITH-IP-FIELDS-OUT_Vlan110 ip_address_virtual: 10.1.10.1/24 vrf: Tenant_A_OP_Zone - name: Vlan111 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-LEAF2B.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-LEAF2B.yml index f7c9c4a0aa4..45801222bd1 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-LEAF2B.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-LEAF2B.yml @@ -369,6 +369,10 @@ ip_name_servers: vrf: MGMT - ip_address: 8.8.8.8 vrf: MGMT +- ip_address: 2001:db8::1 + vrf: MGMT +- ip_address: 2001:db8::2 + vrf: MGMT spanning_tree: root_super: true mode: mstp @@ -449,6 +453,8 @@ ntp: - name: 192.168.200.5 vrf: MGMT preferred: true + - name: 2001:db8::3 + vrf: MGMT snmp_server: contact: example@example.com location: EOS_DESIGNS_UNIT_TESTS rackD DC1-LEAF2B @@ -860,6 +866,21 @@ vlans: - id: 413 name: Tenant_D_v6_OP_Zone_3 tenant: Tenant_D +ip_access_lists: +- name: TEST-IPV4-ACL-WITH-IP-FIELDS-IN_Vlan110 + entries: + - sequence: 15 + action: deny + protocol: ip + source: any + destination: 10.1.10.1 +- name: TEST-IPV4-ACL-WITH-IP-FIELDS-OUT_Vlan110 + entries: + - remark: Some remark will not require source and destination fields. + - action: permit + protocol: ip + source: 10.1.10.1 + destination: any ip_igmp_snooping: globally_enabled: true vlans: @@ -907,6 +928,8 @@ vlan_interfaces: - opzone description: Tenant_A_OP_Zone_1 shutdown: false + access_group_in: TEST-IPV4-ACL-WITH-IP-FIELDS-IN_Vlan110 + access_group_out: TEST-IPV4-ACL-WITH-IP-FIELDS-OUT_Vlan110 ip_address_virtual: 10.1.10.1/24 vrf: Tenant_A_OP_Zone - name: Vlan111 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-SPINE1.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-SPINE1.yml index 100b6b3d912..dde8909446a 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-SPINE1.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-SPINE1.yml @@ -128,11 +128,13 @@ router_bgp: remote_as: '65110' peer: DC1_UNDEPLOYED_LEAF1A description: DC1_UNDEPLOYED_LEAF1A_Ethernet49/1 + shutdown: true - ip_address: 172.31.255.161 peer_group: UNDERLAY-PEERS remote_as: '65111' peer: DC1_UNDEPLOYED_LEAF1B description: DC1_UNDEPLOYED_LEAF1B_Ethernet49/1 + shutdown: true - ip_address: 10.10.101.9 peer_group: UNDERLAY-PEERS remote_as: '65161' @@ -198,11 +200,13 @@ router_bgp: peer: DC1_UNDEPLOYED_LEAF1A description: DC1_UNDEPLOYED_LEAF1A remote_as: '65110' + shutdown: true - ip_address: 192.168.255.22 peer_group: EVPN-OVERLAY-PEERS peer: DC1_UNDEPLOYED_LEAF1B description: DC1_UNDEPLOYED_LEAF1B remote_as: '65111' + shutdown: true - ip_address: 192.168.255.33 peer_group: EVPN-OVERLAY-PEERS peer: MH-LEAF1A @@ -258,6 +262,10 @@ ip_name_servers: vrf: MGMT - ip_address: 8.8.8.8 vrf: MGMT +- ip_address: 2001:db8::1 + vrf: MGMT +- ip_address: 2001:db8::2 + vrf: MGMT spanning_tree: mode: none local_users: @@ -298,6 +306,8 @@ ntp: - name: 192.168.200.5 vrf: MGMT preferred: true + - name: 2001:db8::3 + vrf: MGMT snmp_server: contact: example@example.com location: EOS_DESIGNS_UNIT_TESTS DC1-SPINE1 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-SPINE2.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-SPINE2.yml index dbb9f485b14..ec590ad913c 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-SPINE2.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-SPINE2.yml @@ -108,11 +108,13 @@ router_bgp: remote_as: '65110' peer: DC1_UNDEPLOYED_LEAF1A description: DC1_UNDEPLOYED_LEAF1A_Ethernet50/1 + shutdown: true - ip_address: 172.31.255.163 peer_group: UNDERLAY-PEERS remote_as: '65111' peer: DC1_UNDEPLOYED_LEAF1B description: DC1_UNDEPLOYED_LEAF1B_Ethernet50/1 + shutdown: true - ip_address: 192.168.255.14 peer_group: EVPN-OVERLAY-PEERS peer: DC1-BL1A @@ -173,11 +175,13 @@ router_bgp: peer: DC1_UNDEPLOYED_LEAF1A description: DC1_UNDEPLOYED_LEAF1A remote_as: '65110' + shutdown: true - ip_address: 192.168.255.22 peer_group: EVPN-OVERLAY-PEERS peer: DC1_UNDEPLOYED_LEAF1B description: DC1_UNDEPLOYED_LEAF1B remote_as: '65111' + shutdown: true address_family_evpn: peer_groups: - name: EVPN-OVERLAY-PEERS @@ -208,6 +212,10 @@ ip_name_servers: vrf: MGMT - ip_address: 8.8.8.8 vrf: MGMT +- ip_address: 2001:db8::1 + vrf: MGMT +- ip_address: 2001:db8::2 + vrf: MGMT spanning_tree: mode: none local_users: @@ -254,6 +262,8 @@ ntp: - name: 192.168.200.5 vrf: MGMT preferred: true + - name: 2001:db8::3 + vrf: MGMT snmp_server: contact: example@example.com location: EOS_DESIGNS_UNIT_TESTS DC1-SPINE2 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-SPINE3.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-SPINE3.yml index f9f68b30380..866542cfd15 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-SPINE3.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-SPINE3.yml @@ -108,11 +108,13 @@ router_bgp: remote_as: '65110' peer: DC1_UNDEPLOYED_LEAF1A description: DC1_UNDEPLOYED_LEAF1A_Ethernet51/1 + shutdown: true - ip_address: 172.31.255.165 peer_group: UNDERLAY-PEERS remote_as: '65111' peer: DC1_UNDEPLOYED_LEAF1B description: DC1_UNDEPLOYED_LEAF1B_Ethernet51/1 + shutdown: true - ip_address: 192.168.255.14 peer_group: EVPN-OVERLAY-PEERS peer: DC1-BL1A @@ -173,11 +175,13 @@ router_bgp: peer: DC1_UNDEPLOYED_LEAF1A description: DC1_UNDEPLOYED_LEAF1A remote_as: '65110' + shutdown: true - ip_address: 192.168.255.22 peer_group: EVPN-OVERLAY-PEERS peer: DC1_UNDEPLOYED_LEAF1B description: DC1_UNDEPLOYED_LEAF1B remote_as: '65111' + shutdown: true address_family_evpn: peer_groups: - name: EVPN-OVERLAY-PEERS @@ -208,6 +212,10 @@ ip_name_servers: vrf: MGMT - ip_address: 8.8.8.8 vrf: MGMT +- ip_address: 2001:db8::1 + vrf: MGMT +- ip_address: 2001:db8::2 + vrf: MGMT spanning_tree: mode: none local_users: @@ -248,6 +256,8 @@ ntp: - name: 192.168.200.5 vrf: MGMT preferred: true + - name: 2001:db8::3 + vrf: MGMT snmp_server: contact: example@example.com location: EOS_DESIGNS_UNIT_TESTS DC1-SPINE3 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-SPINE4.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-SPINE4.yml index 6bb8644bd46..fdcb5a13e5d 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-SPINE4.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-SPINE4.yml @@ -108,11 +108,13 @@ router_bgp: remote_as: '65110' peer: DC1_UNDEPLOYED_LEAF1A description: DC1_UNDEPLOYED_LEAF1A_Ethernet52/1 + shutdown: true - ip_address: 172.31.255.167 peer_group: UNDERLAY-PEERS remote_as: '65111' peer: DC1_UNDEPLOYED_LEAF1B description: DC1_UNDEPLOYED_LEAF1B_Ethernet52/1 + shutdown: true - ip_address: 192.168.255.14 peer_group: EVPN-OVERLAY-PEERS peer: DC1-BL1A @@ -173,11 +175,13 @@ router_bgp: peer: DC1_UNDEPLOYED_LEAF1A description: DC1_UNDEPLOYED_LEAF1A remote_as: '65110' + shutdown: true - ip_address: 192.168.255.22 peer_group: EVPN-OVERLAY-PEERS peer: DC1_UNDEPLOYED_LEAF1B description: DC1_UNDEPLOYED_LEAF1B remote_as: '65111' + shutdown: true address_family_evpn: peer_groups: - name: EVPN-OVERLAY-PEERS @@ -208,6 +212,10 @@ ip_name_servers: vrf: MGMT - ip_address: 8.8.8.8 vrf: MGMT +- ip_address: 2001:db8::1 + vrf: MGMT +- ip_address: 2001:db8::2 + vrf: MGMT spanning_tree: mode: none local_users: @@ -248,6 +256,8 @@ ntp: - name: 192.168.200.5 vrf: MGMT preferred: true + - name: 2001:db8::3 + vrf: MGMT snmp_server: contact: example@example.com location: EOS_DESIGNS_UNIT_TESTS DC1-SPINE4 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-SVC3A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-SVC3A.yml index 03f9cb522bd..bad628b1e51 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-SVC3A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-SVC3A.yml @@ -396,6 +396,10 @@ ip_name_servers: vrf: MGMT - ip_address: 8.8.8.8 vrf: MGMT +- ip_address: 2001:db8::1 + vrf: MGMT +- ip_address: 2001:db8::2 + vrf: MGMT spanning_tree: root_super: true mode: mstp @@ -469,6 +473,8 @@ ntp: - name: 192.168.200.5 vrf: MGMT preferred: true + - name: 2001:db8::3 + vrf: MGMT snmp_server: contact: example@example.com location: EOS_DESIGNS_UNIT_TESTS DC1-SVC3A @@ -591,9 +597,9 @@ vlan_interfaces: - name: Vlan4092 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.6/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.6/31 - name: Vlan130 tenant: Tenant_A tags: @@ -650,6 +656,8 @@ vlan_interfaces: - opzone description: Tenant_A_OP_Zone_1 shutdown: false + access_group_in: TEST-IPV4-ACL-WITH-IP-FIELDS-IN_Vlan110 + access_group_out: TEST-IPV4-ACL-WITH-IP-FIELDS-OUT_Vlan110 ip_address_virtual: 10.1.10.1/24 vrf: Tenant_A_OP_Zone - name: Vlan111 @@ -1542,6 +1550,21 @@ router_bfd: interval: 1200 min_rx: 1200 multiplier: 3 +ip_access_lists: +- name: TEST-IPV4-ACL-WITH-IP-FIELDS-IN_Vlan110 + entries: + - sequence: 15 + action: deny + protocol: ip + source: any + destination: 10.1.10.1 +- name: TEST-IPV4-ACL-WITH-IP-FIELDS-OUT_Vlan110 + entries: + - remark: Some remark will not require source and destination fields. + - action: permit + protocol: ip + source: 10.1.10.1 + destination: any ip_igmp_snooping: globally_enabled: true vlans: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-SVC3B.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-SVC3B.yml index 1d858ecf50d..1c0517d2118 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-SVC3B.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1-SVC3B.yml @@ -396,6 +396,10 @@ ip_name_servers: vrf: MGMT - ip_address: 8.8.8.8 vrf: MGMT +- ip_address: 2001:db8::1 + vrf: MGMT +- ip_address: 2001:db8::2 + vrf: MGMT spanning_tree: root_super: true mode: mstp @@ -469,6 +473,8 @@ ntp: - name: 192.168.200.5 vrf: MGMT preferred: true + - name: 2001:db8::3 + vrf: MGMT snmp_server: contact: example@example.com location: EOS_DESIGNS_UNIT_TESTS DC1-SVC3B @@ -591,9 +597,9 @@ vlan_interfaces: - name: Vlan4092 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.7/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.7/31 - name: Vlan130 tenant: Tenant_A tags: @@ -650,6 +656,8 @@ vlan_interfaces: - opzone description: Tenant_A_OP_Zone_1 shutdown: false + access_group_in: TEST-IPV4-ACL-WITH-IP-FIELDS-IN_Vlan110 + access_group_out: TEST-IPV4-ACL-WITH-IP-FIELDS-OUT_Vlan110 ip_address_virtual: 10.1.10.1/24 vrf: Tenant_A_OP_Zone - name: Vlan111 @@ -1494,6 +1502,21 @@ router_bfd: interval: 1200 min_rx: 1200 multiplier: 3 +ip_access_lists: +- name: TEST-IPV4-ACL-WITH-IP-FIELDS-IN_Vlan110 + entries: + - sequence: 15 + action: deny + protocol: ip + source: any + destination: 10.1.10.1 +- name: TEST-IPV4-ACL-WITH-IP-FIELDS-OUT_Vlan110 + entries: + - remark: Some remark will not require source and destination fields. + - action: permit + protocol: ip + source: 10.1.10.1 + destination: any ip_igmp_snooping: globally_enabled: true vlans: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1.L2LEAF5A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1.L2LEAF5A.yml index 313f20c0709..220d61adbf1 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1.L2LEAF5A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1.L2LEAF5A.yml @@ -25,6 +25,10 @@ ip_name_servers: vrf: MGMT - ip_address: 8.8.8.8 vrf: MGMT +- ip_address: 2001:db8::1 + vrf: MGMT +- ip_address: 2001:db8::2 + vrf: MGMT spanning_tree: mode: mstp mst_instances: @@ -69,6 +73,8 @@ ntp: - name: 192.168.200.5 vrf: MGMT preferred: true + - name: 2001:db8::3 + vrf: MGMT snmp_server: contact: example@example.com location: EOS_DESIGNS_UNIT_TESTS rackE DC1.L2LEAF5A @@ -109,9 +115,9 @@ vlan_interfaces: - name: Vlan4091 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.26/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.26/31 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_DC1.L2LEAF5B_Po3 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1.L2LEAF5B.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1.L2LEAF5B.yml index 9d876cf644c..92d9d696525 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1.L2LEAF5B.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1.L2LEAF5B.yml @@ -25,6 +25,10 @@ ip_name_servers: vrf: MGMT - ip_address: 8.8.8.8 vrf: MGMT +- ip_address: 2001:db8::1 + vrf: MGMT +- ip_address: 2001:db8::2 + vrf: MGMT spanning_tree: mode: mstp mst_instances: @@ -69,6 +73,8 @@ ntp: - name: 192.168.200.5 vrf: MGMT preferred: true + - name: 2001:db8::3 + vrf: MGMT snmp_server: contact: example@example.com location: EOS_DESIGNS_UNIT_TESTS rackE DC1.L2LEAF5B @@ -109,9 +115,9 @@ vlan_interfaces: - name: Vlan4091 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.27/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.27/31 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_DC1.L2LEAF5A_Po3 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1_UNDEPLOYED_LEAF1A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1_UNDEPLOYED_LEAF1A.yml index 3d18239b7cf..fb0e890348a 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1_UNDEPLOYED_LEAF1A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1_UNDEPLOYED_LEAF1A.yml @@ -408,6 +408,10 @@ ip_name_servers: vrf: MGMT - ip_address: 8.8.8.8 vrf: MGMT +- ip_address: 2001:db8::1 + vrf: MGMT +- ip_address: 2001:db8::2 + vrf: MGMT spanning_tree: root_super: true mode: mstp @@ -487,6 +491,8 @@ ntp: - name: 192.168.200.5 vrf: MGMT preferred: true + - name: 2001:db8::3 + vrf: MGMT snmp_server: contact: example@example.com location: EOS_DESIGNS_UNIT_TESTS DC1_UNDEPLOYED_LEAF1A @@ -609,9 +615,9 @@ vlan_interfaces: - name: Vlan4092 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.24/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.24/31 - name: Vlan130 tenant: Tenant_A tags: @@ -668,6 +674,8 @@ vlan_interfaces: - opzone description: Tenant_A_OP_Zone_1 shutdown: false + access_group_in: TEST-IPV4-ACL-WITH-IP-FIELDS-IN_Vlan110 + access_group_out: TEST-IPV4-ACL-WITH-IP-FIELDS-OUT_Vlan110 ip_address_virtual: 10.1.10.1/24 vrf: Tenant_A_OP_Zone - name: Vlan111 @@ -970,6 +978,21 @@ router_bfd: interval: 1200 min_rx: 1200 multiplier: 3 +ip_access_lists: +- name: TEST-IPV4-ACL-WITH-IP-FIELDS-IN_Vlan110 + entries: + - sequence: 15 + action: deny + protocol: ip + source: any + destination: 10.1.10.1 +- name: TEST-IPV4-ACL-WITH-IP-FIELDS-OUT_Vlan110 + entries: + - remark: Some remark will not require source and destination fields. + - action: permit + protocol: ip + source: 10.1.10.1 + destination: any ip_igmp_snooping: globally_enabled: true vlans: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1_UNDEPLOYED_LEAF1B.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1_UNDEPLOYED_LEAF1B.yml index ac49a58abca..2b78109cb8f 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1_UNDEPLOYED_LEAF1B.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/DC1_UNDEPLOYED_LEAF1B.yml @@ -408,6 +408,10 @@ ip_name_servers: vrf: MGMT - ip_address: 8.8.8.8 vrf: MGMT +- ip_address: 2001:db8::1 + vrf: MGMT +- ip_address: 2001:db8::2 + vrf: MGMT spanning_tree: root_super: true mode: mstp @@ -487,6 +491,8 @@ ntp: - name: 192.168.200.5 vrf: MGMT preferred: true + - name: 2001:db8::3 + vrf: MGMT snmp_server: contact: example@example.com location: EOS_DESIGNS_UNIT_TESTS DC1_UNDEPLOYED_LEAF1B @@ -609,9 +615,9 @@ vlan_interfaces: - name: Vlan4092 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.25/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.25/31 - name: Vlan130 tenant: Tenant_A tags: @@ -668,6 +674,8 @@ vlan_interfaces: - opzone description: Tenant_A_OP_Zone_1 shutdown: false + access_group_in: TEST-IPV4-ACL-WITH-IP-FIELDS-IN_Vlan110 + access_group_out: TEST-IPV4-ACL-WITH-IP-FIELDS-OUT_Vlan110 ip_address_virtual: 10.1.10.1/24 vrf: Tenant_A_OP_Zone - name: Vlan111 @@ -970,6 +978,21 @@ router_bfd: interval: 1200 min_rx: 1200 multiplier: 3 +ip_access_lists: +- name: TEST-IPV4-ACL-WITH-IP-FIELDS-IN_Vlan110 + entries: + - sequence: 15 + action: deny + protocol: ip + source: any + destination: 10.1.10.1 +- name: TEST-IPV4-ACL-WITH-IP-FIELDS-OUT_Vlan110 + entries: + - remark: Some remark will not require source and destination fields. + - action: permit + protocol: ip + source: 10.1.10.1 + destination: any ip_igmp_snooping: globally_enabled: true vlans: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/EVPN-MULTICAST-L3LEAF1A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/EVPN-MULTICAST-L3LEAF1A.yml index 5483b7dfa19..14a24e0e470 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/EVPN-MULTICAST-L3LEAF1A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/EVPN-MULTICAST-L3LEAF1A.yml @@ -853,9 +853,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.0/31 no_autostate: true mtu: 9214 + ip_address: 10.255.252.0/31 - name: Vlan310 tenant: Tenant_A tags: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/EVPN-MULTICAST-L3LEAF1B.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/EVPN-MULTICAST-L3LEAF1B.yml index 8be668eafcc..5541f1c9bd8 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/EVPN-MULTICAST-L3LEAF1B.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/EVPN-MULTICAST-L3LEAF1B.yml @@ -853,9 +853,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.1/31 no_autostate: true mtu: 9214 + ip_address: 10.255.252.1/31 - name: Vlan310 tenant: Tenant_A tags: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MH-L2LEAF1A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MH-L2LEAF1A.yml index dc579f5e6de..58045c7f45f 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MH-L2LEAF1A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MH-L2LEAF1A.yml @@ -25,6 +25,10 @@ ip_name_servers: vrf: MGMT - ip_address: 8.8.8.8 vrf: MGMT +- ip_address: 2001:db8::1 + vrf: MGMT +- ip_address: 2001:db8::2 + vrf: MGMT spanning_tree: mode: mstp mst_instances: @@ -71,6 +75,8 @@ ntp: - name: 192.168.200.5 vrf: MGMT preferred: true + - name: 2001:db8::3 + vrf: MGMT snmp_server: contact: example@example.com location: EOS_DESIGNS_UNIT_TESTS MH-L2LEAF1A diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MH-LEAF1A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MH-LEAF1A.yml index 9e3636d5d83..0fc46cee128 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MH-LEAF1A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MH-LEAF1A.yml @@ -104,6 +104,10 @@ ip_name_servers: vrf: MGMT - ip_address: 8.8.8.8 vrf: MGMT +- ip_address: 2001:db8::1 + vrf: MGMT +- ip_address: 2001:db8::2 + vrf: MGMT local_users: - name: admin disabled: true @@ -153,6 +157,8 @@ ntp: - name: 192.168.200.5 vrf: MGMT preferred: true + - name: 2001:db8::3 + vrf: MGMT snmp_server: contact: example@example.com location: EOS_DESIGNS_UNIT_TESTS MH-LEAF1A diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MH-LEAF1B.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MH-LEAF1B.yml index 7becf3e1bd8..5a3b76fbc7b 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MH-LEAF1B.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MH-LEAF1B.yml @@ -104,6 +104,10 @@ ip_name_servers: vrf: MGMT - ip_address: 8.8.8.8 vrf: MGMT +- ip_address: 2001:db8::1 + vrf: MGMT +- ip_address: 2001:db8::2 + vrf: MGMT local_users: - name: admin disabled: true @@ -153,6 +157,8 @@ ntp: - name: 192.168.200.5 vrf: MGMT preferred: true + - name: 2001:db8::3 + vrf: MGMT snmp_server: contact: example@example.com location: EOS_DESIGNS_UNIT_TESTS MH-LEAF1B diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MH-LEAF2A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MH-LEAF2A.yml index dd9afe071ad..0f47d4edc7c 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MH-LEAF2A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MH-LEAF2A.yml @@ -129,6 +129,10 @@ ip_name_servers: vrf: MGMT - ip_address: 8.8.8.8 vrf: MGMT +- ip_address: 2001:db8::1 + vrf: MGMT +- ip_address: 2001:db8::2 + vrf: MGMT local_users: - name: admin disabled: true @@ -178,6 +182,8 @@ ntp: - name: 192.168.200.5 vrf: MGMT preferred: true + - name: 2001:db8::3 + vrf: MGMT snmp_server: contact: example@example.com location: EOS_DESIGNS_UNIT_TESTS MH-LEAF2A diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG-OSPF-L3LEAF1A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG-OSPF-L3LEAF1A.yml index a4787cf9af2..e6878be9289 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG-OSPF-L3LEAF1A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG-OSPF-L3LEAF1A.yml @@ -65,6 +65,10 @@ ip_name_servers: vrf: MGMT - ip_address: 8.8.8.8 vrf: MGMT +- ip_address: 2001:db8::1 + vrf: MGMT +- ip_address: 2001:db8::2 + vrf: MGMT local_users: - name: admin disabled: true @@ -103,6 +107,8 @@ ntp: - name: 192.168.200.5 vrf: MGMT preferred: true + - name: 2001:db8::3 + vrf: MGMT snmp_server: contact: example@example.com location: EOS_DESIGNS_UNIT_TESTS MLAG-OSPF-L3LEAF1A @@ -118,9 +124,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.10.255.6/31 no_autostate: true mtu: 1500 + ip_address: 10.10.255.6/31 ospf_network_point_to_point: true ospf_area: 0.0.0.0 port_channel_interfaces: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG-OSPF-L3LEAF1B.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG-OSPF-L3LEAF1B.yml index 61e2b7e52c5..402b913d0db 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG-OSPF-L3LEAF1B.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG-OSPF-L3LEAF1B.yml @@ -65,6 +65,10 @@ ip_name_servers: vrf: MGMT - ip_address: 8.8.8.8 vrf: MGMT +- ip_address: 2001:db8::1 + vrf: MGMT +- ip_address: 2001:db8::2 + vrf: MGMT local_users: - name: admin disabled: true @@ -103,6 +107,8 @@ ntp: - name: 192.168.200.5 vrf: MGMT preferred: true + - name: 2001:db8::3 + vrf: MGMT snmp_server: contact: example@example.com location: EOS_DESIGNS_UNIT_TESTS MLAG-OSPF-L3LEAF1B @@ -118,9 +124,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.10.255.7/31 no_autostate: true mtu: 1500 + ip_address: 10.10.255.7/31 ospf_network_point_to_point: true ospf_area: 0.0.0.0 port_channel_interfaces: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/intended/structured_configs/duplicate-ip-address-1.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG_IPV6_L3LEAF1A.yml similarity index 65% rename from ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/intended/structured_configs/duplicate-ip-address-1.yml rename to ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG_IPV6_L3LEAF1A.yml index e2f7ba76f2c..54a167401eb 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/intended/structured_configs/duplicate-ip-address-1.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG_IPV6_L3LEAF1A.yml @@ -1,20 +1,22 @@ -hostname: duplicate-ip-address-1 +hostname: MLAG_IPV6_L3LEAF1A is_deployed: true router_bgp: - as: '65101' - router_id: 10.255.0.4 + as: '65001' + router_id: 192.168.255.35 bgp: default: ipv4_unicast: false maximum_paths: paths: 4 ecmp: 4 + updates: + wait_install: true peer_groups: - name: MLAG-IPv4-UNDERLAY-PEER type: ipv4 - remote_as: '65101' + remote_as: '65001' next_hop_self: true - description: duplicate-ip-address-2 + description: MLAG_IPV6_L3LEAF1B maximum_routes: 12000 send_community: all route_map_in: RM-MLAG-PEER-IN @@ -38,20 +40,10 @@ router_bgp: - name: EVPN-OVERLAY-PEERS activate: false neighbors: - - ip_address: 10.255.1.99 + - ip_address: 10.10.224.5 peer_group: MLAG-IPv4-UNDERLAY-PEER - peer: duplicate-ip-address-2 - description: duplicate-ip-address-2 - - ip_address: 10.255.255.2 - peer_group: IPv4-UNDERLAY-PEERS - remote_as: '65100' - peer: duplicate-ip-address-uplink-switch-router-bgp - description: duplicate-ip-address-uplink-switch-router-bgp_Ethernet1 - - ip_address: 10.255.0.1 - peer_group: EVPN-OVERLAY-PEERS - peer: duplicate-ip-address-uplink-switch-router-bgp - description: duplicate-ip-address-uplink-switch-router-bgp - remote_as: '65100' + peer: MLAG_IPV6_L3LEAF1B + description: MLAG_IPV6_L3LEAF1B redistribute_routes: - source_protocol: connected route_map: RM-CONN-2-BGP @@ -74,7 +66,7 @@ management_interfaces: description: oob_management shutdown: false vrf: MGMT - ip_address: 172.16.1.101/24 + ip_address: 192.168.201.116/24 gateway: null type: oob management_api_http: @@ -99,16 +91,16 @@ vlan_interfaces: description: MLAG_PEER_L3_PEERING shutdown: false mtu: 9214 - ip_address: 10.255.1.98/31 + ip_address: 10.10.224.4/31 - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.1.66/31 no_autostate: true mtu: 9214 + ipv6_address: 2001:db8:0:2::1/64 port_channel_interfaces: -- name: Port-Channel3 - description: MLAG_PEER_duplicate-ip-address-2_Po3 +- name: Port-Channel5 + description: MLAG_PEER_MLAG_IPV6_L3LEAF1B_Po5 type: switched shutdown: false mode: trunk @@ -116,40 +108,31 @@ port_channel_interfaces: - LEAF_PEER_L3 - MLAG ethernet_interfaces: -- name: Ethernet3 - peer: duplicate-ip-address-2 - peer_interface: Ethernet3 +- name: Ethernet5 + peer: MLAG_IPV6_L3LEAF1B + peer_interface: Ethernet5 peer_type: mlag_peer - description: MLAG_PEER_duplicate-ip-address-2_Ethernet3 + description: MLAG_PEER_MLAG_IPV6_L3LEAF1B_Ethernet5 type: port-channel-member shutdown: false channel_group: - id: 3 + id: 5 mode: active -- name: Ethernet4 - peer: duplicate-ip-address-2 - peer_interface: Ethernet4 +- name: Ethernet6 + peer: MLAG_IPV6_L3LEAF1B + peer_interface: Ethernet6 peer_type: mlag_peer - description: MLAG_PEER_duplicate-ip-address-2_Ethernet4 + description: MLAG_PEER_MLAG_IPV6_L3LEAF1B_Ethernet6 type: port-channel-member shutdown: false channel_group: - id: 3 + id: 5 mode: active -- name: Ethernet1 - peer: duplicate-ip-address-uplink-switch-router-bgp - peer_interface: Ethernet1 - peer_type: spine - description: P2P_LINK_TO_DUPLICATE-IP-ADDRESS-UPLINK-SWITCH-ROUTER-BGP_Ethernet1 - shutdown: false - mtu: 9214 - type: routed - ip_address: 10.255.255.3/31 mlag_configuration: - domain_id: duplicate-ip-address-router-bgp + domain_id: MLAG_IPV6 local_interface: Vlan4094 - peer_address: 10.255.1.67 - peer_link: Port-Channel3 + peer_address: 2001:db8:0:2::2 + peer_link: Port-Channel5 reload_delay_mlag: '300' reload_delay_non_mlag: '330' route_maps: @@ -170,18 +153,18 @@ loopback_interfaces: - name: Loopback0 description: EVPN_Overlay_Peering shutdown: false - ip_address: 10.255.0.4/32 + ip_address: 192.168.255.35/32 - name: Loopback1 description: VTEP_VXLAN_Tunnel_Source shutdown: false - ip_address: 10.255.1.4/32 + ip_address: 192.168.254.35/32 prefix_lists: - name: PL-LOOPBACKS-EVPN-OVERLAY sequence_numbers: - sequence: 10 - action: permit 10.255.0.0/27 eq 32 + action: permit 192.168.255.0/24 eq 32 - sequence: 20 - action: permit 10.255.1.0/27 eq 32 + action: permit 192.168.254.0/24 eq 32 router_bfd: multihop: interval: 300 @@ -191,10 +174,10 @@ ip_igmp_snooping: globally_enabled: true vxlan_interface: Vxlan1: - description: duplicate-ip-address-1_VTEP + description: MLAG_IPV6_L3LEAF1A_VTEP vxlan: udp_port: 4789 source_interface: Loopback1 virtual_router_encapsulation_mac_address: mlag-system-id metadata: - platform: vEOS-lab + platform: vEOS-LAB diff --git a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/intended/structured_configs/duplicate-ip-address-2.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG_IPV6_L3LEAF1B.yml similarity index 65% rename from ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/intended/structured_configs/duplicate-ip-address-2.yml rename to ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG_IPV6_L3LEAF1B.yml index 9d5a2b2d293..ea7c7206d93 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_negative_unit_tests/intended/structured_configs/duplicate-ip-address-2.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG_IPV6_L3LEAF1B.yml @@ -1,20 +1,22 @@ -hostname: duplicate-ip-address-2 +hostname: MLAG_IPV6_L3LEAF1B is_deployed: true router_bgp: - as: '65101' - router_id: 10.255.0.4 + as: '65001' + router_id: 192.168.255.36 bgp: default: ipv4_unicast: false maximum_paths: paths: 4 ecmp: 4 + updates: + wait_install: true peer_groups: - name: MLAG-IPv4-UNDERLAY-PEER type: ipv4 - remote_as: '65101' + remote_as: '65001' next_hop_self: true - description: duplicate-ip-address-1 + description: MLAG_IPV6_L3LEAF1A maximum_routes: 12000 send_community: all route_map_in: RM-MLAG-PEER-IN @@ -38,20 +40,10 @@ router_bgp: - name: EVPN-OVERLAY-PEERS activate: false neighbors: - - ip_address: 10.255.1.98 + - ip_address: 10.10.224.4 peer_group: MLAG-IPv4-UNDERLAY-PEER - peer: duplicate-ip-address-1 - description: duplicate-ip-address-1 - - ip_address: 10.255.255.2 - peer_group: IPv4-UNDERLAY-PEERS - remote_as: '65100' - peer: duplicate-ip-address-uplink-switch-router-bgp - description: duplicate-ip-address-uplink-switch-router-bgp_Ethernet2 - - ip_address: 10.255.0.1 - peer_group: EVPN-OVERLAY-PEERS - peer: duplicate-ip-address-uplink-switch-router-bgp - description: duplicate-ip-address-uplink-switch-router-bgp - remote_as: '65100' + peer: MLAG_IPV6_L3LEAF1A + description: MLAG_IPV6_L3LEAF1A redistribute_routes: - source_protocol: connected route_map: RM-CONN-2-BGP @@ -74,7 +66,7 @@ management_interfaces: description: oob_management shutdown: false vrf: MGMT - ip_address: 172.16.1.102/24 + ip_address: 192.168.201.117/24 gateway: null type: oob management_api_http: @@ -99,16 +91,16 @@ vlan_interfaces: description: MLAG_PEER_L3_PEERING shutdown: false mtu: 9214 - ip_address: 10.255.1.99/31 + ip_address: 10.10.224.5/31 - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.1.67/31 no_autostate: true mtu: 9214 + ipv6_address: 2001:db8:0:2::2/64 port_channel_interfaces: -- name: Port-Channel3 - description: MLAG_PEER_duplicate-ip-address-1_Po3 +- name: Port-Channel5 + description: MLAG_PEER_MLAG_IPV6_L3LEAF1A_Po5 type: switched shutdown: false mode: trunk @@ -116,40 +108,31 @@ port_channel_interfaces: - LEAF_PEER_L3 - MLAG ethernet_interfaces: -- name: Ethernet3 - peer: duplicate-ip-address-1 - peer_interface: Ethernet3 +- name: Ethernet5 + peer: MLAG_IPV6_L3LEAF1A + peer_interface: Ethernet5 peer_type: mlag_peer - description: MLAG_PEER_duplicate-ip-address-1_Ethernet3 + description: MLAG_PEER_MLAG_IPV6_L3LEAF1A_Ethernet5 type: port-channel-member shutdown: false channel_group: - id: 3 + id: 5 mode: active -- name: Ethernet4 - peer: duplicate-ip-address-1 - peer_interface: Ethernet4 +- name: Ethernet6 + peer: MLAG_IPV6_L3LEAF1A + peer_interface: Ethernet6 peer_type: mlag_peer - description: MLAG_PEER_duplicate-ip-address-1_Ethernet4 + description: MLAG_PEER_MLAG_IPV6_L3LEAF1A_Ethernet6 type: port-channel-member shutdown: false channel_group: - id: 3 + id: 5 mode: active -- name: Ethernet1 - peer: duplicate-ip-address-uplink-switch-router-bgp - peer_interface: Ethernet2 - peer_type: spine - description: P2P_LINK_TO_DUPLICATE-IP-ADDRESS-UPLINK-SWITCH-ROUTER-BGP_Ethernet2 - shutdown: false - mtu: 9214 - type: routed - ip_address: 10.255.255.3/31 mlag_configuration: - domain_id: duplicate-ip-address-router-bgp + domain_id: MLAG_IPV6 local_interface: Vlan4094 - peer_address: 10.255.1.66 - peer_link: Port-Channel3 + peer_address: 2001:db8:0:2::1 + peer_link: Port-Channel5 reload_delay_mlag: '300' reload_delay_non_mlag: '330' route_maps: @@ -170,18 +153,18 @@ loopback_interfaces: - name: Loopback0 description: EVPN_Overlay_Peering shutdown: false - ip_address: 10.255.0.4/32 + ip_address: 192.168.255.36/32 - name: Loopback1 description: VTEP_VXLAN_Tunnel_Source shutdown: false - ip_address: 10.255.1.4/32 + ip_address: 192.168.254.35/32 prefix_lists: - name: PL-LOOPBACKS-EVPN-OVERLAY sequence_numbers: - sequence: 10 - action: permit 10.255.0.0/27 eq 32 + action: permit 192.168.255.0/24 eq 32 - sequence: 20 - action: permit 10.255.1.0/27 eq 32 + action: permit 192.168.254.0/24 eq 32 router_bfd: multihop: interval: 300 @@ -191,10 +174,10 @@ ip_igmp_snooping: globally_enabled: true vxlan_interface: Vxlan1: - description: duplicate-ip-address-2_VTEP + description: MLAG_IPV6_L3LEAF1B_VTEP vxlan: udp_port: 4789 source_interface: Loopback1 virtual_router_encapsulation_mac_address: mlag-system-id metadata: - platform: vEOS-lab + platform: vEOS-LAB diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG_ODD_ID_L3LEAF1A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG_ODD_ID_L3LEAF1A.yml index 536c55cd8c7..e6e5edba6c1 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG_ODD_ID_L3LEAF1A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG_ODD_ID_L3LEAF1A.yml @@ -100,9 +100,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.10.255.2/31 no_autostate: true mtu: 9214 + ip_address: 10.10.255.2/31 port_channel_interfaces: - name: Port-Channel5 description: MLAG_PEER_MLAG_ODD_ID_L3LEAF1B_Po5 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG_ODD_ID_L3LEAF1B.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG_ODD_ID_L3LEAF1B.yml index 8b6108fe802..abfb6e634a2 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG_ODD_ID_L3LEAF1B.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG_ODD_ID_L3LEAF1B.yml @@ -100,9 +100,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.10.255.3/31 no_autostate: true mtu: 9214 + ip_address: 10.10.255.3/31 port_channel_interfaces: - name: Port-Channel5 description: MLAG_PEER_MLAG_ODD_ID_L3LEAF1A_Po5 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG_SAME_SUBNET_L3LEAF1A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG_SAME_SUBNET_L3LEAF1A.yml index 103f3984dd8..be09884b7a0 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG_SAME_SUBNET_L3LEAF1A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG_SAME_SUBNET_L3LEAF1A.yml @@ -135,9 +135,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.10.255.1/30 no_autostate: true mtu: 9214 + ip_address: 10.10.255.1/30 - name: Vlan10 tenant: TEST_MLAG_SAME_SUBNET_ON_VRF description: VLAN10 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG_SAME_SUBNET_L3LEAF1B.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG_SAME_SUBNET_L3LEAF1B.yml index 00f74c9aa0e..7147a6fe9a9 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG_SAME_SUBNET_L3LEAF1B.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG_SAME_SUBNET_L3LEAF1B.yml @@ -135,9 +135,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.10.255.2/30 no_autostate: true mtu: 9214 + ip_address: 10.10.255.2/30 - name: Vlan10 tenant: TEST_MLAG_SAME_SUBNET_ON_VRF description: VLAN10 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG_SAME_SUBNET_L3LEAF2A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG_SAME_SUBNET_L3LEAF2A.yml index 31cabe98c4f..8b214d9eb98 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG_SAME_SUBNET_L3LEAF2A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG_SAME_SUBNET_L3LEAF2A.yml @@ -135,9 +135,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.10.255.1/30 no_autostate: true mtu: 9214 + ip_address: 10.10.255.1/30 - name: Vlan10 tenant: TEST_MLAG_SAME_SUBNET_ON_VRF description: VLAN10 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG_SAME_SUBNET_L3LEAF2B.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG_SAME_SUBNET_L3LEAF2B.yml index 3344b7366d7..c634c645b62 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG_SAME_SUBNET_L3LEAF2B.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/MLAG_SAME_SUBNET_L3LEAF2B.yml @@ -135,9 +135,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.10.255.2/30 no_autostate: true mtu: 9214 + ip_address: 10.10.255.2/30 - name: Vlan10 tenant: TEST_MLAG_SAME_SUBNET_ON_VRF description: VLAN10 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/OVERLAY_ROUTING_PROTOCOL_HER_L3LEAF3A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/OVERLAY_ROUTING_PROTOCOL_HER_L3LEAF3A.yml index bb7b4e3e706..f81d8132453 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/OVERLAY_ROUTING_PROTOCOL_HER_L3LEAF3A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/OVERLAY_ROUTING_PROTOCOL_HER_L3LEAF3A.yml @@ -94,9 +94,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 192.168.254.4/31 no_autostate: true mtu: 9214 + ip_address: 192.168.254.4/31 - name: Vlan3900 tenant: TEST tags: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/OVERLAY_ROUTING_PROTOCOL_HER_L3LEAF3B.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/OVERLAY_ROUTING_PROTOCOL_HER_L3LEAF3B.yml index 0b815097370..354c628907a 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/OVERLAY_ROUTING_PROTOCOL_HER_L3LEAF3B.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/OVERLAY_ROUTING_PROTOCOL_HER_L3LEAF3B.yml @@ -94,9 +94,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 192.168.254.5/31 no_autostate: true mtu: 9214 + ip_address: 192.168.254.5/31 - name: Vlan3900 tenant: TEST tags: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/OVERRIDE_VTEP_L3LEAF1A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/OVERRIDE_VTEP_L3LEAF1A.yml index 44e0c509a72..132c08b77b4 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/OVERRIDE_VTEP_L3LEAF1A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/OVERRIDE_VTEP_L3LEAF1A.yml @@ -95,9 +95,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.10.255.4/31 no_autostate: true mtu: 9214 + ip_address: 10.10.255.4/31 port_channel_interfaces: - name: Port-Channel5 description: MLAG_PEER_OVERRIDE_VTEP_L3LEAF1B_Po5 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/OVERRIDE_VTEP_L3LEAF1B.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/OVERRIDE_VTEP_L3LEAF1B.yml index a84c25284e6..fa5874da0d1 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/OVERRIDE_VTEP_L3LEAF1B.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/OVERRIDE_VTEP_L3LEAF1B.yml @@ -95,9 +95,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.10.255.5/31 no_autostate: true mtu: 9214 + ip_address: 10.10.255.5/31 port_channel_interfaces: - name: Port-Channel5 description: MLAG_PEER_OVERRIDE_VTEP_L3LEAF1A_Po5 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/SL-LEAF0A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/SL-LEAF0A.yml index 99faed99418..6a79e6b7374 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/SL-LEAF0A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/SL-LEAF0A.yml @@ -25,9 +25,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.10.255.0/31 no_autostate: true mtu: 9214 + ip_address: 10.10.255.0/31 port_channel_interfaces: - name: Port-Channel25 description: MLAG_PEER_SL-LEAF0B_Po25 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/SL-LEAF0B.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/SL-LEAF0B.yml index 6fe45e3f7cf..7c587520740 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/SL-LEAF0B.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/SL-LEAF0B.yml @@ -25,9 +25,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.10.255.1/31 no_autostate: true mtu: 9214 + ip_address: 10.10.255.1/31 port_channel_interfaces: - name: Port-Channel25 description: MLAG_PEER_SL-LEAF0A_Po25 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/SL-LEAF1A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/SL-LEAF1A.yml index e1144ea9969..dc9f89c1f25 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/SL-LEAF1A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/SL-LEAF1A.yml @@ -25,9 +25,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.10.255.4/31 no_autostate: true mtu: 9214 + ip_address: 10.10.255.4/31 port_channel_interfaces: - name: Port-Channel25 description: MLAG_PEER_SL-LEAF1B_Po25 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/SL-LEAF1B.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/SL-LEAF1B.yml index 2a66ed4dec1..70e179d9438 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/SL-LEAF1B.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/SL-LEAF1B.yml @@ -25,9 +25,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.10.255.5/31 no_autostate: true mtu: 9214 + ip_address: 10.10.255.5/31 port_channel_interfaces: - name: Port-Channel25 description: MLAG_PEER_SL-LEAF1A_Po25 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/SL-LEAF2A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/SL-LEAF2A.yml index d59e59c4883..9c3f42a5911 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/SL-LEAF2A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/SL-LEAF2A.yml @@ -25,9 +25,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.10.255.10/31 no_autostate: true mtu: 9214 + ip_address: 10.10.255.10/31 port_channel_interfaces: - name: Port-Channel25 description: MLAG_PEER_SL-LEAF2B_Po25 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/SL-LEAF2B.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/SL-LEAF2B.yml index 760332b50b6..7b577e39612 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/SL-LEAF2B.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/SL-LEAF2B.yml @@ -25,9 +25,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.10.255.11/31 no_autostate: true mtu: 9214 + ip_address: 10.10.255.11/31 port_channel_interfaces: - name: Port-Channel25 description: MLAG_PEER_SL-LEAF2A_Po25 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/TEST-MGMT-GATEWAY-IN-NODE-GROUP.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/TEST-MGMT-GATEWAY-IN-NODE-GROUP.yml new file mode 100644 index 00000000000..f7fefe6ff09 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/TEST-MGMT-GATEWAY-IN-NODE-GROUP.yml @@ -0,0 +1,37 @@ +hostname: TEST-MGMT-GATEWAY-IN-NODE-GROUP +is_deployed: true +static_routes: +- vrf: MGMT + destination_address_prefix: 0.0.0.0/0 + gateway: 192.168.201.254 +ipv6_static_routes: +- vrf: MGMT + destination_address_prefix: ::/0 + gateway: 2001:db8::2 +service_routing_protocols_model: multi-agent +vlan_internal_order: + allocation: ascending + range: + beginning: 1006 + ending: 1199 +vrfs: +- name: MGMT + ip_routing: false + ipv6_routing: false +management_interfaces: +- name: Management1 + description: oob_management + shutdown: false + vrf: MGMT + ip_address: 192.168.201.202/24 + gateway: 192.168.201.254 + type: oob + ipv6_enable: true + ipv6_address: 2001:db8::105/64 + ipv6_gateway: 2001:db8::2 +management_api_http: + enable_vrfs: + - name: MGMT + enable_https: true +ip_igmp_snooping: + globally_enabled: true diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/UNDERLAY-MULTICAST-L3LEAF1A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/UNDERLAY-MULTICAST-L3LEAF1A.yml index a32f30ee25c..32e028ebfce 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/UNDERLAY-MULTICAST-L3LEAF1A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/UNDERLAY-MULTICAST-L3LEAF1A.yml @@ -125,9 +125,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.0/31 no_autostate: true mtu: 9214 + ip_address: 10.255.252.0/31 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_UNDERLAY-MULTICAST-L3LEAF1B_Po3 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/UNDERLAY-MULTICAST-L3LEAF1B.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/UNDERLAY-MULTICAST-L3LEAF1B.yml index e57c6650281..e65fcf9651a 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/UNDERLAY-MULTICAST-L3LEAF1B.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/UNDERLAY-MULTICAST-L3LEAF1B.yml @@ -125,9 +125,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.1/31 no_autostate: true mtu: 9214 + ip_address: 10.255.252.1/31 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_UNDERLAY-MULTICAST-L3LEAF1A_Po3 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/UNDERLAY-MULTICAST-L3LEAF2A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/UNDERLAY-MULTICAST-L3LEAF2A.yml index dc58b72093a..354373727a0 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/UNDERLAY-MULTICAST-L3LEAF2A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/UNDERLAY-MULTICAST-L3LEAF2A.yml @@ -112,9 +112,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.4/31 no_autostate: true mtu: 9214 + ip_address: 10.255.252.4/31 pim: ipv4: sparse_mode: true diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/UNDERLAY-MULTICAST-L3LEAF2B.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/UNDERLAY-MULTICAST-L3LEAF2B.yml index 89d30f4e92a..a0f5a1c1d20 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/UNDERLAY-MULTICAST-L3LEAF2B.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/UNDERLAY-MULTICAST-L3LEAF2B.yml @@ -112,9 +112,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.5/31 no_autostate: true mtu: 9214 + ip_address: 10.255.252.5/31 pim: ipv4: sparse_mode: true @@ -220,7 +220,7 @@ prefix_lists: router_msdp: originator_id_local_interface: Loopback0 peers: - - ipv4_address: 192.168.255.6 + - ipv4_address: 192.168.255.5 local_interface: Loopback0 description: UNDERLAY-MULTICAST-L3LEAF2A mesh_groups: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/UPLINK-MLAG-STRUCTURED-CONFIG-L2LEAF1A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/UPLINK-MLAG-STRUCTURED-CONFIG-L2LEAF1A.yml index 9221bda2cec..f12ca02a422 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/UPLINK-MLAG-STRUCTURED-CONFIG-L2LEAF1A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/UPLINK-MLAG-STRUCTURED-CONFIG-L2LEAF1A.yml @@ -41,9 +41,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.0/31 no_autostate: true mtu: 9214 + ip_address: 10.255.252.0/31 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_UPLINK-MLAG-STRUCTURED-CONFIG-L2LEAF1B_Po3 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/UPLINK-MLAG-STRUCTURED-CONFIG-L2LEAF1B.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/UPLINK-MLAG-STRUCTURED-CONFIG-L2LEAF1B.yml index 4ded97fbb57..26e419d81f5 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/UPLINK-MLAG-STRUCTURED-CONFIG-L2LEAF1B.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/UPLINK-MLAG-STRUCTURED-CONFIG-L2LEAF1B.yml @@ -41,9 +41,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.1/31 no_autostate: true mtu: 9214 + ip_address: 10.255.252.1/31 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_UPLINK-MLAG-STRUCTURED-CONFIG-L2LEAF1A_Po3 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/UPLINK-MLAG-STRUCTURED-CONFIG-L3LEAF1A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/UPLINK-MLAG-STRUCTURED-CONFIG-L3LEAF1A.yml index 598b6013489..808150997b0 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/UPLINK-MLAG-STRUCTURED-CONFIG-L3LEAF1A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/UPLINK-MLAG-STRUCTURED-CONFIG-L3LEAF1A.yml @@ -116,9 +116,9 @@ vlan_interfaces: - name: Vlan4094 description: mlag_peer_vlan_structured_config_override shutdown: false - ip_address: 10.255.252.0/31 no_autostate: true mtu: 9214 + ip_address: 10.255.252.0/31 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_UPLINK-MLAG-STRUCTURED-CONFIG-L3LEAF1B_Po3 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/UPLINK-MLAG-STRUCTURED-CONFIG-L3LEAF1B.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/UPLINK-MLAG-STRUCTURED-CONFIG-L3LEAF1B.yml index 934a41457c8..3b3bbcdeed4 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/UPLINK-MLAG-STRUCTURED-CONFIG-L3LEAF1B.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/UPLINK-MLAG-STRUCTURED-CONFIG-L3LEAF1B.yml @@ -116,9 +116,9 @@ vlan_interfaces: - name: Vlan4094 description: mlag_peer_vlan_structured_config_override shutdown: false - ip_address: 10.255.252.1/31 no_autostate: true mtu: 9214 + ip_address: 10.255.252.1/31 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_UPLINK-MLAG-STRUCTURED-CONFIG-L3LEAF1A_Po3 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/autovpn-edge-no-default-policy.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/autovpn-edge-no-default-policy.yml index 53ef10058a8..8e1307c6fe7 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/autovpn-edge-no-default-policy.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/autovpn-edge-no-default-policy.yml @@ -270,6 +270,8 @@ dps_interfaces: description: DPS Interface mtu: 9214 ip_address: 192.168.255.1/32 + flow_tracker: + hardware: FLOW-TRACKER vxlan_interface: Vxlan1: description: autovpn-edge-no-default-policy_VTEP @@ -283,3 +285,17 @@ vxlan_interface: vni: 100 - name: PROD vni: 42 +flow_tracking: + hardware: + trackers: + - name: FLOW-TRACKER + record_export: + on_inactive_timeout: 70000 + on_interval: 300000 + exporters: + - name: CV-TELEMETRY + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 3600000 + shutdown: false diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/autovpn-edge.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/autovpn-edge.yml index dcc873a0719..95e06c08ff1 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/autovpn-edge.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/autovpn-edge.yml @@ -292,6 +292,8 @@ dps_interfaces: description: DPS Interface mtu: 9214 ip_address: 192.168.130.1/32 + flow_tracker: + hardware: FLOW-TRACKER vxlan_interface: Vxlan1: description: autovpn-edge_VTEP @@ -303,3 +305,17 @@ vxlan_interface: vni: 1 - name: PROD vni: 42 +flow_tracking: + hardware: + trackers: + - name: FLOW-TRACKER + record_export: + on_inactive_timeout: 70000 + on_interval: 300000 + exporters: + - name: CV-TELEMETRY + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 3600000 + shutdown: false diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/autovpn-rr1.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/autovpn-rr1.yml index 8de428002c1..8acf01426e4 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/autovpn-rr1.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/autovpn-rr1.yml @@ -45,6 +45,7 @@ router_bgp: interval: 1000 min_rx: 1000 multiplier: 10 + route_reflector_client: true address_family_evpn: peer_groups: - name: WAN-OVERLAY-PEERS @@ -257,6 +258,8 @@ dps_interfaces: description: DPS Interface mtu: 9214 ip_address: 192.168.131.1/32 + flow_tracker: + hardware: FLOW-TRACKER vxlan_interface: Vxlan1: description: autovpn-rr1_VTEP @@ -268,3 +271,17 @@ vxlan_interface: vni: 1 - name: PROD vni: 42 +flow_tracking: + hardware: + trackers: + - name: FLOW-TRACKER + record_export: + on_inactive_timeout: 70000 + on_interval: 300000 + exporters: + - name: CV-TELEMETRY + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 3600000 + shutdown: false diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/autovpn-rr2.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/autovpn-rr2.yml index f61bfca1559..427c71a0bc7 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/autovpn-rr2.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/autovpn-rr2.yml @@ -45,6 +45,7 @@ router_bgp: interval: 1000 min_rx: 1000 multiplier: 10 + route_reflector_client: true address_family_evpn: peer_groups: - name: WAN-OVERLAY-PEERS @@ -259,6 +260,8 @@ dps_interfaces: description: DPS Interface mtu: 9214 ip_address: 192.168.131.2/32 + flow_tracker: + hardware: FLOW-TRACKER vxlan_interface: Vxlan1: description: autovpn-rr2_VTEP @@ -270,3 +273,17 @@ vxlan_interface: vni: 1 - name: PROD vni: 42 +flow_tracking: + hardware: + trackers: + - name: FLOW-TRACKER + record_export: + on_inactive_timeout: 70000 + on_interval: 300000 + exporters: + - name: CV-TELEMETRY + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 3600000 + shutdown: false diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/bgp-peer-groups-1.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/bgp-peer-groups-1.yml index 1e2a340db45..ff04deff773 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/bgp-peer-groups-1.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/bgp-peer-groups-1.yml @@ -92,9 +92,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 192.168.253.204/31 no_autostate: true mtu: 9214 + ip_address: 192.168.253.204/31 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_bgp-peer-groups-2_Po3 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/bgp-peer-groups-2.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/bgp-peer-groups-2.yml index 6a65737492f..ebe718e3c81 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/bgp-peer-groups-2.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/bgp-peer-groups-2.yml @@ -107,9 +107,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 192.168.253.205/31 no_autostate: true mtu: 9214 + ip_address: 192.168.253.205/31 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_bgp-peer-groups-1_Po3 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/connected_endpoints.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/connected_endpoints.yml index a198e1bcbc4..b7289cbd162 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/connected_endpoints.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/connected_endpoints.yml @@ -13,6 +13,9 @@ management_api_http: enable_vrfs: - name: MGMT enable_https: true +link_tracking_groups: +- name: LT_GROUP1 + recovery_delay: 300 ip_igmp_snooping: globally_enabled: true ethernet_interfaces: @@ -97,6 +100,25 @@ ethernet_interfaces: native_vlan: 123 spanning_tree_portfast: edge spanning_tree_bpdufilter: 'True' + dot1x: + unauthorized: + access_vlan_membership_egress: true + native_vlan_membership_egress: true + poe: + disabled: true + ptp: + announce: + interval: 0 + timeout: 3 + delay_req: -3 + sync_message: + interval: -3 + transport: ipv4 + enable: true + role: master + service_profile: MYQOS + sflow: + enable: false - name: Ethernet13 peer: INDIVIDUAL_1 peer_type: server @@ -112,6 +134,25 @@ ethernet_interfaces: native_vlan: 123 spanning_tree_portfast: edge spanning_tree_bpdufilter: 'True' + dot1x: + unauthorized: + access_vlan_membership_egress: true + native_vlan_membership_egress: true + poe: + disabled: true + ptp: + announce: + interval: 0 + timeout: 3 + delay_req: -3 + sync_message: + interval: -3 + transport: ipv4 + enable: true + role: master + service_profile: MYQOS + sflow: + enable: false - name: Ethernet14 peer: DOT1X_UNAUTHORIZED peer_type: server @@ -129,6 +170,53 @@ ethernet_interfaces: unauthorized: access_vlan_membership_egress: true native_vlan_membership_egress: true + poe: + disabled: true + ptp: + announce: + interval: 0 + timeout: 3 + delay_req: -3 + sync_message: + interval: -3 + transport: ipv4 + enable: true + role: master + service_profile: MYQOS + sflow: + enable: false +- name: Ethernet15 + peer: INDIVIDUAL_2_TRUNK_PHONE + peer_type: server + description: INDIVIDUAL_2_TRUNK_PHONE + shutdown: false + type: switched + channel_group: + id: 15 + mode: active + mode: trunk phone + native_vlan: 123 + phone: + vlan: 321 + link_tracking_groups: + - name: LT_GROUP1 + direction: downstream +- name: Ethernet16 + peer: INDIVIDUAL_2_TRUNK_PHONE + peer_type: server + description: INDIVIDUAL_2_TRUNK_PHONE + shutdown: false + type: switched + channel_group: + id: 15 + mode: active + mode: trunk phone + native_vlan: 123 + phone: + vlan: 321 + link_tracking_groups: + - name: LT_GROUP1 + direction: downstream port_channel_interfaces: - name: Port-Channel5 description: OLD_SW-1/5_PORT_CHANNEL_DESCRIPTION @@ -148,3 +236,11 @@ port_channel_interfaces: shutdown: false lacp_fallback_mode: individual lacp_fallback_timeout: 90 +- name: Port-Channel15 + description: INDIVIDUAL_2_TRUNK_PHONE + type: switched + shutdown: false + lacp_fallback_mode: individual + lacp_fallback_timeout: 90 +metadata: + platform: 720XP diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/core-4-multicast.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/core-4-multicast.yml new file mode 100644 index 00000000000..eac8d09615f --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/core-4-multicast.yml @@ -0,0 +1,136 @@ +hostname: core-4-multicast +is_deployed: true +router_bgp: + as: '65000' + router_id: 10.0.0.4 + bgp: + default: + ipv4_unicast: false + maximum_paths: + paths: 4 + ecmp: 4 + updates: + wait_install: true + peer_groups: + - name: IPv4-UNDERLAY-PEERS + type: ipv4 + maximum_routes: 12000 + send_community: all + address_family_ipv4: + peer_groups: + - name: IPv4-UNDERLAY-PEERS + activate: true + address_family_ipv6: + peer_groups: + - name: IPv4-UNDERLAY-PEERS + activate: true + redistribute_routes: + - source_protocol: connected + route_map: RM-CONN-2-BGP + neighbors: + - ip_address: 100.64.48.19 + remote_as: '65002' + peer: peer1 + description: peer1 + peer_group: IPv4-UNDERLAY-PEERS + local_as: '65001' + - ip_address: 100.64.48.21 + remote_as: '65003' + peer: peer2 + description: peer2 + peer_group: IPv4-UNDERLAY-PEERS + local_as: '65001' + - ip_address: 100.64.48.23 + remote_as: '65004' + peer: peer3 + description: peer3 + peer_group: IPv4-UNDERLAY-PEERS + local_as: '65001' +static_routes: +- vrf: MGMT + destination_address_prefix: 0.0.0.0/0 + gateway: 192.168.0.1 +service_routing_protocols_model: multi-agent +ip_routing: true +ipv6_unicast_routing: true +router_multicast: + ipv4: + routing: true +vlan_internal_order: + allocation: ascending + range: + beginning: 1006 + ending: 1199 +spanning_tree: + mode: none +vrfs: +- name: MGMT + ip_routing: false +management_api_http: + enable_vrfs: + - name: MGMT + enable_https: true +loopback_interfaces: +- name: Loopback0 + description: LSR_Router_ID + shutdown: false + ip_address: 10.0.0.4/32 + ipv6_address: 2000:1234:ffff:ffff::4/128 +prefix_lists: +- name: PL-LOOPBACKS-EVPN-OVERLAY + sequence_numbers: + - sequence: 10 + action: permit 10.0.0.0/24 eq 32 +ipv6_prefix_lists: +- name: PL-LOOPBACKS-EVPN-OVERLAY-V6 + sequence_numbers: + - sequence: 10 + action: permit 2000:1234:ffff:ffff::/64 eq 128 +route_maps: +- name: RM-CONN-2-BGP + sequence_numbers: + - sequence: 10 + type: permit + match: + - ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY + - sequence: 30 + type: permit + match: + - ipv6 address prefix-list PL-LOOPBACKS-EVPN-OVERLAY-V6 +ethernet_interfaces: +- name: Ethernet1 + peer: peer1 + peer_interface: Ethernet1 + peer_type: other + description: P2P_LINK_TO_peer1_Ethernet1 + type: routed + shutdown: false + mtu: 1600 + ip_address: 100.64.48.18/31 + pim: + ipv4: + sparse_mode: true + mpls: + ip: true +- name: Ethernet2 + peer: peer2 + peer_interface: Ethernet2 + peer_type: other + description: P2P_LINK_TO_peer2_Ethernet2 + type: routed + shutdown: false + mtu: 1600 + ip_address: 100.64.48.20/31 + mpls: + ip: true +- name: Ethernet3 + peer: peer3 + peer_interface: Ethernet3 + peer_type: other + description: P2P_LINK_TO_peer3_Ethernet3 + type: routed + shutdown: false + mtu: 1600 + ip_address: 100.64.48.22/31 + mpls: + ip: true diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-custom-control-plane-policy-edge-1.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-custom-control-plane-policy-edge-1.yml index 79fb76cbb0e..291109ceac0 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-custom-control-plane-policy-edge-1.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-custom-control-plane-policy-edge-1.yml @@ -16,7 +16,6 @@ router_bgp: maximum_routes: 12000 send_community: all route_map_in: RM-BGP-UNDERLAY-PEERS-IN - route_map_out: RM-BGP-UNDERLAY-PEERS-OUT - name: WAN-OVERLAY-PEERS type: wan update_source: Dps1 @@ -144,12 +143,6 @@ loopback_interfaces: description: Router_ID shutdown: false ip_address: 192.168.42.1/32 -as_path: - access_lists: - - name: ASPATH-WAN - entries: - - type: permit - match: '65000' prefix_lists: - name: PL-LOOPBACKS-EVPN-OVERLAY sequence_numbers: @@ -171,18 +164,6 @@ route_maps: description: Mark prefixes originated from the LAN set: - extcommunity soo 192.168.42.1:511 additive -- name: RM-BGP-UNDERLAY-PEERS-OUT - sequence_numbers: - - sequence: 10 - type: permit - description: Advertise local routes towards LAN - match: - - extcommunity ECL-EVPN-SOO - - sequence: 20 - type: permit - description: Advertise routes received from WAN iBGP towards LAN - match: - - route-type internal - name: RM-EVPN-SOO-IN sequence_numbers: - sequence: 10 @@ -208,20 +189,6 @@ agents: environment_variables: - name: KERNELFIB_PROGRAM_ALL_ECMP value: '1' -flow_tracking: - hardware: - trackers: - - name: FLOW-TRACKER - record_export: - on_inactive_timeout: 70000 - on_interval: 300000 - exporters: - - name: CV-TELEMETRY - collector: - host: 127.0.0.1 - local_interface: Loopback0 - template_interval: 3600000 - shutdown: false ip_extcommunity_lists: - name: ECL-EVPN-SOO entries: @@ -447,6 +414,20 @@ vxlan_interface: vni: 14 - name: PROD vni: 42 +flow_tracking: + hardware: + trackers: + - name: FLOW-TRACKER + record_export: + on_inactive_timeout: 70000 + on_interval: 300000 + exporters: + - name: CV-TELEMETRY + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 3600000 + shutdown: false metadata: cv_tags: device_tags: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-custom-control-plane-policy-edge-2.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-custom-control-plane-policy-edge-2.yml index 58b84cbe30d..88a4b21629b 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-custom-control-plane-policy-edge-2.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-custom-control-plane-policy-edge-2.yml @@ -16,7 +16,6 @@ router_bgp: maximum_routes: 12000 send_community: all route_map_in: RM-BGP-UNDERLAY-PEERS-IN - route_map_out: RM-BGP-UNDERLAY-PEERS-OUT - name: WAN-OVERLAY-PEERS type: wan update_source: Dps1 @@ -144,12 +143,6 @@ loopback_interfaces: description: Router_ID shutdown: false ip_address: 192.168.42.2/32 -as_path: - access_lists: - - name: ASPATH-WAN - entries: - - type: permit - match: '65000' prefix_lists: - name: PL-LOOPBACKS-EVPN-OVERLAY sequence_numbers: @@ -171,18 +164,6 @@ route_maps: description: Mark prefixes originated from the LAN set: - extcommunity soo 192.168.42.2:511 additive -- name: RM-BGP-UNDERLAY-PEERS-OUT - sequence_numbers: - - sequence: 10 - type: permit - description: Advertise local routes towards LAN - match: - - extcommunity ECL-EVPN-SOO - - sequence: 20 - type: permit - description: Advertise routes received from WAN iBGP towards LAN - match: - - route-type internal - name: RM-EVPN-SOO-IN sequence_numbers: - sequence: 10 @@ -208,20 +189,6 @@ agents: environment_variables: - name: KERNELFIB_PROGRAM_ALL_ECMP value: '1' -flow_tracking: - hardware: - trackers: - - name: FLOW-TRACKER - record_export: - on_inactive_timeout: 70000 - on_interval: 300000 - exporters: - - name: CV-TELEMETRY - collector: - host: 127.0.0.1 - local_interface: Loopback0 - template_interval: 3600000 - shutdown: false ip_extcommunity_lists: - name: ECL-EVPN-SOO entries: @@ -447,6 +414,20 @@ vxlan_interface: vni: 14 - name: PROD vni: 42 +flow_tracking: + hardware: + trackers: + - name: FLOW-TRACKER + record_export: + on_inactive_timeout: 70000 + on_interval: 300000 + exporters: + - name: CV-TELEMETRY + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 3600000 + shutdown: false metadata: cv_tags: device_tags: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-custom-control-plane-policy-edge-3.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-custom-control-plane-policy-edge-3.yml index 1fcbf03450f..a8cb344852d 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-custom-control-plane-policy-edge-3.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-custom-control-plane-policy-edge-3.yml @@ -16,7 +16,6 @@ router_bgp: maximum_routes: 12000 send_community: all route_map_in: RM-BGP-UNDERLAY-PEERS-IN - route_map_out: RM-BGP-UNDERLAY-PEERS-OUT - name: WAN-OVERLAY-PEERS type: wan update_source: Dps1 @@ -144,12 +143,6 @@ loopback_interfaces: description: Router_ID shutdown: false ip_address: 192.168.42.3/32 -as_path: - access_lists: - - name: ASPATH-WAN - entries: - - type: permit - match: '65000' prefix_lists: - name: PL-LOOPBACKS-EVPN-OVERLAY sequence_numbers: @@ -171,18 +164,6 @@ route_maps: description: Mark prefixes originated from the LAN set: - extcommunity soo 192.168.42.3:511 additive -- name: RM-BGP-UNDERLAY-PEERS-OUT - sequence_numbers: - - sequence: 10 - type: permit - description: Advertise local routes towards LAN - match: - - extcommunity ECL-EVPN-SOO - - sequence: 20 - type: permit - description: Advertise routes received from WAN iBGP towards LAN - match: - - route-type internal - name: RM-EVPN-SOO-IN sequence_numbers: - sequence: 10 @@ -208,20 +189,6 @@ agents: environment_variables: - name: KERNELFIB_PROGRAM_ALL_ECMP value: '1' -flow_tracking: - hardware: - trackers: - - name: FLOW-TRACKER - record_export: - on_inactive_timeout: 70000 - on_interval: 300000 - exporters: - - name: CV-TELEMETRY - collector: - host: 127.0.0.1 - local_interface: Loopback0 - template_interval: 3600000 - shutdown: false ip_extcommunity_lists: - name: ECL-EVPN-SOO entries: @@ -407,6 +374,20 @@ vxlan_interface: vni: 13 - name: PROD vni: 42 +flow_tracking: + hardware: + trackers: + - name: FLOW-TRACKER + record_export: + on_inactive_timeout: 70000 + on_interval: 300000 + exporters: + - name: CV-TELEMETRY + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 3600000 + shutdown: false metadata: cv_tags: device_tags: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-custom-control-plane-policy-pathfinder-1.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-custom-control-plane-policy-pathfinder-1.yml index 4f02a0a5cc9..910d54dc249 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-custom-control-plane-policy-pathfinder-1.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-custom-control-plane-policy-pathfinder-1.yml @@ -16,7 +16,6 @@ router_bgp: maximum_routes: 12000 send_community: all route_map_in: RM-BGP-UNDERLAY-PEERS-IN - route_map_out: RM-BGP-UNDERLAY-PEERS-OUT - name: WAN-OVERLAY-PEERS type: wan update_source: Dps1 @@ -43,6 +42,7 @@ router_bgp: interval: 1000 min_rx: 1000 multiplier: 10 + route_reflector_client: true address_family_ipv4: peer_groups: - name: IPv4-UNDERLAY-PEERS @@ -184,20 +184,6 @@ agents: environment_variables: - name: KERNELFIB_PROGRAM_ALL_ECMP value: '1' -flow_tracking: - hardware: - trackers: - - name: FLOW-TRACKER - record_export: - on_inactive_timeout: 70000 - on_interval: 300000 - exporters: - - name: CV-TELEMETRY - collector: - host: 127.0.0.1 - local_interface: Loopback0 - template_interval: 3600000 - shutdown: false ip_extcommunity_lists: - name: ECL-EVPN-SOO entries: @@ -424,6 +410,20 @@ vxlan_interface: vni: 42 - name: IT vni: 14 +flow_tracking: + hardware: + trackers: + - name: FLOW-TRACKER + record_export: + on_inactive_timeout: 70000 + on_interval: 300000 + exporters: + - name: CV-TELEMETRY + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 3600000 + shutdown: false metadata: cv_tags: device_tags: @@ -506,6 +506,10 @@ metadata: - name: AVD_Land_West-ZONE id: 1 sites: + - name: Site404 + id: 404 + location: + address: Not Found - name: Site422 id: 422 location: @@ -522,6 +526,8 @@ metadata: sites: - name: Site511 id: 511 + location: + address: Miami vrfs: - name: default vni: 1 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-edge-custom-default-policy.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-edge-custom-default-policy.yml index c3f533b9a6c..7ecf297270a 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-edge-custom-default-policy.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-edge-custom-default-policy.yml @@ -168,20 +168,6 @@ agents: environment_variables: - name: KERNELFIB_PROGRAM_ALL_ECMP value: '1' -flow_tracking: - hardware: - trackers: - - name: custom_flow_track_name - record_export: - on_inactive_timeout: 50000 - on_interval: 300331 - exporters: - - name: ayush_exporter - collector: - host: 127.0.0.1 - local_interface: Loopback0 - template_interval: 40000 - shutdown: false ip_extcommunity_lists: - name: ECL-EVPN-SOO entries: @@ -314,7 +300,7 @@ router_path_selection: - name: Ethernet2 stun: server_profiles: - - MPLS-cv-pathfinder-pathfinder-Ethernet2 + - MPLS-cv-pathfinder-pathfinder-Ethernet2_2 dynamic_peers: enabled: true static_peers: @@ -354,7 +340,7 @@ stun: - name: INET-cv-pathfinder-pathfinder-Ethernet3 ip_address: 10.9.9.9 ssl_profile: STUN-DTLS - - name: MPLS-cv-pathfinder-pathfinder-Ethernet2 + - name: MPLS-cv-pathfinder-pathfinder-Ethernet2_2 ip_address: 172.16.0.1 ssl_profile: STUN-DTLS application_traffic_recognition: @@ -393,6 +379,20 @@ vxlan_interface: vni: 1 - name: PROD vni: 42 +flow_tracking: + hardware: + trackers: + - name: custom_flow_track_name + record_export: + on_inactive_timeout: 50000 + on_interval: 300331 + exporters: + - name: ayush_exporter + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 40000 + shutdown: false metadata: cv_tags: device_tags: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-edge-no-default-policy.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-edge-no-default-policy.yml index bef88ce21bf..2a7f400c3f6 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-edge-no-default-policy.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-edge-no-default-policy.yml @@ -185,20 +185,6 @@ agents: environment_variables: - name: KERNELFIB_PROGRAM_ALL_ECMP value: '1' -flow_tracking: - hardware: - trackers: - - name: FLOW-TRACKER - record_export: - on_inactive_timeout: 70000 - on_interval: 300000 - exporters: - - name: CV-TELEMETRY - collector: - host: 127.0.0.1 - local_interface: Loopback0 - template_interval: 3600000 - shutdown: false ip_extcommunity_lists: - name: ECL-EVPN-SOO entries: @@ -326,7 +312,7 @@ router_path_selection: - name: Ethernet2 stun: server_profiles: - - MPLS-cv-pathfinder-pathfinder-Ethernet2 + - MPLS-cv-pathfinder-pathfinder-Ethernet2_2 dynamic_peers: enabled: true ipsec: false @@ -364,7 +350,7 @@ stun: - name: INET-cv-pathfinder-pathfinder-Ethernet3 ip_address: 10.9.9.9 ssl_profile: STUN-DTLS - - name: MPLS-cv-pathfinder-pathfinder-Ethernet2 + - name: MPLS-cv-pathfinder-pathfinder-Ethernet2_2 ip_address: 172.16.0.1 ssl_profile: STUN-DTLS application_traffic_recognition: @@ -401,6 +387,20 @@ vxlan_interface: vni: 100 - name: PROD vni: 42 +flow_tracking: + hardware: + trackers: + - name: FLOW-TRACKER + record_export: + on_inactive_timeout: 70000 + on_interval: 300000 + exporters: + - name: CV-TELEMETRY + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 3600000 + shutdown: false metadata: cv_tags: device_tags: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-edge.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-edge.yml index deee275780e..c5e0c45047a 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-edge.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-edge.yml @@ -47,6 +47,16 @@ router_bgp: remote_as: '65199' peer: site-ha-disabled-leaf description: site-ha-disabled-leaf_Ethernet1 + - ip_address: 172.16.9.4 + remote_as: '64520' + description: ATT_666_peer3_Ethernet42 + route_map_in: RM-BGP-172.16.9.4-IN + route_map_out: RM-BGP-172.16.9.4-OUT + - ip_address: 172.16.5.4 + remote_as: '64520' + description: Colt_10555 + route_map_in: RM-BGP-172.16.5.4-IN + route_map_out: RM-BGP-172.16.5.4-OUT - ip_address: 192.168.144.1 peer_group: WAN-OVERLAY-PEERS peer: cv-pathfinder-pathfinder @@ -219,6 +229,8 @@ ethernet_interfaces: shutdown: false type: routed description: ATT_666_peer3_Ethernet42 + flow_tracker: + hardware: FLOW-TRACKER dhcp_client_accept_default_route: true - name: Ethernet2 peer_type: l3_interface @@ -226,6 +238,16 @@ ethernet_interfaces: shutdown: false type: routed description: Colt_10555 + ip_nat: + service_profile: NAT-IE-DIRECT +- name: Ethernet2/1 + peer_type: l3_interface + ip_address: 172.15.5.6/31 + shutdown: false + type: routed + description: Colt_10555 + ip_nat: + service_profile: NAT-IE-DIRECT - name: Ethernet3 peer_type: l3_interface ip_address: 172.20.20.20/31 @@ -237,17 +259,15 @@ loopback_interfaces: description: Router_ID shutdown: false ip_address: 192.168.42.1/32 -as_path: - access_lists: - - name: ASPATH-WAN - entries: - - type: permit - match: '65000' prefix_lists: - name: PL-LOOPBACKS-EVPN-OVERLAY sequence_numbers: - sequence: 10 action: permit 192.168.42.0/24 eq 32 +- name: ALLOW-DEFAULT + sequence_numbers: + - sequence: 10 + action: permit 0.0.0.0/0 - name: PL-STATIC-VRF-DEFAULT sequence_numbers: - sequence: 10 @@ -268,18 +288,34 @@ route_maps: description: Mark prefixes originated from the LAN set: - extcommunity soo 192.168.42.1:511 additive -- name: RM-BGP-UNDERLAY-PEERS-OUT +- name: RM-BGP-172.16.9.4-IN sequence_numbers: - sequence: 10 type: permit - description: Advertise local routes towards LAN match: - - extcommunity ECL-EVPN-SOO - - sequence: 20 + - ip address prefix-list ALLOW-DEFAULT + set: + - community no-advertise additive +- name: RM-BGP-172.16.9.4-OUT + sequence_numbers: + - sequence: 10 + type: deny +- name: RM-BGP-172.16.5.4-IN + sequence_numbers: + - sequence: 10 type: permit - description: Advertise routes received from WAN iBGP towards LAN match: - - route-type internal + - ip address prefix-list ALLOW-DEFAULT + set: + - community no-advertise additive +- name: RM-BGP-172.16.5.4-OUT + sequence_numbers: + - sequence: 10 + type: permit + match: + - ip address prefix-list ALLOW-DEFAULT + - sequence: 20 + type: deny - name: RM-EVPN-SOO-IN sequence_numbers: - sequence: 10 @@ -311,28 +347,25 @@ route_maps: static_routes: - destination_address_prefix: 172.16.0.0/16 gateway: 172.16.5.4 +- destination_address_prefix: 172.16.0.0/16 + gateway: 172.16.5.9 - destination_address_prefix: 66.66.66.0/24 gateway: 172.17.0.0 vrf: default +- destination_address_prefix: 10.37.121.1/32 + name: IE-ZSCALER-PRI + gateway: 172.20.20.21 +- destination_address_prefix: 10.39.77.1/32 + name: IE-ZSCALER-SEC + gateway: 172.20.20.21 +- destination_address_prefix: 10.50.9.1/32 + name: IE-ZSCALER-TER + gateway: 172.20.20.21 agents: - name: KernelFib environment_variables: - name: KERNELFIB_PROGRAM_ALL_ECMP value: '1' -flow_tracking: - hardware: - trackers: - - name: FLOW-TRACKER - record_export: - on_inactive_timeout: 70000 - on_interval: 300000 - exporters: - - name: CV-TELEMETRY - collector: - host: 127.0.0.1 - local_interface: Loopback0 - template_interval: 3600000 - shutdown: false ip_extcommunity_lists: - name: ECL-EVPN-SOO entries: @@ -342,6 +375,11 @@ ip_security: ike_policies: - name: CP-IKE-POLICY local_id: 192.168.142.1 + - name: IE-ZSCALER-EXIT-POLICY-1-IKE-POLICY + local_id_fqdn: cv-pathfinder-edge_ZSCALER-EXIT-POLICY-1@test.local + ike_lifetime: 24 + encryption: aes256 + dh_group: 24 sa_policies: - name: DP-SA-POLICY esp: @@ -351,6 +389,13 @@ ip_security: esp: encryption: aes256gcm128 pfs_dh_group: 14 + - name: IE-ZSCALER-EXIT-POLICY-1-SA-POLICY + pfs_dh_group: 24 + sa_lifetime: + value: 8 + esp: + integrity: sha256 + encryption: aes256 profiles: - name: DP-PROFILE sa_policy: DP-SA-POLICY @@ -371,6 +416,15 @@ ip_security: time: 50 action: clear mode: transport + - name: IE-ZSCALER-EXIT-POLICY-1-PROFILE + ike_policy: IE-ZSCALER-EXIT-POLICY-1-IKE-POLICY + sa_policy: IE-ZSCALER-EXIT-POLICY-1-SA-POLICY + shared_key: 0007054B145A1F0E0928424A0C0B4812160C093B101807091F10105E222E2A351B69777F7D2D3A5547666C7F7A616A672374332B7C68263639327A3E2A3B0468 + dpd: + interval: 10 + time: 60 + action: clear + connection: start key_controller: profile: DP-PROFILE management_security: @@ -399,10 +453,12 @@ router_adaptive_virtual_topology: load_balance_policy: LB-DEFAULT-AVT-POLICY-CONTROL-PLANE - name: DEFAULT-AVT-POLICY-VIDEO load_balance_policy: LB-DEFAULT-AVT-POLICY-VIDEO + internet_exit_policy: DIRECT-EXIT-POLICY-1 - name: DEFAULT-AVT-POLICY-DEFAULT load_balance_policy: LB-DEFAULT-AVT-POLICY-DEFAULT - name: PROD-AVT-POLICY-VOICE load_balance_policy: LB-PROD-AVT-POLICY-VOICE + internet_exit_policy: ZSCALER-EXIT-POLICY-1 - name: PROD-AVT-POLICY-VIDEO load_balance_policy: LB-PROD-AVT-POLICY-VIDEO - name: PROD-AVT-POLICY-MPLS-ONLY @@ -505,7 +561,11 @@ router_path_selection: - name: Ethernet2 stun: server_profiles: - - MPLS-cv-pathfinder-pathfinder-Ethernet2 + - MPLS-cv-pathfinder-pathfinder-Ethernet2_2 + - name: Ethernet2/1 + stun: + server_profiles: + - MPLS-cv-pathfinder-pathfinder-Ethernet2_2 dynamic_peers: enabled: true ipsec: false @@ -578,7 +638,7 @@ stun: - name: INET-cv-pathfinder-pathfinder-Ethernet3 ip_address: 10.9.9.9 ssl_profile: profileA - - name: MPLS-cv-pathfinder-pathfinder-Ethernet2 + - name: MPLS-cv-pathfinder-pathfinder-Ethernet2_2 ip_address: 172.16.0.1 ssl_profile: profileA application_traffic_recognition: @@ -634,6 +694,100 @@ application_traffic_recognition: - name: PFX-PATHFINDERS prefix_values: - 192.168.144.1/32 +ip_access_lists: +- name: ACL-NAT-IE-DIRECT + entries: + - sequence: 10 + action: deny + protocol: ip + source: 172.15.5.5 + destination: any + - sequence: 20 + action: deny + protocol: ip + source: 172.15.5.6 + destination: any + - sequence: 30 + action: permit + protocol: ip + source: any + destination: any +- name: ACL-NAT-IE-ZSCALER + entries: + - sequence: 10 + action: permit + protocol: ip + source: any + destination: any +ip_nat: + profiles: + - name: NAT-IE-DIRECT + source: + dynamic: + - access_list: ACL-NAT-IE-DIRECT + nat_type: overload + - name: NAT-IE-ZSCALER + source: + dynamic: + - access_list: ACL-NAT-IE-ZSCALER + pool_name: PORT-ONLY-POOL + nat_type: pool + pools: + - name: PORT-ONLY-POOL + type: port-only + ranges: + - first_port: 1500 + last_port: 65535 +router_service_insertion: + enabled: true + connections: + - name: IE-Ethernet2 + monitor_connectivity_host: IE-Ethernet2 + ethernet_interface: + name: Ethernet2 + next_hop: 172.16.5.4 + - name: IE-Ethernet2_1 + monitor_connectivity_host: IE-Ethernet2_1 + ethernet_interface: + name: Ethernet2/1 + next_hop: 172.16.5.9 + - name: IE-Tunnel100 + monitor_connectivity_host: IE-Tunnel100 + tunnel_interface: + primary: Tunnel100 + - name: IE-Tunnel101 + monitor_connectivity_host: IE-Tunnel101 + tunnel_interface: + primary: Tunnel101 + - name: IE-Tunnel102 + monitor_connectivity_host: IE-Tunnel102 + tunnel_interface: + primary: Tunnel102 +router_internet_exit: + exit_groups: + - name: DIRECT-EXIT-POLICY-1 + local_connections: + - name: IE-Ethernet2 + - name: IE-Ethernet2_1 + - name: ZSCALER-EXIT-POLICY-1_PRI + local_connections: + - name: IE-Tunnel100 + - name: ZSCALER-EXIT-POLICY-1_SEC + local_connections: + - name: IE-Tunnel101 + - name: ZSCALER-EXIT-POLICY-1_TER + local_connections: + - name: IE-Tunnel102 + policies: + - name: DIRECT-EXIT-POLICY-1 + exit_groups: + - name: DIRECT-EXIT-POLICY-1 + - name: ZSCALER-EXIT-POLICY-1 + exit_groups: + - name: ZSCALER-EXIT-POLICY-1_PRI + - name: ZSCALER-EXIT-POLICY-1_SEC + - name: ZSCALER-EXIT-POLICY-1_TER + - name: system-default-exit-group dps_interfaces: - name: Dps1 description: DPS Interface @@ -656,7 +810,122 @@ vxlan_interface: vni: 42 - name: ATTRACTED-VRF-FROM-UPLINK vni: 166 +tunnel_interfaces: +- name: Tunnel100 + description: Internet Exit ZSCALER-EXIT-POLICY-1 PRI + mtu: 1394 + ip_address: unnumbered Loopback0 + tunnel_mode: ipsec + source_interface: Ethernet3 + destination: 10.37.121.1 + ipsec_profile: IE-ZSCALER-EXIT-POLICY-1-PROFILE + nat_profile: NAT-IE-ZSCALER +- name: Tunnel101 + description: Internet Exit ZSCALER-EXIT-POLICY-1 SEC + mtu: 1394 + ip_address: unnumbered Loopback0 + tunnel_mode: ipsec + source_interface: Ethernet3 + destination: 10.39.77.1 + ipsec_profile: IE-ZSCALER-EXIT-POLICY-1-PROFILE + nat_profile: NAT-IE-ZSCALER +- name: Tunnel102 + description: Internet Exit ZSCALER-EXIT-POLICY-1 TER + mtu: 1394 + ip_address: unnumbered Loopback0 + tunnel_mode: ipsec + source_interface: Ethernet3 + destination: 10.50.9.1 + ipsec_profile: IE-ZSCALER-EXIT-POLICY-1-PROFILE + nat_profile: NAT-IE-ZSCALER +monitor_connectivity: + interface_sets: + - name: SET-Ethernet2 + interfaces: Ethernet2 + - name: SET-Ethernet2_1 + interfaces: Ethernet2/1 + - name: SET-Tunnel100 + interfaces: Tunnel100 + - name: SET-Tunnel101 + interfaces: Tunnel101 + - name: SET-Tunnel102 + interfaces: Tunnel102 + hosts: + - name: IE-Ethernet2 + description: Internet Exit DIRECT-EXIT-POLICY-1 + ip: 172.16.5.4 + local_interfaces: SET-Ethernet2 + address_only: false + - name: IE-Ethernet2_1 + description: Internet Exit DIRECT-EXIT-POLICY-1 + ip: 172.16.5.9 + local_interfaces: SET-Ethernet2_1 + address_only: false + - name: IE-Tunnel100 + description: Internet Exit ZSCALER-EXIT-POLICY-1 PRI + ip: 10.37.121.1 + local_interfaces: SET-Tunnel100 + address_only: false + url: http://gateway.zscalerbeta.net/vpntest + - name: IE-Tunnel101 + description: Internet Exit ZSCALER-EXIT-POLICY-1 SEC + ip: 10.39.77.1 + local_interfaces: SET-Tunnel101 + address_only: false + url: http://gateway.zscalerbeta.net/vpntest + - name: IE-Tunnel102 + description: Internet Exit ZSCALER-EXIT-POLICY-1 TER + ip: 10.50.9.1 + local_interfaces: SET-Tunnel102 + address_only: false + url: http://gateway.zscalerbeta.net/vpntest + shutdown: false metadata: + cv_pathfinder: + internet_exit_policies: + - name: ZSCALER-EXIT-POLICY-1 + type: zscaler + city: Santa Clara, CA + country: United States + firewall: false + ips_control: false + acceptable_use_policy: false + vpn_credentials: + - fqdn: cv-pathfinder-edge_ZSCALER-EXIT-POLICY-1@test.local + vpn_type: UFQDN + pre_shared_key: 0007054B145A1F0E0928424A0C0B4812160C093B101807091F10105E222E2A351B69777F7D2D3A5547666C7F7A616A672374332B7C68263639327A3E2A3B0468 + tunnels: + - name: Tunnel100 + preference: Preferred + - name: Tunnel101 + preference: Alternate + - name: Tunnel102 + preference: Alternate + role: edge + ssl_profile: profileA + vtep_ip: 192.168.142.1 + region: AVD_Land_East + zone: AVD_Land_East-ZONE + site: Site511 + interfaces: + - name: Ethernet1 + carrier: ATT + circuit_id: '666' + pathgroup: INET + - name: Ethernet2 + carrier: Colt + circuit_id: '10555' + pathgroup: MPLS + - name: Ethernet2/1 + carrier: Colt + circuit_id: '10555' + pathgroup: MPLS + - name: Ethernet3 + carrier: Comcast-5G + circuit_id: AF830 + pathgroup: LTE + pathfinders: + - vtep_ip: 192.168.144.1 cv_tags: device_tags: - name: Role @@ -700,6 +969,14 @@ metadata: value: Colt - name: Circuit value: '10555' + - interface: Ethernet2/1 + tags: + - name: Type + value: wan + - name: Carrier + value: Colt + - name: Circuit + value: '10555' - interface: Ethernet3 tags: - name: Type @@ -708,25 +985,17 @@ metadata: value: Comcast-5G - name: Circuit value: AF830 - cv_pathfinder: - role: edge - ssl_profile: profileA - vtep_ip: 192.168.142.1 - region: AVD_Land_East - zone: AVD_Land_East-ZONE - site: Site511 - interfaces: - - name: Ethernet1 - carrier: ATT - circuit_id: '666' - pathgroup: INET - - name: Ethernet2 - carrier: Colt - circuit_id: '10555' - pathgroup: MPLS - - name: Ethernet3 - carrier: Comcast-5G - circuit_id: AF830 - pathgroup: LTE - pathfinders: - - vtep_ip: 192.168.144.1 +flow_tracking: + hardware: + trackers: + - name: FLOW-TRACKER + record_export: + on_inactive_timeout: 70000 + on_interval: 300000 + exporters: + - name: CV-TELEMETRY + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 3600000 + shutdown: false diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-edge1.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-edge1.yml index 3a2639e59fa..b756217e7d7 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-edge1.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-edge1.yml @@ -16,7 +16,6 @@ router_bgp: maximum_routes: 12000 send_community: all route_map_in: RM-BGP-UNDERLAY-PEERS-IN - route_map_out: RM-BGP-UNDERLAY-PEERS-OUT - name: WAN-OVERLAY-PEERS type: wan update_source: Dps1 @@ -45,10 +44,21 @@ router_bgp: remote_as: '65199' peer: site-ha-disabled-leaf description: site-ha-disabled-leaf_Ethernet2 - - ip_address: 192.168.144.1 + - ip_address: 172.29.0.13 + remote_as: '64520' + route_map_in: RM-BGP-172.29.0.13-IN + route_map_out: RM-BGP-172.29.0.13-OUT + - ip_address: 172.28.0.14 + remote_as: '64520' + route_map_out: RM-BGP-172.28.0.14-OUT + - ip_address: 192.168.144.2 peer_group: WAN-OVERLAY-PEERS - peer: cv-pathfinder-pathfinder - description: cv-pathfinder-pathfinder + peer: cv-pathfinder-pathfinder1 + description: cv-pathfinder-pathfinder1 + - ip_address: 192.168.144.3 + peer_group: WAN-OVERLAY-PEERS + peer: cv-pathfinder-pathfinder2 + description: cv-pathfinder-pathfinder2 vrfs: - name: IT router_id: 192.168.42.2 @@ -209,12 +219,14 @@ ethernet_interfaces: encapsulation_dot1q_vlan: 666 mtu: 9214 ip_address: 172.17.0.3/31 -- name: Ethernet1 +- name: Ethernet1/49.3 peer_type: l3_interface ip_address: dhcp shutdown: false - type: routed + type: l3dot1q description: Inmrasat_S511 + access_group_in: TEST-IPV4-ACL-WITH-IP-FIELDS-IN_Ethernet1_49.3 + encapsulation_dot1q_vlan: 3 - name: Ethernet2 peer_type: l3_interface ip_address: dhcp @@ -229,22 +241,44 @@ ethernet_interfaces: type: routed description: ATT_404 dhcp_client_accept_default_route: true + ip_nat: + service_profile: NAT-IE-DIRECT +- name: Ethernet4 + peer_type: l3_interface + ip_address: dhcp + shutdown: false + type: routed + dhcp_client_accept_default_route: true +- name: Ethernet5 + peer_type: l3_interface + ip_address: dhcp + shutdown: false + type: routed + dhcp_client_accept_default_route: true +- name: Ethernet1/49 + type: routed + peer_type: l3_interface + shutdown: false loopback_interfaces: - name: Loopback0 description: Router_ID shutdown: false ip_address: 192.168.42.2/32 -as_path: - access_lists: - - name: ASPATH-WAN - entries: - - type: permit - match: '65000' prefix_lists: - name: PL-LOOPBACKS-EVPN-OVERLAY sequence_numbers: - sequence: 10 action: permit 192.168.42.0/24 eq 32 +- name: PL2 + sequence_numbers: + - sequence: 10 + action: permit 5.0.0.0/0 + - sequence: 20 + action: deny 10.00.0.0/24 +- name: ALLOW-DEFAULT + sequence_numbers: + - sequence: 10 + action: permit 0.0.0.0/0 route_maps: - name: RM-CONN-2-BGP sequence_numbers: @@ -261,18 +295,28 @@ route_maps: description: Mark prefixes originated from the LAN set: - extcommunity soo 192.168.42.2:511 additive -- name: RM-BGP-UNDERLAY-PEERS-OUT +- name: RM-BGP-172.29.0.13-IN sequence_numbers: - sequence: 10 type: permit - description: Advertise local routes towards LAN match: - - extcommunity ECL-EVPN-SOO + - ip address prefix-list PL2 +- name: RM-BGP-172.29.0.13-OUT + sequence_numbers: + - sequence: 10 + type: permit + match: + - ip address prefix-list ALLOW-DEFAULT - sequence: 20 + type: deny +- name: RM-BGP-172.28.0.14-OUT + sequence_numbers: + - sequence: 10 type: permit - description: Advertise routes received from WAN iBGP towards LAN match: - - route-type internal + - ip address prefix-list PL2 + - sequence: 20 + type: deny - name: RM-EVPN-SOO-IN sequence_numbers: - sequence: 10 @@ -298,20 +342,42 @@ agents: environment_variables: - name: KERNELFIB_PROGRAM_ALL_ECMP value: '1' -flow_tracking: - hardware: - trackers: - - name: FLOW-TRACKER - record_export: - on_inactive_timeout: 70000 - on_interval: 300000 - exporters: - - name: CV-TELEMETRY - collector: - host: 127.0.0.1 - local_interface: Loopback0 - template_interval: 3600000 - shutdown: false +ip_access_lists: +- name: TEST-IPV4-ACL-WITH-IP-FIELDS-IN_Ethernet1_49.3 + entries: + - sequence: 15 + action: deny + protocol: ip + source: any + destination: 172.24.49.3 + - action: permit + protocol: ip + source: 172.24.49.2 + destination: 172.24.49.3 +- name: ACL-NAT-IE-DIRECT + entries: + - sequence: 10 + action: deny + protocol: ip + source: any + destination: 5.0.0.0/24 + - sequence: 20 + action: permit + protocol: ip + source: any + destination: any +- name: ACL-NAT-IE-ZSCALER + entries: + - sequence: 10 + action: permit + protocol: ip + source: any + destination: 10.0.0.0/24 + - sequence: 20 + action: deny + protocol: ip + source: any + destination: any ip_extcommunity_lists: - name: ECL-EVPN-SOO entries: @@ -321,6 +387,16 @@ ip_security: ike_policies: - name: CP-IKE-POLICY local_id: 192.168.142.2 + - name: IE-ZSCALER-EXIT-POLICY-1-IKE-POLICY + local_id_fqdn: cv-pathfinder-edge1_ZSCALER-EXIT-POLICY-1@test.local + ike_lifetime: 24 + encryption: aes256 + dh_group: 24 + - name: IE-ZSCALER-EXIT-POLICY-2-IKE-POLICY + local_id_fqdn: cv-pathfinder-edge1_ZSCALER-EXIT-POLICY-2@test.local + ike_lifetime: 24 + encryption: aes256 + dh_group: 24 sa_policies: - name: DP-SA-POLICY esp: @@ -330,6 +406,20 @@ ip_security: esp: encryption: aes256gcm128 pfs_dh_group: 14 + - name: IE-ZSCALER-EXIT-POLICY-1-SA-POLICY + pfs_dh_group: 24 + sa_lifetime: + value: 8 + esp: + integrity: sha256 + encryption: aes256 + - name: IE-ZSCALER-EXIT-POLICY-2-SA-POLICY + pfs_dh_group: 24 + sa_lifetime: + value: 8 + esp: + integrity: sha256 + encryption: aes256 profiles: - name: DP-PROFILE sa_policy: DP-SA-POLICY @@ -350,6 +440,24 @@ ip_security: time: 50 action: clear mode: transport + - name: IE-ZSCALER-EXIT-POLICY-1-PROFILE + ike_policy: IE-ZSCALER-EXIT-POLICY-1-IKE-POLICY + sa_policy: IE-ZSCALER-EXIT-POLICY-1-SA-POLICY + shared_key: 0007054B145A1F0E0928424A0C0B4812160C09551511170B121907214A333B286214687C782720215B0867637B7B666B3873293274733B31233B6D2A332315696A + dpd: + interval: 10 + time: 60 + action: clear + connection: start + - name: IE-ZSCALER-EXIT-POLICY-2-PROFILE + ike_policy: IE-ZSCALER-EXIT-POLICY-2-IKE-POLICY + sa_policy: IE-ZSCALER-EXIT-POLICY-2-SA-POLICY + shared_key: 0007054B145A1F0E0928424A0C0B4812160C09551511170B121907214A333B286214687C782720215B0B67637B7B666B3873293274733B31233B6D2A332315696A + dpd: + interval: 10 + time: 60 + action: clear + connection: start key_controller: profile: DP-PROFILE management_security: @@ -378,12 +486,15 @@ router_adaptive_virtual_topology: load_balance_policy: LB-DEFAULT-AVT-POLICY-CONTROL-PLANE - name: DEFAULT-AVT-POLICY-VIDEO load_balance_policy: LB-DEFAULT-AVT-POLICY-VIDEO + internet_exit_policy: DIRECT-EXIT-POLICY-1 - name: DEFAULT-AVT-POLICY-DEFAULT load_balance_policy: LB-DEFAULT-AVT-POLICY-DEFAULT - name: PROD-AVT-POLICY-VOICE load_balance_policy: LB-PROD-AVT-POLICY-VOICE + internet_exit_policy: ZSCALER-EXIT-POLICY-1 - name: PROD-AVT-POLICY-VIDEO load_balance_policy: LB-PROD-AVT-POLICY-VIDEO + internet_exit_policy: ZSCALER-EXIT-POLICY-2 - name: PROD-AVT-POLICY-DEFAULT load_balance_policy: LB-PROD-AVT-POLICY-DEFAULT - name: DEFAULT-POLICY-DEFAULT @@ -458,7 +569,7 @@ router_path_selection: - name: Satellite id: 104 local_interfaces: - - name: Ethernet1 + - name: Ethernet1/49.3 dynamic_peers: enabled: true ipsec_profile: CP-PROFILE @@ -477,16 +588,19 @@ router_path_selection: - name: Ethernet3 stun: server_profiles: - - INET-cv-pathfinder-pathfinder-Ethernet1 - - INET-cv-pathfinder-pathfinder-Ethernet3 + - INET-cv-pathfinder-pathfinder1-Ethernet1 + - INET-cv-pathfinder-pathfinder2-Ethernet1 dynamic_peers: enabled: true static_peers: - - router_ip: 192.168.144.1 - name: cv-pathfinder-pathfinder + - router_ip: 192.168.144.2 + name: cv-pathfinder-pathfinder1 + ipv4_addresses: + - 10.8.8.8 + - router_ip: 192.168.144.3 + name: cv-pathfinder-pathfinder2 ipv4_addresses: - - 172.17.7.7 - - 10.9.9.9 + - 10.9.9.6 ipsec_profile: CP-PROFILE load_balance_policies: - name: LB-DEFAULT-AVT-POLICY-CONTROL-PLANE @@ -525,11 +639,11 @@ router_traffic_engineering: stun: client: server_profiles: - - name: INET-cv-pathfinder-pathfinder-Ethernet1 - ip_address: 172.17.7.7 + - name: INET-cv-pathfinder-pathfinder1-Ethernet1 + ip_address: 10.8.8.8 ssl_profile: profileA - - name: INET-cv-pathfinder-pathfinder-Ethernet3 - ip_address: 10.9.9.9 + - name: INET-cv-pathfinder-pathfinder2-Ethernet1 + ip_address: 10.9.9.6 ssl_profile: profileA application_traffic_recognition: application_profiles: @@ -582,7 +696,107 @@ application_traffic_recognition: - 6.6.6.0/24 - name: PFX-PATHFINDERS prefix_values: - - 192.168.144.1/32 + - 192.168.144.2/32 + - 192.168.144.3/32 +ip_nat: + profiles: + - name: NAT-IE-DIRECT + source: + dynamic: + - access_list: ACL-NAT-IE-DIRECT + nat_type: overload + - name: NAT-IE-ZSCALER + source: + dynamic: + - access_list: ACL-NAT-IE-ZSCALER + pool_name: PORT-ONLY-POOL + nat_type: pool + pools: + - name: PORT-ONLY-POOL + type: port-only + ranges: + - first_port: 1500 + last_port: 65535 +static_routes: +- destination_address_prefix: 10.37.121.1/32 + name: IE-ZSCALER-PRI + gateway: 172.31.0.1 +- destination_address_prefix: 10.39.77.1/32 + name: IE-ZSCALER-SEC + gateway: 172.31.0.1 +- destination_address_prefix: 10.50.9.1/32 + name: IE-ZSCALER-TER + gateway: 172.31.0.1 +router_service_insertion: + enabled: true + connections: + - name: IE-Ethernet3 + monitor_connectivity_host: IE-Ethernet3 + ethernet_interface: + name: Ethernet3 + next_hop: 172.31.0.1 + - name: IE-Tunnel100 + monitor_connectivity_host: IE-Tunnel100 + tunnel_interface: + primary: Tunnel100 + - name: IE-Tunnel101 + monitor_connectivity_host: IE-Tunnel101 + tunnel_interface: + primary: Tunnel101 + - name: IE-Tunnel102 + monitor_connectivity_host: IE-Tunnel102 + tunnel_interface: + primary: Tunnel102 + - name: IE-Tunnel110 + monitor_connectivity_host: IE-Tunnel110 + tunnel_interface: + primary: Tunnel110 + - name: IE-Tunnel111 + monitor_connectivity_host: IE-Tunnel111 + tunnel_interface: + primary: Tunnel111 + - name: IE-Tunnel112 + monitor_connectivity_host: IE-Tunnel112 + tunnel_interface: + primary: Tunnel112 +router_internet_exit: + exit_groups: + - name: DIRECT-EXIT-POLICY-1 + local_connections: + - name: IE-Ethernet3 + - name: ZSCALER-EXIT-POLICY-1_PRI + local_connections: + - name: IE-Tunnel100 + - name: ZSCALER-EXIT-POLICY-1_SEC + local_connections: + - name: IE-Tunnel101 + - name: ZSCALER-EXIT-POLICY-1_TER + local_connections: + - name: IE-Tunnel102 + - name: ZSCALER-EXIT-POLICY-2_PRI + local_connections: + - name: IE-Tunnel110 + - name: ZSCALER-EXIT-POLICY-2_SEC + local_connections: + - name: IE-Tunnel111 + - name: ZSCALER-EXIT-POLICY-2_TER + local_connections: + - name: IE-Tunnel112 + policies: + - name: DIRECT-EXIT-POLICY-1 + exit_groups: + - name: DIRECT-EXIT-POLICY-1 + - name: ZSCALER-EXIT-POLICY-1 + exit_groups: + - name: ZSCALER-EXIT-POLICY-1_PRI + - name: ZSCALER-EXIT-POLICY-1_SEC + - name: ZSCALER-EXIT-POLICY-1_TER + - name: system-default-exit-group + - name: ZSCALER-EXIT-POLICY-2 + exit_groups: + - name: ZSCALER-EXIT-POLICY-2_PRI + - name: ZSCALER-EXIT-POLICY-2_SEC + - name: ZSCALER-EXIT-POLICY-2_TER dps_interfaces: - name: Dps1 description: DPS Interface @@ -605,7 +819,181 @@ vxlan_interface: vni: 42 - name: ATTRACTED-VRF-FROM-UPLINK vni: 166 +tunnel_interfaces: +- name: Tunnel100 + description: Internet Exit ZSCALER-EXIT-POLICY-1 PRI + mtu: 1394 + ip_address: unnumbered Loopback0 + tunnel_mode: ipsec + source_interface: Ethernet3 + destination: 10.37.121.1 + ipsec_profile: IE-ZSCALER-EXIT-POLICY-1-PROFILE + nat_profile: NAT-IE-ZSCALER +- name: Tunnel101 + description: Internet Exit ZSCALER-EXIT-POLICY-1 SEC + mtu: 1394 + ip_address: unnumbered Loopback0 + tunnel_mode: ipsec + source_interface: Ethernet3 + destination: 10.39.77.1 + ipsec_profile: IE-ZSCALER-EXIT-POLICY-1-PROFILE + nat_profile: NAT-IE-ZSCALER +- name: Tunnel102 + description: Internet Exit ZSCALER-EXIT-POLICY-1 TER + mtu: 1394 + ip_address: unnumbered Loopback0 + tunnel_mode: ipsec + source_interface: Ethernet3 + destination: 10.50.9.1 + ipsec_profile: IE-ZSCALER-EXIT-POLICY-1-PROFILE + nat_profile: NAT-IE-ZSCALER +- name: Tunnel110 + description: Internet Exit ZSCALER-EXIT-POLICY-2 PRI + mtu: 1394 + ip_address: unnumbered Loopback0 + tunnel_mode: ipsec + source_interface: Ethernet3 + destination: 10.37.121.1 + ipsec_profile: IE-ZSCALER-EXIT-POLICY-2-PROFILE + nat_profile: NAT-IE-ZSCALER +- name: Tunnel111 + description: Internet Exit ZSCALER-EXIT-POLICY-2 SEC + mtu: 1394 + ip_address: unnumbered Loopback0 + tunnel_mode: ipsec + source_interface: Ethernet3 + destination: 10.39.77.1 + ipsec_profile: IE-ZSCALER-EXIT-POLICY-2-PROFILE + nat_profile: NAT-IE-ZSCALER +- name: Tunnel112 + description: Internet Exit ZSCALER-EXIT-POLICY-2 TER + mtu: 1394 + ip_address: unnumbered Loopback0 + tunnel_mode: ipsec + source_interface: Ethernet3 + destination: 10.50.9.1 + ipsec_profile: IE-ZSCALER-EXIT-POLICY-2-PROFILE + nat_profile: NAT-IE-ZSCALER +monitor_connectivity: + interface_sets: + - name: SET-Ethernet3 + interfaces: Ethernet3 + - name: SET-Tunnel100 + interfaces: Tunnel100 + - name: SET-Tunnel101 + interfaces: Tunnel101 + - name: SET-Tunnel102 + interfaces: Tunnel102 + - name: SET-Tunnel110 + interfaces: Tunnel110 + - name: SET-Tunnel111 + interfaces: Tunnel111 + - name: SET-Tunnel112 + interfaces: Tunnel112 + hosts: + - name: IE-Ethernet3 + description: Internet Exit DIRECT-EXIT-POLICY-1 + ip: 172.31.0.1 + local_interfaces: SET-Ethernet3 + address_only: false + - name: IE-Tunnel100 + description: Internet Exit ZSCALER-EXIT-POLICY-1 PRI + ip: 10.37.121.1 + local_interfaces: SET-Tunnel100 + address_only: false + url: http://gateway.zscalerbeta.net/vpntest + - name: IE-Tunnel101 + description: Internet Exit ZSCALER-EXIT-POLICY-1 SEC + ip: 10.39.77.1 + local_interfaces: SET-Tunnel101 + address_only: false + url: http://gateway.zscalerbeta.net/vpntest + - name: IE-Tunnel102 + description: Internet Exit ZSCALER-EXIT-POLICY-1 TER + ip: 10.50.9.1 + local_interfaces: SET-Tunnel102 + address_only: false + url: http://gateway.zscalerbeta.net/vpntest + - name: IE-Tunnel110 + description: Internet Exit ZSCALER-EXIT-POLICY-2 PRI + ip: 10.37.121.1 + local_interfaces: SET-Tunnel110 + address_only: false + url: http://gateway.zscalerbeta.net/vpntest + - name: IE-Tunnel111 + description: Internet Exit ZSCALER-EXIT-POLICY-2 SEC + ip: 10.39.77.1 + local_interfaces: SET-Tunnel111 + address_only: false + url: http://gateway.zscalerbeta.net/vpntest + - name: IE-Tunnel112 + description: Internet Exit ZSCALER-EXIT-POLICY-2 TER + ip: 10.50.9.1 + local_interfaces: SET-Tunnel112 + address_only: false + url: http://gateway.zscalerbeta.net/vpntest + shutdown: false metadata: + cv_pathfinder: + internet_exit_policies: + - name: ZSCALER-EXIT-POLICY-1 + type: zscaler + city: Santa Clara, CA + country: United States + firewall: false + ips_control: false + acceptable_use_policy: false + vpn_credentials: + - fqdn: cv-pathfinder-edge1_ZSCALER-EXIT-POLICY-1@test.local + vpn_type: UFQDN + pre_shared_key: 0007054B145A1F0E0928424A0C0B4812160C09551511170B121907214A333B286214687C782720215B0867637B7B666B3873293274733B31233B6D2A332315696A + tunnels: + - name: Tunnel100 + preference: Preferred + - name: Tunnel101 + preference: Alternate + - name: Tunnel102 + preference: Alternate + - name: ZSCALER-EXIT-POLICY-2 + type: zscaler + city: Santa Clara, CA + country: United States + firewall: false + ips_control: false + acceptable_use_policy: false + vpn_credentials: + - fqdn: cv-pathfinder-edge1_ZSCALER-EXIT-POLICY-2@test.local + vpn_type: UFQDN + pre_shared_key: 0007054B145A1F0E0928424A0C0B4812160C09551511170B121907214A333B286214687C782720215B0B67637B7B666B3873293274733B31233B6D2A332315696A + tunnels: + - name: Tunnel110 + preference: Preferred + - name: Tunnel111 + preference: Alternate + - name: Tunnel112 + preference: Alternate + role: edge + ssl_profile: profileA + vtep_ip: 192.168.142.2 + region: AVD_Land_East + zone: AVD_Land_East-ZONE + site: Site511 + interfaces: + - name: Ethernet1/49.3 + carrier: Inmrasat + circuit_id: S511 + pathgroup: Satellite + - name: Ethernet2 + carrier: AWS-1 + circuit_id: '212' + pathgroup: AWS + - name: Ethernet3 + carrier: ATT + circuit_id: '404' + pathgroup: INET + pathfinders: + - vtep_ip: 192.168.144.2 + - vtep_ip: 192.168.144.3 cv_tags: device_tags: - name: Role @@ -633,7 +1021,7 @@ metadata: tags: - name: Type value: lan - - interface: Ethernet1 + - interface: Ethernet1/49.3 tags: - name: Type value: wan @@ -657,25 +1045,29 @@ metadata: value: ATT - name: Circuit value: '404' - cv_pathfinder: - role: edge - ssl_profile: profileA - vtep_ip: 192.168.142.2 - region: AVD_Land_East - zone: AVD_Land_East-ZONE - site: Site511 - interfaces: - - name: Ethernet1 - carrier: Inmrasat - circuit_id: S511 - pathgroup: Satellite - - name: Ethernet2 - carrier: AWS-1 - circuit_id: '212' - pathgroup: AWS - - name: Ethernet3 - carrier: ATT - circuit_id: '404' - pathgroup: INET - pathfinders: - - vtep_ip: 192.168.144.1 + - interface: Ethernet4 + tags: + - name: Type + value: lan + - interface: Ethernet5 + tags: + - name: Type + value: lan + - interface: Ethernet1/49 + tags: + - name: Type + value: lan +flow_tracking: + hardware: + trackers: + - name: FLOW-TRACKER + record_export: + on_inactive_timeout: 70000 + on_interval: 300000 + exporters: + - name: CV-TELEMETRY + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 3600000 + shutdown: false diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-edge2A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-edge2A.yml index a4c42b4b91b..605c89f7e15 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-edge2A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-edge2A.yml @@ -57,6 +57,15 @@ router_bgp: peer_group: WAN-OVERLAY-PEERS peer: cv-pathfinder-pathfinder description: cv-pathfinder-pathfinder + - ip_address: 192.168.142.3 + peer: cv-pathfinder-edge2B + description: cv-pathfinder-edge2B + remote_as: '65000' + update_source: Dps1 + route_reflector_client: true + send_community: all + route_map_in: RM-WAN-HA-PEER-IN + route_map_out: RM-WAN-HA-PEER-OUT vrfs: - name: IT router_id: 192.168.42.2 @@ -145,6 +154,12 @@ router_bgp: activate: true route_map_in: RM-EVPN-SOO-IN route_map_out: RM-EVPN-SOO-OUT + neighbor_default: + next_hop_self_received_evpn_routes: + enable: true + neighbors: + - ip_address: 192.168.142.3 + activate: true address_family_ipv4_sr_te: peer_groups: - name: WAN-OVERLAY-PEERS @@ -332,36 +347,22 @@ route_maps: match: - ip address prefix-list PL-WAN-HA-PEER-PREFIXES - sequence: 20 - type: permit - description: Allow prefixes originated from the HA peer - match: - - extcommunity ECL-EVPN-SOO - set: - - as-path match all replacement auto auto - - sequence: 30 - type: permit - description: Use WAN routes from HA peer as backup + type: deny + description: Deny other routes from the HA peer match: - as-path ASPATH-WAN - set: - - community no-advertise - name: RM-BGP-UNDERLAY-PEERS-OUT sequence_numbers: - sequence: 10 type: permit - description: Advertise local routes towards LAN - match: - - extcommunity ECL-EVPN-SOO - - sequence: 20 - type: permit - description: Advertise routes received from WAN iBGP towards LAN + description: Make routes learned from WAN HA peer less preferred on LAN routers match: + - tag 50 - route-type internal - - sequence: 30 + set: + - metric 50 + - sequence: 20 type: permit - description: Advertise WAN HA prefixes towards LAN - match: - - ip address prefix-list PL-WAN-HA-PREFIXES - name: RM-EVPN-SOO-IN sequence_numbers: - sequence: 10 @@ -376,6 +377,27 @@ route_maps: type: permit set: - extcommunity soo 192.168.42.2:423 additive +- name: RM-WAN-HA-PEER-IN + sequence_numbers: + - sequence: 10 + type: permit + description: Set tag 50 on routes received from HA peer over EVPN + set: + - tag 50 +- name: RM-WAN-HA-PEER-OUT + sequence_numbers: + - sequence: 10 + type: permit + description: Make EVPN routes learned from WAN less preferred on HA peer + match: + - route-type internal + set: + - local-preference 50 + - sequence: 20 + type: permit + description: Make locally injected routes less preferred on HA peer + set: + - local-preference 75 - name: RM-EVPN-EXPORT-VRF-DEFAULT sequence_numbers: - sequence: 10 @@ -387,20 +409,6 @@ agents: environment_variables: - name: KERNELFIB_PROGRAM_ALL_ECMP value: '1' -flow_tracking: - hardware: - trackers: - - name: FLOW-TRACKER - record_export: - on_inactive_timeout: 70000 - on_interval: 300000 - exporters: - - name: CV-TELEMETRY - collector: - host: 127.0.0.1 - local_interface: Loopback0 - template_interval: 3600000 - shutdown: false ip_extcommunity_lists: - name: ECL-EVPN-SOO entries: @@ -696,6 +704,20 @@ vxlan_interface: vni: 42 - name: ATTRACTED-VRF-FROM-UPLINK vni: 166 +flow_tracking: + hardware: + trackers: + - name: FLOW-TRACKER + record_export: + on_inactive_timeout: 70000 + on_interval: 300000 + exporters: + - name: CV-TELEMETRY + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 3600000 + shutdown: false metadata: cv_tags: device_tags: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-edge2B.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-edge2B.yml index 7f01caf164b..579b83de598 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-edge2B.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-edge2B.yml @@ -57,6 +57,15 @@ router_bgp: peer_group: WAN-OVERLAY-PEERS peer: cv-pathfinder-pathfinder description: cv-pathfinder-pathfinder + - ip_address: 192.168.142.2 + peer: cv-pathfinder-edge2A + description: cv-pathfinder-edge2A + remote_as: '65000' + update_source: Dps1 + route_reflector_client: true + send_community: all + route_map_in: RM-WAN-HA-PEER-IN + route_map_out: RM-WAN-HA-PEER-OUT vrfs: - name: IT router_id: 192.168.42.3 @@ -145,6 +154,12 @@ router_bgp: activate: true route_map_in: RM-EVPN-SOO-IN route_map_out: RM-EVPN-SOO-OUT + neighbor_default: + next_hop_self_received_evpn_routes: + enable: true + neighbors: + - ip_address: 192.168.142.2 + activate: true address_family_ipv4_sr_te: peer_groups: - name: WAN-OVERLAY-PEERS @@ -331,36 +346,22 @@ route_maps: match: - ip address prefix-list PL-WAN-HA-PEER-PREFIXES - sequence: 20 - type: permit - description: Allow prefixes originated from the HA peer - match: - - extcommunity ECL-EVPN-SOO - set: - - as-path match all replacement auto auto - - sequence: 30 - type: permit - description: Use WAN routes from HA peer as backup + type: deny + description: Deny other routes from the HA peer match: - as-path ASPATH-WAN - set: - - community no-advertise - name: RM-BGP-UNDERLAY-PEERS-OUT sequence_numbers: - sequence: 10 type: permit - description: Advertise local routes towards LAN - match: - - extcommunity ECL-EVPN-SOO - - sequence: 20 - type: permit - description: Advertise routes received from WAN iBGP towards LAN + description: Make routes learned from WAN HA peer less preferred on LAN routers match: + - tag 50 - route-type internal - - sequence: 30 + set: + - metric 50 + - sequence: 20 type: permit - description: Advertise WAN HA prefixes towards LAN - match: - - ip address prefix-list PL-WAN-HA-PREFIXES - name: RM-EVPN-SOO-IN sequence_numbers: - sequence: 10 @@ -375,6 +376,27 @@ route_maps: type: permit set: - extcommunity soo 192.168.42.2:423 additive +- name: RM-WAN-HA-PEER-IN + sequence_numbers: + - sequence: 10 + type: permit + description: Set tag 50 on routes received from HA peer over EVPN + set: + - tag 50 +- name: RM-WAN-HA-PEER-OUT + sequence_numbers: + - sequence: 10 + type: permit + description: Make EVPN routes learned from WAN less preferred on HA peer + match: + - route-type internal + set: + - local-preference 50 + - sequence: 20 + type: permit + description: Make locally injected routes less preferred on HA peer + set: + - local-preference 75 - name: RM-EVPN-EXPORT-VRF-DEFAULT sequence_numbers: - sequence: 10 @@ -386,20 +408,6 @@ agents: environment_variables: - name: KERNELFIB_PROGRAM_ALL_ECMP value: '1' -flow_tracking: - hardware: - trackers: - - name: FLOW-TRACKER - record_export: - on_inactive_timeout: 70000 - on_interval: 300000 - exporters: - - name: CV-TELEMETRY - collector: - host: 127.0.0.1 - local_interface: Loopback0 - template_interval: 3600000 - shutdown: false ip_extcommunity_lists: - name: ECL-EVPN-SOO entries: @@ -558,7 +566,7 @@ router_path_selection: - name: Ethernet2 stun: server_profiles: - - MPLS-cv-pathfinder-pathfinder-Ethernet2 + - MPLS-cv-pathfinder-pathfinder-Ethernet2_2 dynamic_peers: enabled: true ipsec: false @@ -626,7 +634,7 @@ router_traffic_engineering: stun: client: server_profiles: - - name: MPLS-cv-pathfinder-pathfinder-Ethernet2 + - name: MPLS-cv-pathfinder-pathfinder-Ethernet2_2 ip_address: 172.16.0.1 ssl_profile: profileA application_traffic_recognition: @@ -704,6 +712,20 @@ vxlan_interface: vni: 42 - name: ATTRACTED-VRF-FROM-UPLINK vni: 166 +flow_tracking: + hardware: + trackers: + - name: FLOW-TRACKER + record_export: + on_inactive_timeout: 70000 + on_interval: 300000 + exporters: + - name: CV-TELEMETRY + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 3600000 + shutdown: false metadata: cv_tags: device_tags: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-edge3A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-edge3A.yml new file mode 100644 index 00000000000..4f437cf6d36 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-edge3A.yml @@ -0,0 +1,574 @@ +hostname: cv-pathfinder-edge3A +is_deployed: true +router_bgp: + as: '65000' + router_id: 192.168.42.6 + bgp: + default: + ipv4_unicast: false + maximum_paths: + paths: 16 + updates: + wait_install: true + peer_groups: + - name: IPv4-UNDERLAY-PEERS + type: ipv4 + maximum_routes: 12000 + send_community: all + route_map_in: RM-BGP-UNDERLAY-PEERS-IN + route_map_out: RM-BGP-UNDERLAY-PEERS-OUT + - name: WAN-OVERLAY-PEERS + type: wan + update_source: Dps1 + bfd: true + password: htm4AZe9mIQOO1uiMuGgYQ== + send_community: all + maximum_routes: 0 + remote_as: '65000' + ttl_maximum_hops: 1 + bfd_timers: + interval: 1000 + min_rx: 1000 + multiplier: 10 + address_family_ipv4: + peer_groups: + - name: IPv4-UNDERLAY-PEERS + activate: true + - name: WAN-OVERLAY-PEERS + activate: false + redistribute_routes: + - source_protocol: connected + route_map: RM-CONN-2-BGP + address_family_evpn: + peer_groups: + - name: WAN-OVERLAY-PEERS + activate: true + route_map_in: RM-EVPN-SOO-IN + route_map_out: RM-EVPN-SOO-OUT + neighbor_default: + next_hop_self_received_evpn_routes: + enable: true + neighbors: + - ip_address: 192.168.142.7 + activate: true + address_family_ipv4_sr_te: + peer_groups: + - name: WAN-OVERLAY-PEERS + activate: true + address_family_link_state: + peer_groups: + - name: WAN-OVERLAY-PEERS + activate: true + path_selection: + roles: + producer: true + address_family_path_selection: + peer_groups: + - name: WAN-OVERLAY-PEERS + activate: true + bgp: + additional_paths: + receive: true + send: + any: true + neighbors: + - ip_address: 192.168.144.1 + peer_group: WAN-OVERLAY-PEERS + peer: cv-pathfinder-pathfinder + description: cv-pathfinder-pathfinder + - ip_address: 192.168.142.7 + peer: cv-pathfinder-edge3B + description: cv-pathfinder-edge3B + remote_as: '65000' + update_source: Dps1 + route_reflector_client: true + send_community: all + route_map_in: RM-WAN-HA-PEER-IN + route_map_out: RM-WAN-HA-PEER-OUT + vrfs: + - name: default + rd: 192.168.42.6:1 + route_targets: + import: + - address_family: evpn + route_targets: + - '1:1' + export: + - address_family: evpn + route_targets: + - '1:1' + - route-map RM-EVPN-EXPORT-VRF-DEFAULT + - name: IT + router_id: 192.168.42.6 + rd: 192.168.42.6:1000 + route_targets: + import: + - address_family: evpn + route_targets: + - 1000:1000 + export: + - address_family: evpn + route_targets: + - 1000:1000 + redistribute_routes: + - source_protocol: connected + - name: PROD + router_id: 192.168.42.6 + rd: 192.168.42.6:142 + route_targets: + import: + - address_family: evpn + route_targets: + - 142:142 + export: + - address_family: evpn + route_targets: + - 142:142 + redistribute_routes: + - source_protocol: connected +service_routing_protocols_model: multi-agent +ip_routing: true +transceiver_qsfp_default_mode_4x10: false +spanning_tree: + mode: none +vrfs: +- name: MGMT + ip_routing: false +- name: IT + tenant: TenantA + ip_routing: true +- name: PROD + tenant: TenantA + ip_routing: true +management_api_http: + enable_vrfs: + - name: MGMT + enable_https: true +ethernet_interfaces: +- name: Ethernet1 + peer_type: l3_interface + ip_address: dhcp + shutdown: false + type: routed + description: ATT_404-01 + dhcp_client_accept_default_route: true +- name: Ethernet52 + type: routed + peer_type: l3_interface + peer: cv-pathfinder-edge3B + shutdown: false + description: DIRECT LAN HA LINK + ip_address: 10.10.10.0/31 + flow_tracker: null +loopback_interfaces: +- name: Loopback0 + description: Router_ID + shutdown: false + ip_address: 192.168.42.6/32 +prefix_lists: +- name: PL-LOOPBACKS-EVPN-OVERLAY + sequence_numbers: + - sequence: 10 + action: permit 192.168.42.0/24 eq 32 +route_maps: +- name: RM-CONN-2-BGP + sequence_numbers: + - sequence: 10 + type: permit + match: + - ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY + set: + - extcommunity soo 192.168.42.6:404 additive +- name: RM-BGP-UNDERLAY-PEERS-IN + sequence_numbers: + - sequence: 40 + type: permit + description: Mark prefixes originated from the LAN + set: + - extcommunity soo 192.168.42.6:404 additive +- name: RM-BGP-UNDERLAY-PEERS-OUT + sequence_numbers: + - sequence: 10 + type: permit + description: Make routes learned from WAN HA peer less preferred on LAN routers + match: + - tag 50 + - route-type internal + set: + - metric 50 + - sequence: 20 + type: permit +- name: RM-EVPN-SOO-IN + sequence_numbers: + - sequence: 10 + type: deny + match: + - extcommunity ECL-EVPN-SOO + - sequence: 20 + type: permit +- name: RM-EVPN-SOO-OUT + sequence_numbers: + - sequence: 10 + type: permit + set: + - extcommunity soo 192.168.42.6:404 additive +- name: RM-WAN-HA-PEER-IN + sequence_numbers: + - sequence: 10 + type: permit + description: Set tag 50 on routes received from HA peer over EVPN + set: + - tag 50 +- name: RM-WAN-HA-PEER-OUT + sequence_numbers: + - sequence: 10 + type: permit + description: Make EVPN routes learned from WAN less preferred on HA peer + match: + - route-type internal + set: + - local-preference 50 + - sequence: 20 + type: permit + description: Make locally injected routes less preferred on HA peer + set: + - local-preference 75 +- name: RM-EVPN-EXPORT-VRF-DEFAULT + sequence_numbers: + - sequence: 10 + type: permit + match: + - extcommunity ECL-EVPN-SOO +agents: +- name: KernelFib + environment_variables: + - name: KERNELFIB_PROGRAM_ALL_ECMP + value: '1' +ip_extcommunity_lists: +- name: ECL-EVPN-SOO + entries: + - type: permit + extcommunities: soo 192.168.42.6:404 +ip_security: + ike_policies: + - name: DP-IKE-POLICY + local_id: 192.168.142.6 + - name: CP-IKE-POLICY + local_id: 192.168.142.6 + sa_policies: + - name: DP-SA-POLICY + esp: + encryption: aes256gcm128 + pfs_dh_group: 14 + - name: CP-SA-POLICY + esp: + encryption: aes256gcm128 + pfs_dh_group: 14 + profiles: + - name: DP-PROFILE + ike_policy: DP-IKE-POLICY + sa_policy: DP-SA-POLICY + connection: start + shared_key: ABCDEF1234567890666 + dpd: + interval: 10 + time: 50 + action: clear + mode: transport + - name: CP-PROFILE + ike_policy: CP-IKE-POLICY + sa_policy: CP-SA-POLICY + connection: start + shared_key: ABCDEF1234567890 + dpd: + interval: 10 + time: 50 + action: clear + mode: transport + key_controller: + profile: DP-PROFILE +management_security: + ssl_profiles: + - name: profileA + certificate: + file: profileA.crt + key: profileA.key + trust_certificate: + certificates: + - aristaDeviceCertProvisionerDefaultRootCA.crt + tls_versions: '1.2' +router_adaptive_virtual_topology: + topology_role: edge + region: + name: AVD_Land_West + id: 42 + zone: + name: AVD_Land_West-ZONE + id: 1 + site: + name: Site404 + id: 404 + profiles: + - name: DEFAULT-AVT-POLICY-CONTROL-PLANE + load_balance_policy: LB-DEFAULT-AVT-POLICY-CONTROL-PLANE + - name: DEFAULT-AVT-POLICY-VIDEO + load_balance_policy: LB-DEFAULT-AVT-POLICY-VIDEO + - name: DEFAULT-AVT-POLICY-DEFAULT + load_balance_policy: LB-DEFAULT-AVT-POLICY-DEFAULT + - name: PROD-AVT-POLICY-VOICE + load_balance_policy: LB-PROD-AVT-POLICY-VOICE + - name: PROD-AVT-POLICY-VIDEO + load_balance_policy: LB-PROD-AVT-POLICY-VIDEO + - name: PROD-AVT-POLICY-DEFAULT + load_balance_policy: LB-PROD-AVT-POLICY-DEFAULT + vrfs: + - name: default + policy: DEFAULT-AVT-POLICY-WITH-CP + profiles: + - name: DEFAULT-AVT-POLICY-CONTROL-PLANE + id: 254 + - name: DEFAULT-AVT-POLICY-VIDEO + id: 3 + - name: DEFAULT-AVT-POLICY-DEFAULT + id: 1 + - name: PROD + policy: PROD-AVT-POLICY + profiles: + - name: PROD-AVT-POLICY-VOICE + id: 2 + - name: PROD-AVT-POLICY-VIDEO + id: 4 + - name: PROD-AVT-POLICY-DEFAULT + id: 1 + - name: IT + policy: DEFAULT-AVT-POLICY + profiles: + - name: DEFAULT-AVT-POLICY-VIDEO + id: 3 + - name: DEFAULT-AVT-POLICY-DEFAULT + id: 1 + policies: + - name: DEFAULT-AVT-POLICY-WITH-CP + matches: + - application_profile: APP-PROFILE-CONTROL-PLANE + avt_profile: DEFAULT-AVT-POLICY-CONTROL-PLANE + - application_profile: VIDEO + avt_profile: DEFAULT-AVT-POLICY-VIDEO + - application_profile: default + avt_profile: DEFAULT-AVT-POLICY-DEFAULT + - name: PROD-AVT-POLICY + matches: + - application_profile: VOICE + avt_profile: PROD-AVT-POLICY-VOICE + - application_profile: VIDEO + avt_profile: PROD-AVT-POLICY-VIDEO + - application_profile: default + avt_profile: PROD-AVT-POLICY-DEFAULT + - name: DEFAULT-AVT-POLICY + matches: + - application_profile: VIDEO + avt_profile: DEFAULT-AVT-POLICY-VIDEO + - application_profile: default + avt_profile: DEFAULT-AVT-POLICY-DEFAULT +router_bfd: + multihop: + interval: 300 + min_rx: 300 + multiplier: 3 +router_path_selection: + tcp_mss_ceiling: + ipv4_segment_size: auto + path_groups: + - name: INET + id: 101 + local_interfaces: + - name: Ethernet1 + stun: + server_profiles: + - INET-cv-pathfinder-pathfinder-Ethernet1 + - INET-cv-pathfinder-pathfinder-Ethernet3 + dynamic_peers: + enabled: true + static_peers: + - router_ip: 192.168.144.1 + name: cv-pathfinder-pathfinder + ipv4_addresses: + - 172.17.7.7 + - 10.9.9.9 + ipsec_profile: CP-PROFILE + - name: LAN_HA + id: 65535 + flow_assignment: lan + local_interfaces: + - name: Ethernet52 + static_peers: + - router_ip: 192.168.142.7 + name: cv-pathfinder-edge3B + ipv4_addresses: + - 10.10.10.1 + ipsec_profile: DP-PROFILE + load_balance_policies: + - name: LB-DEFAULT-AVT-POLICY-CONTROL-PLANE + path_groups: + - name: INET + - name: LAN_HA + - name: LB-DEFAULT-AVT-POLICY-VIDEO + path_groups: + - name: INET + - name: LAN_HA + - name: LB-DEFAULT-AVT-POLICY-DEFAULT + path_groups: + - name: INET + - name: LAN_HA + - name: LB-PROD-AVT-POLICY-VOICE + path_groups: + - name: INET + priority: 2 + - name: LAN_HA + jitter: 42 + lowest_hop_count: true + - name: LB-PROD-AVT-POLICY-VIDEO + path_groups: + - name: INET + priority: 2 + - name: LAN_HA + loss_rate: '42.0' + - name: LB-PROD-AVT-POLICY-DEFAULT + path_groups: + - name: INET + - name: LAN_HA +router_traffic_engineering: + enabled: true +stun: + client: + server_profiles: + - name: INET-cv-pathfinder-pathfinder-Ethernet1 + ip_address: 172.17.7.7 + ssl_profile: profileA + - name: INET-cv-pathfinder-pathfinder-Ethernet3 + ip_address: 10.9.9.9 + ssl_profile: profileA +application_traffic_recognition: + application_profiles: + - name: VIDEO + categories: + - name: VIDEO1 + applications: + - name: CUSTOM-APPLICATION-1 + - name: skype + - name: VOICE + applications: + - name: CUSTOM-VOICE-APPLICATION + - name: APP-PROFILE-CONTROL-PLANE + applications: + - name: APP-CONTROL-PLANE + categories: + - name: VIDEO1 + applications: + - name: CUSTOM-APPLICATION-2 + - name: microsoft-teams + applications: + ipv4_applications: + - name: CUSTOM-APPLICATION-1 + protocols: + - tcp + src_prefix_set_name: CUSTOM-SRC-PREFIX-1 + dest_prefix_set_name: CUSTOM-DEST-PREFIX-1 + - name: CUSTOM-APPLICATION-2 + protocols: + - tcp + tcp_src_port_set_name: TCP-SRC-2 + tcp_dest_port_set_name: TCP-DEST-2 + - name: APP-CONTROL-PLANE + dest_prefix_set_name: PFX-PATHFINDERS + field_sets: + l4_ports: + - name: TCP-SRC-2 + port_values: + - '42' + - name: TCP-DEST-2 + port_values: + - '666' + - '777' + ipv4_prefixes: + - name: CUSTOM-SRC-PREFIX-1 + prefix_values: + - 42.42.42.0/24 + - name: CUSTOM-DEST-PREFIX-1 + prefix_values: + - 6.6.6.0/24 + - name: PFX-PATHFINDERS + prefix_values: + - 192.168.144.1/32 +dps_interfaces: +- name: Dps1 + description: DPS Interface + mtu: 9214 + ip_address: 192.168.142.6/32 + flow_tracker: + hardware: FLOW-TRACKER +vxlan_interface: + Vxlan1: + description: cv-pathfinder-edge3A_VTEP + vxlan: + udp_port: 4789 + source_interface: Dps1 + vrfs: + - name: default + vni: 1 + - name: IT + vni: 100 + - name: PROD + vni: 42 +flow_tracking: + hardware: + trackers: + - name: FLOW-TRACKER + record_export: + on_inactive_timeout: 70000 + on_interval: 300000 + exporters: + - name: CV-TELEMETRY + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 3600000 + shutdown: false +metadata: + cv_tags: + device_tags: + - name: Role + value: edge + - name: Region + value: AVD_Land_West + - name: Zone + value: AVD_Land_West-ZONE + - name: Site + value: Site404 + interface_tags: + - interface: Ethernet1 + tags: + - name: Type + value: wan + - name: Carrier + value: ATT + - name: Circuit + value: 404-01 + - interface: Ethernet52 + tags: + - name: Type + value: lan + cv_pathfinder: + role: edge + ssl_profile: profileA + vtep_ip: 192.168.142.6 + region: AVD_Land_West + zone: AVD_Land_West-ZONE + site: Site404 + interfaces: + - name: Ethernet1 + carrier: ATT + circuit_id: 404-01 + pathgroup: INET + pathfinders: + - vtep_ip: 192.168.144.1 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-edge3B.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-edge3B.yml new file mode 100644 index 00000000000..ce94d122747 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-edge3B.yml @@ -0,0 +1,582 @@ +hostname: cv-pathfinder-edge3B +is_deployed: true +router_bgp: + as: '65000' + router_id: 192.168.42.7 + bgp: + default: + ipv4_unicast: false + maximum_paths: + paths: 16 + updates: + wait_install: true + peer_groups: + - name: IPv4-UNDERLAY-PEERS + type: ipv4 + maximum_routes: 12000 + send_community: all + route_map_in: RM-BGP-UNDERLAY-PEERS-IN + route_map_out: RM-BGP-UNDERLAY-PEERS-OUT + - name: WAN-OVERLAY-PEERS + type: wan + update_source: Dps1 + bfd: true + password: htm4AZe9mIQOO1uiMuGgYQ== + send_community: all + maximum_routes: 0 + remote_as: '65000' + ttl_maximum_hops: 1 + bfd_timers: + interval: 1000 + min_rx: 1000 + multiplier: 10 + address_family_ipv4: + peer_groups: + - name: IPv4-UNDERLAY-PEERS + activate: true + - name: WAN-OVERLAY-PEERS + activate: false + redistribute_routes: + - source_protocol: connected + route_map: RM-CONN-2-BGP + address_family_evpn: + peer_groups: + - name: WAN-OVERLAY-PEERS + activate: true + route_map_in: RM-EVPN-SOO-IN + route_map_out: RM-EVPN-SOO-OUT + neighbor_default: + next_hop_self_received_evpn_routes: + enable: true + neighbors: + - ip_address: 192.168.142.6 + activate: true + address_family_ipv4_sr_te: + peer_groups: + - name: WAN-OVERLAY-PEERS + activate: true + address_family_link_state: + peer_groups: + - name: WAN-OVERLAY-PEERS + activate: true + path_selection: + roles: + producer: true + address_family_path_selection: + peer_groups: + - name: WAN-OVERLAY-PEERS + activate: true + bgp: + additional_paths: + receive: true + send: + any: true + neighbors: + - ip_address: 192.168.144.1 + peer_group: WAN-OVERLAY-PEERS + peer: cv-pathfinder-pathfinder + description: cv-pathfinder-pathfinder + - ip_address: 192.168.142.6 + peer: cv-pathfinder-edge3A + description: cv-pathfinder-edge3A + remote_as: '65000' + update_source: Dps1 + route_reflector_client: true + send_community: all + route_map_in: RM-WAN-HA-PEER-IN + route_map_out: RM-WAN-HA-PEER-OUT + vrfs: + - name: default + rd: 192.168.42.7:1 + route_targets: + import: + - address_family: evpn + route_targets: + - '1:1' + export: + - address_family: evpn + route_targets: + - '1:1' + - route-map RM-EVPN-EXPORT-VRF-DEFAULT + - name: IT + router_id: 192.168.42.7 + rd: 192.168.42.7:1000 + route_targets: + import: + - address_family: evpn + route_targets: + - 1000:1000 + export: + - address_family: evpn + route_targets: + - 1000:1000 + redistribute_routes: + - source_protocol: connected + - name: PROD + router_id: 192.168.42.7 + rd: 192.168.42.7:142 + route_targets: + import: + - address_family: evpn + route_targets: + - 142:142 + export: + - address_family: evpn + route_targets: + - 142:142 + redistribute_routes: + - source_protocol: connected +service_routing_protocols_model: multi-agent +ip_routing: true +transceiver_qsfp_default_mode_4x10: false +spanning_tree: + mode: none +vrfs: +- name: MGMT + ip_routing: false +- name: IT + tenant: TenantA + ip_routing: true +- name: PROD + tenant: TenantA + ip_routing: true +management_api_http: + enable_vrfs: + - name: MGMT + enable_https: true +ethernet_interfaces: +- name: Ethernet2 + peer_type: l3_interface + ip_address: 172.15.6.6/31 + shutdown: false + type: routed + description: Colt_10423 +- name: Ethernet52 + type: routed + peer_type: l3_interface + peer: cv-pathfinder-edge3A + shutdown: false + description: DIRECT LAN HA LINK + ip_address: 10.10.10.1/31 + flow_tracker: null +loopback_interfaces: +- name: Loopback0 + description: Router_ID + shutdown: false + ip_address: 192.168.42.7/32 +prefix_lists: +- name: PL-LOOPBACKS-EVPN-OVERLAY + sequence_numbers: + - sequence: 10 + action: permit 192.168.42.0/24 eq 32 +route_maps: +- name: RM-CONN-2-BGP + sequence_numbers: + - sequence: 10 + type: permit + match: + - ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY + set: + - extcommunity soo 192.168.42.6:404 additive +- name: RM-BGP-UNDERLAY-PEERS-IN + sequence_numbers: + - sequence: 40 + type: permit + description: Mark prefixes originated from the LAN + set: + - extcommunity soo 192.168.42.6:404 additive +- name: RM-BGP-UNDERLAY-PEERS-OUT + sequence_numbers: + - sequence: 10 + type: permit + description: Make routes learned from WAN HA peer less preferred on LAN routers + match: + - tag 50 + - route-type internal + set: + - metric 50 + - sequence: 20 + type: permit +- name: RM-EVPN-SOO-IN + sequence_numbers: + - sequence: 10 + type: deny + match: + - extcommunity ECL-EVPN-SOO + - sequence: 20 + type: permit +- name: RM-EVPN-SOO-OUT + sequence_numbers: + - sequence: 10 + type: permit + set: + - extcommunity soo 192.168.42.6:404 additive +- name: RM-WAN-HA-PEER-IN + sequence_numbers: + - sequence: 10 + type: permit + description: Set tag 50 on routes received from HA peer over EVPN + set: + - tag 50 +- name: RM-WAN-HA-PEER-OUT + sequence_numbers: + - sequence: 10 + type: permit + description: Make EVPN routes learned from WAN less preferred on HA peer + match: + - route-type internal + set: + - local-preference 50 + - sequence: 20 + type: permit + description: Make locally injected routes less preferred on HA peer + set: + - local-preference 75 +- name: RM-EVPN-EXPORT-VRF-DEFAULT + sequence_numbers: + - sequence: 10 + type: permit + match: + - extcommunity ECL-EVPN-SOO +agents: +- name: KernelFib + environment_variables: + - name: KERNELFIB_PROGRAM_ALL_ECMP + value: '1' +ip_extcommunity_lists: +- name: ECL-EVPN-SOO + entries: + - type: permit + extcommunities: soo 192.168.42.6:404 +ip_security: + ike_policies: + - name: DP-IKE-POLICY + local_id: 192.168.142.7 + - name: CP-IKE-POLICY + local_id: 192.168.142.7 + sa_policies: + - name: DP-SA-POLICY + esp: + encryption: aes256gcm128 + pfs_dh_group: 14 + - name: CP-SA-POLICY + esp: + encryption: aes256gcm128 + pfs_dh_group: 14 + profiles: + - name: DP-PROFILE + ike_policy: DP-IKE-POLICY + sa_policy: DP-SA-POLICY + connection: start + shared_key: ABCDEF1234567890666 + dpd: + interval: 10 + time: 50 + action: clear + mode: transport + - name: CP-PROFILE + ike_policy: CP-IKE-POLICY + sa_policy: CP-SA-POLICY + connection: start + shared_key: ABCDEF1234567890 + dpd: + interval: 10 + time: 50 + action: clear + mode: transport + key_controller: + profile: DP-PROFILE +management_security: + ssl_profiles: + - name: profileA + certificate: + file: profileA.crt + key: profileA.key + trust_certificate: + certificates: + - aristaDeviceCertProvisionerDefaultRootCA.crt + tls_versions: '1.2' +router_adaptive_virtual_topology: + topology_role: edge + region: + name: AVD_Land_West + id: 42 + zone: + name: AVD_Land_West-ZONE + id: 1 + site: + name: Site404 + id: 404 + profiles: + - name: DEFAULT-AVT-POLICY-CONTROL-PLANE + load_balance_policy: LB-DEFAULT-AVT-POLICY-CONTROL-PLANE + - name: DEFAULT-AVT-POLICY-VIDEO + load_balance_policy: LB-DEFAULT-AVT-POLICY-VIDEO + - name: DEFAULT-AVT-POLICY-DEFAULT + load_balance_policy: LB-DEFAULT-AVT-POLICY-DEFAULT + - name: PROD-AVT-POLICY-VOICE + load_balance_policy: LB-PROD-AVT-POLICY-VOICE + - name: PROD-AVT-POLICY-VIDEO + load_balance_policy: LB-PROD-AVT-POLICY-VIDEO + - name: PROD-AVT-POLICY-MPLS-ONLY + load_balance_policy: LB-PROD-AVT-POLICY-MPLS-ONLY + - name: PROD-AVT-POLICY-DEFAULT + load_balance_policy: LB-PROD-AVT-POLICY-DEFAULT + vrfs: + - name: default + policy: DEFAULT-AVT-POLICY-WITH-CP + profiles: + - name: DEFAULT-AVT-POLICY-CONTROL-PLANE + id: 254 + - name: DEFAULT-AVT-POLICY-VIDEO + id: 3 + - name: DEFAULT-AVT-POLICY-DEFAULT + id: 1 + - name: PROD + policy: PROD-AVT-POLICY + profiles: + - name: PROD-AVT-POLICY-VOICE + id: 2 + - name: PROD-AVT-POLICY-VIDEO + id: 4 + - name: PROD-AVT-POLICY-MPLS-ONLY + id: 5 + - name: PROD-AVT-POLICY-DEFAULT + id: 1 + - name: IT + policy: DEFAULT-AVT-POLICY + profiles: + - name: DEFAULT-AVT-POLICY-VIDEO + id: 3 + - name: DEFAULT-AVT-POLICY-DEFAULT + id: 1 + policies: + - name: DEFAULT-AVT-POLICY-WITH-CP + matches: + - application_profile: APP-PROFILE-CONTROL-PLANE + avt_profile: DEFAULT-AVT-POLICY-CONTROL-PLANE + - application_profile: VIDEO + avt_profile: DEFAULT-AVT-POLICY-VIDEO + - application_profile: default + avt_profile: DEFAULT-AVT-POLICY-DEFAULT + - name: PROD-AVT-POLICY + matches: + - application_profile: VOICE + avt_profile: PROD-AVT-POLICY-VOICE + - application_profile: VIDEO + avt_profile: PROD-AVT-POLICY-VIDEO + - application_profile: MPLS-ONLY + avt_profile: PROD-AVT-POLICY-MPLS-ONLY + - application_profile: default + avt_profile: PROD-AVT-POLICY-DEFAULT + - name: DEFAULT-AVT-POLICY + matches: + - application_profile: VIDEO + avt_profile: DEFAULT-AVT-POLICY-VIDEO + - application_profile: default + avt_profile: DEFAULT-AVT-POLICY-DEFAULT +router_bfd: + multihop: + interval: 300 + min_rx: 300 + multiplier: 3 +router_path_selection: + tcp_mss_ceiling: + ipv4_segment_size: auto + path_groups: + - name: MPLS + id: 100 + local_interfaces: + - name: Ethernet2 + stun: + server_profiles: + - MPLS-cv-pathfinder-pathfinder-Ethernet2_2 + dynamic_peers: + enabled: true + ipsec: false + static_peers: + - router_ip: 192.168.144.1 + name: cv-pathfinder-pathfinder + ipv4_addresses: + - 172.16.0.1 + keepalive: + interval: 300 + failure_threshold: 5 + - name: LAN_HA + id: 65535 + flow_assignment: lan + local_interfaces: + - name: Ethernet52 + static_peers: + - router_ip: 192.168.142.6 + name: cv-pathfinder-edge3A + ipv4_addresses: + - 10.10.10.0 + ipsec_profile: DP-PROFILE + load_balance_policies: + - name: LB-DEFAULT-AVT-POLICY-CONTROL-PLANE + path_groups: + - name: MPLS + - name: LAN_HA + - name: LB-DEFAULT-AVT-POLICY-VIDEO + path_groups: + - name: MPLS + - name: LAN_HA + - name: LB-DEFAULT-AVT-POLICY-DEFAULT + path_groups: + - name: MPLS + priority: 4223 + - name: LAN_HA + - name: LB-PROD-AVT-POLICY-VOICE + path_groups: + - name: MPLS + - name: LAN_HA + jitter: 42 + lowest_hop_count: true + - name: LB-PROD-AVT-POLICY-VIDEO + path_groups: + - name: MPLS + - name: LAN_HA + loss_rate: '42.0' + - name: LB-PROD-AVT-POLICY-MPLS-ONLY + path_groups: + - name: MPLS + - name: LAN_HA + - name: LB-PROD-AVT-POLICY-DEFAULT + path_groups: + - name: MPLS + priority: 2 + - name: LAN_HA +router_traffic_engineering: + enabled: true +stun: + client: + server_profiles: + - name: MPLS-cv-pathfinder-pathfinder-Ethernet2_2 + ip_address: 172.16.0.1 + ssl_profile: profileA +application_traffic_recognition: + application_profiles: + - name: VIDEO + categories: + - name: VIDEO1 + applications: + - name: CUSTOM-APPLICATION-1 + - name: skype + - name: VOICE + applications: + - name: CUSTOM-VOICE-APPLICATION + - name: MPLS-ONLY + - name: APP-PROFILE-CONTROL-PLANE + applications: + - name: APP-CONTROL-PLANE + categories: + - name: VIDEO1 + applications: + - name: CUSTOM-APPLICATION-2 + - name: microsoft-teams + applications: + ipv4_applications: + - name: CUSTOM-APPLICATION-1 + protocols: + - tcp + src_prefix_set_name: CUSTOM-SRC-PREFIX-1 + dest_prefix_set_name: CUSTOM-DEST-PREFIX-1 + - name: CUSTOM-APPLICATION-2 + protocols: + - tcp + tcp_src_port_set_name: TCP-SRC-2 + tcp_dest_port_set_name: TCP-DEST-2 + - name: APP-CONTROL-PLANE + dest_prefix_set_name: PFX-PATHFINDERS + field_sets: + l4_ports: + - name: TCP-SRC-2 + port_values: + - '42' + - name: TCP-DEST-2 + port_values: + - '666' + - '777' + ipv4_prefixes: + - name: CUSTOM-SRC-PREFIX-1 + prefix_values: + - 42.42.42.0/24 + - name: CUSTOM-DEST-PREFIX-1 + prefix_values: + - 6.6.6.0/24 + - name: PFX-PATHFINDERS + prefix_values: + - 192.168.144.1/32 +dps_interfaces: +- name: Dps1 + description: DPS Interface + mtu: 9214 + ip_address: 192.168.142.7/32 + flow_tracker: + hardware: FLOW-TRACKER +vxlan_interface: + Vxlan1: + description: cv-pathfinder-edge3B_VTEP + vxlan: + udp_port: 4789 + source_interface: Dps1 + vrfs: + - name: default + vni: 1 + - name: IT + vni: 100 + - name: PROD + vni: 42 +flow_tracking: + hardware: + trackers: + - name: FLOW-TRACKER + record_export: + on_inactive_timeout: 70000 + on_interval: 300000 + exporters: + - name: CV-TELEMETRY + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 3600000 + shutdown: false +metadata: + cv_tags: + device_tags: + - name: Role + value: edge + - name: Region + value: AVD_Land_West + - name: Zone + value: AVD_Land_West-ZONE + - name: Site + value: Site404 + interface_tags: + - interface: Ethernet2 + tags: + - name: Type + value: wan + - name: Carrier + value: Colt + - name: Circuit + value: '10423' + - interface: Ethernet52 + tags: + - name: Type + value: lan + cv_pathfinder: + role: edge + ssl_profile: profileA + vtep_ip: 192.168.142.7 + region: AVD_Land_West + zone: AVD_Land_West-ZONE + site: Site404 + interfaces: + - name: Ethernet2 + carrier: Colt + circuit_id: '10423' + pathgroup: MPLS + pathfinders: + - vtep_ip: 192.168.144.1 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-pathfinder.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-pathfinder.yml index 2d274b7dbce..493df9cf002 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-pathfinder.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-pathfinder.yml @@ -16,7 +16,6 @@ router_bgp: maximum_routes: 12000 send_community: all route_map_in: RM-BGP-UNDERLAY-PEERS-IN - route_map_out: RM-BGP-UNDERLAY-PEERS-OUT - name: WAN-OVERLAY-PEERS type: wan update_source: Dps1 @@ -112,7 +111,7 @@ ethernet_interfaces: shutdown: false type: routed description: Bouygues_Telecom_777 -- name: Ethernet2 +- name: Ethernet2/2 peer_type: l3_interface ip_address: 172.16.0.1/31 shutdown: false @@ -157,20 +156,6 @@ agents: environment_variables: - name: KERNELFIB_PROGRAM_ALL_ECMP value: '1' -flow_tracking: - hardware: - trackers: - - name: FLOW-TRACKER - record_export: - on_inactive_timeout: 70000 - on_interval: 300000 - exporters: - - name: CV-TELEMETRY - collector: - host: 127.0.0.1 - local_interface: Loopback0 - template_interval: 3600000 - shutdown: false ip_extcommunity_lists: - name: ECL-EVPN-SOO entries: @@ -316,7 +301,7 @@ router_path_selection: - name: MPLS id: 100 local_interfaces: - - name: Ethernet2 + - name: Ethernet2/2 keepalive: interval: 300 failure_threshold: 5 @@ -417,7 +402,7 @@ stun: server: local_interfaces: - Ethernet1 - - Ethernet2 + - Ethernet2/2 - Ethernet3 ssl_profile: profileA application_traffic_recognition: @@ -497,6 +482,20 @@ vxlan_interface: vni: 66 - name: ATTRACTED-VRF-FROM-UPLINK vni: 166 +flow_tracking: + hardware: + trackers: + - name: FLOW-TRACKER + record_export: + on_inactive_timeout: 70000 + on_interval: 300000 + exporters: + - name: CV-TELEMETRY + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 3600000 + shutdown: false metadata: cv_tags: device_tags: @@ -513,7 +512,7 @@ metadata: value: Bouygues_Telecom - name: Circuit value: '777' - - interface: Ethernet2 + - interface: Ethernet2/2 tags: - name: Type value: wan @@ -533,13 +532,15 @@ metadata: role: pathfinder ssl_profile: profileA vtep_ip: 192.168.144.1 + site: Global-pathfinder-site + address: Somewhere under the rainbow interfaces: - name: Ethernet1 carrier: Bouygues_Telecom circuit_id: '777' pathgroup: INET public_ip: 172.17.7.7 - - name: Ethernet2 + - name: Ethernet2/2 carrier: Colt circuit_id: '10000' pathgroup: MPLS @@ -579,6 +580,10 @@ metadata: - name: AVD_Land_West-ZONE id: 1 sites: + - name: Site404 + id: 404 + location: + address: Not Found - name: Site422 id: 422 location: @@ -595,6 +600,8 @@ metadata: sites: - name: Site511 id: 511 + location: + address: Miami vrfs: - name: default vni: 1 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-pathfinder1.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-pathfinder1.yml index 56e98162549..8416f2bd6d5 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-pathfinder1.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-pathfinder1.yml @@ -16,7 +16,6 @@ router_bgp: maximum_routes: 12000 send_community: all route_map_in: RM-BGP-UNDERLAY-PEERS-IN - route_map_out: RM-BGP-UNDERLAY-PEERS-OUT - name: WAN-OVERLAY-PEERS type: wan update_source: Dps1 @@ -43,6 +42,7 @@ router_bgp: interval: 2020 min_rx: 2000 multiplier: 3 + route_reflector_client: true address_family_ipv4: peer_groups: - name: IPv4-UNDERLAY-PEERS @@ -173,20 +173,6 @@ agents: environment_variables: - name: KERNELFIB_PROGRAM_ALL_ECMP value: '1' -flow_tracking: - hardware: - trackers: - - name: FLOW-TRACKER - record_export: - on_inactive_timeout: 70000 - on_interval: 300000 - exporters: - - name: CV-TELEMETRY - collector: - host: 127.0.0.1 - local_interface: Loopback0 - template_interval: 3600000 - shutdown: false ip_extcommunity_lists: - name: ECL-EVPN-SOO entries: @@ -514,11 +500,27 @@ vxlan_interface: vni: 66 - name: ATTRACTED-VRF-FROM-UPLINK vni: 166 +flow_tracking: + hardware: + trackers: + - name: FLOW-TRACKER + record_export: + on_inactive_timeout: 70000 + on_interval: 300000 + exporters: + - name: CV-TELEMETRY + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 3600000 + shutdown: false metadata: cv_tags: device_tags: - name: Role value: pathfinder + - name: Region + value: AVD_Land_West - name: PathfinderSet value: PATHFINDERS interface_tags: @@ -534,6 +536,9 @@ metadata: role: pathfinder ssl_profile: profileB vtep_ip: 192.168.144.2 + region: AVD_Land_West + site: Site423 + address: Somewhere-warm interfaces: - name: Ethernet1 carrier: Orange @@ -570,6 +575,10 @@ metadata: - name: AVD_Land_West-ZONE id: 1 sites: + - name: Site404 + id: 404 + location: + address: Not Found - name: Site422 id: 422 location: @@ -586,6 +595,8 @@ metadata: sites: - name: Site511 id: 511 + location: + address: Miami vrfs: - name: default vni: 1 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-pathfinder2.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-pathfinder2.yml index f47e1f488d9..8c7c14e5fb4 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-pathfinder2.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-pathfinder2.yml @@ -16,7 +16,6 @@ router_bgp: maximum_routes: 12000 send_community: all route_map_in: RM-BGP-UNDERLAY-PEERS-IN - route_map_out: RM-BGP-UNDERLAY-PEERS-OUT - name: WAN-OVERLAY-PEERS type: wan update_source: Dps1 @@ -43,6 +42,7 @@ router_bgp: interval: 2020 min_rx: 2000 multiplier: 3 + route_reflector_client: true address_family_ipv4: peer_groups: - name: IPv4-UNDERLAY-PEERS @@ -179,20 +179,6 @@ agents: environment_variables: - name: KERNELFIB_PROGRAM_ALL_ECMP value: '1' -flow_tracking: - hardware: - trackers: - - name: FLOW-TRACKER - record_export: - on_inactive_timeout: 70000 - on_interval: 300000 - exporters: - - name: CV-TELEMETRY - collector: - host: 127.0.0.1 - local_interface: Loopback0 - template_interval: 3600000 - shutdown: false ip_extcommunity_lists: - name: ECL-EVPN-SOO entries: @@ -531,6 +517,20 @@ vxlan_interface: vni: 66 - name: ATTRACTED-VRF-FROM-UPLINK vni: 166 +flow_tracking: + hardware: + trackers: + - name: FLOW-TRACKER + record_export: + on_inactive_timeout: 70000 + on_interval: 300000 + exporters: + - name: CV-TELEMETRY + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 3600000 + shutdown: false metadata: cv_tags: device_tags: @@ -603,6 +603,10 @@ metadata: - name: AVD_Land_West-ZONE id: 1 sites: + - name: Site404 + id: 404 + location: + address: Not Found - name: Site422 id: 422 location: @@ -619,6 +623,8 @@ metadata: sites: - name: Site511 id: 511 + location: + address: Miami vrfs: - name: default vni: 1 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-transit1A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-transit1A.yml index f9c5817111c..183b5319f01 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-transit1A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-transit1A.yml @@ -52,6 +52,15 @@ router_bgp: peer_group: WAN-OVERLAY-PEERS peer: cv-pathfinder-pathfinder description: cv-pathfinder-pathfinder + - ip_address: 192.168.143.2 + peer: cv-pathfinder-transit1B + description: cv-pathfinder-transit1B + remote_as: '65000' + update_source: Dps1 + route_reflector_client: true + send_community: all + route_map_in: RM-WAN-HA-PEER-IN + route_map_out: RM-WAN-HA-PEER-OUT vrfs: - name: IT router_id: 192.168.43.1 @@ -146,6 +155,12 @@ router_bgp: activate: true route_map_in: RM-EVPN-SOO-IN route_map_out: RM-EVPN-SOO-OUT + neighbor_default: + next_hop_self_received_evpn_routes: + enable: true + neighbors: + - ip_address: 192.168.143.2 + activate: true address_family_ipv4_sr_te: peer_groups: - name: WAN-OVERLAY-PEERS @@ -251,6 +266,8 @@ ethernet_interfaces: type: l3dot1q description: Colt_10666 encapsulation_dot1q_vlan: 666 + ip_nat: + service_profile: NAT-IE-DIRECT - name: Ethernet1 type: routed peer_type: l3_interface @@ -309,36 +326,22 @@ route_maps: match: - ip address prefix-list PL-WAN-HA-PEER-PREFIXES - sequence: 20 - type: permit - description: Allow prefixes originated from the HA peer - match: - - extcommunity ECL-EVPN-SOO - set: - - as-path match all replacement auto auto - - sequence: 30 - type: permit - description: Use WAN routes from HA peer as backup + type: deny + description: Deny other routes from the HA peer match: - as-path ASPATH-WAN - set: - - community no-advertise - name: RM-BGP-UNDERLAY-PEERS-OUT sequence_numbers: - sequence: 10 type: permit - description: Advertise local routes towards LAN - match: - - extcommunity ECL-EVPN-SOO - - sequence: 20 - type: permit - description: Advertise routes received from WAN iBGP towards LAN + description: Make routes learned from WAN HA peer less preferred on LAN routers match: + - tag 50 - route-type internal - - sequence: 30 + set: + - metric 50 + - sequence: 20 type: permit - description: Advertise WAN HA prefixes towards LAN - match: - - ip address prefix-list PL-WAN-HA-PREFIXES - name: RM-EVPN-SOO-IN sequence_numbers: - sequence: 10 @@ -353,6 +356,27 @@ route_maps: type: permit set: - extcommunity soo 192.168.43.1:422 additive +- name: RM-WAN-HA-PEER-IN + sequence_numbers: + - sequence: 10 + type: permit + description: Set tag 50 on routes received from HA peer over EVPN + set: + - tag 50 +- name: RM-WAN-HA-PEER-OUT + sequence_numbers: + - sequence: 10 + type: permit + description: Make EVPN routes learned from WAN less preferred on HA peer + match: + - route-type internal + set: + - local-preference 50 + - sequence: 20 + type: permit + description: Make locally injected routes less preferred on HA peer + set: + - local-preference 75 - name: RM-EVPN-EXPORT-VRF-DEFAULT sequence_numbers: - sequence: 10 @@ -364,20 +388,6 @@ agents: environment_variables: - name: KERNELFIB_PROGRAM_ALL_ECMP value: '1' -flow_tracking: - hardware: - trackers: - - name: FLOW-TRACKER - record_export: - on_inactive_timeout: 70000 - on_interval: 300000 - exporters: - - name: CV-TELEMETRY - collector: - host: 127.0.0.1 - local_interface: Loopback0 - template_interval: 3600000 - shutdown: false ip_extcommunity_lists: - name: ECL-EVPN-SOO entries: @@ -456,6 +466,7 @@ router_adaptive_virtual_topology: load_balance_policy: LB-PROD-AVT-POLICY-DEFAULT - name: CUSTOM-VOICE-PROFILE-NAME load_balance_policy: LB-CUSTOM-VOICE-PROFILE-NAME + internet_exit_policy: DIRECT-EXIT-POLICY-2 - name: TRANSIT-AVT-POLICY-DEFAULT load_balance_policy: LB-TRANSIT-AVT-POLICY-DEFAULT - name: DEFAULT-POLICY-DEFAULT @@ -567,7 +578,7 @@ router_path_selection: - name: Ethernet2.42 stun: server_profiles: - - MPLS-cv-pathfinder-pathfinder-Ethernet2 + - MPLS-cv-pathfinder-pathfinder-Ethernet2_2 dynamic_peers: enabled: true ipsec: false @@ -659,7 +670,7 @@ stun: - name: INET-cv-pathfinder-pathfinder-Ethernet3 ip_address: 10.9.9.9 ssl_profile: profileA - - name: MPLS-cv-pathfinder-pathfinder-Ethernet2 + - name: MPLS-cv-pathfinder-pathfinder-Ethernet2_2 ip_address: 172.16.0.1 ssl_profile: profileA application_traffic_recognition: @@ -715,6 +726,44 @@ application_traffic_recognition: - name: PFX-PATHFINDERS prefix_values: - 192.168.144.1/32 +ip_access_lists: +- name: ACL-NAT-IE-DIRECT + entries: + - sequence: 10 + action: deny + protocol: ip + source: 172.16.6.6 + destination: any + - sequence: 20 + action: permit + protocol: ip + source: any + destination: any +ip_nat: + profiles: + - name: NAT-IE-DIRECT + source: + dynamic: + - access_list: ACL-NAT-IE-DIRECT + nat_type: overload +router_service_insertion: + enabled: true + connections: + - name: IE-Ethernet2.42 + monitor_connectivity_host: IE-Ethernet2.42 + ethernet_interface: + name: Ethernet2.42 + next_hop: 123.12.3.4 +router_internet_exit: + exit_groups: + - name: DIRECT-EXIT-POLICY-2 + local_connections: + - name: IE-Ethernet2.42 + policies: + - name: DIRECT-EXIT-POLICY-2 + exit_groups: + - name: DIRECT-EXIT-POLICY-2 + - name: system-default-exit-group dps_interfaces: - name: Dps1 description: DPS Interface @@ -739,7 +788,36 @@ vxlan_interface: vni: 66 - name: ATTRACTED-VRF-FROM-UPLINK vni: 166 +monitor_connectivity: + interface_sets: + - name: SET-Ethernet2.42 + interfaces: Ethernet2.42 + hosts: + - name: IE-Ethernet2.42 + description: Internet Exit DIRECT-EXIT-POLICY-2 + ip: 123.12.3.4 + local_interfaces: SET-Ethernet2.42 + address_only: false + shutdown: false metadata: + cv_pathfinder: + internet_exit_policies: [] + role: transit region + ssl_profile: profileA + vtep_ip: 192.168.143.1 + region: AVD_Land_West + zone: AVD_Land_West-ZONE + site: Site422 + interfaces: + - name: Ethernet1.42 + carrier: Comcast + pathgroup: INET + - name: Ethernet2.42 + carrier: Colt + circuit_id: '10666' + pathgroup: MPLS + pathfinders: + - vtep_ip: 192.168.144.1 cv_tags: device_tags: - name: Role @@ -789,20 +867,17 @@ metadata: tags: - name: Type value: lan - cv_pathfinder: - role: transit region - ssl_profile: profileA - vtep_ip: 192.168.143.1 - region: AVD_Land_West - zone: AVD_Land_West-ZONE - site: Site422 - interfaces: - - name: Ethernet1.42 - carrier: Comcast - pathgroup: INET - - name: Ethernet2.42 - carrier: Colt - circuit_id: '10666' - pathgroup: MPLS - pathfinders: - - vtep_ip: 192.168.144.1 +flow_tracking: + hardware: + trackers: + - name: FLOW-TRACKER + record_export: + on_inactive_timeout: 70000 + on_interval: 300000 + exporters: + - name: CV-TELEMETRY + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 3600000 + shutdown: false diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-transit1B.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-transit1B.yml index 67dea97f00e..0c25f6366d5 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-transit1B.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/cv-pathfinder-transit1B.yml @@ -52,6 +52,15 @@ router_bgp: peer_group: WAN-OVERLAY-PEERS peer: cv-pathfinder-pathfinder description: cv-pathfinder-pathfinder + - ip_address: 192.168.143.1 + peer: cv-pathfinder-transit1A + description: cv-pathfinder-transit1A + remote_as: '65000' + update_source: Dps1 + route_reflector_client: true + send_community: all + route_map_in: RM-WAN-HA-PEER-IN + route_map_out: RM-WAN-HA-PEER-OUT vrfs: - name: IT router_id: 192.168.43.2 @@ -146,6 +155,12 @@ router_bgp: activate: true route_map_in: RM-EVPN-SOO-IN route_map_out: RM-EVPN-SOO-OUT + neighbor_default: + next_hop_self_received_evpn_routes: + enable: true + neighbors: + - ip_address: 192.168.143.1 + activate: true address_family_ipv4_sr_te: peer_groups: - name: WAN-OVERLAY-PEERS @@ -309,36 +324,22 @@ route_maps: match: - ip address prefix-list PL-WAN-HA-PEER-PREFIXES - sequence: 20 - type: permit - description: Allow prefixes originated from the HA peer - match: - - extcommunity ECL-EVPN-SOO - set: - - as-path match all replacement auto auto - - sequence: 30 - type: permit - description: Use WAN routes from HA peer as backup + type: deny + description: Deny other routes from the HA peer match: - as-path ASPATH-WAN - set: - - community no-advertise - name: RM-BGP-UNDERLAY-PEERS-OUT sequence_numbers: - sequence: 10 type: permit - description: Advertise local routes towards LAN - match: - - extcommunity ECL-EVPN-SOO - - sequence: 20 - type: permit - description: Advertise routes received from WAN iBGP towards LAN + description: Make routes learned from WAN HA peer less preferred on LAN routers match: + - tag 50 - route-type internal - - sequence: 30 + set: + - metric 50 + - sequence: 20 type: permit - description: Advertise WAN HA prefixes towards LAN - match: - - ip address prefix-list PL-WAN-HA-PREFIXES - name: RM-EVPN-SOO-IN sequence_numbers: - sequence: 10 @@ -353,6 +354,27 @@ route_maps: type: permit set: - extcommunity soo 192.168.43.1:422 additive +- name: RM-WAN-HA-PEER-IN + sequence_numbers: + - sequence: 10 + type: permit + description: Set tag 50 on routes received from HA peer over EVPN + set: + - tag 50 +- name: RM-WAN-HA-PEER-OUT + sequence_numbers: + - sequence: 10 + type: permit + description: Make EVPN routes learned from WAN less preferred on HA peer + match: + - route-type internal + set: + - local-preference 50 + - sequence: 20 + type: permit + description: Make locally injected routes less preferred on HA peer + set: + - local-preference 75 - name: RM-EVPN-EXPORT-VRF-DEFAULT sequence_numbers: - sequence: 10 @@ -364,20 +386,6 @@ agents: environment_variables: - name: KERNELFIB_PROGRAM_ALL_ECMP value: '1' -flow_tracking: - hardware: - trackers: - - name: FLOW-TRACKER - record_export: - on_inactive_timeout: 70000 - on_interval: 300000 - exporters: - - name: CV-TELEMETRY - collector: - host: 127.0.0.1 - local_interface: Loopback0 - template_interval: 3600000 - shutdown: false ip_extcommunity_lists: - name: ECL-EVPN-SOO entries: @@ -567,7 +575,7 @@ router_path_selection: - name: Ethernet2.42 stun: server_profiles: - - MPLS-cv-pathfinder-pathfinder-Ethernet2 + - MPLS-cv-pathfinder-pathfinder-Ethernet2_2 dynamic_peers: enabled: true ipsec: false @@ -659,7 +667,7 @@ stun: - name: INET-cv-pathfinder-pathfinder-Ethernet3 ip_address: 10.9.9.9 ssl_profile: profileA - - name: MPLS-cv-pathfinder-pathfinder-Ethernet2 + - name: MPLS-cv-pathfinder-pathfinder-Ethernet2_2 ip_address: 172.16.0.1 ssl_profile: profileA application_traffic_recognition: @@ -739,6 +747,20 @@ vxlan_interface: vni: 66 - name: ATTRACTED-VRF-FROM-UPLINK vni: 166 +flow_tracking: + hardware: + trackers: + - name: FLOW-TRACKER + record_export: + on_inactive_timeout: 70000 + on_interval: 300000 + exporters: + - name: CV-TELEMETRY + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 3600000 + shutdown: false metadata: cv_tags: device_tags: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/evpn_services_l2_only_false.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/evpn_services_l2_only_false.yml index d902106ea85..8306cec2ab9 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/evpn_services_l2_only_false.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/evpn_services_l2_only_false.yml @@ -355,6 +355,10 @@ ip_name_servers: vrf: MGMT - ip_address: 8.8.8.8 vrf: MGMT +- ip_address: 2001:db8::1 + vrf: MGMT +- ip_address: 2001:db8::2 + vrf: MGMT local_users: - name: admin disabled: true @@ -429,6 +433,8 @@ ntp: - name: 192.168.200.5 vrf: MGMT preferred: true + - name: 2001:db8::3 + vrf: MGMT snmp_server: contact: example@example.com location: EOS_DESIGNS_UNIT_TESTS evpn_services_l2_only_false @@ -562,6 +568,21 @@ vlans: - id: 413 name: Tenant_D_v6_OP_Zone_3 tenant: Tenant_D +ip_access_lists: +- name: TEST-IPV4-ACL-WITH-IP-FIELDS-IN_Vlan110 + entries: + - sequence: 15 + action: deny + protocol: ip + source: any + destination: 10.1.10.1 +- name: TEST-IPV4-ACL-WITH-IP-FIELDS-OUT_Vlan110 + entries: + - remark: Some remark will not require source and destination fields. + - action: permit + protocol: ip + source: 10.1.10.1 + destination: any ip_igmp_snooping: globally_enabled: true vlans: @@ -616,6 +637,8 @@ vlan_interfaces: - opzone description: Tenant_A_OP_Zone_1 shutdown: false + access_group_in: TEST-IPV4-ACL-WITH-IP-FIELDS-IN_Vlan110 + access_group_out: TEST-IPV4-ACL-WITH-IP-FIELDS-OUT_Vlan110 ip_address_virtual: 10.1.10.1/24 vrf: Tenant_A_OP_Zone - name: Vlan111 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/evpn_services_l2_only_true.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/evpn_services_l2_only_true.yml index a69b8025e57..915e4e2d624 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/evpn_services_l2_only_true.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/evpn_services_l2_only_true.yml @@ -194,6 +194,10 @@ ip_name_servers: vrf: MGMT - ip_address: 8.8.8.8 vrf: MGMT +- ip_address: 2001:db8::1 + vrf: MGMT +- ip_address: 2001:db8::2 + vrf: MGMT local_users: - name: admin disabled: true @@ -232,6 +236,8 @@ ntp: - name: 192.168.200.5 vrf: MGMT preferred: true + - name: 2001:db8::3 + vrf: MGMT snmp_server: contact: example@example.com location: EOS_DESIGNS_UNIT_TESTS evpn_services_l2_only_true diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/evpn_vlan_bundle.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/evpn_vlan_bundle.yml index 59fa3f8156b..c7f2aaef622 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/evpn_vlan_bundle.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/evpn_vlan_bundle.yml @@ -37,6 +37,20 @@ router_bgp: - name: EVPN-OVERLAY-PEERS activate: true vrfs: + - name: research1 + router_id: 10.10.0.3 + rd: 10.10.0.3:654556 + route_targets: + import: + - address_family: evpn + route_targets: + - 654556:654556 + export: + - address_family: evpn + route_targets: + - 654556:654556 + redistribute_routes: + - source_protocol: connected - name: SIT2 router_id: 10.10.0.3 rd: 10.10.0.3:654789 @@ -99,6 +113,22 @@ router_bgp: redistribute_routes: - learned vlan: 70,80 + - name: bundle5 + rd: 1.1.1.1:555 + route_targets: + both: + - 405:555 + redistribute_routes: + - learned + vlan: 120,1017 + - name: bundle6 + rd: 1.1.1.1:666 + route_targets: + both: + - 406:666 + redistribute_routes: + - learned + vlan: 110,1016 - name: SIT2 rd: 10.10.0.3:655089 route_targets: @@ -150,6 +180,9 @@ vlan_internal_order: vrfs: - name: MGMT ip_routing: false +- name: research1 + tenant: research + ip_routing: true - name: SIT2 tenant: SIT ip_routing: true @@ -204,6 +237,18 @@ vlans: - id: 80 name: vstorage tenant: FABRIC +- id: 1016 + name: SVI_9 + tenant: research +- id: 1017 + name: SVI_10 + tenant: research +- id: 110 + name: research1 + tenant: research +- id: 120 + name: research2 + tenant: research - id: 1011 name: SVI_4 tenant: SIT @@ -243,6 +288,20 @@ vlans: ip_igmp_snooping: globally_enabled: true vlan_interfaces: +- name: Vlan1016 + tenant: research + tags: + - research + description: SVI_9 + shutdown: false + vrf: research1 +- name: Vlan1017 + tenant: research + tags: + - research + description: SVI_10 + shutdown: false + vrf: research1 - name: Vlan1011 tenant: SIT tags: @@ -314,6 +373,14 @@ vxlan_interface: vni: 10070 - id: 80 vni: 10080 + - id: 1016 + vni: 11016 + - id: 1017 + vni: 11017 + - id: 110 + vni: 10110 + - id: 120 + vni: 10120 - id: 1011 vni: 21011 - id: 1012 @@ -339,6 +406,8 @@ vxlan_interface: - id: 20 vni: 10020 vrfs: + - name: research1 + vni: 654556 - name: SIT2 vni: 654789 - name: SIT3 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/evpn_vlan_bundle_svi_l2vlan.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/evpn_vlan_bundle_svi_l2vlan.yml new file mode 100644 index 00000000000..521e5607595 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/evpn_vlan_bundle_svi_l2vlan.yml @@ -0,0 +1,202 @@ +hostname: evpn_vlan_bundle_svi_l2vlan +is_deployed: true +router_bgp: + as: '65101' + router_id: 10.10.0.3 + bgp: + default: + ipv4_unicast: false + maximum_paths: + paths: 4 + ecmp: 4 + updates: + wait_install: true + peer_groups: + - name: IPv4-UNDERLAY-PEERS + type: ipv4 + maximum_routes: 12000 + send_community: all + - name: EVPN-OVERLAY-PEERS + type: evpn + update_source: Loopback0 + bfd: true + send_community: all + maximum_routes: 0 + ebgp_multihop: 3 + address_family_ipv4: + peer_groups: + - name: IPv4-UNDERLAY-PEERS + activate: true + - name: EVPN-OVERLAY-PEERS + activate: false + redistribute_routes: + - source_protocol: connected + route_map: RM-CONN-2-BGP + address_family_evpn: + peer_groups: + - name: EVPN-OVERLAY-PEERS + activate: true + vrfs: + - name: SIT_VRF + router_id: 10.10.0.3 + rd: 10.10.0.3:789654 + route_targets: + import: + - address_family: evpn + route_targets: + - 789654:789654 + export: + - address_family: evpn + route_targets: + - 789654:789654 + redistribute_routes: + - source_protocol: connected + vlans: + - id: 1010 + tenant: SIT + rd: 10.10.0.3:21010 + route_targets: + both: + - 21010:21010 + redistribute_routes: + - learned + - id: 10 + tenant: SIT + rd: 10.10.0.3:20010 + route_targets: + both: + - 20010:20010 + redistribute_routes: + - learned + - id: 20 + tenant: SIT + rd: 10.10.0.3:20020 + route_targets: + both: + - 20020:20020 + redistribute_routes: + - learned + vlan_aware_bundles: + - name: bundle3 + rd: 1.1.1.1:333 + route_targets: + both: + - 303:333 + redistribute_routes: + - learned + vlan: 90,100,1008-1009 +service_routing_protocols_model: multi-agent +ip_routing: true +vlan_internal_order: + allocation: ascending + range: + beginning: 1006 + ending: 1199 +vrfs: +- name: MGMT + ip_routing: false +- name: SIT_VRF + tenant: SIT + ip_routing: true +management_api_http: + enable_vrfs: + - name: MGMT + enable_https: true +loopback_interfaces: +- name: Loopback0 + description: EVPN_Overlay_Peering + shutdown: false + ip_address: 10.10.0.3/32 +- name: Loopback1 + description: VTEP_VXLAN_Tunnel_Source + shutdown: false + ip_address: 10.11.0.3/32 +prefix_lists: +- name: PL-LOOPBACKS-EVPN-OVERLAY + sequence_numbers: + - sequence: 10 + action: permit 10.10.0.0/24 eq 32 + - sequence: 20 + action: permit 10.11.0.0/24 eq 32 +route_maps: +- name: RM-CONN-2-BGP + sequence_numbers: + - sequence: 10 + type: permit + match: + - ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY +router_bfd: + multihop: + interval: 300 + min_rx: 300 + multiplier: 3 +vlans: +- id: 1008 + name: SVI_1 + tenant: SIT +- id: 1009 + name: SVI_2 + tenant: SIT +- id: 1010 + name: SVI_3 + tenant: SIT +- id: 10 + name: storage_prod + tenant: SIT +- id: 20 + name: storage_prod + tenant: SIT +- id: 90 + name: vlan90 + tenant: SIT +- id: 100 + name: vlan100 + tenant: SIT +ip_igmp_snooping: + globally_enabled: true +vlan_interfaces: +- name: Vlan1008 + tenant: SIT + tags: + - sit + description: SVI_1 + shutdown: false + vrf: SIT_VRF +- name: Vlan1009 + tenant: SIT + tags: + - sit + description: SVI_2 + shutdown: false + vrf: SIT_VRF +- name: Vlan1010 + tenant: SIT + tags: + - sit + description: SVI_3 + shutdown: false + vrf: SIT_VRF +vxlan_interface: + Vxlan1: + description: evpn_vlan_bundle_svi_l2vlan_VTEP + vxlan: + udp_port: 4789 + source_interface: Loopback1 + vlans: + - id: 1008 + vni: 21008 + - id: 1009 + vni: 21009 + - id: 1010 + vni: 21010 + - id: 10 + vni: 20010 + - id: 20 + vni: 20020 + - id: 90 + vni: 20090 + - id: 100 + vni: 20100 + vrfs: + - name: SIT_VRF + vni: 789654 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/flow-tracking-tests-l2-leaf1.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/flow-tracking-tests-l2-leaf1.yml new file mode 100644 index 00000000000..be0a47841ae --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/flow-tracking-tests-l2-leaf1.yml @@ -0,0 +1,92 @@ +hostname: flow-tracking-tests-l2-leaf1 +is_deployed: true +static_routes: +- vrf: MGMT + destination_address_prefix: 0.0.0.0/0 + gateway: 192.168.0.1 +- destination_address_prefix: 0.0.0.0/0 + gateway: 10.254.254.1 +service_routing_protocols_model: multi-agent +vlan_internal_order: + allocation: ascending + range: + beginning: 1006 + ending: 1199 +vrfs: +- name: MGMT + ip_routing: false +management_interfaces: +- name: Management1 + description: oob_management + shutdown: false + vrf: MGMT + ip_address: 192.168.0.201/24 + gateway: 192.168.0.1 + type: oob +management_api_http: + enable_vrfs: + - name: MGMT + enable_https: true +ethernet_interfaces: +- name: Ethernet1 + peer: flow-tracking-tests-leaf3 + peer_interface: Ethernet31 + peer_type: l3leaf + description: FLOW-TRACKING-TESTS-LEAF3_Ethernet31 + shutdown: false + type: port-channel-member + channel_group: + id: 1 + mode: active +- name: Ethernet2 + peer: flow-tracking-tests-leaf4 + peer_interface: Ethernet31 + peer_type: l3leaf + description: FLOW-TRACKING-TESTS-LEAF4_Ethernet31 + shutdown: false + type: port-channel-member + channel_group: + id: 1 + mode: active +port_channel_interfaces: +- name: Port-Channel1 + description: FLOW-TRACKING-TESTS-LEAF-MLAG_Po31 + type: switched + shutdown: false + mode: trunk + flow_tracker: + sampled: FLOW-TRACKER + vlans: 11,4092 +vlans: +- id: 11 + name: VLAN11 + tenant: FLOW_TRACKING +- id: 4092 + tenant: system + name: INBAND_MGMT +ip_igmp_snooping: + globally_enabled: true +vlan_interfaces: +- name: Vlan4092 + description: Inband Management + shutdown: false + mtu: 1500 + ip_address: 10.254.254.4/24 + type: inband_mgmt +flow_tracking: + sampled: + sample: 10000 + trackers: + - name: FLOW-TRACKER + record_export: + on_inactive_timeout: 70000 + on_interval: 300000 + exporters: + - name: CV-TELEMETRY + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 3600000 + shutdown: false +metadata: + platform: vEOS-lab diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/flow-tracking-tests-l2-leaf2.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/flow-tracking-tests-l2-leaf2.yml new file mode 100644 index 00000000000..34e125f1dc6 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/flow-tracking-tests-l2-leaf2.yml @@ -0,0 +1,92 @@ +hostname: flow-tracking-tests-l2-leaf2 +is_deployed: true +static_routes: +- vrf: MGMT + destination_address_prefix: 0.0.0.0/0 + gateway: 192.168.0.1 +- destination_address_prefix: 0.0.0.0/0 + gateway: 10.254.254.1 +service_routing_protocols_model: multi-agent +vlan_internal_order: + allocation: ascending + range: + beginning: 1006 + ending: 1199 +vrfs: +- name: MGMT + ip_routing: false +management_interfaces: +- name: Management1 + description: oob_management + shutdown: false + vrf: MGMT + ip_address: 192.168.0.202/24 + gateway: 192.168.0.1 + type: oob +management_api_http: + enable_vrfs: + - name: MGMT + enable_https: true +ethernet_interfaces: +- name: Ethernet1 + peer: flow-tracking-tests-leaf3 + peer_interface: Ethernet32 + peer_type: l3leaf + description: FLOW-TRACKING-TESTS-LEAF3_Ethernet32 + shutdown: false + type: port-channel-member + channel_group: + id: 1 + mode: active +- name: Ethernet2 + peer: flow-tracking-tests-leaf4 + peer_interface: Ethernet32 + peer_type: l3leaf + description: FLOW-TRACKING-TESTS-LEAF4_Ethernet32 + shutdown: false + type: port-channel-member + channel_group: + id: 1 + mode: active +port_channel_interfaces: +- name: Port-Channel1 + description: FLOW-TRACKING-TESTS-LEAF-MLAG_Po32 + type: switched + shutdown: false + mode: trunk + flow_tracker: + sampled: FLOW-TRACKER + vlans: 11,4092 +vlans: +- id: 11 + name: VLAN11 + tenant: FLOW_TRACKING +- id: 4092 + tenant: system + name: INBAND_MGMT +ip_igmp_snooping: + globally_enabled: true +vlan_interfaces: +- name: Vlan4092 + description: Inband Management + shutdown: false + mtu: 1500 + ip_address: 10.254.254.5/24 + type: inband_mgmt +flow_tracking: + sampled: + sample: 10000 + trackers: + - name: FLOW-TRACKER + record_export: + on_inactive_timeout: 70000 + on_interval: 300000 + exporters: + - name: CV-TELEMETRY + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 3600000 + shutdown: false +metadata: + platform: vEOS-lab diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/flow-tracking-tests-leaf1.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/flow-tracking-tests-leaf1.yml new file mode 100644 index 00000000000..92ca4f49d58 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/flow-tracking-tests-leaf1.yml @@ -0,0 +1,290 @@ +hostname: flow-tracking-tests-leaf1 +is_deployed: true +router_bgp: + as: '65101' + router_id: 10.254.1.1 + bgp: + default: + ipv4_unicast: false + maximum_paths: + paths: 4 + ecmp: 4 + peer_groups: + - name: IPv4-UNDERLAY-PEERS + type: ipv4 + maximum_routes: 12000 + send_community: all + - name: EVPN-OVERLAY-PEERS + type: evpn + update_source: Loopback0 + bfd: true + send_community: all + maximum_routes: 0 + ebgp_multihop: 3 + address_family_ipv4: + peer_groups: + - name: IPv4-UNDERLAY-PEERS + activate: true + - name: EVPN-OVERLAY-PEERS + activate: false + redistribute_routes: + - source_protocol: connected + route_map: RM-CONN-2-BGP + neighbors: + - ip_address: 10.254.2.0 + peer_group: IPv4-UNDERLAY-PEERS + remote_as: '65200' + peer: flow-tracking-tests-spine1 + description: flow-tracking-tests-spine1_Ethernet1 + - ip_address: 10.254.2.2 + peer_group: IPv4-UNDERLAY-PEERS + remote_as: '65200' + peer: flow-tracking-tests-spine2 + description: flow-tracking-tests-spine2_Ethernet2 + - ip_address: 10.255.0.1 + peer_group: EVPN-OVERLAY-PEERS + peer: flow-tracking-tests-spine1 + description: flow-tracking-tests-spine1 + remote_as: '65200' + - ip_address: 10.255.0.2 + peer_group: EVPN-OVERLAY-PEERS + peer: flow-tracking-tests-spine2 + description: flow-tracking-tests-spine2 + remote_as: '65200' + address_family_evpn: + peer_groups: + - name: EVPN-OVERLAY-PEERS + activate: true + vrfs: + - name: VRF1 + router_id: 10.254.1.1 + rd: 10.254.1.1:1 + route_targets: + import: + - address_family: evpn + route_targets: + - '1:1' + export: + - address_family: evpn + route_targets: + - '1:1' + redistribute_routes: + - source_protocol: connected + vlans: + - id: 11 + tenant: FLOW_TRACKING + rd: 10.254.1.1:10011 + route_targets: + both: + - 10011:10011 + redistribute_routes: + - learned +static_routes: +- vrf: MGMT + destination_address_prefix: 0.0.0.0/0 + gateway: 192.168.0.1 +service_routing_protocols_model: multi-agent +ip_routing: true +vlan_internal_order: + allocation: ascending + range: + beginning: 1006 + ending: 1199 +spanning_tree: + mode: mstp + mst_instances: + - id: '0' + priority: 4096 +vrfs: +- name: MGMT + ip_routing: false +- name: VRF1 + tenant: FLOW_TRACKING + ip_routing: true +management_interfaces: +- name: Management1 + description: oob_management + shutdown: false + vrf: MGMT + ip_address: 192.168.0.101/24 + gateway: 192.168.0.1 + type: oob +management_api_http: + enable_vrfs: + - name: MGMT + enable_https: true +ethernet_interfaces: +- name: Ethernet1 + peer: flow-tracking-tests-spine1 + peer_interface: Ethernet1 + peer_type: spine + description: P2P_LINK_TO_FLOW-TRACKING-TESTS-SPINE1_Ethernet1 + shutdown: false + mtu: 9214 + type: routed + flow_tracker: + hardware: FLOW-TRACKER + ip_address: 10.254.2.1/31 +- name: Ethernet2 + peer: flow-tracking-tests-spine2 + peer_interface: Ethernet2 + peer_type: spine + description: P2P_LINK_TO_FLOW-TRACKING-TESTS-SPINE2_Ethernet2 + shutdown: false + mtu: 9214 + type: routed + flow_tracker: + hardware: FLOW-TRACKER + ip_address: 10.254.2.3/31 +- name: Ethernet81 + peer_type: l3_interface + ip_address: 10.1.55.0/31 + shutdown: false + flow_tracker: + hardware: FLOW-TRACKER-3 + type: routed + vrf: VRF1 +- name: Ethernet82 + peer_type: l3_interface + ip_address: 10.1.55.0/31 + shutdown: false + type: routed + vrf: VRF1 +- name: Ethernet83 + peer_type: l3_interface + ip_address: 10.1.55.0/31 + shutdown: false + flow_tracker: + hardware: FLOW-TRACKER + type: routed + vrf: VRF1 +- name: Ethernet84 + peer_type: l3_interface + ip_address: 10.1.55.0/31 + shutdown: false + flow_tracker: + hardware: FLOW-TRACKER + type: routed + vrf: VRF1 +- name: Ethernet10 + peer: single-interface-true + peer_interface: eth1 + peer_type: server + description: single-interface-true_eth1 + shutdown: false + type: switched + mode: access + vlans: '11' + flow_tracker: + hardware: FLOW-TRACKER-3 +- name: Ethernet11 + peer: single-interface-false + peer_interface: eth11 + peer_type: server + description: single-interface-false_eth11 + shutdown: false + type: switched + mode: access + vlans: '11' +- name: Ethernet12 + peer: single-interface-no-definition + peer_interface: eth12 + peer_type: server + description: single-interface-no-definition_eth12 + shutdown: false + type: switched + mode: access + vlans: '11' + flow_tracker: + hardware: FLOW-TRACKER +- name: Ethernet13 + peer: single-interface-true4 + peer_interface: eth1 + peer_type: server + description: single-interface-true4_eth1 + shutdown: false + type: switched + mode: access + vlans: '11' + flow_tracker: + hardware: FLOW-TRACKER +loopback_interfaces: +- name: Loopback0 + description: EVPN_Overlay_Peering + shutdown: false + ip_address: 10.254.1.1/32 +- name: Loopback1 + description: VTEP_VXLAN_Tunnel_Source + shutdown: false + ip_address: 10.254.11.1/32 +prefix_lists: +- name: PL-LOOPBACKS-EVPN-OVERLAY + sequence_numbers: + - sequence: 10 + action: permit 10.254.1.0/27 eq 32 + - sequence: 20 + action: permit 10.254.11.0/27 eq 32 +route_maps: +- name: RM-CONN-2-BGP + sequence_numbers: + - sequence: 10 + type: permit + match: + - ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY +router_bfd: + multihop: + interval: 300 + min_rx: 300 + multiplier: 3 +vlans: +- id: 11 + name: VLAN11 + tenant: FLOW_TRACKING +ip_igmp_snooping: + globally_enabled: true +ip_virtual_router_mac_address: 00:11:22:33:44:55 +vlan_interfaces: +- name: Vlan11 + tenant: FLOW_TRACKING + description: VLAN11 + shutdown: false + ip_address: 172.16.11.1/24 + vrf: VRF1 +vxlan_interface: + Vxlan1: + description: flow-tracking-tests-leaf1_VTEP + vxlan: + udp_port: 4789 + source_interface: Loopback1 + vlans: + - id: 11 + vni: 10011 + vrfs: + - name: VRF1 + vni: 1 +flow_tracking: + hardware: + trackers: + - name: FLOW-TRACKER + record_export: + on_inactive_timeout: 50001 + on_interval: 300332 + exporters: + - name: ayush_exporter + collector: + host: 127.0.0.2 + local_interface: Loopback0 + template_interval: 40002 + - name: FLOW-TRACKER-3 + record_export: + on_inactive_timeout: 50000 + on_interval: 300331 + exporters: + - name: ayush_exporter + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 40000 + shutdown: false +metadata: + platform: vEOS-lab diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/flow-tracking-tests-leaf2.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/flow-tracking-tests-leaf2.yml new file mode 100644 index 00000000000..87008acfe38 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/flow-tracking-tests-leaf2.yml @@ -0,0 +1,287 @@ +hostname: flow-tracking-tests-leaf2 +is_deployed: true +router_bgp: + as: '65102' + router_id: 10.254.1.2 + bgp: + default: + ipv4_unicast: false + maximum_paths: + paths: 4 + ecmp: 4 + peer_groups: + - name: IPv4-UNDERLAY-PEERS + type: ipv4 + maximum_routes: 12000 + send_community: all + - name: EVPN-OVERLAY-PEERS + type: evpn + update_source: Loopback0 + bfd: true + send_community: all + maximum_routes: 0 + ebgp_multihop: 3 + address_family_ipv4: + peer_groups: + - name: IPv4-UNDERLAY-PEERS + activate: true + - name: EVPN-OVERLAY-PEERS + activate: false + redistribute_routes: + - source_protocol: connected + route_map: RM-CONN-2-BGP + neighbors: + - ip_address: 10.254.2.4 + peer_group: IPv4-UNDERLAY-PEERS + remote_as: '65200' + peer: flow-tracking-tests-spine1 + description: flow-tracking-tests-spine1_Ethernet3 + - ip_address: 10.254.2.6 + peer_group: IPv4-UNDERLAY-PEERS + remote_as: '65200' + peer: flow-tracking-tests-spine2 + description: flow-tracking-tests-spine2_Ethernet4 + - ip_address: 10.255.0.1 + peer_group: EVPN-OVERLAY-PEERS + peer: flow-tracking-tests-spine1 + description: flow-tracking-tests-spine1 + remote_as: '65200' + - ip_address: 10.255.0.2 + peer_group: EVPN-OVERLAY-PEERS + peer: flow-tracking-tests-spine2 + description: flow-tracking-tests-spine2 + remote_as: '65200' + address_family_evpn: + peer_groups: + - name: EVPN-OVERLAY-PEERS + activate: true + vrfs: + - name: VRF1 + router_id: 10.254.1.2 + rd: 10.254.1.2:1 + route_targets: + import: + - address_family: evpn + route_targets: + - '1:1' + export: + - address_family: evpn + route_targets: + - '1:1' + redistribute_routes: + - source_protocol: connected + vlans: + - id: 11 + tenant: FLOW_TRACKING + rd: 10.254.1.2:10011 + route_targets: + both: + - 10011:10011 + redistribute_routes: + - learned +static_routes: +- vrf: MGMT + destination_address_prefix: 0.0.0.0/0 + gateway: 192.168.0.1 +service_routing_protocols_model: multi-agent +ip_routing: true +vlan_internal_order: + allocation: ascending + range: + beginning: 1006 + ending: 1199 +spanning_tree: + mode: mstp + mst_instances: + - id: '0' + priority: 4096 +vrfs: +- name: MGMT + ip_routing: false +- name: VRF1 + tenant: FLOW_TRACKING + ip_routing: true +management_interfaces: +- name: Management1 + description: oob_management + shutdown: false + vrf: MGMT + ip_address: 192.168.0.102/24 + gateway: 192.168.0.1 + type: oob +management_api_http: + enable_vrfs: + - name: MGMT + enable_https: true +ethernet_interfaces: +- name: Ethernet1 + peer: flow-tracking-tests-spine1 + peer_interface: Ethernet3 + peer_type: spine + description: P2P_LINK_TO_FLOW-TRACKING-TESTS-SPINE1_Ethernet3 + shutdown: false + mtu: 9214 + type: routed + ip_address: 10.254.2.5/31 +- name: Ethernet2 + peer: flow-tracking-tests-spine2 + peer_interface: Ethernet4 + peer_type: spine + description: P2P_LINK_TO_FLOW-TRACKING-TESTS-SPINE2_Ethernet4 + shutdown: false + mtu: 9214 + type: routed + ip_address: 10.254.2.7/31 +- name: Ethernet81 + peer_type: l3_interface + ip_address: 10.1.55.2/31 + shutdown: false + flow_tracker: + sampled: FLOW-TRACKER-3 + type: routed + vrf: VRF1 +- name: Ethernet82 + peer_type: l3_interface + ip_address: 10.1.55.2/31 + shutdown: false + type: routed + vrf: VRF1 +- name: Ethernet83 + peer_type: l3_interface + ip_address: 10.1.55.2/31 + shutdown: false + type: routed + vrf: VRF1 +- name: Ethernet84 + peer_type: l3_interface + ip_address: 10.1.55.2/31 + shutdown: false + flow_tracker: + sampled: FLOW-TRACKER-4 + type: routed + vrf: VRF1 +- name: Ethernet10 + peer: single-interface-true + peer_interface: eth2 + peer_type: server + description: single-interface-true_eth2 + shutdown: false + type: switched + mode: access + vlans: '11' +- name: Ethernet11 + peer: single-interface-false + peer_interface: eth12 + peer_type: server + description: single-interface-false_eth12 + shutdown: false + type: switched + mode: access + vlans: '11' +- name: Ethernet12 + peer: single-interface-no-definition + peer_interface: eth13 + peer_type: server + description: single-interface-no-definition_eth13 + shutdown: false + type: switched + mode: access + vlans: '11' + flow_tracker: + sampled: FLOW-TRACKER-3 +- name: Ethernet13 + peer: single-interface-true4 + peer_interface: eth1 + peer_type: server + description: single-interface-true4_eth1 + shutdown: false + type: switched + mode: access + vlans: '11' +loopback_interfaces: +- name: Loopback0 + description: EVPN_Overlay_Peering + shutdown: false + ip_address: 10.254.1.2/32 +- name: Loopback1 + description: VTEP_VXLAN_Tunnel_Source + shutdown: false + ip_address: 10.254.11.2/32 +prefix_lists: +- name: PL-LOOPBACKS-EVPN-OVERLAY + sequence_numbers: + - sequence: 10 + action: permit 10.254.1.0/27 eq 32 + - sequence: 20 + action: permit 10.254.11.0/27 eq 32 +route_maps: +- name: RM-CONN-2-BGP + sequence_numbers: + - sequence: 10 + type: permit + match: + - ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY +router_bfd: + multihop: + interval: 300 + min_rx: 300 + multiplier: 3 +vlans: +- id: 11 + name: VLAN11 + tenant: FLOW_TRACKING +ip_igmp_snooping: + globally_enabled: true +ip_virtual_router_mac_address: 00:11:22:33:44:55 +vlan_interfaces: +- name: Vlan11 + tenant: FLOW_TRACKING + description: VLAN11 + shutdown: false + ip_address: 172.17.11.1/24 + vrf: VRF1 +vxlan_interface: + Vxlan1: + description: flow-tracking-tests-leaf2_VTEP + vxlan: + udp_port: 4789 + source_interface: Loopback1 + vlans: + - id: 11 + vni: 10011 + vrfs: + - name: VRF1 + vni: 1 +flow_tracking: + sampled: + encapsulation: + mpls: true + sample: 50000 + hardware_offload: + ipv4: true + ipv6: true + threshold_minimum: 1332 + trackers: + - name: FLOW-TRACKER-3 + record_export: + on_inactive_timeout: 50000 + on_interval: 300331 + exporters: + - name: ayush_exporter + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 40000 + - name: FLOW-TRACKER-4 + record_export: + on_inactive_timeout: 50020 + on_interval: 300321 + exporters: + - name: ayush_exporter + collector: + host: 127.0.2.1 + local_interface: Loopback0 + template_interval: 40020 + shutdown: false +metadata: + platform: vEOS-lab diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/flow-tracking-tests-leaf3.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/flow-tracking-tests-leaf3.yml new file mode 100644 index 00000000000..021cc912d30 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/flow-tracking-tests-leaf3.yml @@ -0,0 +1,429 @@ +hostname: flow-tracking-tests-leaf3 +is_deployed: true +router_bgp: + as: '65105' + router_id: 10.254.1.5 + bgp: + default: + ipv4_unicast: false + maximum_paths: + paths: 4 + ecmp: 4 + peer_groups: + - name: MLAG-IPv4-UNDERLAY-PEER + type: ipv4 + remote_as: '65105' + next_hop_self: true + description: flow-tracking-tests-leaf4 + maximum_routes: 12000 + send_community: all + route_map_in: RM-MLAG-PEER-IN + - name: IPv4-UNDERLAY-PEERS + type: ipv4 + maximum_routes: 12000 + send_community: all + - name: EVPN-OVERLAY-PEERS + type: evpn + update_source: Loopback0 + bfd: true + send_community: all + maximum_routes: 0 + ebgp_multihop: 3 + address_family_ipv4: + peer_groups: + - name: MLAG-IPv4-UNDERLAY-PEER + activate: true + - name: IPv4-UNDERLAY-PEERS + activate: true + - name: EVPN-OVERLAY-PEERS + activate: false + neighbors: + - ip_address: 10.254.1.105 + peer_group: MLAG-IPv4-UNDERLAY-PEER + peer: flow-tracking-tests-leaf4 + description: flow-tracking-tests-leaf4 + - ip_address: 10.254.2.16 + peer_group: IPv4-UNDERLAY-PEERS + remote_as: '65200' + peer: flow-tracking-tests-spine1 + description: flow-tracking-tests-spine1_Ethernet5 + - ip_address: 10.254.2.18 + peer_group: IPv4-UNDERLAY-PEERS + remote_as: '65200' + peer: flow-tracking-tests-spine2 + description: flow-tracking-tests-spine2_Ethernet6 + - ip_address: 10.255.0.1 + peer_group: EVPN-OVERLAY-PEERS + peer: flow-tracking-tests-spine1 + description: flow-tracking-tests-spine1 + remote_as: '65200' + - ip_address: 10.255.0.2 + peer_group: EVPN-OVERLAY-PEERS + peer: flow-tracking-tests-spine2 + description: flow-tracking-tests-spine2 + remote_as: '65200' + redistribute_routes: + - source_protocol: connected + route_map: RM-CONN-2-BGP + - source_protocol: attached-host + address_family_evpn: + peer_groups: + - name: EVPN-OVERLAY-PEERS + activate: true + vrfs: + - name: VRF1 + router_id: 10.254.1.5 + rd: 10.254.1.5:1 + route_targets: + import: + - address_family: evpn + route_targets: + - '1:1' + export: + - address_family: evpn + route_targets: + - '1:1' + redistribute_routes: + - source_protocol: connected + neighbors: + - ip_address: 10.254.1.105 + peer_group: MLAG-IPv4-UNDERLAY-PEER + vlans: + - id: 11 + tenant: FLOW_TRACKING + rd: 10.254.1.5:10011 + route_targets: + both: + - 10011:10011 + redistribute_routes: + - learned +static_routes: +- vrf: MGMT + destination_address_prefix: 0.0.0.0/0 + gateway: 192.168.0.1 +service_routing_protocols_model: multi-agent +ip_routing: true +vlan_internal_order: + allocation: ascending + range: + beginning: 1006 + ending: 1199 +spanning_tree: + mode: mstp + mst_instances: + - id: '0' + priority: 4096 + no_spanning_tree_vlan: 4093-4094 +vrfs: +- name: MGMT + ip_routing: false +- name: VRF1 + tenant: FLOW_TRACKING + ip_routing: true +management_interfaces: +- name: Management1 + description: oob_management + shutdown: false + vrf: MGMT + ip_address: 192.168.0.103/24 + gateway: 192.168.0.1 + type: oob +management_api_http: + enable_vrfs: + - name: MGMT + enable_https: true +vlans: +- id: 4093 + tenant: system + name: LEAF_PEER_L3 + trunk_groups: + - LEAF_PEER_L3 +- id: 4094 + tenant: system + name: MLAG_PEER + trunk_groups: + - MLAG +- id: 11 + name: VLAN11 + tenant: FLOW_TRACKING +- id: 3000 + name: MLAG_iBGP_VRF1 + trunk_groups: + - LEAF_PEER_L3 + tenant: FLOW_TRACKING +- id: 4092 + tenant: system + name: INBAND_MGMT +vlan_interfaces: +- name: Vlan4093 + description: MLAG_PEER_L3_PEERING + shutdown: false + mtu: 9214 + ip_address: 10.254.1.104/31 +- name: Vlan4094 + description: MLAG_PEER + shutdown: false + no_autostate: true + mtu: 9214 + ip_address: 10.254.1.72/31 +- name: Vlan11 + tenant: FLOW_TRACKING + description: VLAN11 + shutdown: false + vrf: VRF1 +- name: Vlan3000 + tenant: FLOW_TRACKING + type: underlay_peering + shutdown: false + description: 'MLAG_PEER_L3_iBGP: vrf VRF1' + vrf: VRF1 + mtu: 9214 + ip_address: 10.254.1.104/31 +- name: Vlan4092 + description: Inband Management + shutdown: false + mtu: 1500 + ip_attached_host_route_export: + enabled: true + distance: 19 + ip_address: 10.254.254.2/24 + ip_virtual_router_addresses: + - 10.254.254.1 +port_channel_interfaces: +- name: Port-Channel21 + description: MLAG_PEER_flow-tracking-tests-leaf4_Po21 + type: switched + shutdown: false + mode: trunk + trunk_groups: + - LEAF_PEER_L3 + - MLAG +- name: Port-Channel31 + description: FLOW-TRACKING-TESTS-L2-LEAF1_Po1 + type: switched + shutdown: false + mode: trunk + flow_tracker: + hardware: FLOW-TRACKER + vlans: 11,4092 + mlag: 31 +- name: Port-Channel32 + description: FLOW-TRACKING-TESTS-L2-LEAF2_Po1 + type: switched + shutdown: false + mode: trunk + flow_tracker: + hardware: FLOW-TRACKER + vlans: 11,4092 + mlag: 32 +- name: Port-Channel14 + description: port-channel-interface-true + type: switched + shutdown: false + mode: access + vlans: '11' + spanning_tree_portfast: edge + mlag: 14 +- name: Port-Channel15 + description: port-channel-interface-false + type: switched + shutdown: false + flow_tracker: + hardware: FLOW-TRACKER + mode: access + vlans: '11' + spanning_tree_portfast: edge + mlag: 15 +- name: Port-Channel16 + description: port-channel-interface-no-definition + type: switched + shutdown: false + mode: access + vlans: '11' + spanning_tree_portfast: edge + mlag: 16 +ethernet_interfaces: +- name: Ethernet21 + peer: flow-tracking-tests-leaf4 + peer_interface: Ethernet21 + peer_type: mlag_peer + description: MLAG_PEER_flow-tracking-tests-leaf4_Ethernet21 + type: port-channel-member + shutdown: false + channel_group: + id: 21 + mode: active +- name: Ethernet22 + peer: flow-tracking-tests-leaf4 + peer_interface: Ethernet22 + peer_type: mlag_peer + description: MLAG_PEER_flow-tracking-tests-leaf4_Ethernet22 + type: port-channel-member + shutdown: false + channel_group: + id: 21 + mode: active +- name: Ethernet1 + peer: flow-tracking-tests-spine1 + peer_interface: Ethernet5 + peer_type: spine + description: P2P_LINK_TO_FLOW-TRACKING-TESTS-SPINE1_Ethernet5 + shutdown: false + mtu: 9214 + type: routed + flow_tracker: + hardware: FLOW-TRACKER-3 + ip_address: 10.254.2.17/31 +- name: Ethernet2 + peer: flow-tracking-tests-spine2 + peer_interface: Ethernet6 + peer_type: spine + description: P2P_LINK_TO_FLOW-TRACKING-TESTS-SPINE2_Ethernet6 + shutdown: false + mtu: 9214 + type: routed + flow_tracker: + hardware: FLOW-TRACKER-3 + ip_address: 10.254.2.19/31 +- name: Ethernet31 + peer: flow-tracking-tests-l2-leaf1 + peer_interface: Ethernet1 + peer_type: l2leaf + description: FLOW-TRACKING-TESTS-L2-LEAF1_Ethernet1 + shutdown: false + type: port-channel-member + channel_group: + id: 31 + mode: active +- name: Ethernet32 + peer: flow-tracking-tests-l2-leaf2 + peer_interface: Ethernet1 + peer_type: l2leaf + description: FLOW-TRACKING-TESTS-L2-LEAF2_Ethernet1 + shutdown: false + type: port-channel-member + channel_group: + id: 32 + mode: active +- name: Ethernet14 + peer: port-channel-interface-true + peer_interface: PCI1 + peer_type: server + description: port-channel-interface-true_PCI1 + shutdown: false + type: port-channel-member + channel_group: + id: 14 + mode: 'on' +- name: Ethernet15 + peer: port-channel-interface-false + peer_interface: PCI11 + peer_type: server + description: port-channel-interface-false_PCI11 + shutdown: false + type: port-channel-member + channel_group: + id: 15 + mode: 'on' +- name: Ethernet16 + peer: port-channel-interface-no-definition + peer_interface: PCI13 + peer_type: server + description: port-channel-interface-no-definition_PCI13 + shutdown: false + type: port-channel-member + channel_group: + id: 16 + mode: 'on' +mlag_configuration: + domain_id: flow-tracking-tests-leaf-mlag + local_interface: Vlan4094 + peer_address: 10.254.1.73 + peer_link: Port-Channel21 + reload_delay_mlag: '300' + reload_delay_non_mlag: '330' +route_maps: +- name: RM-MLAG-PEER-IN + sequence_numbers: + - sequence: 10 + type: permit + set: + - origin incomplete + description: Make routes learned over MLAG Peer-link less preferred on spines to ensure optimal routing +- name: RM-CONN-2-BGP + sequence_numbers: + - sequence: 10 + type: permit + match: + - ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY + - sequence: 20 + type: permit + match: + - ip address prefix-list PL-L2LEAF-INBAND-MGMT +loopback_interfaces: +- name: Loopback0 + description: EVPN_Overlay_Peering + shutdown: false + ip_address: 10.254.1.5/32 +- name: Loopback1 + description: VTEP_VXLAN_Tunnel_Source + shutdown: false + ip_address: 10.254.11.5/32 +prefix_lists: +- name: PL-LOOPBACKS-EVPN-OVERLAY + sequence_numbers: + - sequence: 10 + action: permit 10.254.1.0/27 eq 32 + - sequence: 20 + action: permit 10.254.11.0/27 eq 32 +- name: PL-L2LEAF-INBAND-MGMT + sequence_numbers: + - sequence: 10 + action: permit 10.254.254.0/24 +router_bfd: + multihop: + interval: 300 + min_rx: 300 + multiplier: 3 +ip_igmp_snooping: + globally_enabled: true +ip_virtual_router_mac_address: 00:11:22:33:44:55 +vxlan_interface: + Vxlan1: + description: flow-tracking-tests-leaf3_VTEP + vxlan: + udp_port: 4789 + source_interface: Loopback1 + virtual_router_encapsulation_mac_address: mlag-system-id + vlans: + - id: 11 + vni: 10011 + vrfs: + - name: VRF1 + vni: 1 +flow_tracking: + hardware: + trackers: + - name: FLOW-TRACKER-3 + record_export: + on_inactive_timeout: 50000 + on_interval: 300331 + exporters: + - name: ayush_exporter + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 40000 + - name: FLOW-TRACKER + record_export: + on_inactive_timeout: 50001 + on_interval: 300332 + exporters: + - name: ayush_exporter + collector: + host: 127.0.0.2 + local_interface: Loopback0 + template_interval: 40002 + shutdown: false +metadata: + platform: vEOS-lab diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/flow-tracking-tests-leaf4.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/flow-tracking-tests-leaf4.yml new file mode 100644 index 00000000000..cfd155951bf --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/flow-tracking-tests-leaf4.yml @@ -0,0 +1,429 @@ +hostname: flow-tracking-tests-leaf4 +is_deployed: true +router_bgp: + as: '65105' + router_id: 10.254.1.6 + bgp: + default: + ipv4_unicast: false + maximum_paths: + paths: 4 + ecmp: 4 + peer_groups: + - name: MLAG-IPv4-UNDERLAY-PEER + type: ipv4 + remote_as: '65105' + next_hop_self: true + description: flow-tracking-tests-leaf3 + maximum_routes: 12000 + send_community: all + route_map_in: RM-MLAG-PEER-IN + - name: IPv4-UNDERLAY-PEERS + type: ipv4 + maximum_routes: 12000 + send_community: all + - name: EVPN-OVERLAY-PEERS + type: evpn + update_source: Loopback0 + bfd: true + send_community: all + maximum_routes: 0 + ebgp_multihop: 3 + address_family_ipv4: + peer_groups: + - name: MLAG-IPv4-UNDERLAY-PEER + activate: true + - name: IPv4-UNDERLAY-PEERS + activate: true + - name: EVPN-OVERLAY-PEERS + activate: false + neighbors: + - ip_address: 10.254.1.104 + peer_group: MLAG-IPv4-UNDERLAY-PEER + peer: flow-tracking-tests-leaf3 + description: flow-tracking-tests-leaf3 + - ip_address: 10.254.2.20 + peer_group: IPv4-UNDERLAY-PEERS + remote_as: '65200' + peer: flow-tracking-tests-spine1 + description: flow-tracking-tests-spine1_Ethernet7 + - ip_address: 10.254.2.22 + peer_group: IPv4-UNDERLAY-PEERS + remote_as: '65200' + peer: flow-tracking-tests-spine2 + description: flow-tracking-tests-spine2_Ethernet8 + - ip_address: 10.255.0.1 + peer_group: EVPN-OVERLAY-PEERS + peer: flow-tracking-tests-spine1 + description: flow-tracking-tests-spine1 + remote_as: '65200' + - ip_address: 10.255.0.2 + peer_group: EVPN-OVERLAY-PEERS + peer: flow-tracking-tests-spine2 + description: flow-tracking-tests-spine2 + remote_as: '65200' + redistribute_routes: + - source_protocol: connected + route_map: RM-CONN-2-BGP + - source_protocol: attached-host + address_family_evpn: + peer_groups: + - name: EVPN-OVERLAY-PEERS + activate: true + vrfs: + - name: VRF1 + router_id: 10.254.1.6 + rd: 10.254.1.6:1 + route_targets: + import: + - address_family: evpn + route_targets: + - '1:1' + export: + - address_family: evpn + route_targets: + - '1:1' + redistribute_routes: + - source_protocol: connected + neighbors: + - ip_address: 10.254.1.104 + peer_group: MLAG-IPv4-UNDERLAY-PEER + vlans: + - id: 11 + tenant: FLOW_TRACKING + rd: 10.254.1.6:10011 + route_targets: + both: + - 10011:10011 + redistribute_routes: + - learned +static_routes: +- vrf: MGMT + destination_address_prefix: 0.0.0.0/0 + gateway: 192.168.0.1 +service_routing_protocols_model: multi-agent +ip_routing: true +vlan_internal_order: + allocation: ascending + range: + beginning: 1006 + ending: 1199 +spanning_tree: + mode: mstp + mst_instances: + - id: '0' + priority: 4096 + no_spanning_tree_vlan: 4093-4094 +vrfs: +- name: MGMT + ip_routing: false +- name: VRF1 + tenant: FLOW_TRACKING + ip_routing: true +management_interfaces: +- name: Management1 + description: oob_management + shutdown: false + vrf: MGMT + ip_address: 192.168.0.104/24 + gateway: 192.168.0.1 + type: oob +management_api_http: + enable_vrfs: + - name: MGMT + enable_https: true +vlans: +- id: 4093 + tenant: system + name: LEAF_PEER_L3 + trunk_groups: + - LEAF_PEER_L3 +- id: 4094 + tenant: system + name: MLAG_PEER + trunk_groups: + - MLAG +- id: 11 + name: VLAN11 + tenant: FLOW_TRACKING +- id: 3000 + name: MLAG_iBGP_VRF1 + trunk_groups: + - LEAF_PEER_L3 + tenant: FLOW_TRACKING +- id: 4092 + tenant: system + name: INBAND_MGMT +vlan_interfaces: +- name: Vlan4093 + description: MLAG_PEER_L3_PEERING + shutdown: false + mtu: 9214 + ip_address: 10.254.1.105/31 +- name: Vlan4094 + description: MLAG_PEER + shutdown: false + no_autostate: true + mtu: 9214 + ip_address: 10.254.1.73/31 +- name: Vlan11 + tenant: FLOW_TRACKING + description: VLAN11 + shutdown: false + vrf: VRF1 +- name: Vlan3000 + tenant: FLOW_TRACKING + type: underlay_peering + shutdown: false + description: 'MLAG_PEER_L3_iBGP: vrf VRF1' + vrf: VRF1 + mtu: 9214 + ip_address: 10.254.1.105/31 +- name: Vlan4092 + description: Inband Management + shutdown: false + mtu: 1500 + ip_attached_host_route_export: + enabled: true + distance: 19 + ip_address: 10.254.254.3/24 + ip_virtual_router_addresses: + - 10.254.254.1 +port_channel_interfaces: +- name: Port-Channel21 + description: MLAG_PEER_flow-tracking-tests-leaf3_Po21 + type: switched + shutdown: false + mode: trunk + trunk_groups: + - LEAF_PEER_L3 + - MLAG + flow_tracker: + hardware: FLOW-TRACKER +- name: Port-Channel31 + description: FLOW-TRACKING-TESTS-L2-LEAF1_Po1 + type: switched + shutdown: false + mode: trunk + vlans: 11,4092 + mlag: 31 +- name: Port-Channel32 + description: FLOW-TRACKING-TESTS-L2-LEAF2_Po1 + type: switched + shutdown: false + mode: trunk + vlans: 11,4092 + mlag: 32 +- name: Port-Channel14 + description: port-channel-interface-true + type: switched + shutdown: false + flow_tracker: + hardware: FLOW-TRACKER-4 + mode: access + vlans: '11' + spanning_tree_portfast: edge + mlag: 14 +- name: Port-Channel15 + description: port-channel-interface-false + type: switched + shutdown: false + flow_tracker: + hardware: FLOW-TRACKER + mode: access + vlans: '11' + spanning_tree_portfast: edge + mlag: 15 +- name: Port-Channel16 + description: port-channel-interface-no-definition + type: switched + shutdown: false + mode: access + vlans: '11' + spanning_tree_portfast: edge + mlag: 16 +ethernet_interfaces: +- name: Ethernet21 + peer: flow-tracking-tests-leaf3 + peer_interface: Ethernet21 + peer_type: mlag_peer + description: MLAG_PEER_flow-tracking-tests-leaf3_Ethernet21 + type: port-channel-member + shutdown: false + channel_group: + id: 21 + mode: active +- name: Ethernet22 + peer: flow-tracking-tests-leaf3 + peer_interface: Ethernet22 + peer_type: mlag_peer + description: MLAG_PEER_flow-tracking-tests-leaf3_Ethernet22 + type: port-channel-member + shutdown: false + channel_group: + id: 21 + mode: active +- name: Ethernet1 + peer: flow-tracking-tests-spine1 + peer_interface: Ethernet7 + peer_type: spine + description: P2P_LINK_TO_FLOW-TRACKING-TESTS-SPINE1_Ethernet7 + shutdown: false + mtu: 9214 + type: routed + flow_tracker: + hardware: FLOW-TRACKER + ip_address: 10.254.2.21/31 +- name: Ethernet2 + peer: flow-tracking-tests-spine2 + peer_interface: Ethernet8 + peer_type: spine + description: P2P_LINK_TO_FLOW-TRACKING-TESTS-SPINE2_Ethernet8 + shutdown: false + mtu: 9214 + type: routed + flow_tracker: + hardware: FLOW-TRACKER + ip_address: 10.254.2.23/31 +- name: Ethernet31 + peer: flow-tracking-tests-l2-leaf1 + peer_interface: Ethernet2 + peer_type: l2leaf + description: FLOW-TRACKING-TESTS-L2-LEAF1_Ethernet2 + shutdown: false + type: port-channel-member + channel_group: + id: 31 + mode: active +- name: Ethernet32 + peer: flow-tracking-tests-l2-leaf2 + peer_interface: Ethernet2 + peer_type: l2leaf + description: FLOW-TRACKING-TESTS-L2-LEAF2_Ethernet2 + shutdown: false + type: port-channel-member + channel_group: + id: 32 + mode: active +- name: Ethernet14 + peer: port-channel-interface-true + peer_interface: PCI2 + peer_type: server + description: port-channel-interface-true_PCI2 + shutdown: false + type: port-channel-member + channel_group: + id: 14 + mode: 'on' +- name: Ethernet15 + peer: port-channel-interface-false + peer_interface: PCI12 + peer_type: server + description: port-channel-interface-false_PCI12 + shutdown: false + type: port-channel-member + channel_group: + id: 15 + mode: 'on' +- name: Ethernet16 + peer: port-channel-interface-no-definition + peer_interface: PCI14 + peer_type: server + description: port-channel-interface-no-definition_PCI14 + shutdown: false + type: port-channel-member + channel_group: + id: 16 + mode: 'on' +mlag_configuration: + domain_id: flow-tracking-tests-leaf-mlag + local_interface: Vlan4094 + peer_address: 10.254.1.72 + peer_link: Port-Channel21 + reload_delay_mlag: '300' + reload_delay_non_mlag: '330' +route_maps: +- name: RM-MLAG-PEER-IN + sequence_numbers: + - sequence: 10 + type: permit + set: + - origin incomplete + description: Make routes learned over MLAG Peer-link less preferred on spines to ensure optimal routing +- name: RM-CONN-2-BGP + sequence_numbers: + - sequence: 10 + type: permit + match: + - ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY + - sequence: 20 + type: permit + match: + - ip address prefix-list PL-L2LEAF-INBAND-MGMT +loopback_interfaces: +- name: Loopback0 + description: EVPN_Overlay_Peering + shutdown: false + ip_address: 10.254.1.6/32 +- name: Loopback1 + description: VTEP_VXLAN_Tunnel_Source + shutdown: false + ip_address: 10.254.11.5/32 +prefix_lists: +- name: PL-LOOPBACKS-EVPN-OVERLAY + sequence_numbers: + - sequence: 10 + action: permit 10.254.1.0/27 eq 32 + - sequence: 20 + action: permit 10.254.11.0/27 eq 32 +- name: PL-L2LEAF-INBAND-MGMT + sequence_numbers: + - sequence: 10 + action: permit 10.254.254.0/24 +router_bfd: + multihop: + interval: 300 + min_rx: 300 + multiplier: 3 +ip_igmp_snooping: + globally_enabled: true +ip_virtual_router_mac_address: 00:11:22:33:44:55 +vxlan_interface: + Vxlan1: + description: flow-tracking-tests-leaf4_VTEP + vxlan: + udp_port: 4789 + source_interface: Loopback1 + virtual_router_encapsulation_mac_address: mlag-system-id + vlans: + - id: 11 + vni: 10011 + vrfs: + - name: VRF1 + vni: 1 +flow_tracking: + hardware: + trackers: + - name: FLOW-TRACKER + record_export: + on_inactive_timeout: 50001 + on_interval: 300332 + exporters: + - name: ayush_exporter + collector: + host: 127.0.0.2 + local_interface: Loopback0 + template_interval: 40002 + - name: FLOW-TRACKER-4 + record_export: + on_inactive_timeout: 50020 + on_interval: 300321 + exporters: + - name: ayush_exporter + collector: + host: 127.0.2.1 + local_interface: Loopback0 + template_interval: 40020 + shutdown: false +metadata: + platform: vEOS-lab diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/flow-tracking-tests-spine1.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/flow-tracking-tests-spine1.yml new file mode 100644 index 00000000000..0951e46d22e --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/flow-tracking-tests-spine1.yml @@ -0,0 +1,280 @@ +hostname: flow-tracking-tests-spine1 +is_deployed: true +router_bgp: + as: '65200' + router_id: 10.255.0.1 + bgp: + default: + ipv4_unicast: false + maximum_paths: + paths: 4 + ecmp: 4 + updates: + wait_install: true + peer_groups: + - name: IPv4-UNDERLAY-PEERS + type: ipv4 + maximum_routes: 12000 + send_community: all + - name: EVPN-OVERLAY-PEERS + type: evpn + update_source: Loopback0 + bfd: true + send_community: all + maximum_routes: 0 + ebgp_multihop: 3 + next_hop_unchanged: true + address_family_ipv4: + peer_groups: + - name: IPv4-UNDERLAY-PEERS + activate: true + - name: EVPN-OVERLAY-PEERS + activate: false + redistribute_routes: + - source_protocol: connected + route_map: RM-CONN-2-BGP + neighbors: + - ip_address: 10.254.2.1 + peer_group: IPv4-UNDERLAY-PEERS + remote_as: '65101' + peer: flow-tracking-tests-leaf1 + description: flow-tracking-tests-leaf1_Ethernet1 + - ip_address: 10.254.2.5 + peer_group: IPv4-UNDERLAY-PEERS + remote_as: '65102' + peer: flow-tracking-tests-leaf2 + description: flow-tracking-tests-leaf2_Ethernet1 + - ip_address: 10.254.2.17 + peer_group: IPv4-UNDERLAY-PEERS + remote_as: '65105' + peer: flow-tracking-tests-leaf3 + description: flow-tracking-tests-leaf3_Ethernet1 + - ip_address: 10.254.2.21 + peer_group: IPv4-UNDERLAY-PEERS + remote_as: '65105' + peer: flow-tracking-tests-leaf4 + description: flow-tracking-tests-leaf4_Ethernet1 + - ip_address: 10.254.1.1 + peer_group: EVPN-OVERLAY-PEERS + peer: flow-tracking-tests-leaf1 + description: flow-tracking-tests-leaf1 + remote_as: '65101' + - ip_address: 10.254.1.2 + peer_group: EVPN-OVERLAY-PEERS + peer: flow-tracking-tests-leaf2 + description: flow-tracking-tests-leaf2 + remote_as: '65102' + - ip_address: 10.254.1.5 + peer_group: EVPN-OVERLAY-PEERS + peer: flow-tracking-tests-leaf3 + description: flow-tracking-tests-leaf3 + remote_as: '65105' + - ip_address: 10.254.1.6 + peer_group: EVPN-OVERLAY-PEERS + peer: flow-tracking-tests-leaf4 + description: flow-tracking-tests-leaf4 + remote_as: '65105' + address_family_evpn: + peer_groups: + - name: EVPN-OVERLAY-PEERS + activate: true +static_routes: +- vrf: MGMT + destination_address_prefix: 0.0.0.0/0 + gateway: 192.168.0.1 +service_routing_protocols_model: multi-agent +ip_routing: true +vlan_internal_order: + allocation: ascending + range: + beginning: 1006 + ending: 1199 +spanning_tree: + mode: none +vrfs: +- name: MGMT + ip_routing: false +management_interfaces: +- name: Management1 + description: oob_management + shutdown: false + vrf: MGMT + ip_address: 192.168.0.11/24 + gateway: 192.168.0.1 + type: oob +management_api_http: + enable_vrfs: + - name: MGMT + enable_https: true +ethernet_interfaces: +- name: Ethernet1 + peer: flow-tracking-tests-leaf1 + peer_interface: Ethernet1 + peer_type: l3leaf + description: P2P_LINK_TO_FLOW-TRACKING-TESTS-LEAF1_Ethernet1 + shutdown: false + mtu: 9214 + type: routed + flow_tracker: + sampled: FLOW-TRACKER + ip_address: 10.254.2.0/31 +- name: Ethernet3 + peer: flow-tracking-tests-leaf2 + peer_interface: Ethernet1 + peer_type: l3leaf + description: P2P_LINK_TO_FLOW-TRACKING-TESTS-LEAF2_Ethernet1 + shutdown: false + mtu: 9214 + type: routed + flow_tracker: + sampled: FLOW-TRACKER + ip_address: 10.254.2.4/31 +- name: Ethernet5 + peer: flow-tracking-tests-leaf3 + peer_interface: Ethernet1 + peer_type: l3leaf + description: P2P_LINK_TO_FLOW-TRACKING-TESTS-LEAF3_Ethernet1 + shutdown: false + mtu: 9214 + type: routed + flow_tracker: + sampled: FLOW-TRACKER + ip_address: 10.254.2.16/31 +- name: Ethernet7 + peer: flow-tracking-tests-leaf4 + peer_interface: Ethernet1 + peer_type: l3leaf + description: P2P_LINK_TO_FLOW-TRACKING-TESTS-LEAF4_Ethernet1 + shutdown: false + mtu: 9214 + type: routed + flow_tracker: + sampled: FLOW-TRACKER + ip_address: 10.254.2.20/31 +- name: Ethernet9 + peer: flow-tracking-tests-spine2 + peer_interface: Ethernet9 + peer_type: spine + description: P2P_LINK_TO_flow-tracking-tests-spine2_Ethernet9 + type: routed + shutdown: false + mtu: 9214 + flow_tracker: + sampled: FLOW-TRACKER +- name: Ethernet10 + peer: flow-tracking-tests-spine2 + peer_interface: Ethernet10 + peer_type: spine + description: P2P_LINK_TO_flow-tracking-tests-spine2_Ethernet10 + type: routed + shutdown: false + mtu: 9214 + flow_tracker: + sampled: FLOW-TRACKER-1 +- name: Ethernet11 + peer: flow-tracking-tests-spine2 + peer_interface: Ethernet11 + peer_type: spine + description: P2P_LINK_TO_flow-tracking-tests-spine2_Ethernet11 + type: routed + shutdown: false + mtu: 9214 +- name: Ethernet12 + peer: flow-tracking-tests-spine2 + peer_interface: Ethernet12 + peer_type: spine + description: P2P_LINK_TO_flow-tracking-tests-spine2_Ethernet12 + type: routed + shutdown: false + mtu: 9214 + flow_tracker: + sampled: FLOW-TRACKER +- name: Ethernet13 + peer: flow-tracking-tests-spine2 + peer_interface: Ethernet13 + peer_type: spine + description: P2P_LINK_TO_flow-tracking-tests-spine2_Ethernet13 + type: routed + shutdown: false + mtu: 9214 + flow_tracker: + sampled: FLOW-TRACKER +- name: Ethernet14 + peer: flow-tracking-tests-spine2 + peer_interface: Ethernet14 + peer_type: spine + description: P2P_LINK_TO_flow-tracking-tests-spine2_Ethernet14 + type: routed + shutdown: false + mtu: 9214 + flow_tracker: + sampled: FLOW-TRACKER-1 +- name: Ethernet15 + peer: flow-tracking-tests-spine2 + peer_interface: Ethernet15 + peer_type: spine + description: P2P_LINK_TO_flow-tracking-tests-spine2_Ethernet15 + type: routed + shutdown: false + mtu: 9214 +- name: Ethernet16 + peer: flow-tracking-tests-spine2 + peer_interface: Ethernet16 + peer_type: spine + description: P2P_LINK_TO_flow-tracking-tests-spine2_Ethernet16 + type: routed + shutdown: false + mtu: 9214 + flow_tracker: + sampled: FLOW-TRACKER +loopback_interfaces: +- name: Loopback0 + description: EVPN_Overlay_Peering + shutdown: false + ip_address: 10.255.0.1/32 +prefix_lists: +- name: PL-LOOPBACKS-EVPN-OVERLAY + sequence_numbers: + - sequence: 10 + action: permit 10.255.0.0/27 eq 32 +route_maps: +- name: RM-CONN-2-BGP + sequence_numbers: + - sequence: 10 + type: permit + match: + - ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY +router_bfd: + multihop: + interval: 300 + min_rx: 300 + multiplier: 3 +flow_tracking: + sampled: + sample: 10000 + trackers: + - name: FLOW-TRACKER + record_export: + on_inactive_timeout: 50001 + on_interval: 300332 + exporters: + - name: ayush_exporter + collector: + host: 127.0.0.2 + local_interface: Loopback0 + template_interval: 40002 + - name: FLOW-TRACKER-1 + record_export: + on_inactive_timeout: 50000 + on_interval: 300331 + mpls: true + exporters: + - name: ayush_exporter + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 40000 + table_size: 4331 + shutdown: false +metadata: + platform: vEOS-LAB diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/flow-tracking-tests-spine2.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/flow-tracking-tests-spine2.yml new file mode 100644 index 00000000000..446ad9f5bfb --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/flow-tracking-tests-spine2.yml @@ -0,0 +1,275 @@ +hostname: flow-tracking-tests-spine2 +is_deployed: true +router_bgp: + as: '65200' + router_id: 10.255.0.2 + bgp: + default: + ipv4_unicast: false + maximum_paths: + paths: 4 + ecmp: 4 + updates: + wait_install: true + peer_groups: + - name: IPv4-UNDERLAY-PEERS + type: ipv4 + maximum_routes: 12000 + send_community: all + - name: EVPN-OVERLAY-PEERS + type: evpn + update_source: Loopback0 + bfd: true + send_community: all + maximum_routes: 0 + ebgp_multihop: 3 + next_hop_unchanged: true + address_family_ipv4: + peer_groups: + - name: IPv4-UNDERLAY-PEERS + activate: true + - name: EVPN-OVERLAY-PEERS + activate: false + redistribute_routes: + - source_protocol: connected + route_map: RM-CONN-2-BGP + neighbors: + - ip_address: 10.254.2.3 + peer_group: IPv4-UNDERLAY-PEERS + remote_as: '65101' + peer: flow-tracking-tests-leaf1 + description: flow-tracking-tests-leaf1_Ethernet2 + - ip_address: 10.254.2.7 + peer_group: IPv4-UNDERLAY-PEERS + remote_as: '65102' + peer: flow-tracking-tests-leaf2 + description: flow-tracking-tests-leaf2_Ethernet2 + - ip_address: 10.254.2.19 + peer_group: IPv4-UNDERLAY-PEERS + remote_as: '65105' + peer: flow-tracking-tests-leaf3 + description: flow-tracking-tests-leaf3_Ethernet2 + - ip_address: 10.254.2.23 + peer_group: IPv4-UNDERLAY-PEERS + remote_as: '65105' + peer: flow-tracking-tests-leaf4 + description: flow-tracking-tests-leaf4_Ethernet2 + - ip_address: 10.254.1.1 + peer_group: EVPN-OVERLAY-PEERS + peer: flow-tracking-tests-leaf1 + description: flow-tracking-tests-leaf1 + remote_as: '65101' + - ip_address: 10.254.1.2 + peer_group: EVPN-OVERLAY-PEERS + peer: flow-tracking-tests-leaf2 + description: flow-tracking-tests-leaf2 + remote_as: '65102' + - ip_address: 10.254.1.5 + peer_group: EVPN-OVERLAY-PEERS + peer: flow-tracking-tests-leaf3 + description: flow-tracking-tests-leaf3 + remote_as: '65105' + - ip_address: 10.254.1.6 + peer_group: EVPN-OVERLAY-PEERS + peer: flow-tracking-tests-leaf4 + description: flow-tracking-tests-leaf4 + remote_as: '65105' + address_family_evpn: + peer_groups: + - name: EVPN-OVERLAY-PEERS + activate: true +static_routes: +- vrf: MGMT + destination_address_prefix: 0.0.0.0/0 + gateway: 192.168.0.1 +service_routing_protocols_model: multi-agent +ip_routing: true +vlan_internal_order: + allocation: ascending + range: + beginning: 1006 + ending: 1199 +spanning_tree: + mode: none +vrfs: +- name: MGMT + ip_routing: false +management_interfaces: +- name: Management1 + description: oob_management + shutdown: false + vrf: MGMT + ip_address: 192.168.0.21/24 + gateway: 192.168.0.1 + type: oob +management_api_http: + enable_vrfs: + - name: MGMT + enable_https: true +ethernet_interfaces: +- name: Ethernet2 + peer: flow-tracking-tests-leaf1 + peer_interface: Ethernet2 + peer_type: l3leaf + description: P2P_LINK_TO_FLOW-TRACKING-TESTS-LEAF1_Ethernet2 + shutdown: false + mtu: 9214 + type: routed + flow_tracker: + hardware: FLOW-TRACKER-2 + ip_address: 10.254.2.2/31 +- name: Ethernet4 + peer: flow-tracking-tests-leaf2 + peer_interface: Ethernet2 + peer_type: l3leaf + description: P2P_LINK_TO_FLOW-TRACKING-TESTS-LEAF2_Ethernet2 + shutdown: false + mtu: 9214 + type: routed + flow_tracker: + hardware: FLOW-TRACKER-2 + ip_address: 10.254.2.6/31 +- name: Ethernet6 + peer: flow-tracking-tests-leaf3 + peer_interface: Ethernet2 + peer_type: l3leaf + description: P2P_LINK_TO_FLOW-TRACKING-TESTS-LEAF3_Ethernet2 + shutdown: false + mtu: 9214 + type: routed + flow_tracker: + hardware: FLOW-TRACKER-2 + ip_address: 10.254.2.18/31 +- name: Ethernet8 + peer: flow-tracking-tests-leaf4 + peer_interface: Ethernet2 + peer_type: l3leaf + description: P2P_LINK_TO_FLOW-TRACKING-TESTS-LEAF4_Ethernet2 + shutdown: false + mtu: 9214 + type: routed + flow_tracker: + hardware: FLOW-TRACKER-2 + ip_address: 10.254.2.22/31 +- name: Ethernet9 + peer: flow-tracking-tests-spine1 + peer_interface: Ethernet9 + peer_type: spine + description: P2P_LINK_TO_flow-tracking-tests-spine1_Ethernet9 + type: routed + shutdown: false + mtu: 9214 + flow_tracker: + hardware: FLOW-TRACKER-2 +- name: Ethernet10 + peer: flow-tracking-tests-spine1 + peer_interface: Ethernet10 + peer_type: spine + description: P2P_LINK_TO_flow-tracking-tests-spine1_Ethernet10 + type: routed + shutdown: false + mtu: 9214 + flow_tracker: + hardware: FLOW-TRACKER-1 +- name: Ethernet11 + peer: flow-tracking-tests-spine1 + peer_interface: Ethernet11 + peer_type: spine + description: P2P_LINK_TO_flow-tracking-tests-spine1_Ethernet11 + type: routed + shutdown: false + mtu: 9214 +- name: Ethernet12 + peer: flow-tracking-tests-spine1 + peer_interface: Ethernet12 + peer_type: spine + description: P2P_LINK_TO_flow-tracking-tests-spine1_Ethernet12 + type: routed + shutdown: false + mtu: 9214 +- name: Ethernet13 + peer: flow-tracking-tests-spine1 + peer_interface: Ethernet13 + peer_type: spine + description: P2P_LINK_TO_flow-tracking-tests-spine1_Ethernet13 + type: routed + shutdown: false + mtu: 9214 + flow_tracker: + hardware: FLOW-TRACKER-2 +- name: Ethernet14 + peer: flow-tracking-tests-spine1 + peer_interface: Ethernet14 + peer_type: spine + description: P2P_LINK_TO_flow-tracking-tests-spine1_Ethernet14 + type: routed + shutdown: false + mtu: 9214 + flow_tracker: + hardware: FLOW-TRACKER-1 +- name: Ethernet15 + peer: flow-tracking-tests-spine1 + peer_interface: Ethernet15 + peer_type: spine + description: P2P_LINK_TO_flow-tracking-tests-spine1_Ethernet15 + type: routed + shutdown: false + mtu: 9214 +- name: Ethernet16 + peer: flow-tracking-tests-spine1 + peer_interface: Ethernet16 + peer_type: spine + description: P2P_LINK_TO_flow-tracking-tests-spine1_Ethernet16 + type: routed + shutdown: false + mtu: 9214 +loopback_interfaces: +- name: Loopback0 + description: EVPN_Overlay_Peering + shutdown: false + ip_address: 10.255.0.2/32 +prefix_lists: +- name: PL-LOOPBACKS-EVPN-OVERLAY + sequence_numbers: + - sequence: 10 + action: permit 10.255.0.0/27 eq 32 +route_maps: +- name: RM-CONN-2-BGP + sequence_numbers: + - sequence: 10 + type: permit + match: + - ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY +router_bfd: + multihop: + interval: 300 + min_rx: 300 + multiplier: 3 +flow_tracking: + hardware: + record: + format_ipfix_standard_timestamps_counters: true + trackers: + - name: FLOW-TRACKER-2 + record_export: + on_inactive_timeout: 50020 + on_interval: 300321 + exporters: + - name: ayush_exporter + collector: + host: 127.0.2.1 + local_interface: Loopback0 + template_interval: 40020 + - name: FLOW-TRACKER-1 + record_export: + on_inactive_timeout: 50000 + on_interval: 300331 + exporters: + - name: ayush_exporter + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 40000 + shutdown: false +metadata: + platform: vEOS-LAB diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/inband-mgmt-mlag-a.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/inband-mgmt-mlag-a.yml new file mode 100644 index 00000000000..5e67e90d1cb --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/inband-mgmt-mlag-a.yml @@ -0,0 +1,209 @@ +hostname: inband-mgmt-mlag-a +is_deployed: true +service_routing_protocols_model: multi-agent +vlan_internal_order: + allocation: ascending + range: + beginning: 1006 + ending: 1199 +vrfs: +- name: MGMT + ip_routing: false +management_api_http: + enable_vrfs: + - name: MGMT + enable_https: true +spanning_tree: + no_spanning_tree_vlan: '4094' +vlans: +- id: 4094 + tenant: system + name: MLAG_PEER + trunk_groups: + - MLAG +- id: 101 + tenant: system + name: INBAND_MGMT +vlan_interfaces: +- name: Vlan4094 + description: MLAG_PEER + shutdown: false + no_autostate: true + mtu: 9214 + ip_address: 100.64.0.200/31 +- name: Vlan101 + description: Inband Management + shutdown: false + mtu: 1500 + ip_address: 192.168.101.22/24 + type: inband_mgmt +port_channel_interfaces: +- name: Port-Channel11 + description: MLAG_PEER_inband-mgmt-mlag-b_Po11 + type: switched + shutdown: false + mode: trunk + trunk_groups: + - MLAG + lacp_fallback_mode: individual + lacp_fallback_timeout: 30 +- name: Port-Channel1 + description: INBAND-MGMT-PARENT_Po101 + type: switched + shutdown: false + mode: trunk + vlans: '101' + mlag: 1 +ethernet_interfaces: +- name: Ethernet11 + peer: inband-mgmt-mlag-b + peer_interface: Ethernet11 + peer_type: mlag_peer + description: MLAG_PEER_inband-mgmt-mlag-b_Ethernet11 + type: port-channel-member + shutdown: false + channel_group: + id: 11 + mode: active + mode: access + vlans: 101 +- name: Ethernet12 + peer: inband-mgmt-mlag-b + peer_interface: Ethernet12 + peer_type: mlag_peer + description: MLAG_PEER_inband-mgmt-mlag-b_Ethernet12 + type: port-channel-member + shutdown: false + channel_group: + id: 11 + mode: active + mode: access + vlans: 101 +- name: Ethernet13 + peer: inband-mgmt-mlag-b + peer_interface: Ethernet13 + peer_type: mlag_peer + description: MLAG_PEER_inband-mgmt-mlag-b_Ethernet13 + type: port-channel-member + shutdown: false + channel_group: + id: 11 + mode: active + mode: access + vlans: 101 +- name: Ethernet14 + peer: inband-mgmt-mlag-b + peer_interface: Ethernet14 + peer_type: mlag_peer + description: MLAG_PEER_inband-mgmt-mlag-b_Ethernet14 + type: port-channel-member + shutdown: false + channel_group: + id: 11 + mode: active + mode: access + vlans: 101 +- name: Ethernet15 + peer: inband-mgmt-mlag-b + peer_interface: Ethernet15 + peer_type: mlag_peer + description: MLAG_PEER_inband-mgmt-mlag-b_Ethernet15 + type: port-channel-member + shutdown: false + channel_group: + id: 11 + mode: active + mode: access + vlans: 101 +- name: Ethernet16 + peer: inband-mgmt-mlag-b + peer_interface: Ethernet16 + peer_type: mlag_peer + description: MLAG_PEER_inband-mgmt-mlag-b_Ethernet16 + type: port-channel-member + shutdown: false + channel_group: + id: 11 + mode: active + mode: access + vlans: 101 +- name: Ethernet17 + peer: inband-mgmt-mlag-b + peer_interface: Ethernet17 + peer_type: mlag_peer + description: MLAG_PEER_inband-mgmt-mlag-b_Ethernet17 + type: port-channel-member + shutdown: false + channel_group: + id: 11 + mode: active + mode: access + vlans: 101 +- name: Ethernet18 + peer: inband-mgmt-mlag-b + peer_interface: Ethernet18 + peer_type: mlag_peer + description: MLAG_PEER_inband-mgmt-mlag-b_Ethernet18 + type: port-channel-member + shutdown: false + channel_group: + id: 11 + mode: active + mode: access + vlans: 101 +- name: Ethernet19 + peer: inband-mgmt-mlag-b + peer_interface: Ethernet19 + peer_type: mlag_peer + description: MLAG_PEER_inband-mgmt-mlag-b_Ethernet19 + type: port-channel-member + shutdown: false + channel_group: + id: 11 + mode: active + mode: access + vlans: 101 +- name: Ethernet20 + peer: inband-mgmt-mlag-b + peer_interface: Ethernet20 + peer_type: mlag_peer + description: MLAG_PEER_inband-mgmt-mlag-b_Ethernet20 + type: port-channel-member + shutdown: false + channel_group: + id: 11 + mode: active + mode: access + vlans: 101 +- name: Ethernet1 + peer: inband-mgmt-parent + peer_interface: Ethernet101 + peer_type: l3leaf + description: INBAND-MGMT-PARENT_Ethernet101 + shutdown: false + type: port-channel-member + channel_group: + id: 1 + mode: active +- name: Ethernet2 + peer: inband-mgmt-parent-vrf + peer_interface: Ethernet101 + peer_type: l3leaf + description: INBAND-MGMT-PARENT-VRF_Ethernet101 + shutdown: false + type: port-channel-member + channel_group: + id: 1 + mode: active +mlag_configuration: + domain_id: inband-mgmt-mlag-test + local_interface: Vlan4094 + peer_address: 100.64.0.201 + peer_link: Port-Channel11 + reload_delay_mlag: '300' + reload_delay_non_mlag: '330' +ip_igmp_snooping: + globally_enabled: true +static_routes: +- destination_address_prefix: 0.0.0.0/0 + gateway: 192.168.101.21 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/inband-mgmt-mlag-b.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/inband-mgmt-mlag-b.yml new file mode 100644 index 00000000000..a30cf390cf9 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/inband-mgmt-mlag-b.yml @@ -0,0 +1,209 @@ +hostname: inband-mgmt-mlag-b +is_deployed: true +service_routing_protocols_model: multi-agent +vlan_internal_order: + allocation: ascending + range: + beginning: 1006 + ending: 1199 +vrfs: +- name: MGMT + ip_routing: false +management_api_http: + enable_vrfs: + - name: MGMT + enable_https: true +spanning_tree: + no_spanning_tree_vlan: '4094' +vlans: +- id: 4094 + tenant: system + name: MLAG_PEER + trunk_groups: + - MLAG +- id: 101 + tenant: system + name: INBAND_MGMT +vlan_interfaces: +- name: Vlan4094 + description: MLAG_PEER + shutdown: false + no_autostate: true + mtu: 9214 + ip_address: 100.64.0.201/31 +- name: Vlan101 + description: Inband Management + shutdown: false + mtu: 1500 + ip_address: 192.168.101.23/24 + type: inband_mgmt +port_channel_interfaces: +- name: Port-Channel11 + description: MLAG_PEER_inband-mgmt-mlag-a_Po11 + type: switched + shutdown: false + mode: trunk + trunk_groups: + - MLAG + lacp_fallback_mode: individual + lacp_fallback_timeout: 30 +- name: Port-Channel1 + description: INBAND-MGMT-PARENT_Po101 + type: switched + shutdown: false + mode: trunk + vlans: '101' + mlag: 1 +ethernet_interfaces: +- name: Ethernet11 + peer: inband-mgmt-mlag-a + peer_interface: Ethernet11 + peer_type: mlag_peer + description: MLAG_PEER_inband-mgmt-mlag-a_Ethernet11 + type: port-channel-member + shutdown: false + channel_group: + id: 11 + mode: active + mode: access + vlans: 101 +- name: Ethernet12 + peer: inband-mgmt-mlag-a + peer_interface: Ethernet12 + peer_type: mlag_peer + description: MLAG_PEER_inband-mgmt-mlag-a_Ethernet12 + type: port-channel-member + shutdown: false + channel_group: + id: 11 + mode: active + mode: access + vlans: 101 +- name: Ethernet13 + peer: inband-mgmt-mlag-a + peer_interface: Ethernet13 + peer_type: mlag_peer + description: MLAG_PEER_inband-mgmt-mlag-a_Ethernet13 + type: port-channel-member + shutdown: false + channel_group: + id: 11 + mode: active + mode: access + vlans: 101 +- name: Ethernet14 + peer: inband-mgmt-mlag-a + peer_interface: Ethernet14 + peer_type: mlag_peer + description: MLAG_PEER_inband-mgmt-mlag-a_Ethernet14 + type: port-channel-member + shutdown: false + channel_group: + id: 11 + mode: active + mode: access + vlans: 101 +- name: Ethernet15 + peer: inband-mgmt-mlag-a + peer_interface: Ethernet15 + peer_type: mlag_peer + description: MLAG_PEER_inband-mgmt-mlag-a_Ethernet15 + type: port-channel-member + shutdown: false + channel_group: + id: 11 + mode: active + mode: access + vlans: 101 +- name: Ethernet16 + peer: inband-mgmt-mlag-a + peer_interface: Ethernet16 + peer_type: mlag_peer + description: MLAG_PEER_inband-mgmt-mlag-a_Ethernet16 + type: port-channel-member + shutdown: false + channel_group: + id: 11 + mode: active + mode: access + vlans: 101 +- name: Ethernet17 + peer: inband-mgmt-mlag-a + peer_interface: Ethernet17 + peer_type: mlag_peer + description: MLAG_PEER_inband-mgmt-mlag-a_Ethernet17 + type: port-channel-member + shutdown: false + channel_group: + id: 11 + mode: active + mode: access + vlans: 101 +- name: Ethernet18 + peer: inband-mgmt-mlag-a + peer_interface: Ethernet18 + peer_type: mlag_peer + description: MLAG_PEER_inband-mgmt-mlag-a_Ethernet18 + type: port-channel-member + shutdown: false + channel_group: + id: 11 + mode: active + mode: access + vlans: 101 +- name: Ethernet19 + peer: inband-mgmt-mlag-a + peer_interface: Ethernet19 + peer_type: mlag_peer + description: MLAG_PEER_inband-mgmt-mlag-a_Ethernet19 + type: port-channel-member + shutdown: false + channel_group: + id: 11 + mode: active + mode: access + vlans: 101 +- name: Ethernet20 + peer: inband-mgmt-mlag-a + peer_interface: Ethernet20 + peer_type: mlag_peer + description: MLAG_PEER_inband-mgmt-mlag-a_Ethernet20 + type: port-channel-member + shutdown: false + channel_group: + id: 11 + mode: active + mode: access + vlans: 101 +- name: Ethernet1 + peer: inband-mgmt-parent + peer_interface: Ethernet102 + peer_type: l3leaf + description: INBAND-MGMT-PARENT_Ethernet102 + shutdown: false + type: port-channel-member + channel_group: + id: 1 + mode: active +- name: Ethernet2 + peer: inband-mgmt-parent-vrf + peer_interface: Ethernet102 + peer_type: l3leaf + description: INBAND-MGMT-PARENT-VRF_Ethernet102 + shutdown: false + type: port-channel-member + channel_group: + id: 1 + mode: active +mlag_configuration: + domain_id: inband-mgmt-mlag-test + local_interface: Vlan4094 + peer_address: 100.64.0.200 + peer_link: Port-Channel11 + reload_delay_mlag: '300' + reload_delay_non_mlag: '330' +ip_igmp_snooping: + globally_enabled: true +static_routes: +- destination_address_prefix: 0.0.0.0/0 + gateway: 192.168.101.21 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/inband-mgmt-parent-dualstack1.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/inband-mgmt-parent-dualstack1.yml index f1dedec40b2..d33c2e7d1bd 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/inband-mgmt-parent-dualstack1.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/inband-mgmt-parent-dualstack1.yml @@ -123,9 +123,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 100.64.0.4/31 no_autostate: true mtu: 9214 + ip_address: 100.64.0.4/31 - name: Vlan105 tenant: INBAND_MGMT_TESTS description: Inband_management_vlan_ipv6 @@ -188,6 +188,8 @@ port_channel_interfaces: mode: trunk vlans: '105' mlag: 25 + lacp_fallback_mode: individual + lacp_fallback_timeout: 30 ethernet_interfaces: - name: Ethernet11 peer: inband-mgmt-parent-dualstack2 @@ -311,6 +313,8 @@ ethernet_interfaces: channel_group: id: 25 mode: active + mode: access + vlans: 105 mlag_configuration: domain_id: inband-mgmt-parents-dualstack local_interface: Vlan4094 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/inband-mgmt-parent-dualstack2.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/inband-mgmt-parent-dualstack2.yml index 206ec9258fe..7226175669f 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/inband-mgmt-parent-dualstack2.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/inband-mgmt-parent-dualstack2.yml @@ -123,9 +123,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 100.64.0.5/31 no_autostate: true mtu: 9214 + ip_address: 100.64.0.5/31 - name: Vlan105 tenant: INBAND_MGMT_TESTS description: Inband_management_vlan_ipv6 @@ -188,6 +188,8 @@ port_channel_interfaces: mode: trunk vlans: '105' mlag: 25 + lacp_fallback_mode: individual + lacp_fallback_timeout: 30 ethernet_interfaces: - name: Ethernet11 peer: inband-mgmt-parent-dualstack1 @@ -311,6 +313,8 @@ ethernet_interfaces: channel_group: id: 25 mode: active + mode: access + vlans: 105 mlag_configuration: domain_id: inband-mgmt-parents-dualstack local_interface: Vlan4094 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/inband-mgmt-parent-ipv6-1.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/inband-mgmt-parent-ipv6-1.yml index ab19f1261e4..19146fbe5e8 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/inband-mgmt-parent-ipv6-1.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/inband-mgmt-parent-ipv6-1.yml @@ -94,9 +94,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 100.64.0.8/31 no_autostate: true mtu: 9214 + ip_address: 100.64.0.8/31 - name: Vlan106 description: Inband Management shutdown: false diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/inband-mgmt-parent-ipv6-2.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/inband-mgmt-parent-ipv6-2.yml index 02a61d4e77f..ae13578ad88 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/inband-mgmt-parent-ipv6-2.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/inband-mgmt-parent-ipv6-2.yml @@ -94,9 +94,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 100.64.0.9/31 no_autostate: true mtu: 9214 + ip_address: 100.64.0.9/31 - name: Vlan106 description: Inband Management shutdown: false diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/inband-mgmt-parent-vrf.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/inband-mgmt-parent-vrf.yml index 17753eb51f5..e44916a2d30 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/inband-mgmt-parent-vrf.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/inband-mgmt-parent-vrf.yml @@ -103,6 +103,30 @@ ethernet_interfaces: channel_group: id: 23 mode: active +- name: Ethernet101 + peer: inband-mgmt-mlag-a + peer_interface: Ethernet2 + peer_type: l2leaf + description: INBAND-MGMT-MLAG-A_Ethernet2 + shutdown: false + type: port-channel-member + channel_group: + id: 101 + mode: active + mode: access + vlans: 101 +- name: Ethernet102 + peer: inband-mgmt-mlag-b + peer_interface: Ethernet2 + peer_type: l2leaf + description: INBAND-MGMT-MLAG-B_Ethernet2 + shutdown: false + type: port-channel-member + channel_group: + id: 101 + mode: active + mode: access + vlans: 101 port_channel_interfaces: - name: Port-Channel21 description: INBAND-MGMT-SUBNET_Po1 @@ -126,6 +150,14 @@ port_channel_interfaces: shutdown: false mode: trunk vlans: '103' +- name: Port-Channel101 + description: INBAND-MGMT-MLAG-TEST_Po1 + type: switched + shutdown: false + mode: trunk + vlans: '101' + lacp_fallback_mode: individual + lacp_fallback_timeout: 30 loopback_interfaces: - name: Loopback0 description: EVPN_Overlay_Peering diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/inband-mgmt-parent.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/inband-mgmt-parent.yml index db45a5decb1..e1575bd2b3e 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/inband-mgmt-parent.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/inband-mgmt-parent.yml @@ -104,6 +104,30 @@ ethernet_interfaces: channel_group: id: 23 mode: active +- name: Ethernet101 + peer: inband-mgmt-mlag-a + peer_interface: Ethernet1 + peer_type: l2leaf + description: INBAND-MGMT-MLAG-A_Ethernet1 + shutdown: false + type: port-channel-member + channel_group: + id: 101 + mode: active + mode: access + vlans: 101 +- name: Ethernet102 + peer: inband-mgmt-mlag-b + peer_interface: Ethernet1 + peer_type: l2leaf + description: INBAND-MGMT-MLAG-B_Ethernet1 + shutdown: false + type: port-channel-member + channel_group: + id: 101 + mode: active + mode: access + vlans: 101 port_channel_interfaces: - name: Port-Channel21 description: INBAND-MGMT-SUBNET_Po1 @@ -127,6 +151,14 @@ port_channel_interfaces: shutdown: false mode: trunk vlans: '103' +- name: Port-Channel101 + description: INBAND-MGMT-MLAG-TEST_Po1 + type: switched + shutdown: false + mode: trunk + vlans: '101' + lacp_fallback_mode: individual + lacp_fallback_timeout: 30 loopback_interfaces: - name: Loopback0 description: EVPN_Overlay_Peering diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/ipv4-acls.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/ipv4-acls.yml index 7c26d462b99..af2f09fe3e7 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/ipv4-acls.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/ipv4-acls.yml @@ -84,6 +84,23 @@ ethernet_interfaces: type: routed access_group_in: TEST-IPV4-ACL-WITH-NO-FIELDS-IN access_group_out: TEST-IPV4-ACL-WITH-NO-FIELDS-OUT +- name: Ethernet5/1 + peer_type: l3_interface + ip_address: 172.20.20.0/31 + shutdown: false + type: routed + access_group_in: TEST-IPV4-ACL-WITH-IP-FIELDS-IN_Ethernet5_1 +- name: Ethernet6/6.6 + peer_type: l3_interface + ip_address: 172.21.21.0/31 + shutdown: false + type: l3dot1q + access_group_out: TEST-IPV4-ACL-WITH-IP-FIELDS-OUT_Ethernet6_6.6 + encapsulation_dot1q_vlan: 6 +- name: Ethernet6/6 + type: routed + peer_type: l3_interface + shutdown: false loopback_interfaces: - name: Loopback0 description: EVPN_Overlay_Peering @@ -124,6 +141,17 @@ ip_access_lists: protocol: ip source: 172.17.17.1 destination: 172.17.17.17 +- name: TEST-IPV4-ACL-WITH-IP-FIELDS-IN_Ethernet5_1 + entries: + - sequence: 15 + action: deny + protocol: ip + source: any + destination: 172.20.20.0 + - action: permit + protocol: ip + source: 172.20.20.1/30 + destination: 172.20.20.0 - name: TEST-IPV4-ACL-WITH-IP-FIELDS-OUT_Ethernet1 entries: - remark: Some remark will not require source and destination fields. @@ -138,6 +166,13 @@ ip_access_lists: protocol: ip source: 172.17.17.17 destination: any +- name: TEST-IPV4-ACL-WITH-IP-FIELDS-OUT_Ethernet6_6.6 + entries: + - remark: Some remark will not require source and destination fields. + - action: permit + protocol: ip + source: 172.21.21.0 + destination: any - name: TEST-IPV4-ACL-WITH-NO-FIELDS-IN entries: - action: permit diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/l3_edge_isis.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/l3_edge_isis.yml index 8aa9f29df30..afde48e1e85 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/l3_edge_isis.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/l3_edge_isis.yml @@ -58,6 +58,7 @@ ethernet_interfaces: mtu: 9214 ip_address: 192.168.0.2/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 60 isis_network_point_to_point: true isis_hello_padding: false @@ -74,6 +75,7 @@ ethernet_interfaces: mtu: 9214 ip_address: 192.168.0.4/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_hello_padding: true @@ -88,6 +90,7 @@ ethernet_interfaces: mtu: 9214 ip_address: 192.168.0.6/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_hello_padding: true diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/l3_edge_multicast.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/l3_edge_multicast.yml new file mode 100644 index 00000000000..8ef312c8b75 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/l3_edge_multicast.yml @@ -0,0 +1,63 @@ +hostname: l3_edge_multicast +is_deployed: true +service_routing_protocols_model: multi-agent +ip_routing: true +router_multicast: + ipv4: + routing: true +vlan_internal_order: + allocation: ascending + range: + beginning: 1006 + ending: 1199 +spanning_tree: + mode: none +vrfs: +- name: MGMT + ip_routing: false +management_api_http: + enable_vrfs: + - name: MGMT + enable_https: true +loopback_interfaces: +- name: Loopback0 + description: EVPN_Overlay_Peering + shutdown: false + ip_address: 1.2.3.1/32 + ospf_area: 0.0.0.0 +router_ospf: + process_ids: + - id: 100 + passive_interface_default: true + router_id: 1.2.3.1 + max_lsa: 12000 + no_passive_interfaces: + - ethernet1 + - ethernet2 + bfd_enable: false +ethernet_interfaces: +- name: ethernet1 + peer: peer1 + peer_interface: ethernet1 + peer_type: other + description: P2P_LINK_TO_peer1_ethernet1 + type: routed + shutdown: false + mtu: 9214 + ip_address: 192.168.0.4/31 + ospf_network_point_to_point: true + ospf_area: 0.0.0.0 +- name: ethernet2 + peer: peer2 + peer_interface: ethernet2 + peer_type: other + description: P2P_LINK_TO_peer2_ethernet2 + type: routed + shutdown: false + mtu: 9214 + ip_address: 192.168.0.2/31 + pim: + ipv4: + sparse_mode: true + ospf_network_point_to_point: true + ospf_area: 0.0.0.0 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/mgmt_interface_default.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/mgmt_interface_default.yml index f415c3dbc0a..9d185753804 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/mgmt_interface_default.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/mgmt_interface_default.yml @@ -25,6 +25,10 @@ ip_name_servers: vrf: MGMT - ip_address: 8.8.8.8 vrf: MGMT +- ip_address: 2001:db8::1 + vrf: MGMT +- ip_address: 2001:db8::2 + vrf: MGMT local_users: - name: admin disabled: true @@ -63,6 +67,8 @@ ntp: - name: 192.168.200.5 vrf: MGMT preferred: true + - name: 2001:db8::3 + vrf: MGMT snmp_server: contact: example@example.com location: EOS_DESIGNS_UNIT_TESTS mgmt_interface_default diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/mgmt_interface_description.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/mgmt_interface_description.yml index 9ff8edb7218..94bc26fb29d 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/mgmt_interface_description.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/mgmt_interface_description.yml @@ -3,7 +3,7 @@ is_deployed: true static_routes: - vrf: MGMT destination_address_prefix: 0.0.0.0/0 - gateway: 1.1.1.1 + gateway: 1.1.1.254 service_routing_protocols_model: multi-agent vlan_internal_order: allocation: ascending @@ -18,8 +18,8 @@ management_interfaces: description: Custom Management Interface Description shutdown: false vrf: MGMT - ip_address: 1.1.1.2 - gateway: 1.1.1.1 + ip_address: 1.1.1.2/24 + gateway: 1.1.1.254 type: oob management_api_http: enable_vrfs: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/mgmt_interface_fabric.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/mgmt_interface_fabric.yml index a0550e6234c..17abebaa89e 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/mgmt_interface_fabric.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/mgmt_interface_fabric.yml @@ -25,6 +25,10 @@ ip_name_servers: vrf: MGMT - ip_address: 8.8.8.8 vrf: MGMT +- ip_address: 2001:db8::1 + vrf: MGMT +- ip_address: 2001:db8::2 + vrf: MGMT local_users: - name: admin disabled: true @@ -63,6 +67,8 @@ ntp: - name: 192.168.200.5 vrf: MGMT preferred: true + - name: 2001:db8::3 + vrf: MGMT snmp_server: contact: example@example.com location: EOS_DESIGNS_UNIT_TESTS mgmt_interface_fabric diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/mgmt_interface_host.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/mgmt_interface_host.yml index c6c1f286b55..155e68cab27 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/mgmt_interface_host.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/mgmt_interface_host.yml @@ -25,6 +25,10 @@ ip_name_servers: vrf: MGMT - ip_address: 8.8.8.8 vrf: MGMT +- ip_address: 2001:db8::1 + vrf: MGMT +- ip_address: 2001:db8::2 + vrf: MGMT local_users: - name: admin disabled: true @@ -69,6 +73,8 @@ ntp: - name: 192.168.200.5 vrf: MGMT preferred: true + - name: 2001:db8::3 + vrf: MGMT snmp_server: contact: example@example.com location: EOS_DESIGNS_UNIT_TESTS mgmt_interface_host diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/mgmt_interface_ipv6.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/mgmt_interface_ipv6.yml index 42bed63ec21..74a6cdc3d1e 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/mgmt_interface_ipv6.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/mgmt_interface_ipv6.yml @@ -3,7 +3,7 @@ is_deployed: true ipv6_static_routes: - vrf: MGMT destination_address_prefix: ::/0 - gateway: 0200::1 + gateway: 0200::2 service_routing_protocols_model: multi-agent vlan_internal_order: allocation: ascending @@ -24,7 +24,7 @@ management_interfaces: type: oob ipv6_enable: true ipv6_address: 0200::105/64 - ipv6_gateway: 0200::1 + ipv6_gateway: 0200::2 management_api_http: enable_vrfs: - name: MGMT diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/mgmt_interface_platform.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/mgmt_interface_platform.yml index 86639c9e292..f2c089c4008 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/mgmt_interface_platform.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/mgmt_interface_platform.yml @@ -25,6 +25,10 @@ ip_name_servers: vrf: MGMT - ip_address: 8.8.8.8 vrf: MGMT +- ip_address: 2001:db8::1 + vrf: MGMT +- ip_address: 2001:db8::2 + vrf: MGMT local_users: - name: admin disabled: true @@ -69,6 +73,8 @@ ntp: - name: 192.168.200.5 vrf: MGMT preferred: true + - name: 2001:db8::3 + vrf: MGMT snmp_server: contact: example@example.com location: EOS_DESIGNS_UNIT_TESTS mgmt_interface_platform diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/network-ports-tests-2.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/network-ports-tests-2.yml index 67316aace41..d2918769587 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/network-ports-tests-2.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/network-ports-tests-2.yml @@ -35,9 +35,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.1/31 no_autostate: true mtu: 9214 + ip_address: 10.255.252.1/31 port_channel_interfaces: - name: Port-Channel101 description: MLAG_PEER_network-ports-tests.1_Po101 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/network-ports-tests.1.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/network-ports-tests.1.yml index 174dd455bd4..4122a420825 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/network-ports-tests.1.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/network-ports-tests.1.yml @@ -38,9 +38,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.0/31 no_autostate: true mtu: 9214 + ip_address: 10.255.252.0/31 port_channel_interfaces: - name: Port-Channel101 description: MLAG_PEER_network-ports-tests-2_Po101 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/platform_settings.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/platform_settings.yml index c7571193430..bbb461b8f65 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/platform_settings.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/platform_settings.yml @@ -9,6 +9,12 @@ vlan_internal_order: vrfs: - name: MGMT ip_routing: false +management_security: + entropy_sources: + hardware: true + haveged: true + cpu_jitter: true + hardware_exclusive: true management_api_http: enable_vrfs: - name: MGMT diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/ptp-tests-leaf1.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/ptp-tests-leaf1.yml index 4a9a32b3ef8..57909c6d5b6 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/ptp-tests-leaf1.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/ptp-tests-leaf1.yml @@ -173,9 +173,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.254.1.64/31 no_autostate: true mtu: 9214 + ip_address: 10.254.1.64/31 - name: Vlan11 tenant: PTP description: VLAN11 @@ -238,6 +238,24 @@ port_channel_interfaces: mode: trunk vlans: '11' mlag: 14 +- name: Port-Channel6 + description: Endpoint-with-mpass + type: switched + shutdown: false + ptp: + announce: + interval: 0 + timeout: 3 + delay_req: -3 + sync_message: + interval: -3 + transport: ipv4 + enable: true + role: master + mpass: true + mode: access + vlans: '11' + mlag: 6 ethernet_interfaces: - name: Ethernet9 peer: ptp-tests-leaf2 @@ -364,6 +382,16 @@ ethernet_interfaces: transport: ipv4 enable: true role: master +- name: Ethernet6 + peer: Endpoint-with-mpass + peer_interface: PCI1 + peer_type: server + description: Endpoint-with-mpass_PCI1 + shutdown: false + type: port-channel-member + channel_group: + id: 6 + mode: active - name: Ethernet3 peer: Endpoint-with-specific-PTP-profile peer_interface: eth3 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/ptp-tests-leaf2.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/ptp-tests-leaf2.yml index 2347e9e35f8..bc20876d01b 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/ptp-tests-leaf2.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/ptp-tests-leaf2.yml @@ -184,9 +184,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.254.1.65/31 no_autostate: true mtu: 9214 + ip_address: 10.254.1.65/31 - name: Vlan11 tenant: PTP description: VLAN11 @@ -249,6 +249,24 @@ port_channel_interfaces: mode: trunk vlans: '11' mlag: 14 +- name: Port-Channel6 + description: Endpoint-with-mpass + type: switched + shutdown: false + ptp: + announce: + interval: 0 + timeout: 3 + delay_req: -3 + sync_message: + interval: -3 + transport: ipv4 + enable: true + role: master + mpass: true + mode: access + vlans: '11' + mlag: 6 ethernet_interfaces: - name: Ethernet9 peer: ptp-tests-leaf1 @@ -356,6 +374,16 @@ ethernet_interfaces: transport: ipv4 enable: true role: master +- name: Ethernet6 + peer: Endpoint-with-mpass + peer_interface: PCI2 + peer_type: server + description: Endpoint-with-mpass_PCI2 + shutdown: false + type: port-channel-member + channel_group: + id: 6 + mode: active mlag_configuration: domain_id: ptp-test-leaf local_interface: Vlan4094 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/sflow-tests-l2-leaf1.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/sflow-tests-l2-leaf1.yml index 061fc6c4b57..eb33b5dc466 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/sflow-tests-l2-leaf1.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/sflow-tests-l2-leaf1.yml @@ -75,6 +75,7 @@ vlan_interfaces: type: inband_mgmt sflow: run: true + sample: 10 destinations: - destination: 10.10.10.10 - destination: 10.10.10.11 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/sflow-tests-l2-leaf2.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/sflow-tests-l2-leaf2.yml index b3601ed19d5..b5ae21162ae 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/sflow-tests-l2-leaf2.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/sflow-tests-l2-leaf2.yml @@ -75,6 +75,7 @@ vlan_interfaces: type: inband_mgmt sflow: run: true + sample: 10 destinations: - destination: 10.10.10.10 - destination: 10.10.10.11 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/sflow-tests-leaf3.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/sflow-tests-leaf3.yml index a54c29e2a1c..9ac997891a0 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/sflow-tests-leaf3.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/sflow-tests-leaf3.yml @@ -158,9 +158,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.254.1.72/31 no_autostate: true mtu: 9214 + ip_address: 10.254.1.72/31 - name: Vlan11 tenant: SFLOW description: VLAN11 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/sflow-tests-leaf4.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/sflow-tests-leaf4.yml index 895742939dc..55609f9b1b5 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/sflow-tests-leaf4.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/sflow-tests-leaf4.yml @@ -158,9 +158,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.254.1.73/31 no_autostate: true mtu: 9214 + ip_address: 10.254.1.73/31 - name: Vlan11 tenant: SFLOW description: VLAN11 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/trunk-group-tests-l2leaf1a.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/trunk-group-tests-l2leaf1a.yml index 8dd673b4dc1..1071c09fd28 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/trunk-group-tests-l2leaf1a.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/trunk-group-tests-l2leaf1a.yml @@ -89,9 +89,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.248.0/31 no_autostate: true mtu: 9214 + ip_address: 10.255.248.0/31 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_trunk-group-tests-l2leaf1b_Po3 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/trunk-group-tests-l2leaf1b.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/trunk-group-tests-l2leaf1b.yml index d07cdadc360..e8eb96f38ce 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/trunk-group-tests-l2leaf1b.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/trunk-group-tests-l2leaf1b.yml @@ -81,9 +81,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.248.1/31 no_autostate: true mtu: 9214 + ip_address: 10.255.248.1/31 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_trunk-group-tests-l2leaf1a_Po3 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/trunk-group-tests-l3leaf1a.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/trunk-group-tests-l3leaf1a.yml index 2c3b0b8c8d2..1084ea00856 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/trunk-group-tests-l3leaf1a.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/trunk-group-tests-l3leaf1a.yml @@ -330,9 +330,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.248.0/31 no_autostate: true mtu: 9214 + ip_address: 10.255.248.0/31 - name: Vlan100 tenant: TRUNK_GROUP_TESTS tags: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/trunk-group-tests-l3leaf1b.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/trunk-group-tests-l3leaf1b.yml index 9b19cbbf04b..4ee28129c48 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/trunk-group-tests-l3leaf1b.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/trunk-group-tests-l3leaf1b.yml @@ -318,9 +318,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.248.1/31 no_autostate: true mtu: 9214 + ip_address: 10.255.248.1/31 - name: Vlan100 tenant: TRUNK_GROUP_TESTS tags: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/trunk-group-tests-l3leaf2a.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/trunk-group-tests-l3leaf2a.yml index 7d4bf9c9516..0d2c5427aae 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/trunk-group-tests-l3leaf2a.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/trunk-group-tests-l3leaf2a.yml @@ -152,9 +152,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.248.4/31 no_autostate: true mtu: 9214 + ip_address: 10.255.248.4/31 - name: Vlan200 tenant: TRUNK_GROUP_TESTS tags: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/trunk-group-tests-l3leaf2b.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/trunk-group-tests-l3leaf2b.yml index ea3ade94357..2ae87ae0c53 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/trunk-group-tests-l3leaf2b.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/trunk-group-tests-l3leaf2b.yml @@ -148,9 +148,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.248.5/31 no_autostate: true mtu: 9214 + ip_address: 10.255.248.5/31 - name: Vlan200 tenant: TRUNK_GROUP_TESTS tags: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/uplink_lan_l2leaf.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/uplink_lan_l2leaf.yml index 14d4c425fef..b9d5c913edb 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/uplink_lan_l2leaf.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/uplink_lan_l2leaf.yml @@ -25,6 +25,8 @@ ethernet_interfaces: mode: trunk native_vlan: 10 spanning_tree_portfast: edge + flow_tracker: + sampled: FLOW-TRACKER - name: Ethernet2 peer: uplink_lan_wan_router2 peer_interface: Ethernet2 @@ -35,6 +37,8 @@ ethernet_interfaces: vlans: 10,100 mode: trunk spanning_tree_portfast: edge + flow_tracker: + sampled: FLOW-TRACKER vlans: - id: 10 name: VLAN10_NATIVE @@ -47,3 +51,18 @@ vlans: tenant: TEST ip_igmp_snooping: globally_enabled: true +flow_tracking: + sampled: + sample: 10000 + trackers: + - name: FLOW-TRACKER + record_export: + on_inactive_timeout: 70000 + on_interval: 300000 + exporters: + - name: CV-TELEMETRY + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 3600000 + shutdown: false diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/uplink_lan_wan_router1.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/uplink_lan_wan_router1.yml index 2570141ae16..0e36a5d23fe 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/uplink_lan_wan_router1.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/uplink_lan_wan_router1.yml @@ -110,6 +110,8 @@ ethernet_interfaces: vrf: VRF1 ip_address: 10.0.10.1/24 mtu: 9214 + flow_tracker: + hardware: FLOW-TRACKER - name: Ethernet2.100 peer: uplink_lan_l2leaf peer_interface: Ethernet1 VLAN 100 @@ -123,6 +125,8 @@ ethernet_interfaces: ipv6_address: cafe::cafe/64 ipv6_enable: true eos_cli: comment yo + flow_tracker: + hardware: FLOW-TRACKER _custom_key: custom_value - name: Ethernet1 peer_type: l3_interface @@ -174,20 +178,6 @@ agents: environment_variables: - name: KERNELFIB_PROGRAM_ALL_ECMP value: '1' -flow_tracking: - hardware: - trackers: - - name: FLOW-TRACKER - record_export: - on_inactive_timeout: 70000 - on_interval: 300000 - exporters: - - name: CV-TELEMETRY - collector: - host: 127.0.0.1 - local_interface: Loopback0 - template_interval: 3600000 - shutdown: false ip_extcommunity_lists: - name: ECL-EVPN-SOO entries: @@ -319,6 +309,20 @@ vxlan_interface: vni: 123 - name: default vni: 1 +flow_tracking: + hardware: + trackers: + - name: FLOW-TRACKER + record_export: + on_inactive_timeout: 70000 + on_interval: 300000 + exporters: + - name: CV-TELEMETRY + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 3600000 + shutdown: false metadata: cv_tags: device_tags: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/uplink_lan_wan_router2.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/uplink_lan_wan_router2.yml index df7418a2f30..5e40031bc8b 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/uplink_lan_wan_router2.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/intended/structured_configs/uplink_lan_wan_router2.yml @@ -119,6 +119,8 @@ ethernet_interfaces: vrf: VRF1 ip_address: 10.0.10.1/24 mtu: 9214 + flow_tracker: + hardware: FLOW-TRACKER - name: Ethernet2.100 peer: uplink_lan_l2leaf peer_interface: Ethernet2 VLAN 100 @@ -132,6 +134,8 @@ ethernet_interfaces: ipv6_address: cafe::cafe/64 ipv6_enable: true eos_cli: comment yo + flow_tracker: + hardware: FLOW-TRACKER _custom_key: custom_value - name: Ethernet1 peer_type: l3_interface @@ -183,20 +187,6 @@ agents: environment_variables: - name: KERNELFIB_PROGRAM_ALL_ECMP value: '1' -flow_tracking: - hardware: - trackers: - - name: FLOW-TRACKER - record_export: - on_inactive_timeout: 70000 - on_interval: 300000 - exporters: - - name: CV-TELEMETRY - collector: - host: 127.0.0.1 - local_interface: Loopback0 - template_interval: 3600000 - shutdown: false ip_extcommunity_lists: - name: ECL-EVPN-SOO entries: @@ -328,6 +318,20 @@ vxlan_interface: vni: 123 - name: default vni: 1 +flow_tracking: + hardware: + trackers: + - name: FLOW-TRACKER + record_export: + on_inactive_timeout: 70000 + on_interval: 300000 + exporters: + - name: CV-TELEMETRY + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 3600000 + shutdown: false metadata: cv_tags: device_tags: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/AVD_LAB.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/AVD_LAB.yml index c8f0e21a625..8f7ca124fdb 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/AVD_LAB.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/AVD_LAB.yml @@ -34,6 +34,8 @@ mgmt_gateway: 192.168.200.5 name_servers: - 192.168.200.5 - 8.8.8.8 + - 2001:db8::1 + - 2001:db8::2 # Management api-http management_eapi: @@ -45,6 +47,7 @@ ntp_settings: server_vrf: use_mgmt_interface_vrf servers: - name: 192.168.200.5 + - name: 2001:db8::3 # Support for per-platform automatic interface allocation default_interfaces: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/CORE_UNIT_TESTS.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/CORE_UNIT_TESTS.yml index f70a4c4f8bb..9411d54e74d 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/CORE_UNIT_TESTS.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/CORE_UNIT_TESTS.yml @@ -47,6 +47,8 @@ core_router: id: 2 - name: core-3-isis-sr-ldp id: 3 + - name: core-4-multicast + id: 4 core_interfaces: p2p_links_ip_pools: @@ -144,6 +146,31 @@ core_interfaces: interfaces: [ Ethernet12, Ethernet13 ] profile: isis_bb_profile + # P2P core links with underlay_multicast(pim-sparse) enabled. + - nodes: [ core-4-multicast, peer1 ] + id: 10 + as: [65001, 65002] + interfaces: [ Ethernet1, Ethernet1 ] + include_in_underlay_protocol: true + underlay_multicast: true + ip_pool: underlay_pool + + # P2P core links with underlay_multicast(pim-sparse) disabled. + - nodes: [ core-4-multicast, peer2 ] + id: 11 + as: [65001, 65003] + interfaces: [ Ethernet2, Ethernet2 ] + include_in_underlay_protocol: true + underlay_multicast: false + ip_pool: underlay_pool + + # P2P core links with underlay_multicast(pim-sparse) default. + - nodes: [ core-4-multicast, peer3 ] + id: 12 + as: [65001, 65004] + interfaces: [ Ethernet3, Ethernet3 ] + include_in_underlay_protocol: true + ip_pool: underlay_pool l3_edge: p2p_links_ip_pools: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/CV-PATHFINDER_CUSTOM_CONTROL_PLANE_POLICY_TESTS.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/CV_PATHFINDER_CUSTOM_CONTROL_PLANE_POLICY_TESTS.yml similarity index 98% rename from ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/CV-PATHFINDER_CUSTOM_CONTROL_PLANE_POLICY_TESTS.yml rename to ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/CV_PATHFINDER_CUSTOM_CONTROL_PLANE_POLICY_TESTS.yml index 93c90168199..b8a8db71a0b 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/CV-PATHFINDER_CUSTOM_CONTROL_PLANE_POLICY_TESTS.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/CV_PATHFINDER_CUSTOM_CONTROL_PLANE_POLICY_TESTS.yml @@ -1,6 +1,6 @@ --- # Testing CV pathfinder edge with custom control plane policy to make sure the correct -# control plane policy can be overriden +# control plane policy can be overridden # Inheriting most values from CV_PATHFINDER_TESTS default_node_types: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/CV_PATHFINDER_MULTI_RR_TESTS.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/CV_PATHFINDER_MULTI_RR_TESTS.yml index ec5a4b6055b..9a151c49e4d 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/CV_PATHFINDER_MULTI_RR_TESTS.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/CV_PATHFINDER_MULTI_RR_TESTS.yml @@ -27,7 +27,7 @@ wan_route_servers: public_ip: 172.17.17.17 - name: INET interfaces: - - name: Ethernet2 + - name: Ethernet2/1 public_ip: 10.50.50.50 # Overwriting TTL diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/CV_PATHFINDER_TESTS.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/CV_PATHFINDER_TESTS.yml index cf0b76ca765..b15d7d71bab 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/CV_PATHFINDER_TESTS.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/CV_PATHFINDER_TESTS.yml @@ -5,11 +5,26 @@ wan_mode: cv-pathfinder # the default is "none" for WAN routers" underlay_routing_protocol: ebgp +ipv4_prefix_list_catalog: + - name: ALLOW-DEFAULT + sequence_numbers: + - sequence: 10 + action: permit 0.0.0.0/0 + - name: PL2 + sequence_numbers: + - sequence: 10 + action: permit 5.0.0.0/0 + - sequence: 20 + action: deny 10.00.0.0/24 + cv_pathfinder_regions: - name: AVD_Land_West id: 42 description: AVD Region sites: + - name: Site404 + id: 404 + location: Not Found - name: Site422 id: 422 location: Somewhere @@ -22,6 +37,20 @@ cv_pathfinder_regions: sites: - name: Site511 id: 511 + location: Miami + +ipv4_acls: + - name: TEST-IPV4-ACL-WITH-IP-FIELDS-IN + entries: + - sequence: 15 + action: deny + protocol: ip + source: any + destination: interface_ip + - action: permit + protocol: ip + source: peer_ip + destination: interface_ip bgp_peer_groups: wan_overlay_peers: @@ -85,6 +114,12 @@ wan_router: wan_circuit_id: 666 dhcp_accept_default_route: true ip_address: dhcp + flow_tracking: + enabled: true + peer_ip: 172.16.9.4 + bgp: + peer_as: 64520 + ipv4_prefix_list_in: ALLOW-DEFAULT - name: Ethernet2 wan_carrier: Colt wan_circuit_id: 10555 @@ -92,20 +127,46 @@ wan_router: peer_ip: 172.16.5.4 static_routes: - prefix: 172.16.0.0/16 + cv_pathfinder_internet_exit: + policies: + - name: DIRECT-EXIT-POLICY-1 + bgp: + peer_as: 64520 + ipv4_prefix_list_in: ALLOW-DEFAULT + ipv4_prefix_list_out: ALLOW-DEFAULT + - name: Ethernet2/1 + wan_carrier: Colt + wan_circuit_id: 10555 + ip_address: 172.15.5.6/31 + peer_ip: 172.16.5.9 + static_routes: + - prefix: 172.16.0.0/16 + cv_pathfinder_internet_exit: + policies: + - name: DIRECT-EXIT-POLICY-1 - name: Ethernet3 wan_carrier: Comcast-5G wan_circuit_id: AF830 ip_address: 172.20.20.20/31 + peer_ip: 172.20.20.21 connected_to_pathfinder: false + cv_pathfinder_internet_exit: + policies: + - name: ZSCALER-EXIT-POLICY-1 + tunnel_interface_numbers: 100-102 - name: cv-pathfinder-edge1 id: 2 uplink_switch_interfaces: [Ethernet2] l3_interfaces: - - name: Ethernet1 + # Testing on sub-interface + - name: Ethernet1/49.3 wan_carrier: Inmrasat wan_circuit_id: S511 dhcp_accept_default_route: false ip_address: dhcp + dhcp_ip: 172.24.49.3 + peer_ip: 172.24.49.2 + ipv4_acl_in: TEST-IPV4-ACL-WITH-IP-FIELDS-IN - name: Ethernet2 wan_carrier: AWS-1 wan_circuit_id: 212 @@ -117,6 +178,31 @@ wan_router: wan_circuit_id: 404 dhcp_accept_default_route: true ip_address: dhcp + peer_ip: 172.31.0.1 + dhcp_ip: 10.0.0.145 + cv_pathfinder_internet_exit: + policies: + - name: ZSCALER-EXIT-POLICY-1 + tunnel_interface_numbers: 100-102 + - name: ZSCALER-EXIT-POLICY-2 + tunnel_interface_numbers: 110-112 + - name: DIRECT-EXIT-POLICY-1 + - name: DIRECT-EXIT-POLICY-2 + - name: Ethernet4 + dhcp_accept_default_route: true + ip_address: dhcp + peer_ip: 172.29.0.13 + bgp: + peer_as: 64520 + ipv4_prefix_list_in: PL2 + ipv4_prefix_list_out: ALLOW-DEFAULT + - name: Ethernet5 + dhcp_accept_default_route: true + ip_address: dhcp + peer_ip: 172.28.0.14 + bgp: + peer_as: 64520 + ipv4_prefix_list_out: PL2 # SITE_HA_ENABLED - group: Site423 cv_pathfinder_region: AVD_Land_West @@ -172,10 +258,14 @@ wan_router: dhcp_accept_default_route: true ip_address: dhcp - name: Ethernet2.42 + peer_ip: 123.12.3.4 encapsulation_dot1q_vlan: 666 wan_carrier: Colt wan_circuit_id: 10666 ip_address: 172.16.6.6/31 + cv_pathfinder_internet_exit: + policies: + - name: DIRECT-EXIT-POLICY-2 - name: cv-pathfinder-transit1B cv_pathfinder_region: AVD_Land_West cv_pathfinder_site: Site422 @@ -192,6 +282,31 @@ wan_router: wan_circuit_id: 10666 ip_address: 172.16.6.6/31 + # SITE_HA_ENABLED_DIRECT_HA + - group: Site404 + cv_pathfinder_region: AVD_Land_West + cv_pathfinder_site: Site404 + wan_ha: + enabled: true # TODO AVD4.8.0: Remove once WAN HA is GA. + ha_interfaces: [Ethernet52] + ha_ipv4_pool: 10.10.10.0/24 + nodes: + - name: cv-pathfinder-edge3A + id: 6 + l3_interfaces: + - name: Ethernet1 + wan_carrier: ATT + wan_circuit_id: 404-01 + dhcp_accept_default_route: true + ip_address: dhcp + - name: cv-pathfinder-edge3B + id: 7 + l3_interfaces: + - name: Ethernet2 + wan_carrier: Colt + wan_circuit_id: 10423 + ip_address: 172.15.6.6/31 + # Fake DC1 l3leaf: defaults: @@ -220,6 +335,7 @@ wan_rr: nodes: - name: cv-pathfinder-pathfinder id: 1 + cv_pathfinder_site: Global-pathfinder-site l3_interfaces: - name: Ethernet1 wan_carrier: Bouygues_Telecom @@ -229,7 +345,7 @@ wan_rr: ip_address: 10.7.7.7/31 public_ip: 172.17.7.7 peer_ip: 10.7.7.6 - - name: Ethernet2 + - name: Ethernet2/2 wan_carrier: Colt wan_circuit_id: 10000 ip_address: 172.16.0.1/31 @@ -239,6 +355,8 @@ wan_rr: ip_address: 10.9.9.9/31 - name: cv-pathfinder-pathfinder1 id: 2 + cv_pathfinder_region: AVD_Land_West + cv_pathfinder_site: Site423 data_plane_cpu_allocation_max: 3 l3_interfaces: - name: Ethernet1 @@ -258,7 +376,7 @@ wan_rr: wan_carrier: ATT-MPLS wan_circuit_id: 10999 ip_address: 172.19.9.9/31 - # public IP here will be overriden by + # public IP here will be overridden by # wan_route_servers.path_groups.interfaces.ip_address # in CV_PATHFINDER_MULTI_RR_TESTS groups vars. public_ip: 10.37.37.7 @@ -320,9 +438,9 @@ wan_carriers: - name: Comcast-5G path_group: LTE trusted: true + # Testing a not trusted carrier - name: Inmrasat path_group: Satellite - trusted: true - name: AWS-1 path_group: AWS trusted: true @@ -410,6 +528,8 @@ wan_virtual_topologies: preference: alternate constraints: jitter: 42 + internet_exit: + policy: ZSCALER-EXIT-POLICY-1 id: 2 - application_profile: VIDEO path_groups: @@ -419,6 +539,8 @@ wan_virtual_topologies: preference: alternate constraints: loss_rate: 42.0 + internet_exit: + policy: ZSCALER-EXIT-POLICY-2 id: 4 # This will not be rendered on devices without MPLS - application_profile: MPLS-ONLY @@ -429,7 +551,7 @@ wan_virtual_topologies: - name: DEFAULT-AVT-POLICY default_virtual_topology: path_groups: - # No prefence to check the default. + # No preference to check the default. - names: [INET, Equinix] - names: [MPLS] preference: 4223 @@ -440,6 +562,8 @@ wan_virtual_topologies: # since we are overriding the default_preference value (2/alternate). - names: [MPLS, INET, Equinix] preference: preferred + internet_exit: + policy: DIRECT-EXIT-POLICY-1 id: 3 - name: TRANSIT-AVT-POLICY default_virtual_topology: @@ -456,6 +580,8 @@ wan_virtual_topologies: preference: preferred - names: [INET] preference: alternate + internet_exit: + policy: DIRECT-EXIT-POLICY-2 id: 42 application_classification: @@ -530,3 +656,52 @@ application_classification: port_values: - 30000-30100 - 31000-31100 + +cv_pathfinder_internet_exit_policies: + - name: ZSCALER-EXIT-POLICY-1 + type: zscaler + zscaler: + domain_name: test.local + ipsec_key_salt: THIS_SHOULD_BE_VAULTED + - name: ZSCALER-EXIT-POLICY-2 + fallback_to_system_default: False + type: zscaler + zscaler: + domain_name: test.local + ipsec_key_salt: THIS_SHOULD_BE_VAULTED + - name: DIRECT-EXIT-POLICY-1 + fallback_to_system_default: False + type: direct + - name: DIRECT-EXIT-POLICY-2 + type: direct + +zscaler_endpoints: + cloud_name: zscalerbeta + device_location: + city: Santa Clara, CA + country: United States + primary: + city: Fremont, CA + datacenter: FMT1 + country: United States + latitude: 37 + longitude: -121 + ip_address: 10.37.121.1 # Not the correct address + secondary: + city: Washington, DC + datacenter: WAS1 + country: United States + latitude: 39 + longitude: -77 + ip_address: 10.39.77.1 # Not the correct address + tertiary: + city: Frankfurt + datacenter: FRA4 + country: Germany + latitude: 50 + longitude: 9 + ip_address: 10.50.9.1 # Not the correct address + +cv_pathfinder_global_sites: + - name: Global-pathfinder-site + location: Somewhere under the rainbow diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/DC1_FABRIC.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/DC1_FABRIC.yml index ae519179f0a..350a64be9f1 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/DC1_FABRIC.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/DC1_FABRIC.yml @@ -5,6 +5,9 @@ # If a device is set to "is_deployed: false" at the host_vars level, then shutdown interfaces towards undeployed peers. shutdown_interfaces_towards_undeployed_peers: true +# If a device is set to "is_deployed: false" at the host_vars level, then shutdown bgp towards undeployed peers. +shutdown_bgp_towards_undeployed_peers: true + # Enable vlan aware bundles evpn_vlan_aware_bundles: true @@ -294,12 +297,14 @@ l2leaf: filter: tenants: [ Tenant_A ] tags: [ opzone, web, app ] + uplink_mtu: 1499 nodes: - name: DC1-L2LEAF1A id: 8 mgmt_ip: 192.168.200.112/24 mac_address: '0c:1d:c0:1d:62:01' uplink_switch_interfaces: [ Ethernet7, Ethernet7 ] + uplink_mtu: 1498 - name: DC1-L2LEAF1B id: 11 mgmt_ip: 192.168.200.115/24 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/DC1_SERVERS.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/DC1_SERVERS.yml index 515137f837b..b4c4f112ae0 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/DC1_SERVERS.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/DC1_SERVERS.yml @@ -213,6 +213,20 @@ servers: description: PortChanne1 mode: active + # Test short_esi on non-vtep device. + - name: server03_ESI_L2LEAF + rack: RackC + adapters: + - endpoint_ports: [ Eth1, Eth2 ] + switch_ports: [ Ethernet5, Ethernet5 ] + switches: [ DC1-L2LEAF1A, DC1-L2LEAF1B ] + profile: TENANT_A_B + ethernet_segment: + short_esi: '0303:0202:0101' + port_channel: + description: PortChanne1 + mode: active + - name: server04_inherit_all_from_profile rack: RackC adapters: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/DC1_TENANTS_NETWORKS/Tenant_A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/DC1_TENANTS_NETWORKS/Tenant_A.yml index 6e07c338eaf..18da199d420 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/DC1_TENANTS_NETWORKS/Tenant_A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/DC1_TENANTS_NETWORKS/Tenant_A.yml @@ -18,6 +18,8 @@ tenant_a: name: Tenant_A_OP_Zone_1 tags: ['opzone'] enabled: True + ipv4_acl_in: TEST-IPV4-ACL-WITH-IP-FIELDS-IN + ipv4_acl_out: TEST-IPV4-ACL-WITH-IP-FIELDS-OUT ip_address_virtual: 10.1.10.1/24 # SVI as integer - id: 111 @@ -253,7 +255,7 @@ tenant_a: enabled: True description: "Single description" descriptions: ["DC1-BL1A descriptions preferred over single description", "DC1-BL1B descriptions preferred over single description"] - # no description nor desciptions is tested in Tenant_OSPF below + # no description nor descriptions is tested in Tenant_OSPF below - name: Tenant_A_OSPF vrf_id: 16 ospf: @@ -313,3 +315,19 @@ tenant_a: name: overlapping_name - id: 165 name: overlapping_name + +ipv4_acls: + - name: TEST-IPV4-ACL-WITH-IP-FIELDS-IN + entries: + - sequence: 15 + action: deny + protocol: ip + source: any + destination: interface_ip + - name: TEST-IPV4-ACL-WITH-IP-FIELDS-OUT + entries: + - remark: Some remark will not require source and destination fields. + - action: permit + protocol: ip + source: interface_ip + destination: any diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/DC1_TENANTS_NETWORKS/Tenant_C.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/DC1_TENANTS_NETWORKS/Tenant_C.yml index 665c253cebf..e454adfabeb 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/DC1_TENANTS_NETWORKS/Tenant_C.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/DC1_TENANTS_NETWORKS/Tenant_C.yml @@ -9,6 +9,12 @@ tenant_c: send_community: all next_hop_self: true maximum_routes: 1000 + address_family_ipv4: + activate: True + prefix_list_in: PL_In_Test_1 + prefix_list_out: PL_Out_Test_1 + address_family_ipv6: + activate: False default_originate: enabled: true always: true @@ -22,6 +28,10 @@ tenant_c: remote_as: "667" description: "Tenant C peer group2" update_source: lo0 + address_family_ipv4: + activate: True + route_map_in: TEST_IN + route_map_out: TEST_OUT vrfs: - name: Tenant_C_OP_Zone vrf_vni: 30 @@ -56,6 +66,10 @@ tenant_c: default_originate: enabled: true always: true + address_family_ipv4: + activate: True + address_family_ipv6: + activate: True nodes: [ DC1-BL2B ] update_source: lo0 bfd: false @@ -81,3 +95,7 @@ tenant_c: peer_group: Tenant_C_BGP_PEER_GROUP2 nodes: [DC1-BL2A] description: test_bgp_peer_group_without_nodes_2nd_time + - ip_address: 2.2.2.3 + peer_group: Tenant_C_WAN_Zone_BGP_PEER_GROUP + nodes: [ DC1-BL2B ] + description: test_duplicate_peer_ip_address diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/FLOW_TRACKING_TESTS.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/FLOW_TRACKING_TESTS.yml new file mode 100644 index 00000000000..f00706350af --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/FLOW_TRACKING_TESTS.yml @@ -0,0 +1,79 @@ +--- +# Common AVD group variables + + +# Test combination of flow tracking inputs across the FLOW_TRACKING_TESTS nodes. +# There are total of 8 nodes: +# spine1, spine2, leaf1, leaf2, leaf3 ( mlag ), leaf4 ( mlag ), l2-leaf1, l2-leaf2 + +# For l3_edge, core_interfaces: +# spine1 has flow tracking enabled by default, tracker type : default( sampled ) +# spine2 has flow tracking disabled by default, tracker type : hardware, tracker name is also non-default in fabric settings + +# We configure the combination of inputs for l3_interfaces, core_interfaces +# default setting, enabled: off, enabled: on, enabled:on override flow tracker name + +# We also test downlinks which come from the leaf[1-4] on the spine nodes, spine 1 downlinks should +# have default flow tracker, whereas spine 2 downlinks should have custom flow tracker ( overridden in global settings ). + +# Default Flow Tracker definition is also overridden in spine1. Extra trackers are provided in spine2 to check filtering + +# Similarly for leafs: +# leaf1: has tracking enabled by default, leaf2: has tracking disabled by default +# and we configure their endpoints with varying configuration as before. +# leaf1, leaf2 are used for testing: uplinks, l3_interfaces (tenants), endpoints + +# leaf3, leaf4 are used for testing: mlag_interfaces, uplinks( with overridden name in fabric setting ), downlinks + +# l2-leaf1, l2-leaf2 are used for testing l2 ports uplinks i.e port-channels + +# node l3_interfaces are tested in CV_PATHFINDER_TESTS + + +fabric_name: FLOW_TRACKING_TESTS + +mgmt_gateway: 192.168.0.1 + +default_mgmt_method: oob + +tenants: + - name: FLOW_TRACKING + mac_vrf_vni_base: 10000 + vrfs: + # VRF definitions inside the tenant. + - name: VRF1 + # VRF VNI definition. + vrf_vni: 1 + svis: + - id: 11 + name: VLAN11 + enabled: true + nodes: + - node: flow-tracking-tests-leaf1 + ip_address: 172.16.11.1/24 + - node: flow-tracking-tests-leaf2 + ip_address: 172.17.11.1/24 + l3_interfaces: + - interfaces: [Ethernet81, Ethernet81] + ip_addresses: [10.1.55.0/31, 10.1.55.2/31] + nodes: [flow-tracking-tests-leaf1, flow-tracking-tests-leaf2] + enabled: true + flow_tracking: + enabled: true + name: FLOW-TRACKER-3 + - interfaces: [Ethernet82, Ethernet82] + ip_addresses: [10.1.55.0/31, 10.1.55.2/31] + nodes: [flow-tracking-tests-leaf1, flow-tracking-tests-leaf2] + enabled: true + flow_tracking: + enabled: false + - interfaces: [Ethernet83, Ethernet83] + ip_addresses: [10.1.55.0/31, 10.1.55.2/31] + nodes: [flow-tracking-tests-leaf1, flow-tracking-tests-leaf2] + enabled: true + - interfaces: [Ethernet84, Ethernet84] + ip_addresses: [10.1.55.0/31, 10.1.55.2/31] + nodes: [flow-tracking-tests-leaf1, flow-tracking-tests-leaf2] + enabled: true + flow_tracking: + enabled: true diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/FLOW_TRACKING_TESTS_L2_LEAFS.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/FLOW_TRACKING_TESTS_L2_LEAFS.yml new file mode 100644 index 00000000000..a3d1487a136 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/FLOW_TRACKING_TESTS_L2_LEAFS.yml @@ -0,0 +1,30 @@ +--- +type: l2leaf + +default_mgmt_method: inband + +fabric_flow_tracking: + uplinks: + enabled: true + +l2leaf: + defaults: + platform: vEOS-lab + uplink_interfaces: ['Ethernet1', 'Ethernet2'] + uplink_switches: ['flow-tracking-tests-leaf3', 'flow-tracking-tests-leaf4'] + inband_mgmt_subnet: "10.254.254.0/24" + + nodes: + - name: flow-tracking-tests-l2-leaf1 + id: 1 + mgmt_ip: 192.168.0.201/24 + uplink_switch_interfaces: + - Ethernet31 + - Ethernet31 + + - name: flow-tracking-tests-l2-leaf2 + id: 2 + mgmt_ip: 192.168.0.202/24 + uplink_switch_interfaces: + - Ethernet32 + - Ethernet32 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/FLOW_TRACKING_TESTS_LEAFS.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/FLOW_TRACKING_TESTS_LEAFS.yml new file mode 100644 index 00000000000..e5d0771e271 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/FLOW_TRACKING_TESTS_LEAFS.yml @@ -0,0 +1,185 @@ +--- +type: l3leaf + +fabric_flow_tracking: + uplinks: + enabled: true + endpoints: + enabled: true + mlag_interfaces: + enabled: true + l3_interfaces: + enabled: true + +flow_tracking_settings: + sampled: + encapsulation: + mpls: true + sample: 50000 + hardware_offload: + ipv4: true + ipv6: true + threshold_minimum: 1332 + trackers: + - name: FLOW-TRACKER-4 + record_export: + on_inactive_timeout: 50020 + on_interval: 300321 + exporters: + - name: ayush_exporter + collector: + host: 127.0.2.1 + local_interface: Loopback0 + template_interval: 40020 + - name: FLOW-TRACKER-3 + record_export: + on_inactive_timeout: 50000 + on_interval: 300331 + exporters: + - name: ayush_exporter + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 40000 + # Override default definition + - name: FLOW-TRACKER + record_export: + on_inactive_timeout: 50001 + on_interval: 300332 + exporters: + - name: ayush_exporter + collector: + host: 127.0.0.2 + local_interface: Loopback0 + template_interval: 40002 + +l3leaf: + defaults: + platform: vEOS-lab + loopback_ipv4_pool: 10.254.1.0/27 + uplink_interfaces: ['Ethernet1', 'Ethernet2'] + uplink_switches: ['flow-tracking-tests-spine1', 'flow-tracking-tests-spine2'] + uplink_ipv4_pool: 10.254.2.0/24 + vtep_loopback_ipv4_pool: 10.254.11.0/27 + mlag_interfaces: ['Ethernet21', 'Ethernet22'] + mlag_peer_ipv4_pool: 10.254.1.64/27 + mlag_peer_l3_ipv4_pool: 10.254.1.96/27 + spanning_tree_priority: 4096 + spanning_tree_mode: mstp + virtual_router_mac_address: 00:11:22:33:44:55 + flow_tracker_type: hardware + + nodes: + - name: flow-tracking-tests-leaf1 + id: 1 + bgp_as: 65101 + mgmt_ip: 192.168.0.101/24 + uplink_switch_interfaces: + - Ethernet1 + - Ethernet2 + + - name: flow-tracking-tests-leaf2 + id: 2 + bgp_as: 65102 + mgmt_ip: 192.168.0.102/24 + uplink_switch_interfaces: + - Ethernet3 + - Ethernet4 + flow_tracker_type: sampled + + node_groups: + - group: flow-tracking-tests-leaf-mlag + bgp_as: 65105 + nodes: + - name: flow-tracking-tests-leaf3 + id: 5 + mgmt_ip: 192.168.0.103/24 + uplink_switch_interfaces: + - Ethernet5 + - Ethernet6 + - name: flow-tracking-tests-leaf4 + id: 6 + mgmt_ip: 192.168.0.104/24 + uplink_switch_interfaces: + - Ethernet7 + - Ethernet8 + flow_tracker_type: hardware + + +servers: + - name: single-interface-true + adapters: + - endpoint_ports: [ eth1, eth2 ] + switch_ports: [ Ethernet10, Ethernet10 ] + switches: [ flow-tracking-tests-leaf1, flow-tracking-tests-leaf2 ] + vlans: 11 + mode: access + flow_tracking: + name: FLOW-TRACKER-3 + + - name: single-interface-false + adapters: + - endpoint_ports: [ eth11, eth12 ] + switch_ports: [ Ethernet11, Ethernet11 ] + switches: [ flow-tracking-tests-leaf1, flow-tracking-tests-leaf2 ] + vlans: 11 + mode: access + flow_tracking: + enabled: false + + - name: single-interface-no-definition + adapters: + - endpoint_ports: [ eth12, eth13 ] + switch_ports: [ Ethernet12, Ethernet12 ] + switches: [ flow-tracking-tests-leaf1, flow-tracking-tests-leaf2 ] + vlans: 11 + mode: access + flow_tracking: + enabled: true + + - name: single-interface-true4 + adapters: + - endpoint_ports: [ eth1, eth1 ] + switch_ports: [ Ethernet13, Ethernet13 ] + switches: [ flow-tracking-tests-leaf1, flow-tracking-tests-leaf2 ] + vlans: 11 + mode: access + + - name: port-channel-interface-true + adapters: + - endpoint_ports: [ PCI1, PCI2 ] + switch_ports: [ Ethernet14, Ethernet14 ] + switches: [ flow-tracking-tests-leaf3, flow-tracking-tests-leaf4 ] + vlans: 11 + mode: access + spanning_tree_portfast: edge + flow_tracking: + name: FLOW-TRACKER-4 + port_channel: + mode: "on" + + - name: port-channel-interface-false + adapters: + - endpoint_ports: [ PCI11, PCI12 ] + switch_ports: [ Ethernet15, Ethernet15 ] + switches: [ flow-tracking-tests-leaf3, flow-tracking-tests-leaf4 ] + vlans: 11 + mode: access + spanning_tree_portfast: edge + flow_tracking: + enabled: true + port_channel: + mode: "on" + + - name: port-channel-interface-no-definition + adapters: + - endpoint_ports: [ PCI13, PCI14 ] + switch_ports: [ Ethernet16, Ethernet16 ] + switches: [ flow-tracking-tests-leaf3, flow-tracking-tests-leaf4 ] + vlans: 11 + mode: access + spanning_tree_portfast: edge + port_channel: + mode: "on" + flow_tracking: + enabled: false diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/FLOW_TRACKING_TESTS_LEAFS_2.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/FLOW_TRACKING_TESTS_LEAFS_2.yml new file mode 100644 index 00000000000..0b67b52567f --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/FLOW_TRACKING_TESTS_LEAFS_2.yml @@ -0,0 +1,14 @@ +--- +type: l3leaf + +fabric_flow_tracking: + uplinks: + enabled: false + endpoints: + enabled: false + name: FLOW-TRACKER-3 + mlag_interfaces: + enabled: false + l3_interfaces: + enabled: false + name: FLOW-TRACKER-4 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/FLOW_TRACKING_TESTS_LEAFS_3.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/FLOW_TRACKING_TESTS_LEAFS_3.yml new file mode 100644 index 00000000000..febcf9b98aa --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/FLOW_TRACKING_TESTS_LEAFS_3.yml @@ -0,0 +1,12 @@ +--- +fabric_flow_tracking: + mlag_interfaces: + enabled: false + name: FLOW-TRACKER-3 + uplinks: + enabled: true + name: FLOW-TRACKER-3 + endpoints: + enabled: false + downlinks: + enabled: true diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/FLOW_TRACKING_TESTS_SPINES.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/FLOW_TRACKING_TESTS_SPINES.yml new file mode 100644 index 00000000000..929d4040da1 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/FLOW_TRACKING_TESTS_SPINES.yml @@ -0,0 +1,66 @@ +--- +type: spine + +spine: + defaults: + platform: vEOS-LAB + loopback_ipv4_pool: 10.255.0.0/27 + bgp_as: 65200 + + nodes: + - name: flow-tracking-tests-spine1 + id: 1 + mgmt_ip: 192.168.0.11/24 + + - name: flow-tracking-tests-spine2 + id: 2 + mgmt_ip: 192.168.0.21/24 + flow_tracker_type: hardware + + +# P2P links between spine switches. +core_interfaces: + p2p_links: + - nodes: [ flow-tracking-tests-spine1, flow-tracking-tests-spine2 ] + interfaces: [ Ethernet9, Ethernet9 ] + include_in_underlay_protocol: false + flow_tracking: + enabled: true + - nodes: [ flow-tracking-tests-spine1, flow-tracking-tests-spine2 ] + interfaces: [ Ethernet10, Ethernet10 ] + include_in_underlay_protocol: false + flow_tracking: + enabled: true + name: FLOW-TRACKER-1 + - nodes: [ flow-tracking-tests-spine1, flow-tracking-tests-spine2 ] + interfaces: [ Ethernet11, Ethernet11 ] + include_in_underlay_protocol: false + flow_tracking: + enabled: false + - nodes: [ flow-tracking-tests-spine1, flow-tracking-tests-spine2 ] + interfaces: [ Ethernet12, Ethernet12 ] + include_in_underlay_protocol: false + + +# Testing the same as above with l3_edge +l3_edge: + p2p_links: + - nodes: [ flow-tracking-tests-spine1, flow-tracking-tests-spine2 ] + interfaces: [ Ethernet13, Ethernet13 ] + include_in_underlay_protocol: false + flow_tracking: + enabled: true + - nodes: [ flow-tracking-tests-spine1, flow-tracking-tests-spine2 ] + interfaces: [ Ethernet14, Ethernet14 ] + include_in_underlay_protocol: false + flow_tracking: + enabled: true + name: FLOW-TRACKER-1 + - nodes: [ flow-tracking-tests-spine1, flow-tracking-tests-spine2 ] + interfaces: [ Ethernet15, Ethernet15 ] + include_in_underlay_protocol: false + flow_tracking: + enabled: false + - nodes: [ flow-tracking-tests-spine1, flow-tracking-tests-spine2 ] + interfaces: [ Ethernet16, Ethernet16 ] + include_in_underlay_protocol: false diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/FLOW_TRACKING_TESTS_SPINES_1.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/FLOW_TRACKING_TESTS_SPINES_1.yml new file mode 100644 index 00000000000..7630b926c94 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/FLOW_TRACKING_TESTS_SPINES_1.yml @@ -0,0 +1,50 @@ +--- +# Common AVD group variables + +fabric_name: FLOW_TRACKING_TESTS + +mgmt_gateway: 192.168.0.1 + +default_mgmt_method: oob + +flow_tracking_settings: + trackers: + - name: FLOW-TRACKER-1 + sampled: + table_size: 4331 + record_export: + mpls: true + record_export: + on_inactive_timeout: 50000 + on_interval: 300331 + exporters: + - name: ayush_exporter + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 40000 + # Override default definition + - name: FLOW-TRACKER + record_export: + on_inactive_timeout: 50001 + on_interval: 300332 + exporters: + - name: ayush_exporter + collector: + host: 127.0.0.2 + local_interface: Loopback0 + template_interval: 40002 + +fabric_flow_tracking: + uplinks: + enabled: true + downlinks: + enabled: true + endpoints: + enabled: true + l3_edge: + enabled: true + core_interfaces: + enabled: true + mlag_interfaces: + enabled: true diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/FLOW_TRACKING_TESTS_SPINES_2.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/FLOW_TRACKING_TESTS_SPINES_2.yml new file mode 100644 index 00000000000..5977a293451 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/FLOW_TRACKING_TESTS_SPINES_2.yml @@ -0,0 +1,60 @@ +--- +# Common AVD group variables + +fabric_name: FLOW_TRACKING_TESTS + +mgmt_gateway: 192.168.0.1 + +default_mgmt_method: oob + +flow_tracking_settings: + sampled: + encapsulation: + mpls: true + sample: 50000 + hardware_offload: + ipv4: true + ipv6: true + threshold_minimum: 1332 + hardware: + record: + format_ipfix_standard_timestamps_counters: true + trackers: + - name: FLOW-TRACKER-2 + record_export: + on_inactive_timeout: 50020 + on_interval: 300321 + exporters: + - name: ayush_exporter + collector: + host: 127.0.2.1 + local_interface: Loopback0 + template_interval: 40020 + - name: FLOW-TRACKER-1 + record_export: + on_inactive_timeout: 50000 + on_interval: 300331 + exporters: + - name: ayush_exporter + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 40000 + +# False by default +fabric_flow_tracking: + uplinks: + enabled: true + downlinks: + enabled: true + name: FLOW-TRACKER-2 + endpoints: + enabled: true + l3_edge: + enabled: false + name: FLOW-TRACKER-2 + core_interfaces: + enabled: false + name: FLOW-TRACKER-2 + mlag_interfaces: + enabled: true diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/INBAND_MGMT_TESTS.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/INBAND_MGMT_TESTS.yml index a8a9189eef7..4531700a08c 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/INBAND_MGMT_TESTS.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/INBAND_MGMT_TESTS.yml @@ -101,6 +101,22 @@ l2leaf: inband_mgmt_ipv6_subnet: 2a00:107::/64 inband_mgmt_vrf: INBANDMGMT id: 7 + node_groups: + - group: inband-mgmt-mlag-test + mlag: true + mlag_peer_ipv4_pool: 100.64.0.0/24 + mlag_peer_l3_ipv4_pool: 100.64.1.0/24 + inband_mgmt_vlan: 101 + inband_mgmt_gateway: 192.168.101.21 + nodes: + - name: inband-mgmt-mlag-a + id: 101 + inband_mgmt_ip: 192.168.101.22/24 + uplink_switch_interfaces: [Ethernet101, Ethernet101] + - name: inband-mgmt-mlag-b + id: 102 + inband_mgmt_ip: 192.168.101.23/24 + uplink_switch_interfaces: [Ethernet102, Ethernet102] tenants: - name: INBAND_MGMT_TESTS diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/MGMT_GATEWAY_TESTS.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/MGMT_GATEWAY_TESTS.yml new file mode 100644 index 00000000000..b94e6bedae9 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/MGMT_GATEWAY_TESTS.yml @@ -0,0 +1,24 @@ +--- +# tests for mgmt_gateway and ipv6_mgmt_gateway inside node_type (l2leaf) + +default_node_types: + - node_type: l2leaf + match_hostnames: + - "TEST-MGMT-GATEWAY-IN-NODE-GROUP" + +mgmt_gateway: 192.168.201.250 +ipv6_mgmt_gateway: 2000::1 + +l2leaf: + defaults: + mlag_peer_ipv4_pool: 10.10.255.0/24 + mlag_interfaces: [Ethernet5, Ethernet6] + node_groups: + - group: MGMT_GATEWAY_TESTS + nodes: + - name: TEST-MGMT-GATEWAY-IN-NODE-GROUP + id: 3 + mgmt_ip: 192.168.201.202/24 + ipv6_mgmt_ip: 2001:db8::105/64 + mgmt_gateway: 192.168.201.254 + ipv6_mgmt_gateway: 2001:db8::2 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/MLAG_IPV6.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/MLAG_IPV6.yml new file mode 100644 index 00000000000..f07e50ec15c --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/MLAG_IPV6.yml @@ -0,0 +1,22 @@ +--- +fabric_ip_addressing: +l3leaf: + defaults: + mlag_peer_address_family: ipv6 + mlag_peer_ipv6_pool: 2001:DB8::/56 + mlag_peer_l3_ipv4_pool: 10.10.224.0/24 + loopback_ipv4_pool: 192.168.255.0/24 + loopback_ipv4_offset: 32 + vtep_loopback_ipv4_pool: 192.168.254.0/24 + platform: vEOS-LAB + mlag_interfaces: [Ethernet5, Ethernet6] + node_groups: + - group: MLAG_IPV6 + bgp_as: 65001 + nodes: + - name: MLAG_IPV6_L3LEAF1A + id: 3 + mgmt_ip: 192.168.201.116/24 + - name: MLAG_IPV6_L3LEAF1B + id: 4 + mgmt_ip: 192.168.201.117/24 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/PLATFORM_SETTINGS_TESTS.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/PLATFORM_SETTINGS_TESTS.yml new file mode 100644 index 00000000000..d14596f14c2 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/PLATFORM_SETTINGS_TESTS.yml @@ -0,0 +1,24 @@ +--- +type: l3leaf +l3leaf: + defaults: + mlag_peer_ipv4_pool: 10.10.255.0/24 + mlag_peer_l3_ipv4_pool: 10.10.224.0/24 + loopback_ipv4_pool: 192.168.255.0/24 + loopback_ipv4_offset: 32 + vtep_loopback_ipv4_pool: 192.168.254.0/24 + mlag_interfaces: [Ethernet5, Ethernet6] + node_groups: + - group: MLAG_PER_MTU_INTERFACE + bgp_as: 923 + vtep: false + nodes: + - name: 7010TX-LEAF1 + id: 3 + platform: 7010TX + mgmt_ip: 192.168.201.116/24 + vtep: true + - name: 7010TX-LEAF2 + id: 4 + platform: 7010TX + mgmt_ip: 192.168.201.117/24 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/PTP_TESTS.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/PTP_TESTS.yml index fa3f1fe2feb..9040bd53fec 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/PTP_TESTS.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/PTP_TESTS.yml @@ -86,6 +86,20 @@ servers: enabled: true endpoint_role: follower + - name: Endpoint-with-mpass + adapters: + - endpoint_ports: [ PCI1, PCI2 ] + switch_ports: [ Ethernet6, Ethernet6 ] + switches: [ ptp-tests-leaf1, ptp-tests-leaf2 ] + vlans: 11 + mode: access + ptp: + enabled: true + endpoint_role: follower + port_channel: + mode: "active" + ptp_mpass: true + - name: Endpoint-with-specific-PTP-profile adapters: - endpoint_ports: [ eth3 ] diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/SFLOW_TESTS_L2_LEAFS.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/SFLOW_TESTS_L2_LEAFS.yml index e3e7be9f472..0c6312cbccf 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/SFLOW_TESTS_L2_LEAFS.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/SFLOW_TESTS_L2_LEAFS.yml @@ -4,6 +4,8 @@ type: l2leaf default_mgmt_method: inband sflow_settings: + sample: + rate: 10 destinations: - destination: 10.10.10.10 vrf: use_inband_mgmt_vrf diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/SVI_PROFILE_TESTS.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/SVI_PROFILE_TESTS.yml index e7f1b1f07fd..86649e27042 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/SVI_PROFILE_TESTS.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/SVI_PROFILE_TESTS.yml @@ -221,7 +221,7 @@ tenants: # Set nodes[inventory_hostname].structured_config on parent_profile # Expected results: - # - descripton: "set from structured_config on svi_parent_profile.nodes[inventory_hostname].structured_config" + # - description: "set from structured_config on svi_parent_profile.nodes[inventory_hostname].structured_config" - id: 112 name: svi_profile_tests_112_description enabled: true diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/TRUNK_GROUP_TESTS.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/TRUNK_GROUP_TESTS.yml index 104549c9747..3ce24e2ae09 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/TRUNK_GROUP_TESTS.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/TRUNK_GROUP_TESTS.yml @@ -69,7 +69,7 @@ tenants: - name: TENANT_WITH_DUPLICATE_VLANS # Extra tenant with duplicate vlan numbers. # This is to verify that "filter.only_vlans_in_use" properly filter on trunk_groups when there might be overlapping vlan numbers. - # Since "filter.only_vlans_in_use" are only configured on some devices, we have to filter this tenant away on the remaning switches. + # Since "filter.only_vlans_in_use" are only configured on some devices, we have to filter this tenant away on the remaining switches. # If not, there will be a duplicate vlan error (tested and verified offline). # So in the end the vlans here are not configured anywhere, but will trigger duplicate checks if filtering is not implemented properly on trunk groups mac_vrf_vni_base: 20000 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/UPLINK_LAN_TESTS.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/UPLINK_LAN_TESTS.yml index 8592910b064..3ed5411c71a 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/UPLINK_LAN_TESTS.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/group_vars/UPLINK_LAN_TESTS.yml @@ -10,6 +10,12 @@ l2leaf: # dynamic_key: node_type filter: tags: [l2leaf] +fabric_flow_tracking: + uplinks: + enabled: true + downlinks: + enabled: true + wan_router: # dynamic_key: node_type defaults: bgp_as: 65100 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/DC1-BL1A.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/DC1-BL1A.yml index 3fd68ac33b9..4f2fa11cf79 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/DC1-BL1A.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/DC1-BL1A.yml @@ -21,11 +21,12 @@ vtep_vvtep_ip: 192.168.255.255/32 # Testing event_handlers event_handlers: - name: evpn-blacklist-recovery - action_type: bash - action: FastCli -p 15 -c "clear bgp evpn host-flap" + actions: + bash_command: FastCli -p 15 -c "clear bgp evpn host-flap" delay: 300 trigger: on-logging - regex: EVPN-3-BLACKLISTED_DUPLICATE_MAC + trigger_on_logging: + regex: EVPN-3-BLACKLISTED_DUPLICATE_MAC asynchronous: true # Testing with inline jinja - targeting base.py loaded in eos_designs_structured_config. diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/connected_endpoints.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/connected_endpoints.yml index 06790ad333a..fe0bae850bb 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/connected_endpoints.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/connected_endpoints.yml @@ -5,6 +5,9 @@ l2leaf: defaults: nodes: - name: connected_endpoints + platform: 720XP + link_tracking: + enabled: true servers: # single port override physical port description @@ -63,7 +66,16 @@ servers: - switches: [connected_endpoints] switch_ports: [Ethernet14] profile: INDIVIDUAL_TRUNK - + - name: INDIVIDUAL_2_TRUNK_PHONE + adapters: + - switches: [connected_endpoints, connected_endpoints] + switch_ports: [Ethernet15, Ethernet16] + port_channel: + mode: "active" + lacp_fallback: + mode: individual + individual: + profile: INDIVIDUAL_TRUNK_PHONE port_profiles: - profile: INDIVIDUAL_TRUNK mode: trunk @@ -76,3 +88,16 @@ port_profiles: unauthorized: access_vlan_membership_egress: True native_vlan_membership_egress: True + qos_profile: MYQOS + poe: + disabled: true + ptp: + enabled: true + sflow: false + + - profile: INDIVIDUAL_TRUNK_PHONE + mode: trunk phone + native_vlan: 123 + phone_vlan: 321 + link_tracking: + enabled: true diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/core-4-multicast.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/core-4-multicast.yml new file mode 100644 index 00000000000..5515f80d362 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/core-4-multicast.yml @@ -0,0 +1 @@ +underlay_multicast: true diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/cv-pathfinder-custom-control-plane-policy-edge-2.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/cv-pathfinder-custom-control-plane-policy-edge-2.yml index af38eee550a..2369a005ebb 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/cv-pathfinder-custom-control-plane-policy-edge-2.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/cv-pathfinder-custom-control-plane-policy-edge-2.yml @@ -1,6 +1,6 @@ --- # Testing CV pathfinder edge with custom control plane policy to make sure the correct -# control plane policy can be overriden. +# control plane policy can be overridden. # Also override the application profile name, but don't define it, so that # application profile name is custom but application is still auto generated diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/cv-pathfinder-custom-control-plane-policy-edge-3.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/cv-pathfinder-custom-control-plane-policy-edge-3.yml index 00cf16ed6f4..b87f8a6133e 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/cv-pathfinder-custom-control-plane-policy-edge-3.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/cv-pathfinder-custom-control-plane-policy-edge-3.yml @@ -1,6 +1,6 @@ --- # Testing CV pathfinder edge with custom control plane policy to make sure the correct -# control plane policy can be overriden. +# control plane policy can be overridden. # Also override the application profile name, and define it, so that # we can override how control plane traffic is determined diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/cv-pathfinder-edge-custom-default-policy.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/cv-pathfinder-edge-custom-default-policy.yml index 051923092cf..02443be0bc7 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/cv-pathfinder-edge-custom-default-policy.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/cv-pathfinder-edge-custom-default-policy.yml @@ -8,13 +8,21 @@ underlay_routing_protocol: none bgp_as: 65000 flow_tracking_settings: - flow_tracker_name: custom_flow_track_name - record_export: - on_inactive_timeout: 50000 - on_interval: 300331 - exporter: - name: ayush_exporter - template_interval: 40000 + trackers: + - name: custom_flow_track_name + record_export: + on_inactive_timeout: 50000 + on_interval: 300331 + exporters: + - name: ayush_exporter + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 40000 + +fabric_flow_tracking: + dps_interfaces: + name: custom_flow_track_name cv_pathfinder_regions: - name: AVD_Land_West diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/cv-pathfinder-edge1.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/cv-pathfinder-edge1.yml new file mode 100644 index 00000000000..c1632b7fceb --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/cv-pathfinder-edge1.yml @@ -0,0 +1,51 @@ +--- +# Used when manually testing zscaler integration to cloudvision builtin to eos_designs. +# Make sure to set the cv_token var on the molecule command line like: +# molecule converge -s eos_designs_unit_tests -- --limit cv-pathfinder-edge1 -e cv_token=$CV_TOKEN -v + +# serial_number: mockZscaler +# cv_server: "www.cv-play.corp.arista.io" +# zscaler_endpoints: null + +# Testing multiple pathinfders on one device +wan_route_servers: + - hostname: cv-pathfinder-pathfinder1 + - hostname: cv-pathfinder-pathfinder2 + +# Testing overriding internet exit acls using custom rules with substitution +ipv4_acls: + - name: TEST-IPV4-ACL-WITH-IP-FIELDS-IN + entries: + - sequence: 15 + action: deny + protocol: ip + source: any + destination: interface_ip + - action: permit + protocol: ip + source: peer_ip + destination: interface_ip + - name: ACL-NAT-IE-ZSCALER + entries: + - sequence: 10 + action: permit + protocol: ip + source: any + destination: 10.0.0.0/24 + - sequence: 20 + action: deny + protocol: ip + source: any + destination: any + - name: ACL-NAT-IE-DIRECT + entries: + - sequence: 10 + action: deny + protocol: ip + source: any + destination: 5.0.0.0/24 + - sequence: 20 + action: permit + protocol: ip + source: any + destination: any diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/evpn_vlan_bundle.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/evpn_vlan_bundle.yml index 1e9c379300e..a19dd21cb32 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/evpn_vlan_bundle.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/evpn_vlan_bundle.yml @@ -16,7 +16,7 @@ l3leaf: id: 3 bgp_as: 65101 filter: - tags: [fabric, ipmi, storageProd, sit] + tags: [fabric, ipmi, storageProd, sit, research] tenants: - name: StorageProd @@ -109,6 +109,33 @@ tenants: enabled: true evpn_vlan_bundle: bundle4 tags: ['sit'] + # Test evpn_vlan_bundle setting on tenant level. + - name: research + vlan_aware_bundle_number_base: 400 + mac_vrf_vni_base: 10000 + evpn_vlan_bundle: bundle5 + l2vlans: + - id: 110 + name: research1 + tags: ['research'] + # Test override evpn_vlan_bundle setting under tenant. + evpn_vlan_bundle: bundle6 + - id: 120 + name: research2 + tags: ['research'] + vrfs: + - name: research1 + vrf_vni: 654556 + svis: + - id: 1016 + name: SVI_9 + enabled: true + tags: ['research'] + evpn_vlan_bundle: bundle6 + - id: 1017 + name: SVI_10 + enabled: true + tags: ['research'] evpn_vlan_bundles: - name: bundle1 @@ -128,3 +155,11 @@ evpn_vlan_bundles: id: 4 rt_override: 444 rd_override: 1.1.1.1:444 + - name: bundle5 + id: 5 + rt_override: 555 + rd_override: 1.1.1.1:555 + - name: bundle6 + id: 6 + rt_override: 666 + rd_override: 1.1.1.1:666 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/evpn_vlan_bundle_svi_l2vlan.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/evpn_vlan_bundle_svi_l2vlan.yml new file mode 100644 index 00000000000..0df9e88d627 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/evpn_vlan_bundle_svi_l2vlan.yml @@ -0,0 +1,63 @@ +# Enable vlan aware bundles +evpn_vlan_aware_bundles: false + +type: l3leaf + +l3leaf: + defaults: + # LOOPBACK AND VTEP MANAGEMENT + loopback_ipv4_pool: 10.10.0.0/24 + vtep_loopback_ipv4_pool: 10.11.0.0/24 + vtep_loopback: Loopback1 + # Possibility to prevent configuration of Tenant VRFs and SVIs. This allows support for centralized routing. + evpn_services_l2_only: false + nodes: + - name: evpn_vlan_bundle_svi_l2vlan + id: 3 + bgp_as: 65101 + filter: + tags: [fabric, ipmi, storageProd, sit] + +tenants: + - name: SIT + vlan_aware_bundle_number_base: 300 + mac_vrf_vni_base: 20000 + l2vlans: + - id: 10 + name: storage_prod + tags: ['storageProd'] + - id: 20 + name: storage_prod + tags: ['storageProd'] + - id: 90 + name: vlan90 + tags: ['ipmi'] + evpn_vlan_bundle: bundle3 + - id: 100 + name: vlan100 + tags: ['fabric'] + evpn_vlan_bundle: bundle3 + vrfs: + - name: SIT_VRF + vrf_vni: 789654 + svis: + - id: 1008 + name: SVI_1 + enabled: true + evpn_vlan_bundle: bundle3 + tags: ['sit'] + - id: 1009 + name: SVI_2 + enabled: true + evpn_vlan_bundle: bundle3 + tags: ['sit'] + - id: 1010 + name: SVI_3 + enabled: true + tags: ['sit'] + +evpn_vlan_bundles: + - name: bundle3 + id: 3 + rt_override: 333 + rd_override: 1.1.1.1:333 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/ipv4-acls.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/ipv4-acls.yml index f5b8ce211c5..e270b810088 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/ipv4-acls.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/ipv4-acls.yml @@ -28,6 +28,14 @@ spine: ip_address: 172.19.19.0/31 ipv4_acl_in: TEST-IPV4-ACL-WITH-NO-FIELDS-IN ipv4_acl_out: TEST-IPV4-ACL-WITH-NO-FIELDS-OUT + - name: Ethernet5/1 + ip_address: 172.20.20.0/31 + ipv4_acl_in: TEST-IPV4-ACL-WITH-IP-FIELDS-IN + peer_ip: 172.20.20.1/30 + - name: Ethernet6/6.6 + ip_address: 172.21.21.0/31 + ipv4_acl_out: TEST-IPV4-ACL-WITH-IP-FIELDS-OUT + peer_ip: 172.21.21.1/30 ipv4_acls: # ip_access_lists: diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/l3_edge_isis.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/l3_edge_isis.yml index bd144337230..819143c3b5f 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/l3_edge_isis.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/l3_edge_isis.yml @@ -1,4 +1,5 @@ underlay_routing_protocol: isis +underlay_isis_bfd: true isis_area_id: "49.0001" type: spine diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/l3_edge_multicast.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/l3_edge_multicast.yml new file mode 100644 index 00000000000..c31e75be130 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/l3_edge_multicast.yml @@ -0,0 +1,41 @@ +underlay_routing_protocol: ospf +underlay_multicast: true + +type: spine +spine: + nodes: + - name: l3_edge_multicast + id: 1 + evpn_role: "none" + loopback_ipv4_pool: 1.2.3.4/24 + bgp_as: 65000 + +l3_edge: + p2p_links_profiles: + - name: profile1 + ip_pool: pool1 + speed: "forced 10000full" + mtu: 2000 + bfd: true + ptp: + enabled: true + qos_profile: TEST-QOS-PROFILE + macsec_profile: TEST-MACSEC-PROFILE + + p2p_links_ip_pools: + - name: pool1 + ipv4_pool: 192.168.0.0/24 + + p2p_links: + # P2P link with underlay multicast(pim-sparse) disabled. + - nodes: [l3_edge_multicast, peer1] + interfaces: [ethernet1, ethernet1] + ip: [192.168.0.4/31, 192.168.0.5/31] + include_in_underlay_protocol: true + underlay_multicast: false + # P2P link with underlay multicast(pim-sparse) enabled. + - nodes: [l3_edge_multicast, peer2] + interfaces: [ethernet2, ethernet2] + ip: [192.168.0.2/31, 192.168.0.3/31] + include_in_underlay_protocol: true + underlay_multicast: true diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/mgmt_interface_description.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/mgmt_interface_description.yml index d003ac8ece9..f120f4e8fd8 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/mgmt_interface_description.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/mgmt_interface_description.yml @@ -7,5 +7,6 @@ l2leaf: defaults: nodes: - name: mgmt_interface_description - mgmt_ip: 1.1.1.2 + mgmt_ip: 1.1.1.2/24 + mgmt_gateway: 1.1.1.254 id: 102 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/mgmt_interface_ipv6.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/mgmt_interface_ipv6.yml index f307d334e30..49d48beae9c 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/mgmt_interface_ipv6.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/mgmt_interface_ipv6.yml @@ -7,4 +7,6 @@ l2leaf: nodes: - name: mgmt_interface_ipv6 ipv6_mgmt_ip: 0200::105/64 + # this will take precedence over the global ipv6_mgmt_gateway + ipv6_mgmt_gateway: 0200::2 id: 103 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/platform_settings.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/platform_settings.yml index ffc06c5f7e3..4c1ca3a4bf6 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/platform_settings.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/host_vars/platform_settings.yml @@ -5,6 +5,13 @@ l2leaf: platform_settings: - platforms: [ default ] + # Test for security_entropy_sources + security_entropy_sources: + hardware: True + haveged: True + cpu_jitter: True + hardware_exclusive: True + # Test for structured_config structured_config: ethernet_interfaces: - name: Ethernet12 diff --git a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/hosts.yml b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/hosts.yml index 1fd6e5b639e..121d2ceb791 100644 --- a/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/hosts.yml +++ b/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/hosts.yml @@ -32,6 +32,7 @@ all: default_overlay_protocol_cvx: default_overlay_protocol_her: evpn_vlan_bundle: + evpn_vlan_bundle_svi_l2vlan: default_interface_mtu_hostvars: default_interface_mtu_platform: evpn-to-ipvpn-gateway: @@ -49,6 +50,7 @@ all: core-1-isis-sr-ldp: core-2-ospf-ldp: core-3-isis-sr-ldp: + core-4-multicast: TRUNK_GROUP_TESTS: children: TRUNK_GROUP_TESTS_L3LEAF: @@ -73,6 +75,10 @@ all: hosts: MLAG_ODD_ID_L3LEAF1A: MLAG_ODD_ID_L3LEAF1B: + MLAG_IPV6: + hosts: + MLAG_IPV6_L3LEAF1A: + MLAG_IPV6_L3LEAF1B: MLAG_SAME_SUBNET: hosts: MLAG_SAME_SUBNET_L3LEAF1A: @@ -253,7 +259,7 @@ all: sflow-tests-leaf1: sflow-tests-leaf2: children: - sflow-tests-leaf-mlag: + SFLOW_TESTS_LEAF_MLAG: hosts: sflow-tests-leaf3: sflow-tests-leaf4: @@ -261,6 +267,34 @@ all: hosts: sflow-tests-l2-leaf1: sflow-tests-l2-leaf2: + FLOW_TRACKING_TESTS: + children: + FLOW_TRACKING_TESTS_SPINES: + children: + FLOW_TRACKING_TESTS_SPINES_1: + hosts: + flow-tracking-tests-spine1: + FLOW_TRACKING_TESTS_SPINES_2: + hosts: + flow-tracking-tests-spine2: + FLOW_TRACKING_TESTS_LEAFS: + hosts: + flow-tracking-tests-leaf1: + children: + FLOW_TRACKING_TESTS_LEAFS_2: + hosts: + flow-tracking-tests-leaf2: + FLOW_TRACKING_TESTS_LEAF_MLAG: + children: + FLOW_TRACKING_TESTS_LEAFS_3: + hosts: + flow-tracking-tests-leaf3: + hosts: + flow-tracking-tests-leaf4: + FLOW_TRACKING_TESTS_L2_LEAFS: + hosts: + flow-tracking-tests-l2-leaf1: + flow-tracking-tests-l2-leaf2: SNMP_SETTINGS_TESTS: hosts: SNMP_SYSTEM_MAC_ENGINEID_1: @@ -278,6 +312,7 @@ all: l3_edge_bgp: l3_edge_ospf: l3_edge_isis: + l3_edge_multicast: UPLINK_NATIVE_VLAN_TESTS: hosts: uplink-native-vlan-grandparent: @@ -298,6 +333,11 @@ all: inband-mgmt-parent-ipv6-2: inband-mgmt-ipv6-only: inband-mgmt-ipv6-only-vrf: + inband-mgmt-mlag-a: + inband-mgmt-mlag-b: + MGMT_GATEWAY_TESTS: + hosts: + TEST-MGMT-GATEWAY-IN-NODE-GROUP: WAN_TESTS: children: AUTOVPN_TESTS: @@ -318,6 +358,10 @@ all: cv-pathfinder-transit1A: cv-pathfinder-transit1B: site-ha-enabled-leaf1: + SITE_DIRECT_HA: + hosts: + cv-pathfinder-edge3A: + cv-pathfinder-edge3B: SITE_HA_DISABLED: hosts: cv-pathfinder-edge: @@ -331,7 +375,7 @@ all: hosts: cv-pathfinder-pathfinder1: cv-pathfinder-pathfinder2: - CV-PATHFINDER_CUSTOM_CONTROL_PLANE_POLICY_TESTS: + CV_PATHFINDER_CUSTOM_CONTROL_PLANE_POLICY_TESTS: hosts: # Edge-1 and Pathfinder-1 override control plane policy but not app profile name cv-pathfinder-custom-control-plane-policy-edge-1: @@ -518,3 +562,7 @@ all: hosts: DUP-LEAF1: DUP-LEAF2: + PLATFORM_SETTINGS_TESTS: + hosts: + 7010TX-LEAF1: + 7010TX-LEAF2: diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/custom_anta_catalogs/DC1_SPINES.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/custom_anta_catalogs/DC1_SPINES.yml index e60ff0f2dde..361bf730e04 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/custom_anta_catalogs/DC1_SPINES.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/custom_anta_catalogs/DC1_SPINES.yml @@ -2,6 +2,7 @@ # These tests will be added to devices part of the DC1_SPINES group anta.tests.interfaces: - VerifyInterfaceUtilization: + threshold: 70.0 - VerifyInterfaceErrors: - VerifyInterfaceDiscards: - VerifyInterfaceErrDisabled: @@ -112,7 +113,65 @@ anta.tests.routing: - 10.1.255.0 - 10.1.255.2 - 10.1.255.4 + - VerifyBGPExchangedRoutes: + bgp_peers: + - peer_address: 172.30.255.5 + vrf: default + advertised_routes: + - 192.0.254.5/32 + received_routes: + - 192.0.255.4/32 + - peer_address: 172.30.255.1 + vrf: default + advertised_routes: + - 192.0.255.1/32 + - 192.0.254.5/32 + received_routes: + - 192.0.254.3/32 + - VerifyBGPPeerMPCaps: + bgp_peers: + - peer_address: 172.30.11.1 + vrf: default + capabilities: + - ipv4Unicast + - VerifyBGPPeerASNCap: + bgp_peers: + - peer_address: 172.30.11.1 + vrf: default + - VerifyBGPPeerRouteRefreshCap: + bgp_peers: + - peer_address: 172.30.11.1 + vrf: default + - VerifyBGPPeerMD5Auth: + bgp_peers: + - peer_address: 172.30.11.1 + vrf: default + - peer_address: 172.30.11.5 + vrf: default + - VerifyEVPNType2Route: + vxlan_endpoints: + - address: 192.168.20.102 + vni: 10020 + - address: aac1.ab5d.b41e + vni: 10010 + - VerifyBGPAdvCommunities: + bgp_peers: + - peer_address: 172.30.11.17 + vrf: default + - peer_address: 172.30.11.21 + vrf: default + - VerifyBGPTimers: + bgp_peers: + - peer_address: 172.30.11.1 + vrf: default + hold_time: 180 + keep_alive_time: 60 + - peer_address: 172.30.11.5 + vrf: default + hold_time: 180 + keep_alive_time: 60 ospf: - VerifyOSPFNeighborState: - VerifyOSPFNeighborCount: number: 3 + - VerifyOSPFMaxLSA: diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/custom_anta_catalogs/all.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/custom_anta_catalogs/all.yml index 5c556185348..c71292ef2ae 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/custom_anta_catalogs/all.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/custom_anta_catalogs/all.yml @@ -59,6 +59,130 @@ anta.tests.field_notices: - VerifyFieldNotice44Resolution: - VerifyFieldNotice72Resolution: +anta.tests.greent: + - VerifyGreenT: + - VerifyGreenTCounters: + +anta.tests.lanz: + - VerifyLANZ: + +anta.tests.ptp: + - VerifyPtpModeStatus: + - VerifyPtpGMStatus: + gmid: 0xec:46:70:ff:fe:00:ff:a9 + - VerifyPtpLockStatus: + - VerifyPtpOffset: + - VerifyPtpPortModeStatus: + +anta.tests.security: + - VerifySSHStatus: + - VerifySSHIPv4Acl: + number: 3 + vrf: default + - VerifySSHIPv6Acl: + number: 3 + vrf: default + - VerifyTelnetStatus: + - VerifyAPIHttpStatus: + - VerifyAPIHttpsSSL: + profile: default + - VerifyAPIIPv4Acl: + number: 3 + vrf: default + - VerifyAPIIPv6Acl: + number: 3 + vrf: default + - VerifyAPISSLCertificate: + certificates: + - certificate_name: ARISTA_SIGNING_CA.crt + expiry_threshold: 30 + common_name: AristaIT-ICA ECDSA Issuing Cert Authority + encryption_algorithm: ECDSA + key_size: 256 + - certificate_name: ARISTA_ROOT_CA.crt + expiry_threshold: 30 + common_name: Arista Networks Internal IT Root Cert Authority + encryption_algorithm: RSA + key_size: 4096 + - VerifyBannerLogin: + login_banner: | + # Copyright (c) 2023-2024 Arista Networks, Inc. + # Use of this source code is governed by the Apache License 2.0 + # that can be found in the LICENSE file. + - VerifyBannerMotd: + motd_banner: | + # Copyright (c) 2023-2024 Arista Networks, Inc. + # Use of this source code is governed by the Apache License 2.0 + # that can be found in the LICENSE file. + - VerifyIPv4ACL: + ipv4_access_lists: + - name: default-control-plane-acl + entries: + - sequence: 10 + action: permit icmp any any + - sequence: 20 + action: permit ip any any tracked + - sequence: 30 + action: permit udp any any eq bfd ttl eq 255 + - name: LabTest + entries: + - sequence: 10 + action: permit icmp any any + - sequence: 20 + action: permit tcp any any range 5900 5910 + - VerifyIPSecConnHealth: + - VerifySpecificIPSecConn: + ip_security_connections: + - peer: 10.255.0.1 + - peer: 10.255.0.2 + vrf: default + connections: + - source_address: 100.64.3.2 + destination_address: 100.64.2.2 + - source_address: 172.18.3.2 + destination_address: 172.18.2.2 + +anta.tests.services: + - VerifyHostname: + hostname: s1-spine1 + - VerifyDNSLookup: + domain_names: + - arista.com + - www.google.com + - arista.ca + - VerifyDNSServers: + dns_servers: + - server_address: 10.14.0.1 + vrf: default + priority: 1 + - server_address: 10.14.0.11 + vrf: MGMT + priority: 0 + - VerifyErrdisableRecovery: + reasons: + - reason: acl + interval: 30 + - reason: bpduguard + interval: 30 + +anta.tests.stun: + - VerifyStunClient: + stun_clients: + - source_address: 172.18.3.2 + public_address: 172.18.3.21 + source_port: 4500 + public_port: 6006 + - source_address: 100.64.3.2 + public_address: 100.64.3.21 + source_port: 4500 + public_port: 6006 + +anta.tests.vlan: + - VerifyVlanInternalPolicy: + policy: ascending + start_vlan_id: 1006 + end_vlan_id: 4094 + # Some of these hardware tests will be duplicated in the catalog, but ANTA will only run them once anta.tests.hardware: - VerifyTransceiversManufacturers: diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/custom_anta_catalogs/dc1-leaf1a.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/custom_anta_catalogs/dc1-leaf1a.yml index b6b1757fe17..53de01beb41 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/custom_anta_catalogs/dc1-leaf1a.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/custom_anta_catalogs/dc1-leaf1a.yml @@ -20,3 +20,6 @@ anta.tests.vxlan: vteps: - 10.1.1.5 - 10.1.1.6 + - VerifyVxlan1ConnSettings: + source_interface: Loopback1 + udp_port: 4789 diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-leaf1a.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-leaf1a.yml index 9fc4f540f8d..9188eb29a44 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-leaf1a.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-leaf1a.yml @@ -57,12 +57,12 @@ router_bgp: description: dc1-spine2_Ethernet1 - ip_address: 10.255.255.1 peer_group: IPv4-UNDERLAY-PEERS - remote_as: '65000' + remote_as: '65101' peer: dc1-wan1 description: dc1-wan1_Ethernet1 - ip_address: 10.255.255.5 peer_group: IPv4-UNDERLAY-PEERS - remote_as: '65000' + remote_as: '65101' peer: dc1-wan2 description: dc1-wan2_Ethernet1 - ip_address: 10.255.0.1 @@ -75,6 +75,9 @@ router_bgp: peer: dc1-spine2 description: dc1-spine2 remote_as: '65100' + - ip_address: 10.1.1.1 + description: External peer + peer_group: EVPN-OVERLAY-PEERS redistribute_routes: - source_protocol: connected route_map: RM-CONN-2-BGP @@ -266,9 +269,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.1.64/31 no_autostate: true mtu: 1500 + ip_address: 10.255.1.64/31 - name: Vlan11 tenant: TENANT1 description: VRF10_VLAN11 @@ -541,3 +544,13 @@ virtual_source_nat_vrfs: metadata: platform: vEOS-lab dns_domain: dc1.local +router_path_selection: + path_groups: + - name: Test_local_interface + id: 110 + dynamic_peers: + enabled: true + - name: Test_stun_server_profile + id: 210 + local_interfaces: + - name: Ethernet3 diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-leaf1b.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-leaf1b.yml index da5631307e4..32822669cc7 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-leaf1b.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-leaf1b.yml @@ -57,12 +57,12 @@ router_bgp: description: dc1-spine2_Ethernet2 - ip_address: 10.255.255.3 peer_group: IPv4-UNDERLAY-PEERS - remote_as: '65000' + remote_as: '65101' peer: dc1-wan1 description: dc1-wan1_Ethernet2 - ip_address: 10.255.255.7 peer_group: IPv4-UNDERLAY-PEERS - remote_as: '65000' + remote_as: '65101' peer: dc1-wan2 description: dc1-wan2_Ethernet2 - ip_address: 10.255.0.1 @@ -266,9 +266,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.1.65/31 no_autostate: true mtu: 1500 + ip_address: 10.255.1.65/31 - name: Vlan11 tenant: TENANT1 description: VRF10_VLAN11 diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-leaf2a.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-leaf2a.yml index 061cfa3d44a..f168db9619a 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-leaf2a.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-leaf2a.yml @@ -318,9 +318,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.1.68/31 no_autostate: true mtu: 1500 + ip_address: 10.255.1.68/31 - name: Vlan11 tenant: TENANT1 description: VRF10_VLAN11 diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-leaf2b.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-leaf2b.yml index ae3cffaac1f..d9ad5c2500f 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-leaf2b.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-leaf2b.yml @@ -318,9 +318,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.1.69/31 no_autostate: true mtu: 1500 + ip_address: 10.255.1.69/31 - name: Vlan11 tenant: TENANT1 description: VRF10_VLAN11 diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-spine1.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-spine1.yml index b22bb78d740..052d7aff4d2 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-spine1.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-spine1.yml @@ -59,6 +59,16 @@ router_bgp: remote_as: '65102' peer: dc1-leaf2b description: dc1-leaf2b_Ethernet1 + - ip_address: 10.33.255.17 + peer_group: IPv4-UNDERLAY-PEERS + remote_as: '65133' + peer: dc1-svc-leaf1a + description: dc1-svc-leaf1a_Ethernet1 + - ip_address: 10.33.255.21 + peer_group: IPv4-UNDERLAY-PEERS + remote_as: '65133' + peer: dc1-svc-leaf1b + description: dc1-svc-leaf1b_Ethernet1 - ip_address: 10.255.0.3 peer_group: EVPN-OVERLAY-PEERS peer: dc1-leaf1a @@ -79,6 +89,16 @@ router_bgp: peer: dc1-leaf2b description: dc1-leaf2b remote_as: '65102' + - ip_address: 10.33.0.5 + peer_group: EVPN-OVERLAY-PEERS + peer: dc1-svc-leaf1a + description: dc1-svc-leaf1a + remote_as: '65133' + - ip_address: 10.33.0.6 + peer_group: EVPN-OVERLAY-PEERS + peer: dc1-svc-leaf1b + description: dc1-svc-leaf1b + remote_as: '65133' - ip_address: 123.1.1.10 remote_as: '1234' password: oBztv71m2uhR7hh58/OCNA== @@ -197,6 +217,24 @@ ethernet_interfaces: mtu: 1500 type: routed ip_address: 10.255.255.12/31 +- name: Ethernet5 + peer: dc1-svc-leaf1a + peer_interface: Ethernet1 + peer_type: service_leaf + description: P2P_LINK_TO_DC1-SVC-LEAF1A_Ethernet1 + shutdown: false + mtu: 1500 + type: routed + ip_address: 10.33.255.16/31 +- name: Ethernet6 + peer: dc1-svc-leaf1b + peer_interface: Ethernet1 + peer_type: service_leaf + description: P2P_LINK_TO_DC1-SVC-LEAF1B_Ethernet1 + shutdown: false + mtu: 1500 + type: routed + ip_address: 10.33.255.20/31 loopback_interfaces: - name: Loopback0 description: EVPN_Overlay_Peering diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-spine2.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-spine2.yml index e40ee028a5e..4d080210011 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-spine2.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-spine2.yml @@ -65,6 +65,16 @@ router_bgp: remote_as: '65102' peer: dc1-leaf2b description: dc1-leaf2b_Ethernet2 + - ip_address: 10.33.255.19 + peer_group: IPv4-UNDERLAY-PEERS + remote_as: '65133' + peer: dc1-svc-leaf1a + description: dc1-svc-leaf1a_Ethernet2 + - ip_address: 10.33.255.23 + peer_group: IPv4-UNDERLAY-PEERS + remote_as: '65133' + peer: dc1-svc-leaf1b + description: dc1-svc-leaf1b_Ethernet2 - ip_address: 10.255.0.3 peer_group: EVPN-OVERLAY-PEERS peer: dc1-leaf1a @@ -85,6 +95,16 @@ router_bgp: peer: dc1-leaf2b description: dc1-leaf2b remote_as: '65102' + - ip_address: 10.33.0.5 + peer_group: EVPN-OVERLAY-PEERS + peer: dc1-svc-leaf1a + description: dc1-svc-leaf1a + remote_as: '65133' + - ip_address: 10.33.0.6 + peer_group: EVPN-OVERLAY-PEERS + peer: dc1-svc-leaf1b + description: dc1-svc-leaf1b + remote_as: '65133' - ip_address: 142.112.39.2 peer_group: IPv4-EXTERNAL-PEERS description: Primary_ISP_IPv4 @@ -179,6 +199,24 @@ ethernet_interfaces: mtu: 1500 type: routed ip_address: 10.255.255.14/31 +- name: Ethernet5 + peer: dc1-svc-leaf1a + peer_interface: Ethernet2 + peer_type: service_leaf + description: P2P_LINK_TO_DC1-SVC-LEAF1A_Ethernet2 + shutdown: false + mtu: 1500 + type: routed + ip_address: 10.33.255.18/31 +- name: Ethernet6 + peer: dc1-svc-leaf1b + peer_interface: Ethernet2 + peer_type: service_leaf + description: P2P_LINK_TO_DC1-SVC-LEAF1B_Ethernet2 + shutdown: false + mtu: 1500 + type: routed + ip_address: 10.33.255.22/31 loopback_interfaces: - name: Loopback0 description: EVPN_Overlay_Peering diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-svc-leaf1a.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-svc-leaf1a.yml new file mode 100644 index 00000000000..46761ee5e89 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-svc-leaf1a.yml @@ -0,0 +1,242 @@ +hostname: dc1-svc-leaf1a +is_deployed: true +router_bgp: + as: '65133' + router_id: 10.33.0.5 + bgp: + default: + ipv4_unicast: false + maximum_paths: + paths: 4 + ecmp: 4 + peer_groups: + - name: MLAG-IPv4-UNDERLAY-PEER + type: ipv4 + remote_as: '65133' + next_hop_self: true + description: dc1-svc-leaf1b + password: 4b21pAdCvWeAqpcKDFMdWw== + maximum_routes: 12000 + send_community: all + route_map_in: RM-MLAG-PEER-IN + - name: IPv4-UNDERLAY-PEERS + type: ipv4 + password: 7x4B4rnJhZB438m9+BrBfQ== + maximum_routes: 12000 + send_community: all + - name: EVPN-OVERLAY-PEERS + type: evpn + update_source: Loopback0 + bfd: true + password: Q4fqtbqcZ7oQuKfuWtNGRQ== + send_community: all + maximum_routes: 0 + ebgp_multihop: 3 + address_family_ipv4: + peer_groups: + - name: MLAG-IPv4-UNDERLAY-PEER + activate: true + - name: IPv4-UNDERLAY-PEERS + activate: true + - name: EVPN-OVERLAY-PEERS + activate: false + neighbors: + - ip_address: 10.33.1.105 + peer_group: MLAG-IPv4-UNDERLAY-PEER + peer: dc1-svc-leaf1b + description: dc1-svc-leaf1b + - ip_address: 10.33.255.16 + peer_group: IPv4-UNDERLAY-PEERS + remote_as: '65100' + peer: dc1-spine1 + description: dc1-spine1_Ethernet5 + - ip_address: 10.33.255.18 + peer_group: IPv4-UNDERLAY-PEERS + remote_as: '65100' + peer: dc1-spine2 + description: dc1-spine2_Ethernet5 + - ip_address: 10.255.0.1 + peer_group: EVPN-OVERLAY-PEERS + peer: dc1-spine1 + description: dc1-spine1 + remote_as: '65100' + - ip_address: 10.255.0.2 + peer_group: EVPN-OVERLAY-PEERS + peer: dc1-spine2 + description: dc1-spine2 + remote_as: '65100' + redistribute_routes: + - source_protocol: connected + route_map: RM-CONN-2-BGP + address_family_evpn: + peer_groups: + - name: EVPN-OVERLAY-PEERS + activate: true +static_routes: +- vrf: MGMT + destination_address_prefix: 0.0.0.0/0 + gateway: 172.16.1.1 +service_routing_protocols_model: multi-agent +ip_routing: true +vlan_internal_order: + allocation: ascending + range: + beginning: 1006 + ending: 1199 +spanning_tree: + mode: mstp + mst_instances: + - id: '0' + priority: 4096 + no_spanning_tree_vlan: 4093-4094 +local_users: +- name: admin + privilege: 15 + role: network-admin + no_password: true +- name: ansible + privilege: 15 + role: network-admin + sha512_password: $6$7u4j1rkb3VELgcZE$EJt2Qff8kd/TapRoci0XaIZsL4tFzgq1YZBLD9c6f/knXzvcYY0NcMKndZeCv0T268knGKhOEwZAxqKjlMm920 +vrfs: +- name: MGMT + ip_routing: false +management_interfaces: +- name: Management1 + description: oob_management + shutdown: false + vrf: MGMT + ip_address: 172.16.1.31/24 + gateway: 172.16.1.1 + type: oob +management_api_http: + enable_vrfs: + - name: MGMT + enable_https: true + https_ssl_profile: eAPI_SSL_Profile +vlans: +- id: 4093 + tenant: system + name: LEAF_PEER_L3 + trunk_groups: + - LEAF_PEER_L3 +- id: 4094 + tenant: system + name: MLAG_PEER + trunk_groups: + - MLAG +vlan_interfaces: +- name: Vlan4093 + description: MLAG_PEER_L3_PEERING + shutdown: false + mtu: 1500 + ip_address: 10.33.1.104/31 +- name: Vlan4094 + description: MLAG_PEER + shutdown: false + no_autostate: true + mtu: 1500 + ip_address: 10.33.1.72/31 +port_channel_interfaces: +- name: Port-Channel3 + description: MLAG_PEER_dc1-svc-leaf1b_Po3 + type: switched + shutdown: false + mode: trunk + trunk_groups: + - LEAF_PEER_L3 + - MLAG +ethernet_interfaces: +- name: Ethernet3 + peer: dc1-svc-leaf1b + peer_interface: Ethernet3 + peer_type: mlag_peer + description: MLAG_PEER_dc1-svc-leaf1b_Ethernet3 + type: port-channel-member + shutdown: false + channel_group: + id: 3 + mode: active +- name: Ethernet4 + peer: dc1-svc-leaf1b + peer_interface: Ethernet4 + peer_type: mlag_peer + description: MLAG_PEER_dc1-svc-leaf1b_Ethernet4 + type: port-channel-member + shutdown: false + channel_group: + id: 3 + mode: active +- name: Ethernet1 + peer: dc1-spine1 + peer_interface: Ethernet5 + peer_type: spine + description: P2P_LINK_TO_DC1-SPINE1_Ethernet5 + shutdown: false + mtu: 1500 + type: routed + ip_address: 10.33.255.17/31 +- name: Ethernet2 + peer: dc1-spine2 + peer_interface: Ethernet5 + peer_type: spine + description: P2P_LINK_TO_DC1-SPINE2_Ethernet5 + shutdown: false + mtu: 1500 + type: routed + ip_address: 10.33.255.19/31 +mlag_configuration: + domain_id: DC1_SVC_LEAF1 + local_interface: Vlan4094 + peer_address: 10.33.1.73 + peer_link: Port-Channel3 + reload_delay_mlag: '300' + reload_delay_non_mlag: '330' +route_maps: +- name: RM-MLAG-PEER-IN + sequence_numbers: + - sequence: 10 + type: permit + set: + - origin incomplete + description: Make routes learned over MLAG Peer-link less preferred on spines to ensure optimal routing +- name: RM-CONN-2-BGP + sequence_numbers: + - sequence: 10 + type: permit + match: + - ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY +loopback_interfaces: +- name: Loopback0 + description: EVPN_Overlay_Peering + shutdown: false + ip_address: 10.33.0.5/32 +- name: Loopback1 + description: VTEP_VXLAN_Tunnel_Source + shutdown: false + ip_address: 10.33.1.5/32 +prefix_lists: +- name: PL-LOOPBACKS-EVPN-OVERLAY + sequence_numbers: + - sequence: 10 + action: permit 10.33.0.0/27 eq 32 + - sequence: 20 + action: permit 10.33.1.0/27 eq 32 +router_bfd: + multihop: + interval: 300 + min_rx: 300 + multiplier: 3 +ip_igmp_snooping: + globally_enabled: true +ip_virtual_router_mac_address: 00:1c:73:00:00:99 +vxlan_interface: + Vxlan1: + description: dc1-svc-leaf1a_VTEP + vxlan: + udp_port: 4789 + source_interface: Loopback1 + virtual_router_encapsulation_mac_address: mlag-system-id +metadata: + platform: vEOS-lab +dns_domain: dc1.local diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-svc-leaf1b.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-svc-leaf1b.yml new file mode 100644 index 00000000000..dbcf5235fd8 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-svc-leaf1b.yml @@ -0,0 +1,242 @@ +hostname: dc1-svc-leaf1b +is_deployed: true +router_bgp: + as: '65133' + router_id: 10.33.0.6 + bgp: + default: + ipv4_unicast: false + maximum_paths: + paths: 4 + ecmp: 4 + peer_groups: + - name: MLAG-IPv4-UNDERLAY-PEER + type: ipv4 + remote_as: '65133' + next_hop_self: true + description: dc1-svc-leaf1a + password: 4b21pAdCvWeAqpcKDFMdWw== + maximum_routes: 12000 + send_community: all + route_map_in: RM-MLAG-PEER-IN + - name: IPv4-UNDERLAY-PEERS + type: ipv4 + password: 7x4B4rnJhZB438m9+BrBfQ== + maximum_routes: 12000 + send_community: all + - name: EVPN-OVERLAY-PEERS + type: evpn + update_source: Loopback0 + bfd: true + password: Q4fqtbqcZ7oQuKfuWtNGRQ== + send_community: all + maximum_routes: 0 + ebgp_multihop: 3 + address_family_ipv4: + peer_groups: + - name: MLAG-IPv4-UNDERLAY-PEER + activate: true + - name: IPv4-UNDERLAY-PEERS + activate: true + - name: EVPN-OVERLAY-PEERS + activate: false + neighbors: + - ip_address: 10.33.1.104 + peer_group: MLAG-IPv4-UNDERLAY-PEER + peer: dc1-svc-leaf1a + description: dc1-svc-leaf1a + - ip_address: 10.33.255.20 + peer_group: IPv4-UNDERLAY-PEERS + remote_as: '65100' + peer: dc1-spine1 + description: dc1-spine1_Ethernet6 + - ip_address: 10.33.255.22 + peer_group: IPv4-UNDERLAY-PEERS + remote_as: '65100' + peer: dc1-spine2 + description: dc1-spine2_Ethernet6 + - ip_address: 10.255.0.1 + peer_group: EVPN-OVERLAY-PEERS + peer: dc1-spine1 + description: dc1-spine1 + remote_as: '65100' + - ip_address: 10.255.0.2 + peer_group: EVPN-OVERLAY-PEERS + peer: dc1-spine2 + description: dc1-spine2 + remote_as: '65100' + redistribute_routes: + - source_protocol: connected + route_map: RM-CONN-2-BGP + address_family_evpn: + peer_groups: + - name: EVPN-OVERLAY-PEERS + activate: true +static_routes: +- vrf: MGMT + destination_address_prefix: 0.0.0.0/0 + gateway: 172.16.1.1 +service_routing_protocols_model: multi-agent +ip_routing: true +vlan_internal_order: + allocation: ascending + range: + beginning: 1006 + ending: 1199 +spanning_tree: + mode: mstp + mst_instances: + - id: '0' + priority: 4096 + no_spanning_tree_vlan: 4093-4094 +local_users: +- name: admin + privilege: 15 + role: network-admin + no_password: true +- name: ansible + privilege: 15 + role: network-admin + sha512_password: $6$7u4j1rkb3VELgcZE$EJt2Qff8kd/TapRoci0XaIZsL4tFzgq1YZBLD9c6f/knXzvcYY0NcMKndZeCv0T268knGKhOEwZAxqKjlMm920 +vrfs: +- name: MGMT + ip_routing: false +management_interfaces: +- name: Management1 + description: oob_management + shutdown: false + vrf: MGMT + ip_address: 172.16.1.32/24 + gateway: 172.16.1.1 + type: oob +management_api_http: + enable_vrfs: + - name: MGMT + enable_https: true + https_ssl_profile: eAPI_SSL_Profile +vlans: +- id: 4093 + tenant: system + name: LEAF_PEER_L3 + trunk_groups: + - LEAF_PEER_L3 +- id: 4094 + tenant: system + name: MLAG_PEER + trunk_groups: + - MLAG +vlan_interfaces: +- name: Vlan4093 + description: MLAG_PEER_L3_PEERING + shutdown: false + mtu: 1500 + ip_address: 10.33.1.105/31 +- name: Vlan4094 + description: MLAG_PEER + shutdown: false + no_autostate: true + mtu: 1500 + ip_address: 10.33.1.73/31 +port_channel_interfaces: +- name: Port-Channel3 + description: MLAG_PEER_dc1-svc-leaf1a_Po3 + type: switched + shutdown: false + mode: trunk + trunk_groups: + - LEAF_PEER_L3 + - MLAG +ethernet_interfaces: +- name: Ethernet3 + peer: dc1-svc-leaf1a + peer_interface: Ethernet3 + peer_type: mlag_peer + description: MLAG_PEER_dc1-svc-leaf1a_Ethernet3 + type: port-channel-member + shutdown: false + channel_group: + id: 3 + mode: active +- name: Ethernet4 + peer: dc1-svc-leaf1a + peer_interface: Ethernet4 + peer_type: mlag_peer + description: MLAG_PEER_dc1-svc-leaf1a_Ethernet4 + type: port-channel-member + shutdown: false + channel_group: + id: 3 + mode: active +- name: Ethernet1 + peer: dc1-spine1 + peer_interface: Ethernet6 + peer_type: spine + description: P2P_LINK_TO_DC1-SPINE1_Ethernet6 + shutdown: false + mtu: 1500 + type: routed + ip_address: 10.33.255.21/31 +- name: Ethernet2 + peer: dc1-spine2 + peer_interface: Ethernet6 + peer_type: spine + description: P2P_LINK_TO_DC1-SPINE2_Ethernet6 + shutdown: false + mtu: 1500 + type: routed + ip_address: 10.33.255.23/31 +mlag_configuration: + domain_id: DC1_SVC_LEAF1 + local_interface: Vlan4094 + peer_address: 10.33.1.72 + peer_link: Port-Channel3 + reload_delay_mlag: '300' + reload_delay_non_mlag: '330' +route_maps: +- name: RM-MLAG-PEER-IN + sequence_numbers: + - sequence: 10 + type: permit + set: + - origin incomplete + description: Make routes learned over MLAG Peer-link less preferred on spines to ensure optimal routing +- name: RM-CONN-2-BGP + sequence_numbers: + - sequence: 10 + type: permit + match: + - ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY +loopback_interfaces: +- name: Loopback0 + description: EVPN_Overlay_Peering + shutdown: false + ip_address: 10.33.0.6/32 +- name: Loopback1 + description: VTEP_VXLAN_Tunnel_Source + shutdown: false + ip_address: 10.33.1.5/32 +prefix_lists: +- name: PL-LOOPBACKS-EVPN-OVERLAY + sequence_numbers: + - sequence: 10 + action: permit 10.33.0.0/27 eq 32 + - sequence: 20 + action: permit 10.33.1.0/27 eq 32 +router_bfd: + multihop: + interval: 300 + min_rx: 300 + multiplier: 3 +ip_igmp_snooping: + globally_enabled: true +ip_virtual_router_mac_address: 00:1c:73:00:00:99 +vxlan_interface: + Vxlan1: + description: dc1-svc-leaf1b_VTEP + vxlan: + udp_port: 4789 + source_interface: Loopback1 + virtual_router_encapsulation_mac_address: mlag-system-id +metadata: + platform: vEOS-lab +dns_domain: dc1.local diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-wan1.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-wan1.yml index 9fdf498f05e..ead06f2872d 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-wan1.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-wan1.yml @@ -1,7 +1,7 @@ hostname: dc1-wan1 is_deployed: true router_bgp: - as: '65000' + as: '65101' router_id: 10.255.2.1 bgp: default: @@ -28,7 +28,7 @@ router_bgp: password: htm4AZe9mIQOO1uiMuGgYQ== send_community: all maximum_routes: 0 - remote_as: '65000' + remote_as: '65101' ttl_maximum_hops: 1 bfd_timers: interval: 1000 @@ -54,12 +54,35 @@ router_bgp: remote_as: '65101' peer: dc1-leaf1b description: dc1-leaf1b_Ethernet6 + - ip_address: 10.255.255.10 + peer_group: WAN-OVERLAY-PEERS + peer: dc1-leaf1a + description: dc1-leaf1a + - ip_address: 10.255.255.20 + peer_group: WAN-OVERLAY-PEERS + peer: dc1-leaf1b + description: dc1-leaf1b + - ip_address: 10.255.1.2 + peer: dc1-wan2 + description: dc1-wan2 + remote_as: '65101' + update_source: Dps1 + route_reflector_client: true + send_community: all + route_map_in: RM-WAN-HA-PEER-IN + route_map_out: RM-WAN-HA-PEER-OUT address_family_evpn: peer_groups: - name: WAN-OVERLAY-PEERS activate: true route_map_in: RM-EVPN-SOO-IN route_map_out: RM-EVPN-SOO-OUT + neighbor_default: + next_hop_self_received_evpn_routes: + enable: true + neighbors: + - ip_address: 10.255.1.2 + activate: true address_family_ipv4_sr_te: peer_groups: - name: WAN-OVERLAY-PEERS @@ -172,7 +195,7 @@ as_path: - name: ASPATH-WAN entries: - type: permit - match: '65000' + match: '65101' prefix_lists: - name: PL-LOOPBACKS-EVPN-OVERLAY sequence_numbers: @@ -216,36 +239,22 @@ route_maps: match: - ip address prefix-list PL-WAN-HA-PEER-PREFIXES - sequence: 20 - type: permit - description: Allow prefixes originated from the HA peer - match: - - extcommunity ECL-EVPN-SOO - set: - - as-path match all replacement auto auto - - sequence: 30 - type: permit - description: Use WAN routes from HA peer as backup + type: deny + description: Deny other routes from the HA peer match: - as-path ASPATH-WAN - set: - - community no-advertise - name: RM-BGP-UNDERLAY-PEERS-OUT sequence_numbers: - sequence: 10 type: permit - description: Advertise local routes towards LAN - match: - - extcommunity ECL-EVPN-SOO - - sequence: 20 - type: permit - description: Advertise routes received from WAN iBGP towards LAN + description: Make routes learned from WAN HA peer less preferred on LAN routers match: + - tag 50 - route-type internal - - sequence: 30 + set: + - metric 50 + - sequence: 20 type: permit - description: Advertise WAN HA prefixes towards LAN - match: - - ip address prefix-list PL-WAN-HA-PREFIXES - name: RM-EVPN-SOO-IN sequence_numbers: - sequence: 10 @@ -260,6 +269,27 @@ route_maps: type: permit set: - extcommunity soo 10.255.2.1:100 additive +- name: RM-WAN-HA-PEER-IN + sequence_numbers: + - sequence: 10 + type: permit + description: Set tag 50 on routes received from HA peer over EVPN + set: + - tag 50 +- name: RM-WAN-HA-PEER-OUT + sequence_numbers: + - sequence: 10 + type: permit + description: Make EVPN routes learned from WAN less preferred on HA peer + match: + - route-type internal + set: + - local-preference 50 + - sequence: 20 + type: permit + description: Make locally injected routes less preferred on HA peer + set: + - local-preference 75 - name: RM-EVPN-EXPORT-VRF-DEFAULT sequence_numbers: - sequence: 10 @@ -271,20 +301,6 @@ agents: environment_variables: - name: KERNELFIB_PROGRAM_ALL_ECMP value: '1' -flow_tracking: - hardware: - trackers: - - name: FLOW-TRACKER - record_export: - on_inactive_timeout: 70000 - on_interval: 300000 - exporters: - - name: CV-TELEMETRY - collector: - host: 127.0.0.1 - local_interface: Loopback0 - template_interval: 3600000 - shutdown: false ip_extcommunity_lists: - name: ECL-EVPN-SOO entries: @@ -382,15 +398,41 @@ router_path_selection: id: 101 local_interfaces: - name: Ethernet3 + stun: + server_profiles: + - mpls-dc1-leaf1a-Ethernet6 + - mpls-dc1-leaf1b-Ethernet6 dynamic_peers: enabled: true + static_peers: + - router_ip: 10.255.255.10 + name: dc1-leaf1a + ipv4_addresses: + - 172.18.1.2 + - router_ip: 10.255.255.20 + name: dc1-leaf1b + ipv4_addresses: + - 172.18.2.2 ipsec_profile: CP-PROFILE - name: internet id: 102 local_interfaces: - name: Ethernet4 + stun: + server_profiles: + - internet-dc1-leaf1a-Ethernet7 + - internet-dc1-leaf1b-Ethernet7 dynamic_peers: enabled: true + static_peers: + - router_ip: 10.255.255.10 + name: dc1-leaf1a + ipv4_addresses: + - 100.64.1.2 + - router_ip: 10.255.255.20 + name: dc1-leaf1b + ipv4_addresses: + - 100.64.2.2 ipsec_profile: CP-PROFILE - name: LAN_HA id: 65535 @@ -418,6 +460,21 @@ router_path_selection: - name: LAN_HA router_traffic_engineering: enabled: true +stun: + client: + server_profiles: + - name: mpls-dc1-leaf1a-Ethernet6 + ip_address: 172.18.1.2 + ssl_profile: STUN-DTLS + - name: mpls-dc1-leaf1b-Ethernet6 + ip_address: 172.18.2.2 + ssl_profile: STUN-DTLS + - name: internet-dc1-leaf1a-Ethernet7 + ip_address: 100.64.1.2 + ssl_profile: STUN-DTLS + - name: internet-dc1-leaf1b-Ethernet7 + ip_address: 100.64.2.2 + ssl_profile: STUN-DTLS application_traffic_recognition: application_profiles: - name: APP-PROFILE-CONTROL-PLANE @@ -430,13 +487,16 @@ application_traffic_recognition: field_sets: ipv4_prefixes: - name: PFX-PATHFINDERS + prefix_values: + - 10.255.255.10/32 + - 10.255.255.20/32 dps_interfaces: - name: Dps1 description: DPS Interface mtu: 9214 ip_address: 10.255.1.1/32 flow_tracker: - hardware: FLOW-TRACKER + sampled: FLOW-TRACKER vxlan_interface: Vxlan1: description: dc1-wan1_VTEP @@ -446,6 +506,21 @@ vxlan_interface: vrfs: - name: default vni: 1 +flow_tracking: + sampled: + sample: 10000 + trackers: + - name: FLOW-TRACKER + record_export: + on_inactive_timeout: 70000 + on_interval: 300000 + exporters: + - name: CV-TELEMETRY + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 3600000 + shutdown: false metadata: cv_tags: device_tags: @@ -498,4 +573,7 @@ metadata: carrier: isp-1 circuit_id: DC1-INET-3 pathgroup: internet + pathfinders: + - vtep_ip: 10.255.255.10 + - vtep_ip: 10.255.255.20 dns_domain: dc1.local diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-wan2.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-wan2.yml index 2576758f276..65381a42c21 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-wan2.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc1-wan2.yml @@ -1,7 +1,7 @@ hostname: dc1-wan2 is_deployed: true router_bgp: - as: '65000' + as: '65101' router_id: 10.255.2.2 bgp: default: @@ -28,7 +28,7 @@ router_bgp: password: htm4AZe9mIQOO1uiMuGgYQ== send_community: all maximum_routes: 0 - remote_as: '65000' + remote_as: '65101' ttl_maximum_hops: 1 bfd_timers: interval: 1000 @@ -54,12 +54,35 @@ router_bgp: remote_as: '65101' peer: dc1-leaf1b description: dc1-leaf1b_Ethernet7 + - ip_address: 10.255.255.10 + peer_group: WAN-OVERLAY-PEERS + peer: dc1-leaf1a + description: dc1-leaf1a + - ip_address: 10.255.255.20 + peer_group: WAN-OVERLAY-PEERS + peer: dc1-leaf1b + description: dc1-leaf1b + - ip_address: 10.255.1.1 + peer: dc1-wan1 + description: dc1-wan1 + remote_as: '65101' + update_source: Dps1 + route_reflector_client: true + send_community: all + route_map_in: RM-WAN-HA-PEER-IN + route_map_out: RM-WAN-HA-PEER-OUT address_family_evpn: peer_groups: - name: WAN-OVERLAY-PEERS activate: true route_map_in: RM-EVPN-SOO-IN route_map_out: RM-EVPN-SOO-OUT + neighbor_default: + next_hop_self_received_evpn_routes: + enable: true + neighbors: + - ip_address: 10.255.1.1 + activate: true address_family_ipv4_sr_te: peer_groups: - name: WAN-OVERLAY-PEERS @@ -172,7 +195,7 @@ as_path: - name: ASPATH-WAN entries: - type: permit - match: '65000' + match: '65101' prefix_lists: - name: PL-LOOPBACKS-EVPN-OVERLAY sequence_numbers: @@ -216,36 +239,22 @@ route_maps: match: - ip address prefix-list PL-WAN-HA-PEER-PREFIXES - sequence: 20 - type: permit - description: Allow prefixes originated from the HA peer - match: - - extcommunity ECL-EVPN-SOO - set: - - as-path match all replacement auto auto - - sequence: 30 - type: permit - description: Use WAN routes from HA peer as backup + type: deny + description: Deny other routes from the HA peer match: - as-path ASPATH-WAN - set: - - community no-advertise - name: RM-BGP-UNDERLAY-PEERS-OUT sequence_numbers: - sequence: 10 type: permit - description: Advertise local routes towards LAN - match: - - extcommunity ECL-EVPN-SOO - - sequence: 20 - type: permit - description: Advertise routes received from WAN iBGP towards LAN + description: Make routes learned from WAN HA peer less preferred on LAN routers match: + - tag 50 - route-type internal - - sequence: 30 + set: + - metric 50 + - sequence: 20 type: permit - description: Advertise WAN HA prefixes towards LAN - match: - - ip address prefix-list PL-WAN-HA-PREFIXES - name: RM-EVPN-SOO-IN sequence_numbers: - sequence: 10 @@ -260,6 +269,27 @@ route_maps: type: permit set: - extcommunity soo 10.255.2.1:100 additive +- name: RM-WAN-HA-PEER-IN + sequence_numbers: + - sequence: 10 + type: permit + description: Set tag 50 on routes received from HA peer over EVPN + set: + - tag 50 +- name: RM-WAN-HA-PEER-OUT + sequence_numbers: + - sequence: 10 + type: permit + description: Make EVPN routes learned from WAN less preferred on HA peer + match: + - route-type internal + set: + - local-preference 50 + - sequence: 20 + type: permit + description: Make locally injected routes less preferred on HA peer + set: + - local-preference 75 - name: RM-EVPN-EXPORT-VRF-DEFAULT sequence_numbers: - sequence: 10 @@ -271,20 +301,6 @@ agents: environment_variables: - name: KERNELFIB_PROGRAM_ALL_ECMP value: '1' -flow_tracking: - hardware: - trackers: - - name: FLOW-TRACKER - record_export: - on_inactive_timeout: 70000 - on_interval: 300000 - exporters: - - name: CV-TELEMETRY - collector: - host: 127.0.0.1 - local_interface: Loopback0 - template_interval: 3600000 - shutdown: false ip_extcommunity_lists: - name: ECL-EVPN-SOO entries: @@ -382,15 +398,41 @@ router_path_selection: id: 101 local_interfaces: - name: Ethernet3 + stun: + server_profiles: + - mpls-dc1-leaf1a-Ethernet6 + - mpls-dc1-leaf1b-Ethernet6 dynamic_peers: enabled: true + static_peers: + - router_ip: 10.255.255.10 + name: dc1-leaf1a + ipv4_addresses: + - 172.18.1.2 + - router_ip: 10.255.255.20 + name: dc1-leaf1b + ipv4_addresses: + - 172.18.2.2 ipsec_profile: CP-PROFILE - name: internet id: 102 local_interfaces: - name: Ethernet4 + stun: + server_profiles: + - internet-dc1-leaf1a-Ethernet7 + - internet-dc1-leaf1b-Ethernet7 dynamic_peers: enabled: true + static_peers: + - router_ip: 10.255.255.10 + name: dc1-leaf1a + ipv4_addresses: + - 100.64.1.2 + - router_ip: 10.255.255.20 + name: dc1-leaf1b + ipv4_addresses: + - 100.64.2.2 ipsec_profile: CP-PROFILE - name: LAN_HA id: 65535 @@ -418,6 +460,21 @@ router_path_selection: - name: LAN_HA router_traffic_engineering: enabled: true +stun: + client: + server_profiles: + - name: mpls-dc1-leaf1a-Ethernet6 + ip_address: 172.18.1.2 + ssl_profile: STUN-DTLS + - name: mpls-dc1-leaf1b-Ethernet6 + ip_address: 172.18.2.2 + ssl_profile: STUN-DTLS + - name: internet-dc1-leaf1a-Ethernet7 + ip_address: 100.64.1.2 + ssl_profile: STUN-DTLS + - name: internet-dc1-leaf1b-Ethernet7 + ip_address: 100.64.2.2 + ssl_profile: STUN-DTLS application_traffic_recognition: application_profiles: - name: APP-PROFILE-CONTROL-PLANE @@ -430,13 +487,16 @@ application_traffic_recognition: field_sets: ipv4_prefixes: - name: PFX-PATHFINDERS + prefix_values: + - 10.255.255.10/32 + - 10.255.255.20/32 dps_interfaces: - name: Dps1 description: DPS Interface mtu: 9214 ip_address: 10.255.1.2/32 flow_tracker: - hardware: FLOW-TRACKER + sampled: FLOW-TRACKER vxlan_interface: Vxlan1: description: dc1-wan2_VTEP @@ -446,6 +506,21 @@ vxlan_interface: vrfs: - name: default vni: 1 +flow_tracking: + sampled: + sample: 10000 + trackers: + - name: FLOW-TRACKER + record_export: + on_inactive_timeout: 70000 + on_interval: 300000 + exporters: + - name: CV-TELEMETRY + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 3600000 + shutdown: false metadata: cv_tags: device_tags: @@ -498,4 +573,7 @@ metadata: carrier: isp-1 circuit_id: DC1-INET-4 pathgroup: internet + pathfinders: + - vtep_ip: 10.255.255.10 + - vtep_ip: 10.255.255.20 dns_domain: dc1.local diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc2-leaf1a.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc2-leaf1a.yml index da075d54258..dc39ec13cc6 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc2-leaf1a.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc2-leaf1a.yml @@ -252,9 +252,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.129.84/31 no_autostate: true mtu: 1500 + ip_address: 10.255.129.84/31 - name: Vlan11 tenant: TENANT1 description: VRF10_VLAN11 diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc2-leaf1b.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc2-leaf1b.yml index bed66819c92..a8f7be675c7 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc2-leaf1b.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc2-leaf1b.yml @@ -252,9 +252,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.129.85/31 no_autostate: true mtu: 1500 + ip_address: 10.255.129.85/31 - name: Vlan11 tenant: TENANT1 description: VRF10_VLAN11 diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc2-leaf2a.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc2-leaf2a.yml index 5fe64e21ec5..dfedb507754 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc2-leaf2a.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc2-leaf2a.yml @@ -314,9 +314,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.129.88/31 no_autostate: true mtu: 1500 + ip_address: 10.255.129.88/31 - name: Vlan11 tenant: TENANT1 description: VRF10_VLAN11 diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc2-leaf2b.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc2-leaf2b.yml index 8e577507d8d..f8917deb9d5 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc2-leaf2b.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc2-leaf2b.yml @@ -314,9 +314,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.129.89/31 no_autostate: true mtu: 1500 + ip_address: 10.255.129.89/31 - name: Vlan11 tenant: TENANT1 description: VRF10_VLAN11 diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc2-leaf3a.arista.com.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc2-leaf3a.arista.com.yml index 9b02c8f1cc5..cd910ec9575 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc2-leaf3a.arista.com.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc2-leaf3a.arista.com.yml @@ -252,9 +252,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.129.92/31 no_autostate: true mtu: 1500 + ip_address: 10.255.129.92/31 - name: Vlan11 tenant: TENANT1 description: VRF10_VLAN11 diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc2-leaf3b.arista.com.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc2-leaf3b.arista.com.yml index 6ac09b7c501..317d0acbe0c 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc2-leaf3b.arista.com.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/structured_configs/dc2-leaf3b.arista.com.yml @@ -252,9 +252,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.129.93/31 no_autostate: true mtu: 1500 + ip_address: 10.255.129.93/31 - name: Vlan11 tenant: TENANT1 description: VRF10_VLAN11 diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-leaf1a-catalog.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-leaf1a-catalog.yml index a2c291044a7..ada71a4e151 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-leaf1a-catalog.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-leaf1a-catalog.yml @@ -200,6 +200,24 @@ anta.tests.connectivity: result_overwrite: custom_field: 'Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2)' +- VerifyReachability: + hosts: + - destination: 10.33.0.5 + repeat: 1 + source: 10.255.0.3 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-svc-leaf1a + Loopback0 (IP: 10.33.0.5)' +- VerifyReachability: + hosts: + - destination: 10.33.0.6 + repeat: 1 + source: 10.255.0.3 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-svc-leaf1b + Loopback0 (IP: 10.33.0.6)' - VerifyReachability: hosts: - destination: 10.255.128.11 @@ -275,26 +293,32 @@ anta.tests.connectivity: anta.tests.field_notices: - VerifyFieldNotice44Resolution: null - VerifyFieldNotice72Resolution: null +anta.tests.greent: +- VerifyGreenT: null +- VerifyGreenTCounters: null anta.tests.hardware: - VerifyEnvironmentPower: result_overwrite: - custom_field: 'Accepted States: ''ok''' + custom_field: 'Accepted States: ''ok'', ''Not Present''' states: - ok + - Not Present - VerifyEnvironmentCooling: result_overwrite: - custom_field: 'Accepted States: ''ok''' + custom_field: 'Accepted States: ''ok'', ''Not Present''' states: - ok + - Not Present - VerifyTemperature: null - VerifyTransceiversManufacturers: manufacturers: - - Arista Networks - Arastra, Inc. + - Arista Networks + - Generic - Not Present result_overwrite: - custom_field: 'Accepted Manufacturers: ''Arista Networks'', ''Arastra, Inc.'', - ''Not Present''' + custom_field: 'Accepted Manufacturers: ''Arastra, Inc.'', ''Arista Networks'', + ''Generic'', ''Not Present''' - VerifyTransceiversManufacturers: manufacturers: - Not Present @@ -462,6 +486,8 @@ anta.tests.interfaces: status: up result_overwrite: custom_field: Interface Vxlan1 = 'up' +anta.tests.lanz: +- VerifyLANZ: null anta.tests.mlag: - VerifyMlagStatus: null anta.tests.profiles: @@ -469,6 +495,13 @@ anta.tests.profiles: mode: 3 - VerifyTcamProfile: profile: vxlan-routing +anta.tests.ptp: +- VerifyPtpModeStatus: null +- VerifyPtpGMStatus: + gmid: 0xec:46:70:ff:fe:00:ff:a9 +- VerifyPtpLockStatus: null +- VerifyPtpOffset: null +- VerifyPtpPortModeStatus: null anta.tests.routing.bgp: - VerifyBGPSpecificPeers: address_families: @@ -484,6 +517,13 @@ anta.tests.routing.bgp: - 10.255.0.2 result_overwrite: custom_field: 'BGP EVPN Peer: dc1-spine2 (IP: 10.255.0.2)' +- VerifyBGPSpecificPeers: + address_families: + - afi: evpn + peers: + - 10.1.1.1 + result_overwrite: + custom_field: 'BGP EVPN Peer: 10.1.1.1' - VerifyBGPSpecificPeers: address_families: - afi: ipv4 @@ -564,6 +604,16 @@ anta.tests.routing.generic: custom_field: 'Route: 10.255.2.2 - Peer: dc1-wan2' routes: - 10.255.2.2 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.33.0.5 - Peer: dc1-svc-leaf1a' + routes: + - 10.33.0.5 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.33.0.6 - Peer: dc1-svc-leaf1b' + routes: + - 10.33.0.6 - VerifyRoutingTableEntry: result_overwrite: custom_field: 'Route: 10.255.128.11 - Peer: dc2-spine1' @@ -614,6 +664,11 @@ anta.tests.routing.generic: custom_field: 'Route: 10.255.1.5 - Peer: dc1-leaf2a' routes: - 10.255.1.5 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.33.1.5 - Peer: dc1-svc-leaf1a' + routes: + - 10.33.1.5 - VerifyRoutingTableEntry: result_overwrite: custom_field: 'Route: 10.255.129.13 - Peer: dc2-leaf1a' @@ -634,6 +689,100 @@ anta.tests.security: profile: eAPI_SSL_Profile result_overwrite: custom_field: 'eAPI HTTPS SSL Profile: eAPI_SSL_Profile' +- VerifySSHStatus: null +- VerifySSHIPv4Acl: + number: 3 + vrf: default +- VerifySSHIPv6Acl: + number: 3 + vrf: default +- VerifyTelnetStatus: null +- VerifyAPIHttpStatus: null +- VerifyAPIHttpsSSL: + profile: default +- VerifyAPIIPv4Acl: + number: 3 + vrf: default +- VerifyAPIIPv6Acl: + number: 3 + vrf: default +- VerifyAPISSLCertificate: + certificates: + - certificate_name: ARISTA_SIGNING_CA.crt + common_name: AristaIT-ICA ECDSA Issuing Cert Authority + encryption_algorithm: ECDSA + expiry_threshold: 30 + key_size: 256 + - certificate_name: ARISTA_ROOT_CA.crt + common_name: Arista Networks Internal IT Root Cert Authority + encryption_algorithm: RSA + expiry_threshold: 30 + key_size: 4096 +- VerifyBannerLogin: + login_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyBannerMotd: + motd_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyIPv4ACL: + ipv4_access_lists: + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit ip any any tracked + sequence: 20 + - action: permit udp any any eq bfd ttl eq 255 + sequence: 30 + name: default-control-plane-acl + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit tcp any any range 5900 5910 + sequence: 20 + name: LabTest +- VerifyIPSecConnHealth: null +- VerifySpecificIPSecConn: + ip_security_connections: + - peer: 10.255.0.1 + - connections: + - destination_address: 100.64.2.2 + source_address: 100.64.3.2 + - destination_address: 172.18.2.2 + source_address: 172.18.3.2 + peer: 10.255.0.2 + vrf: default +anta.tests.services: +- VerifyHostname: + hostname: s1-spine1 +- VerifyDNSLookup: + domain_names: + - arista.com + - www.google.com + - arista.ca +- VerifyDNSServers: + dns_servers: + - priority: 1 + server_address: 10.14.0.1 + vrf: default + - priority: 0 + server_address: 10.14.0.11 + vrf: MGMT +- VerifyErrdisableRecovery: + reasons: + - interval: 30 + reason: acl + - interval: 30 + reason: bpduguard anta.tests.snmp: - VerifySnmpStatus: vrf: default @@ -653,6 +802,17 @@ anta.tests.software: - v1.13.6 - v1.8.0 - VerifyEOSExtensions: null +anta.tests.stun: +- VerifyStunClient: + stun_clients: + - public_address: 172.18.3.21 + public_port: 6006 + source_address: 172.18.3.2 + source_port: 4500 + - public_address: 100.64.3.21 + public_port: 6006 + source_address: 100.64.3.2 + source_port: 4500 anta.tests.system: - VerifyNTP: null - VerifyUptime: @@ -664,6 +824,11 @@ anta.tests.system: - VerifyMemoryUtilization: null - VerifyFileSystemUtilization: null - VerifyNTP: null +anta.tests.vlan: +- VerifyVlanInternalPolicy: + end_vlan_id: 4094 + policy: ascending + start_vlan_id: 1006 anta.tests.vxlan: - VerifyVxlan1Interface: null - VerifyVxlanConfigSanity: null @@ -675,3 +840,6 @@ anta.tests.vxlan: vteps: - 10.1.1.5 - 10.1.1.6 +- VerifyVxlan1ConnSettings: + source_interface: Loopback1 + udp_port: 4789 diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-leaf1b-catalog.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-leaf1b-catalog.yml index 9b7247eaa97..e967957dcf3 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-leaf1b-catalog.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-leaf1b-catalog.yml @@ -200,6 +200,24 @@ anta.tests.connectivity: result_overwrite: custom_field: 'Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2)' +- VerifyReachability: + hosts: + - destination: 10.33.0.5 + repeat: 1 + source: 10.255.0.4 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-svc-leaf1a + Loopback0 (IP: 10.33.0.5)' +- VerifyReachability: + hosts: + - destination: 10.33.0.6 + repeat: 1 + source: 10.255.0.4 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-svc-leaf1b + Loopback0 (IP: 10.33.0.6)' - VerifyReachability: hosts: - destination: 10.255.128.11 @@ -275,6 +293,9 @@ anta.tests.connectivity: anta.tests.field_notices: - VerifyFieldNotice44Resolution: null - VerifyFieldNotice72Resolution: null +anta.tests.greent: +- VerifyGreenT: null +- VerifyGreenTCounters: null anta.tests.hardware: - VerifyEnvironmentPower: result_overwrite: @@ -462,8 +483,17 @@ anta.tests.interfaces: status: up result_overwrite: custom_field: Interface Vxlan1 = 'up' +anta.tests.lanz: +- VerifyLANZ: null anta.tests.mlag: - VerifyMlagStatus: null +anta.tests.ptp: +- VerifyPtpModeStatus: null +- VerifyPtpGMStatus: + gmid: 0xec:46:70:ff:fe:00:ff:a9 +- VerifyPtpLockStatus: null +- VerifyPtpOffset: null +- VerifyPtpPortModeStatus: null anta.tests.routing.bgp: - VerifyBGPSpecificPeers: address_families: @@ -559,6 +589,16 @@ anta.tests.routing.generic: custom_field: 'Route: 10.255.2.2 - Peer: dc1-wan2' routes: - 10.255.2.2 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.33.0.5 - Peer: dc1-svc-leaf1a' + routes: + - 10.33.0.5 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.33.0.6 - Peer: dc1-svc-leaf1b' + routes: + - 10.33.0.6 - VerifyRoutingTableEntry: result_overwrite: custom_field: 'Route: 10.255.128.11 - Peer: dc2-spine1' @@ -609,6 +649,11 @@ anta.tests.routing.generic: custom_field: 'Route: 10.255.1.5 - Peer: dc1-leaf2a' routes: - 10.255.1.5 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.33.1.5 - Peer: dc1-svc-leaf1a' + routes: + - 10.33.1.5 - VerifyRoutingTableEntry: result_overwrite: custom_field: 'Route: 10.255.129.13 - Peer: dc2-leaf1a' @@ -629,6 +674,100 @@ anta.tests.security: profile: eAPI_SSL_Profile result_overwrite: custom_field: 'eAPI HTTPS SSL Profile: eAPI_SSL_Profile' +- VerifySSHStatus: null +- VerifySSHIPv4Acl: + number: 3 + vrf: default +- VerifySSHIPv6Acl: + number: 3 + vrf: default +- VerifyTelnetStatus: null +- VerifyAPIHttpStatus: null +- VerifyAPIHttpsSSL: + profile: default +- VerifyAPIIPv4Acl: + number: 3 + vrf: default +- VerifyAPIIPv6Acl: + number: 3 + vrf: default +- VerifyAPISSLCertificate: + certificates: + - certificate_name: ARISTA_SIGNING_CA.crt + common_name: AristaIT-ICA ECDSA Issuing Cert Authority + encryption_algorithm: ECDSA + expiry_threshold: 30 + key_size: 256 + - certificate_name: ARISTA_ROOT_CA.crt + common_name: Arista Networks Internal IT Root Cert Authority + encryption_algorithm: RSA + expiry_threshold: 30 + key_size: 4096 +- VerifyBannerLogin: + login_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyBannerMotd: + motd_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyIPv4ACL: + ipv4_access_lists: + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit ip any any tracked + sequence: 20 + - action: permit udp any any eq bfd ttl eq 255 + sequence: 30 + name: default-control-plane-acl + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit tcp any any range 5900 5910 + sequence: 20 + name: LabTest +- VerifyIPSecConnHealth: null +- VerifySpecificIPSecConn: + ip_security_connections: + - peer: 10.255.0.1 + - connections: + - destination_address: 100.64.2.2 + source_address: 100.64.3.2 + - destination_address: 172.18.2.2 + source_address: 172.18.3.2 + peer: 10.255.0.2 + vrf: default +anta.tests.services: +- VerifyHostname: + hostname: s1-spine1 +- VerifyDNSLookup: + domain_names: + - arista.com + - www.google.com + - arista.ca +- VerifyDNSServers: + dns_servers: + - priority: 1 + server_address: 10.14.0.1 + vrf: default + - priority: 0 + server_address: 10.14.0.11 + vrf: MGMT +- VerifyErrdisableRecovery: + reasons: + - interval: 30 + reason: acl + - interval: 30 + reason: bpduguard anta.tests.snmp: - VerifySnmpStatus: vrf: default @@ -647,6 +786,17 @@ anta.tests.software: versions: - v1.13.6 - v1.8.0 +anta.tests.stun: +- VerifyStunClient: + stun_clients: + - public_address: 172.18.3.21 + public_port: 6006 + source_address: 172.18.3.2 + source_port: 4500 + - public_address: 100.64.3.21 + public_port: 6006 + source_address: 100.64.3.2 + source_port: 4500 anta.tests.system: - VerifyNTP: null - VerifyUptime: @@ -658,3 +808,8 @@ anta.tests.system: - VerifyMemoryUtilization: null - VerifyFileSystemUtilization: null - VerifyNTP: null +anta.tests.vlan: +- VerifyVlanInternalPolicy: + end_vlan_id: 4094 + policy: ascending + start_vlan_id: 1006 diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-leaf1c-catalog.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-leaf1c-catalog.yml index 16e3e3e944b..21019ba610d 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-leaf1c-catalog.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-leaf1c-catalog.yml @@ -129,6 +129,24 @@ anta.tests.connectivity: result_overwrite: custom_field: 'Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2)' +- VerifyReachability: + hosts: + - destination: 10.33.0.5 + repeat: 1 + source: 172.21.110.4 + vrf: MGMT + result_overwrite: + custom_field: 'Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: + dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5)' +- VerifyReachability: + hosts: + - destination: 10.33.0.6 + repeat: 1 + source: 172.21.110.4 + vrf: MGMT + result_overwrite: + custom_field: 'Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: + dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6)' - VerifyReachability: hosts: - destination: 10.255.128.11 @@ -204,6 +222,9 @@ anta.tests.connectivity: anta.tests.field_notices: - VerifyFieldNotice44Resolution: null - VerifyFieldNotice72Resolution: null +anta.tests.greent: +- VerifyGreenT: null +- VerifyGreenTCounters: null anta.tests.hardware: - VerifyEnvironmentPower: result_overwrite: @@ -270,11 +291,114 @@ anta.tests.interfaces: status: up result_overwrite: custom_field: Interface Vlan4085 - L2LEAF_INBAND_MGMT = 'up' +anta.tests.lanz: +- VerifyLANZ: null +anta.tests.ptp: +- VerifyPtpModeStatus: null +- VerifyPtpGMStatus: + gmid: 0xec:46:70:ff:fe:00:ff:a9 +- VerifyPtpLockStatus: null +- VerifyPtpOffset: null +- VerifyPtpPortModeStatus: null anta.tests.security: - VerifyAPIHttpsSSL: profile: eAPI_SSL_Profile result_overwrite: custom_field: 'eAPI HTTPS SSL Profile: eAPI_SSL_Profile' +- VerifySSHStatus: null +- VerifySSHIPv4Acl: + number: 3 + vrf: default +- VerifySSHIPv6Acl: + number: 3 + vrf: default +- VerifyTelnetStatus: null +- VerifyAPIHttpStatus: null +- VerifyAPIHttpsSSL: + profile: default +- VerifyAPIIPv4Acl: + number: 3 + vrf: default +- VerifyAPIIPv6Acl: + number: 3 + vrf: default +- VerifyAPISSLCertificate: + certificates: + - certificate_name: ARISTA_SIGNING_CA.crt + common_name: AristaIT-ICA ECDSA Issuing Cert Authority + encryption_algorithm: ECDSA + expiry_threshold: 30 + key_size: 256 + - certificate_name: ARISTA_ROOT_CA.crt + common_name: Arista Networks Internal IT Root Cert Authority + encryption_algorithm: RSA + expiry_threshold: 30 + key_size: 4096 +- VerifyBannerLogin: + login_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyBannerMotd: + motd_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyIPv4ACL: + ipv4_access_lists: + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit ip any any tracked + sequence: 20 + - action: permit udp any any eq bfd ttl eq 255 + sequence: 30 + name: default-control-plane-acl + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit tcp any any range 5900 5910 + sequence: 20 + name: LabTest +- VerifyIPSecConnHealth: null +- VerifySpecificIPSecConn: + ip_security_connections: + - peer: 10.255.0.1 + - connections: + - destination_address: 100.64.2.2 + source_address: 100.64.3.2 + - destination_address: 172.18.2.2 + source_address: 172.18.3.2 + peer: 10.255.0.2 + vrf: default +anta.tests.services: +- VerifyHostname: + hostname: s1-spine1 +- VerifyDNSLookup: + domain_names: + - arista.com + - www.google.com + - arista.ca +- VerifyDNSServers: + dns_servers: + - priority: 1 + server_address: 10.14.0.1 + vrf: default + - priority: 0 + server_address: 10.14.0.11 + vrf: MGMT +- VerifyErrdisableRecovery: + reasons: + - interval: 30 + reason: acl + - interval: 30 + reason: bpduguard anta.tests.snmp: - VerifySnmpStatus: vrf: default @@ -293,6 +417,17 @@ anta.tests.software: versions: - v1.13.6 - v1.8.0 +anta.tests.stun: +- VerifyStunClient: + stun_clients: + - public_address: 172.18.3.21 + public_port: 6006 + source_address: 172.18.3.2 + source_port: 4500 + - public_address: 100.64.3.21 + public_port: 6006 + source_address: 100.64.3.2 + source_port: 4500 anta.tests.system: - VerifyNTP: null - VerifyUptime: @@ -304,3 +439,8 @@ anta.tests.system: - VerifyMemoryUtilization: null - VerifyFileSystemUtilization: null - VerifyNTP: null +anta.tests.vlan: +- VerifyVlanInternalPolicy: + end_vlan_id: 4094 + policy: ascending + start_vlan_id: 1006 diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-leaf2a-catalog.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-leaf2a-catalog.yml index d33022c4403..2bc5b711dd7 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-leaf2a-catalog.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-leaf2a-catalog.yml @@ -170,6 +170,24 @@ anta.tests.connectivity: result_overwrite: custom_field: 'Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2)' +- VerifyReachability: + hosts: + - destination: 10.33.0.5 + repeat: 1 + source: 10.255.0.5 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-svc-leaf1a + Loopback0 (IP: 10.33.0.5)' +- VerifyReachability: + hosts: + - destination: 10.33.0.6 + repeat: 1 + source: 10.255.0.5 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-svc-leaf1b + Loopback0 (IP: 10.33.0.6)' - VerifyReachability: hosts: - destination: 10.255.128.11 @@ -245,6 +263,9 @@ anta.tests.connectivity: anta.tests.field_notices: - VerifyFieldNotice44Resolution: null - VerifyFieldNotice72Resolution: null +anta.tests.greent: +- VerifyGreenT: null +- VerifyGreenTCounters: null anta.tests.hardware: - VerifyEnvironmentPower: result_overwrite: @@ -426,6 +447,8 @@ anta.tests.interfaces: status: up result_overwrite: custom_field: Interface Vxlan1 = 'up' +anta.tests.lanz: +- VerifyLANZ: null anta.tests.mlag: - VerifyMlagStatus: null anta.tests.profiles: @@ -433,6 +456,13 @@ anta.tests.profiles: mode: 3 - VerifyTcamProfile: profile: vxlan-routing +anta.tests.ptp: +- VerifyPtpModeStatus: null +- VerifyPtpGMStatus: + gmid: 0xec:46:70:ff:fe:00:ff:a9 +- VerifyPtpLockStatus: null +- VerifyPtpOffset: null +- VerifyPtpPortModeStatus: null anta.tests.routing.bgp: - VerifyBGPSpecificPeers: address_families: @@ -519,6 +549,16 @@ anta.tests.routing.generic: custom_field: 'Route: 10.255.2.2 - Peer: dc1-wan2' routes: - 10.255.2.2 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.33.0.5 - Peer: dc1-svc-leaf1a' + routes: + - 10.33.0.5 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.33.0.6 - Peer: dc1-svc-leaf1b' + routes: + - 10.33.0.6 - VerifyRoutingTableEntry: result_overwrite: custom_field: 'Route: 10.255.128.11 - Peer: dc2-spine1' @@ -569,6 +609,11 @@ anta.tests.routing.generic: custom_field: 'Route: 10.255.1.5 - Peer: dc1-leaf2a' routes: - 10.255.1.5 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.33.1.5 - Peer: dc1-svc-leaf1a' + routes: + - 10.33.1.5 - VerifyRoutingTableEntry: result_overwrite: custom_field: 'Route: 10.255.129.13 - Peer: dc2-leaf1a' @@ -589,6 +634,100 @@ anta.tests.security: profile: eAPI_SSL_Profile result_overwrite: custom_field: 'eAPI HTTPS SSL Profile: eAPI_SSL_Profile' +- VerifySSHStatus: null +- VerifySSHIPv4Acl: + number: 3 + vrf: default +- VerifySSHIPv6Acl: + number: 3 + vrf: default +- VerifyTelnetStatus: null +- VerifyAPIHttpStatus: null +- VerifyAPIHttpsSSL: + profile: default +- VerifyAPIIPv4Acl: + number: 3 + vrf: default +- VerifyAPIIPv6Acl: + number: 3 + vrf: default +- VerifyAPISSLCertificate: + certificates: + - certificate_name: ARISTA_SIGNING_CA.crt + common_name: AristaIT-ICA ECDSA Issuing Cert Authority + encryption_algorithm: ECDSA + expiry_threshold: 30 + key_size: 256 + - certificate_name: ARISTA_ROOT_CA.crt + common_name: Arista Networks Internal IT Root Cert Authority + encryption_algorithm: RSA + expiry_threshold: 30 + key_size: 4096 +- VerifyBannerLogin: + login_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyBannerMotd: + motd_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyIPv4ACL: + ipv4_access_lists: + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit ip any any tracked + sequence: 20 + - action: permit udp any any eq bfd ttl eq 255 + sequence: 30 + name: default-control-plane-acl + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit tcp any any range 5900 5910 + sequence: 20 + name: LabTest +- VerifyIPSecConnHealth: null +- VerifySpecificIPSecConn: + ip_security_connections: + - peer: 10.255.0.1 + - connections: + - destination_address: 100.64.2.2 + source_address: 100.64.3.2 + - destination_address: 172.18.2.2 + source_address: 172.18.3.2 + peer: 10.255.0.2 + vrf: default +anta.tests.services: +- VerifyHostname: + hostname: s1-spine1 +- VerifyDNSLookup: + domain_names: + - arista.com + - www.google.com + - arista.ca +- VerifyDNSServers: + dns_servers: + - priority: 1 + server_address: 10.14.0.1 + vrf: default + - priority: 0 + server_address: 10.14.0.11 + vrf: MGMT +- VerifyErrdisableRecovery: + reasons: + - interval: 30 + reason: acl + - interval: 30 + reason: bpduguard anta.tests.snmp: - VerifySnmpStatus: vrf: default @@ -608,6 +747,17 @@ anta.tests.software: - v1.13.6 - v1.8.0 - VerifyEOSExtensions: null +anta.tests.stun: +- VerifyStunClient: + stun_clients: + - public_address: 172.18.3.21 + public_port: 6006 + source_address: 172.18.3.2 + source_port: 4500 + - public_address: 100.64.3.21 + public_port: 6006 + source_address: 100.64.3.2 + source_port: 4500 anta.tests.system: - VerifyNTP: null - VerifyUptime: @@ -619,3 +769,8 @@ anta.tests.system: - VerifyMemoryUtilization: null - VerifyFileSystemUtilization: null - VerifyNTP: null +anta.tests.vlan: +- VerifyVlanInternalPolicy: + end_vlan_id: 4094 + policy: ascending + start_vlan_id: 1006 diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-leaf2c-catalog.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-leaf2c-catalog.yml index 3b2fd6f1785..0876dee6dd3 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-leaf2c-catalog.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-leaf2c-catalog.yml @@ -122,6 +122,24 @@ anta.tests.connectivity: result_overwrite: custom_field: 'Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2)' +- VerifyReachability: + hosts: + - destination: 10.33.0.5 + repeat: 1 + source: 172.21.110.5 + vrf: MGMT + result_overwrite: + custom_field: 'Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: + dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5)' +- VerifyReachability: + hosts: + - destination: 10.33.0.6 + repeat: 1 + source: 172.21.110.5 + vrf: MGMT + result_overwrite: + custom_field: 'Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: + dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6)' - VerifyReachability: hosts: - destination: 10.255.128.11 @@ -197,6 +215,9 @@ anta.tests.connectivity: anta.tests.field_notices: - VerifyFieldNotice44Resolution: null - VerifyFieldNotice72Resolution: null +anta.tests.greent: +- VerifyGreenT: null +- VerifyGreenTCounters: null anta.tests.hardware: - VerifyEnvironmentPower: result_overwrite: @@ -263,11 +284,114 @@ anta.tests.interfaces: status: up result_overwrite: custom_field: Interface Vlan4085 - L2LEAF_INBAND_MGMT = 'up' +anta.tests.lanz: +- VerifyLANZ: null +anta.tests.ptp: +- VerifyPtpModeStatus: null +- VerifyPtpGMStatus: + gmid: 0xec:46:70:ff:fe:00:ff:a9 +- VerifyPtpLockStatus: null +- VerifyPtpOffset: null +- VerifyPtpPortModeStatus: null anta.tests.security: - VerifyAPIHttpsSSL: profile: eAPI_SSL_Profile result_overwrite: custom_field: 'eAPI HTTPS SSL Profile: eAPI_SSL_Profile' +- VerifySSHStatus: null +- VerifySSHIPv4Acl: + number: 3 + vrf: default +- VerifySSHIPv6Acl: + number: 3 + vrf: default +- VerifyTelnetStatus: null +- VerifyAPIHttpStatus: null +- VerifyAPIHttpsSSL: + profile: default +- VerifyAPIIPv4Acl: + number: 3 + vrf: default +- VerifyAPIIPv6Acl: + number: 3 + vrf: default +- VerifyAPISSLCertificate: + certificates: + - certificate_name: ARISTA_SIGNING_CA.crt + common_name: AristaIT-ICA ECDSA Issuing Cert Authority + encryption_algorithm: ECDSA + expiry_threshold: 30 + key_size: 256 + - certificate_name: ARISTA_ROOT_CA.crt + common_name: Arista Networks Internal IT Root Cert Authority + encryption_algorithm: RSA + expiry_threshold: 30 + key_size: 4096 +- VerifyBannerLogin: + login_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyBannerMotd: + motd_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyIPv4ACL: + ipv4_access_lists: + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit ip any any tracked + sequence: 20 + - action: permit udp any any eq bfd ttl eq 255 + sequence: 30 + name: default-control-plane-acl + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit tcp any any range 5900 5910 + sequence: 20 + name: LabTest +- VerifyIPSecConnHealth: null +- VerifySpecificIPSecConn: + ip_security_connections: + - peer: 10.255.0.1 + - connections: + - destination_address: 100.64.2.2 + source_address: 100.64.3.2 + - destination_address: 172.18.2.2 + source_address: 172.18.3.2 + peer: 10.255.0.2 + vrf: default +anta.tests.services: +- VerifyHostname: + hostname: s1-spine1 +- VerifyDNSLookup: + domain_names: + - arista.com + - www.google.com + - arista.ca +- VerifyDNSServers: + dns_servers: + - priority: 1 + server_address: 10.14.0.1 + vrf: default + - priority: 0 + server_address: 10.14.0.11 + vrf: MGMT +- VerifyErrdisableRecovery: + reasons: + - interval: 30 + reason: acl + - interval: 30 + reason: bpduguard anta.tests.snmp: - VerifySnmpStatus: vrf: default @@ -286,6 +410,17 @@ anta.tests.software: versions: - v1.13.6 - v1.8.0 +anta.tests.stun: +- VerifyStunClient: + stun_clients: + - public_address: 172.18.3.21 + public_port: 6006 + source_address: 172.18.3.2 + source_port: 4500 + - public_address: 100.64.3.21 + public_port: 6006 + source_address: 100.64.3.2 + source_port: 4500 anta.tests.system: - VerifyNTP: null - VerifyUptime: @@ -297,3 +432,8 @@ anta.tests.system: - VerifyMemoryUtilization: null - VerifyFileSystemUtilization: null - VerifyNTP: null +anta.tests.vlan: +- VerifyVlanInternalPolicy: + end_vlan_id: 4094 + policy: ascending + start_vlan_id: 1006 diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-spine1-catalog.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-spine1-catalog.yml index 8236511cf7e..75d3e8a6425 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-spine1-catalog.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-spine1-catalog.yml @@ -94,6 +94,20 @@ anta.tests.connectivity: port: Ethernet3 result_overwrite: custom_field: 'Local: Ethernet3 - Remote: dc1-leaf2a Ethernet1' +- VerifyLLDPNeighbors: + neighbors: + - neighbor_device: dc1-svc-leaf1a.dc1.local + neighbor_port: Ethernet1 + port: Ethernet5 + result_overwrite: + custom_field: 'Local: Ethernet5 - Remote: dc1-svc-leaf1a Ethernet1' +- VerifyLLDPNeighbors: + neighbors: + - neighbor_device: dc1-svc-leaf1b.dc1.local + neighbor_port: Ethernet1 + port: Ethernet6 + result_overwrite: + custom_field: 'Local: Ethernet6 - Remote: dc1-svc-leaf1b Ethernet1' - VerifyReachability: hosts: - destination: 10.255.255.1 @@ -121,9 +135,30 @@ anta.tests.connectivity: result_overwrite: custom_field: 'Source: P2P Interface Ethernet3 (IP: 10.255.255.8) - Destination: dc1-leaf2a Ethernet1 (IP: 10.255.255.9)' +- VerifyReachability: + hosts: + - destination: 10.33.255.17 + repeat: 1 + source: 10.33.255.16 + vrf: default + result_overwrite: + custom_field: 'Source: P2P Interface Ethernet5 (IP: 10.33.255.16) - Destination: + dc1-svc-leaf1a Ethernet1 (IP: 10.33.255.17)' +- VerifyReachability: + hosts: + - destination: 10.33.255.21 + repeat: 1 + source: 10.33.255.20 + vrf: default + result_overwrite: + custom_field: 'Source: P2P Interface Ethernet6 (IP: 10.33.255.20) - Destination: + dc1-svc-leaf1b Ethernet1 (IP: 10.33.255.21)' anta.tests.field_notices: - VerifyFieldNotice44Resolution: null - VerifyFieldNotice72Resolution: null +anta.tests.greent: +- VerifyGreenT: null +- VerifyGreenTCounters: null anta.tests.hardware: - VerifyEnvironmentPower: result_overwrite: @@ -184,13 +219,26 @@ anta.tests.interfaces: status: adminDown result_overwrite: custom_field: Interface Ethernet4 - P2P_LINK_TO_DC1-LEAF2B_Ethernet1 = 'adminDown' +- VerifyInterfacesStatus: + interfaces: + - name: Ethernet5 + status: up + result_overwrite: + custom_field: Interface Ethernet5 - P2P_LINK_TO_DC1-SVC-LEAF1A_Ethernet1 = 'up' +- VerifyInterfacesStatus: + interfaces: + - name: Ethernet6 + status: up + result_overwrite: + custom_field: Interface Ethernet6 - P2P_LINK_TO_DC1-SVC-LEAF1B_Ethernet1 = 'up' - VerifyInterfacesStatus: interfaces: - name: Loopback0 status: up result_overwrite: custom_field: Interface Loopback0 - EVPN_Overlay_Peering = 'up' -- VerifyInterfaceUtilization: null +- VerifyInterfaceUtilization: + threshold: 70.0 - VerifyInterfaceErrors: null - VerifyInterfaceDiscards: null - VerifyInterfaceErrDisabled: null @@ -227,6 +275,15 @@ anta.tests.interfaces: mtu: 1500 specific_mtu: - Ethernet1/1: 1500 +anta.tests.lanz: +- VerifyLANZ: null +anta.tests.ptp: +- VerifyPtpModeStatus: null +- VerifyPtpGMStatus: + gmid: 0xec:46:70:ff:fe:00:ff:a9 +- VerifyPtpLockStatus: null +- VerifyPtpOffset: null +- VerifyPtpPortModeStatus: null anta.tests.routing: bgp: - VerifyBGPPeerCount: @@ -267,6 +324,63 @@ anta.tests.routing: - 10.1.255.2 - 10.1.255.4 safi: unicast + - VerifyBGPExchangedRoutes: + bgp_peers: + - advertised_routes: + - 192.0.254.5/32 + peer_address: 172.30.255.5 + received_routes: + - 192.0.255.4/32 + vrf: default + - advertised_routes: + - 192.0.255.1/32 + - 192.0.254.5/32 + peer_address: 172.30.255.1 + received_routes: + - 192.0.254.3/32 + vrf: default + - VerifyBGPPeerMPCaps: + bgp_peers: + - capabilities: + - ipv4Unicast + peer_address: 172.30.11.1 + vrf: default + - VerifyBGPPeerASNCap: + bgp_peers: + - peer_address: 172.30.11.1 + vrf: default + - VerifyBGPPeerRouteRefreshCap: + bgp_peers: + - peer_address: 172.30.11.1 + vrf: default + - VerifyBGPPeerMD5Auth: + bgp_peers: + - peer_address: 172.30.11.1 + vrf: default + - peer_address: 172.30.11.5 + vrf: default + - VerifyEVPNType2Route: + vxlan_endpoints: + - address: 192.168.20.102 + vni: 10020 + - address: aac1.ab5d.b41e + vni: 10010 + - VerifyBGPAdvCommunities: + bgp_peers: + - peer_address: 172.30.11.17 + vrf: default + - peer_address: 172.30.11.21 + vrf: default + - VerifyBGPTimers: + bgp_peers: + - hold_time: 180 + keep_alive_time: 60 + peer_address: 172.30.11.1 + vrf: default + - hold_time: 180 + keep_alive_time: 60 + peer_address: 172.30.11.5 + vrf: default generic: - VerifyRoutingProtocolModel: model: multi-agent @@ -282,6 +396,7 @@ anta.tests.routing: - VerifyOSPFNeighborState: null - VerifyOSPFNeighborCount: number: 3 + - VerifyOSPFMaxLSA: null anta.tests.routing.bgp: - VerifyBGPSpecificPeers: address_families: @@ -304,6 +419,20 @@ anta.tests.routing.bgp: - 10.255.0.5 result_overwrite: custom_field: 'BGP EVPN Peer: dc1-leaf2a (IP: 10.255.0.5)' +- VerifyBGPSpecificPeers: + address_families: + - afi: evpn + peers: + - 10.33.0.5 + result_overwrite: + custom_field: 'BGP EVPN Peer: dc1-svc-leaf1a (IP: 10.33.0.5)' +- VerifyBGPSpecificPeers: + address_families: + - afi: evpn + peers: + - 10.33.0.6 + result_overwrite: + custom_field: 'BGP EVPN Peer: dc1-svc-leaf1b (IP: 10.33.0.6)' - VerifyBGPSpecificPeers: address_families: - afi: ipv4 @@ -328,6 +457,22 @@ anta.tests.routing.bgp: safi: unicast result_overwrite: custom_field: 'BGP IPv4 Unicast Peer: dc1-leaf2a (IP: 10.255.255.9)' +- VerifyBGPSpecificPeers: + address_families: + - afi: ipv4 + peers: + - 10.33.255.17 + safi: unicast + result_overwrite: + custom_field: 'BGP IPv4 Unicast Peer: dc1-svc-leaf1a (IP: 10.33.255.17)' +- VerifyBGPSpecificPeers: + address_families: + - afi: ipv4 + peers: + - 10.33.255.21 + safi: unicast + result_overwrite: + custom_field: 'BGP IPv4 Unicast Peer: dc1-svc-leaf1b (IP: 10.33.255.21)' - VerifyBGPSpecificPeers: address_families: - afi: ipv4 @@ -335,7 +480,7 @@ anta.tests.routing.bgp: - 123.1.1.10 safi: unicast result_overwrite: - custom_field: 'BGP IPv4 Unicast Peer: None (IP: 123.1.1.10)' + custom_field: 'BGP IPv4 Unicast Peer: 123.1.1.10' - VerifyBGPSpecificPeers: address_families: - afi: ipv4 @@ -343,7 +488,7 @@ anta.tests.routing.bgp: - 123.1.1.11 safi: unicast result_overwrite: - custom_field: 'BGP IPv4 Unicast Peer: None (IP: 123.1.1.11)' + custom_field: 'BGP IPv4 Unicast Peer: 123.1.1.11' - VerifyBGPSpecificPeers: address_families: - afi: ipv6 @@ -351,7 +496,7 @@ anta.tests.routing.bgp: - fd5a:fe45:8831:06c5::a safi: unicast result_overwrite: - custom_field: 'BGP IPv6 Unicast Peer: None (IP: fd5a:fe45:8831:06c5::a)' + custom_field: 'BGP IPv6 Unicast Peer: fd5a:fe45:8831:06c5::a' - VerifyBGPSpecificPeers: address_families: - afi: ipv6 @@ -359,7 +504,7 @@ anta.tests.routing.bgp: - fd5a:fe45:8831:06c5::b safi: unicast result_overwrite: - custom_field: 'BGP IPv6 Unicast Peer: None (IP: fd5a:fe45:8831:06c5::b)' + custom_field: 'BGP IPv6 Unicast Peer: fd5a:fe45:8831:06c5::b' anta.tests.routing.generic: - VerifyRoutingProtocolModel: model: multi-agent @@ -370,6 +515,100 @@ anta.tests.security: profile: eAPI_SSL_Profile result_overwrite: custom_field: 'eAPI HTTPS SSL Profile: eAPI_SSL_Profile' +- VerifySSHStatus: null +- VerifySSHIPv4Acl: + number: 3 + vrf: default +- VerifySSHIPv6Acl: + number: 3 + vrf: default +- VerifyTelnetStatus: null +- VerifyAPIHttpStatus: null +- VerifyAPIHttpsSSL: + profile: default +- VerifyAPIIPv4Acl: + number: 3 + vrf: default +- VerifyAPIIPv6Acl: + number: 3 + vrf: default +- VerifyAPISSLCertificate: + certificates: + - certificate_name: ARISTA_SIGNING_CA.crt + common_name: AristaIT-ICA ECDSA Issuing Cert Authority + encryption_algorithm: ECDSA + expiry_threshold: 30 + key_size: 256 + - certificate_name: ARISTA_ROOT_CA.crt + common_name: Arista Networks Internal IT Root Cert Authority + encryption_algorithm: RSA + expiry_threshold: 30 + key_size: 4096 +- VerifyBannerLogin: + login_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyBannerMotd: + motd_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyIPv4ACL: + ipv4_access_lists: + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit ip any any tracked + sequence: 20 + - action: permit udp any any eq bfd ttl eq 255 + sequence: 30 + name: default-control-plane-acl + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit tcp any any range 5900 5910 + sequence: 20 + name: LabTest +- VerifyIPSecConnHealth: null +- VerifySpecificIPSecConn: + ip_security_connections: + - peer: 10.255.0.1 + - connections: + - destination_address: 100.64.2.2 + source_address: 100.64.3.2 + - destination_address: 172.18.2.2 + source_address: 172.18.3.2 + peer: 10.255.0.2 + vrf: default +anta.tests.services: +- VerifyHostname: + hostname: s1-spine1 +- VerifyDNSLookup: + domain_names: + - arista.com + - www.google.com + - arista.ca +- VerifyDNSServers: + dns_servers: + - priority: 1 + server_address: 10.14.0.1 + vrf: default + - priority: 0 + server_address: 10.14.0.11 + vrf: MGMT +- VerifyErrdisableRecovery: + reasons: + - interval: 30 + reason: acl + - interval: 30 + reason: bpduguard anta.tests.snmp: - VerifySnmpStatus: vrf: default @@ -388,6 +627,17 @@ anta.tests.software: versions: - v1.13.6 - v1.8.0 +anta.tests.stun: +- VerifyStunClient: + stun_clients: + - public_address: 172.18.3.21 + public_port: 6006 + source_address: 172.18.3.2 + source_port: 4500 + - public_address: 100.64.3.21 + public_port: 6006 + source_address: 100.64.3.2 + source_port: 4500 anta.tests.system: - VerifyNTP: null - VerifyUptime: @@ -399,3 +649,8 @@ anta.tests.system: - VerifyMemoryUtilization: null - VerifyFileSystemUtilization: null - VerifyNTP: null +anta.tests.vlan: +- VerifyVlanInternalPolicy: + end_vlan_id: 4094 + policy: ascending + start_vlan_id: 1006 diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-spine2-catalog.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-spine2-catalog.yml index 132edbce04c..ecfa68833a5 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-spine2-catalog.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-spine2-catalog.yml @@ -94,6 +94,20 @@ anta.tests.connectivity: port: Ethernet3 result_overwrite: custom_field: 'Local: Ethernet3 - Remote: dc1-leaf2a Ethernet2' +- VerifyLLDPNeighbors: + neighbors: + - neighbor_device: dc1-svc-leaf1a.dc1.local + neighbor_port: Ethernet2 + port: Ethernet5 + result_overwrite: + custom_field: 'Local: Ethernet5 - Remote: dc1-svc-leaf1a Ethernet2' +- VerifyLLDPNeighbors: + neighbors: + - neighbor_device: dc1-svc-leaf1b.dc1.local + neighbor_port: Ethernet2 + port: Ethernet6 + result_overwrite: + custom_field: 'Local: Ethernet6 - Remote: dc1-svc-leaf1b Ethernet2' - VerifyReachability: hosts: - destination: 10.255.255.3 @@ -121,9 +135,30 @@ anta.tests.connectivity: result_overwrite: custom_field: 'Source: P2P Interface Ethernet3 (IP: 10.255.255.10) - Destination: dc1-leaf2a Ethernet2 (IP: 10.255.255.11)' +- VerifyReachability: + hosts: + - destination: 10.33.255.19 + repeat: 1 + source: 10.33.255.18 + vrf: default + result_overwrite: + custom_field: 'Source: P2P Interface Ethernet5 (IP: 10.33.255.18) - Destination: + dc1-svc-leaf1a Ethernet2 (IP: 10.33.255.19)' +- VerifyReachability: + hosts: + - destination: 10.33.255.23 + repeat: 1 + source: 10.33.255.22 + vrf: default + result_overwrite: + custom_field: 'Source: P2P Interface Ethernet6 (IP: 10.33.255.22) - Destination: + dc1-svc-leaf1b Ethernet2 (IP: 10.33.255.23)' anta.tests.field_notices: - VerifyFieldNotice44Resolution: null - VerifyFieldNotice72Resolution: null +anta.tests.greent: +- VerifyGreenT: null +- VerifyGreenTCounters: null anta.tests.hardware: - VerifyEnvironmentPower: result_overwrite: @@ -184,13 +219,26 @@ anta.tests.interfaces: status: adminDown result_overwrite: custom_field: Interface Ethernet4 - P2P_LINK_TO_DC1-LEAF2B_Ethernet2 = 'adminDown' +- VerifyInterfacesStatus: + interfaces: + - name: Ethernet5 + status: up + result_overwrite: + custom_field: Interface Ethernet5 - P2P_LINK_TO_DC1-SVC-LEAF1A_Ethernet2 = 'up' +- VerifyInterfacesStatus: + interfaces: + - name: Ethernet6 + status: up + result_overwrite: + custom_field: Interface Ethernet6 - P2P_LINK_TO_DC1-SVC-LEAF1B_Ethernet2 = 'up' - VerifyInterfacesStatus: interfaces: - name: Loopback0 status: up result_overwrite: custom_field: Interface Loopback0 - EVPN_Overlay_Peering = 'up' -- VerifyInterfaceUtilization: null +- VerifyInterfaceUtilization: + threshold: 70.0 - VerifyInterfaceErrors: null - VerifyInterfaceDiscards: null - VerifyInterfaceErrDisabled: null @@ -227,6 +275,15 @@ anta.tests.interfaces: mtu: 1500 specific_mtu: - Ethernet1/1: 1500 +anta.tests.lanz: +- VerifyLANZ: null +anta.tests.ptp: +- VerifyPtpModeStatus: null +- VerifyPtpGMStatus: + gmid: 0xec:46:70:ff:fe:00:ff:a9 +- VerifyPtpLockStatus: null +- VerifyPtpOffset: null +- VerifyPtpPortModeStatus: null anta.tests.routing: bgp: - VerifyBGPPeerCount: @@ -267,6 +324,63 @@ anta.tests.routing: - 10.1.255.2 - 10.1.255.4 safi: unicast + - VerifyBGPExchangedRoutes: + bgp_peers: + - advertised_routes: + - 192.0.254.5/32 + peer_address: 172.30.255.5 + received_routes: + - 192.0.255.4/32 + vrf: default + - advertised_routes: + - 192.0.255.1/32 + - 192.0.254.5/32 + peer_address: 172.30.255.1 + received_routes: + - 192.0.254.3/32 + vrf: default + - VerifyBGPPeerMPCaps: + bgp_peers: + - capabilities: + - ipv4Unicast + peer_address: 172.30.11.1 + vrf: default + - VerifyBGPPeerASNCap: + bgp_peers: + - peer_address: 172.30.11.1 + vrf: default + - VerifyBGPPeerRouteRefreshCap: + bgp_peers: + - peer_address: 172.30.11.1 + vrf: default + - VerifyBGPPeerMD5Auth: + bgp_peers: + - peer_address: 172.30.11.1 + vrf: default + - peer_address: 172.30.11.5 + vrf: default + - VerifyEVPNType2Route: + vxlan_endpoints: + - address: 192.168.20.102 + vni: 10020 + - address: aac1.ab5d.b41e + vni: 10010 + - VerifyBGPAdvCommunities: + bgp_peers: + - peer_address: 172.30.11.17 + vrf: default + - peer_address: 172.30.11.21 + vrf: default + - VerifyBGPTimers: + bgp_peers: + - hold_time: 180 + keep_alive_time: 60 + peer_address: 172.30.11.1 + vrf: default + - hold_time: 180 + keep_alive_time: 60 + peer_address: 172.30.11.5 + vrf: default generic: - VerifyRoutingProtocolModel: model: multi-agent @@ -282,6 +396,7 @@ anta.tests.routing: - VerifyOSPFNeighborState: null - VerifyOSPFNeighborCount: number: 3 + - VerifyOSPFMaxLSA: null anta.tests.routing.bgp: - VerifyBGPSpecificPeers: address_families: @@ -304,13 +419,27 @@ anta.tests.routing.bgp: - 10.255.0.5 result_overwrite: custom_field: 'BGP EVPN Peer: dc1-leaf2a (IP: 10.255.0.5)' +- VerifyBGPSpecificPeers: + address_families: + - afi: evpn + peers: + - 10.33.0.5 + result_overwrite: + custom_field: 'BGP EVPN Peer: dc1-svc-leaf1a (IP: 10.33.0.5)' +- VerifyBGPSpecificPeers: + address_families: + - afi: evpn + peers: + - 10.33.0.6 + result_overwrite: + custom_field: 'BGP EVPN Peer: dc1-svc-leaf1b (IP: 10.33.0.6)' - VerifyBGPSpecificPeers: address_families: - afi: evpn peers: - 142.112.41.2 result_overwrite: - custom_field: 'BGP EVPN Peer: None (IP: 142.112.41.2)' + custom_field: 'BGP EVPN Peer: 142.112.41.2' - VerifyBGPSpecificPeers: address_families: - afi: ipv4 @@ -335,6 +464,22 @@ anta.tests.routing.bgp: safi: unicast result_overwrite: custom_field: 'BGP IPv4 Unicast Peer: dc1-leaf2a (IP: 10.255.255.11)' +- VerifyBGPSpecificPeers: + address_families: + - afi: ipv4 + peers: + - 10.33.255.19 + safi: unicast + result_overwrite: + custom_field: 'BGP IPv4 Unicast Peer: dc1-svc-leaf1a (IP: 10.33.255.19)' +- VerifyBGPSpecificPeers: + address_families: + - afi: ipv4 + peers: + - 10.33.255.23 + safi: unicast + result_overwrite: + custom_field: 'BGP IPv4 Unicast Peer: dc1-svc-leaf1b (IP: 10.33.255.23)' - VerifyBGPSpecificPeers: address_families: - afi: ipv4 @@ -342,7 +487,7 @@ anta.tests.routing.bgp: - 142.112.39.2 safi: unicast result_overwrite: - custom_field: 'BGP IPv4 Unicast Peer: None (IP: 142.112.39.2)' + custom_field: 'BGP IPv4 Unicast Peer: 142.112.39.2' - VerifyBGPSpecificPeers: address_families: - afi: ipv6 @@ -350,7 +495,7 @@ anta.tests.routing.bgp: - 2001:db8:1::2 safi: unicast result_overwrite: - custom_field: 'BGP IPv6 Unicast Peer: None (IP: 2001:db8:1::2)' + custom_field: 'BGP IPv6 Unicast Peer: 2001:db8:1::2' anta.tests.routing.generic: - VerifyRoutingProtocolModel: model: multi-agent @@ -361,6 +506,100 @@ anta.tests.security: profile: eAPI_SSL_Profile result_overwrite: custom_field: 'eAPI HTTPS SSL Profile: eAPI_SSL_Profile' +- VerifySSHStatus: null +- VerifySSHIPv4Acl: + number: 3 + vrf: default +- VerifySSHIPv6Acl: + number: 3 + vrf: default +- VerifyTelnetStatus: null +- VerifyAPIHttpStatus: null +- VerifyAPIHttpsSSL: + profile: default +- VerifyAPIIPv4Acl: + number: 3 + vrf: default +- VerifyAPIIPv6Acl: + number: 3 + vrf: default +- VerifyAPISSLCertificate: + certificates: + - certificate_name: ARISTA_SIGNING_CA.crt + common_name: AristaIT-ICA ECDSA Issuing Cert Authority + encryption_algorithm: ECDSA + expiry_threshold: 30 + key_size: 256 + - certificate_name: ARISTA_ROOT_CA.crt + common_name: Arista Networks Internal IT Root Cert Authority + encryption_algorithm: RSA + expiry_threshold: 30 + key_size: 4096 +- VerifyBannerLogin: + login_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyBannerMotd: + motd_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyIPv4ACL: + ipv4_access_lists: + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit ip any any tracked + sequence: 20 + - action: permit udp any any eq bfd ttl eq 255 + sequence: 30 + name: default-control-plane-acl + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit tcp any any range 5900 5910 + sequence: 20 + name: LabTest +- VerifyIPSecConnHealth: null +- VerifySpecificIPSecConn: + ip_security_connections: + - peer: 10.255.0.1 + - connections: + - destination_address: 100.64.2.2 + source_address: 100.64.3.2 + - destination_address: 172.18.2.2 + source_address: 172.18.3.2 + peer: 10.255.0.2 + vrf: default +anta.tests.services: +- VerifyHostname: + hostname: s1-spine1 +- VerifyDNSLookup: + domain_names: + - arista.com + - www.google.com + - arista.ca +- VerifyDNSServers: + dns_servers: + - priority: 1 + server_address: 10.14.0.1 + vrf: default + - priority: 0 + server_address: 10.14.0.11 + vrf: MGMT +- VerifyErrdisableRecovery: + reasons: + - interval: 30 + reason: acl + - interval: 30 + reason: bpduguard anta.tests.snmp: - VerifySnmpStatus: vrf: default @@ -379,6 +618,17 @@ anta.tests.software: versions: - v1.13.6 - v1.8.0 +anta.tests.stun: +- VerifyStunClient: + stun_clients: + - public_address: 172.18.3.21 + public_port: 6006 + source_address: 172.18.3.2 + source_port: 4500 + - public_address: 100.64.3.21 + public_port: 6006 + source_address: 100.64.3.2 + source_port: 4500 anta.tests.system: - VerifyNTP: null - VerifyUptime: @@ -390,3 +640,8 @@ anta.tests.system: - VerifyMemoryUtilization: null - VerifyFileSystemUtilization: null - VerifyNTP: null +anta.tests.vlan: +- VerifyVlanInternalPolicy: + end_vlan_id: 4094 + policy: ascending + start_vlan_id: 1006 diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-svc-leaf1a-catalog.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-svc-leaf1a-catalog.yml new file mode 100644 index 00000000000..a47bcb3540e --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-svc-leaf1a-catalog.yml @@ -0,0 +1,669 @@ +anta.tests.aaa: +- VerifyTacacsSourceIntf: + intf: Management0 + vrf: default +- VerifyTacacsServers: + servers: + - 1.1.1.1 + - 2.2.2.2 + vrf: default +- VerifyTacacsServerGroups: + groups: + - admin + - user +- VerifyAuthenMethods: + methods: + - local + - none + - logging + types: + - login + - enable + - dot1x +- VerifyAuthzMethods: + methods: + - local + - none + - logging + types: + - commands + - exec +- VerifyAcctDefaultMethods: + methods: + - local + - none + - logging + types: + - system + - exec + - commands + - dot1x +- VerifyAcctConsoleMethods: + methods: + - local + - none + - logging + types: + - system + - exec + - commands + - dot1x +anta.tests.configuration: +- VerifyZeroTouch: null +- VerifyRunningConfigDiffs: null +anta.tests.connectivity: +- VerifyLLDPNeighbors: + neighbors: + - neighbor_device: dc1-svc-leaf1b.dc1.local + neighbor_port: Ethernet3 + port: Ethernet3 + result_overwrite: + custom_field: 'Local: Ethernet3 - Remote: dc1-svc-leaf1b Ethernet3' +- VerifyLLDPNeighbors: + neighbors: + - neighbor_device: dc1-svc-leaf1b.dc1.local + neighbor_port: Ethernet4 + port: Ethernet4 + result_overwrite: + custom_field: 'Local: Ethernet4 - Remote: dc1-svc-leaf1b Ethernet4' +- VerifyLLDPNeighbors: + neighbors: + - neighbor_device: dc1-spine1.dc1.local + neighbor_port: Ethernet5 + port: Ethernet1 + result_overwrite: + custom_field: 'Local: Ethernet1 - Remote: dc1-spine1 Ethernet5' +- VerifyLLDPNeighbors: + neighbors: + - neighbor_device: dc1-spine2.dc1.local + neighbor_port: Ethernet5 + port: Ethernet2 + result_overwrite: + custom_field: 'Local: Ethernet2 - Remote: dc1-spine2 Ethernet5' +- VerifyReachability: + hosts: + - destination: 10.33.255.16 + repeat: 1 + source: 10.33.255.17 + vrf: default + result_overwrite: + custom_field: 'Source: P2P Interface Ethernet1 (IP: 10.33.255.17) - Destination: + dc1-spine1 Ethernet5 (IP: 10.33.255.16)' +- VerifyReachability: + hosts: + - destination: 10.33.255.18 + repeat: 1 + source: 10.33.255.19 + vrf: default + result_overwrite: + custom_field: 'Source: P2P Interface Ethernet2 (IP: 10.33.255.19) - Destination: + dc1-spine2 Ethernet5 (IP: 10.33.255.18)' +- VerifyReachability: + hosts: + - destination: 10.255.0.1 + repeat: 1 + source: 10.33.0.5 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.33.0.5) - Destination: dc1-spine1 Loopback0 + (IP: 10.255.0.1)' +- VerifyReachability: + hosts: + - destination: 10.255.0.2 + repeat: 1 + source: 10.33.0.5 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.33.0.5) - Destination: dc1-spine2 Loopback0 + (IP: 10.255.0.2)' +- VerifyReachability: + hosts: + - destination: 10.255.0.3 + repeat: 1 + source: 10.33.0.5 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.33.0.5) - Destination: dc1-leaf1a Loopback0 + (IP: 10.255.0.3)' +- VerifyReachability: + hosts: + - destination: 10.255.0.4 + repeat: 1 + source: 10.33.0.5 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.33.0.5) - Destination: dc1-leaf1b Loopback0 + (IP: 10.255.0.4)' +- VerifyReachability: + hosts: + - destination: 10.255.0.5 + repeat: 1 + source: 10.33.0.5 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.33.0.5) - Destination: dc1-leaf2a Loopback0 + (IP: 10.255.0.5)' +- VerifyReachability: + hosts: + - destination: 10.255.2.1 + repeat: 1 + source: 10.33.0.5 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.33.0.5) - Destination: dc1-wan1 Loopback0 + (IP: 10.255.2.1)' +- VerifyReachability: + hosts: + - destination: 10.255.2.2 + repeat: 1 + source: 10.33.0.5 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.33.0.5) - Destination: dc1-wan2 Loopback0 + (IP: 10.255.2.2)' +- VerifyReachability: + hosts: + - destination: 10.33.0.5 + repeat: 1 + source: 10.33.0.5 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.33.0.5) - Destination: dc1-svc-leaf1a + Loopback0 (IP: 10.33.0.5)' +- VerifyReachability: + hosts: + - destination: 10.33.0.6 + repeat: 1 + source: 10.33.0.5 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.33.0.5) - Destination: dc1-svc-leaf1b + Loopback0 (IP: 10.33.0.6)' +- VerifyReachability: + hosts: + - destination: 10.255.128.11 + repeat: 1 + source: 10.33.0.5 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.33.0.5) - Destination: dc2-spine1 Loopback0 + (IP: 10.255.128.11)' +- VerifyReachability: + hosts: + - destination: 10.255.128.12 + repeat: 1 + source: 10.33.0.5 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.33.0.5) - Destination: dc2-spine2 Loopback0 + (IP: 10.255.128.12)' +- VerifyReachability: + hosts: + - destination: 10.255.128.13 + repeat: 1 + source: 10.33.0.5 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.33.0.5) - Destination: dc2-leaf1a Loopback0 + (IP: 10.255.128.13)' +- VerifyReachability: + hosts: + - destination: 10.255.128.14 + repeat: 1 + source: 10.33.0.5 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.33.0.5) - Destination: dc2-leaf1b Loopback0 + (IP: 10.255.128.14)' +- VerifyReachability: + hosts: + - destination: 10.255.128.15 + repeat: 1 + source: 10.33.0.5 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.33.0.5) - Destination: dc2-leaf2a Loopback0 + (IP: 10.255.128.15)' +- VerifyReachability: + hosts: + - destination: 10.255.128.16 + repeat: 1 + source: 10.33.0.5 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.33.0.5) - Destination: dc2-leaf2b Loopback0 + (IP: 10.255.128.16)' +- VerifyReachability: + hosts: + - destination: 10.255.128.17 + repeat: 1 + source: 10.33.0.5 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.33.0.5) - Destination: dc2-leaf3a.arista.com + Loopback0 (IP: 10.255.128.17)' +- VerifyReachability: + hosts: + - destination: 10.255.128.18 + repeat: 1 + source: 10.33.0.5 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.33.0.5) - Destination: dc2-leaf3b.arista.com + Loopback0 (IP: 10.255.128.18)' +anta.tests.field_notices: +- VerifyFieldNotice44Resolution: null +- VerifyFieldNotice72Resolution: null +anta.tests.greent: +- VerifyGreenT: null +- VerifyGreenTCounters: null +anta.tests.hardware: +- VerifyEnvironmentPower: + result_overwrite: + custom_field: 'Accepted States: ''ok''' + states: + - ok +- VerifyEnvironmentCooling: + result_overwrite: + custom_field: 'Accepted States: ''ok''' + states: + - ok +- VerifyTemperature: null +- VerifyTransceiversManufacturers: + manufacturers: + - Arista Networks + - Arastra, Inc. + - Not Present + result_overwrite: + custom_field: 'Accepted Manufacturers: ''Arista Networks'', ''Arastra, Inc.'', + ''Not Present''' +- VerifyTransceiversManufacturers: + manufacturers: + - Not Present + - Arista Networks + - Arastra, Inc. +- VerifyTemperature: null +- VerifyTransceiversTemperature: null +- VerifyEnvironmentSystemCooling: null +- VerifyEnvironmentCooling: + states: + - ok +- VerifyEnvironmentPower: + states: + - ok +- VerifyAdverseDrops: null +anta.tests.interfaces: +- VerifyInterfacesStatus: + interfaces: + - name: Ethernet3 + status: up + result_overwrite: + custom_field: Interface Ethernet3 - MLAG_PEER_dc1-svc-leaf1b_Ethernet3 = 'up' +- VerifyInterfacesStatus: + interfaces: + - name: Ethernet4 + status: up + result_overwrite: + custom_field: Interface Ethernet4 - MLAG_PEER_dc1-svc-leaf1b_Ethernet4 = 'up' +- VerifyInterfacesStatus: + interfaces: + - name: Ethernet1 + status: up + result_overwrite: + custom_field: Interface Ethernet1 - P2P_LINK_TO_DC1-SPINE1_Ethernet5 = 'up' +- VerifyInterfacesStatus: + interfaces: + - name: Ethernet2 + status: up + result_overwrite: + custom_field: Interface Ethernet2 - P2P_LINK_TO_DC1-SPINE2_Ethernet5 = 'up' +- VerifyInterfacesStatus: + interfaces: + - name: Port-Channel3 + status: up + result_overwrite: + custom_field: Interface Port-Channel3 - MLAG_PEER_dc1-svc-leaf1b_Po3 = 'up' +- VerifyInterfacesStatus: + interfaces: + - name: Vlan4093 + status: up + result_overwrite: + custom_field: Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up' +- VerifyInterfacesStatus: + interfaces: + - name: Vlan4094 + status: up + result_overwrite: + custom_field: Interface Vlan4094 - MLAG_PEER = 'up' +- VerifyInterfacesStatus: + interfaces: + - name: Loopback0 + status: up + result_overwrite: + custom_field: Interface Loopback0 - EVPN_Overlay_Peering = 'up' +- VerifyInterfacesStatus: + interfaces: + - name: Loopback1 + status: up + result_overwrite: + custom_field: Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up' +- VerifyInterfacesStatus: + interfaces: + - name: Vxlan1 + status: up + result_overwrite: + custom_field: Interface Vxlan1 = 'up' +anta.tests.lanz: +- VerifyLANZ: null +anta.tests.mlag: +- VerifyMlagStatus: null +anta.tests.ptp: +- VerifyPtpModeStatus: null +- VerifyPtpGMStatus: + gmid: 0xec:46:70:ff:fe:00:ff:a9 +- VerifyPtpLockStatus: null +- VerifyPtpOffset: null +- VerifyPtpPortModeStatus: null +anta.tests.routing.bgp: +- VerifyBGPSpecificPeers: + address_families: + - afi: evpn + peers: + - 10.255.0.1 + result_overwrite: + custom_field: 'BGP EVPN Peer: dc1-spine1 (IP: 10.255.0.1)' +- VerifyBGPSpecificPeers: + address_families: + - afi: evpn + peers: + - 10.255.0.2 + result_overwrite: + custom_field: 'BGP EVPN Peer: dc1-spine2 (IP: 10.255.0.2)' +- VerifyBGPSpecificPeers: + address_families: + - afi: ipv4 + peers: + - 10.33.1.105 + safi: unicast + result_overwrite: + custom_field: 'BGP IPv4 Unicast Peer: dc1-svc-leaf1b (IP: 10.33.1.105)' +- VerifyBGPSpecificPeers: + address_families: + - afi: ipv4 + peers: + - 10.33.255.16 + safi: unicast + result_overwrite: + custom_field: 'BGP IPv4 Unicast Peer: dc1-spine1 (IP: 10.33.255.16)' +- VerifyBGPSpecificPeers: + address_families: + - afi: ipv4 + peers: + - 10.33.255.18 + safi: unicast + result_overwrite: + custom_field: 'BGP IPv4 Unicast Peer: dc1-spine2 (IP: 10.33.255.18)' +anta.tests.routing.generic: +- VerifyRoutingProtocolModel: + model: multi-agent + result_overwrite: + custom_field: 'Routing protocol model: multi-agent' +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.0.1 - Peer: dc1-spine1' + routes: + - 10.255.0.1 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.0.2 - Peer: dc1-spine2' + routes: + - 10.255.0.2 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.0.3 - Peer: dc1-leaf1a' + routes: + - 10.255.0.3 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.0.4 - Peer: dc1-leaf1b' + routes: + - 10.255.0.4 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.0.5 - Peer: dc1-leaf2a' + routes: + - 10.255.0.5 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.2.1 - Peer: dc1-wan1' + routes: + - 10.255.2.1 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.2.2 - Peer: dc1-wan2' + routes: + - 10.255.2.2 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.33.0.5 - Peer: dc1-svc-leaf1a' + routes: + - 10.33.0.5 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.33.0.6 - Peer: dc1-svc-leaf1b' + routes: + - 10.33.0.6 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.128.11 - Peer: dc2-spine1' + routes: + - 10.255.128.11 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.128.12 - Peer: dc2-spine2' + routes: + - 10.255.128.12 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.128.13 - Peer: dc2-leaf1a' + routes: + - 10.255.128.13 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.128.14 - Peer: dc2-leaf1b' + routes: + - 10.255.128.14 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.128.15 - Peer: dc2-leaf2a' + routes: + - 10.255.128.15 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.128.16 - Peer: dc2-leaf2b' + routes: + - 10.255.128.16 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com' + routes: + - 10.255.128.17 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com' + routes: + - 10.255.128.18 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.1.3 - Peer: dc1-leaf1a' + routes: + - 10.255.1.3 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.1.5 - Peer: dc1-leaf2a' + routes: + - 10.255.1.5 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.33.1.5 - Peer: dc1-svc-leaf1a' + routes: + - 10.33.1.5 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.129.13 - Peer: dc2-leaf1a' + routes: + - 10.255.129.13 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.129.15 - Peer: dc2-leaf2a' + routes: + - 10.255.129.15 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com' + routes: + - 10.255.129.17 +anta.tests.security: +- VerifyAPIHttpsSSL: + profile: eAPI_SSL_Profile + result_overwrite: + custom_field: 'eAPI HTTPS SSL Profile: eAPI_SSL_Profile' +- VerifySSHStatus: null +- VerifySSHIPv4Acl: + number: 3 + vrf: default +- VerifySSHIPv6Acl: + number: 3 + vrf: default +- VerifyTelnetStatus: null +- VerifyAPIHttpStatus: null +- VerifyAPIHttpsSSL: + profile: default +- VerifyAPIIPv4Acl: + number: 3 + vrf: default +- VerifyAPIIPv6Acl: + number: 3 + vrf: default +- VerifyAPISSLCertificate: + certificates: + - certificate_name: ARISTA_SIGNING_CA.crt + common_name: AristaIT-ICA ECDSA Issuing Cert Authority + encryption_algorithm: ECDSA + expiry_threshold: 30 + key_size: 256 + - certificate_name: ARISTA_ROOT_CA.crt + common_name: Arista Networks Internal IT Root Cert Authority + encryption_algorithm: RSA + expiry_threshold: 30 + key_size: 4096 +- VerifyBannerLogin: + login_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyBannerMotd: + motd_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyIPv4ACL: + ipv4_access_lists: + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit ip any any tracked + sequence: 20 + - action: permit udp any any eq bfd ttl eq 255 + sequence: 30 + name: default-control-plane-acl + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit tcp any any range 5900 5910 + sequence: 20 + name: LabTest +- VerifyIPSecConnHealth: null +- VerifySpecificIPSecConn: + ip_security_connections: + - peer: 10.255.0.1 + - connections: + - destination_address: 100.64.2.2 + source_address: 100.64.3.2 + - destination_address: 172.18.2.2 + source_address: 172.18.3.2 + peer: 10.255.0.2 + vrf: default +anta.tests.services: +- VerifyHostname: + hostname: s1-spine1 +- VerifyDNSLookup: + domain_names: + - arista.com + - www.google.com + - arista.ca +- VerifyDNSServers: + dns_servers: + - priority: 1 + server_address: 10.14.0.1 + vrf: default + - priority: 0 + server_address: 10.14.0.11 + vrf: MGMT +- VerifyErrdisableRecovery: + reasons: + - interval: 30 + reason: acl + - interval: 30 + reason: bpduguard +anta.tests.snmp: +- VerifySnmpStatus: + vrf: default +- VerifySnmpIPv4Acl: + number: 3 + vrf: default +- VerifySnmpIPv6Acl: + number: 3 + vrf: default +anta.tests.software: +- VerifyEOSVersion: + versions: + - 4.25.4M + - 4.26.1F +- VerifyTerminAttrVersion: + versions: + - v1.13.6 + - v1.8.0 +anta.tests.stun: +- VerifyStunClient: + stun_clients: + - public_address: 172.18.3.21 + public_port: 6006 + source_address: 172.18.3.2 + source_port: 4500 + - public_address: 100.64.3.21 + public_port: 6006 + source_address: 100.64.3.2 + source_port: 4500 +anta.tests.system: +- VerifyNTP: null +- VerifyUptime: + minimum: 86400 +- VerifyReloadCause: null +- VerifyCoredump: null +- VerifyAgentLogs: null +- VerifyCPUUtilization: null +- VerifyMemoryUtilization: null +- VerifyFileSystemUtilization: null +- VerifyNTP: null +anta.tests.vlan: +- VerifyVlanInternalPolicy: + end_vlan_id: 4094 + policy: ascending + start_vlan_id: 1006 diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-svc-leaf1b-catalog.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-svc-leaf1b-catalog.yml new file mode 100644 index 00000000000..729f5441127 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-svc-leaf1b-catalog.yml @@ -0,0 +1,669 @@ +anta.tests.aaa: +- VerifyTacacsSourceIntf: + intf: Management0 + vrf: default +- VerifyTacacsServers: + servers: + - 1.1.1.1 + - 2.2.2.2 + vrf: default +- VerifyTacacsServerGroups: + groups: + - admin + - user +- VerifyAuthenMethods: + methods: + - local + - none + - logging + types: + - login + - enable + - dot1x +- VerifyAuthzMethods: + methods: + - local + - none + - logging + types: + - commands + - exec +- VerifyAcctDefaultMethods: + methods: + - local + - none + - logging + types: + - system + - exec + - commands + - dot1x +- VerifyAcctConsoleMethods: + methods: + - local + - none + - logging + types: + - system + - exec + - commands + - dot1x +anta.tests.configuration: +- VerifyZeroTouch: null +- VerifyRunningConfigDiffs: null +anta.tests.connectivity: +- VerifyLLDPNeighbors: + neighbors: + - neighbor_device: dc1-svc-leaf1a.dc1.local + neighbor_port: Ethernet3 + port: Ethernet3 + result_overwrite: + custom_field: 'Local: Ethernet3 - Remote: dc1-svc-leaf1a Ethernet3' +- VerifyLLDPNeighbors: + neighbors: + - neighbor_device: dc1-svc-leaf1a.dc1.local + neighbor_port: Ethernet4 + port: Ethernet4 + result_overwrite: + custom_field: 'Local: Ethernet4 - Remote: dc1-svc-leaf1a Ethernet4' +- VerifyLLDPNeighbors: + neighbors: + - neighbor_device: dc1-spine1.dc1.local + neighbor_port: Ethernet6 + port: Ethernet1 + result_overwrite: + custom_field: 'Local: Ethernet1 - Remote: dc1-spine1 Ethernet6' +- VerifyLLDPNeighbors: + neighbors: + - neighbor_device: dc1-spine2.dc1.local + neighbor_port: Ethernet6 + port: Ethernet2 + result_overwrite: + custom_field: 'Local: Ethernet2 - Remote: dc1-spine2 Ethernet6' +- VerifyReachability: + hosts: + - destination: 10.33.255.20 + repeat: 1 + source: 10.33.255.21 + vrf: default + result_overwrite: + custom_field: 'Source: P2P Interface Ethernet1 (IP: 10.33.255.21) - Destination: + dc1-spine1 Ethernet6 (IP: 10.33.255.20)' +- VerifyReachability: + hosts: + - destination: 10.33.255.22 + repeat: 1 + source: 10.33.255.23 + vrf: default + result_overwrite: + custom_field: 'Source: P2P Interface Ethernet2 (IP: 10.33.255.23) - Destination: + dc1-spine2 Ethernet6 (IP: 10.33.255.22)' +- VerifyReachability: + hosts: + - destination: 10.255.0.1 + repeat: 1 + source: 10.33.0.6 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.33.0.6) - Destination: dc1-spine1 Loopback0 + (IP: 10.255.0.1)' +- VerifyReachability: + hosts: + - destination: 10.255.0.2 + repeat: 1 + source: 10.33.0.6 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.33.0.6) - Destination: dc1-spine2 Loopback0 + (IP: 10.255.0.2)' +- VerifyReachability: + hosts: + - destination: 10.255.0.3 + repeat: 1 + source: 10.33.0.6 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.33.0.6) - Destination: dc1-leaf1a Loopback0 + (IP: 10.255.0.3)' +- VerifyReachability: + hosts: + - destination: 10.255.0.4 + repeat: 1 + source: 10.33.0.6 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.33.0.6) - Destination: dc1-leaf1b Loopback0 + (IP: 10.255.0.4)' +- VerifyReachability: + hosts: + - destination: 10.255.0.5 + repeat: 1 + source: 10.33.0.6 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.33.0.6) - Destination: dc1-leaf2a Loopback0 + (IP: 10.255.0.5)' +- VerifyReachability: + hosts: + - destination: 10.255.2.1 + repeat: 1 + source: 10.33.0.6 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.33.0.6) - Destination: dc1-wan1 Loopback0 + (IP: 10.255.2.1)' +- VerifyReachability: + hosts: + - destination: 10.255.2.2 + repeat: 1 + source: 10.33.0.6 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.33.0.6) - Destination: dc1-wan2 Loopback0 + (IP: 10.255.2.2)' +- VerifyReachability: + hosts: + - destination: 10.33.0.5 + repeat: 1 + source: 10.33.0.6 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.33.0.6) - Destination: dc1-svc-leaf1a + Loopback0 (IP: 10.33.0.5)' +- VerifyReachability: + hosts: + - destination: 10.33.0.6 + repeat: 1 + source: 10.33.0.6 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.33.0.6) - Destination: dc1-svc-leaf1b + Loopback0 (IP: 10.33.0.6)' +- VerifyReachability: + hosts: + - destination: 10.255.128.11 + repeat: 1 + source: 10.33.0.6 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.33.0.6) - Destination: dc2-spine1 Loopback0 + (IP: 10.255.128.11)' +- VerifyReachability: + hosts: + - destination: 10.255.128.12 + repeat: 1 + source: 10.33.0.6 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.33.0.6) - Destination: dc2-spine2 Loopback0 + (IP: 10.255.128.12)' +- VerifyReachability: + hosts: + - destination: 10.255.128.13 + repeat: 1 + source: 10.33.0.6 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.33.0.6) - Destination: dc2-leaf1a Loopback0 + (IP: 10.255.128.13)' +- VerifyReachability: + hosts: + - destination: 10.255.128.14 + repeat: 1 + source: 10.33.0.6 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.33.0.6) - Destination: dc2-leaf1b Loopback0 + (IP: 10.255.128.14)' +- VerifyReachability: + hosts: + - destination: 10.255.128.15 + repeat: 1 + source: 10.33.0.6 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.33.0.6) - Destination: dc2-leaf2a Loopback0 + (IP: 10.255.128.15)' +- VerifyReachability: + hosts: + - destination: 10.255.128.16 + repeat: 1 + source: 10.33.0.6 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.33.0.6) - Destination: dc2-leaf2b Loopback0 + (IP: 10.255.128.16)' +- VerifyReachability: + hosts: + - destination: 10.255.128.17 + repeat: 1 + source: 10.33.0.6 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.33.0.6) - Destination: dc2-leaf3a.arista.com + Loopback0 (IP: 10.255.128.17)' +- VerifyReachability: + hosts: + - destination: 10.255.128.18 + repeat: 1 + source: 10.33.0.6 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.33.0.6) - Destination: dc2-leaf3b.arista.com + Loopback0 (IP: 10.255.128.18)' +anta.tests.field_notices: +- VerifyFieldNotice44Resolution: null +- VerifyFieldNotice72Resolution: null +anta.tests.greent: +- VerifyGreenT: null +- VerifyGreenTCounters: null +anta.tests.hardware: +- VerifyEnvironmentPower: + result_overwrite: + custom_field: 'Accepted States: ''ok''' + states: + - ok +- VerifyEnvironmentCooling: + result_overwrite: + custom_field: 'Accepted States: ''ok''' + states: + - ok +- VerifyTemperature: null +- VerifyTransceiversManufacturers: + manufacturers: + - Arista Networks + - Arastra, Inc. + - Not Present + result_overwrite: + custom_field: 'Accepted Manufacturers: ''Arista Networks'', ''Arastra, Inc.'', + ''Not Present''' +- VerifyTransceiversManufacturers: + manufacturers: + - Not Present + - Arista Networks + - Arastra, Inc. +- VerifyTemperature: null +- VerifyTransceiversTemperature: null +- VerifyEnvironmentSystemCooling: null +- VerifyEnvironmentCooling: + states: + - ok +- VerifyEnvironmentPower: + states: + - ok +- VerifyAdverseDrops: null +anta.tests.interfaces: +- VerifyInterfacesStatus: + interfaces: + - name: Ethernet3 + status: up + result_overwrite: + custom_field: Interface Ethernet3 - MLAG_PEER_dc1-svc-leaf1a_Ethernet3 = 'up' +- VerifyInterfacesStatus: + interfaces: + - name: Ethernet4 + status: up + result_overwrite: + custom_field: Interface Ethernet4 - MLAG_PEER_dc1-svc-leaf1a_Ethernet4 = 'up' +- VerifyInterfacesStatus: + interfaces: + - name: Ethernet1 + status: up + result_overwrite: + custom_field: Interface Ethernet1 - P2P_LINK_TO_DC1-SPINE1_Ethernet6 = 'up' +- VerifyInterfacesStatus: + interfaces: + - name: Ethernet2 + status: up + result_overwrite: + custom_field: Interface Ethernet2 - P2P_LINK_TO_DC1-SPINE2_Ethernet6 = 'up' +- VerifyInterfacesStatus: + interfaces: + - name: Port-Channel3 + status: up + result_overwrite: + custom_field: Interface Port-Channel3 - MLAG_PEER_dc1-svc-leaf1a_Po3 = 'up' +- VerifyInterfacesStatus: + interfaces: + - name: Vlan4093 + status: up + result_overwrite: + custom_field: Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up' +- VerifyInterfacesStatus: + interfaces: + - name: Vlan4094 + status: up + result_overwrite: + custom_field: Interface Vlan4094 - MLAG_PEER = 'up' +- VerifyInterfacesStatus: + interfaces: + - name: Loopback0 + status: up + result_overwrite: + custom_field: Interface Loopback0 - EVPN_Overlay_Peering = 'up' +- VerifyInterfacesStatus: + interfaces: + - name: Loopback1 + status: up + result_overwrite: + custom_field: Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up' +- VerifyInterfacesStatus: + interfaces: + - name: Vxlan1 + status: up + result_overwrite: + custom_field: Interface Vxlan1 = 'up' +anta.tests.lanz: +- VerifyLANZ: null +anta.tests.mlag: +- VerifyMlagStatus: null +anta.tests.ptp: +- VerifyPtpModeStatus: null +- VerifyPtpGMStatus: + gmid: 0xec:46:70:ff:fe:00:ff:a9 +- VerifyPtpLockStatus: null +- VerifyPtpOffset: null +- VerifyPtpPortModeStatus: null +anta.tests.routing.bgp: +- VerifyBGPSpecificPeers: + address_families: + - afi: evpn + peers: + - 10.255.0.1 + result_overwrite: + custom_field: 'BGP EVPN Peer: dc1-spine1 (IP: 10.255.0.1)' +- VerifyBGPSpecificPeers: + address_families: + - afi: evpn + peers: + - 10.255.0.2 + result_overwrite: + custom_field: 'BGP EVPN Peer: dc1-spine2 (IP: 10.255.0.2)' +- VerifyBGPSpecificPeers: + address_families: + - afi: ipv4 + peers: + - 10.33.1.104 + safi: unicast + result_overwrite: + custom_field: 'BGP IPv4 Unicast Peer: dc1-svc-leaf1a (IP: 10.33.1.104)' +- VerifyBGPSpecificPeers: + address_families: + - afi: ipv4 + peers: + - 10.33.255.20 + safi: unicast + result_overwrite: + custom_field: 'BGP IPv4 Unicast Peer: dc1-spine1 (IP: 10.33.255.20)' +- VerifyBGPSpecificPeers: + address_families: + - afi: ipv4 + peers: + - 10.33.255.22 + safi: unicast + result_overwrite: + custom_field: 'BGP IPv4 Unicast Peer: dc1-spine2 (IP: 10.33.255.22)' +anta.tests.routing.generic: +- VerifyRoutingProtocolModel: + model: multi-agent + result_overwrite: + custom_field: 'Routing protocol model: multi-agent' +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.0.1 - Peer: dc1-spine1' + routes: + - 10.255.0.1 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.0.2 - Peer: dc1-spine2' + routes: + - 10.255.0.2 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.0.3 - Peer: dc1-leaf1a' + routes: + - 10.255.0.3 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.0.4 - Peer: dc1-leaf1b' + routes: + - 10.255.0.4 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.0.5 - Peer: dc1-leaf2a' + routes: + - 10.255.0.5 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.2.1 - Peer: dc1-wan1' + routes: + - 10.255.2.1 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.2.2 - Peer: dc1-wan2' + routes: + - 10.255.2.2 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.33.0.5 - Peer: dc1-svc-leaf1a' + routes: + - 10.33.0.5 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.33.0.6 - Peer: dc1-svc-leaf1b' + routes: + - 10.33.0.6 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.128.11 - Peer: dc2-spine1' + routes: + - 10.255.128.11 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.128.12 - Peer: dc2-spine2' + routes: + - 10.255.128.12 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.128.13 - Peer: dc2-leaf1a' + routes: + - 10.255.128.13 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.128.14 - Peer: dc2-leaf1b' + routes: + - 10.255.128.14 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.128.15 - Peer: dc2-leaf2a' + routes: + - 10.255.128.15 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.128.16 - Peer: dc2-leaf2b' + routes: + - 10.255.128.16 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com' + routes: + - 10.255.128.17 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com' + routes: + - 10.255.128.18 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.1.3 - Peer: dc1-leaf1a' + routes: + - 10.255.1.3 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.1.5 - Peer: dc1-leaf2a' + routes: + - 10.255.1.5 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.33.1.5 - Peer: dc1-svc-leaf1a' + routes: + - 10.33.1.5 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.129.13 - Peer: dc2-leaf1a' + routes: + - 10.255.129.13 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.129.15 - Peer: dc2-leaf2a' + routes: + - 10.255.129.15 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com' + routes: + - 10.255.129.17 +anta.tests.security: +- VerifyAPIHttpsSSL: + profile: eAPI_SSL_Profile + result_overwrite: + custom_field: 'eAPI HTTPS SSL Profile: eAPI_SSL_Profile' +- VerifySSHStatus: null +- VerifySSHIPv4Acl: + number: 3 + vrf: default +- VerifySSHIPv6Acl: + number: 3 + vrf: default +- VerifyTelnetStatus: null +- VerifyAPIHttpStatus: null +- VerifyAPIHttpsSSL: + profile: default +- VerifyAPIIPv4Acl: + number: 3 + vrf: default +- VerifyAPIIPv6Acl: + number: 3 + vrf: default +- VerifyAPISSLCertificate: + certificates: + - certificate_name: ARISTA_SIGNING_CA.crt + common_name: AristaIT-ICA ECDSA Issuing Cert Authority + encryption_algorithm: ECDSA + expiry_threshold: 30 + key_size: 256 + - certificate_name: ARISTA_ROOT_CA.crt + common_name: Arista Networks Internal IT Root Cert Authority + encryption_algorithm: RSA + expiry_threshold: 30 + key_size: 4096 +- VerifyBannerLogin: + login_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyBannerMotd: + motd_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyIPv4ACL: + ipv4_access_lists: + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit ip any any tracked + sequence: 20 + - action: permit udp any any eq bfd ttl eq 255 + sequence: 30 + name: default-control-plane-acl + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit tcp any any range 5900 5910 + sequence: 20 + name: LabTest +- VerifyIPSecConnHealth: null +- VerifySpecificIPSecConn: + ip_security_connections: + - peer: 10.255.0.1 + - connections: + - destination_address: 100.64.2.2 + source_address: 100.64.3.2 + - destination_address: 172.18.2.2 + source_address: 172.18.3.2 + peer: 10.255.0.2 + vrf: default +anta.tests.services: +- VerifyHostname: + hostname: s1-spine1 +- VerifyDNSLookup: + domain_names: + - arista.com + - www.google.com + - arista.ca +- VerifyDNSServers: + dns_servers: + - priority: 1 + server_address: 10.14.0.1 + vrf: default + - priority: 0 + server_address: 10.14.0.11 + vrf: MGMT +- VerifyErrdisableRecovery: + reasons: + - interval: 30 + reason: acl + - interval: 30 + reason: bpduguard +anta.tests.snmp: +- VerifySnmpStatus: + vrf: default +- VerifySnmpIPv4Acl: + number: 3 + vrf: default +- VerifySnmpIPv6Acl: + number: 3 + vrf: default +anta.tests.software: +- VerifyEOSVersion: + versions: + - 4.25.4M + - 4.26.1F +- VerifyTerminAttrVersion: + versions: + - v1.13.6 + - v1.8.0 +anta.tests.stun: +- VerifyStunClient: + stun_clients: + - public_address: 172.18.3.21 + public_port: 6006 + source_address: 172.18.3.2 + source_port: 4500 + - public_address: 100.64.3.21 + public_port: 6006 + source_address: 100.64.3.2 + source_port: 4500 +anta.tests.system: +- VerifyNTP: null +- VerifyUptime: + minimum: 86400 +- VerifyReloadCause: null +- VerifyCoredump: null +- VerifyAgentLogs: null +- VerifyCPUUtilization: null +- VerifyMemoryUtilization: null +- VerifyFileSystemUtilization: null +- VerifyNTP: null +anta.tests.vlan: +- VerifyVlanInternalPolicy: + end_vlan_id: 4094 + policy: ascending + start_vlan_id: 1006 diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-wan1-catalog.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-wan1-catalog.yml index 02703bb206d..5e6822eb175 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-wan1-catalog.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-wan1-catalog.yml @@ -87,6 +87,9 @@ anta.tests.connectivity: anta.tests.field_notices: - VerifyFieldNotice44Resolution: null - VerifyFieldNotice72Resolution: null +anta.tests.greent: +- VerifyGreenT: null +- VerifyGreenTCounters: null anta.tests.hardware: - VerifyEnvironmentPower: result_overwrite: @@ -165,7 +168,65 @@ anta.tests.interfaces: status: up result_overwrite: custom_field: Interface Vxlan1 = 'up' +anta.tests.lanz: +- VerifyLANZ: null +anta.tests.ptp: +- VerifyPtpModeStatus: null +- VerifyPtpGMStatus: + gmid: 0xec:46:70:ff:fe:00:ff:a9 +- VerifyPtpLockStatus: null +- VerifyPtpOffset: null +- VerifyPtpPortModeStatus: null anta.tests.routing.bgp: +- VerifyBGPSpecificPeers: + address_families: + - afi: evpn + peers: + - 10.255.255.10 + result_overwrite: + custom_field: 'BGP EVPN Peer: dc1-leaf1a (IP: 10.255.255.10)' +- VerifyBGPSpecificPeers: + address_families: + - afi: evpn + peers: + - 10.255.255.20 + result_overwrite: + custom_field: 'BGP EVPN Peer: dc1-leaf1b (IP: 10.255.255.20)' +- VerifyBGPSpecificPeers: + address_families: + - afi: evpn + peers: + - 10.255.1.2 + result_overwrite: + custom_field: 'BGP EVPN Peer: dc1-wan2 (IP: 10.255.1.2)' +- VerifyBGPSpecificPeers: + address_families: + - afi: path-selection + peers: + - 10.255.255.10 + result_overwrite: + custom_field: 'BGP Path-Selection Peer: dc1-leaf1a (IP: 10.255.255.10)' +- VerifyBGPSpecificPeers: + address_families: + - afi: path-selection + peers: + - 10.255.255.20 + result_overwrite: + custom_field: 'BGP Path-Selection Peer: dc1-leaf1b (IP: 10.255.255.20)' +- VerifyBGPSpecificPeers: + address_families: + - afi: link-state + peers: + - 10.255.255.10 + result_overwrite: + custom_field: 'BGP Link-State Peer: dc1-leaf1a (IP: 10.255.255.10)' +- VerifyBGPSpecificPeers: + address_families: + - afi: link-state + peers: + - 10.255.255.20 + result_overwrite: + custom_field: 'BGP Link-State Peer: dc1-leaf1b (IP: 10.255.255.20)' - VerifyBGPSpecificPeers: address_families: - afi: ipv4 @@ -182,6 +243,22 @@ anta.tests.routing.bgp: safi: unicast result_overwrite: custom_field: 'BGP IPv4 Unicast Peer: dc1-leaf1b (IP: 10.255.255.2)' +- VerifyBGPSpecificPeers: + address_families: + - afi: ipv4 + peers: + - 10.255.255.10 + safi: sr-te + result_overwrite: + custom_field: 'BGP IPv4 SR-TE Peer: dc1-leaf1a (IP: 10.255.255.10)' +- VerifyBGPSpecificPeers: + address_families: + - afi: ipv4 + peers: + - 10.255.255.20 + safi: sr-te + result_overwrite: + custom_field: 'BGP IPv4 SR-TE Peer: dc1-leaf1b (IP: 10.255.255.20)' anta.tests.routing.generic: - VerifyRoutingProtocolModel: model: multi-agent @@ -192,6 +269,118 @@ anta.tests.security: profile: eAPI_SSL_Profile result_overwrite: custom_field: 'eAPI HTTPS SSL Profile: eAPI_SSL_Profile' +- VerifySpecificIPSecConn: + ip_security_connections: + - peer: 10.255.255.10 + vrf: default + result_overwrite: + custom_field: 'IPv4 Peer: 10.255.255.10 VRF: default' +- VerifySpecificIPSecConn: + ip_security_connections: + - peer: 10.255.255.20 + vrf: default + result_overwrite: + custom_field: 'IPv4 Peer: 10.255.255.20 VRF: default' +- VerifySpecificIPSecConn: + ip_security_connections: + - peer: 10.255.1.2 + vrf: default + result_overwrite: + custom_field: 'IPv4 Peer: 10.255.1.2 VRF: default' +- VerifySSHStatus: null +- VerifySSHIPv4Acl: + number: 3 + vrf: default +- VerifySSHIPv6Acl: + number: 3 + vrf: default +- VerifyTelnetStatus: null +- VerifyAPIHttpStatus: null +- VerifyAPIHttpsSSL: + profile: default +- VerifyAPIIPv4Acl: + number: 3 + vrf: default +- VerifyAPIIPv6Acl: + number: 3 + vrf: default +- VerifyAPISSLCertificate: + certificates: + - certificate_name: ARISTA_SIGNING_CA.crt + common_name: AristaIT-ICA ECDSA Issuing Cert Authority + encryption_algorithm: ECDSA + expiry_threshold: 30 + key_size: 256 + - certificate_name: ARISTA_ROOT_CA.crt + common_name: Arista Networks Internal IT Root Cert Authority + encryption_algorithm: RSA + expiry_threshold: 30 + key_size: 4096 +- VerifyBannerLogin: + login_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyBannerMotd: + motd_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyIPv4ACL: + ipv4_access_lists: + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit ip any any tracked + sequence: 20 + - action: permit udp any any eq bfd ttl eq 255 + sequence: 30 + name: default-control-plane-acl + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit tcp any any range 5900 5910 + sequence: 20 + name: LabTest +- VerifyIPSecConnHealth: null +- VerifySpecificIPSecConn: + ip_security_connections: + - peer: 10.255.0.1 + - connections: + - destination_address: 100.64.2.2 + source_address: 100.64.3.2 + - destination_address: 172.18.2.2 + source_address: 172.18.3.2 + peer: 10.255.0.2 + vrf: default +anta.tests.services: +- VerifyHostname: + hostname: s1-spine1 +- VerifyDNSLookup: + domain_names: + - arista.com + - www.google.com + - arista.ca +- VerifyDNSServers: + dns_servers: + - priority: 1 + server_address: 10.14.0.1 + vrf: default + - priority: 0 + server_address: 10.14.0.11 + vrf: MGMT +- VerifyErrdisableRecovery: + reasons: + - interval: 30 + reason: acl + - interval: 30 + reason: bpduguard anta.tests.snmp: - VerifySnmpStatus: vrf: default @@ -210,6 +399,29 @@ anta.tests.software: versions: - v1.13.6 - v1.8.0 +anta.tests.stun: +- VerifyStunClient: + result_overwrite: + custom_field: 'Source IPv4 Address: 172.18.3.2 Source Port: 4500' + stun_clients: + - source_address: 172.18.3.2 + source_port: 4500 +- VerifyStunClient: + result_overwrite: + custom_field: 'Source IPv4 Address: 100.64.3.2 Source Port: 4500' + stun_clients: + - source_address: 100.64.3.2 + source_port: 4500 +- VerifyStunClient: + stun_clients: + - public_address: 172.18.3.21 + public_port: 6006 + source_address: 172.18.3.2 + source_port: 4500 + - public_address: 100.64.3.21 + public_port: 6006 + source_address: 100.64.3.2 + source_port: 4500 anta.tests.system: - VerifyNTP: null - VerifyUptime: @@ -221,3 +433,8 @@ anta.tests.system: - VerifyMemoryUtilization: null - VerifyFileSystemUtilization: null - VerifyNTP: null +anta.tests.vlan: +- VerifyVlanInternalPolicy: + end_vlan_id: 4094 + policy: ascending + start_vlan_id: 1006 diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-wan2-catalog.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-wan2-catalog.yml index 821180d772a..58953b7459c 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-wan2-catalog.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc1-wan2-catalog.yml @@ -87,6 +87,9 @@ anta.tests.connectivity: anta.tests.field_notices: - VerifyFieldNotice44Resolution: null - VerifyFieldNotice72Resolution: null +anta.tests.greent: +- VerifyGreenT: null +- VerifyGreenTCounters: null anta.tests.hardware: - VerifyEnvironmentPower: result_overwrite: @@ -165,7 +168,65 @@ anta.tests.interfaces: status: up result_overwrite: custom_field: Interface Vxlan1 = 'up' +anta.tests.lanz: +- VerifyLANZ: null +anta.tests.ptp: +- VerifyPtpModeStatus: null +- VerifyPtpGMStatus: + gmid: 0xec:46:70:ff:fe:00:ff:a9 +- VerifyPtpLockStatus: null +- VerifyPtpOffset: null +- VerifyPtpPortModeStatus: null anta.tests.routing.bgp: +- VerifyBGPSpecificPeers: + address_families: + - afi: evpn + peers: + - 10.255.255.10 + result_overwrite: + custom_field: 'BGP EVPN Peer: dc1-leaf1a (IP: 10.255.255.10)' +- VerifyBGPSpecificPeers: + address_families: + - afi: evpn + peers: + - 10.255.255.20 + result_overwrite: + custom_field: 'BGP EVPN Peer: dc1-leaf1b (IP: 10.255.255.20)' +- VerifyBGPSpecificPeers: + address_families: + - afi: evpn + peers: + - 10.255.1.1 + result_overwrite: + custom_field: 'BGP EVPN Peer: dc1-wan1 (IP: 10.255.1.1)' +- VerifyBGPSpecificPeers: + address_families: + - afi: path-selection + peers: + - 10.255.255.10 + result_overwrite: + custom_field: 'BGP Path-Selection Peer: dc1-leaf1a (IP: 10.255.255.10)' +- VerifyBGPSpecificPeers: + address_families: + - afi: path-selection + peers: + - 10.255.255.20 + result_overwrite: + custom_field: 'BGP Path-Selection Peer: dc1-leaf1b (IP: 10.255.255.20)' +- VerifyBGPSpecificPeers: + address_families: + - afi: link-state + peers: + - 10.255.255.10 + result_overwrite: + custom_field: 'BGP Link-State Peer: dc1-leaf1a (IP: 10.255.255.10)' +- VerifyBGPSpecificPeers: + address_families: + - afi: link-state + peers: + - 10.255.255.20 + result_overwrite: + custom_field: 'BGP Link-State Peer: dc1-leaf1b (IP: 10.255.255.20)' - VerifyBGPSpecificPeers: address_families: - afi: ipv4 @@ -182,6 +243,22 @@ anta.tests.routing.bgp: safi: unicast result_overwrite: custom_field: 'BGP IPv4 Unicast Peer: dc1-leaf1b (IP: 10.255.255.6)' +- VerifyBGPSpecificPeers: + address_families: + - afi: ipv4 + peers: + - 10.255.255.10 + safi: sr-te + result_overwrite: + custom_field: 'BGP IPv4 SR-TE Peer: dc1-leaf1a (IP: 10.255.255.10)' +- VerifyBGPSpecificPeers: + address_families: + - afi: ipv4 + peers: + - 10.255.255.20 + safi: sr-te + result_overwrite: + custom_field: 'BGP IPv4 SR-TE Peer: dc1-leaf1b (IP: 10.255.255.20)' anta.tests.routing.generic: - VerifyRoutingProtocolModel: model: multi-agent @@ -192,6 +269,118 @@ anta.tests.security: profile: eAPI_SSL_Profile result_overwrite: custom_field: 'eAPI HTTPS SSL Profile: eAPI_SSL_Profile' +- VerifySpecificIPSecConn: + ip_security_connections: + - peer: 10.255.255.10 + vrf: default + result_overwrite: + custom_field: 'IPv4 Peer: 10.255.255.10 VRF: default' +- VerifySpecificIPSecConn: + ip_security_connections: + - peer: 10.255.255.20 + vrf: default + result_overwrite: + custom_field: 'IPv4 Peer: 10.255.255.20 VRF: default' +- VerifySpecificIPSecConn: + ip_security_connections: + - peer: 10.255.1.1 + vrf: default + result_overwrite: + custom_field: 'IPv4 Peer: 10.255.1.1 VRF: default' +- VerifySSHStatus: null +- VerifySSHIPv4Acl: + number: 3 + vrf: default +- VerifySSHIPv6Acl: + number: 3 + vrf: default +- VerifyTelnetStatus: null +- VerifyAPIHttpStatus: null +- VerifyAPIHttpsSSL: + profile: default +- VerifyAPIIPv4Acl: + number: 3 + vrf: default +- VerifyAPIIPv6Acl: + number: 3 + vrf: default +- VerifyAPISSLCertificate: + certificates: + - certificate_name: ARISTA_SIGNING_CA.crt + common_name: AristaIT-ICA ECDSA Issuing Cert Authority + encryption_algorithm: ECDSA + expiry_threshold: 30 + key_size: 256 + - certificate_name: ARISTA_ROOT_CA.crt + common_name: Arista Networks Internal IT Root Cert Authority + encryption_algorithm: RSA + expiry_threshold: 30 + key_size: 4096 +- VerifyBannerLogin: + login_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyBannerMotd: + motd_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyIPv4ACL: + ipv4_access_lists: + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit ip any any tracked + sequence: 20 + - action: permit udp any any eq bfd ttl eq 255 + sequence: 30 + name: default-control-plane-acl + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit tcp any any range 5900 5910 + sequence: 20 + name: LabTest +- VerifyIPSecConnHealth: null +- VerifySpecificIPSecConn: + ip_security_connections: + - peer: 10.255.0.1 + - connections: + - destination_address: 100.64.2.2 + source_address: 100.64.3.2 + - destination_address: 172.18.2.2 + source_address: 172.18.3.2 + peer: 10.255.0.2 + vrf: default +anta.tests.services: +- VerifyHostname: + hostname: s1-spine1 +- VerifyDNSLookup: + domain_names: + - arista.com + - www.google.com + - arista.ca +- VerifyDNSServers: + dns_servers: + - priority: 1 + server_address: 10.14.0.1 + vrf: default + - priority: 0 + server_address: 10.14.0.11 + vrf: MGMT +- VerifyErrdisableRecovery: + reasons: + - interval: 30 + reason: acl + - interval: 30 + reason: bpduguard anta.tests.snmp: - VerifySnmpStatus: vrf: default @@ -210,6 +399,29 @@ anta.tests.software: versions: - v1.13.6 - v1.8.0 +anta.tests.stun: +- VerifyStunClient: + result_overwrite: + custom_field: 'Source IPv4 Address: 172.18.4.2 Source Port: 4500' + stun_clients: + - source_address: 172.18.4.2 + source_port: 4500 +- VerifyStunClient: + result_overwrite: + custom_field: 'Source IPv4 Address: 100.64.4.2 Source Port: 4500' + stun_clients: + - source_address: 100.64.4.2 + source_port: 4500 +- VerifyStunClient: + stun_clients: + - public_address: 172.18.3.21 + public_port: 6006 + source_address: 172.18.3.2 + source_port: 4500 + - public_address: 100.64.3.21 + public_port: 6006 + source_address: 100.64.3.2 + source_port: 4500 anta.tests.system: - VerifyNTP: null - VerifyUptime: @@ -221,3 +433,8 @@ anta.tests.system: - VerifyMemoryUtilization: null - VerifyFileSystemUtilization: null - VerifyNTP: null +anta.tests.vlan: +- VerifyVlanInternalPolicy: + end_vlan_id: 4094 + policy: ascending + start_vlan_id: 1006 diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-leaf1a-catalog.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-leaf1a-catalog.yml index cb935b01f46..2240fadf6a1 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-leaf1a-catalog.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-leaf1a-catalog.yml @@ -168,6 +168,24 @@ anta.tests.connectivity: result_overwrite: custom_field: 'Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2)' +- VerifyReachability: + hosts: + - destination: 10.33.0.5 + repeat: 1 + source: 10.255.128.13 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-svc-leaf1a + Loopback0 (IP: 10.33.0.5)' +- VerifyReachability: + hosts: + - destination: 10.33.0.6 + repeat: 1 + source: 10.255.128.13 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-svc-leaf1b + Loopback0 (IP: 10.33.0.6)' - VerifyReachability: hosts: - destination: 10.255.128.11 @@ -243,6 +261,9 @@ anta.tests.connectivity: anta.tests.field_notices: - VerifyFieldNotice44Resolution: null - VerifyFieldNotice72Resolution: null +anta.tests.greent: +- VerifyGreenT: null +- VerifyGreenTCounters: null anta.tests.hardware: - VerifyEnvironmentPower: result_overwrite: @@ -412,6 +433,8 @@ anta.tests.interfaces: status: up result_overwrite: custom_field: Interface Vxlan1 = 'up' +anta.tests.lanz: +- VerifyLANZ: null anta.tests.logging: - VerifyLoggingPersistent: null - VerifyLoggingSourceIntf: @@ -447,6 +470,13 @@ anta.tests.multicast: 12: false - VerifyIGMPSnoopingGlobal: enabled: true +anta.tests.ptp: +- VerifyPtpModeStatus: null +- VerifyPtpGMStatus: + gmid: 0xec:46:70:ff:fe:00:ff:a9 +- VerifyPtpLockStatus: null +- VerifyPtpOffset: null +- VerifyPtpPortModeStatus: null anta.tests.routing.bgp: - VerifyBGPSpecificPeers: address_families: @@ -526,6 +556,16 @@ anta.tests.routing.generic: custom_field: 'Route: 10.255.2.2 - Peer: dc1-wan2' routes: - 10.255.2.2 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.33.0.5 - Peer: dc1-svc-leaf1a' + routes: + - 10.33.0.5 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.33.0.6 - Peer: dc1-svc-leaf1b' + routes: + - 10.33.0.6 - VerifyRoutingTableEntry: result_overwrite: custom_field: 'Route: 10.255.128.11 - Peer: dc2-spine1' @@ -576,6 +616,11 @@ anta.tests.routing.generic: custom_field: 'Route: 10.255.1.5 - Peer: dc1-leaf2a' routes: - 10.255.1.5 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.33.1.5 - Peer: dc1-svc-leaf1a' + routes: + - 10.33.1.5 - VerifyRoutingTableEntry: result_overwrite: custom_field: 'Route: 10.255.129.13 - Peer: dc2-leaf1a' @@ -596,6 +641,100 @@ anta.tests.security: profile: eAPI_SSL_Profile result_overwrite: custom_field: 'eAPI HTTPS SSL Profile: eAPI_SSL_Profile' +- VerifySSHStatus: null +- VerifySSHIPv4Acl: + number: 3 + vrf: default +- VerifySSHIPv6Acl: + number: 3 + vrf: default +- VerifyTelnetStatus: null +- VerifyAPIHttpStatus: null +- VerifyAPIHttpsSSL: + profile: default +- VerifyAPIIPv4Acl: + number: 3 + vrf: default +- VerifyAPIIPv6Acl: + number: 3 + vrf: default +- VerifyAPISSLCertificate: + certificates: + - certificate_name: ARISTA_SIGNING_CA.crt + common_name: AristaIT-ICA ECDSA Issuing Cert Authority + encryption_algorithm: ECDSA + expiry_threshold: 30 + key_size: 256 + - certificate_name: ARISTA_ROOT_CA.crt + common_name: Arista Networks Internal IT Root Cert Authority + encryption_algorithm: RSA + expiry_threshold: 30 + key_size: 4096 +- VerifyBannerLogin: + login_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyBannerMotd: + motd_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyIPv4ACL: + ipv4_access_lists: + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit ip any any tracked + sequence: 20 + - action: permit udp any any eq bfd ttl eq 255 + sequence: 30 + name: default-control-plane-acl + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit tcp any any range 5900 5910 + sequence: 20 + name: LabTest +- VerifyIPSecConnHealth: null +- VerifySpecificIPSecConn: + ip_security_connections: + - peer: 10.255.0.1 + - connections: + - destination_address: 100.64.2.2 + source_address: 100.64.3.2 + - destination_address: 172.18.2.2 + source_address: 172.18.3.2 + peer: 10.255.0.2 + vrf: default +anta.tests.services: +- VerifyHostname: + hostname: s1-spine1 +- VerifyDNSLookup: + domain_names: + - arista.com + - www.google.com + - arista.ca +- VerifyDNSServers: + dns_servers: + - priority: 1 + server_address: 10.14.0.1 + vrf: default + - priority: 0 + server_address: 10.14.0.11 + vrf: MGMT +- VerifyErrdisableRecovery: + reasons: + - interval: 30 + reason: acl + - interval: 30 + reason: bpduguard anta.tests.snmp: - VerifySnmpStatus: vrf: default @@ -631,6 +770,17 @@ anta.tests.stp: - 10 - 20 priority: 32768 +anta.tests.stun: +- VerifyStunClient: + stun_clients: + - public_address: 172.18.3.21 + public_port: 6006 + source_address: 172.18.3.2 + source_port: 4500 + - public_address: 100.64.3.21 + public_port: 6006 + source_address: 100.64.3.2 + source_port: 4500 anta.tests.system: - VerifyNTP: null - VerifyUptime: @@ -642,3 +792,8 @@ anta.tests.system: - VerifyMemoryUtilization: null - VerifyFileSystemUtilization: null - VerifyNTP: null +anta.tests.vlan: +- VerifyVlanInternalPolicy: + end_vlan_id: 4094 + policy: ascending + start_vlan_id: 1006 diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-leaf1b-catalog.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-leaf1b-catalog.yml index 8ea15ee3f71..bb97d4ee091 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-leaf1b-catalog.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-leaf1b-catalog.yml @@ -168,6 +168,24 @@ anta.tests.connectivity: result_overwrite: custom_field: 'Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2)' +- VerifyReachability: + hosts: + - destination: 10.33.0.5 + repeat: 1 + source: 10.255.128.14 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-svc-leaf1a + Loopback0 (IP: 10.33.0.5)' +- VerifyReachability: + hosts: + - destination: 10.33.0.6 + repeat: 1 + source: 10.255.128.14 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-svc-leaf1b + Loopback0 (IP: 10.33.0.6)' - VerifyReachability: hosts: - destination: 10.255.128.11 @@ -243,6 +261,9 @@ anta.tests.connectivity: anta.tests.field_notices: - VerifyFieldNotice44Resolution: null - VerifyFieldNotice72Resolution: null +anta.tests.greent: +- VerifyGreenT: null +- VerifyGreenTCounters: null anta.tests.hardware: - VerifyEnvironmentPower: result_overwrite: @@ -412,6 +433,8 @@ anta.tests.interfaces: status: up result_overwrite: custom_field: Interface Vxlan1 = 'up' +anta.tests.lanz: +- VerifyLANZ: null anta.tests.logging: - VerifyLoggingPersistent: null - VerifyLoggingSourceIntf: @@ -447,6 +470,13 @@ anta.tests.multicast: 12: false - VerifyIGMPSnoopingGlobal: enabled: true +anta.tests.ptp: +- VerifyPtpModeStatus: null +- VerifyPtpGMStatus: + gmid: 0xec:46:70:ff:fe:00:ff:a9 +- VerifyPtpLockStatus: null +- VerifyPtpOffset: null +- VerifyPtpPortModeStatus: null anta.tests.routing.bgp: - VerifyBGPSpecificPeers: address_families: @@ -526,6 +556,16 @@ anta.tests.routing.generic: custom_field: 'Route: 10.255.2.2 - Peer: dc1-wan2' routes: - 10.255.2.2 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.33.0.5 - Peer: dc1-svc-leaf1a' + routes: + - 10.33.0.5 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.33.0.6 - Peer: dc1-svc-leaf1b' + routes: + - 10.33.0.6 - VerifyRoutingTableEntry: result_overwrite: custom_field: 'Route: 10.255.128.11 - Peer: dc2-spine1' @@ -576,6 +616,11 @@ anta.tests.routing.generic: custom_field: 'Route: 10.255.1.5 - Peer: dc1-leaf2a' routes: - 10.255.1.5 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.33.1.5 - Peer: dc1-svc-leaf1a' + routes: + - 10.33.1.5 - VerifyRoutingTableEntry: result_overwrite: custom_field: 'Route: 10.255.129.13 - Peer: dc2-leaf1a' @@ -596,6 +641,100 @@ anta.tests.security: profile: eAPI_SSL_Profile result_overwrite: custom_field: 'eAPI HTTPS SSL Profile: eAPI_SSL_Profile' +- VerifySSHStatus: null +- VerifySSHIPv4Acl: + number: 3 + vrf: default +- VerifySSHIPv6Acl: + number: 3 + vrf: default +- VerifyTelnetStatus: null +- VerifyAPIHttpStatus: null +- VerifyAPIHttpsSSL: + profile: default +- VerifyAPIIPv4Acl: + number: 3 + vrf: default +- VerifyAPIIPv6Acl: + number: 3 + vrf: default +- VerifyAPISSLCertificate: + certificates: + - certificate_name: ARISTA_SIGNING_CA.crt + common_name: AristaIT-ICA ECDSA Issuing Cert Authority + encryption_algorithm: ECDSA + expiry_threshold: 30 + key_size: 256 + - certificate_name: ARISTA_ROOT_CA.crt + common_name: Arista Networks Internal IT Root Cert Authority + encryption_algorithm: RSA + expiry_threshold: 30 + key_size: 4096 +- VerifyBannerLogin: + login_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyBannerMotd: + motd_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyIPv4ACL: + ipv4_access_lists: + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit ip any any tracked + sequence: 20 + - action: permit udp any any eq bfd ttl eq 255 + sequence: 30 + name: default-control-plane-acl + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit tcp any any range 5900 5910 + sequence: 20 + name: LabTest +- VerifyIPSecConnHealth: null +- VerifySpecificIPSecConn: + ip_security_connections: + - peer: 10.255.0.1 + - connections: + - destination_address: 100.64.2.2 + source_address: 100.64.3.2 + - destination_address: 172.18.2.2 + source_address: 172.18.3.2 + peer: 10.255.0.2 + vrf: default +anta.tests.services: +- VerifyHostname: + hostname: s1-spine1 +- VerifyDNSLookup: + domain_names: + - arista.com + - www.google.com + - arista.ca +- VerifyDNSServers: + dns_servers: + - priority: 1 + server_address: 10.14.0.1 + vrf: default + - priority: 0 + server_address: 10.14.0.11 + vrf: MGMT +- VerifyErrdisableRecovery: + reasons: + - interval: 30 + reason: acl + - interval: 30 + reason: bpduguard anta.tests.snmp: - VerifySnmpStatus: vrf: default @@ -631,6 +770,17 @@ anta.tests.stp: - 10 - 20 priority: 32768 +anta.tests.stun: +- VerifyStunClient: + stun_clients: + - public_address: 172.18.3.21 + public_port: 6006 + source_address: 172.18.3.2 + source_port: 4500 + - public_address: 100.64.3.21 + public_port: 6006 + source_address: 100.64.3.2 + source_port: 4500 anta.tests.system: - VerifyNTP: null - VerifyUptime: @@ -642,3 +792,8 @@ anta.tests.system: - VerifyMemoryUtilization: null - VerifyFileSystemUtilization: null - VerifyNTP: null +anta.tests.vlan: +- VerifyVlanInternalPolicy: + end_vlan_id: 4094 + policy: ascending + start_vlan_id: 1006 diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-leaf1c-catalog.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-leaf1c-catalog.yml index b7f189d6025..44c9caf531c 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-leaf1c-catalog.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-leaf1c-catalog.yml @@ -69,6 +69,9 @@ anta.tests.connectivity: anta.tests.field_notices: - VerifyFieldNotice44Resolution: null - VerifyFieldNotice72Resolution: null +anta.tests.greent: +- VerifyGreenT: null +- VerifyGreenTCounters: null anta.tests.hardware: - VerifyEnvironmentPower: result_overwrite: @@ -129,11 +132,114 @@ anta.tests.interfaces: status: up result_overwrite: custom_field: Interface Port-Channel1 - DC2_L3_LEAF1_Po8 = 'up' +anta.tests.lanz: +- VerifyLANZ: null +anta.tests.ptp: +- VerifyPtpModeStatus: null +- VerifyPtpGMStatus: + gmid: 0xec:46:70:ff:fe:00:ff:a9 +- VerifyPtpLockStatus: null +- VerifyPtpOffset: null +- VerifyPtpPortModeStatus: null anta.tests.security: - VerifyAPIHttpsSSL: profile: eAPI_SSL_Profile result_overwrite: custom_field: 'eAPI HTTPS SSL Profile: eAPI_SSL_Profile' +- VerifySSHStatus: null +- VerifySSHIPv4Acl: + number: 3 + vrf: default +- VerifySSHIPv6Acl: + number: 3 + vrf: default +- VerifyTelnetStatus: null +- VerifyAPIHttpStatus: null +- VerifyAPIHttpsSSL: + profile: default +- VerifyAPIIPv4Acl: + number: 3 + vrf: default +- VerifyAPIIPv6Acl: + number: 3 + vrf: default +- VerifyAPISSLCertificate: + certificates: + - certificate_name: ARISTA_SIGNING_CA.crt + common_name: AristaIT-ICA ECDSA Issuing Cert Authority + encryption_algorithm: ECDSA + expiry_threshold: 30 + key_size: 256 + - certificate_name: ARISTA_ROOT_CA.crt + common_name: Arista Networks Internal IT Root Cert Authority + encryption_algorithm: RSA + expiry_threshold: 30 + key_size: 4096 +- VerifyBannerLogin: + login_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyBannerMotd: + motd_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyIPv4ACL: + ipv4_access_lists: + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit ip any any tracked + sequence: 20 + - action: permit udp any any eq bfd ttl eq 255 + sequence: 30 + name: default-control-plane-acl + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit tcp any any range 5900 5910 + sequence: 20 + name: LabTest +- VerifyIPSecConnHealth: null +- VerifySpecificIPSecConn: + ip_security_connections: + - peer: 10.255.0.1 + - connections: + - destination_address: 100.64.2.2 + source_address: 100.64.3.2 + - destination_address: 172.18.2.2 + source_address: 172.18.3.2 + peer: 10.255.0.2 + vrf: default +anta.tests.services: +- VerifyHostname: + hostname: s1-spine1 +- VerifyDNSLookup: + domain_names: + - arista.com + - www.google.com + - arista.ca +- VerifyDNSServers: + dns_servers: + - priority: 1 + server_address: 10.14.0.1 + vrf: default + - priority: 0 + server_address: 10.14.0.11 + vrf: MGMT +- VerifyErrdisableRecovery: + reasons: + - interval: 30 + reason: acl + - interval: 30 + reason: bpduguard anta.tests.snmp: - VerifySnmpStatus: vrf: default @@ -152,6 +258,17 @@ anta.tests.software: versions: - v1.13.6 - v1.8.0 +anta.tests.stun: +- VerifyStunClient: + stun_clients: + - public_address: 172.18.3.21 + public_port: 6006 + source_address: 172.18.3.2 + source_port: 4500 + - public_address: 100.64.3.21 + public_port: 6006 + source_address: 100.64.3.2 + source_port: 4500 anta.tests.system: - VerifyNTP: null - VerifyUptime: @@ -163,3 +280,8 @@ anta.tests.system: - VerifyMemoryUtilization: null - VerifyFileSystemUtilization: null - VerifyNTP: null +anta.tests.vlan: +- VerifyVlanInternalPolicy: + end_vlan_id: 4094 + policy: ascending + start_vlan_id: 1006 diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-leaf2a-catalog.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-leaf2a-catalog.yml index 80d8915516d..af292cefee6 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-leaf2a-catalog.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-leaf2a-catalog.yml @@ -184,6 +184,24 @@ anta.tests.connectivity: result_overwrite: custom_field: 'Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2)' +- VerifyReachability: + hosts: + - destination: 10.33.0.5 + repeat: 1 + source: 10.255.128.15 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-svc-leaf1a + Loopback0 (IP: 10.33.0.5)' +- VerifyReachability: + hosts: + - destination: 10.33.0.6 + repeat: 1 + source: 10.255.128.15 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-svc-leaf1b + Loopback0 (IP: 10.33.0.6)' - VerifyReachability: hosts: - destination: 10.255.128.11 @@ -259,6 +277,9 @@ anta.tests.connectivity: anta.tests.field_notices: - VerifyFieldNotice44Resolution: null - VerifyFieldNotice72Resolution: null +anta.tests.greent: +- VerifyGreenT: null +- VerifyGreenTCounters: null anta.tests.hardware: - VerifyEnvironmentPower: result_overwrite: @@ -434,6 +455,8 @@ anta.tests.interfaces: status: up result_overwrite: custom_field: Interface Vxlan1 = 'up' +anta.tests.lanz: +- VerifyLANZ: null anta.tests.logging: - VerifyLoggingPersistent: null - VerifyLoggingSourceIntf: @@ -469,6 +492,13 @@ anta.tests.multicast: 12: false - VerifyIGMPSnoopingGlobal: enabled: true +anta.tests.ptp: +- VerifyPtpModeStatus: null +- VerifyPtpGMStatus: + gmid: 0xec:46:70:ff:fe:00:ff:a9 +- VerifyPtpLockStatus: null +- VerifyPtpOffset: null +- VerifyPtpPortModeStatus: null anta.tests.routing.bgp: - VerifyBGPSpecificPeers: address_families: @@ -563,6 +593,16 @@ anta.tests.routing.generic: custom_field: 'Route: 10.255.2.2 - Peer: dc1-wan2' routes: - 10.255.2.2 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.33.0.5 - Peer: dc1-svc-leaf1a' + routes: + - 10.33.0.5 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.33.0.6 - Peer: dc1-svc-leaf1b' + routes: + - 10.33.0.6 - VerifyRoutingTableEntry: result_overwrite: custom_field: 'Route: 10.255.128.11 - Peer: dc2-spine1' @@ -613,6 +653,11 @@ anta.tests.routing.generic: custom_field: 'Route: 10.255.1.5 - Peer: dc1-leaf2a' routes: - 10.255.1.5 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.33.1.5 - Peer: dc1-svc-leaf1a' + routes: + - 10.33.1.5 - VerifyRoutingTableEntry: result_overwrite: custom_field: 'Route: 10.255.129.13 - Peer: dc2-leaf1a' @@ -633,6 +678,100 @@ anta.tests.security: profile: eAPI_SSL_Profile result_overwrite: custom_field: 'eAPI HTTPS SSL Profile: eAPI_SSL_Profile' +- VerifySSHStatus: null +- VerifySSHIPv4Acl: + number: 3 + vrf: default +- VerifySSHIPv6Acl: + number: 3 + vrf: default +- VerifyTelnetStatus: null +- VerifyAPIHttpStatus: null +- VerifyAPIHttpsSSL: + profile: default +- VerifyAPIIPv4Acl: + number: 3 + vrf: default +- VerifyAPIIPv6Acl: + number: 3 + vrf: default +- VerifyAPISSLCertificate: + certificates: + - certificate_name: ARISTA_SIGNING_CA.crt + common_name: AristaIT-ICA ECDSA Issuing Cert Authority + encryption_algorithm: ECDSA + expiry_threshold: 30 + key_size: 256 + - certificate_name: ARISTA_ROOT_CA.crt + common_name: Arista Networks Internal IT Root Cert Authority + encryption_algorithm: RSA + expiry_threshold: 30 + key_size: 4096 +- VerifyBannerLogin: + login_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyBannerMotd: + motd_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyIPv4ACL: + ipv4_access_lists: + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit ip any any tracked + sequence: 20 + - action: permit udp any any eq bfd ttl eq 255 + sequence: 30 + name: default-control-plane-acl + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit tcp any any range 5900 5910 + sequence: 20 + name: LabTest +- VerifyIPSecConnHealth: null +- VerifySpecificIPSecConn: + ip_security_connections: + - peer: 10.255.0.1 + - connections: + - destination_address: 100.64.2.2 + source_address: 100.64.3.2 + - destination_address: 172.18.2.2 + source_address: 172.18.3.2 + peer: 10.255.0.2 + vrf: default +anta.tests.services: +- VerifyHostname: + hostname: s1-spine1 +- VerifyDNSLookup: + domain_names: + - arista.com + - www.google.com + - arista.ca +- VerifyDNSServers: + dns_servers: + - priority: 1 + server_address: 10.14.0.1 + vrf: default + - priority: 0 + server_address: 10.14.0.11 + vrf: MGMT +- VerifyErrdisableRecovery: + reasons: + - interval: 30 + reason: acl + - interval: 30 + reason: bpduguard anta.tests.snmp: - VerifySnmpStatus: vrf: default @@ -668,6 +807,17 @@ anta.tests.stp: - 10 - 20 priority: 32768 +anta.tests.stun: +- VerifyStunClient: + stun_clients: + - public_address: 172.18.3.21 + public_port: 6006 + source_address: 172.18.3.2 + source_port: 4500 + - public_address: 100.64.3.21 + public_port: 6006 + source_address: 100.64.3.2 + source_port: 4500 anta.tests.system: - VerifyNTP: null - VerifyUptime: @@ -679,3 +829,8 @@ anta.tests.system: - VerifyMemoryUtilization: null - VerifyFileSystemUtilization: null - VerifyNTP: null +anta.tests.vlan: +- VerifyVlanInternalPolicy: + end_vlan_id: 4094 + policy: ascending + start_vlan_id: 1006 diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-leaf2b-catalog.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-leaf2b-catalog.yml index 025985f05ca..aaf251255da 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-leaf2b-catalog.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-leaf2b-catalog.yml @@ -168,6 +168,24 @@ anta.tests.connectivity: result_overwrite: custom_field: 'Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2)' +- VerifyReachability: + hosts: + - destination: 10.33.0.5 + repeat: 1 + source: 10.255.128.16 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-svc-leaf1a + Loopback0 (IP: 10.33.0.5)' +- VerifyReachability: + hosts: + - destination: 10.33.0.6 + repeat: 1 + source: 10.255.128.16 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-svc-leaf1b + Loopback0 (IP: 10.33.0.6)' - VerifyReachability: hosts: - destination: 10.255.128.11 @@ -243,6 +261,9 @@ anta.tests.connectivity: anta.tests.field_notices: - VerifyFieldNotice44Resolution: null - VerifyFieldNotice72Resolution: null +anta.tests.greent: +- VerifyGreenT: null +- VerifyGreenTCounters: null anta.tests.hardware: - VerifyEnvironmentPower: result_overwrite: @@ -418,6 +439,8 @@ anta.tests.interfaces: status: up result_overwrite: custom_field: Interface Vxlan1 = 'up' +anta.tests.lanz: +- VerifyLANZ: null anta.tests.logging: - VerifyLoggingPersistent: null - VerifyLoggingSourceIntf: @@ -453,6 +476,13 @@ anta.tests.multicast: 12: false - VerifyIGMPSnoopingGlobal: enabled: true +anta.tests.ptp: +- VerifyPtpModeStatus: null +- VerifyPtpGMStatus: + gmid: 0xec:46:70:ff:fe:00:ff:a9 +- VerifyPtpLockStatus: null +- VerifyPtpOffset: null +- VerifyPtpPortModeStatus: null anta.tests.routing.bgp: - VerifyBGPSpecificPeers: address_families: @@ -532,6 +562,16 @@ anta.tests.routing.generic: custom_field: 'Route: 10.255.2.2 - Peer: dc1-wan2' routes: - 10.255.2.2 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.33.0.5 - Peer: dc1-svc-leaf1a' + routes: + - 10.33.0.5 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.33.0.6 - Peer: dc1-svc-leaf1b' + routes: + - 10.33.0.6 - VerifyRoutingTableEntry: result_overwrite: custom_field: 'Route: 10.255.128.11 - Peer: dc2-spine1' @@ -582,6 +622,11 @@ anta.tests.routing.generic: custom_field: 'Route: 10.255.1.5 - Peer: dc1-leaf2a' routes: - 10.255.1.5 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.33.1.5 - Peer: dc1-svc-leaf1a' + routes: + - 10.33.1.5 - VerifyRoutingTableEntry: result_overwrite: custom_field: 'Route: 10.255.129.13 - Peer: dc2-leaf1a' @@ -602,6 +647,100 @@ anta.tests.security: profile: eAPI_SSL_Profile result_overwrite: custom_field: 'eAPI HTTPS SSL Profile: eAPI_SSL_Profile' +- VerifySSHStatus: null +- VerifySSHIPv4Acl: + number: 3 + vrf: default +- VerifySSHIPv6Acl: + number: 3 + vrf: default +- VerifyTelnetStatus: null +- VerifyAPIHttpStatus: null +- VerifyAPIHttpsSSL: + profile: default +- VerifyAPIIPv4Acl: + number: 3 + vrf: default +- VerifyAPIIPv6Acl: + number: 3 + vrf: default +- VerifyAPISSLCertificate: + certificates: + - certificate_name: ARISTA_SIGNING_CA.crt + common_name: AristaIT-ICA ECDSA Issuing Cert Authority + encryption_algorithm: ECDSA + expiry_threshold: 30 + key_size: 256 + - certificate_name: ARISTA_ROOT_CA.crt + common_name: Arista Networks Internal IT Root Cert Authority + encryption_algorithm: RSA + expiry_threshold: 30 + key_size: 4096 +- VerifyBannerLogin: + login_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyBannerMotd: + motd_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyIPv4ACL: + ipv4_access_lists: + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit ip any any tracked + sequence: 20 + - action: permit udp any any eq bfd ttl eq 255 + sequence: 30 + name: default-control-plane-acl + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit tcp any any range 5900 5910 + sequence: 20 + name: LabTest +- VerifyIPSecConnHealth: null +- VerifySpecificIPSecConn: + ip_security_connections: + - peer: 10.255.0.1 + - connections: + - destination_address: 100.64.2.2 + source_address: 100.64.3.2 + - destination_address: 172.18.2.2 + source_address: 172.18.3.2 + peer: 10.255.0.2 + vrf: default +anta.tests.services: +- VerifyHostname: + hostname: s1-spine1 +- VerifyDNSLookup: + domain_names: + - arista.com + - www.google.com + - arista.ca +- VerifyDNSServers: + dns_servers: + - priority: 1 + server_address: 10.14.0.1 + vrf: default + - priority: 0 + server_address: 10.14.0.11 + vrf: MGMT +- VerifyErrdisableRecovery: + reasons: + - interval: 30 + reason: acl + - interval: 30 + reason: bpduguard anta.tests.snmp: - VerifySnmpStatus: vrf: default @@ -637,6 +776,17 @@ anta.tests.stp: - 10 - 20 priority: 32768 +anta.tests.stun: +- VerifyStunClient: + stun_clients: + - public_address: 172.18.3.21 + public_port: 6006 + source_address: 172.18.3.2 + source_port: 4500 + - public_address: 100.64.3.21 + public_port: 6006 + source_address: 100.64.3.2 + source_port: 4500 anta.tests.system: - VerifyNTP: null - VerifyUptime: @@ -648,3 +798,8 @@ anta.tests.system: - VerifyMemoryUtilization: null - VerifyFileSystemUtilization: null - VerifyNTP: null +anta.tests.vlan: +- VerifyVlanInternalPolicy: + end_vlan_id: 4094 + policy: ascending + start_vlan_id: 1006 diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-leaf2c-catalog.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-leaf2c-catalog.yml index 1a17dda1c0a..64a301efe98 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-leaf2c-catalog.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-leaf2c-catalog.yml @@ -69,6 +69,9 @@ anta.tests.connectivity: anta.tests.field_notices: - VerifyFieldNotice44Resolution: null - VerifyFieldNotice72Resolution: null +anta.tests.greent: +- VerifyGreenT: null +- VerifyGreenTCounters: null anta.tests.hardware: - VerifyEnvironmentPower: result_overwrite: @@ -129,11 +132,114 @@ anta.tests.interfaces: status: up result_overwrite: custom_field: Interface Port-Channel1 - DC2_L3_LEAF2_Po8 = 'up' +anta.tests.lanz: +- VerifyLANZ: null +anta.tests.ptp: +- VerifyPtpModeStatus: null +- VerifyPtpGMStatus: + gmid: 0xec:46:70:ff:fe:00:ff:a9 +- VerifyPtpLockStatus: null +- VerifyPtpOffset: null +- VerifyPtpPortModeStatus: null anta.tests.security: - VerifyAPIHttpsSSL: profile: eAPI_SSL_Profile result_overwrite: custom_field: 'eAPI HTTPS SSL Profile: eAPI_SSL_Profile' +- VerifySSHStatus: null +- VerifySSHIPv4Acl: + number: 3 + vrf: default +- VerifySSHIPv6Acl: + number: 3 + vrf: default +- VerifyTelnetStatus: null +- VerifyAPIHttpStatus: null +- VerifyAPIHttpsSSL: + profile: default +- VerifyAPIIPv4Acl: + number: 3 + vrf: default +- VerifyAPIIPv6Acl: + number: 3 + vrf: default +- VerifyAPISSLCertificate: + certificates: + - certificate_name: ARISTA_SIGNING_CA.crt + common_name: AristaIT-ICA ECDSA Issuing Cert Authority + encryption_algorithm: ECDSA + expiry_threshold: 30 + key_size: 256 + - certificate_name: ARISTA_ROOT_CA.crt + common_name: Arista Networks Internal IT Root Cert Authority + encryption_algorithm: RSA + expiry_threshold: 30 + key_size: 4096 +- VerifyBannerLogin: + login_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyBannerMotd: + motd_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyIPv4ACL: + ipv4_access_lists: + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit ip any any tracked + sequence: 20 + - action: permit udp any any eq bfd ttl eq 255 + sequence: 30 + name: default-control-plane-acl + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit tcp any any range 5900 5910 + sequence: 20 + name: LabTest +- VerifyIPSecConnHealth: null +- VerifySpecificIPSecConn: + ip_security_connections: + - peer: 10.255.0.1 + - connections: + - destination_address: 100.64.2.2 + source_address: 100.64.3.2 + - destination_address: 172.18.2.2 + source_address: 172.18.3.2 + peer: 10.255.0.2 + vrf: default +anta.tests.services: +- VerifyHostname: + hostname: s1-spine1 +- VerifyDNSLookup: + domain_names: + - arista.com + - www.google.com + - arista.ca +- VerifyDNSServers: + dns_servers: + - priority: 1 + server_address: 10.14.0.1 + vrf: default + - priority: 0 + server_address: 10.14.0.11 + vrf: MGMT +- VerifyErrdisableRecovery: + reasons: + - interval: 30 + reason: acl + - interval: 30 + reason: bpduguard anta.tests.snmp: - VerifySnmpStatus: vrf: default @@ -152,6 +258,17 @@ anta.tests.software: versions: - v1.13.6 - v1.8.0 +anta.tests.stun: +- VerifyStunClient: + stun_clients: + - public_address: 172.18.3.21 + public_port: 6006 + source_address: 172.18.3.2 + source_port: 4500 + - public_address: 100.64.3.21 + public_port: 6006 + source_address: 100.64.3.2 + source_port: 4500 anta.tests.system: - VerifyNTP: null - VerifyUptime: @@ -163,3 +280,8 @@ anta.tests.system: - VerifyMemoryUtilization: null - VerifyFileSystemUtilization: null - VerifyNTP: null +anta.tests.vlan: +- VerifyVlanInternalPolicy: + end_vlan_id: 4094 + policy: ascending + start_vlan_id: 1006 diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-leaf3a.arista.com-catalog.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-leaf3a.arista.com-catalog.yml index 8f60b035daf..7afd393f57d 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-leaf3a.arista.com-catalog.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-leaf3a.arista.com-catalog.yml @@ -161,6 +161,24 @@ anta.tests.connectivity: result_overwrite: custom_field: 'Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2)' +- VerifyReachability: + hosts: + - destination: 10.33.0.5 + repeat: 1 + source: 10.255.128.17 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-svc-leaf1a + Loopback0 (IP: 10.33.0.5)' +- VerifyReachability: + hosts: + - destination: 10.33.0.6 + repeat: 1 + source: 10.255.128.17 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-svc-leaf1b + Loopback0 (IP: 10.33.0.6)' - VerifyReachability: hosts: - destination: 10.255.128.11 @@ -236,6 +254,9 @@ anta.tests.connectivity: anta.tests.field_notices: - VerifyFieldNotice44Resolution: null - VerifyFieldNotice72Resolution: null +anta.tests.greent: +- VerifyGreenT: null +- VerifyGreenTCounters: null anta.tests.hardware: - VerifyEnvironmentPower: result_overwrite: @@ -395,6 +416,8 @@ anta.tests.interfaces: status: up result_overwrite: custom_field: Interface Vxlan1 = 'up' +anta.tests.lanz: +- VerifyLANZ: null anta.tests.logging: - VerifyLoggingPersistent: null - VerifyLoggingSourceIntf: @@ -430,6 +453,13 @@ anta.tests.multicast: 12: false - VerifyIGMPSnoopingGlobal: enabled: true +anta.tests.ptp: +- VerifyPtpModeStatus: null +- VerifyPtpGMStatus: + gmid: 0xec:46:70:ff:fe:00:ff:a9 +- VerifyPtpLockStatus: null +- VerifyPtpOffset: null +- VerifyPtpPortModeStatus: null anta.tests.routing.bgp: - VerifyBGPSpecificPeers: address_families: @@ -509,6 +539,16 @@ anta.tests.routing.generic: custom_field: 'Route: 10.255.2.2 - Peer: dc1-wan2' routes: - 10.255.2.2 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.33.0.5 - Peer: dc1-svc-leaf1a' + routes: + - 10.33.0.5 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.33.0.6 - Peer: dc1-svc-leaf1b' + routes: + - 10.33.0.6 - VerifyRoutingTableEntry: result_overwrite: custom_field: 'Route: 10.255.128.11 - Peer: dc2-spine1' @@ -559,6 +599,11 @@ anta.tests.routing.generic: custom_field: 'Route: 10.255.1.5 - Peer: dc1-leaf2a' routes: - 10.255.1.5 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.33.1.5 - Peer: dc1-svc-leaf1a' + routes: + - 10.33.1.5 - VerifyRoutingTableEntry: result_overwrite: custom_field: 'Route: 10.255.129.13 - Peer: dc2-leaf1a' @@ -579,6 +624,100 @@ anta.tests.security: profile: eAPI_SSL_Profile result_overwrite: custom_field: 'eAPI HTTPS SSL Profile: eAPI_SSL_Profile' +- VerifySSHStatus: null +- VerifySSHIPv4Acl: + number: 3 + vrf: default +- VerifySSHIPv6Acl: + number: 3 + vrf: default +- VerifyTelnetStatus: null +- VerifyAPIHttpStatus: null +- VerifyAPIHttpsSSL: + profile: default +- VerifyAPIIPv4Acl: + number: 3 + vrf: default +- VerifyAPIIPv6Acl: + number: 3 + vrf: default +- VerifyAPISSLCertificate: + certificates: + - certificate_name: ARISTA_SIGNING_CA.crt + common_name: AristaIT-ICA ECDSA Issuing Cert Authority + encryption_algorithm: ECDSA + expiry_threshold: 30 + key_size: 256 + - certificate_name: ARISTA_ROOT_CA.crt + common_name: Arista Networks Internal IT Root Cert Authority + encryption_algorithm: RSA + expiry_threshold: 30 + key_size: 4096 +- VerifyBannerLogin: + login_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyBannerMotd: + motd_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyIPv4ACL: + ipv4_access_lists: + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit ip any any tracked + sequence: 20 + - action: permit udp any any eq bfd ttl eq 255 + sequence: 30 + name: default-control-plane-acl + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit tcp any any range 5900 5910 + sequence: 20 + name: LabTest +- VerifyIPSecConnHealth: null +- VerifySpecificIPSecConn: + ip_security_connections: + - peer: 10.255.0.1 + - connections: + - destination_address: 100.64.2.2 + source_address: 100.64.3.2 + - destination_address: 172.18.2.2 + source_address: 172.18.3.2 + peer: 10.255.0.2 + vrf: default +anta.tests.services: +- VerifyHostname: + hostname: s1-spine1 +- VerifyDNSLookup: + domain_names: + - arista.com + - www.google.com + - arista.ca +- VerifyDNSServers: + dns_servers: + - priority: 1 + server_address: 10.14.0.1 + vrf: default + - priority: 0 + server_address: 10.14.0.11 + vrf: MGMT +- VerifyErrdisableRecovery: + reasons: + - interval: 30 + reason: acl + - interval: 30 + reason: bpduguard anta.tests.snmp: - VerifySnmpStatus: vrf: default @@ -614,6 +753,17 @@ anta.tests.stp: - 10 - 20 priority: 32768 +anta.tests.stun: +- VerifyStunClient: + stun_clients: + - public_address: 172.18.3.21 + public_port: 6006 + source_address: 172.18.3.2 + source_port: 4500 + - public_address: 100.64.3.21 + public_port: 6006 + source_address: 100.64.3.2 + source_port: 4500 anta.tests.system: - VerifyNTP: null - VerifyUptime: @@ -625,3 +775,8 @@ anta.tests.system: - VerifyMemoryUtilization: null - VerifyFileSystemUtilization: null - VerifyNTP: null +anta.tests.vlan: +- VerifyVlanInternalPolicy: + end_vlan_id: 4094 + policy: ascending + start_vlan_id: 1006 diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-leaf3b.arista.com-catalog.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-leaf3b.arista.com-catalog.yml index b1d3383e335..e80002aae1a 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-leaf3b.arista.com-catalog.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-leaf3b.arista.com-catalog.yml @@ -161,6 +161,24 @@ anta.tests.connectivity: result_overwrite: custom_field: 'Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2)' +- VerifyReachability: + hosts: + - destination: 10.33.0.5 + repeat: 1 + source: 10.255.128.18 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-svc-leaf1a + Loopback0 (IP: 10.33.0.5)' +- VerifyReachability: + hosts: + - destination: 10.33.0.6 + repeat: 1 + source: 10.255.128.18 + vrf: default + result_overwrite: + custom_field: 'Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-svc-leaf1b + Loopback0 (IP: 10.33.0.6)' - VerifyReachability: hosts: - destination: 10.255.128.11 @@ -236,6 +254,9 @@ anta.tests.connectivity: anta.tests.field_notices: - VerifyFieldNotice44Resolution: null - VerifyFieldNotice72Resolution: null +anta.tests.greent: +- VerifyGreenT: null +- VerifyGreenTCounters: null anta.tests.hardware: - VerifyEnvironmentPower: result_overwrite: @@ -395,6 +416,8 @@ anta.tests.interfaces: status: up result_overwrite: custom_field: Interface Vxlan1 = 'up' +anta.tests.lanz: +- VerifyLANZ: null anta.tests.logging: - VerifyLoggingPersistent: null - VerifyLoggingSourceIntf: @@ -430,6 +453,13 @@ anta.tests.multicast: 12: false - VerifyIGMPSnoopingGlobal: enabled: true +anta.tests.ptp: +- VerifyPtpModeStatus: null +- VerifyPtpGMStatus: + gmid: 0xec:46:70:ff:fe:00:ff:a9 +- VerifyPtpLockStatus: null +- VerifyPtpOffset: null +- VerifyPtpPortModeStatus: null anta.tests.routing.bgp: - VerifyBGPSpecificPeers: address_families: @@ -509,6 +539,16 @@ anta.tests.routing.generic: custom_field: 'Route: 10.255.2.2 - Peer: dc1-wan2' routes: - 10.255.2.2 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.33.0.5 - Peer: dc1-svc-leaf1a' + routes: + - 10.33.0.5 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.33.0.6 - Peer: dc1-svc-leaf1b' + routes: + - 10.33.0.6 - VerifyRoutingTableEntry: result_overwrite: custom_field: 'Route: 10.255.128.11 - Peer: dc2-spine1' @@ -559,6 +599,11 @@ anta.tests.routing.generic: custom_field: 'Route: 10.255.1.5 - Peer: dc1-leaf2a' routes: - 10.255.1.5 +- VerifyRoutingTableEntry: + result_overwrite: + custom_field: 'Route: 10.33.1.5 - Peer: dc1-svc-leaf1a' + routes: + - 10.33.1.5 - VerifyRoutingTableEntry: result_overwrite: custom_field: 'Route: 10.255.129.13 - Peer: dc2-leaf1a' @@ -579,6 +624,100 @@ anta.tests.security: profile: eAPI_SSL_Profile result_overwrite: custom_field: 'eAPI HTTPS SSL Profile: eAPI_SSL_Profile' +- VerifySSHStatus: null +- VerifySSHIPv4Acl: + number: 3 + vrf: default +- VerifySSHIPv6Acl: + number: 3 + vrf: default +- VerifyTelnetStatus: null +- VerifyAPIHttpStatus: null +- VerifyAPIHttpsSSL: + profile: default +- VerifyAPIIPv4Acl: + number: 3 + vrf: default +- VerifyAPIIPv6Acl: + number: 3 + vrf: default +- VerifyAPISSLCertificate: + certificates: + - certificate_name: ARISTA_SIGNING_CA.crt + common_name: AristaIT-ICA ECDSA Issuing Cert Authority + encryption_algorithm: ECDSA + expiry_threshold: 30 + key_size: 256 + - certificate_name: ARISTA_ROOT_CA.crt + common_name: Arista Networks Internal IT Root Cert Authority + encryption_algorithm: RSA + expiry_threshold: 30 + key_size: 4096 +- VerifyBannerLogin: + login_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyBannerMotd: + motd_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyIPv4ACL: + ipv4_access_lists: + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit ip any any tracked + sequence: 20 + - action: permit udp any any eq bfd ttl eq 255 + sequence: 30 + name: default-control-plane-acl + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit tcp any any range 5900 5910 + sequence: 20 + name: LabTest +- VerifyIPSecConnHealth: null +- VerifySpecificIPSecConn: + ip_security_connections: + - peer: 10.255.0.1 + - connections: + - destination_address: 100.64.2.2 + source_address: 100.64.3.2 + - destination_address: 172.18.2.2 + source_address: 172.18.3.2 + peer: 10.255.0.2 + vrf: default +anta.tests.services: +- VerifyHostname: + hostname: s1-spine1 +- VerifyDNSLookup: + domain_names: + - arista.com + - www.google.com + - arista.ca +- VerifyDNSServers: + dns_servers: + - priority: 1 + server_address: 10.14.0.1 + vrf: default + - priority: 0 + server_address: 10.14.0.11 + vrf: MGMT +- VerifyErrdisableRecovery: + reasons: + - interval: 30 + reason: acl + - interval: 30 + reason: bpduguard anta.tests.snmp: - VerifySnmpStatus: vrf: default @@ -614,6 +753,17 @@ anta.tests.stp: - 10 - 20 priority: 32768 +anta.tests.stun: +- VerifyStunClient: + stun_clients: + - public_address: 172.18.3.21 + public_port: 6006 + source_address: 172.18.3.2 + source_port: 4500 + - public_address: 100.64.3.21 + public_port: 6006 + source_address: 100.64.3.2 + source_port: 4500 anta.tests.system: - VerifyNTP: null - VerifyUptime: @@ -625,3 +775,8 @@ anta.tests.system: - VerifyMemoryUtilization: null - VerifyFileSystemUtilization: null - VerifyNTP: null +anta.tests.vlan: +- VerifyVlanInternalPolicy: + end_vlan_id: 4094 + policy: ascending + start_vlan_id: 1006 diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-spine1-catalog.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-spine1-catalog.yml index 1f09ca9802b..ee571a69ad8 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-spine1-catalog.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-spine1-catalog.yml @@ -151,6 +151,9 @@ anta.tests.connectivity: anta.tests.field_notices: - VerifyFieldNotice44Resolution: null - VerifyFieldNotice72Resolution: null +anta.tests.greent: +- VerifyGreenT: null +- VerifyGreenTCounters: null anta.tests.hardware: - VerifyEnvironmentPower: result_overwrite: @@ -231,6 +234,15 @@ anta.tests.interfaces: status: up result_overwrite: custom_field: Interface Loopback0 - EVPN_Overlay_Peering = 'up' +anta.tests.lanz: +- VerifyLANZ: null +anta.tests.ptp: +- VerifyPtpModeStatus: null +- VerifyPtpGMStatus: + gmid: 0xec:46:70:ff:fe:00:ff:a9 +- VerifyPtpLockStatus: null +- VerifyPtpOffset: null +- VerifyPtpPortModeStatus: null anta.tests.routing.bgp: - VerifyBGPSpecificPeers: address_families: @@ -332,6 +344,100 @@ anta.tests.security: profile: eAPI_SSL_Profile result_overwrite: custom_field: 'eAPI HTTPS SSL Profile: eAPI_SSL_Profile' +- VerifySSHStatus: null +- VerifySSHIPv4Acl: + number: 3 + vrf: default +- VerifySSHIPv6Acl: + number: 3 + vrf: default +- VerifyTelnetStatus: null +- VerifyAPIHttpStatus: null +- VerifyAPIHttpsSSL: + profile: default +- VerifyAPIIPv4Acl: + number: 3 + vrf: default +- VerifyAPIIPv6Acl: + number: 3 + vrf: default +- VerifyAPISSLCertificate: + certificates: + - certificate_name: ARISTA_SIGNING_CA.crt + common_name: AristaIT-ICA ECDSA Issuing Cert Authority + encryption_algorithm: ECDSA + expiry_threshold: 30 + key_size: 256 + - certificate_name: ARISTA_ROOT_CA.crt + common_name: Arista Networks Internal IT Root Cert Authority + encryption_algorithm: RSA + expiry_threshold: 30 + key_size: 4096 +- VerifyBannerLogin: + login_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyBannerMotd: + motd_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyIPv4ACL: + ipv4_access_lists: + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit ip any any tracked + sequence: 20 + - action: permit udp any any eq bfd ttl eq 255 + sequence: 30 + name: default-control-plane-acl + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit tcp any any range 5900 5910 + sequence: 20 + name: LabTest +- VerifyIPSecConnHealth: null +- VerifySpecificIPSecConn: + ip_security_connections: + - peer: 10.255.0.1 + - connections: + - destination_address: 100.64.2.2 + source_address: 100.64.3.2 + - destination_address: 172.18.2.2 + source_address: 172.18.3.2 + peer: 10.255.0.2 + vrf: default +anta.tests.services: +- VerifyHostname: + hostname: s1-spine1 +- VerifyDNSLookup: + domain_names: + - arista.com + - www.google.com + - arista.ca +- VerifyDNSServers: + dns_servers: + - priority: 1 + server_address: 10.14.0.1 + vrf: default + - priority: 0 + server_address: 10.14.0.11 + vrf: MGMT +- VerifyErrdisableRecovery: + reasons: + - interval: 30 + reason: acl + - interval: 30 + reason: bpduguard anta.tests.snmp: - VerifySnmpStatus: vrf: default @@ -350,6 +456,17 @@ anta.tests.software: versions: - v1.13.6 - v1.8.0 +anta.tests.stun: +- VerifyStunClient: + stun_clients: + - public_address: 172.18.3.21 + public_port: 6006 + source_address: 172.18.3.2 + source_port: 4500 + - public_address: 100.64.3.21 + public_port: 6006 + source_address: 100.64.3.2 + source_port: 4500 anta.tests.system: - VerifyNTP: null - VerifyUptime: @@ -361,3 +478,8 @@ anta.tests.system: - VerifyMemoryUtilization: null - VerifyFileSystemUtilization: null - VerifyNTP: null +anta.tests.vlan: +- VerifyVlanInternalPolicy: + end_vlan_id: 4094 + policy: ascending + start_vlan_id: 1006 diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-spine2-catalog.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-spine2-catalog.yml index 6b822e7cbd2..16a02f7210c 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-spine2-catalog.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/intended/test_catalogs/dc2-spine2-catalog.yml @@ -151,6 +151,9 @@ anta.tests.connectivity: anta.tests.field_notices: - VerifyFieldNotice44Resolution: null - VerifyFieldNotice72Resolution: null +anta.tests.greent: +- VerifyGreenT: null +- VerifyGreenTCounters: null anta.tests.hardware: - VerifyEnvironmentPower: result_overwrite: @@ -231,6 +234,15 @@ anta.tests.interfaces: status: up result_overwrite: custom_field: Interface Loopback0 - EVPN_Overlay_Peering = 'up' +anta.tests.lanz: +- VerifyLANZ: null +anta.tests.ptp: +- VerifyPtpModeStatus: null +- VerifyPtpGMStatus: + gmid: 0xec:46:70:ff:fe:00:ff:a9 +- VerifyPtpLockStatus: null +- VerifyPtpOffset: null +- VerifyPtpPortModeStatus: null anta.tests.routing.bgp: - VerifyBGPSpecificPeers: address_families: @@ -332,6 +344,100 @@ anta.tests.security: profile: eAPI_SSL_Profile result_overwrite: custom_field: 'eAPI HTTPS SSL Profile: eAPI_SSL_Profile' +- VerifySSHStatus: null +- VerifySSHIPv4Acl: + number: 3 + vrf: default +- VerifySSHIPv6Acl: + number: 3 + vrf: default +- VerifyTelnetStatus: null +- VerifyAPIHttpStatus: null +- VerifyAPIHttpsSSL: + profile: default +- VerifyAPIIPv4Acl: + number: 3 + vrf: default +- VerifyAPIIPv6Acl: + number: 3 + vrf: default +- VerifyAPISSLCertificate: + certificates: + - certificate_name: ARISTA_SIGNING_CA.crt + common_name: AristaIT-ICA ECDSA Issuing Cert Authority + encryption_algorithm: ECDSA + expiry_threshold: 30 + key_size: 256 + - certificate_name: ARISTA_ROOT_CA.crt + common_name: Arista Networks Internal IT Root Cert Authority + encryption_algorithm: RSA + expiry_threshold: 30 + key_size: 4096 +- VerifyBannerLogin: + login_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyBannerMotd: + motd_banner: '# Copyright (c) 2023-2024 Arista Networks, Inc. + + # Use of this source code is governed by the Apache License 2.0 + + # that can be found in the LICENSE file. + + ' +- VerifyIPv4ACL: + ipv4_access_lists: + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit ip any any tracked + sequence: 20 + - action: permit udp any any eq bfd ttl eq 255 + sequence: 30 + name: default-control-plane-acl + - entries: + - action: permit icmp any any + sequence: 10 + - action: permit tcp any any range 5900 5910 + sequence: 20 + name: LabTest +- VerifyIPSecConnHealth: null +- VerifySpecificIPSecConn: + ip_security_connections: + - peer: 10.255.0.1 + - connections: + - destination_address: 100.64.2.2 + source_address: 100.64.3.2 + - destination_address: 172.18.2.2 + source_address: 172.18.3.2 + peer: 10.255.0.2 + vrf: default +anta.tests.services: +- VerifyHostname: + hostname: s1-spine1 +- VerifyDNSLookup: + domain_names: + - arista.com + - www.google.com + - arista.ca +- VerifyDNSServers: + dns_servers: + - priority: 1 + server_address: 10.14.0.1 + vrf: default + - priority: 0 + server_address: 10.14.0.11 + vrf: MGMT +- VerifyErrdisableRecovery: + reasons: + - interval: 30 + reason: acl + - interval: 30 + reason: bpduguard anta.tests.snmp: - VerifySnmpStatus: vrf: default @@ -350,6 +456,17 @@ anta.tests.software: versions: - v1.13.6 - v1.8.0 +anta.tests.stun: +- VerifyStunClient: + stun_clients: + - public_address: 172.18.3.21 + public_port: 6006 + source_address: 172.18.3.2 + source_port: 4500 + - public_address: 100.64.3.21 + public_port: 6006 + source_address: 100.64.3.2 + source_port: 4500 anta.tests.system: - VerifyNTP: null - VerifyUptime: @@ -361,3 +478,8 @@ anta.tests.system: - VerifyMemoryUtilization: null - VerifyFileSystemUtilization: null - VerifyNTP: null +anta.tests.vlan: +- VerifyVlanInternalPolicy: + end_vlan_id: 4094 + policy: ascending + start_vlan_id: 1006 diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/inventory/group_vars/DC1.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/inventory/group_vars/DC1.yml index 4232fc9afde..580f7835979 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/inventory/group_vars/DC1.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/inventory/group_vars/DC1.yml @@ -222,3 +222,34 @@ l2leaf: uplink_switch_interfaces: - Ethernet8 - Ethernet8 + +# Custom node type service_leaf group +service_leaf: + defaults: + platform: vEOS-lab + loopback_ipv4_pool: 10.33.0.0/27 + vtep_loopback_ipv4_pool: 10.33.1.0/27 + uplink_switches: ['dc1-spine1', 'dc1-spine2'] + uplink_ipv4_pool: 10.33.255.0/26 + mlag_peer_ipv4_pool: 10.33.1.64/27 + mlag_peer_l3_ipv4_pool: 10.33.1.96/27 + virtual_router_mac_address: 00:1c:73:00:00:99 + spanning_tree_priority: 4096 + spanning_tree_mode: mstp + + node_groups: + - group: DC1_SVC_LEAF1 + bgp_as: 65133 + nodes: + - name: dc1-svc-leaf1a + id: 5 + mgmt_ip: 172.16.1.31/24 + uplink_switch_interfaces: + - Ethernet5 + - Ethernet5 + - name: dc1-svc-leaf1b + id: 6 + mgmt_ip: 172.16.1.32/24 + uplink_switch_interfaces: + - Ethernet6 + - Ethernet6 diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/inventory/group_vars/DC1_SVC_LEAVES.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/inventory/group_vars/DC1_SVC_LEAVES.yml new file mode 100644 index 00000000000..ec9da499788 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/inventory/group_vars/DC1_SVC_LEAVES.yml @@ -0,0 +1,4 @@ +--- +### group_vars/DC1_SVC_LEAVES.yml + +type: service_leaf diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/inventory/group_vars/DC1_WAN.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/inventory/group_vars/DC1_WAN.yml index 8ac70696833..6f46761b70b 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/inventory/group_vars/DC1_WAN.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/inventory/group_vars/DC1_WAN.yml @@ -16,7 +16,7 @@ wan_router: # dynamic_key: node_type enabled: true # TODO: AVD 4.8.0 Remove this once WAN HA is out of preview node_groups: - group: DC1-WAN - bgp_as: 65000 + bgp_as: 65101 nodes: - name: dc1-wan1 id: 1 diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/inventory/group_vars/FABRIC.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/inventory/group_vars/FABRIC.yml index d4d03d19655..396b255267b 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/inventory/group_vars/FABRIC.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/inventory/group_vars/FABRIC.yml @@ -69,7 +69,7 @@ default_interfaces: platforms: [ vEOS-lab ] uplink_interfaces: [ Ethernet1-2 ] downlink_interfaces: [ Ethernet1-8 ] - - types: [ l3leaf ] + - types: [ l3leaf, service_leaf ] platforms: [ vEOS-lab ] uplink_interfaces: [ Ethernet1-8 ] mlag_interfaces: [ Ethernet3-4 ] @@ -100,3 +100,69 @@ l3_edge: nodes: [dc1-leaf2b, dc2-leaf2b] interfaces: [Ethernet6, Ethernet6] profile: DCI_profile + +# Custom node types +node_type_keys: + + - key: spine + type: spine + default_evpn_role: server + default_ptp_priority1: 20 + + - key: l3leaf + type: l3leaf + connected_endpoints: true + default_evpn_role: client + default_ptp_priority1: 30 + mlag_support: true + network_services: + l2: true + l3: true + vtep: true + + - key: l2leaf + type: l2leaf + connected_endpoints: true + mlag_support: true + network_services: + l2: true + underlay_router: false + uplink_type: port-channel + + - key: super_spine + type: super-spine + + - key: overlay_controller + type: overlay-controller + default_evpn_role: server + + - key: wan_router + type: wan_router + default_evpn_role: client + default_wan_role: client + default_underlay_routing_protocol: none + default_overlay_routing_protocol: ibgp + network_services: + l3: true + vtep: true + + - key: wan_rr + type: wan_rr + default_evpn_role: server + default_wan_role: server + default_underlay_routing_protocol: none + default_overlay_routing_protocol: ibgp + network_services: + l3: true + vtep: true + + - key: service_leaf + type: service_leaf + connected_endpoints: true + default_evpn_role: client + default_ptp_priority1: 30 + mlag_support: true + network_services: + l2: true + l3: true + vtep: true diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/inventory/group_vars/WAN.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/inventory/group_vars/WAN.yml index 17bd8562d51..a6454a9041a 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/inventory/group_vars/WAN.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/inventory/group_vars/WAN.yml @@ -28,3 +28,27 @@ wan_carriers: - name: mpls-sp-1 path_group: mpls trusted: true + +wan_route_servers: + - hostname: dc1-leaf1a + vtep_ip: 10.255.255.10 + path_groups: + - name: mpls + interfaces: + - name: Ethernet6 + public_ip: 172.18.1.2 + - name: internet + interfaces: + - name: Ethernet7 + public_ip: 100.64.1.2 + - hostname: dc1-leaf1b + vtep_ip: 10.255.255.20 + path_groups: + - name: mpls + interfaces: + - name: Ethernet6 + public_ip: 172.18.2.2 + - name: internet + interfaces: + - name: Ethernet7 + public_ip: 100.64.2.2 diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/inventory/host_vars/dc1-leaf1a.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/inventory/host_vars/dc1-leaf1a.yml new file mode 100644 index 00000000000..56e9213a5a3 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/inventory/host_vars/dc1-leaf1a.yml @@ -0,0 +1,31 @@ +# Custom router bgp structured_config to test external BGP peer +custom_structured_configuration_router_bgp: + neighbors: + - ip_address: 10.1.1.1 + description: External peer + peer_group: EVPN-OVERLAY-PEERS +# Custom router path selection structured_config to test negative case for STUN client testcase +custom_structured_configuration_router_path_selection: + path_groups: + - name: Test_local_interface + id: 110 + dynamic_peers: + enabled: true + - name: Test_stun_server_profile + id: 210 + local_interfaces: + - name: Ethernet3 + +# Custom inputs for the hardware tests +accepted_xcvr_manufacturers: + - "Arastra, Inc." + - "Arista Networks" + - "Generic" + +accepted_pwr_supply_states: + - "ok" + - "Not Present" + +accepted_fan_states: + - "ok" + - "Not Present" diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/inventory/inventory.yml b/ansible_collections/arista/avd/molecule/eos_validate_state/inventory/inventory.yml index 94718c99fd0..8f59d322196 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/inventory/inventory.yml +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/inventory/inventory.yml @@ -38,6 +38,12 @@ all: ansible_host: 172.16.1.15 dc1-wan2: ansible_host: 172.16.1.16 + DC1_SVC_LEAVES: + hosts: + dc1-svc-leaf1a: + ansible_host: 172.16.1.31 + dc1-svc-leaf1b: + ansible_host: 172.16.1.32 DC2: children: DC2_SPINES: diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/FABRIC-state.csv b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/FABRIC-state.csv index 3d3965775e8..879b3f09174 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/FABRIC-state.csv +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/FABRIC-state.csv @@ -6,1706 +6,2603 @@ id,dut,categories,test,description,inputs,result,messages 5,dc1-leaf1a,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, 6,dc1-leaf1a,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, 7,dc1-leaf1a,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, -8,dc1-leaf1a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc1-spine1 (IP: 10.255.0.1),NOT RUN, -9,dc1-leaf1a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc1-spine2 (IP: 10.255.0.2),NOT RUN, -10,dc1-leaf1a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-leaf1b (IP: 10.255.1.97),NOT RUN, -11,dc1-leaf1a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-spine1 (IP: 10.255.255.0),NOT RUN, -12,dc1-leaf1a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-spine2 (IP: 10.255.255.2),NOT RUN, -13,dc1-leaf1a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-wan1 (IP: 10.255.255.1),NOT RUN, -14,dc1-leaf1a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-wan2 (IP: 10.255.255.5),NOT RUN, -15,dc1-leaf1a,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, -16,dc1-leaf1a,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, -17,dc1-leaf1a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc1-spine1 Ethernet1,NOT RUN, -18,dc1-leaf1a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc1-spine2 Ethernet1,NOT RUN, -19,dc1-leaf1a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet3 - Remote: dc1-leaf1b Ethernet3,NOT RUN, -20,dc1-leaf1a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet4 - Remote: dc1-leaf1b Ethernet4,NOT RUN, -21,dc1-leaf1a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet6 - Remote: dc1-wan1 Ethernet1,NOT RUN, -22,dc1-leaf1a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet7 - Remote: dc1-wan2 Ethernet1,NOT RUN, -23,dc1-leaf1a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet8 - Remote: dc1-leaf1c Ethernet1,NOT RUN, -24,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3),NOT RUN, -25,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4),NOT RUN, -26,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5),NOT RUN, -27,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1),NOT RUN, -28,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2),NOT RUN, -29,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1),NOT RUN, -30,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2),NOT RUN, -31,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.3) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13),NOT RUN, -32,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.3) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14),NOT RUN, -33,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.3) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15),NOT RUN, -34,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.3) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16),NOT RUN, -35,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.3) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17),NOT RUN, -36,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.3) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18),NOT RUN, -37,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.3) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11),NOT RUN, -38,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.3) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12),NOT RUN, -39,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet1 (IP: 10.255.255.1) - Destination: dc1-spine1 Ethernet1 (IP: 10.255.255.0),NOT RUN, -40,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet2 (IP: 10.255.255.3) - Destination: dc1-spine2 Ethernet1 (IP: 10.255.255.2),NOT RUN, -41,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet6 (IP: 10.255.255.0) - Destination: dc1-wan1 Ethernet1 (IP: 10.255.255.1),NOT RUN, -42,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet7 (IP: 10.255.255.4) - Destination: dc1-wan2 Ethernet1 (IP: 10.255.255.5),NOT RUN, -43,dc1-leaf1a,Field Notices;Software,VerifyFieldNotice44Resolution,Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization),,NOT RUN, -44,dc1-leaf1a,Field Notices;Software,VerifyFieldNotice72Resolution,"Verifies if the device has exposeure to FN72, and if the issue has been mitigated",,NOT RUN, -45,dc1-leaf1a,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS7280E and DCS7500E,,NOT RUN, -46,dc1-leaf1a,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, -47,dc1-leaf1a,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, -48,dc1-leaf1a,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, -49,dc1-leaf1a,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, -50,dc1-leaf1a,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, -51,dc1-leaf1a,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -52,dc1-leaf1a,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -53,dc1-leaf1a,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, -54,dc1-leaf1a,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, -55,dc1-leaf1a,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, -56,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - P2P_LINK_TO_DC1-SPINE1_Ethernet1 = 'up',NOT RUN, -57,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - P2P_LINK_TO_DC1-SPINE2_Ethernet1 = 'up',NOT RUN, -58,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet3 - MLAG_PEER_dc1-leaf1b_Ethernet3 = 'up',NOT RUN, -59,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet4 - MLAG_PEER_dc1-leaf1b_Ethernet4 = 'up',NOT RUN, -60,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet5 - dc1-leaf1-server1_PCI1 = 'up',NOT RUN, -61,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet6 - P2P_LINK_TO_DC1-WAN1_Ethernet1 = 'up',NOT RUN, -62,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet7 - P2P_LINK_TO_DC1-WAN2_Ethernet1 = 'up',NOT RUN, -63,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet8 - DC1-LEAF1C_Ethernet1 = 'up',NOT RUN, -64,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback0 - EVPN_Overlay_Peering = 'up',NOT RUN, -65,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up',NOT RUN, -66,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback10 - VRF10_VTEP_DIAGNOSTICS = 'up',NOT RUN, -67,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback11 - VRF11_VTEP_DIAGNOSTICS = 'up',NOT RUN, -68,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel3 - MLAG_PEER_dc1-leaf1b_Po3 = 'up',NOT RUN, -69,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel5 - dc1-leaf1-server1_PortChannel dc1-leaf1-server1 = 'up',NOT RUN, -70,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel8 - DC1-LEAF1C_Po1 = 'up',NOT RUN, -71,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan11 - VRF10_VLAN11 = 'up',NOT RUN, -72,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan12 - VRF10_VLAN12 = 'up',NOT RUN, -73,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan21 - VRF11_VLAN21 = 'up',NOT RUN, -74,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan22 - VRF11_VLAN22 = 'up',NOT RUN, -75,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan3009 - MLAG_PEER_L3_iBGP: vrf VRF10 = 'up',NOT RUN, -76,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan3010 - MLAG_PEER_L3_iBGP: vrf VRF11 = 'up',NOT RUN, -77,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4085 - Inband Management = 'up',NOT RUN, -78,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up',NOT RUN, -79,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4094 - MLAG_PEER = 'up',NOT RUN, -80,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vxlan1 = 'up',NOT RUN, -81,dc1-leaf1a,MLAG,VerifyMlagStatus,Verifies the health status of the MLAG configuration.,,NOT RUN, -82,dc1-leaf1a,Profiles,VerifyTcamProfile,Verify that the assigned TCAM profile is actually running on the device,,NOT RUN, -83,dc1-leaf1a,Profiles,VerifyUnifiedForwardingTableMode,,,NOT RUN, -84,dc1-leaf1a,Routing,VerifyRoutingProtocolModel,Verifies the configured routing protocol model.,Routing protocol model: multi-agent,NOT RUN, -85,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.1 - Peer: dc1-spine1,NOT RUN, -86,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.2 - Peer: dc1-spine2,NOT RUN, -87,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.3 - Peer: dc1-leaf1a,NOT RUN, -88,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.4 - Peer: dc1-leaf1b,NOT RUN, -89,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.5 - Peer: dc1-leaf2a,NOT RUN, -90,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.3 - Peer: dc1-leaf1a,NOT RUN, -91,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.5 - Peer: dc1-leaf2a,NOT RUN, -92,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.11 - Peer: dc2-spine1,NOT RUN, -93,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.12 - Peer: dc2-spine2,NOT RUN, -94,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.13 - Peer: dc2-leaf1a,NOT RUN, -95,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.14 - Peer: dc2-leaf1b,NOT RUN, -96,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.15 - Peer: dc2-leaf2a,NOT RUN, -97,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.16 - Peer: dc2-leaf2b,NOT RUN, -98,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, -99,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com,NOT RUN, -100,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.13 - Peer: dc2-leaf1a,NOT RUN, -101,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.15 - Peer: dc2-leaf2a,NOT RUN, -102,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, -103,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.1 - Peer: dc1-wan1,NOT RUN, -104,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.2 - Peer: dc1-wan2,NOT RUN, -105,dc1-leaf1a,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, -106,dc1-leaf1a,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, -107,dc1-leaf1a,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, -108,dc1-leaf1a,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, -109,dc1-leaf1a,Software,VerifyEOSExtensions,Verifies all EOS extensions installed on the device are enabled for boot persistence.,,NOT RUN, -110,dc1-leaf1a,Software,VerifyEOSVersion,Verifies the device is running one of the allowed EOS version.,,NOT RUN, -111,dc1-leaf1a,Software,VerifyTerminAttrVersion,Verifies the device is running one of the allowed TerminAttr version.,,NOT RUN, -112,dc1-leaf1a,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, -113,dc1-leaf1a,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, -114,dc1-leaf1a,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, -115,dc1-leaf1a,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, -116,dc1-leaf1a,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, -117,dc1-leaf1a,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -118,dc1-leaf1a,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -119,dc1-leaf1a,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, -120,dc1-leaf1a,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, -121,dc1-leaf1a,VXLAN,VerifyVxlan1Interface,Verifies the Vxlan1 interface status.,,NOT RUN, -122,dc1-leaf1a,VXLAN,VerifyVxlanConfigSanity,Verifies there are no VXLAN config-sanity inconsistencies.,,NOT RUN, -123,dc1-leaf1a,VXLAN,VerifyVxlanVniBinding,Verifies the VNI-VLAN bindings of the Vxlan1 interface.,,NOT RUN, -124,dc1-leaf1a,VXLAN,VerifyVxlanVtep,Verifies the VTEP peers of the Vxlan1 interface,,NOT RUN, -125,dc1-leaf1b,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, -126,dc1-leaf1b,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, -127,dc1-leaf1b,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, -128,dc1-leaf1b,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, -129,dc1-leaf1b,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, -130,dc1-leaf1b,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, -131,dc1-leaf1b,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, -132,dc1-leaf1b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc1-spine1 (IP: 10.255.0.1),NOT RUN, -133,dc1-leaf1b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc1-spine2 (IP: 10.255.0.2),NOT RUN, -134,dc1-leaf1b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-leaf1a (IP: 10.255.1.96),NOT RUN, -135,dc1-leaf1b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-spine1 (IP: 10.255.255.4),NOT RUN, -136,dc1-leaf1b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-spine2 (IP: 10.255.255.6),NOT RUN, -137,dc1-leaf1b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-wan1 (IP: 10.255.255.3),NOT RUN, -138,dc1-leaf1b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-wan2 (IP: 10.255.255.7),NOT RUN, -139,dc1-leaf1b,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, -140,dc1-leaf1b,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, -141,dc1-leaf1b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc1-spine1 Ethernet2,NOT RUN, -142,dc1-leaf1b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc1-spine2 Ethernet2,NOT RUN, -143,dc1-leaf1b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet3 - Remote: dc1-leaf1a Ethernet3,NOT RUN, -144,dc1-leaf1b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet4 - Remote: dc1-leaf1a Ethernet4,NOT RUN, -145,dc1-leaf1b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet6 - Remote: dc1-wan1 Ethernet2,NOT RUN, -146,dc1-leaf1b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet7 - Remote: dc1-wan2 Ethernet2,NOT RUN, -147,dc1-leaf1b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet8 - Remote: dc1-leaf1c Ethernet2,NOT RUN, -148,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3),NOT RUN, -149,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4),NOT RUN, -150,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5),NOT RUN, -151,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1),NOT RUN, -152,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2),NOT RUN, -153,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1),NOT RUN, -154,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2),NOT RUN, -155,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.4) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13),NOT RUN, -156,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.4) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14),NOT RUN, -157,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.4) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15),NOT RUN, -158,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.4) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16),NOT RUN, -159,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.4) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17),NOT RUN, -160,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.4) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18),NOT RUN, -161,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.4) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11),NOT RUN, -162,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.4) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12),NOT RUN, -163,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet1 (IP: 10.255.255.5) - Destination: dc1-spine1 Ethernet2 (IP: 10.255.255.4),NOT RUN, -164,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet2 (IP: 10.255.255.7) - Destination: dc1-spine2 Ethernet2 (IP: 10.255.255.6),NOT RUN, -165,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet6 (IP: 10.255.255.2) - Destination: dc1-wan1 Ethernet2 (IP: 10.255.255.3),NOT RUN, -166,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet7 (IP: 10.255.255.6) - Destination: dc1-wan2 Ethernet2 (IP: 10.255.255.7),NOT RUN, -167,dc1-leaf1b,Field Notices;Software,VerifyFieldNotice44Resolution,Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization),,NOT RUN, -168,dc1-leaf1b,Field Notices;Software,VerifyFieldNotice72Resolution,"Verifies if the device has exposeure to FN72, and if the issue has been mitigated",,NOT RUN, -169,dc1-leaf1b,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS7280E and DCS7500E,,NOT RUN, -170,dc1-leaf1b,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, -171,dc1-leaf1b,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, -172,dc1-leaf1b,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, -173,dc1-leaf1b,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, -174,dc1-leaf1b,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, -175,dc1-leaf1b,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -176,dc1-leaf1b,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -177,dc1-leaf1b,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, -178,dc1-leaf1b,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, -179,dc1-leaf1b,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, -180,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - P2P_LINK_TO_DC1-SPINE1_Ethernet2 = 'up',NOT RUN, -181,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - P2P_LINK_TO_DC1-SPINE2_Ethernet2 = 'up',NOT RUN, -182,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet3 - MLAG_PEER_dc1-leaf1a_Ethernet3 = 'up',NOT RUN, -183,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet4 - MLAG_PEER_dc1-leaf1a_Ethernet4 = 'up',NOT RUN, -184,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet5 - dc1-leaf1-server1_PCI2 = 'up',NOT RUN, -185,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet6 - P2P_LINK_TO_DC1-WAN1_Ethernet2 = 'up',NOT RUN, -186,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet7 - P2P_LINK_TO_DC1-WAN2_Ethernet2 = 'up',NOT RUN, -187,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet8 - DC1-LEAF1C_Ethernet2 = 'up',NOT RUN, -188,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback0 - EVPN_Overlay_Peering = 'up',NOT RUN, -189,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up',NOT RUN, -190,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback10 - VRF10_VTEP_DIAGNOSTICS = 'up',NOT RUN, -191,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback11 - VRF11_VTEP_DIAGNOSTICS = 'up',NOT RUN, -192,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel3 - MLAG_PEER_dc1-leaf1a_Po3 = 'up',NOT RUN, -193,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel5 - dc1-leaf1-server1_PortChannel dc1-leaf1-server1 = 'up',NOT RUN, -194,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel8 - DC1-LEAF1C_Po1 = 'up',NOT RUN, -195,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan11 - VRF10_VLAN11 = 'up',NOT RUN, -196,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan12 - VRF10_VLAN12 = 'up',NOT RUN, -197,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan21 - VRF11_VLAN21 = 'up',NOT RUN, -198,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan22 - VRF11_VLAN22 = 'up',NOT RUN, -199,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan3009 - MLAG_PEER_L3_iBGP: vrf VRF10 = 'up',NOT RUN, -200,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan3010 - MLAG_PEER_L3_iBGP: vrf VRF11 = 'up',NOT RUN, -201,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4085 - Inband Management = 'up',NOT RUN, -202,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up',NOT RUN, -203,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4094 - MLAG_PEER = 'up',NOT RUN, -204,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vxlan1 = 'up',NOT RUN, -205,dc1-leaf1b,MLAG,VerifyMlagStatus,Verifies the health status of the MLAG configuration.,,NOT RUN, -206,dc1-leaf1b,Routing,VerifyRoutingProtocolModel,Verifies the configured routing protocol model.,Routing protocol model: multi-agent,NOT RUN, -207,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.1 - Peer: dc1-spine1,NOT RUN, -208,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.2 - Peer: dc1-spine2,NOT RUN, -209,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.3 - Peer: dc1-leaf1a,NOT RUN, -210,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.4 - Peer: dc1-leaf1b,NOT RUN, -211,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.5 - Peer: dc1-leaf2a,NOT RUN, -212,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.3 - Peer: dc1-leaf1a,NOT RUN, -213,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.5 - Peer: dc1-leaf2a,NOT RUN, -214,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.11 - Peer: dc2-spine1,NOT RUN, -215,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.12 - Peer: dc2-spine2,NOT RUN, -216,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.13 - Peer: dc2-leaf1a,NOT RUN, -217,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.14 - Peer: dc2-leaf1b,NOT RUN, -218,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.15 - Peer: dc2-leaf2a,NOT RUN, -219,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.16 - Peer: dc2-leaf2b,NOT RUN, -220,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, -221,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com,NOT RUN, -222,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.13 - Peer: dc2-leaf1a,NOT RUN, -223,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.15 - Peer: dc2-leaf2a,NOT RUN, -224,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, -225,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.1 - Peer: dc1-wan1,NOT RUN, -226,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.2 - Peer: dc1-wan2,NOT RUN, -227,dc1-leaf1b,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, -228,dc1-leaf1b,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, -229,dc1-leaf1b,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, -230,dc1-leaf1b,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, -231,dc1-leaf1b,Software,VerifyEOSVersion,Verifies the device is running one of the allowed EOS version.,,NOT RUN, -232,dc1-leaf1b,Software,VerifyTerminAttrVersion,Verifies the device is running one of the allowed TerminAttr version.,,NOT RUN, -233,dc1-leaf1b,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, -234,dc1-leaf1b,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, -235,dc1-leaf1b,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, -236,dc1-leaf1b,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, -237,dc1-leaf1b,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, -238,dc1-leaf1b,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -239,dc1-leaf1b,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -240,dc1-leaf1b,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, -241,dc1-leaf1b,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, -242,dc1-leaf1c,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, -243,dc1-leaf1c,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, -244,dc1-leaf1c,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, -245,dc1-leaf1c,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, -246,dc1-leaf1c,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, -247,dc1-leaf1c,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, -248,dc1-leaf1c,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, -249,dc1-leaf1c,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, -250,dc1-leaf1c,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, -251,dc1-leaf1c,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc1-leaf1a Ethernet8,NOT RUN, -252,dc1-leaf1c,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc1-leaf1b Ethernet8,NOT RUN, -253,dc1-leaf1c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3),NOT RUN, -254,dc1-leaf1c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4),NOT RUN, -255,dc1-leaf1c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5),NOT RUN, -256,dc1-leaf1c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1),NOT RUN, -257,dc1-leaf1c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2),NOT RUN, -258,dc1-leaf1c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1),NOT RUN, -259,dc1-leaf1c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2),NOT RUN, -260,dc1-leaf1c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13),NOT RUN, -261,dc1-leaf1c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14),NOT RUN, -262,dc1-leaf1c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15),NOT RUN, -263,dc1-leaf1c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16),NOT RUN, -264,dc1-leaf1c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17),NOT RUN, -265,dc1-leaf1c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18),NOT RUN, -266,dc1-leaf1c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11),NOT RUN, -267,dc1-leaf1c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12),NOT RUN, -268,dc1-leaf1c,Field Notices;Software,VerifyFieldNotice44Resolution,Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization),,NOT RUN, -269,dc1-leaf1c,Field Notices;Software,VerifyFieldNotice72Resolution,"Verifies if the device has exposeure to FN72, and if the issue has been mitigated",,NOT RUN, -270,dc1-leaf1c,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS7280E and DCS7500E,,NOT RUN, -271,dc1-leaf1c,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, -272,dc1-leaf1c,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, -273,dc1-leaf1c,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, -274,dc1-leaf1c,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, -275,dc1-leaf1c,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, -276,dc1-leaf1c,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -277,dc1-leaf1c,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -278,dc1-leaf1c,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, -279,dc1-leaf1c,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, -280,dc1-leaf1c,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, -281,dc1-leaf1c,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - DC1-LEAF1A_Ethernet8 = 'up',NOT RUN, -282,dc1-leaf1c,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - DC1-LEAF1B_Ethernet8 = 'up',NOT RUN, -283,dc1-leaf1c,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet5 - dc1-leaf1-server1_iLO = 'up',NOT RUN, -284,dc1-leaf1c,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel1 - DC1_L3_LEAF1_Po8 = 'up',NOT RUN, -285,dc1-leaf1c,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4085 - L2LEAF_INBAND_MGMT = 'up',NOT RUN, -286,dc1-leaf1c,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, -287,dc1-leaf1c,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, -288,dc1-leaf1c,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, -289,dc1-leaf1c,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, -290,dc1-leaf1c,Software,VerifyEOSVersion,Verifies the device is running one of the allowed EOS version.,,NOT RUN, -291,dc1-leaf1c,Software,VerifyTerminAttrVersion,Verifies the device is running one of the allowed TerminAttr version.,,NOT RUN, -292,dc1-leaf1c,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, -293,dc1-leaf1c,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, -294,dc1-leaf1c,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, -295,dc1-leaf1c,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, -296,dc1-leaf1c,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, -297,dc1-leaf1c,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -298,dc1-leaf1c,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -299,dc1-leaf1c,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, -300,dc1-leaf1c,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, -301,dc1-leaf2a,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, -302,dc1-leaf2a,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, -303,dc1-leaf2a,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, -304,dc1-leaf2a,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, -305,dc1-leaf2a,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, -306,dc1-leaf2a,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, -307,dc1-leaf2a,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, -308,dc1-leaf2a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc1-spine1 (IP: 10.255.0.1),NOT RUN, -309,dc1-leaf2a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc1-spine2 (IP: 10.255.0.2),NOT RUN, -310,dc1-leaf2a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-leaf2a (IP: 10.255.128.15),NOT RUN, -311,dc1-leaf2a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-spine1 (IP: 10.255.255.8),NOT RUN, -312,dc1-leaf2a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-spine2 (IP: 10.255.255.10),NOT RUN, -313,dc1-leaf2a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf2a (IP: 192.168.100.1),NOT RUN, -314,dc1-leaf2a,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, -315,dc1-leaf2a,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, -316,dc1-leaf2a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc1-spine1 Ethernet3,NOT RUN, -317,dc1-leaf2a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc1-spine2 Ethernet3,NOT RUN, -318,dc1-leaf2a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet6 - Remote: dc2-leaf2a Ethernet6,NOT RUN, -319,dc1-leaf2a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet8 - Remote: dc1-leaf2c Ethernet1,NOT RUN, -320,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3),NOT RUN, -321,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4),NOT RUN, -322,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5),NOT RUN, -323,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1),NOT RUN, -324,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2),NOT RUN, -325,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1),NOT RUN, -326,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2),NOT RUN, -327,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.5) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13),NOT RUN, -328,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.5) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14),NOT RUN, -329,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.5) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15),NOT RUN, -330,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.5) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16),NOT RUN, -331,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.5) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17),NOT RUN, -332,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.5) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18),NOT RUN, -333,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.5) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11),NOT RUN, -334,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.5) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12),NOT RUN, -335,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet1 (IP: 10.255.255.9) - Destination: dc1-spine1 Ethernet3 (IP: 10.255.255.8),NOT RUN, -336,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet2 (IP: 10.255.255.11) - Destination: dc1-spine2 Ethernet3 (IP: 10.255.255.10),NOT RUN, -337,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet6 (IP: 192.168.100.0) - Destination: dc2-leaf2a Ethernet6 (IP: 192.168.100.1),NOT RUN, -338,dc1-leaf2a,Field Notices;Software,VerifyFieldNotice44Resolution,Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization),,NOT RUN, -339,dc1-leaf2a,Field Notices;Software,VerifyFieldNotice72Resolution,"Verifies if the device has exposeure to FN72, and if the issue has been mitigated",,NOT RUN, -340,dc1-leaf2a,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS7280E and DCS7500E,,NOT RUN, -341,dc1-leaf2a,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, -342,dc1-leaf2a,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, -343,dc1-leaf2a,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, -344,dc1-leaf2a,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, -345,dc1-leaf2a,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, -346,dc1-leaf2a,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -347,dc1-leaf2a,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -348,dc1-leaf2a,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, -349,dc1-leaf2a,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, -350,dc1-leaf2a,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, -351,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - P2P_LINK_TO_DC1-SPINE1_Ethernet3 = 'up',NOT RUN, -352,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - P2P_LINK_TO_DC1-SPINE2_Ethernet3 = 'up',NOT RUN, -353,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet3 - MLAG_PEER_dc1-leaf2b_Ethernet3 = 'up',NOT RUN, -354,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet4 - MLAG_PEER_dc1-leaf2b_Ethernet4 = 'up',NOT RUN, -355,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet5 - dc1-leaf2-server1_PCI1 = 'up',NOT RUN, -356,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet6 - P2P_LINK_TO_dc2-leaf2a_Ethernet6 = 'up',NOT RUN, -357,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet8 - DC1-LEAF2C_Ethernet1 = 'up',NOT RUN, -358,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback0 - EVPN_Overlay_Peering = 'up',NOT RUN, -359,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up',NOT RUN, -360,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback10 - VRF10_VTEP_DIAGNOSTICS = 'up',NOT RUN, -361,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback11 - VRF11_VTEP_DIAGNOSTICS = 'up',NOT RUN, -362,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel3 - MLAG_PEER_dc1-leaf2b_Po3 = 'up',NOT RUN, -363,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel5 - dc1-leaf2-server1_PortChannel dc1-leaf2-server1 = 'up',NOT RUN, -364,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel8 - DC1-LEAF2C_Po1 = 'up',NOT RUN, -365,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan11 - VRF10_VLAN11 = 'up',NOT RUN, -366,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan12 - VRF10_VLAN12 = 'up',NOT RUN, -367,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan21 - VRF11_VLAN21 = 'up',NOT RUN, -368,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan22 - VRF11_VLAN22 = 'up',NOT RUN, -369,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan3009 - MLAG_PEER_L3_iBGP: vrf VRF10 = 'up',NOT RUN, -370,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan3010 - MLAG_PEER_L3_iBGP: vrf VRF11 = 'up',NOT RUN, -371,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4085 - Inband Management = 'up',NOT RUN, -372,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up',NOT RUN, -373,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4094 - MLAG_PEER = 'up',NOT RUN, -374,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vxlan1 = 'up',NOT RUN, -375,dc1-leaf2a,MLAG,VerifyMlagStatus,Verifies the health status of the MLAG configuration.,,NOT RUN, -376,dc1-leaf2a,Profiles,VerifyTcamProfile,Verify that the assigned TCAM profile is actually running on the device,,NOT RUN, -377,dc1-leaf2a,Profiles,VerifyUnifiedForwardingTableMode,,,NOT RUN, -378,dc1-leaf2a,Routing,VerifyRoutingProtocolModel,Verifies the configured routing protocol model.,Routing protocol model: multi-agent,NOT RUN, -379,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.1 - Peer: dc1-spine1,NOT RUN, -380,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.2 - Peer: dc1-spine2,NOT RUN, -381,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.3 - Peer: dc1-leaf1a,NOT RUN, -382,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.4 - Peer: dc1-leaf1b,NOT RUN, -383,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.5 - Peer: dc1-leaf2a,NOT RUN, -384,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.3 - Peer: dc1-leaf1a,NOT RUN, -385,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.5 - Peer: dc1-leaf2a,NOT RUN, -386,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.11 - Peer: dc2-spine1,NOT RUN, -387,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.12 - Peer: dc2-spine2,NOT RUN, -388,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.13 - Peer: dc2-leaf1a,NOT RUN, -389,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.14 - Peer: dc2-leaf1b,NOT RUN, -390,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.15 - Peer: dc2-leaf2a,NOT RUN, -391,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.16 - Peer: dc2-leaf2b,NOT RUN, -392,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, -393,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com,NOT RUN, -394,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.13 - Peer: dc2-leaf1a,NOT RUN, -395,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.15 - Peer: dc2-leaf2a,NOT RUN, -396,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, -397,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.1 - Peer: dc1-wan1,NOT RUN, -398,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.2 - Peer: dc1-wan2,NOT RUN, -399,dc1-leaf2a,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, -400,dc1-leaf2a,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, -401,dc1-leaf2a,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, -402,dc1-leaf2a,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, -403,dc1-leaf2a,Software,VerifyEOSExtensions,Verifies all EOS extensions installed on the device are enabled for boot persistence.,,NOT RUN, -404,dc1-leaf2a,Software,VerifyEOSVersion,Verifies the device is running one of the allowed EOS version.,,NOT RUN, -405,dc1-leaf2a,Software,VerifyTerminAttrVersion,Verifies the device is running one of the allowed TerminAttr version.,,NOT RUN, -406,dc1-leaf2a,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, -407,dc1-leaf2a,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, -408,dc1-leaf2a,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, -409,dc1-leaf2a,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, -410,dc1-leaf2a,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, -411,dc1-leaf2a,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -412,dc1-leaf2a,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -413,dc1-leaf2a,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, -414,dc1-leaf2a,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, -415,dc1-leaf2c,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, -416,dc1-leaf2c,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, -417,dc1-leaf2c,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, -418,dc1-leaf2c,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, -419,dc1-leaf2c,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, -420,dc1-leaf2c,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, -421,dc1-leaf2c,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, -422,dc1-leaf2c,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, -423,dc1-leaf2c,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, -424,dc1-leaf2c,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc1-leaf2a Ethernet8,NOT RUN, -425,dc1-leaf2c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3),NOT RUN, -426,dc1-leaf2c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4),NOT RUN, -427,dc1-leaf2c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5),NOT RUN, -428,dc1-leaf2c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1),NOT RUN, -429,dc1-leaf2c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2),NOT RUN, -430,dc1-leaf2c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1),NOT RUN, -431,dc1-leaf2c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2),NOT RUN, -432,dc1-leaf2c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13),NOT RUN, -433,dc1-leaf2c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14),NOT RUN, -434,dc1-leaf2c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15),NOT RUN, -435,dc1-leaf2c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16),NOT RUN, -436,dc1-leaf2c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17),NOT RUN, -437,dc1-leaf2c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18),NOT RUN, -438,dc1-leaf2c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11),NOT RUN, -439,dc1-leaf2c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12),NOT RUN, -440,dc1-leaf2c,Field Notices;Software,VerifyFieldNotice44Resolution,Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization),,NOT RUN, -441,dc1-leaf2c,Field Notices;Software,VerifyFieldNotice72Resolution,"Verifies if the device has exposeure to FN72, and if the issue has been mitigated",,NOT RUN, -442,dc1-leaf2c,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS7280E and DCS7500E,,NOT RUN, -443,dc1-leaf2c,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, -444,dc1-leaf2c,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, -445,dc1-leaf2c,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, -446,dc1-leaf2c,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, -447,dc1-leaf2c,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, -448,dc1-leaf2c,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -449,dc1-leaf2c,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -450,dc1-leaf2c,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, -451,dc1-leaf2c,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, -452,dc1-leaf2c,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, -453,dc1-leaf2c,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - DC1-LEAF2A_Ethernet8 = 'up',NOT RUN, -454,dc1-leaf2c,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - DC1-LEAF2B_Ethernet8 = 'adminDown',NOT RUN, -455,dc1-leaf2c,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet5 - dc1-leaf2-server1_iLO = 'up',NOT RUN, -456,dc1-leaf2c,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel1 - DC1_L3_LEAF2_Po8 = 'up',NOT RUN, -457,dc1-leaf2c,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4085 - L2LEAF_INBAND_MGMT = 'up',NOT RUN, -458,dc1-leaf2c,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, -459,dc1-leaf2c,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, -460,dc1-leaf2c,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, -461,dc1-leaf2c,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, -462,dc1-leaf2c,Software,VerifyEOSVersion,Verifies the device is running one of the allowed EOS version.,,NOT RUN, -463,dc1-leaf2c,Software,VerifyTerminAttrVersion,Verifies the device is running one of the allowed TerminAttr version.,,NOT RUN, -464,dc1-leaf2c,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, -465,dc1-leaf2c,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, -466,dc1-leaf2c,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, -467,dc1-leaf2c,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, -468,dc1-leaf2c,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, -469,dc1-leaf2c,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -470,dc1-leaf2c,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -471,dc1-leaf2c,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, -472,dc1-leaf2c,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, -473,dc1-spine1,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, -474,dc1-spine1,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, -475,dc1-spine1,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, -476,dc1-spine1,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, -477,dc1-spine1,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, -478,dc1-spine1,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, -479,dc1-spine1,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, -480,dc1-spine1,BFD,VerifyBFDPeersHealth,Verifies the health of all IPv4 BFD peers.,,NOT RUN, -481,dc1-spine1,BFD,VerifyBFDPeersIntervals,Verifies the timers of the IPv4 BFD peers in the specified VRF.,,NOT RUN, -482,dc1-spine1,BFD,VerifyBFDSpecificPeers,Verifies the IPv4 BFD peer's sessions and remote disc in the specified VRF.,,NOT RUN, -483,dc1-spine1,BGP,VerifyBGPPeerCount,Verifies the count of BGP peers.,,NOT RUN, -484,dc1-spine1,BGP,VerifyBGPPeersHealth,Verifies the health of BGP peers,,NOT RUN, -485,dc1-spine1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,,NOT RUN, -486,dc1-spine1,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, -487,dc1-spine1,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, -488,dc1-spine1,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc1-leaf1a Ethernet1,NOT RUN, -489,dc1-spine1,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc1-leaf1b Ethernet1,NOT RUN, -490,dc1-spine1,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet3 - Remote: dc1-leaf2a Ethernet1,NOT RUN, -491,dc1-spine1,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet1 (IP: 10.255.255.0) - Destination: dc1-leaf1a Ethernet1 (IP: 10.255.255.1),NOT RUN, -492,dc1-spine1,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet2 (IP: 10.255.255.4) - Destination: dc1-leaf1b Ethernet1 (IP: 10.255.255.5),NOT RUN, -493,dc1-spine1,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet3 (IP: 10.255.255.8) - Destination: dc1-leaf2a Ethernet1 (IP: 10.255.255.9),NOT RUN, -494,dc1-spine1,Field Notices;Software,VerifyFieldNotice44Resolution,Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization),,NOT RUN, -495,dc1-spine1,Field Notices;Software,VerifyFieldNotice72Resolution,"Verifies if the device has exposeure to FN72, and if the issue has been mitigated",,NOT RUN, -496,dc1-spine1,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS7280E and DCS7500E,,NOT RUN, -497,dc1-spine1,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, -498,dc1-spine1,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, -499,dc1-spine1,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, -500,dc1-spine1,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, -501,dc1-spine1,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, -502,dc1-spine1,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -503,dc1-spine1,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -504,dc1-spine1,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, -505,dc1-spine1,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, -506,dc1-spine1,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, -507,dc1-spine1,Interfaces,VerifyIllegalLACP,Verifies there are no illegal LACP packets in all port channels.,,NOT RUN, -508,dc1-spine1,Interfaces,VerifyInterfaceDiscards,Verifies there are no interface discard counters.,,NOT RUN, -509,dc1-spine1,Interfaces,VerifyInterfaceErrDisabled,Verifies there are no interfaces in the errdisabled state.,,NOT RUN, -510,dc1-spine1,Interfaces,VerifyInterfaceErrors,Verifies there are no interface error counters.,,NOT RUN, -511,dc1-spine1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,,NOT RUN, -512,dc1-spine1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - P2P_LINK_TO_DC1-LEAF1A_Ethernet1 = 'up',NOT RUN, -513,dc1-spine1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - P2P_LINK_TO_DC1-LEAF1B_Ethernet1 = 'up',NOT RUN, -514,dc1-spine1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet3 - P2P_LINK_TO_DC1-LEAF2A_Ethernet1 = 'up',NOT RUN, -515,dc1-spine1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet4 - P2P_LINK_TO_DC1-LEAF2B_Ethernet1 = 'adminDown',NOT RUN, -516,dc1-spine1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback0 - EVPN_Overlay_Peering = 'up',NOT RUN, -517,dc1-spine1,Interfaces,VerifyInterfaceUtilization,Verifies that all interfaces have a usage below 75%.,,NOT RUN, -518,dc1-spine1,Interfaces,VerifyIPProxyARP,Verifies if Proxy ARP is enabled.,,NOT RUN, -519,dc1-spine1,Interfaces,VerifyL2MTU,Verifies the global L2 MTU of all L2 interfaces.,,NOT RUN, -520,dc1-spine1,Interfaces,VerifyL3MTU,Verifies the global L3 MTU of all L3 interfaces.,,NOT RUN, -521,dc1-spine1,Interfaces,VerifyLoopbackCount,Verifies the number of loopback interfaces and their status.,,NOT RUN, -522,dc1-spine1,Interfaces,VerifyPortChannels,Verifies there are no inactive ports in all port channels.,,NOT RUN, -523,dc1-spine1,Interfaces,VerifyStormControlDrops,Verifies there are no interface storm-control drop counters.,,NOT RUN, -524,dc1-spine1,Interfaces,VerifySVI,Verifies the status of all SVIs.,,NOT RUN, -525,dc1-spine1,OSPF,VerifyOSPFNeighborCount,Verifies the number of OSPF neighbors in FULL state is the one we expect.,,NOT RUN, -526,dc1-spine1,OSPF,VerifyOSPFNeighborState,Verifies all OSPF neighbors are in FULL state.,,NOT RUN, -527,dc1-spine1,Routing,VerifyRoutingProtocolModel,Verifies the configured routing protocol model.,,NOT RUN, -528,dc1-spine1,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,,NOT RUN, -529,dc1-spine1,Routing,VerifyRoutingTableSize,Verifies the size of the IP routing table (default VRF). Should be between the two provided thresholds.,,NOT RUN, -530,dc1-spine1,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, -531,dc1-spine1,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, -532,dc1-spine1,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, -533,dc1-spine1,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, -534,dc1-spine1,Software,VerifyEOSVersion,Verifies the device is running one of the allowed EOS version.,,NOT RUN, -535,dc1-spine1,Software,VerifyTerminAttrVersion,Verifies the device is running one of the allowed TerminAttr version.,,NOT RUN, -536,dc1-spine1,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, -537,dc1-spine1,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, -538,dc1-spine1,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, -539,dc1-spine1,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, -540,dc1-spine1,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, -541,dc1-spine1,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -542,dc1-spine1,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -543,dc1-spine1,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, -544,dc1-spine1,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, -545,dc1-spine2,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, -546,dc1-spine2,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, -547,dc1-spine2,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, -548,dc1-spine2,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, -549,dc1-spine2,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, -550,dc1-spine2,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, -551,dc1-spine2,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, -552,dc1-spine2,BFD,VerifyBFDPeersHealth,Verifies the health of all IPv4 BFD peers.,,NOT RUN, -553,dc1-spine2,BFD,VerifyBFDPeersIntervals,Verifies the timers of the IPv4 BFD peers in the specified VRF.,,NOT RUN, -554,dc1-spine2,BFD,VerifyBFDSpecificPeers,Verifies the IPv4 BFD peer's sessions and remote disc in the specified VRF.,,NOT RUN, -555,dc1-spine2,BGP,VerifyBGPPeerCount,Verifies the count of BGP peers.,,NOT RUN, -556,dc1-spine2,BGP,VerifyBGPPeersHealth,Verifies the health of BGP peers,,NOT RUN, -557,dc1-spine2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,,NOT RUN, -558,dc1-spine2,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, -559,dc1-spine2,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, -560,dc1-spine2,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc1-leaf1a Ethernet2,NOT RUN, -561,dc1-spine2,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc1-leaf1b Ethernet2,NOT RUN, -562,dc1-spine2,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet3 - Remote: dc1-leaf2a Ethernet2,NOT RUN, -563,dc1-spine2,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet1 (IP: 10.255.255.2) - Destination: dc1-leaf1a Ethernet2 (IP: 10.255.255.3),NOT RUN, -564,dc1-spine2,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet2 (IP: 10.255.255.6) - Destination: dc1-leaf1b Ethernet2 (IP: 10.255.255.7),NOT RUN, -565,dc1-spine2,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet3 (IP: 10.255.255.10) - Destination: dc1-leaf2a Ethernet2 (IP: 10.255.255.11),NOT RUN, -566,dc1-spine2,Field Notices;Software,VerifyFieldNotice44Resolution,Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization),,NOT RUN, -567,dc1-spine2,Field Notices;Software,VerifyFieldNotice72Resolution,"Verifies if the device has exposeure to FN72, and if the issue has been mitigated",,NOT RUN, -568,dc1-spine2,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS7280E and DCS7500E,,NOT RUN, -569,dc1-spine2,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, -570,dc1-spine2,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, -571,dc1-spine2,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, -572,dc1-spine2,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, -573,dc1-spine2,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, -574,dc1-spine2,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -575,dc1-spine2,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -576,dc1-spine2,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, -577,dc1-spine2,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, -578,dc1-spine2,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, -579,dc1-spine2,Interfaces,VerifyIllegalLACP,Verifies there are no illegal LACP packets in all port channels.,,NOT RUN, -580,dc1-spine2,Interfaces,VerifyInterfaceDiscards,Verifies there are no interface discard counters.,,NOT RUN, -581,dc1-spine2,Interfaces,VerifyInterfaceErrDisabled,Verifies there are no interfaces in the errdisabled state.,,NOT RUN, -582,dc1-spine2,Interfaces,VerifyInterfaceErrors,Verifies there are no interface error counters.,,NOT RUN, -583,dc1-spine2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,,NOT RUN, -584,dc1-spine2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - P2P_LINK_TO_DC1-LEAF1A_Ethernet2 = 'up',NOT RUN, -585,dc1-spine2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - P2P_LINK_TO_DC1-LEAF1B_Ethernet2 = 'up',NOT RUN, -586,dc1-spine2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet3 - P2P_LINK_TO_DC1-LEAF2A_Ethernet2 = 'up',NOT RUN, -587,dc1-spine2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet4 - P2P_LINK_TO_DC1-LEAF2B_Ethernet2 = 'adminDown',NOT RUN, -588,dc1-spine2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback0 - EVPN_Overlay_Peering = 'up',NOT RUN, -589,dc1-spine2,Interfaces,VerifyInterfaceUtilization,Verifies that all interfaces have a usage below 75%.,,NOT RUN, -590,dc1-spine2,Interfaces,VerifyIPProxyARP,Verifies if Proxy ARP is enabled.,,NOT RUN, -591,dc1-spine2,Interfaces,VerifyL2MTU,Verifies the global L2 MTU of all L2 interfaces.,,NOT RUN, -592,dc1-spine2,Interfaces,VerifyL3MTU,Verifies the global L3 MTU of all L3 interfaces.,,NOT RUN, -593,dc1-spine2,Interfaces,VerifyLoopbackCount,Verifies the number of loopback interfaces and their status.,,NOT RUN, -594,dc1-spine2,Interfaces,VerifyPortChannels,Verifies there are no inactive ports in all port channels.,,NOT RUN, -595,dc1-spine2,Interfaces,VerifyStormControlDrops,Verifies there are no interface storm-control drop counters.,,NOT RUN, -596,dc1-spine2,Interfaces,VerifySVI,Verifies the status of all SVIs.,,NOT RUN, -597,dc1-spine2,OSPF,VerifyOSPFNeighborCount,Verifies the number of OSPF neighbors in FULL state is the one we expect.,,NOT RUN, -598,dc1-spine2,OSPF,VerifyOSPFNeighborState,Verifies all OSPF neighbors are in FULL state.,,NOT RUN, -599,dc1-spine2,Routing,VerifyRoutingProtocolModel,Verifies the configured routing protocol model.,,NOT RUN, -600,dc1-spine2,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,,NOT RUN, -601,dc1-spine2,Routing,VerifyRoutingTableSize,Verifies the size of the IP routing table (default VRF). Should be between the two provided thresholds.,,NOT RUN, -602,dc1-spine2,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, -603,dc1-spine2,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, -604,dc1-spine2,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, -605,dc1-spine2,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, -606,dc1-spine2,Software,VerifyEOSVersion,Verifies the device is running one of the allowed EOS version.,,NOT RUN, -607,dc1-spine2,Software,VerifyTerminAttrVersion,Verifies the device is running one of the allowed TerminAttr version.,,NOT RUN, -608,dc1-spine2,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, -609,dc1-spine2,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, -610,dc1-spine2,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, -611,dc1-spine2,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, -612,dc1-spine2,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, -613,dc1-spine2,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -614,dc1-spine2,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -615,dc1-spine2,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, -616,dc1-spine2,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, -617,dc1-wan1,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, -618,dc1-wan1,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, -619,dc1-wan1,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, -620,dc1-wan1,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, -621,dc1-wan1,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, -622,dc1-wan1,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, -623,dc1-wan1,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, -624,dc1-wan1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-leaf1a (IP: 10.255.255.0),NOT RUN, -625,dc1-wan1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-leaf1b (IP: 10.255.255.2),NOT RUN, -626,dc1-wan1,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, -627,dc1-wan1,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, -628,dc1-wan1,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc1-leaf1a Ethernet6,NOT RUN, -629,dc1-wan1,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc1-leaf1b Ethernet6,NOT RUN, -630,dc1-wan1,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet1 (IP: 10.255.255.1) - Destination: dc1-leaf1a Ethernet6 (IP: 10.255.255.0),NOT RUN, -631,dc1-wan1,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet2 (IP: 10.255.255.3) - Destination: dc1-leaf1b Ethernet6 (IP: 10.255.255.2),NOT RUN, -632,dc1-wan1,Field Notices;Software,VerifyFieldNotice44Resolution,Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization),,NOT RUN, -633,dc1-wan1,Field Notices;Software,VerifyFieldNotice72Resolution,"Verifies if the device has exposeure to FN72, and if the issue has been mitigated",,NOT RUN, -634,dc1-wan1,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS7280E and DCS7500E,,NOT RUN, -635,dc1-wan1,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, -636,dc1-wan1,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, -637,dc1-wan1,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, -638,dc1-wan1,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, -639,dc1-wan1,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, -640,dc1-wan1,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -641,dc1-wan1,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -642,dc1-wan1,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, -643,dc1-wan1,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, -644,dc1-wan1,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, -645,dc1-wan1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Dps1 - DPS Interface = 'up',NOT RUN, -646,dc1-wan1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - P2P_LINK_TO_DC1-LEAF1A_Ethernet6 = 'up',NOT RUN, -647,dc1-wan1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - P2P_LINK_TO_DC1-LEAF1B_Ethernet6 = 'up',NOT RUN, -648,dc1-wan1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet3 - mpls-sp-1_DC1-MPLS-3 = 'up',NOT RUN, -649,dc1-wan1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet4 - isp-1_DC1-INET-3 = 'up',NOT RUN, -650,dc1-wan1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback0 - Router_ID = 'up',NOT RUN, -651,dc1-wan1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vxlan1 = 'up',NOT RUN, -652,dc1-wan1,Routing,VerifyRoutingProtocolModel,Verifies the configured routing protocol model.,Routing protocol model: multi-agent,NOT RUN, -653,dc1-wan1,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, -654,dc1-wan1,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, -655,dc1-wan1,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, -656,dc1-wan1,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, -657,dc1-wan1,Software,VerifyEOSVersion,Verifies the device is running one of the allowed EOS version.,,NOT RUN, -658,dc1-wan1,Software,VerifyTerminAttrVersion,Verifies the device is running one of the allowed TerminAttr version.,,NOT RUN, -659,dc1-wan1,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, -660,dc1-wan1,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, -661,dc1-wan1,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, -662,dc1-wan1,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, -663,dc1-wan1,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, -664,dc1-wan1,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -665,dc1-wan1,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -666,dc1-wan1,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, -667,dc1-wan1,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, -668,dc1-wan2,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, -669,dc1-wan2,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, -670,dc1-wan2,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, -671,dc1-wan2,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, -672,dc1-wan2,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, -673,dc1-wan2,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, -674,dc1-wan2,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, -675,dc1-wan2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-leaf1a (IP: 10.255.255.4),NOT RUN, -676,dc1-wan2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-leaf1b (IP: 10.255.255.6),NOT RUN, -677,dc1-wan2,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, -678,dc1-wan2,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, -679,dc1-wan2,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc1-leaf1a Ethernet7,NOT RUN, -680,dc1-wan2,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc1-leaf1b Ethernet7,NOT RUN, -681,dc1-wan2,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet1 (IP: 10.255.255.5) - Destination: dc1-leaf1a Ethernet7 (IP: 10.255.255.4),NOT RUN, -682,dc1-wan2,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet2 (IP: 10.255.255.7) - Destination: dc1-leaf1b Ethernet7 (IP: 10.255.255.6),NOT RUN, -683,dc1-wan2,Field Notices;Software,VerifyFieldNotice44Resolution,Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization),,NOT RUN, -684,dc1-wan2,Field Notices;Software,VerifyFieldNotice72Resolution,"Verifies if the device has exposeure to FN72, and if the issue has been mitigated",,NOT RUN, -685,dc1-wan2,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS7280E and DCS7500E,,NOT RUN, -686,dc1-wan2,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, -687,dc1-wan2,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, -688,dc1-wan2,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, -689,dc1-wan2,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, -690,dc1-wan2,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, -691,dc1-wan2,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -692,dc1-wan2,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -693,dc1-wan2,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, -694,dc1-wan2,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, -695,dc1-wan2,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, -696,dc1-wan2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Dps1 - DPS Interface = 'up',NOT RUN, -697,dc1-wan2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - P2P_LINK_TO_DC1-LEAF1A_Ethernet7 = 'up',NOT RUN, -698,dc1-wan2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - P2P_LINK_TO_DC1-LEAF1B_Ethernet7 = 'up',NOT RUN, -699,dc1-wan2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet3 - mpls-sp-1_DC1-MPLS-4 = 'up',NOT RUN, -700,dc1-wan2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet4 - isp-1_DC1-INET-4 = 'up',NOT RUN, -701,dc1-wan2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback0 - Router_ID = 'up',NOT RUN, -702,dc1-wan2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vxlan1 = 'up',NOT RUN, -703,dc1-wan2,Routing,VerifyRoutingProtocolModel,Verifies the configured routing protocol model.,Routing protocol model: multi-agent,NOT RUN, -704,dc1-wan2,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, -705,dc1-wan2,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, -706,dc1-wan2,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, -707,dc1-wan2,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, -708,dc1-wan2,Software,VerifyEOSVersion,Verifies the device is running one of the allowed EOS version.,,NOT RUN, -709,dc1-wan2,Software,VerifyTerminAttrVersion,Verifies the device is running one of the allowed TerminAttr version.,,NOT RUN, -710,dc1-wan2,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, -711,dc1-wan2,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, -712,dc1-wan2,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, -713,dc1-wan2,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, -714,dc1-wan2,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, -715,dc1-wan2,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -716,dc1-wan2,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -717,dc1-wan2,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, -718,dc1-wan2,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, -719,dc2-leaf1a,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, -720,dc2-leaf1a,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, -721,dc2-leaf1a,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, -722,dc2-leaf1a,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, -723,dc2-leaf1a,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, -724,dc2-leaf1a,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, -725,dc2-leaf1a,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, -726,dc2-leaf1a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-spine1 (IP: 10.255.128.11),NOT RUN, -727,dc2-leaf1a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-spine2 (IP: 10.255.128.12),NOT RUN, -728,dc2-leaf1a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf1b (IP: 10.255.129.117),NOT RUN, -729,dc2-leaf1a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-spine1 (IP: 10.255.255.104),NOT RUN, -730,dc2-leaf1a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-spine2 (IP: 10.255.255.106),NOT RUN, -731,dc2-leaf1a,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, -732,dc2-leaf1a,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, -733,dc2-leaf1a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc2-spine1 Ethernet1,NOT RUN, -734,dc2-leaf1a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc2-spine2 Ethernet1,NOT RUN, -735,dc2-leaf1a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet3 - Remote: dc2-leaf1b Ethernet3,NOT RUN, -736,dc2-leaf1a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet4 - Remote: dc2-leaf1b Ethernet4,NOT RUN, -737,dc2-leaf1a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet8 - Remote: dc2-leaf1c Ethernet1,NOT RUN, -738,dc2-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3),NOT RUN, -739,dc2-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4),NOT RUN, -740,dc2-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5),NOT RUN, -741,dc2-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1),NOT RUN, -742,dc2-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2),NOT RUN, -743,dc2-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1),NOT RUN, -744,dc2-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2),NOT RUN, -745,dc2-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.13) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13),NOT RUN, -746,dc2-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.13) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14),NOT RUN, -747,dc2-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.13) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15),NOT RUN, -748,dc2-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.13) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16),NOT RUN, -749,dc2-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.13) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17),NOT RUN, -750,dc2-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.13) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18),NOT RUN, -751,dc2-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.13) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11),NOT RUN, -752,dc2-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.13) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12),NOT RUN, -753,dc2-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet1 (IP: 10.255.255.105) - Destination: dc2-spine1 Ethernet1 (IP: 10.255.255.104),NOT RUN, -754,dc2-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet2 (IP: 10.255.255.107) - Destination: dc2-spine2 Ethernet1 (IP: 10.255.255.106),NOT RUN, -755,dc2-leaf1a,Field Notices;Software,VerifyFieldNotice44Resolution,Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization),,NOT RUN, -756,dc2-leaf1a,Field Notices;Software,VerifyFieldNotice72Resolution,"Verifies if the device has exposeure to FN72, and if the issue has been mitigated",,NOT RUN, -757,dc2-leaf1a,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS7280E and DCS7500E,,NOT RUN, -758,dc2-leaf1a,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, -759,dc2-leaf1a,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, -760,dc2-leaf1a,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, -761,dc2-leaf1a,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, -762,dc2-leaf1a,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, -763,dc2-leaf1a,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -764,dc2-leaf1a,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -765,dc2-leaf1a,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, -766,dc2-leaf1a,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, -767,dc2-leaf1a,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, -768,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - P2P_LINK_TO_DC2-SPINE1_Ethernet1 = 'up',NOT RUN, -769,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - P2P_LINK_TO_DC2-SPINE2_Ethernet1 = 'up',NOT RUN, -770,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet3 - MLAG_PEER_dc2-leaf1b_Ethernet3 = 'up',NOT RUN, -771,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet4 - MLAG_PEER_dc2-leaf1b_Ethernet4 = 'up',NOT RUN, -772,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet5 - dc2-leaf1-server1_PCI1 = 'up',NOT RUN, -773,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet8 - DC2-LEAF1C_Ethernet1 = 'up',NOT RUN, -774,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback0 - EVPN_Overlay_Peering = 'up',NOT RUN, -775,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up',NOT RUN, -776,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback10 - VRF10_VTEP_DIAGNOSTICS = 'up',NOT RUN, -777,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback11 - VRF11_VTEP_DIAGNOSTICS = 'up',NOT RUN, -778,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel3 - MLAG_PEER_dc2-leaf1b_Po3 = 'up',NOT RUN, -779,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel5 - dc2-leaf1-server1_PortChannel dc2-leaf1-server1 = 'up',NOT RUN, -780,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel8 - DC2-LEAF1C_Po1 = 'up',NOT RUN, -781,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan11 - VRF10_VLAN11 = 'up',NOT RUN, -782,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan12 - VRF10_VLAN12 = 'up',NOT RUN, -783,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan21 - VRF11_VLAN21 = 'up',NOT RUN, -784,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan22 - VRF11_VLAN22 = 'up',NOT RUN, -785,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan3009 - MLAG_PEER_L3_iBGP: vrf VRF10 = 'up',NOT RUN, -786,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan3010 - MLAG_PEER_L3_iBGP: vrf VRF11 = 'up',NOT RUN, -787,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up',NOT RUN, -788,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4094 - MLAG_PEER = 'up',NOT RUN, -789,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vxlan1 = 'up',NOT RUN, -790,dc2-leaf1a,Logging,VerifyLoggingAccounting,Verifies if AAA accounting logs are generated.,,NOT RUN, -791,dc2-leaf1a,Logging,VerifyLoggingHostname,Verifies if logs are generated with the device FQDN.,,NOT RUN, -792,dc2-leaf1a,Logging,VerifyLoggingHosts,Verifies logging hosts (syslog servers) for a specified VRF.,,NOT RUN, -793,dc2-leaf1a,Logging,VerifyLoggingLogsGeneration,Verifies if logs are generated.,,NOT RUN, -794,dc2-leaf1a,Logging,VerifyLoggingPersistent,Verifies if logging persistent is enabled and logs are saved in flash.,,NOT RUN, -795,dc2-leaf1a,Logging,VerifyLoggingSourceInt,Verifies logging source-interface for a specified VRF.,,NOT RUN, -796,dc2-leaf1a,Logging,VerifyLoggingTimestamp,Verifies if logs are generated with the appropriate timestamp.,,NOT RUN, -797,dc2-leaf1a,Logging,VerifyLoggingWarning,This test verifies there are no syslog messages with a severity of ERRORS or higher.,,NOT RUN, -798,dc2-leaf1a,MLAG,VerifyMlagConfigSanity,Verifies there are no MLAG config-sanity inconsistencies.,,NOT RUN, -799,dc2-leaf1a,MLAG,VerifyMlagDualPrimary,Verifies the MLAG dual-primary detection parameters.,,NOT RUN, -800,dc2-leaf1a,MLAG,VerifyMlagInterfaces,Verifies there are no inactive or active-partial MLAG ports.,,NOT RUN, -801,dc2-leaf1a,MLAG,VerifyMlagReloadDelay,Verifies the MLAG reload-delay parameters.,,NOT RUN, -802,dc2-leaf1a,MLAG,VerifyMlagStatus,Verifies the health status of the MLAG configuration.,,NOT RUN, -803,dc2-leaf1a,MLAG,VerifyMlagStatus,Verifies the health status of the MLAG configuration.,,NOT RUN, -804,dc2-leaf1a,Multicast;IGMP,VerifyIGMPSnoopingGlobal,Verifies the IGMP snooping global configuration.,,NOT RUN, -805,dc2-leaf1a,Multicast;IGMP,VerifyIGMPSnoopingVlans,Verifies the IGMP snooping configuration for some VLANs.,,NOT RUN, -806,dc2-leaf1a,Routing,VerifyRoutingProtocolModel,Verifies the configured routing protocol model.,Routing protocol model: multi-agent,NOT RUN, -807,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.1 - Peer: dc1-spine1,NOT RUN, -808,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.2 - Peer: dc1-spine2,NOT RUN, -809,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.3 - Peer: dc1-leaf1a,NOT RUN, -810,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.4 - Peer: dc1-leaf1b,NOT RUN, -811,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.5 - Peer: dc1-leaf2a,NOT RUN, -812,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.3 - Peer: dc1-leaf1a,NOT RUN, -813,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.5 - Peer: dc1-leaf2a,NOT RUN, -814,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.11 - Peer: dc2-spine1,NOT RUN, -815,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.12 - Peer: dc2-spine2,NOT RUN, -816,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.13 - Peer: dc2-leaf1a,NOT RUN, -817,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.14 - Peer: dc2-leaf1b,NOT RUN, -818,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.15 - Peer: dc2-leaf2a,NOT RUN, -819,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.16 - Peer: dc2-leaf2b,NOT RUN, -820,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, -821,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com,NOT RUN, -822,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.13 - Peer: dc2-leaf1a,NOT RUN, -823,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.15 - Peer: dc2-leaf2a,NOT RUN, -824,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, -825,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.1 - Peer: dc1-wan1,NOT RUN, -826,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.2 - Peer: dc1-wan2,NOT RUN, -827,dc2-leaf1a,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, -828,dc2-leaf1a,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, -829,dc2-leaf1a,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, -830,dc2-leaf1a,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, -831,dc2-leaf1a,Software,VerifyEOSVersion,Verifies the device is running one of the allowed EOS version.,,NOT RUN, -832,dc2-leaf1a,Software,VerifyTerminAttrVersion,Verifies the device is running one of the allowed TerminAttr version.,,NOT RUN, -833,dc2-leaf1a,STP,VerifySTPBlockedPorts,Verifies there is no STP blocked ports.,,NOT RUN, -834,dc2-leaf1a,STP,VerifySTPCounters,Verifies there is no errors in STP BPDU packets.,,NOT RUN, -835,dc2-leaf1a,STP,VerifySTPForwardingPorts,Verifies that all interfaces are forwarding for a provided list of VLAN(s).,,NOT RUN, -836,dc2-leaf1a,STP,VerifySTPMode,Verifies the configured STP mode for a provided list of VLAN(s).,,NOT RUN, -837,dc2-leaf1a,STP,VerifySTPRootPriority,Verifies the STP root priority for a provided list of VLAN or MST instance ID(s).,,NOT RUN, -838,dc2-leaf1a,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, -839,dc2-leaf1a,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, -840,dc2-leaf1a,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, -841,dc2-leaf1a,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, -842,dc2-leaf1a,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, -843,dc2-leaf1a,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -844,dc2-leaf1a,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -845,dc2-leaf1a,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, -846,dc2-leaf1a,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, -847,dc2-leaf1b,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, -848,dc2-leaf1b,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, -849,dc2-leaf1b,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, -850,dc2-leaf1b,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, -851,dc2-leaf1b,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, -852,dc2-leaf1b,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, -853,dc2-leaf1b,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, -854,dc2-leaf1b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-spine1 (IP: 10.255.128.11),NOT RUN, -855,dc2-leaf1b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-spine2 (IP: 10.255.128.12),NOT RUN, -856,dc2-leaf1b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf1a (IP: 10.255.129.116),NOT RUN, -857,dc2-leaf1b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-spine1 (IP: 10.255.255.108),NOT RUN, -858,dc2-leaf1b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-spine2 (IP: 10.255.255.110),NOT RUN, -859,dc2-leaf1b,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, -860,dc2-leaf1b,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, -861,dc2-leaf1b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc2-spine1 Ethernet2,NOT RUN, -862,dc2-leaf1b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc2-spine2 Ethernet2,NOT RUN, -863,dc2-leaf1b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet3 - Remote: dc2-leaf1a Ethernet3,NOT RUN, -864,dc2-leaf1b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet4 - Remote: dc2-leaf1a Ethernet4,NOT RUN, -865,dc2-leaf1b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet8 - Remote: dc2-leaf1c Ethernet2,NOT RUN, -866,dc2-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3),NOT RUN, -867,dc2-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4),NOT RUN, -868,dc2-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5),NOT RUN, -869,dc2-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1),NOT RUN, -870,dc2-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2),NOT RUN, -871,dc2-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1),NOT RUN, -872,dc2-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2),NOT RUN, -873,dc2-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.14) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13),NOT RUN, -874,dc2-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.14) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14),NOT RUN, -875,dc2-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.14) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15),NOT RUN, -876,dc2-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.14) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16),NOT RUN, -877,dc2-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.14) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17),NOT RUN, -878,dc2-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.14) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18),NOT RUN, -879,dc2-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.14) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11),NOT RUN, -880,dc2-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.14) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12),NOT RUN, -881,dc2-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet1 (IP: 10.255.255.109) - Destination: dc2-spine1 Ethernet2 (IP: 10.255.255.108),NOT RUN, -882,dc2-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet2 (IP: 10.255.255.111) - Destination: dc2-spine2 Ethernet2 (IP: 10.255.255.110),NOT RUN, -883,dc2-leaf1b,Field Notices;Software,VerifyFieldNotice44Resolution,Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization),,NOT RUN, -884,dc2-leaf1b,Field Notices;Software,VerifyFieldNotice72Resolution,"Verifies if the device has exposeure to FN72, and if the issue has been mitigated",,NOT RUN, -885,dc2-leaf1b,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS7280E and DCS7500E,,NOT RUN, -886,dc2-leaf1b,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, -887,dc2-leaf1b,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, -888,dc2-leaf1b,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, -889,dc2-leaf1b,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, -890,dc2-leaf1b,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, -891,dc2-leaf1b,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -892,dc2-leaf1b,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -893,dc2-leaf1b,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, -894,dc2-leaf1b,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, -895,dc2-leaf1b,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, -896,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - P2P_LINK_TO_DC2-SPINE1_Ethernet2 = 'up',NOT RUN, -897,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - P2P_LINK_TO_DC2-SPINE2_Ethernet2 = 'up',NOT RUN, -898,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet3 - MLAG_PEER_dc2-leaf1a_Ethernet3 = 'up',NOT RUN, -899,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet4 - MLAG_PEER_dc2-leaf1a_Ethernet4 = 'up',NOT RUN, -900,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet5 - dc2-leaf1-server1_PCI2 = 'up',NOT RUN, -901,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet8 - DC2-LEAF1C_Ethernet2 = 'up',NOT RUN, -902,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback0 - EVPN_Overlay_Peering = 'up',NOT RUN, -903,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up',NOT RUN, -904,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback10 - VRF10_VTEP_DIAGNOSTICS = 'up',NOT RUN, -905,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback11 - VRF11_VTEP_DIAGNOSTICS = 'up',NOT RUN, -906,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel3 - MLAG_PEER_dc2-leaf1a_Po3 = 'up',NOT RUN, -907,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel5 - dc2-leaf1-server1_PortChannel dc2-leaf1-server1 = 'up',NOT RUN, -908,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel8 - DC2-LEAF1C_Po1 = 'up',NOT RUN, -909,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan11 - VRF10_VLAN11 = 'up',NOT RUN, -910,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan12 - VRF10_VLAN12 = 'up',NOT RUN, -911,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan21 - VRF11_VLAN21 = 'up',NOT RUN, -912,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan22 - VRF11_VLAN22 = 'up',NOT RUN, -913,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan3009 - MLAG_PEER_L3_iBGP: vrf VRF10 = 'up',NOT RUN, -914,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan3010 - MLAG_PEER_L3_iBGP: vrf VRF11 = 'up',NOT RUN, -915,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up',NOT RUN, -916,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4094 - MLAG_PEER = 'up',NOT RUN, -917,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vxlan1 = 'up',NOT RUN, -918,dc2-leaf1b,Logging,VerifyLoggingAccounting,Verifies if AAA accounting logs are generated.,,NOT RUN, -919,dc2-leaf1b,Logging,VerifyLoggingHostname,Verifies if logs are generated with the device FQDN.,,NOT RUN, -920,dc2-leaf1b,Logging,VerifyLoggingHosts,Verifies logging hosts (syslog servers) for a specified VRF.,,NOT RUN, -921,dc2-leaf1b,Logging,VerifyLoggingLogsGeneration,Verifies if logs are generated.,,NOT RUN, -922,dc2-leaf1b,Logging,VerifyLoggingPersistent,Verifies if logging persistent is enabled and logs are saved in flash.,,NOT RUN, -923,dc2-leaf1b,Logging,VerifyLoggingSourceInt,Verifies logging source-interface for a specified VRF.,,NOT RUN, -924,dc2-leaf1b,Logging,VerifyLoggingTimestamp,Verifies if logs are generated with the appropriate timestamp.,,NOT RUN, -925,dc2-leaf1b,Logging,VerifyLoggingWarning,This test verifies there are no syslog messages with a severity of ERRORS or higher.,,NOT RUN, -926,dc2-leaf1b,MLAG,VerifyMlagConfigSanity,Verifies there are no MLAG config-sanity inconsistencies.,,NOT RUN, -927,dc2-leaf1b,MLAG,VerifyMlagDualPrimary,Verifies the MLAG dual-primary detection parameters.,,NOT RUN, -928,dc2-leaf1b,MLAG,VerifyMlagInterfaces,Verifies there are no inactive or active-partial MLAG ports.,,NOT RUN, -929,dc2-leaf1b,MLAG,VerifyMlagReloadDelay,Verifies the MLAG reload-delay parameters.,,NOT RUN, -930,dc2-leaf1b,MLAG,VerifyMlagStatus,Verifies the health status of the MLAG configuration.,,NOT RUN, -931,dc2-leaf1b,MLAG,VerifyMlagStatus,Verifies the health status of the MLAG configuration.,,NOT RUN, -932,dc2-leaf1b,Multicast;IGMP,VerifyIGMPSnoopingGlobal,Verifies the IGMP snooping global configuration.,,NOT RUN, -933,dc2-leaf1b,Multicast;IGMP,VerifyIGMPSnoopingVlans,Verifies the IGMP snooping configuration for some VLANs.,,NOT RUN, -934,dc2-leaf1b,Routing,VerifyRoutingProtocolModel,Verifies the configured routing protocol model.,Routing protocol model: multi-agent,NOT RUN, -935,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.1 - Peer: dc1-spine1,NOT RUN, -936,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.2 - Peer: dc1-spine2,NOT RUN, -937,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.3 - Peer: dc1-leaf1a,NOT RUN, -938,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.4 - Peer: dc1-leaf1b,NOT RUN, -939,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.5 - Peer: dc1-leaf2a,NOT RUN, -940,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.3 - Peer: dc1-leaf1a,NOT RUN, -941,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.5 - Peer: dc1-leaf2a,NOT RUN, -942,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.11 - Peer: dc2-spine1,NOT RUN, -943,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.12 - Peer: dc2-spine2,NOT RUN, -944,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.13 - Peer: dc2-leaf1a,NOT RUN, -945,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.14 - Peer: dc2-leaf1b,NOT RUN, -946,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.15 - Peer: dc2-leaf2a,NOT RUN, -947,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.16 - Peer: dc2-leaf2b,NOT RUN, -948,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, -949,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com,NOT RUN, -950,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.13 - Peer: dc2-leaf1a,NOT RUN, -951,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.15 - Peer: dc2-leaf2a,NOT RUN, -952,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, -953,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.1 - Peer: dc1-wan1,NOT RUN, -954,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.2 - Peer: dc1-wan2,NOT RUN, -955,dc2-leaf1b,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, -956,dc2-leaf1b,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, -957,dc2-leaf1b,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, -958,dc2-leaf1b,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, -959,dc2-leaf1b,Software,VerifyEOSVersion,Verifies the device is running one of the allowed EOS version.,,NOT RUN, -960,dc2-leaf1b,Software,VerifyTerminAttrVersion,Verifies the device is running one of the allowed TerminAttr version.,,NOT RUN, -961,dc2-leaf1b,STP,VerifySTPBlockedPorts,Verifies there is no STP blocked ports.,,NOT RUN, -962,dc2-leaf1b,STP,VerifySTPCounters,Verifies there is no errors in STP BPDU packets.,,NOT RUN, -963,dc2-leaf1b,STP,VerifySTPForwardingPorts,Verifies that all interfaces are forwarding for a provided list of VLAN(s).,,NOT RUN, -964,dc2-leaf1b,STP,VerifySTPMode,Verifies the configured STP mode for a provided list of VLAN(s).,,NOT RUN, -965,dc2-leaf1b,STP,VerifySTPRootPriority,Verifies the STP root priority for a provided list of VLAN or MST instance ID(s).,,NOT RUN, -966,dc2-leaf1b,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, -967,dc2-leaf1b,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, -968,dc2-leaf1b,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, -969,dc2-leaf1b,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, -970,dc2-leaf1b,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, -971,dc2-leaf1b,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -972,dc2-leaf1b,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -973,dc2-leaf1b,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, -974,dc2-leaf1b,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, -975,dc2-leaf1c,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, -976,dc2-leaf1c,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, -977,dc2-leaf1c,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, -978,dc2-leaf1c,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, -979,dc2-leaf1c,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, -980,dc2-leaf1c,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, -981,dc2-leaf1c,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, -982,dc2-leaf1c,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, -983,dc2-leaf1c,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, -984,dc2-leaf1c,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc2-leaf1a Ethernet8,NOT RUN, -985,dc2-leaf1c,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc2-leaf1b Ethernet8,NOT RUN, -986,dc2-leaf1c,Field Notices;Software,VerifyFieldNotice44Resolution,Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization),,NOT RUN, -987,dc2-leaf1c,Field Notices;Software,VerifyFieldNotice72Resolution,"Verifies if the device has exposeure to FN72, and if the issue has been mitigated",,NOT RUN, -988,dc2-leaf1c,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS7280E and DCS7500E,,NOT RUN, -989,dc2-leaf1c,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, -990,dc2-leaf1c,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, -991,dc2-leaf1c,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, -992,dc2-leaf1c,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, -993,dc2-leaf1c,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, -994,dc2-leaf1c,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -995,dc2-leaf1c,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -996,dc2-leaf1c,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, -997,dc2-leaf1c,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, -998,dc2-leaf1c,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, -999,dc2-leaf1c,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - DC2-LEAF1A_Ethernet8 = 'up',NOT RUN, -1000,dc2-leaf1c,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - DC2-LEAF1B_Ethernet8 = 'up',NOT RUN, -1001,dc2-leaf1c,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet5 - dc2-leaf1-server1_iLO = 'up',NOT RUN, -1002,dc2-leaf1c,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel1 - DC2_L3_LEAF1_Po8 = 'up',NOT RUN, -1003,dc2-leaf1c,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, -1004,dc2-leaf1c,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, -1005,dc2-leaf1c,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, -1006,dc2-leaf1c,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, -1007,dc2-leaf1c,Software,VerifyEOSVersion,Verifies the device is running one of the allowed EOS version.,,NOT RUN, -1008,dc2-leaf1c,Software,VerifyTerminAttrVersion,Verifies the device is running one of the allowed TerminAttr version.,,NOT RUN, -1009,dc2-leaf1c,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, -1010,dc2-leaf1c,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, -1011,dc2-leaf1c,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, -1012,dc2-leaf1c,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, -1013,dc2-leaf1c,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, -1014,dc2-leaf1c,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -1015,dc2-leaf1c,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -1016,dc2-leaf1c,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, -1017,dc2-leaf1c,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, -1018,dc2-leaf2a,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, -1019,dc2-leaf2a,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, -1020,dc2-leaf2a,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, -1021,dc2-leaf2a,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, -1022,dc2-leaf2a,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, -1023,dc2-leaf2a,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, -1024,dc2-leaf2a,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, -1025,dc2-leaf2a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc1-leaf2a (IP: 10.255.0.5),NOT RUN, -1026,dc2-leaf2a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-spine1 (IP: 10.255.128.11),NOT RUN, -1027,dc2-leaf2a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-spine2 (IP: 10.255.128.12),NOT RUN, -1028,dc2-leaf2a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-leaf2a (IP: 192.168.100.0),NOT RUN, -1029,dc2-leaf2a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf2b (IP: 10.255.129.121),NOT RUN, -1030,dc2-leaf2a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-spine1 (IP: 10.255.255.112),NOT RUN, -1031,dc2-leaf2a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-spine2 (IP: 10.255.255.114),NOT RUN, -1032,dc2-leaf2a,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, -1033,dc2-leaf2a,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, -1034,dc2-leaf2a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc2-spine1 Ethernet3,NOT RUN, -1035,dc2-leaf2a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc2-spine2 Ethernet3,NOT RUN, -1036,dc2-leaf2a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet3 - Remote: dc2-leaf2b Ethernet3,NOT RUN, -1037,dc2-leaf2a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet4 - Remote: dc2-leaf2b Ethernet4,NOT RUN, -1038,dc2-leaf2a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet6 - Remote: dc1-leaf2a Ethernet6,NOT RUN, -1039,dc2-leaf2a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet8 - Remote: dc2-leaf2c Ethernet1,NOT RUN, -1040,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3),NOT RUN, -1041,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4),NOT RUN, -1042,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5),NOT RUN, -1043,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1),NOT RUN, -1044,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2),NOT RUN, -1045,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1),NOT RUN, -1046,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2),NOT RUN, -1047,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.15) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13),NOT RUN, -1048,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.15) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14),NOT RUN, -1049,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.15) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15),NOT RUN, -1050,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.15) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16),NOT RUN, -1051,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.15) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17),NOT RUN, -1052,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.15) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18),NOT RUN, -1053,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.15) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11),NOT RUN, -1054,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.15) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12),NOT RUN, -1055,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet1 (IP: 10.255.255.113) - Destination: dc2-spine1 Ethernet3 (IP: 10.255.255.112),NOT RUN, -1056,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet2 (IP: 10.255.255.115) - Destination: dc2-spine2 Ethernet3 (IP: 10.255.255.114),NOT RUN, -1057,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet6 (IP: 192.168.100.1) - Destination: dc1-leaf2a Ethernet6 (IP: 192.168.100.0),NOT RUN, -1058,dc2-leaf2a,Field Notices;Software,VerifyFieldNotice44Resolution,Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization),,NOT RUN, -1059,dc2-leaf2a,Field Notices;Software,VerifyFieldNotice72Resolution,"Verifies if the device has exposeure to FN72, and if the issue has been mitigated",,NOT RUN, -1060,dc2-leaf2a,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS7280E and DCS7500E,,NOT RUN, -1061,dc2-leaf2a,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, -1062,dc2-leaf2a,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, -1063,dc2-leaf2a,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, -1064,dc2-leaf2a,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, -1065,dc2-leaf2a,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, -1066,dc2-leaf2a,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -1067,dc2-leaf2a,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -1068,dc2-leaf2a,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, -1069,dc2-leaf2a,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, -1070,dc2-leaf2a,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, -1071,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - P2P_LINK_TO_DC2-SPINE1_Ethernet3 = 'up',NOT RUN, -1072,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - P2P_LINK_TO_DC2-SPINE2_Ethernet3 = 'up',NOT RUN, -1073,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet3 - MLAG_PEER_dc2-leaf2b_Ethernet3 = 'up',NOT RUN, -1074,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet4 - MLAG_PEER_dc2-leaf2b_Ethernet4 = 'up',NOT RUN, -1075,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet5 - dc2-leaf2-server1_PCI1 = 'up',NOT RUN, -1076,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet6 - P2P_LINK_TO_dc1-leaf2a_Ethernet6 = 'up',NOT RUN, -1077,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet8 - DC2-LEAF2C_Ethernet1 = 'up',NOT RUN, -1078,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback0 - EVPN_Overlay_Peering = 'up',NOT RUN, -1079,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up',NOT RUN, -1080,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback10 - VRF10_VTEP_DIAGNOSTICS = 'up',NOT RUN, -1081,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback11 - VRF11_VTEP_DIAGNOSTICS = 'up',NOT RUN, -1082,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel3 - MLAG_PEER_dc2-leaf2b_Po3 = 'up',NOT RUN, -1083,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel5 - dc2-leaf2-server1_PortChannel dc2-leaf2-server1 = 'up',NOT RUN, -1084,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel8 - DC2-LEAF2C_Po1 = 'up',NOT RUN, -1085,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan11 - VRF10_VLAN11 = 'up',NOT RUN, -1086,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan12 - VRF10_VLAN12 = 'up',NOT RUN, -1087,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan21 - VRF11_VLAN21 = 'up',NOT RUN, -1088,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan22 - VRF11_VLAN22 = 'up',NOT RUN, -1089,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan3009 - MLAG_PEER_L3_iBGP: vrf VRF10 = 'up',NOT RUN, -1090,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan3010 - MLAG_PEER_L3_iBGP: vrf VRF11 = 'up',NOT RUN, -1091,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up',NOT RUN, -1092,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4094 - MLAG_PEER = 'up',NOT RUN, -1093,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vxlan1 = 'up',NOT RUN, -1094,dc2-leaf2a,Logging,VerifyLoggingAccounting,Verifies if AAA accounting logs are generated.,,NOT RUN, -1095,dc2-leaf2a,Logging,VerifyLoggingHostname,Verifies if logs are generated with the device FQDN.,,NOT RUN, -1096,dc2-leaf2a,Logging,VerifyLoggingHosts,Verifies logging hosts (syslog servers) for a specified VRF.,,NOT RUN, -1097,dc2-leaf2a,Logging,VerifyLoggingLogsGeneration,Verifies if logs are generated.,,NOT RUN, -1098,dc2-leaf2a,Logging,VerifyLoggingPersistent,Verifies if logging persistent is enabled and logs are saved in flash.,,NOT RUN, -1099,dc2-leaf2a,Logging,VerifyLoggingSourceInt,Verifies logging source-interface for a specified VRF.,,NOT RUN, -1100,dc2-leaf2a,Logging,VerifyLoggingTimestamp,Verifies if logs are generated with the appropriate timestamp.,,NOT RUN, -1101,dc2-leaf2a,Logging,VerifyLoggingWarning,This test verifies there are no syslog messages with a severity of ERRORS or higher.,,NOT RUN, -1102,dc2-leaf2a,MLAG,VerifyMlagConfigSanity,Verifies there are no MLAG config-sanity inconsistencies.,,NOT RUN, -1103,dc2-leaf2a,MLAG,VerifyMlagDualPrimary,Verifies the MLAG dual-primary detection parameters.,,NOT RUN, -1104,dc2-leaf2a,MLAG,VerifyMlagInterfaces,Verifies there are no inactive or active-partial MLAG ports.,,NOT RUN, -1105,dc2-leaf2a,MLAG,VerifyMlagReloadDelay,Verifies the MLAG reload-delay parameters.,,NOT RUN, -1106,dc2-leaf2a,MLAG,VerifyMlagStatus,Verifies the health status of the MLAG configuration.,,NOT RUN, -1107,dc2-leaf2a,MLAG,VerifyMlagStatus,Verifies the health status of the MLAG configuration.,,NOT RUN, -1108,dc2-leaf2a,Multicast;IGMP,VerifyIGMPSnoopingGlobal,Verifies the IGMP snooping global configuration.,,NOT RUN, -1109,dc2-leaf2a,Multicast;IGMP,VerifyIGMPSnoopingVlans,Verifies the IGMP snooping configuration for some VLANs.,,NOT RUN, -1110,dc2-leaf2a,Routing,VerifyRoutingProtocolModel,Verifies the configured routing protocol model.,Routing protocol model: multi-agent,NOT RUN, -1111,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.1 - Peer: dc1-spine1,NOT RUN, -1112,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.2 - Peer: dc1-spine2,NOT RUN, -1113,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.3 - Peer: dc1-leaf1a,NOT RUN, -1114,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.4 - Peer: dc1-leaf1b,NOT RUN, -1115,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.5 - Peer: dc1-leaf2a,NOT RUN, -1116,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.3 - Peer: dc1-leaf1a,NOT RUN, -1117,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.5 - Peer: dc1-leaf2a,NOT RUN, -1118,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.11 - Peer: dc2-spine1,NOT RUN, -1119,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.12 - Peer: dc2-spine2,NOT RUN, -1120,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.13 - Peer: dc2-leaf1a,NOT RUN, -1121,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.14 - Peer: dc2-leaf1b,NOT RUN, -1122,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.15 - Peer: dc2-leaf2a,NOT RUN, -1123,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.16 - Peer: dc2-leaf2b,NOT RUN, -1124,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, -1125,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com,NOT RUN, -1126,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.13 - Peer: dc2-leaf1a,NOT RUN, -1127,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.15 - Peer: dc2-leaf2a,NOT RUN, -1128,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, -1129,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.1 - Peer: dc1-wan1,NOT RUN, -1130,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.2 - Peer: dc1-wan2,NOT RUN, -1131,dc2-leaf2a,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, -1132,dc2-leaf2a,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, -1133,dc2-leaf2a,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, -1134,dc2-leaf2a,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, -1135,dc2-leaf2a,Software,VerifyEOSVersion,Verifies the device is running one of the allowed EOS version.,,NOT RUN, -1136,dc2-leaf2a,Software,VerifyTerminAttrVersion,Verifies the device is running one of the allowed TerminAttr version.,,NOT RUN, -1137,dc2-leaf2a,STP,VerifySTPBlockedPorts,Verifies there is no STP blocked ports.,,NOT RUN, -1138,dc2-leaf2a,STP,VerifySTPCounters,Verifies there is no errors in STP BPDU packets.,,NOT RUN, -1139,dc2-leaf2a,STP,VerifySTPForwardingPorts,Verifies that all interfaces are forwarding for a provided list of VLAN(s).,,NOT RUN, -1140,dc2-leaf2a,STP,VerifySTPMode,Verifies the configured STP mode for a provided list of VLAN(s).,,NOT RUN, -1141,dc2-leaf2a,STP,VerifySTPRootPriority,Verifies the STP root priority for a provided list of VLAN or MST instance ID(s).,,NOT RUN, -1142,dc2-leaf2a,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, -1143,dc2-leaf2a,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, -1144,dc2-leaf2a,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, -1145,dc2-leaf2a,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, -1146,dc2-leaf2a,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, -1147,dc2-leaf2a,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -1148,dc2-leaf2a,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -1149,dc2-leaf2a,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, -1150,dc2-leaf2a,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, -1151,dc2-leaf2b,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, -1152,dc2-leaf2b,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, -1153,dc2-leaf2b,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, -1154,dc2-leaf2b,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, -1155,dc2-leaf2b,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, -1156,dc2-leaf2b,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, -1157,dc2-leaf2b,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, -1158,dc2-leaf2b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-spine1 (IP: 10.255.128.11),NOT RUN, -1159,dc2-leaf2b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-spine2 (IP: 10.255.128.12),NOT RUN, -1160,dc2-leaf2b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf2a (IP: 10.255.129.120),NOT RUN, -1161,dc2-leaf2b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-spine1 (IP: 10.255.255.116),NOT RUN, -1162,dc2-leaf2b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-spine2 (IP: 10.255.255.118),NOT RUN, -1163,dc2-leaf2b,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, -1164,dc2-leaf2b,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, -1165,dc2-leaf2b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc2-spine1 Ethernet4,NOT RUN, -1166,dc2-leaf2b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc2-spine2 Ethernet4,NOT RUN, -1167,dc2-leaf2b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet3 - Remote: dc2-leaf2a Ethernet3,NOT RUN, -1168,dc2-leaf2b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet4 - Remote: dc2-leaf2a Ethernet4,NOT RUN, -1169,dc2-leaf2b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet8 - Remote: dc2-leaf2c Ethernet2,NOT RUN, -1170,dc2-leaf2b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3),NOT RUN, -1171,dc2-leaf2b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4),NOT RUN, -1172,dc2-leaf2b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5),NOT RUN, -1173,dc2-leaf2b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1),NOT RUN, -1174,dc2-leaf2b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2),NOT RUN, -1175,dc2-leaf2b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1),NOT RUN, -1176,dc2-leaf2b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2),NOT RUN, -1177,dc2-leaf2b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.16) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13),NOT RUN, -1178,dc2-leaf2b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.16) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14),NOT RUN, -1179,dc2-leaf2b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.16) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15),NOT RUN, -1180,dc2-leaf2b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.16) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16),NOT RUN, -1181,dc2-leaf2b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.16) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17),NOT RUN, -1182,dc2-leaf2b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.16) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18),NOT RUN, -1183,dc2-leaf2b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.16) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11),NOT RUN, -1184,dc2-leaf2b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.16) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12),NOT RUN, -1185,dc2-leaf2b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet1 (IP: 10.255.255.117) - Destination: dc2-spine1 Ethernet4 (IP: 10.255.255.116),NOT RUN, -1186,dc2-leaf2b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet2 (IP: 10.255.255.119) - Destination: dc2-spine2 Ethernet4 (IP: 10.255.255.118),NOT RUN, -1187,dc2-leaf2b,Field Notices;Software,VerifyFieldNotice44Resolution,Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization),,NOT RUN, -1188,dc2-leaf2b,Field Notices;Software,VerifyFieldNotice72Resolution,"Verifies if the device has exposeure to FN72, and if the issue has been mitigated",,NOT RUN, -1189,dc2-leaf2b,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS7280E and DCS7500E,,NOT RUN, -1190,dc2-leaf2b,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, -1191,dc2-leaf2b,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, -1192,dc2-leaf2b,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, -1193,dc2-leaf2b,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, -1194,dc2-leaf2b,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, -1195,dc2-leaf2b,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -1196,dc2-leaf2b,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -1197,dc2-leaf2b,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, -1198,dc2-leaf2b,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, -1199,dc2-leaf2b,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, -1200,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - P2P_LINK_TO_DC2-SPINE1_Ethernet4 = 'up',NOT RUN, -1201,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - P2P_LINK_TO_DC2-SPINE2_Ethernet4 = 'up',NOT RUN, -1202,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet3 - MLAG_PEER_dc2-leaf2a_Ethernet3 = 'up',NOT RUN, -1203,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet4 - MLAG_PEER_dc2-leaf2a_Ethernet4 = 'up',NOT RUN, -1204,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet5 - dc2-leaf2-server1_PCI2 = 'up',NOT RUN, -1205,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet6 - P2P_LINK_TO_dc1-leaf2b_Ethernet6 = 'up',NOT RUN, -1206,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet8 - DC2-LEAF2C_Ethernet2 = 'up',NOT RUN, -1207,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback0 - EVPN_Overlay_Peering = 'up',NOT RUN, -1208,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up',NOT RUN, -1209,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback10 - VRF10_VTEP_DIAGNOSTICS = 'up',NOT RUN, -1210,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback11 - VRF11_VTEP_DIAGNOSTICS = 'up',NOT RUN, -1211,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel3 - MLAG_PEER_dc2-leaf2a_Po3 = 'up',NOT RUN, -1212,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel5 - dc2-leaf2-server1_PortChannel dc2-leaf2-server1 = 'up',NOT RUN, -1213,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel8 - DC2-LEAF2C_Po1 = 'up',NOT RUN, -1214,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan11 - VRF10_VLAN11 = 'up',NOT RUN, -1215,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan12 - VRF10_VLAN12 = 'up',NOT RUN, -1216,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan21 - VRF11_VLAN21 = 'up',NOT RUN, -1217,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan22 - VRF11_VLAN22 = 'up',NOT RUN, -1218,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan3009 - MLAG_PEER_L3_iBGP: vrf VRF10 = 'up',NOT RUN, -1219,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan3010 - MLAG_PEER_L3_iBGP: vrf VRF11 = 'up',NOT RUN, -1220,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up',NOT RUN, -1221,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4094 - MLAG_PEER = 'up',NOT RUN, -1222,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vxlan1 = 'up',NOT RUN, -1223,dc2-leaf2b,Logging,VerifyLoggingAccounting,Verifies if AAA accounting logs are generated.,,NOT RUN, -1224,dc2-leaf2b,Logging,VerifyLoggingHostname,Verifies if logs are generated with the device FQDN.,,NOT RUN, -1225,dc2-leaf2b,Logging,VerifyLoggingHosts,Verifies logging hosts (syslog servers) for a specified VRF.,,NOT RUN, -1226,dc2-leaf2b,Logging,VerifyLoggingLogsGeneration,Verifies if logs are generated.,,NOT RUN, -1227,dc2-leaf2b,Logging,VerifyLoggingPersistent,Verifies if logging persistent is enabled and logs are saved in flash.,,NOT RUN, -1228,dc2-leaf2b,Logging,VerifyLoggingSourceInt,Verifies logging source-interface for a specified VRF.,,NOT RUN, -1229,dc2-leaf2b,Logging,VerifyLoggingTimestamp,Verifies if logs are generated with the appropriate timestamp.,,NOT RUN, -1230,dc2-leaf2b,Logging,VerifyLoggingWarning,This test verifies there are no syslog messages with a severity of ERRORS or higher.,,NOT RUN, -1231,dc2-leaf2b,MLAG,VerifyMlagConfigSanity,Verifies there are no MLAG config-sanity inconsistencies.,,NOT RUN, -1232,dc2-leaf2b,MLAG,VerifyMlagDualPrimary,Verifies the MLAG dual-primary detection parameters.,,NOT RUN, -1233,dc2-leaf2b,MLAG,VerifyMlagInterfaces,Verifies there are no inactive or active-partial MLAG ports.,,NOT RUN, -1234,dc2-leaf2b,MLAG,VerifyMlagReloadDelay,Verifies the MLAG reload-delay parameters.,,NOT RUN, -1235,dc2-leaf2b,MLAG,VerifyMlagStatus,Verifies the health status of the MLAG configuration.,,NOT RUN, -1236,dc2-leaf2b,MLAG,VerifyMlagStatus,Verifies the health status of the MLAG configuration.,,NOT RUN, -1237,dc2-leaf2b,Multicast;IGMP,VerifyIGMPSnoopingGlobal,Verifies the IGMP snooping global configuration.,,NOT RUN, -1238,dc2-leaf2b,Multicast;IGMP,VerifyIGMPSnoopingVlans,Verifies the IGMP snooping configuration for some VLANs.,,NOT RUN, -1239,dc2-leaf2b,Routing,VerifyRoutingProtocolModel,Verifies the configured routing protocol model.,Routing protocol model: multi-agent,NOT RUN, -1240,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.1 - Peer: dc1-spine1,NOT RUN, -1241,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.2 - Peer: dc1-spine2,NOT RUN, -1242,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.3 - Peer: dc1-leaf1a,NOT RUN, -1243,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.4 - Peer: dc1-leaf1b,NOT RUN, -1244,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.5 - Peer: dc1-leaf2a,NOT RUN, -1245,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.3 - Peer: dc1-leaf1a,NOT RUN, -1246,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.5 - Peer: dc1-leaf2a,NOT RUN, -1247,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.11 - Peer: dc2-spine1,NOT RUN, -1248,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.12 - Peer: dc2-spine2,NOT RUN, -1249,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.13 - Peer: dc2-leaf1a,NOT RUN, -1250,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.14 - Peer: dc2-leaf1b,NOT RUN, -1251,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.15 - Peer: dc2-leaf2a,NOT RUN, -1252,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.16 - Peer: dc2-leaf2b,NOT RUN, -1253,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, -1254,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com,NOT RUN, -1255,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.13 - Peer: dc2-leaf1a,NOT RUN, -1256,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.15 - Peer: dc2-leaf2a,NOT RUN, -1257,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, -1258,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.1 - Peer: dc1-wan1,NOT RUN, -1259,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.2 - Peer: dc1-wan2,NOT RUN, -1260,dc2-leaf2b,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, -1261,dc2-leaf2b,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, -1262,dc2-leaf2b,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, -1263,dc2-leaf2b,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, -1264,dc2-leaf2b,Software,VerifyEOSVersion,Verifies the device is running one of the allowed EOS version.,,NOT RUN, -1265,dc2-leaf2b,Software,VerifyTerminAttrVersion,Verifies the device is running one of the allowed TerminAttr version.,,NOT RUN, -1266,dc2-leaf2b,STP,VerifySTPBlockedPorts,Verifies there is no STP blocked ports.,,NOT RUN, -1267,dc2-leaf2b,STP,VerifySTPCounters,Verifies there is no errors in STP BPDU packets.,,NOT RUN, -1268,dc2-leaf2b,STP,VerifySTPForwardingPorts,Verifies that all interfaces are forwarding for a provided list of VLAN(s).,,NOT RUN, -1269,dc2-leaf2b,STP,VerifySTPMode,Verifies the configured STP mode for a provided list of VLAN(s).,,NOT RUN, -1270,dc2-leaf2b,STP,VerifySTPRootPriority,Verifies the STP root priority for a provided list of VLAN or MST instance ID(s).,,NOT RUN, -1271,dc2-leaf2b,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, -1272,dc2-leaf2b,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, -1273,dc2-leaf2b,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, -1274,dc2-leaf2b,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, -1275,dc2-leaf2b,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, -1276,dc2-leaf2b,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -1277,dc2-leaf2b,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -1278,dc2-leaf2b,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, -1279,dc2-leaf2b,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, -1280,dc2-leaf2c,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, -1281,dc2-leaf2c,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, -1282,dc2-leaf2c,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, -1283,dc2-leaf2c,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, -1284,dc2-leaf2c,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, -1285,dc2-leaf2c,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, -1286,dc2-leaf2c,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, -1287,dc2-leaf2c,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, -1288,dc2-leaf2c,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, -1289,dc2-leaf2c,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc2-leaf2a Ethernet8,NOT RUN, -1290,dc2-leaf2c,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc2-leaf2b Ethernet8,NOT RUN, -1291,dc2-leaf2c,Field Notices;Software,VerifyFieldNotice44Resolution,Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization),,NOT RUN, -1292,dc2-leaf2c,Field Notices;Software,VerifyFieldNotice72Resolution,"Verifies if the device has exposeure to FN72, and if the issue has been mitigated",,NOT RUN, -1293,dc2-leaf2c,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS7280E and DCS7500E,,NOT RUN, -1294,dc2-leaf2c,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, -1295,dc2-leaf2c,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, -1296,dc2-leaf2c,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, -1297,dc2-leaf2c,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, -1298,dc2-leaf2c,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, -1299,dc2-leaf2c,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -1300,dc2-leaf2c,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -1301,dc2-leaf2c,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, -1302,dc2-leaf2c,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, -1303,dc2-leaf2c,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, -1304,dc2-leaf2c,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - DC2-LEAF2A_Ethernet8 = 'up',NOT RUN, -1305,dc2-leaf2c,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - DC2-LEAF2B_Ethernet8 = 'up',NOT RUN, -1306,dc2-leaf2c,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet5 - dc2-leaf2-server1_iLO = 'up',NOT RUN, -1307,dc2-leaf2c,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel1 - DC2_L3_LEAF2_Po8 = 'up',NOT RUN, -1308,dc2-leaf2c,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, -1309,dc2-leaf2c,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, -1310,dc2-leaf2c,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, -1311,dc2-leaf2c,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, -1312,dc2-leaf2c,Software,VerifyEOSVersion,Verifies the device is running one of the allowed EOS version.,,NOT RUN, -1313,dc2-leaf2c,Software,VerifyTerminAttrVersion,Verifies the device is running one of the allowed TerminAttr version.,,NOT RUN, -1314,dc2-leaf2c,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, -1315,dc2-leaf2c,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, -1316,dc2-leaf2c,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, -1317,dc2-leaf2c,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, -1318,dc2-leaf2c,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, -1319,dc2-leaf2c,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -1320,dc2-leaf2c,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -1321,dc2-leaf2c,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, -1322,dc2-leaf2c,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, -1323,dc2-leaf3a.arista.com,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, -1324,dc2-leaf3a.arista.com,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, -1325,dc2-leaf3a.arista.com,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, -1326,dc2-leaf3a.arista.com,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, -1327,dc2-leaf3a.arista.com,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, -1328,dc2-leaf3a.arista.com,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, -1329,dc2-leaf3a.arista.com,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, -1330,dc2-leaf3a.arista.com,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-spine1 (IP: 10.255.128.11),NOT RUN, -1331,dc2-leaf3a.arista.com,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-spine2 (IP: 10.255.128.12),NOT RUN, -1332,dc2-leaf3a.arista.com,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf3b.arista.com (IP: 10.255.129.125),NOT RUN, -1333,dc2-leaf3a.arista.com,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-spine1 (IP: 10.255.255.120),NOT RUN, -1334,dc2-leaf3a.arista.com,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-spine2 (IP: 10.255.255.122),NOT RUN, -1335,dc2-leaf3a.arista.com,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, -1336,dc2-leaf3a.arista.com,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, -1337,dc2-leaf3a.arista.com,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc2-spine1 Ethernet5,NOT RUN, -1338,dc2-leaf3a.arista.com,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc2-spine2 Ethernet5,NOT RUN, -1339,dc2-leaf3a.arista.com,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet3 - Remote: dc2-leaf3b.arista.com Ethernet3,NOT RUN, -1340,dc2-leaf3a.arista.com,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet4 - Remote: dc2-leaf3b.arista.com Ethernet4,NOT RUN, -1341,dc2-leaf3a.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3),NOT RUN, -1342,dc2-leaf3a.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4),NOT RUN, -1343,dc2-leaf3a.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5),NOT RUN, -1344,dc2-leaf3a.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1),NOT RUN, -1345,dc2-leaf3a.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2),NOT RUN, -1346,dc2-leaf3a.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1),NOT RUN, -1347,dc2-leaf3a.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2),NOT RUN, -1348,dc2-leaf3a.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.17) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13),NOT RUN, -1349,dc2-leaf3a.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.17) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14),NOT RUN, -1350,dc2-leaf3a.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.17) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15),NOT RUN, -1351,dc2-leaf3a.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.17) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16),NOT RUN, -1352,dc2-leaf3a.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.17) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17),NOT RUN, -1353,dc2-leaf3a.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.17) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18),NOT RUN, -1354,dc2-leaf3a.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.17) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11),NOT RUN, -1355,dc2-leaf3a.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.17) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12),NOT RUN, -1356,dc2-leaf3a.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet1 (IP: 10.255.255.121) - Destination: dc2-spine1 Ethernet5 (IP: 10.255.255.120),NOT RUN, -1357,dc2-leaf3a.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet2 (IP: 10.255.255.123) - Destination: dc2-spine2 Ethernet5 (IP: 10.255.255.122),NOT RUN, -1358,dc2-leaf3a.arista.com,Field Notices;Software,VerifyFieldNotice44Resolution,Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization),,NOT RUN, -1359,dc2-leaf3a.arista.com,Field Notices;Software,VerifyFieldNotice72Resolution,"Verifies if the device has exposeure to FN72, and if the issue has been mitigated",,NOT RUN, -1360,dc2-leaf3a.arista.com,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS7280E and DCS7500E,,NOT RUN, -1361,dc2-leaf3a.arista.com,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, -1362,dc2-leaf3a.arista.com,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, -1363,dc2-leaf3a.arista.com,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, -1364,dc2-leaf3a.arista.com,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, -1365,dc2-leaf3a.arista.com,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, -1366,dc2-leaf3a.arista.com,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -1367,dc2-leaf3a.arista.com,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -1368,dc2-leaf3a.arista.com,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, -1369,dc2-leaf3a.arista.com,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, -1370,dc2-leaf3a.arista.com,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, -1371,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - P2P_LINK_TO_DC2-SPINE1_Ethernet5 = 'up',NOT RUN, -1372,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet11 - dc2-leaf3-fw1_e1 = 'up',NOT RUN, -1373,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - P2P_LINK_TO_DC2-SPINE2_Ethernet5 = 'up',NOT RUN, -1374,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet3 - MLAG_PEER_dc2-leaf3b.arista.com_Ethernet3 = 'up',NOT RUN, -1375,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet4 - MLAG_PEER_dc2-leaf3b.arista.com_Ethernet4 = 'up',NOT RUN, -1376,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback0 - EVPN_Overlay_Peering = 'up',NOT RUN, -1377,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up',NOT RUN, -1378,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback10 - VRF10_VTEP_DIAGNOSTICS = 'up',NOT RUN, -1379,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback11 - VRF11_VTEP_DIAGNOSTICS = 'up',NOT RUN, -1380,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel11 - dc2-leaf3-fw1_PortChannel = 'up',NOT RUN, -1381,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel3 - MLAG_PEER_dc2-leaf3b.arista.com_Po3 = 'up',NOT RUN, -1382,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan11 - VRF10_VLAN11 = 'up',NOT RUN, -1383,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan12 - VRF10_VLAN12 = 'up',NOT RUN, -1384,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan21 - VRF11_VLAN21 = 'up',NOT RUN, -1385,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan22 - VRF11_VLAN22 = 'up',NOT RUN, -1386,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan3009 - MLAG_PEER_L3_iBGP: vrf VRF10 = 'up',NOT RUN, -1387,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan3010 - MLAG_PEER_L3_iBGP: vrf VRF11 = 'up',NOT RUN, -1388,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up',NOT RUN, -1389,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4094 - MLAG_PEER = 'up',NOT RUN, -1390,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vxlan1 = 'up',NOT RUN, -1391,dc2-leaf3a.arista.com,Logging,VerifyLoggingAccounting,Verifies if AAA accounting logs are generated.,,NOT RUN, -1392,dc2-leaf3a.arista.com,Logging,VerifyLoggingHostname,Verifies if logs are generated with the device FQDN.,,NOT RUN, -1393,dc2-leaf3a.arista.com,Logging,VerifyLoggingHosts,Verifies logging hosts (syslog servers) for a specified VRF.,,NOT RUN, -1394,dc2-leaf3a.arista.com,Logging,VerifyLoggingLogsGeneration,Verifies if logs are generated.,,NOT RUN, -1395,dc2-leaf3a.arista.com,Logging,VerifyLoggingPersistent,Verifies if logging persistent is enabled and logs are saved in flash.,,NOT RUN, -1396,dc2-leaf3a.arista.com,Logging,VerifyLoggingSourceInt,Verifies logging source-interface for a specified VRF.,,NOT RUN, -1397,dc2-leaf3a.arista.com,Logging,VerifyLoggingTimestamp,Verifies if logs are generated with the appropriate timestamp.,,NOT RUN, -1398,dc2-leaf3a.arista.com,Logging,VerifyLoggingWarning,This test verifies there are no syslog messages with a severity of ERRORS or higher.,,NOT RUN, -1399,dc2-leaf3a.arista.com,MLAG,VerifyMlagConfigSanity,Verifies there are no MLAG config-sanity inconsistencies.,,NOT RUN, -1400,dc2-leaf3a.arista.com,MLAG,VerifyMlagDualPrimary,Verifies the MLAG dual-primary detection parameters.,,NOT RUN, -1401,dc2-leaf3a.arista.com,MLAG,VerifyMlagInterfaces,Verifies there are no inactive or active-partial MLAG ports.,,NOT RUN, -1402,dc2-leaf3a.arista.com,MLAG,VerifyMlagReloadDelay,Verifies the MLAG reload-delay parameters.,,NOT RUN, -1403,dc2-leaf3a.arista.com,MLAG,VerifyMlagStatus,Verifies the health status of the MLAG configuration.,,NOT RUN, -1404,dc2-leaf3a.arista.com,MLAG,VerifyMlagStatus,Verifies the health status of the MLAG configuration.,,NOT RUN, -1405,dc2-leaf3a.arista.com,Multicast;IGMP,VerifyIGMPSnoopingGlobal,Verifies the IGMP snooping global configuration.,,NOT RUN, -1406,dc2-leaf3a.arista.com,Multicast;IGMP,VerifyIGMPSnoopingVlans,Verifies the IGMP snooping configuration for some VLANs.,,NOT RUN, -1407,dc2-leaf3a.arista.com,Routing,VerifyRoutingProtocolModel,Verifies the configured routing protocol model.,Routing protocol model: multi-agent,NOT RUN, -1408,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.1 - Peer: dc1-spine1,NOT RUN, -1409,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.2 - Peer: dc1-spine2,NOT RUN, -1410,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.3 - Peer: dc1-leaf1a,NOT RUN, -1411,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.4 - Peer: dc1-leaf1b,NOT RUN, -1412,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.5 - Peer: dc1-leaf2a,NOT RUN, -1413,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.3 - Peer: dc1-leaf1a,NOT RUN, -1414,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.5 - Peer: dc1-leaf2a,NOT RUN, -1415,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.11 - Peer: dc2-spine1,NOT RUN, -1416,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.12 - Peer: dc2-spine2,NOT RUN, -1417,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.13 - Peer: dc2-leaf1a,NOT RUN, -1418,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.14 - Peer: dc2-leaf1b,NOT RUN, -1419,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.15 - Peer: dc2-leaf2a,NOT RUN, -1420,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.16 - Peer: dc2-leaf2b,NOT RUN, -1421,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, -1422,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com,NOT RUN, -1423,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.13 - Peer: dc2-leaf1a,NOT RUN, -1424,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.15 - Peer: dc2-leaf2a,NOT RUN, -1425,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, -1426,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.1 - Peer: dc1-wan1,NOT RUN, -1427,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.2 - Peer: dc1-wan2,NOT RUN, -1428,dc2-leaf3a.arista.com,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, -1429,dc2-leaf3a.arista.com,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, -1430,dc2-leaf3a.arista.com,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, -1431,dc2-leaf3a.arista.com,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, -1432,dc2-leaf3a.arista.com,Software,VerifyEOSVersion,Verifies the device is running one of the allowed EOS version.,,NOT RUN, -1433,dc2-leaf3a.arista.com,Software,VerifyTerminAttrVersion,Verifies the device is running one of the allowed TerminAttr version.,,NOT RUN, -1434,dc2-leaf3a.arista.com,STP,VerifySTPBlockedPorts,Verifies there is no STP blocked ports.,,NOT RUN, -1435,dc2-leaf3a.arista.com,STP,VerifySTPCounters,Verifies there is no errors in STP BPDU packets.,,NOT RUN, -1436,dc2-leaf3a.arista.com,STP,VerifySTPForwardingPorts,Verifies that all interfaces are forwarding for a provided list of VLAN(s).,,NOT RUN, -1437,dc2-leaf3a.arista.com,STP,VerifySTPMode,Verifies the configured STP mode for a provided list of VLAN(s).,,NOT RUN, -1438,dc2-leaf3a.arista.com,STP,VerifySTPRootPriority,Verifies the STP root priority for a provided list of VLAN or MST instance ID(s).,,NOT RUN, -1439,dc2-leaf3a.arista.com,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, -1440,dc2-leaf3a.arista.com,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, -1441,dc2-leaf3a.arista.com,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, -1442,dc2-leaf3a.arista.com,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, -1443,dc2-leaf3a.arista.com,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, -1444,dc2-leaf3a.arista.com,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -1445,dc2-leaf3a.arista.com,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -1446,dc2-leaf3a.arista.com,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, -1447,dc2-leaf3a.arista.com,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, -1448,dc2-leaf3b.arista.com,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, -1449,dc2-leaf3b.arista.com,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, -1450,dc2-leaf3b.arista.com,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, -1451,dc2-leaf3b.arista.com,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, -1452,dc2-leaf3b.arista.com,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, -1453,dc2-leaf3b.arista.com,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, -1454,dc2-leaf3b.arista.com,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, -1455,dc2-leaf3b.arista.com,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-spine1 (IP: 10.255.128.11),NOT RUN, -1456,dc2-leaf3b.arista.com,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-spine2 (IP: 10.255.128.12),NOT RUN, -1457,dc2-leaf3b.arista.com,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf3a.arista.com (IP: 10.255.129.124),NOT RUN, -1458,dc2-leaf3b.arista.com,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-spine1 (IP: 10.255.255.124),NOT RUN, -1459,dc2-leaf3b.arista.com,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-spine2 (IP: 10.255.255.126),NOT RUN, -1460,dc2-leaf3b.arista.com,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, -1461,dc2-leaf3b.arista.com,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, -1462,dc2-leaf3b.arista.com,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc2-spine1 Ethernet6,NOT RUN, -1463,dc2-leaf3b.arista.com,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc2-spine2 Ethernet6,NOT RUN, -1464,dc2-leaf3b.arista.com,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet3 - Remote: dc2-leaf3a.arista.com Ethernet3,NOT RUN, -1465,dc2-leaf3b.arista.com,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet4 - Remote: dc2-leaf3a.arista.com Ethernet4,NOT RUN, -1466,dc2-leaf3b.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3),NOT RUN, -1467,dc2-leaf3b.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4),NOT RUN, -1468,dc2-leaf3b.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5),NOT RUN, -1469,dc2-leaf3b.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1),NOT RUN, -1470,dc2-leaf3b.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2),NOT RUN, -1471,dc2-leaf3b.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1),NOT RUN, -1472,dc2-leaf3b.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2),NOT RUN, -1473,dc2-leaf3b.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.18) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13),NOT RUN, -1474,dc2-leaf3b.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.18) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14),NOT RUN, -1475,dc2-leaf3b.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.18) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15),NOT RUN, -1476,dc2-leaf3b.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.18) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16),NOT RUN, -1477,dc2-leaf3b.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.18) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17),NOT RUN, -1478,dc2-leaf3b.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.18) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18),NOT RUN, -1479,dc2-leaf3b.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.18) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11),NOT RUN, -1480,dc2-leaf3b.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.18) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12),NOT RUN, -1481,dc2-leaf3b.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet1 (IP: 10.255.255.125) - Destination: dc2-spine1 Ethernet6 (IP: 10.255.255.124),NOT RUN, -1482,dc2-leaf3b.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet2 (IP: 10.255.255.127) - Destination: dc2-spine2 Ethernet6 (IP: 10.255.255.126),NOT RUN, -1483,dc2-leaf3b.arista.com,Field Notices;Software,VerifyFieldNotice44Resolution,Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization),,NOT RUN, -1484,dc2-leaf3b.arista.com,Field Notices;Software,VerifyFieldNotice72Resolution,"Verifies if the device has exposeure to FN72, and if the issue has been mitigated",,NOT RUN, -1485,dc2-leaf3b.arista.com,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS7280E and DCS7500E,,NOT RUN, -1486,dc2-leaf3b.arista.com,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, -1487,dc2-leaf3b.arista.com,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, -1488,dc2-leaf3b.arista.com,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, -1489,dc2-leaf3b.arista.com,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, -1490,dc2-leaf3b.arista.com,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, -1491,dc2-leaf3b.arista.com,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -1492,dc2-leaf3b.arista.com,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -1493,dc2-leaf3b.arista.com,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, -1494,dc2-leaf3b.arista.com,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, -1495,dc2-leaf3b.arista.com,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, -1496,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - P2P_LINK_TO_DC2-SPINE1_Ethernet6 = 'up',NOT RUN, -1497,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet11 - dc2-leaf3-fw1_e1 = 'adminDown',NOT RUN, -1498,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - P2P_LINK_TO_DC2-SPINE2_Ethernet6 = 'up',NOT RUN, -1499,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet3 - MLAG_PEER_dc2-leaf3a.arista.com_Ethernet3 = 'up',NOT RUN, -1500,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet4 - MLAG_PEER_dc2-leaf3a.arista.com_Ethernet4 = 'up',NOT RUN, -1501,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback0 - EVPN_Overlay_Peering = 'up',NOT RUN, -1502,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up',NOT RUN, -1503,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback10 - VRF10_VTEP_DIAGNOSTICS = 'up',NOT RUN, -1504,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback11 - VRF11_VTEP_DIAGNOSTICS = 'up',NOT RUN, -1505,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel11 - dc2-leaf3-fw1_PortChannel = 'up',NOT RUN, -1506,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel3 - MLAG_PEER_dc2-leaf3a.arista.com_Po3 = 'up',NOT RUN, -1507,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan11 - VRF10_VLAN11 = 'up',NOT RUN, -1508,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan12 - VRF10_VLAN12 = 'up',NOT RUN, -1509,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan21 - VRF11_VLAN21 = 'up',NOT RUN, -1510,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan22 - VRF11_VLAN22 = 'up',NOT RUN, -1511,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan3009 - MLAG_PEER_L3_iBGP: vrf VRF10 = 'up',NOT RUN, -1512,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan3010 - MLAG_PEER_L3_iBGP: vrf VRF11 = 'up',NOT RUN, -1513,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up',NOT RUN, -1514,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4094 - MLAG_PEER = 'up',NOT RUN, -1515,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vxlan1 = 'up',NOT RUN, -1516,dc2-leaf3b.arista.com,Logging,VerifyLoggingAccounting,Verifies if AAA accounting logs are generated.,,NOT RUN, -1517,dc2-leaf3b.arista.com,Logging,VerifyLoggingHostname,Verifies if logs are generated with the device FQDN.,,NOT RUN, -1518,dc2-leaf3b.arista.com,Logging,VerifyLoggingHosts,Verifies logging hosts (syslog servers) for a specified VRF.,,NOT RUN, -1519,dc2-leaf3b.arista.com,Logging,VerifyLoggingLogsGeneration,Verifies if logs are generated.,,NOT RUN, -1520,dc2-leaf3b.arista.com,Logging,VerifyLoggingPersistent,Verifies if logging persistent is enabled and logs are saved in flash.,,NOT RUN, -1521,dc2-leaf3b.arista.com,Logging,VerifyLoggingSourceInt,Verifies logging source-interface for a specified VRF.,,NOT RUN, -1522,dc2-leaf3b.arista.com,Logging,VerifyLoggingTimestamp,Verifies if logs are generated with the appropriate timestamp.,,NOT RUN, -1523,dc2-leaf3b.arista.com,Logging,VerifyLoggingWarning,This test verifies there are no syslog messages with a severity of ERRORS or higher.,,NOT RUN, -1524,dc2-leaf3b.arista.com,MLAG,VerifyMlagConfigSanity,Verifies there are no MLAG config-sanity inconsistencies.,,NOT RUN, -1525,dc2-leaf3b.arista.com,MLAG,VerifyMlagDualPrimary,Verifies the MLAG dual-primary detection parameters.,,NOT RUN, -1526,dc2-leaf3b.arista.com,MLAG,VerifyMlagInterfaces,Verifies there are no inactive or active-partial MLAG ports.,,NOT RUN, -1527,dc2-leaf3b.arista.com,MLAG,VerifyMlagReloadDelay,Verifies the MLAG reload-delay parameters.,,NOT RUN, -1528,dc2-leaf3b.arista.com,MLAG,VerifyMlagStatus,Verifies the health status of the MLAG configuration.,,NOT RUN, -1529,dc2-leaf3b.arista.com,MLAG,VerifyMlagStatus,Verifies the health status of the MLAG configuration.,,NOT RUN, -1530,dc2-leaf3b.arista.com,Multicast;IGMP,VerifyIGMPSnoopingGlobal,Verifies the IGMP snooping global configuration.,,NOT RUN, -1531,dc2-leaf3b.arista.com,Multicast;IGMP,VerifyIGMPSnoopingVlans,Verifies the IGMP snooping configuration for some VLANs.,,NOT RUN, -1532,dc2-leaf3b.arista.com,Routing,VerifyRoutingProtocolModel,Verifies the configured routing protocol model.,Routing protocol model: multi-agent,NOT RUN, -1533,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.1 - Peer: dc1-spine1,NOT RUN, -1534,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.2 - Peer: dc1-spine2,NOT RUN, -1535,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.3 - Peer: dc1-leaf1a,NOT RUN, -1536,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.4 - Peer: dc1-leaf1b,NOT RUN, -1537,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.5 - Peer: dc1-leaf2a,NOT RUN, -1538,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.3 - Peer: dc1-leaf1a,NOT RUN, -1539,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.5 - Peer: dc1-leaf2a,NOT RUN, -1540,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.11 - Peer: dc2-spine1,NOT RUN, -1541,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.12 - Peer: dc2-spine2,NOT RUN, -1542,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.13 - Peer: dc2-leaf1a,NOT RUN, -1543,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.14 - Peer: dc2-leaf1b,NOT RUN, -1544,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.15 - Peer: dc2-leaf2a,NOT RUN, -1545,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.16 - Peer: dc2-leaf2b,NOT RUN, -1546,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, -1547,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com,NOT RUN, -1548,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.13 - Peer: dc2-leaf1a,NOT RUN, -1549,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.15 - Peer: dc2-leaf2a,NOT RUN, -1550,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, -1551,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.1 - Peer: dc1-wan1,NOT RUN, -1552,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.2 - Peer: dc1-wan2,NOT RUN, -1553,dc2-leaf3b.arista.com,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, -1554,dc2-leaf3b.arista.com,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, -1555,dc2-leaf3b.arista.com,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, -1556,dc2-leaf3b.arista.com,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, -1557,dc2-leaf3b.arista.com,Software,VerifyEOSVersion,Verifies the device is running one of the allowed EOS version.,,NOT RUN, -1558,dc2-leaf3b.arista.com,Software,VerifyTerminAttrVersion,Verifies the device is running one of the allowed TerminAttr version.,,NOT RUN, -1559,dc2-leaf3b.arista.com,STP,VerifySTPBlockedPorts,Verifies there is no STP blocked ports.,,NOT RUN, -1560,dc2-leaf3b.arista.com,STP,VerifySTPCounters,Verifies there is no errors in STP BPDU packets.,,NOT RUN, -1561,dc2-leaf3b.arista.com,STP,VerifySTPForwardingPorts,Verifies that all interfaces are forwarding for a provided list of VLAN(s).,,NOT RUN, -1562,dc2-leaf3b.arista.com,STP,VerifySTPMode,Verifies the configured STP mode for a provided list of VLAN(s).,,NOT RUN, -1563,dc2-leaf3b.arista.com,STP,VerifySTPRootPriority,Verifies the STP root priority for a provided list of VLAN or MST instance ID(s).,,NOT RUN, -1564,dc2-leaf3b.arista.com,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, -1565,dc2-leaf3b.arista.com,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, -1566,dc2-leaf3b.arista.com,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, -1567,dc2-leaf3b.arista.com,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, -1568,dc2-leaf3b.arista.com,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, -1569,dc2-leaf3b.arista.com,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -1570,dc2-leaf3b.arista.com,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -1571,dc2-leaf3b.arista.com,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, -1572,dc2-leaf3b.arista.com,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, -1573,dc2-spine1,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, -1574,dc2-spine1,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, -1575,dc2-spine1,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, -1576,dc2-spine1,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, -1577,dc2-spine1,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, -1578,dc2-spine1,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, -1579,dc2-spine1,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, -1580,dc2-spine1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-leaf1a (IP: 10.255.128.13),NOT RUN, -1581,dc2-spine1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-leaf1b (IP: 10.255.128.14),NOT RUN, -1582,dc2-spine1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-leaf2a (IP: 10.255.128.15),NOT RUN, -1583,dc2-spine1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-leaf2b (IP: 10.255.128.16),NOT RUN, -1584,dc2-spine1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-leaf3a.arista.com (IP: 10.255.128.17),NOT RUN, -1585,dc2-spine1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-leaf3b.arista.com (IP: 10.255.128.18),NOT RUN, -1586,dc2-spine1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf1a (IP: 10.255.255.105),NOT RUN, -1587,dc2-spine1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf1b (IP: 10.255.255.109),NOT RUN, -1588,dc2-spine1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf2a (IP: 10.255.255.113),NOT RUN, -1589,dc2-spine1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf2b (IP: 10.255.255.117),NOT RUN, -1590,dc2-spine1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf3a.arista.com (IP: 10.255.255.121),NOT RUN, -1591,dc2-spine1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf3b.arista.com (IP: 10.255.255.125),NOT RUN, -1592,dc2-spine1,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, -1593,dc2-spine1,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, -1594,dc2-spine1,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc2-leaf1a Ethernet1,NOT RUN, -1595,dc2-spine1,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc2-leaf1b Ethernet1,NOT RUN, -1596,dc2-spine1,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet3 - Remote: dc2-leaf2a Ethernet1,NOT RUN, -1597,dc2-spine1,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet4 - Remote: dc2-leaf2b Ethernet1,NOT RUN, -1598,dc2-spine1,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet5 - Remote: dc2-leaf3a.arista.com Ethernet1,NOT RUN, -1599,dc2-spine1,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet6 - Remote: dc2-leaf3b.arista.com Ethernet1,NOT RUN, -1600,dc2-spine1,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet1 (IP: 10.255.255.104) - Destination: dc2-leaf1a Ethernet1 (IP: 10.255.255.105),NOT RUN, -1601,dc2-spine1,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet2 (IP: 10.255.255.108) - Destination: dc2-leaf1b Ethernet1 (IP: 10.255.255.109),NOT RUN, -1602,dc2-spine1,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet3 (IP: 10.255.255.112) - Destination: dc2-leaf2a Ethernet1 (IP: 10.255.255.113),NOT RUN, -1603,dc2-spine1,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet4 (IP: 10.255.255.116) - Destination: dc2-leaf2b Ethernet1 (IP: 10.255.255.117),NOT RUN, -1604,dc2-spine1,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet5 (IP: 10.255.255.120) - Destination: dc2-leaf3a.arista.com Ethernet1 (IP: 10.255.255.121),NOT RUN, -1605,dc2-spine1,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet6 (IP: 10.255.255.124) - Destination: dc2-leaf3b.arista.com Ethernet1 (IP: 10.255.255.125),NOT RUN, -1606,dc2-spine1,Field Notices;Software,VerifyFieldNotice44Resolution,Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization),,NOT RUN, -1607,dc2-spine1,Field Notices;Software,VerifyFieldNotice72Resolution,"Verifies if the device has exposeure to FN72, and if the issue has been mitigated",,NOT RUN, -1608,dc2-spine1,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS7280E and DCS7500E,,NOT RUN, -1609,dc2-spine1,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, -1610,dc2-spine1,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, -1611,dc2-spine1,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, -1612,dc2-spine1,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, -1613,dc2-spine1,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, -1614,dc2-spine1,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -1615,dc2-spine1,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -1616,dc2-spine1,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, -1617,dc2-spine1,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, -1618,dc2-spine1,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, -1619,dc2-spine1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - P2P_LINK_TO_DC2-LEAF1A_Ethernet1 = 'up',NOT RUN, -1620,dc2-spine1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - P2P_LINK_TO_DC2-LEAF1B_Ethernet1 = 'up',NOT RUN, -1621,dc2-spine1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet3 - P2P_LINK_TO_DC2-LEAF2A_Ethernet1 = 'up',NOT RUN, -1622,dc2-spine1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet4 - P2P_LINK_TO_DC2-LEAF2B_Ethernet1 = 'up',NOT RUN, -1623,dc2-spine1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet5 - P2P_LINK_TO_DC2-LEAF3A.ARISTA.COM_Ethernet1 = 'up',NOT RUN, -1624,dc2-spine1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet6 - P2P_LINK_TO_DC2-LEAF3B.ARISTA.COM_Ethernet1 = 'up',NOT RUN, -1625,dc2-spine1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback0 - EVPN_Overlay_Peering = 'up',NOT RUN, -1626,dc2-spine1,Routing,VerifyRoutingProtocolModel,Verifies the configured routing protocol model.,Routing protocol model: multi-agent,NOT RUN, -1627,dc2-spine1,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, -1628,dc2-spine1,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, -1629,dc2-spine1,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, -1630,dc2-spine1,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, -1631,dc2-spine1,Software,VerifyEOSVersion,Verifies the device is running one of the allowed EOS version.,,NOT RUN, -1632,dc2-spine1,Software,VerifyTerminAttrVersion,Verifies the device is running one of the allowed TerminAttr version.,,NOT RUN, -1633,dc2-spine1,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, -1634,dc2-spine1,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, -1635,dc2-spine1,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, -1636,dc2-spine1,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, -1637,dc2-spine1,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, -1638,dc2-spine1,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -1639,dc2-spine1,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -1640,dc2-spine1,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, -1641,dc2-spine1,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, -1642,dc2-spine2,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, -1643,dc2-spine2,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, -1644,dc2-spine2,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, -1645,dc2-spine2,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, -1646,dc2-spine2,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, -1647,dc2-spine2,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, -1648,dc2-spine2,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, -1649,dc2-spine2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-leaf1a (IP: 10.255.128.13),NOT RUN, -1650,dc2-spine2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-leaf1b (IP: 10.255.128.14),NOT RUN, -1651,dc2-spine2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-leaf2a (IP: 10.255.128.15),NOT RUN, -1652,dc2-spine2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-leaf2b (IP: 10.255.128.16),NOT RUN, -1653,dc2-spine2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-leaf3a.arista.com (IP: 10.255.128.17),NOT RUN, -1654,dc2-spine2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-leaf3b.arista.com (IP: 10.255.128.18),NOT RUN, -1655,dc2-spine2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf1a (IP: 10.255.255.107),NOT RUN, -1656,dc2-spine2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf1b (IP: 10.255.255.111),NOT RUN, -1657,dc2-spine2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf2a (IP: 10.255.255.115),NOT RUN, -1658,dc2-spine2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf2b (IP: 10.255.255.119),NOT RUN, -1659,dc2-spine2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf3a.arista.com (IP: 10.255.255.123),NOT RUN, -1660,dc2-spine2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf3b.arista.com (IP: 10.255.255.127),NOT RUN, -1661,dc2-spine2,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, -1662,dc2-spine2,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, -1663,dc2-spine2,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc2-leaf1a Ethernet2,NOT RUN, -1664,dc2-spine2,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc2-leaf1b Ethernet2,NOT RUN, -1665,dc2-spine2,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet3 - Remote: dc2-leaf2a Ethernet2,NOT RUN, -1666,dc2-spine2,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet4 - Remote: dc2-leaf2b Ethernet2,NOT RUN, -1667,dc2-spine2,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet5 - Remote: dc2-leaf3a.arista.com Ethernet2,NOT RUN, -1668,dc2-spine2,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet6 - Remote: dc2-leaf3b.arista.com Ethernet2,NOT RUN, -1669,dc2-spine2,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet1 (IP: 10.255.255.106) - Destination: dc2-leaf1a Ethernet2 (IP: 10.255.255.107),NOT RUN, -1670,dc2-spine2,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet2 (IP: 10.255.255.110) - Destination: dc2-leaf1b Ethernet2 (IP: 10.255.255.111),NOT RUN, -1671,dc2-spine2,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet3 (IP: 10.255.255.114) - Destination: dc2-leaf2a Ethernet2 (IP: 10.255.255.115),NOT RUN, -1672,dc2-spine2,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet4 (IP: 10.255.255.118) - Destination: dc2-leaf2b Ethernet2 (IP: 10.255.255.119),NOT RUN, -1673,dc2-spine2,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet5 (IP: 10.255.255.122) - Destination: dc2-leaf3a.arista.com Ethernet2 (IP: 10.255.255.123),NOT RUN, -1674,dc2-spine2,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet6 (IP: 10.255.255.126) - Destination: dc2-leaf3b.arista.com Ethernet2 (IP: 10.255.255.127),NOT RUN, -1675,dc2-spine2,Field Notices;Software,VerifyFieldNotice44Resolution,Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization),,NOT RUN, -1676,dc2-spine2,Field Notices;Software,VerifyFieldNotice72Resolution,"Verifies if the device has exposeure to FN72, and if the issue has been mitigated",,NOT RUN, -1677,dc2-spine2,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS7280E and DCS7500E,,NOT RUN, -1678,dc2-spine2,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, -1679,dc2-spine2,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, -1680,dc2-spine2,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, -1681,dc2-spine2,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, -1682,dc2-spine2,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, -1683,dc2-spine2,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -1684,dc2-spine2,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, -1685,dc2-spine2,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, -1686,dc2-spine2,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, -1687,dc2-spine2,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, -1688,dc2-spine2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - P2P_LINK_TO_DC2-LEAF1A_Ethernet2 = 'up',NOT RUN, -1689,dc2-spine2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - P2P_LINK_TO_DC2-LEAF1B_Ethernet2 = 'up',NOT RUN, -1690,dc2-spine2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet3 - P2P_LINK_TO_DC2-LEAF2A_Ethernet2 = 'up',NOT RUN, -1691,dc2-spine2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet4 - P2P_LINK_TO_DC2-LEAF2B_Ethernet2 = 'up',NOT RUN, -1692,dc2-spine2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet5 - P2P_LINK_TO_DC2-LEAF3A.ARISTA.COM_Ethernet2 = 'up',NOT RUN, -1693,dc2-spine2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet6 - P2P_LINK_TO_DC2-LEAF3B.ARISTA.COM_Ethernet2 = 'up',NOT RUN, -1694,dc2-spine2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback0 - EVPN_Overlay_Peering = 'up',NOT RUN, -1695,dc2-spine2,Routing,VerifyRoutingProtocolModel,Verifies the configured routing protocol model.,Routing protocol model: multi-agent,NOT RUN, -1696,dc2-spine2,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, -1697,dc2-spine2,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, -1698,dc2-spine2,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, -1699,dc2-spine2,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, -1700,dc2-spine2,Software,VerifyEOSVersion,Verifies the device is running one of the allowed EOS version.,,NOT RUN, -1701,dc2-spine2,Software,VerifyTerminAttrVersion,Verifies the device is running one of the allowed TerminAttr version.,,NOT RUN, -1702,dc2-spine2,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, -1703,dc2-spine2,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, -1704,dc2-spine2,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, -1705,dc2-spine2,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, -1706,dc2-spine2,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, -1707,dc2-spine2,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -1708,dc2-spine2,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, -1709,dc2-spine2,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, -1710,dc2-spine2,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, +8,dc1-leaf1a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: 10.1.1.1,NOT RUN, +9,dc1-leaf1a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc1-spine1 (IP: 10.255.0.1),NOT RUN, +10,dc1-leaf1a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc1-spine2 (IP: 10.255.0.2),NOT RUN, +11,dc1-leaf1a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-leaf1b (IP: 10.255.1.97),NOT RUN, +12,dc1-leaf1a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-spine1 (IP: 10.255.255.0),NOT RUN, +13,dc1-leaf1a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-spine2 (IP: 10.255.255.2),NOT RUN, +14,dc1-leaf1a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-wan1 (IP: 10.255.255.1),NOT RUN, +15,dc1-leaf1a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-wan2 (IP: 10.255.255.5),NOT RUN, +16,dc1-leaf1a,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, +17,dc1-leaf1a,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, +18,dc1-leaf1a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc1-spine1 Ethernet1,NOT RUN, +19,dc1-leaf1a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc1-spine2 Ethernet1,NOT RUN, +20,dc1-leaf1a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet3 - Remote: dc1-leaf1b Ethernet3,NOT RUN, +21,dc1-leaf1a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet4 - Remote: dc1-leaf1b Ethernet4,NOT RUN, +22,dc1-leaf1a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet6 - Remote: dc1-wan1 Ethernet1,NOT RUN, +23,dc1-leaf1a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet7 - Remote: dc1-wan2 Ethernet1,NOT RUN, +24,dc1-leaf1a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet8 - Remote: dc1-leaf1c Ethernet1,NOT RUN, +25,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3),NOT RUN, +26,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4),NOT RUN, +27,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5),NOT RUN, +28,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1),NOT RUN, +29,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2),NOT RUN, +30,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5),NOT RUN, +31,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6),NOT RUN, +32,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1),NOT RUN, +33,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2),NOT RUN, +34,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.3) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13),NOT RUN, +35,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.3) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14),NOT RUN, +36,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.3) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15),NOT RUN, +37,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.3) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16),NOT RUN, +38,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.3) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17),NOT RUN, +39,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.3) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18),NOT RUN, +40,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.3) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11),NOT RUN, +41,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.3) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12),NOT RUN, +42,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet1 (IP: 10.255.255.1) - Destination: dc1-spine1 Ethernet1 (IP: 10.255.255.0),NOT RUN, +43,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet2 (IP: 10.255.255.3) - Destination: dc1-spine2 Ethernet1 (IP: 10.255.255.2),NOT RUN, +44,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet6 (IP: 10.255.255.0) - Destination: dc1-wan1 Ethernet1 (IP: 10.255.255.1),NOT RUN, +45,dc1-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet7 (IP: 10.255.255.4) - Destination: dc1-wan2 Ethernet1 (IP: 10.255.255.5),NOT RUN, +46,dc1-leaf1a,Field Notices,VerifyFieldNotice44Resolution,Verifies that the device is using the correct Aboot version per FN0044.,,NOT RUN, +47,dc1-leaf1a,Field Notices,VerifyFieldNotice72Resolution,"Verifies if the device is exposed to FN0072, and if the issue has been mitigated.",,NOT RUN, +48,dc1-leaf1a,Greent,VerifyGreenT,Verifies if a GreenT policy is created.,,NOT RUN, +49,dc1-leaf1a,Greent,VerifyGreenTCounters,Verifies if the GreenT counters are incremented.,,NOT RUN, +50,dc1-leaf1a,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches.,,NOT RUN, +51,dc1-leaf1a,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, +52,dc1-leaf1a,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,"Accepted States: 'ok', 'Not Present'",NOT RUN, +53,dc1-leaf1a,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, +54,dc1-leaf1a,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,"Accepted States: 'ok', 'Not Present'",NOT RUN, +55,dc1-leaf1a,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, +56,dc1-leaf1a,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +57,dc1-leaf1a,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +58,dc1-leaf1a,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, +59,dc1-leaf1a,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arastra, Inc.', 'Arista Networks', 'Generic', 'Not Present'",NOT RUN, +60,dc1-leaf1a,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, +61,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - P2P_LINK_TO_DC1-SPINE1_Ethernet1 = 'up',NOT RUN, +62,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - P2P_LINK_TO_DC1-SPINE2_Ethernet1 = 'up',NOT RUN, +63,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet3 - MLAG_PEER_dc1-leaf1b_Ethernet3 = 'up',NOT RUN, +64,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet4 - MLAG_PEER_dc1-leaf1b_Ethernet4 = 'up',NOT RUN, +65,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet5 - dc1-leaf1-server1_PCI1 = 'up',NOT RUN, +66,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet6 - P2P_LINK_TO_DC1-WAN1_Ethernet1 = 'up',NOT RUN, +67,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet7 - P2P_LINK_TO_DC1-WAN2_Ethernet1 = 'up',NOT RUN, +68,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet8 - DC1-LEAF1C_Ethernet1 = 'up',NOT RUN, +69,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback0 - EVPN_Overlay_Peering = 'up',NOT RUN, +70,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up',NOT RUN, +71,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback10 - VRF10_VTEP_DIAGNOSTICS = 'up',NOT RUN, +72,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback11 - VRF11_VTEP_DIAGNOSTICS = 'up',NOT RUN, +73,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel3 - MLAG_PEER_dc1-leaf1b_Po3 = 'up',NOT RUN, +74,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel5 - dc1-leaf1-server1_PortChannel dc1-leaf1-server1 = 'up',NOT RUN, +75,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel8 - DC1-LEAF1C_Po1 = 'up',NOT RUN, +76,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan11 - VRF10_VLAN11 = 'up',NOT RUN, +77,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan12 - VRF10_VLAN12 = 'up',NOT RUN, +78,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan21 - VRF11_VLAN21 = 'up',NOT RUN, +79,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan22 - VRF11_VLAN22 = 'up',NOT RUN, +80,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan3009 - MLAG_PEER_L3_iBGP: vrf VRF10 = 'up',NOT RUN, +81,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan3010 - MLAG_PEER_L3_iBGP: vrf VRF11 = 'up',NOT RUN, +82,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4085 - Inband Management = 'up',NOT RUN, +83,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up',NOT RUN, +84,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4094 - MLAG_PEER = 'up',NOT RUN, +85,dc1-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vxlan1 = 'up',NOT RUN, +86,dc1-leaf1a,LANZ,VerifyLANZ,Verifies if LANZ is enabled.,,NOT RUN, +87,dc1-leaf1a,MLAG,VerifyMlagStatus,Verifies the health status of the MLAG configuration.,,NOT RUN, +88,dc1-leaf1a,Profiles,VerifyTcamProfile,Verifies the device TCAM profile.,,NOT RUN, +89,dc1-leaf1a,Profiles,VerifyUnifiedForwardingTableMode,Verifies the device is using the expected UFT mode.,,NOT RUN, +90,dc1-leaf1a,PTP,VerifyPtpGMStatus,Verifies that the device is locked to a valid PTP Grandmaster.,,NOT RUN, +91,dc1-leaf1a,PTP,VerifyPtpLockStatus,Verifies that the device was locked to the upstream PTP GM in the last minute.,,NOT RUN, +92,dc1-leaf1a,PTP,VerifyPtpModeStatus,Verifies that the device is configured as a PTP Boundary Clock.,,NOT RUN, +93,dc1-leaf1a,PTP,VerifyPtpOffset,Verifies that the PTP timing offset is within +/- 1000ns from the master clock.,,NOT RUN, +94,dc1-leaf1a,PTP,VerifyPtpPortModeStatus,Verifies the PTP interfaces state.,,NOT RUN, +95,dc1-leaf1a,Routing,VerifyRoutingProtocolModel,Verifies the configured routing protocol model.,Routing protocol model: multi-agent,NOT RUN, +96,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.1 - Peer: dc1-spine1,NOT RUN, +97,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.2 - Peer: dc1-spine2,NOT RUN, +98,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.3 - Peer: dc1-leaf1a,NOT RUN, +99,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.4 - Peer: dc1-leaf1b,NOT RUN, +100,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.5 - Peer: dc1-leaf2a,NOT RUN, +101,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.3 - Peer: dc1-leaf1a,NOT RUN, +102,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.5 - Peer: dc1-leaf2a,NOT RUN, +103,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.11 - Peer: dc2-spine1,NOT RUN, +104,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.12 - Peer: dc2-spine2,NOT RUN, +105,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.13 - Peer: dc2-leaf1a,NOT RUN, +106,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.14 - Peer: dc2-leaf1b,NOT RUN, +107,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.15 - Peer: dc2-leaf2a,NOT RUN, +108,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.16 - Peer: dc2-leaf2b,NOT RUN, +109,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, +110,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com,NOT RUN, +111,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.13 - Peer: dc2-leaf1a,NOT RUN, +112,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.15 - Peer: dc2-leaf2a,NOT RUN, +113,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, +114,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.1 - Peer: dc1-wan1,NOT RUN, +115,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.2 - Peer: dc1-wan2,NOT RUN, +116,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.33.0.5 - Peer: dc1-svc-leaf1a,NOT RUN, +117,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.33.0.6 - Peer: dc1-svc-leaf1b,NOT RUN, +118,dc1-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.33.1.5 - Peer: dc1-svc-leaf1a,NOT RUN, +119,dc1-leaf1a,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,,NOT RUN, +120,dc1-leaf1a,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, +121,dc1-leaf1a,Security,VerifyAPIHttpStatus,Verifies if eAPI HTTP server is disabled globally.,,NOT RUN, +122,dc1-leaf1a,Security,VerifyAPIIPv4Acl,Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF.,,NOT RUN, +123,dc1-leaf1a,Security,VerifyAPIIPv6Acl,Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF.,,NOT RUN, +124,dc1-leaf1a,Security,VerifyAPISSLCertificate,"Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size.",,NOT RUN, +125,dc1-leaf1a,Security,VerifyBannerLogin,Verifies the login banner of a device.,,NOT RUN, +126,dc1-leaf1a,Security,VerifyBannerMotd,Verifies the motd banner of a device.,,NOT RUN, +127,dc1-leaf1a,Security,VerifyIPSecConnHealth,Verifies all IPv4 security connections.,,NOT RUN, +128,dc1-leaf1a,Security,VerifyIPv4ACL,Verifies the configuration of IPv4 ACLs.,,NOT RUN, +129,dc1-leaf1a,Security,VerifySpecificIPSecConn,Verifies IPv4 security connections for a peer.,,NOT RUN, +130,dc1-leaf1a,Security,VerifySSHIPv4Acl,Verifies if the SSHD agent has IPv4 ACL(s) configured.,,NOT RUN, +131,dc1-leaf1a,Security,VerifySSHIPv6Acl,Verifies if the SSHD agent has IPv6 ACL(s) configured.,,NOT RUN, +132,dc1-leaf1a,Security,VerifySSHStatus,Verifies if the SSHD agent is disabled in the default VRF.,,NOT RUN, +133,dc1-leaf1a,Security,VerifyTelnetStatus,Verifies if Telnet is disabled in the default VRF.,,NOT RUN, +134,dc1-leaf1a,Services,VerifyDNSLookup,Verifies the DNS name to IP address resolution.,,NOT RUN, +135,dc1-leaf1a,Services,VerifyDNSServers,Verifies if the DNS servers are correctly configured.,,NOT RUN, +136,dc1-leaf1a,Services,VerifyErrdisableRecovery,"Verifies the errdisable recovery reason, status, and interval.",,NOT RUN, +137,dc1-leaf1a,Services,VerifyHostname,Verifies the hostname of a device.,,NOT RUN, +138,dc1-leaf1a,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, +139,dc1-leaf1a,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, +140,dc1-leaf1a,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, +141,dc1-leaf1a,Software,VerifyEOSExtensions,Verifies that all EOS extensions installed on the device are enabled for boot persistence.,,NOT RUN, +142,dc1-leaf1a,Software,VerifyEOSVersion,Verifies the EOS version of the device.,,NOT RUN, +143,dc1-leaf1a,Software,VerifyTerminAttrVersion,Verifies the TerminAttr version of the device.,,NOT RUN, +144,dc1-leaf1a,STUN,VerifyStunClient,Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided.,,NOT RUN, +145,dc1-leaf1a,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, +146,dc1-leaf1a,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, +147,dc1-leaf1a,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, +148,dc1-leaf1a,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, +149,dc1-leaf1a,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, +150,dc1-leaf1a,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +151,dc1-leaf1a,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +152,dc1-leaf1a,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, +153,dc1-leaf1a,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, +154,dc1-leaf1a,VLAN,VerifyVlanInternalPolicy,Verifies the VLAN internal allocation policy and the range of VLANs.,,NOT RUN, +155,dc1-leaf1a,VXLAN,VerifyVxlan1ConnSettings,Verifies the interface vxlan1 source interface and UDP port.,,NOT RUN, +156,dc1-leaf1a,VXLAN,VerifyVxlan1Interface,Verifies the Vxlan1 interface status.,,NOT RUN, +157,dc1-leaf1a,VXLAN,VerifyVxlanConfigSanity,Verifies there are no VXLAN config-sanity inconsistencies.,,NOT RUN, +158,dc1-leaf1a,VXLAN,VerifyVxlanVniBinding,Verifies the VNI-VLAN bindings of the Vxlan1 interface.,,NOT RUN, +159,dc1-leaf1a,VXLAN,VerifyVxlanVtep,Verifies the VTEP peers of the Vxlan1 interface,,NOT RUN, +160,dc1-leaf1b,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +161,dc1-leaf1b,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +162,dc1-leaf1b,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, +163,dc1-leaf1b,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, +164,dc1-leaf1b,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, +165,dc1-leaf1b,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, +166,dc1-leaf1b,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, +167,dc1-leaf1b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc1-spine1 (IP: 10.255.0.1),NOT RUN, +168,dc1-leaf1b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc1-spine2 (IP: 10.255.0.2),NOT RUN, +169,dc1-leaf1b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-leaf1a (IP: 10.255.1.96),NOT RUN, +170,dc1-leaf1b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-spine1 (IP: 10.255.255.4),NOT RUN, +171,dc1-leaf1b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-spine2 (IP: 10.255.255.6),NOT RUN, +172,dc1-leaf1b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-wan1 (IP: 10.255.255.3),NOT RUN, +173,dc1-leaf1b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-wan2 (IP: 10.255.255.7),NOT RUN, +174,dc1-leaf1b,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, +175,dc1-leaf1b,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, +176,dc1-leaf1b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc1-spine1 Ethernet2,NOT RUN, +177,dc1-leaf1b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc1-spine2 Ethernet2,NOT RUN, +178,dc1-leaf1b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet3 - Remote: dc1-leaf1a Ethernet3,NOT RUN, +179,dc1-leaf1b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet4 - Remote: dc1-leaf1a Ethernet4,NOT RUN, +180,dc1-leaf1b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet6 - Remote: dc1-wan1 Ethernet2,NOT RUN, +181,dc1-leaf1b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet7 - Remote: dc1-wan2 Ethernet2,NOT RUN, +182,dc1-leaf1b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet8 - Remote: dc1-leaf1c Ethernet2,NOT RUN, +183,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3),NOT RUN, +184,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4),NOT RUN, +185,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5),NOT RUN, +186,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1),NOT RUN, +187,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2),NOT RUN, +188,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5),NOT RUN, +189,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6),NOT RUN, +190,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1),NOT RUN, +191,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2),NOT RUN, +192,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.4) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13),NOT RUN, +193,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.4) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14),NOT RUN, +194,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.4) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15),NOT RUN, +195,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.4) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16),NOT RUN, +196,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.4) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17),NOT RUN, +197,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.4) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18),NOT RUN, +198,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.4) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11),NOT RUN, +199,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.4) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12),NOT RUN, +200,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet1 (IP: 10.255.255.5) - Destination: dc1-spine1 Ethernet2 (IP: 10.255.255.4),NOT RUN, +201,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet2 (IP: 10.255.255.7) - Destination: dc1-spine2 Ethernet2 (IP: 10.255.255.6),NOT RUN, +202,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet6 (IP: 10.255.255.2) - Destination: dc1-wan1 Ethernet2 (IP: 10.255.255.3),NOT RUN, +203,dc1-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet7 (IP: 10.255.255.6) - Destination: dc1-wan2 Ethernet2 (IP: 10.255.255.7),NOT RUN, +204,dc1-leaf1b,Field Notices,VerifyFieldNotice44Resolution,Verifies that the device is using the correct Aboot version per FN0044.,,NOT RUN, +205,dc1-leaf1b,Field Notices,VerifyFieldNotice72Resolution,"Verifies if the device is exposed to FN0072, and if the issue has been mitigated.",,NOT RUN, +206,dc1-leaf1b,Greent,VerifyGreenT,Verifies if a GreenT policy is created.,,NOT RUN, +207,dc1-leaf1b,Greent,VerifyGreenTCounters,Verifies if the GreenT counters are incremented.,,NOT RUN, +208,dc1-leaf1b,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches.,,NOT RUN, +209,dc1-leaf1b,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, +210,dc1-leaf1b,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, +211,dc1-leaf1b,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, +212,dc1-leaf1b,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, +213,dc1-leaf1b,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, +214,dc1-leaf1b,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +215,dc1-leaf1b,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +216,dc1-leaf1b,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, +217,dc1-leaf1b,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, +218,dc1-leaf1b,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, +219,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - P2P_LINK_TO_DC1-SPINE1_Ethernet2 = 'up',NOT RUN, +220,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - P2P_LINK_TO_DC1-SPINE2_Ethernet2 = 'up',NOT RUN, +221,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet3 - MLAG_PEER_dc1-leaf1a_Ethernet3 = 'up',NOT RUN, +222,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet4 - MLAG_PEER_dc1-leaf1a_Ethernet4 = 'up',NOT RUN, +223,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet5 - dc1-leaf1-server1_PCI2 = 'up',NOT RUN, +224,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet6 - P2P_LINK_TO_DC1-WAN1_Ethernet2 = 'up',NOT RUN, +225,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet7 - P2P_LINK_TO_DC1-WAN2_Ethernet2 = 'up',NOT RUN, +226,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet8 - DC1-LEAF1C_Ethernet2 = 'up',NOT RUN, +227,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback0 - EVPN_Overlay_Peering = 'up',NOT RUN, +228,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up',NOT RUN, +229,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback10 - VRF10_VTEP_DIAGNOSTICS = 'up',NOT RUN, +230,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback11 - VRF11_VTEP_DIAGNOSTICS = 'up',NOT RUN, +231,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel3 - MLAG_PEER_dc1-leaf1a_Po3 = 'up',NOT RUN, +232,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel5 - dc1-leaf1-server1_PortChannel dc1-leaf1-server1 = 'up',NOT RUN, +233,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel8 - DC1-LEAF1C_Po1 = 'up',NOT RUN, +234,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan11 - VRF10_VLAN11 = 'up',NOT RUN, +235,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan12 - VRF10_VLAN12 = 'up',NOT RUN, +236,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan21 - VRF11_VLAN21 = 'up',NOT RUN, +237,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan22 - VRF11_VLAN22 = 'up',NOT RUN, +238,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan3009 - MLAG_PEER_L3_iBGP: vrf VRF10 = 'up',NOT RUN, +239,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan3010 - MLAG_PEER_L3_iBGP: vrf VRF11 = 'up',NOT RUN, +240,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4085 - Inband Management = 'up',NOT RUN, +241,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up',NOT RUN, +242,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4094 - MLAG_PEER = 'up',NOT RUN, +243,dc1-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vxlan1 = 'up',NOT RUN, +244,dc1-leaf1b,LANZ,VerifyLANZ,Verifies if LANZ is enabled.,,NOT RUN, +245,dc1-leaf1b,MLAG,VerifyMlagStatus,Verifies the health status of the MLAG configuration.,,NOT RUN, +246,dc1-leaf1b,PTP,VerifyPtpGMStatus,Verifies that the device is locked to a valid PTP Grandmaster.,,NOT RUN, +247,dc1-leaf1b,PTP,VerifyPtpLockStatus,Verifies that the device was locked to the upstream PTP GM in the last minute.,,NOT RUN, +248,dc1-leaf1b,PTP,VerifyPtpModeStatus,Verifies that the device is configured as a PTP Boundary Clock.,,NOT RUN, +249,dc1-leaf1b,PTP,VerifyPtpOffset,Verifies that the PTP timing offset is within +/- 1000ns from the master clock.,,NOT RUN, +250,dc1-leaf1b,PTP,VerifyPtpPortModeStatus,Verifies the PTP interfaces state.,,NOT RUN, +251,dc1-leaf1b,Routing,VerifyRoutingProtocolModel,Verifies the configured routing protocol model.,Routing protocol model: multi-agent,NOT RUN, +252,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.1 - Peer: dc1-spine1,NOT RUN, +253,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.2 - Peer: dc1-spine2,NOT RUN, +254,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.3 - Peer: dc1-leaf1a,NOT RUN, +255,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.4 - Peer: dc1-leaf1b,NOT RUN, +256,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.5 - Peer: dc1-leaf2a,NOT RUN, +257,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.3 - Peer: dc1-leaf1a,NOT RUN, +258,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.5 - Peer: dc1-leaf2a,NOT RUN, +259,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.11 - Peer: dc2-spine1,NOT RUN, +260,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.12 - Peer: dc2-spine2,NOT RUN, +261,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.13 - Peer: dc2-leaf1a,NOT RUN, +262,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.14 - Peer: dc2-leaf1b,NOT RUN, +263,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.15 - Peer: dc2-leaf2a,NOT RUN, +264,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.16 - Peer: dc2-leaf2b,NOT RUN, +265,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, +266,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com,NOT RUN, +267,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.13 - Peer: dc2-leaf1a,NOT RUN, +268,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.15 - Peer: dc2-leaf2a,NOT RUN, +269,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, +270,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.1 - Peer: dc1-wan1,NOT RUN, +271,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.2 - Peer: dc1-wan2,NOT RUN, +272,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.33.0.5 - Peer: dc1-svc-leaf1a,NOT RUN, +273,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.33.0.6 - Peer: dc1-svc-leaf1b,NOT RUN, +274,dc1-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.33.1.5 - Peer: dc1-svc-leaf1a,NOT RUN, +275,dc1-leaf1b,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,,NOT RUN, +276,dc1-leaf1b,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, +277,dc1-leaf1b,Security,VerifyAPIHttpStatus,Verifies if eAPI HTTP server is disabled globally.,,NOT RUN, +278,dc1-leaf1b,Security,VerifyAPIIPv4Acl,Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF.,,NOT RUN, +279,dc1-leaf1b,Security,VerifyAPIIPv6Acl,Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF.,,NOT RUN, +280,dc1-leaf1b,Security,VerifyAPISSLCertificate,"Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size.",,NOT RUN, +281,dc1-leaf1b,Security,VerifyBannerLogin,Verifies the login banner of a device.,,NOT RUN, +282,dc1-leaf1b,Security,VerifyBannerMotd,Verifies the motd banner of a device.,,NOT RUN, +283,dc1-leaf1b,Security,VerifyIPSecConnHealth,Verifies all IPv4 security connections.,,NOT RUN, +284,dc1-leaf1b,Security,VerifyIPv4ACL,Verifies the configuration of IPv4 ACLs.,,NOT RUN, +285,dc1-leaf1b,Security,VerifySpecificIPSecConn,Verifies IPv4 security connections for a peer.,,NOT RUN, +286,dc1-leaf1b,Security,VerifySSHIPv4Acl,Verifies if the SSHD agent has IPv4 ACL(s) configured.,,NOT RUN, +287,dc1-leaf1b,Security,VerifySSHIPv6Acl,Verifies if the SSHD agent has IPv6 ACL(s) configured.,,NOT RUN, +288,dc1-leaf1b,Security,VerifySSHStatus,Verifies if the SSHD agent is disabled in the default VRF.,,NOT RUN, +289,dc1-leaf1b,Security,VerifyTelnetStatus,Verifies if Telnet is disabled in the default VRF.,,NOT RUN, +290,dc1-leaf1b,Services,VerifyDNSLookup,Verifies the DNS name to IP address resolution.,,NOT RUN, +291,dc1-leaf1b,Services,VerifyDNSServers,Verifies if the DNS servers are correctly configured.,,NOT RUN, +292,dc1-leaf1b,Services,VerifyErrdisableRecovery,"Verifies the errdisable recovery reason, status, and interval.",,NOT RUN, +293,dc1-leaf1b,Services,VerifyHostname,Verifies the hostname of a device.,,NOT RUN, +294,dc1-leaf1b,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, +295,dc1-leaf1b,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, +296,dc1-leaf1b,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, +297,dc1-leaf1b,Software,VerifyEOSVersion,Verifies the EOS version of the device.,,NOT RUN, +298,dc1-leaf1b,Software,VerifyTerminAttrVersion,Verifies the TerminAttr version of the device.,,NOT RUN, +299,dc1-leaf1b,STUN,VerifyStunClient,Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided.,,NOT RUN, +300,dc1-leaf1b,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, +301,dc1-leaf1b,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, +302,dc1-leaf1b,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, +303,dc1-leaf1b,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, +304,dc1-leaf1b,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, +305,dc1-leaf1b,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +306,dc1-leaf1b,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +307,dc1-leaf1b,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, +308,dc1-leaf1b,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, +309,dc1-leaf1b,VLAN,VerifyVlanInternalPolicy,Verifies the VLAN internal allocation policy and the range of VLANs.,,NOT RUN, +310,dc1-leaf1c,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +311,dc1-leaf1c,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +312,dc1-leaf1c,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, +313,dc1-leaf1c,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, +314,dc1-leaf1c,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, +315,dc1-leaf1c,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, +316,dc1-leaf1c,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, +317,dc1-leaf1c,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, +318,dc1-leaf1c,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, +319,dc1-leaf1c,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc1-leaf1a Ethernet8,NOT RUN, +320,dc1-leaf1c,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc1-leaf1b Ethernet8,NOT RUN, +321,dc1-leaf1c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3),NOT RUN, +322,dc1-leaf1c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4),NOT RUN, +323,dc1-leaf1c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5),NOT RUN, +324,dc1-leaf1c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1),NOT RUN, +325,dc1-leaf1c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2),NOT RUN, +326,dc1-leaf1c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5),NOT RUN, +327,dc1-leaf1c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6),NOT RUN, +328,dc1-leaf1c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1),NOT RUN, +329,dc1-leaf1c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2),NOT RUN, +330,dc1-leaf1c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13),NOT RUN, +331,dc1-leaf1c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14),NOT RUN, +332,dc1-leaf1c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15),NOT RUN, +333,dc1-leaf1c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16),NOT RUN, +334,dc1-leaf1c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17),NOT RUN, +335,dc1-leaf1c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18),NOT RUN, +336,dc1-leaf1c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11),NOT RUN, +337,dc1-leaf1c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12),NOT RUN, +338,dc1-leaf1c,Field Notices,VerifyFieldNotice44Resolution,Verifies that the device is using the correct Aboot version per FN0044.,,NOT RUN, +339,dc1-leaf1c,Field Notices,VerifyFieldNotice72Resolution,"Verifies if the device is exposed to FN0072, and if the issue has been mitigated.",,NOT RUN, +340,dc1-leaf1c,Greent,VerifyGreenT,Verifies if a GreenT policy is created.,,NOT RUN, +341,dc1-leaf1c,Greent,VerifyGreenTCounters,Verifies if the GreenT counters are incremented.,,NOT RUN, +342,dc1-leaf1c,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches.,,NOT RUN, +343,dc1-leaf1c,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, +344,dc1-leaf1c,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, +345,dc1-leaf1c,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, +346,dc1-leaf1c,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, +347,dc1-leaf1c,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, +348,dc1-leaf1c,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +349,dc1-leaf1c,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +350,dc1-leaf1c,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, +351,dc1-leaf1c,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, +352,dc1-leaf1c,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, +353,dc1-leaf1c,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - DC1-LEAF1A_Ethernet8 = 'up',NOT RUN, +354,dc1-leaf1c,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - DC1-LEAF1B_Ethernet8 = 'up',NOT RUN, +355,dc1-leaf1c,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet5 - dc1-leaf1-server1_iLO = 'up',NOT RUN, +356,dc1-leaf1c,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel1 - DC1_L3_LEAF1_Po8 = 'up',NOT RUN, +357,dc1-leaf1c,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4085 - L2LEAF_INBAND_MGMT = 'up',NOT RUN, +358,dc1-leaf1c,LANZ,VerifyLANZ,Verifies if LANZ is enabled.,,NOT RUN, +359,dc1-leaf1c,PTP,VerifyPtpGMStatus,Verifies that the device is locked to a valid PTP Grandmaster.,,NOT RUN, +360,dc1-leaf1c,PTP,VerifyPtpLockStatus,Verifies that the device was locked to the upstream PTP GM in the last minute.,,NOT RUN, +361,dc1-leaf1c,PTP,VerifyPtpModeStatus,Verifies that the device is configured as a PTP Boundary Clock.,,NOT RUN, +362,dc1-leaf1c,PTP,VerifyPtpOffset,Verifies that the PTP timing offset is within +/- 1000ns from the master clock.,,NOT RUN, +363,dc1-leaf1c,PTP,VerifyPtpPortModeStatus,Verifies the PTP interfaces state.,,NOT RUN, +364,dc1-leaf1c,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,,NOT RUN, +365,dc1-leaf1c,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, +366,dc1-leaf1c,Security,VerifyAPIHttpStatus,Verifies if eAPI HTTP server is disabled globally.,,NOT RUN, +367,dc1-leaf1c,Security,VerifyAPIIPv4Acl,Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF.,,NOT RUN, +368,dc1-leaf1c,Security,VerifyAPIIPv6Acl,Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF.,,NOT RUN, +369,dc1-leaf1c,Security,VerifyAPISSLCertificate,"Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size.",,NOT RUN, +370,dc1-leaf1c,Security,VerifyBannerLogin,Verifies the login banner of a device.,,NOT RUN, +371,dc1-leaf1c,Security,VerifyBannerMotd,Verifies the motd banner of a device.,,NOT RUN, +372,dc1-leaf1c,Security,VerifyIPSecConnHealth,Verifies all IPv4 security connections.,,NOT RUN, +373,dc1-leaf1c,Security,VerifyIPv4ACL,Verifies the configuration of IPv4 ACLs.,,NOT RUN, +374,dc1-leaf1c,Security,VerifySpecificIPSecConn,Verifies IPv4 security connections for a peer.,,NOT RUN, +375,dc1-leaf1c,Security,VerifySSHIPv4Acl,Verifies if the SSHD agent has IPv4 ACL(s) configured.,,NOT RUN, +376,dc1-leaf1c,Security,VerifySSHIPv6Acl,Verifies if the SSHD agent has IPv6 ACL(s) configured.,,NOT RUN, +377,dc1-leaf1c,Security,VerifySSHStatus,Verifies if the SSHD agent is disabled in the default VRF.,,NOT RUN, +378,dc1-leaf1c,Security,VerifyTelnetStatus,Verifies if Telnet is disabled in the default VRF.,,NOT RUN, +379,dc1-leaf1c,Services,VerifyDNSLookup,Verifies the DNS name to IP address resolution.,,NOT RUN, +380,dc1-leaf1c,Services,VerifyDNSServers,Verifies if the DNS servers are correctly configured.,,NOT RUN, +381,dc1-leaf1c,Services,VerifyErrdisableRecovery,"Verifies the errdisable recovery reason, status, and interval.",,NOT RUN, +382,dc1-leaf1c,Services,VerifyHostname,Verifies the hostname of a device.,,NOT RUN, +383,dc1-leaf1c,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, +384,dc1-leaf1c,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, +385,dc1-leaf1c,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, +386,dc1-leaf1c,Software,VerifyEOSVersion,Verifies the EOS version of the device.,,NOT RUN, +387,dc1-leaf1c,Software,VerifyTerminAttrVersion,Verifies the TerminAttr version of the device.,,NOT RUN, +388,dc1-leaf1c,STUN,VerifyStunClient,Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided.,,NOT RUN, +389,dc1-leaf1c,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, +390,dc1-leaf1c,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, +391,dc1-leaf1c,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, +392,dc1-leaf1c,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, +393,dc1-leaf1c,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, +394,dc1-leaf1c,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +395,dc1-leaf1c,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +396,dc1-leaf1c,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, +397,dc1-leaf1c,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, +398,dc1-leaf1c,VLAN,VerifyVlanInternalPolicy,Verifies the VLAN internal allocation policy and the range of VLANs.,,NOT RUN, +399,dc1-leaf2a,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +400,dc1-leaf2a,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +401,dc1-leaf2a,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, +402,dc1-leaf2a,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, +403,dc1-leaf2a,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, +404,dc1-leaf2a,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, +405,dc1-leaf2a,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, +406,dc1-leaf2a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc1-spine1 (IP: 10.255.0.1),NOT RUN, +407,dc1-leaf2a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc1-spine2 (IP: 10.255.0.2),NOT RUN, +408,dc1-leaf2a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-leaf2a (IP: 10.255.128.15),NOT RUN, +409,dc1-leaf2a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-spine1 (IP: 10.255.255.8),NOT RUN, +410,dc1-leaf2a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-spine2 (IP: 10.255.255.10),NOT RUN, +411,dc1-leaf2a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf2a (IP: 192.168.100.1),NOT RUN, +412,dc1-leaf2a,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, +413,dc1-leaf2a,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, +414,dc1-leaf2a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc1-spine1 Ethernet3,NOT RUN, +415,dc1-leaf2a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc1-spine2 Ethernet3,NOT RUN, +416,dc1-leaf2a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet6 - Remote: dc2-leaf2a Ethernet6,NOT RUN, +417,dc1-leaf2a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet8 - Remote: dc1-leaf2c Ethernet1,NOT RUN, +418,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3),NOT RUN, +419,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4),NOT RUN, +420,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5),NOT RUN, +421,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1),NOT RUN, +422,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2),NOT RUN, +423,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5),NOT RUN, +424,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6),NOT RUN, +425,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1),NOT RUN, +426,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2),NOT RUN, +427,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.5) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13),NOT RUN, +428,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.5) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14),NOT RUN, +429,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.5) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15),NOT RUN, +430,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.5) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16),NOT RUN, +431,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.5) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17),NOT RUN, +432,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.5) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18),NOT RUN, +433,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.5) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11),NOT RUN, +434,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.0.5) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12),NOT RUN, +435,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet1 (IP: 10.255.255.9) - Destination: dc1-spine1 Ethernet3 (IP: 10.255.255.8),NOT RUN, +436,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet2 (IP: 10.255.255.11) - Destination: dc1-spine2 Ethernet3 (IP: 10.255.255.10),NOT RUN, +437,dc1-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet6 (IP: 192.168.100.0) - Destination: dc2-leaf2a Ethernet6 (IP: 192.168.100.1),NOT RUN, +438,dc1-leaf2a,Field Notices,VerifyFieldNotice44Resolution,Verifies that the device is using the correct Aboot version per FN0044.,,NOT RUN, +439,dc1-leaf2a,Field Notices,VerifyFieldNotice72Resolution,"Verifies if the device is exposed to FN0072, and if the issue has been mitigated.",,NOT RUN, +440,dc1-leaf2a,Greent,VerifyGreenT,Verifies if a GreenT policy is created.,,NOT RUN, +441,dc1-leaf2a,Greent,VerifyGreenTCounters,Verifies if the GreenT counters are incremented.,,NOT RUN, +442,dc1-leaf2a,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches.,,NOT RUN, +443,dc1-leaf2a,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, +444,dc1-leaf2a,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, +445,dc1-leaf2a,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, +446,dc1-leaf2a,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, +447,dc1-leaf2a,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, +448,dc1-leaf2a,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +449,dc1-leaf2a,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +450,dc1-leaf2a,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, +451,dc1-leaf2a,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, +452,dc1-leaf2a,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, +453,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - P2P_LINK_TO_DC1-SPINE1_Ethernet3 = 'up',NOT RUN, +454,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - P2P_LINK_TO_DC1-SPINE2_Ethernet3 = 'up',NOT RUN, +455,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet3 - MLAG_PEER_dc1-leaf2b_Ethernet3 = 'up',NOT RUN, +456,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet4 - MLAG_PEER_dc1-leaf2b_Ethernet4 = 'up',NOT RUN, +457,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet5 - dc1-leaf2-server1_PCI1 = 'up',NOT RUN, +458,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet6 - P2P_LINK_TO_dc2-leaf2a_Ethernet6 = 'up',NOT RUN, +459,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet8 - DC1-LEAF2C_Ethernet1 = 'up',NOT RUN, +460,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback0 - EVPN_Overlay_Peering = 'up',NOT RUN, +461,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up',NOT RUN, +462,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback10 - VRF10_VTEP_DIAGNOSTICS = 'up',NOT RUN, +463,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback11 - VRF11_VTEP_DIAGNOSTICS = 'up',NOT RUN, +464,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel3 - MLAG_PEER_dc1-leaf2b_Po3 = 'up',NOT RUN, +465,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel5 - dc1-leaf2-server1_PortChannel dc1-leaf2-server1 = 'up',NOT RUN, +466,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel8 - DC1-LEAF2C_Po1 = 'up',NOT RUN, +467,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan11 - VRF10_VLAN11 = 'up',NOT RUN, +468,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan12 - VRF10_VLAN12 = 'up',NOT RUN, +469,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan21 - VRF11_VLAN21 = 'up',NOT RUN, +470,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan22 - VRF11_VLAN22 = 'up',NOT RUN, +471,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan3009 - MLAG_PEER_L3_iBGP: vrf VRF10 = 'up',NOT RUN, +472,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan3010 - MLAG_PEER_L3_iBGP: vrf VRF11 = 'up',NOT RUN, +473,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4085 - Inband Management = 'up',NOT RUN, +474,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up',NOT RUN, +475,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4094 - MLAG_PEER = 'up',NOT RUN, +476,dc1-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vxlan1 = 'up',NOT RUN, +477,dc1-leaf2a,LANZ,VerifyLANZ,Verifies if LANZ is enabled.,,NOT RUN, +478,dc1-leaf2a,MLAG,VerifyMlagStatus,Verifies the health status of the MLAG configuration.,,NOT RUN, +479,dc1-leaf2a,Profiles,VerifyTcamProfile,Verifies the device TCAM profile.,,NOT RUN, +480,dc1-leaf2a,Profiles,VerifyUnifiedForwardingTableMode,Verifies the device is using the expected UFT mode.,,NOT RUN, +481,dc1-leaf2a,PTP,VerifyPtpGMStatus,Verifies that the device is locked to a valid PTP Grandmaster.,,NOT RUN, +482,dc1-leaf2a,PTP,VerifyPtpLockStatus,Verifies that the device was locked to the upstream PTP GM in the last minute.,,NOT RUN, +483,dc1-leaf2a,PTP,VerifyPtpModeStatus,Verifies that the device is configured as a PTP Boundary Clock.,,NOT RUN, +484,dc1-leaf2a,PTP,VerifyPtpOffset,Verifies that the PTP timing offset is within +/- 1000ns from the master clock.,,NOT RUN, +485,dc1-leaf2a,PTP,VerifyPtpPortModeStatus,Verifies the PTP interfaces state.,,NOT RUN, +486,dc1-leaf2a,Routing,VerifyRoutingProtocolModel,Verifies the configured routing protocol model.,Routing protocol model: multi-agent,NOT RUN, +487,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.1 - Peer: dc1-spine1,NOT RUN, +488,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.2 - Peer: dc1-spine2,NOT RUN, +489,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.3 - Peer: dc1-leaf1a,NOT RUN, +490,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.4 - Peer: dc1-leaf1b,NOT RUN, +491,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.5 - Peer: dc1-leaf2a,NOT RUN, +492,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.3 - Peer: dc1-leaf1a,NOT RUN, +493,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.5 - Peer: dc1-leaf2a,NOT RUN, +494,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.11 - Peer: dc2-spine1,NOT RUN, +495,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.12 - Peer: dc2-spine2,NOT RUN, +496,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.13 - Peer: dc2-leaf1a,NOT RUN, +497,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.14 - Peer: dc2-leaf1b,NOT RUN, +498,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.15 - Peer: dc2-leaf2a,NOT RUN, +499,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.16 - Peer: dc2-leaf2b,NOT RUN, +500,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, +501,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com,NOT RUN, +502,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.13 - Peer: dc2-leaf1a,NOT RUN, +503,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.15 - Peer: dc2-leaf2a,NOT RUN, +504,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, +505,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.1 - Peer: dc1-wan1,NOT RUN, +506,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.2 - Peer: dc1-wan2,NOT RUN, +507,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.33.0.5 - Peer: dc1-svc-leaf1a,NOT RUN, +508,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.33.0.6 - Peer: dc1-svc-leaf1b,NOT RUN, +509,dc1-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.33.1.5 - Peer: dc1-svc-leaf1a,NOT RUN, +510,dc1-leaf2a,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,,NOT RUN, +511,dc1-leaf2a,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, +512,dc1-leaf2a,Security,VerifyAPIHttpStatus,Verifies if eAPI HTTP server is disabled globally.,,NOT RUN, +513,dc1-leaf2a,Security,VerifyAPIIPv4Acl,Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF.,,NOT RUN, +514,dc1-leaf2a,Security,VerifyAPIIPv6Acl,Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF.,,NOT RUN, +515,dc1-leaf2a,Security,VerifyAPISSLCertificate,"Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size.",,NOT RUN, +516,dc1-leaf2a,Security,VerifyBannerLogin,Verifies the login banner of a device.,,NOT RUN, +517,dc1-leaf2a,Security,VerifyBannerMotd,Verifies the motd banner of a device.,,NOT RUN, +518,dc1-leaf2a,Security,VerifyIPSecConnHealth,Verifies all IPv4 security connections.,,NOT RUN, +519,dc1-leaf2a,Security,VerifyIPv4ACL,Verifies the configuration of IPv4 ACLs.,,NOT RUN, +520,dc1-leaf2a,Security,VerifySpecificIPSecConn,Verifies IPv4 security connections for a peer.,,NOT RUN, +521,dc1-leaf2a,Security,VerifySSHIPv4Acl,Verifies if the SSHD agent has IPv4 ACL(s) configured.,,NOT RUN, +522,dc1-leaf2a,Security,VerifySSHIPv6Acl,Verifies if the SSHD agent has IPv6 ACL(s) configured.,,NOT RUN, +523,dc1-leaf2a,Security,VerifySSHStatus,Verifies if the SSHD agent is disabled in the default VRF.,,NOT RUN, +524,dc1-leaf2a,Security,VerifyTelnetStatus,Verifies if Telnet is disabled in the default VRF.,,NOT RUN, +525,dc1-leaf2a,Services,VerifyDNSLookup,Verifies the DNS name to IP address resolution.,,NOT RUN, +526,dc1-leaf2a,Services,VerifyDNSServers,Verifies if the DNS servers are correctly configured.,,NOT RUN, +527,dc1-leaf2a,Services,VerifyErrdisableRecovery,"Verifies the errdisable recovery reason, status, and interval.",,NOT RUN, +528,dc1-leaf2a,Services,VerifyHostname,Verifies the hostname of a device.,,NOT RUN, +529,dc1-leaf2a,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, +530,dc1-leaf2a,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, +531,dc1-leaf2a,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, +532,dc1-leaf2a,Software,VerifyEOSExtensions,Verifies that all EOS extensions installed on the device are enabled for boot persistence.,,NOT RUN, +533,dc1-leaf2a,Software,VerifyEOSVersion,Verifies the EOS version of the device.,,NOT RUN, +534,dc1-leaf2a,Software,VerifyTerminAttrVersion,Verifies the TerminAttr version of the device.,,NOT RUN, +535,dc1-leaf2a,STUN,VerifyStunClient,Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided.,,NOT RUN, +536,dc1-leaf2a,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, +537,dc1-leaf2a,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, +538,dc1-leaf2a,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, +539,dc1-leaf2a,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, +540,dc1-leaf2a,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, +541,dc1-leaf2a,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +542,dc1-leaf2a,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +543,dc1-leaf2a,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, +544,dc1-leaf2a,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, +545,dc1-leaf2a,VLAN,VerifyVlanInternalPolicy,Verifies the VLAN internal allocation policy and the range of VLANs.,,NOT RUN, +546,dc1-leaf2c,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +547,dc1-leaf2c,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +548,dc1-leaf2c,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, +549,dc1-leaf2c,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, +550,dc1-leaf2c,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, +551,dc1-leaf2c,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, +552,dc1-leaf2c,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, +553,dc1-leaf2c,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, +554,dc1-leaf2c,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, +555,dc1-leaf2c,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc1-leaf2a Ethernet8,NOT RUN, +556,dc1-leaf2c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3),NOT RUN, +557,dc1-leaf2c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4),NOT RUN, +558,dc1-leaf2c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5),NOT RUN, +559,dc1-leaf2c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1),NOT RUN, +560,dc1-leaf2c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2),NOT RUN, +561,dc1-leaf2c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5),NOT RUN, +562,dc1-leaf2c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6),NOT RUN, +563,dc1-leaf2c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1),NOT RUN, +564,dc1-leaf2c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2),NOT RUN, +565,dc1-leaf2c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13),NOT RUN, +566,dc1-leaf2c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14),NOT RUN, +567,dc1-leaf2c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15),NOT RUN, +568,dc1-leaf2c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16),NOT RUN, +569,dc1-leaf2c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17),NOT RUN, +570,dc1-leaf2c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18),NOT RUN, +571,dc1-leaf2c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11),NOT RUN, +572,dc1-leaf2c,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12),NOT RUN, +573,dc1-leaf2c,Field Notices,VerifyFieldNotice44Resolution,Verifies that the device is using the correct Aboot version per FN0044.,,NOT RUN, +574,dc1-leaf2c,Field Notices,VerifyFieldNotice72Resolution,"Verifies if the device is exposed to FN0072, and if the issue has been mitigated.",,NOT RUN, +575,dc1-leaf2c,Greent,VerifyGreenT,Verifies if a GreenT policy is created.,,NOT RUN, +576,dc1-leaf2c,Greent,VerifyGreenTCounters,Verifies if the GreenT counters are incremented.,,NOT RUN, +577,dc1-leaf2c,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches.,,NOT RUN, +578,dc1-leaf2c,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, +579,dc1-leaf2c,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, +580,dc1-leaf2c,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, +581,dc1-leaf2c,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, +582,dc1-leaf2c,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, +583,dc1-leaf2c,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +584,dc1-leaf2c,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +585,dc1-leaf2c,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, +586,dc1-leaf2c,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, +587,dc1-leaf2c,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, +588,dc1-leaf2c,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - DC1-LEAF2A_Ethernet8 = 'up',NOT RUN, +589,dc1-leaf2c,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - DC1-LEAF2B_Ethernet8 = 'adminDown',NOT RUN, +590,dc1-leaf2c,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet5 - dc1-leaf2-server1_iLO = 'up',NOT RUN, +591,dc1-leaf2c,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel1 - DC1_L3_LEAF2_Po8 = 'up',NOT RUN, +592,dc1-leaf2c,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4085 - L2LEAF_INBAND_MGMT = 'up',NOT RUN, +593,dc1-leaf2c,LANZ,VerifyLANZ,Verifies if LANZ is enabled.,,NOT RUN, +594,dc1-leaf2c,PTP,VerifyPtpGMStatus,Verifies that the device is locked to a valid PTP Grandmaster.,,NOT RUN, +595,dc1-leaf2c,PTP,VerifyPtpLockStatus,Verifies that the device was locked to the upstream PTP GM in the last minute.,,NOT RUN, +596,dc1-leaf2c,PTP,VerifyPtpModeStatus,Verifies that the device is configured as a PTP Boundary Clock.,,NOT RUN, +597,dc1-leaf2c,PTP,VerifyPtpOffset,Verifies that the PTP timing offset is within +/- 1000ns from the master clock.,,NOT RUN, +598,dc1-leaf2c,PTP,VerifyPtpPortModeStatus,Verifies the PTP interfaces state.,,NOT RUN, +599,dc1-leaf2c,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,,NOT RUN, +600,dc1-leaf2c,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, +601,dc1-leaf2c,Security,VerifyAPIHttpStatus,Verifies if eAPI HTTP server is disabled globally.,,NOT RUN, +602,dc1-leaf2c,Security,VerifyAPIIPv4Acl,Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF.,,NOT RUN, +603,dc1-leaf2c,Security,VerifyAPIIPv6Acl,Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF.,,NOT RUN, +604,dc1-leaf2c,Security,VerifyAPISSLCertificate,"Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size.",,NOT RUN, +605,dc1-leaf2c,Security,VerifyBannerLogin,Verifies the login banner of a device.,,NOT RUN, +606,dc1-leaf2c,Security,VerifyBannerMotd,Verifies the motd banner of a device.,,NOT RUN, +607,dc1-leaf2c,Security,VerifyIPSecConnHealth,Verifies all IPv4 security connections.,,NOT RUN, +608,dc1-leaf2c,Security,VerifyIPv4ACL,Verifies the configuration of IPv4 ACLs.,,NOT RUN, +609,dc1-leaf2c,Security,VerifySpecificIPSecConn,Verifies IPv4 security connections for a peer.,,NOT RUN, +610,dc1-leaf2c,Security,VerifySSHIPv4Acl,Verifies if the SSHD agent has IPv4 ACL(s) configured.,,NOT RUN, +611,dc1-leaf2c,Security,VerifySSHIPv6Acl,Verifies if the SSHD agent has IPv6 ACL(s) configured.,,NOT RUN, +612,dc1-leaf2c,Security,VerifySSHStatus,Verifies if the SSHD agent is disabled in the default VRF.,,NOT RUN, +613,dc1-leaf2c,Security,VerifyTelnetStatus,Verifies if Telnet is disabled in the default VRF.,,NOT RUN, +614,dc1-leaf2c,Services,VerifyDNSLookup,Verifies the DNS name to IP address resolution.,,NOT RUN, +615,dc1-leaf2c,Services,VerifyDNSServers,Verifies if the DNS servers are correctly configured.,,NOT RUN, +616,dc1-leaf2c,Services,VerifyErrdisableRecovery,"Verifies the errdisable recovery reason, status, and interval.",,NOT RUN, +617,dc1-leaf2c,Services,VerifyHostname,Verifies the hostname of a device.,,NOT RUN, +618,dc1-leaf2c,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, +619,dc1-leaf2c,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, +620,dc1-leaf2c,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, +621,dc1-leaf2c,Software,VerifyEOSVersion,Verifies the EOS version of the device.,,NOT RUN, +622,dc1-leaf2c,Software,VerifyTerminAttrVersion,Verifies the TerminAttr version of the device.,,NOT RUN, +623,dc1-leaf2c,STUN,VerifyStunClient,Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided.,,NOT RUN, +624,dc1-leaf2c,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, +625,dc1-leaf2c,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, +626,dc1-leaf2c,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, +627,dc1-leaf2c,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, +628,dc1-leaf2c,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, +629,dc1-leaf2c,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +630,dc1-leaf2c,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +631,dc1-leaf2c,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, +632,dc1-leaf2c,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, +633,dc1-leaf2c,VLAN,VerifyVlanInternalPolicy,Verifies the VLAN internal allocation policy and the range of VLANs.,,NOT RUN, +634,dc1-spine1,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +635,dc1-spine1,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +636,dc1-spine1,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, +637,dc1-spine1,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, +638,dc1-spine1,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, +639,dc1-spine1,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, +640,dc1-spine1,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, +641,dc1-spine1,BFD,VerifyBFDPeersHealth,Verifies the health of all IPv4 BFD peers.,,NOT RUN, +642,dc1-spine1,BFD,VerifyBFDPeersIntervals,Verifies the timers of the IPv4 BFD peers in the specified VRF.,,NOT RUN, +643,dc1-spine1,BFD,VerifyBFDSpecificPeers,Verifies the IPv4 BFD peer's sessions and remote disc in the specified VRF.,,NOT RUN, +644,dc1-spine1,BGP,VerifyBGPAdvCommunities,Verifies the advertised communities of a BGP peer.,,NOT RUN, +645,dc1-spine1,BGP,VerifyBGPExchangedRoutes,Verifies the advertised and received routes of BGP peers.,,NOT RUN, +646,dc1-spine1,BGP,VerifyBGPPeerASNCap,Verifies the four octet asn capabilities of a BGP peer.,,NOT RUN, +647,dc1-spine1,BGP,VerifyBGPPeerCount,Verifies the count of BGP peers.,,NOT RUN, +648,dc1-spine1,BGP,VerifyBGPPeerMD5Auth,Verifies the MD5 authentication and state of a BGP peer.,,NOT RUN, +649,dc1-spine1,BGP,VerifyBGPPeerMPCaps,Verifies the multiprotocol capabilities of a BGP peer.,,NOT RUN, +650,dc1-spine1,BGP,VerifyBGPPeerRouteRefreshCap,Verifies the route refresh capabilities of a BGP peer.,,NOT RUN, +651,dc1-spine1,BGP,VerifyBGPPeersHealth,Verifies the health of BGP peers,,NOT RUN, +652,dc1-spine1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,,NOT RUN, +653,dc1-spine1,BGP,VerifyBGPTimers,Verifies the timers of a BGP peer.,,NOT RUN, +654,dc1-spine1,BGP,VerifyEVPNType2Route,Verifies the EVPN Type-2 routes for a given IPv4 or MAC address and VNI.,,NOT RUN, +655,dc1-spine1,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, +656,dc1-spine1,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, +657,dc1-spine1,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc1-leaf1a Ethernet1,NOT RUN, +658,dc1-spine1,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc1-leaf1b Ethernet1,NOT RUN, +659,dc1-spine1,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet3 - Remote: dc1-leaf2a Ethernet1,NOT RUN, +660,dc1-spine1,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet5 - Remote: dc1-svc-leaf1a Ethernet1,NOT RUN, +661,dc1-spine1,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet6 - Remote: dc1-svc-leaf1b Ethernet1,NOT RUN, +662,dc1-spine1,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet1 (IP: 10.255.255.0) - Destination: dc1-leaf1a Ethernet1 (IP: 10.255.255.1),NOT RUN, +663,dc1-spine1,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet2 (IP: 10.255.255.4) - Destination: dc1-leaf1b Ethernet1 (IP: 10.255.255.5),NOT RUN, +664,dc1-spine1,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet3 (IP: 10.255.255.8) - Destination: dc1-leaf2a Ethernet1 (IP: 10.255.255.9),NOT RUN, +665,dc1-spine1,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet5 (IP: 10.33.255.16) - Destination: dc1-svc-leaf1a Ethernet1 (IP: 10.33.255.17),NOT RUN, +666,dc1-spine1,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet6 (IP: 10.33.255.20) - Destination: dc1-svc-leaf1b Ethernet1 (IP: 10.33.255.21),NOT RUN, +667,dc1-spine1,Field Notices,VerifyFieldNotice44Resolution,Verifies that the device is using the correct Aboot version per FN0044.,,NOT RUN, +668,dc1-spine1,Field Notices,VerifyFieldNotice72Resolution,"Verifies if the device is exposed to FN0072, and if the issue has been mitigated.",,NOT RUN, +669,dc1-spine1,Greent,VerifyGreenT,Verifies if a GreenT policy is created.,,NOT RUN, +670,dc1-spine1,Greent,VerifyGreenTCounters,Verifies if the GreenT counters are incremented.,,NOT RUN, +671,dc1-spine1,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches.,,NOT RUN, +672,dc1-spine1,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, +673,dc1-spine1,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, +674,dc1-spine1,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, +675,dc1-spine1,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, +676,dc1-spine1,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, +677,dc1-spine1,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +678,dc1-spine1,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +679,dc1-spine1,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, +680,dc1-spine1,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, +681,dc1-spine1,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, +682,dc1-spine1,Interfaces,VerifyIllegalLACP,Verifies there are no illegal LACP packets in all port channels.,,NOT RUN, +683,dc1-spine1,Interfaces,VerifyInterfaceDiscards,Verifies there are no interface discard counters.,,NOT RUN, +684,dc1-spine1,Interfaces,VerifyInterfaceErrDisabled,Verifies there are no interfaces in the errdisabled state.,,NOT RUN, +685,dc1-spine1,Interfaces,VerifyInterfaceErrors,Verifies there are no interface error counters.,,NOT RUN, +686,dc1-spine1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,,NOT RUN, +687,dc1-spine1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - P2P_LINK_TO_DC1-LEAF1A_Ethernet1 = 'up',NOT RUN, +688,dc1-spine1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - P2P_LINK_TO_DC1-LEAF1B_Ethernet1 = 'up',NOT RUN, +689,dc1-spine1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet3 - P2P_LINK_TO_DC1-LEAF2A_Ethernet1 = 'up',NOT RUN, +690,dc1-spine1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet4 - P2P_LINK_TO_DC1-LEAF2B_Ethernet1 = 'adminDown',NOT RUN, +691,dc1-spine1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet5 - P2P_LINK_TO_DC1-SVC-LEAF1A_Ethernet1 = 'up',NOT RUN, +692,dc1-spine1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet6 - P2P_LINK_TO_DC1-SVC-LEAF1B_Ethernet1 = 'up',NOT RUN, +693,dc1-spine1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback0 - EVPN_Overlay_Peering = 'up',NOT RUN, +694,dc1-spine1,Interfaces,VerifyInterfaceUtilization,Verifies that the utilization of interfaces is below a certain threshold.,,NOT RUN, +695,dc1-spine1,Interfaces,VerifyIPProxyARP,Verifies if Proxy ARP is enabled.,,NOT RUN, +696,dc1-spine1,Interfaces,VerifyL2MTU,Verifies the global L2 MTU of all L2 interfaces.,,NOT RUN, +697,dc1-spine1,Interfaces,VerifyL3MTU,Verifies the global L3 MTU of all L3 interfaces.,,NOT RUN, +698,dc1-spine1,Interfaces,VerifyLoopbackCount,Verifies the number of loopback interfaces and their status.,,NOT RUN, +699,dc1-spine1,Interfaces,VerifyPortChannels,Verifies there are no inactive ports in all port channels.,,NOT RUN, +700,dc1-spine1,Interfaces,VerifyStormControlDrops,Verifies there are no interface storm-control drop counters.,,NOT RUN, +701,dc1-spine1,Interfaces,VerifySVI,Verifies the status of all SVIs.,,NOT RUN, +702,dc1-spine1,LANZ,VerifyLANZ,Verifies if LANZ is enabled.,,NOT RUN, +703,dc1-spine1,OSPF,VerifyOSPFMaxLSA,Verifies all OSPF instances did not cross the maximum LSA threshold.,,NOT RUN, +704,dc1-spine1,OSPF,VerifyOSPFNeighborCount,Verifies the number of OSPF neighbors in FULL state is the one we expect.,,NOT RUN, +705,dc1-spine1,OSPF,VerifyOSPFNeighborState,Verifies all OSPF neighbors are in FULL state.,,NOT RUN, +706,dc1-spine1,PTP,VerifyPtpGMStatus,Verifies that the device is locked to a valid PTP Grandmaster.,,NOT RUN, +707,dc1-spine1,PTP,VerifyPtpLockStatus,Verifies that the device was locked to the upstream PTP GM in the last minute.,,NOT RUN, +708,dc1-spine1,PTP,VerifyPtpModeStatus,Verifies that the device is configured as a PTP Boundary Clock.,,NOT RUN, +709,dc1-spine1,PTP,VerifyPtpOffset,Verifies that the PTP timing offset is within +/- 1000ns from the master clock.,,NOT RUN, +710,dc1-spine1,PTP,VerifyPtpPortModeStatus,Verifies the PTP interfaces state.,,NOT RUN, +711,dc1-spine1,Routing,VerifyRoutingProtocolModel,Verifies the configured routing protocol model.,,NOT RUN, +712,dc1-spine1,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,,NOT RUN, +713,dc1-spine1,Routing,VerifyRoutingTableSize,Verifies the size of the IP routing table of the default VRF.,,NOT RUN, +714,dc1-spine1,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,,NOT RUN, +715,dc1-spine1,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, +716,dc1-spine1,Security,VerifyAPIHttpStatus,Verifies if eAPI HTTP server is disabled globally.,,NOT RUN, +717,dc1-spine1,Security,VerifyAPIIPv4Acl,Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF.,,NOT RUN, +718,dc1-spine1,Security,VerifyAPIIPv6Acl,Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF.,,NOT RUN, +719,dc1-spine1,Security,VerifyAPISSLCertificate,"Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size.",,NOT RUN, +720,dc1-spine1,Security,VerifyBannerLogin,Verifies the login banner of a device.,,NOT RUN, +721,dc1-spine1,Security,VerifyBannerMotd,Verifies the motd banner of a device.,,NOT RUN, +722,dc1-spine1,Security,VerifyIPSecConnHealth,Verifies all IPv4 security connections.,,NOT RUN, +723,dc1-spine1,Security,VerifyIPv4ACL,Verifies the configuration of IPv4 ACLs.,,NOT RUN, +724,dc1-spine1,Security,VerifySpecificIPSecConn,Verifies IPv4 security connections for a peer.,,NOT RUN, +725,dc1-spine1,Security,VerifySSHIPv4Acl,Verifies if the SSHD agent has IPv4 ACL(s) configured.,,NOT RUN, +726,dc1-spine1,Security,VerifySSHIPv6Acl,Verifies if the SSHD agent has IPv6 ACL(s) configured.,,NOT RUN, +727,dc1-spine1,Security,VerifySSHStatus,Verifies if the SSHD agent is disabled in the default VRF.,,NOT RUN, +728,dc1-spine1,Security,VerifyTelnetStatus,Verifies if Telnet is disabled in the default VRF.,,NOT RUN, +729,dc1-spine1,Services,VerifyDNSLookup,Verifies the DNS name to IP address resolution.,,NOT RUN, +730,dc1-spine1,Services,VerifyDNSServers,Verifies if the DNS servers are correctly configured.,,NOT RUN, +731,dc1-spine1,Services,VerifyErrdisableRecovery,"Verifies the errdisable recovery reason, status, and interval.",,NOT RUN, +732,dc1-spine1,Services,VerifyHostname,Verifies the hostname of a device.,,NOT RUN, +733,dc1-spine1,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, +734,dc1-spine1,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, +735,dc1-spine1,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, +736,dc1-spine1,Software,VerifyEOSVersion,Verifies the EOS version of the device.,,NOT RUN, +737,dc1-spine1,Software,VerifyTerminAttrVersion,Verifies the TerminAttr version of the device.,,NOT RUN, +738,dc1-spine1,STUN,VerifyStunClient,Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided.,,NOT RUN, +739,dc1-spine1,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, +740,dc1-spine1,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, +741,dc1-spine1,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, +742,dc1-spine1,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, +743,dc1-spine1,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, +744,dc1-spine1,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +745,dc1-spine1,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +746,dc1-spine1,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, +747,dc1-spine1,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, +748,dc1-spine1,VLAN,VerifyVlanInternalPolicy,Verifies the VLAN internal allocation policy and the range of VLANs.,,NOT RUN, +749,dc1-spine2,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +750,dc1-spine2,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +751,dc1-spine2,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, +752,dc1-spine2,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, +753,dc1-spine2,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, +754,dc1-spine2,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, +755,dc1-spine2,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, +756,dc1-spine2,BFD,VerifyBFDPeersHealth,Verifies the health of all IPv4 BFD peers.,,NOT RUN, +757,dc1-spine2,BFD,VerifyBFDPeersIntervals,Verifies the timers of the IPv4 BFD peers in the specified VRF.,,NOT RUN, +758,dc1-spine2,BFD,VerifyBFDSpecificPeers,Verifies the IPv4 BFD peer's sessions and remote disc in the specified VRF.,,NOT RUN, +759,dc1-spine2,BGP,VerifyBGPAdvCommunities,Verifies the advertised communities of a BGP peer.,,NOT RUN, +760,dc1-spine2,BGP,VerifyBGPExchangedRoutes,Verifies the advertised and received routes of BGP peers.,,NOT RUN, +761,dc1-spine2,BGP,VerifyBGPPeerASNCap,Verifies the four octet asn capabilities of a BGP peer.,,NOT RUN, +762,dc1-spine2,BGP,VerifyBGPPeerCount,Verifies the count of BGP peers.,,NOT RUN, +763,dc1-spine2,BGP,VerifyBGPPeerMD5Auth,Verifies the MD5 authentication and state of a BGP peer.,,NOT RUN, +764,dc1-spine2,BGP,VerifyBGPPeerMPCaps,Verifies the multiprotocol capabilities of a BGP peer.,,NOT RUN, +765,dc1-spine2,BGP,VerifyBGPPeerRouteRefreshCap,Verifies the route refresh capabilities of a BGP peer.,,NOT RUN, +766,dc1-spine2,BGP,VerifyBGPPeersHealth,Verifies the health of BGP peers,,NOT RUN, +767,dc1-spine2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,,NOT RUN, +768,dc1-spine2,BGP,VerifyBGPTimers,Verifies the timers of a BGP peer.,,NOT RUN, +769,dc1-spine2,BGP,VerifyEVPNType2Route,Verifies the EVPN Type-2 routes for a given IPv4 or MAC address and VNI.,,NOT RUN, +770,dc1-spine2,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, +771,dc1-spine2,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, +772,dc1-spine2,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc1-leaf1a Ethernet2,NOT RUN, +773,dc1-spine2,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc1-leaf1b Ethernet2,NOT RUN, +774,dc1-spine2,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet3 - Remote: dc1-leaf2a Ethernet2,NOT RUN, +775,dc1-spine2,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet5 - Remote: dc1-svc-leaf1a Ethernet2,NOT RUN, +776,dc1-spine2,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet6 - Remote: dc1-svc-leaf1b Ethernet2,NOT RUN, +777,dc1-spine2,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet1 (IP: 10.255.255.2) - Destination: dc1-leaf1a Ethernet2 (IP: 10.255.255.3),NOT RUN, +778,dc1-spine2,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet2 (IP: 10.255.255.6) - Destination: dc1-leaf1b Ethernet2 (IP: 10.255.255.7),NOT RUN, +779,dc1-spine2,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet3 (IP: 10.255.255.10) - Destination: dc1-leaf2a Ethernet2 (IP: 10.255.255.11),NOT RUN, +780,dc1-spine2,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet5 (IP: 10.33.255.18) - Destination: dc1-svc-leaf1a Ethernet2 (IP: 10.33.255.19),NOT RUN, +781,dc1-spine2,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet6 (IP: 10.33.255.22) - Destination: dc1-svc-leaf1b Ethernet2 (IP: 10.33.255.23),NOT RUN, +782,dc1-spine2,Field Notices,VerifyFieldNotice44Resolution,Verifies that the device is using the correct Aboot version per FN0044.,,NOT RUN, +783,dc1-spine2,Field Notices,VerifyFieldNotice72Resolution,"Verifies if the device is exposed to FN0072, and if the issue has been mitigated.",,NOT RUN, +784,dc1-spine2,Greent,VerifyGreenT,Verifies if a GreenT policy is created.,,NOT RUN, +785,dc1-spine2,Greent,VerifyGreenTCounters,Verifies if the GreenT counters are incremented.,,NOT RUN, +786,dc1-spine2,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches.,,NOT RUN, +787,dc1-spine2,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, +788,dc1-spine2,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, +789,dc1-spine2,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, +790,dc1-spine2,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, +791,dc1-spine2,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, +792,dc1-spine2,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +793,dc1-spine2,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +794,dc1-spine2,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, +795,dc1-spine2,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, +796,dc1-spine2,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, +797,dc1-spine2,Interfaces,VerifyIllegalLACP,Verifies there are no illegal LACP packets in all port channels.,,NOT RUN, +798,dc1-spine2,Interfaces,VerifyInterfaceDiscards,Verifies there are no interface discard counters.,,NOT RUN, +799,dc1-spine2,Interfaces,VerifyInterfaceErrDisabled,Verifies there are no interfaces in the errdisabled state.,,NOT RUN, +800,dc1-spine2,Interfaces,VerifyInterfaceErrors,Verifies there are no interface error counters.,,NOT RUN, +801,dc1-spine2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,,NOT RUN, +802,dc1-spine2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - P2P_LINK_TO_DC1-LEAF1A_Ethernet2 = 'up',NOT RUN, +803,dc1-spine2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - P2P_LINK_TO_DC1-LEAF1B_Ethernet2 = 'up',NOT RUN, +804,dc1-spine2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet3 - P2P_LINK_TO_DC1-LEAF2A_Ethernet2 = 'up',NOT RUN, +805,dc1-spine2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet4 - P2P_LINK_TO_DC1-LEAF2B_Ethernet2 = 'adminDown',NOT RUN, +806,dc1-spine2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet5 - P2P_LINK_TO_DC1-SVC-LEAF1A_Ethernet2 = 'up',NOT RUN, +807,dc1-spine2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet6 - P2P_LINK_TO_DC1-SVC-LEAF1B_Ethernet2 = 'up',NOT RUN, +808,dc1-spine2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback0 - EVPN_Overlay_Peering = 'up',NOT RUN, +809,dc1-spine2,Interfaces,VerifyInterfaceUtilization,Verifies that the utilization of interfaces is below a certain threshold.,,NOT RUN, +810,dc1-spine2,Interfaces,VerifyIPProxyARP,Verifies if Proxy ARP is enabled.,,NOT RUN, +811,dc1-spine2,Interfaces,VerifyL2MTU,Verifies the global L2 MTU of all L2 interfaces.,,NOT RUN, +812,dc1-spine2,Interfaces,VerifyL3MTU,Verifies the global L3 MTU of all L3 interfaces.,,NOT RUN, +813,dc1-spine2,Interfaces,VerifyLoopbackCount,Verifies the number of loopback interfaces and their status.,,NOT RUN, +814,dc1-spine2,Interfaces,VerifyPortChannels,Verifies there are no inactive ports in all port channels.,,NOT RUN, +815,dc1-spine2,Interfaces,VerifyStormControlDrops,Verifies there are no interface storm-control drop counters.,,NOT RUN, +816,dc1-spine2,Interfaces,VerifySVI,Verifies the status of all SVIs.,,NOT RUN, +817,dc1-spine2,LANZ,VerifyLANZ,Verifies if LANZ is enabled.,,NOT RUN, +818,dc1-spine2,OSPF,VerifyOSPFMaxLSA,Verifies all OSPF instances did not cross the maximum LSA threshold.,,NOT RUN, +819,dc1-spine2,OSPF,VerifyOSPFNeighborCount,Verifies the number of OSPF neighbors in FULL state is the one we expect.,,NOT RUN, +820,dc1-spine2,OSPF,VerifyOSPFNeighborState,Verifies all OSPF neighbors are in FULL state.,,NOT RUN, +821,dc1-spine2,PTP,VerifyPtpGMStatus,Verifies that the device is locked to a valid PTP Grandmaster.,,NOT RUN, +822,dc1-spine2,PTP,VerifyPtpLockStatus,Verifies that the device was locked to the upstream PTP GM in the last minute.,,NOT RUN, +823,dc1-spine2,PTP,VerifyPtpModeStatus,Verifies that the device is configured as a PTP Boundary Clock.,,NOT RUN, +824,dc1-spine2,PTP,VerifyPtpOffset,Verifies that the PTP timing offset is within +/- 1000ns from the master clock.,,NOT RUN, +825,dc1-spine2,PTP,VerifyPtpPortModeStatus,Verifies the PTP interfaces state.,,NOT RUN, +826,dc1-spine2,Routing,VerifyRoutingProtocolModel,Verifies the configured routing protocol model.,,NOT RUN, +827,dc1-spine2,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,,NOT RUN, +828,dc1-spine2,Routing,VerifyRoutingTableSize,Verifies the size of the IP routing table of the default VRF.,,NOT RUN, +829,dc1-spine2,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,,NOT RUN, +830,dc1-spine2,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, +831,dc1-spine2,Security,VerifyAPIHttpStatus,Verifies if eAPI HTTP server is disabled globally.,,NOT RUN, +832,dc1-spine2,Security,VerifyAPIIPv4Acl,Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF.,,NOT RUN, +833,dc1-spine2,Security,VerifyAPIIPv6Acl,Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF.,,NOT RUN, +834,dc1-spine2,Security,VerifyAPISSLCertificate,"Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size.",,NOT RUN, +835,dc1-spine2,Security,VerifyBannerLogin,Verifies the login banner of a device.,,NOT RUN, +836,dc1-spine2,Security,VerifyBannerMotd,Verifies the motd banner of a device.,,NOT RUN, +837,dc1-spine2,Security,VerifyIPSecConnHealth,Verifies all IPv4 security connections.,,NOT RUN, +838,dc1-spine2,Security,VerifyIPv4ACL,Verifies the configuration of IPv4 ACLs.,,NOT RUN, +839,dc1-spine2,Security,VerifySpecificIPSecConn,Verifies IPv4 security connections for a peer.,,NOT RUN, +840,dc1-spine2,Security,VerifySSHIPv4Acl,Verifies if the SSHD agent has IPv4 ACL(s) configured.,,NOT RUN, +841,dc1-spine2,Security,VerifySSHIPv6Acl,Verifies if the SSHD agent has IPv6 ACL(s) configured.,,NOT RUN, +842,dc1-spine2,Security,VerifySSHStatus,Verifies if the SSHD agent is disabled in the default VRF.,,NOT RUN, +843,dc1-spine2,Security,VerifyTelnetStatus,Verifies if Telnet is disabled in the default VRF.,,NOT RUN, +844,dc1-spine2,Services,VerifyDNSLookup,Verifies the DNS name to IP address resolution.,,NOT RUN, +845,dc1-spine2,Services,VerifyDNSServers,Verifies if the DNS servers are correctly configured.,,NOT RUN, +846,dc1-spine2,Services,VerifyErrdisableRecovery,"Verifies the errdisable recovery reason, status, and interval.",,NOT RUN, +847,dc1-spine2,Services,VerifyHostname,Verifies the hostname of a device.,,NOT RUN, +848,dc1-spine2,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, +849,dc1-spine2,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, +850,dc1-spine2,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, +851,dc1-spine2,Software,VerifyEOSVersion,Verifies the EOS version of the device.,,NOT RUN, +852,dc1-spine2,Software,VerifyTerminAttrVersion,Verifies the TerminAttr version of the device.,,NOT RUN, +853,dc1-spine2,STUN,VerifyStunClient,Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided.,,NOT RUN, +854,dc1-spine2,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, +855,dc1-spine2,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, +856,dc1-spine2,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, +857,dc1-spine2,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, +858,dc1-spine2,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, +859,dc1-spine2,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +860,dc1-spine2,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +861,dc1-spine2,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, +862,dc1-spine2,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, +863,dc1-spine2,VLAN,VerifyVlanInternalPolicy,Verifies the VLAN internal allocation policy and the range of VLANs.,,NOT RUN, +864,dc1-svc-leaf1a,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +865,dc1-svc-leaf1a,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +866,dc1-svc-leaf1a,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, +867,dc1-svc-leaf1a,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, +868,dc1-svc-leaf1a,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, +869,dc1-svc-leaf1a,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, +870,dc1-svc-leaf1a,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, +871,dc1-svc-leaf1a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc1-spine1 (IP: 10.255.0.1),NOT RUN, +872,dc1-svc-leaf1a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc1-spine2 (IP: 10.255.0.2),NOT RUN, +873,dc1-svc-leaf1a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-spine1 (IP: 10.33.255.16),NOT RUN, +874,dc1-svc-leaf1a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-spine2 (IP: 10.33.255.18),NOT RUN, +875,dc1-svc-leaf1a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-svc-leaf1b (IP: 10.33.1.105),NOT RUN, +876,dc1-svc-leaf1a,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, +877,dc1-svc-leaf1a,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, +878,dc1-svc-leaf1a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc1-spine1 Ethernet5,NOT RUN, +879,dc1-svc-leaf1a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc1-spine2 Ethernet5,NOT RUN, +880,dc1-svc-leaf1a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet3 - Remote: dc1-svc-leaf1b Ethernet3,NOT RUN, +881,dc1-svc-leaf1a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet4 - Remote: dc1-svc-leaf1b Ethernet4,NOT RUN, +882,dc1-svc-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.33.0.5) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3),NOT RUN, +883,dc1-svc-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.33.0.5) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4),NOT RUN, +884,dc1-svc-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.33.0.5) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5),NOT RUN, +885,dc1-svc-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.33.0.5) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1),NOT RUN, +886,dc1-svc-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.33.0.5) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2),NOT RUN, +887,dc1-svc-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.33.0.5) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5),NOT RUN, +888,dc1-svc-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.33.0.5) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6),NOT RUN, +889,dc1-svc-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.33.0.5) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1),NOT RUN, +890,dc1-svc-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.33.0.5) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2),NOT RUN, +891,dc1-svc-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.33.0.5) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13),NOT RUN, +892,dc1-svc-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.33.0.5) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14),NOT RUN, +893,dc1-svc-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.33.0.5) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15),NOT RUN, +894,dc1-svc-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.33.0.5) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16),NOT RUN, +895,dc1-svc-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.33.0.5) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17),NOT RUN, +896,dc1-svc-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.33.0.5) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18),NOT RUN, +897,dc1-svc-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.33.0.5) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11),NOT RUN, +898,dc1-svc-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.33.0.5) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12),NOT RUN, +899,dc1-svc-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet1 (IP: 10.33.255.17) - Destination: dc1-spine1 Ethernet5 (IP: 10.33.255.16),NOT RUN, +900,dc1-svc-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet2 (IP: 10.33.255.19) - Destination: dc1-spine2 Ethernet5 (IP: 10.33.255.18),NOT RUN, +901,dc1-svc-leaf1a,Field Notices,VerifyFieldNotice44Resolution,Verifies that the device is using the correct Aboot version per FN0044.,,NOT RUN, +902,dc1-svc-leaf1a,Field Notices,VerifyFieldNotice72Resolution,"Verifies if the device is exposed to FN0072, and if the issue has been mitigated.",,NOT RUN, +903,dc1-svc-leaf1a,Greent,VerifyGreenT,Verifies if a GreenT policy is created.,,NOT RUN, +904,dc1-svc-leaf1a,Greent,VerifyGreenTCounters,Verifies if the GreenT counters are incremented.,,NOT RUN, +905,dc1-svc-leaf1a,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches.,,NOT RUN, +906,dc1-svc-leaf1a,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, +907,dc1-svc-leaf1a,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, +908,dc1-svc-leaf1a,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, +909,dc1-svc-leaf1a,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, +910,dc1-svc-leaf1a,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, +911,dc1-svc-leaf1a,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +912,dc1-svc-leaf1a,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +913,dc1-svc-leaf1a,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, +914,dc1-svc-leaf1a,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, +915,dc1-svc-leaf1a,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, +916,dc1-svc-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - P2P_LINK_TO_DC1-SPINE1_Ethernet5 = 'up',NOT RUN, +917,dc1-svc-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - P2P_LINK_TO_DC1-SPINE2_Ethernet5 = 'up',NOT RUN, +918,dc1-svc-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet3 - MLAG_PEER_dc1-svc-leaf1b_Ethernet3 = 'up',NOT RUN, +919,dc1-svc-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet4 - MLAG_PEER_dc1-svc-leaf1b_Ethernet4 = 'up',NOT RUN, +920,dc1-svc-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback0 - EVPN_Overlay_Peering = 'up',NOT RUN, +921,dc1-svc-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up',NOT RUN, +922,dc1-svc-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel3 - MLAG_PEER_dc1-svc-leaf1b_Po3 = 'up',NOT RUN, +923,dc1-svc-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up',NOT RUN, +924,dc1-svc-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4094 - MLAG_PEER = 'up',NOT RUN, +925,dc1-svc-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vxlan1 = 'up',NOT RUN, +926,dc1-svc-leaf1a,LANZ,VerifyLANZ,Verifies if LANZ is enabled.,,NOT RUN, +927,dc1-svc-leaf1a,MLAG,VerifyMlagStatus,Verifies the health status of the MLAG configuration.,,NOT RUN, +928,dc1-svc-leaf1a,PTP,VerifyPtpGMStatus,Verifies that the device is locked to a valid PTP Grandmaster.,,NOT RUN, +929,dc1-svc-leaf1a,PTP,VerifyPtpLockStatus,Verifies that the device was locked to the upstream PTP GM in the last minute.,,NOT RUN, +930,dc1-svc-leaf1a,PTP,VerifyPtpModeStatus,Verifies that the device is configured as a PTP Boundary Clock.,,NOT RUN, +931,dc1-svc-leaf1a,PTP,VerifyPtpOffset,Verifies that the PTP timing offset is within +/- 1000ns from the master clock.,,NOT RUN, +932,dc1-svc-leaf1a,PTP,VerifyPtpPortModeStatus,Verifies the PTP interfaces state.,,NOT RUN, +933,dc1-svc-leaf1a,Routing,VerifyRoutingProtocolModel,Verifies the configured routing protocol model.,Routing protocol model: multi-agent,NOT RUN, +934,dc1-svc-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.1 - Peer: dc1-spine1,NOT RUN, +935,dc1-svc-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.2 - Peer: dc1-spine2,NOT RUN, +936,dc1-svc-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.3 - Peer: dc1-leaf1a,NOT RUN, +937,dc1-svc-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.4 - Peer: dc1-leaf1b,NOT RUN, +938,dc1-svc-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.5 - Peer: dc1-leaf2a,NOT RUN, +939,dc1-svc-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.3 - Peer: dc1-leaf1a,NOT RUN, +940,dc1-svc-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.5 - Peer: dc1-leaf2a,NOT RUN, +941,dc1-svc-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.11 - Peer: dc2-spine1,NOT RUN, +942,dc1-svc-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.12 - Peer: dc2-spine2,NOT RUN, +943,dc1-svc-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.13 - Peer: dc2-leaf1a,NOT RUN, +944,dc1-svc-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.14 - Peer: dc2-leaf1b,NOT RUN, +945,dc1-svc-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.15 - Peer: dc2-leaf2a,NOT RUN, +946,dc1-svc-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.16 - Peer: dc2-leaf2b,NOT RUN, +947,dc1-svc-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, +948,dc1-svc-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com,NOT RUN, +949,dc1-svc-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.13 - Peer: dc2-leaf1a,NOT RUN, +950,dc1-svc-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.15 - Peer: dc2-leaf2a,NOT RUN, +951,dc1-svc-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, +952,dc1-svc-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.1 - Peer: dc1-wan1,NOT RUN, +953,dc1-svc-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.2 - Peer: dc1-wan2,NOT RUN, +954,dc1-svc-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.33.0.5 - Peer: dc1-svc-leaf1a,NOT RUN, +955,dc1-svc-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.33.0.6 - Peer: dc1-svc-leaf1b,NOT RUN, +956,dc1-svc-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.33.1.5 - Peer: dc1-svc-leaf1a,NOT RUN, +957,dc1-svc-leaf1a,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,,NOT RUN, +958,dc1-svc-leaf1a,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, +959,dc1-svc-leaf1a,Security,VerifyAPIHttpStatus,Verifies if eAPI HTTP server is disabled globally.,,NOT RUN, +960,dc1-svc-leaf1a,Security,VerifyAPIIPv4Acl,Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF.,,NOT RUN, +961,dc1-svc-leaf1a,Security,VerifyAPIIPv6Acl,Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF.,,NOT RUN, +962,dc1-svc-leaf1a,Security,VerifyAPISSLCertificate,"Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size.",,NOT RUN, +963,dc1-svc-leaf1a,Security,VerifyBannerLogin,Verifies the login banner of a device.,,NOT RUN, +964,dc1-svc-leaf1a,Security,VerifyBannerMotd,Verifies the motd banner of a device.,,NOT RUN, +965,dc1-svc-leaf1a,Security,VerifyIPSecConnHealth,Verifies all IPv4 security connections.,,NOT RUN, +966,dc1-svc-leaf1a,Security,VerifyIPv4ACL,Verifies the configuration of IPv4 ACLs.,,NOT RUN, +967,dc1-svc-leaf1a,Security,VerifySpecificIPSecConn,Verifies IPv4 security connections for a peer.,,NOT RUN, +968,dc1-svc-leaf1a,Security,VerifySSHIPv4Acl,Verifies if the SSHD agent has IPv4 ACL(s) configured.,,NOT RUN, +969,dc1-svc-leaf1a,Security,VerifySSHIPv6Acl,Verifies if the SSHD agent has IPv6 ACL(s) configured.,,NOT RUN, +970,dc1-svc-leaf1a,Security,VerifySSHStatus,Verifies if the SSHD agent is disabled in the default VRF.,,NOT RUN, +971,dc1-svc-leaf1a,Security,VerifyTelnetStatus,Verifies if Telnet is disabled in the default VRF.,,NOT RUN, +972,dc1-svc-leaf1a,Services,VerifyDNSLookup,Verifies the DNS name to IP address resolution.,,NOT RUN, +973,dc1-svc-leaf1a,Services,VerifyDNSServers,Verifies if the DNS servers are correctly configured.,,NOT RUN, +974,dc1-svc-leaf1a,Services,VerifyErrdisableRecovery,"Verifies the errdisable recovery reason, status, and interval.",,NOT RUN, +975,dc1-svc-leaf1a,Services,VerifyHostname,Verifies the hostname of a device.,,NOT RUN, +976,dc1-svc-leaf1a,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, +977,dc1-svc-leaf1a,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, +978,dc1-svc-leaf1a,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, +979,dc1-svc-leaf1a,Software,VerifyEOSVersion,Verifies the EOS version of the device.,,NOT RUN, +980,dc1-svc-leaf1a,Software,VerifyTerminAttrVersion,Verifies the TerminAttr version of the device.,,NOT RUN, +981,dc1-svc-leaf1a,STUN,VerifyStunClient,Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided.,,NOT RUN, +982,dc1-svc-leaf1a,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, +983,dc1-svc-leaf1a,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, +984,dc1-svc-leaf1a,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, +985,dc1-svc-leaf1a,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, +986,dc1-svc-leaf1a,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, +987,dc1-svc-leaf1a,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +988,dc1-svc-leaf1a,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +989,dc1-svc-leaf1a,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, +990,dc1-svc-leaf1a,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, +991,dc1-svc-leaf1a,VLAN,VerifyVlanInternalPolicy,Verifies the VLAN internal allocation policy and the range of VLANs.,,NOT RUN, +992,dc1-svc-leaf1b,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +993,dc1-svc-leaf1b,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +994,dc1-svc-leaf1b,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, +995,dc1-svc-leaf1b,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, +996,dc1-svc-leaf1b,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, +997,dc1-svc-leaf1b,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, +998,dc1-svc-leaf1b,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, +999,dc1-svc-leaf1b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc1-spine1 (IP: 10.255.0.1),NOT RUN, +1000,dc1-svc-leaf1b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc1-spine2 (IP: 10.255.0.2),NOT RUN, +1001,dc1-svc-leaf1b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-spine1 (IP: 10.33.255.20),NOT RUN, +1002,dc1-svc-leaf1b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-spine2 (IP: 10.33.255.22),NOT RUN, +1003,dc1-svc-leaf1b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-svc-leaf1a (IP: 10.33.1.104),NOT RUN, +1004,dc1-svc-leaf1b,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, +1005,dc1-svc-leaf1b,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, +1006,dc1-svc-leaf1b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc1-spine1 Ethernet6,NOT RUN, +1007,dc1-svc-leaf1b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc1-spine2 Ethernet6,NOT RUN, +1008,dc1-svc-leaf1b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet3 - Remote: dc1-svc-leaf1a Ethernet3,NOT RUN, +1009,dc1-svc-leaf1b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet4 - Remote: dc1-svc-leaf1a Ethernet4,NOT RUN, +1010,dc1-svc-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.33.0.6) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3),NOT RUN, +1011,dc1-svc-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.33.0.6) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4),NOT RUN, +1012,dc1-svc-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.33.0.6) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5),NOT RUN, +1013,dc1-svc-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.33.0.6) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1),NOT RUN, +1014,dc1-svc-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.33.0.6) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2),NOT RUN, +1015,dc1-svc-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.33.0.6) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5),NOT RUN, +1016,dc1-svc-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.33.0.6) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6),NOT RUN, +1017,dc1-svc-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.33.0.6) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1),NOT RUN, +1018,dc1-svc-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.33.0.6) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2),NOT RUN, +1019,dc1-svc-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.33.0.6) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13),NOT RUN, +1020,dc1-svc-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.33.0.6) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14),NOT RUN, +1021,dc1-svc-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.33.0.6) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15),NOT RUN, +1022,dc1-svc-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.33.0.6) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16),NOT RUN, +1023,dc1-svc-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.33.0.6) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17),NOT RUN, +1024,dc1-svc-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.33.0.6) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18),NOT RUN, +1025,dc1-svc-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.33.0.6) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11),NOT RUN, +1026,dc1-svc-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.33.0.6) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12),NOT RUN, +1027,dc1-svc-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet1 (IP: 10.33.255.21) - Destination: dc1-spine1 Ethernet6 (IP: 10.33.255.20),NOT RUN, +1028,dc1-svc-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet2 (IP: 10.33.255.23) - Destination: dc1-spine2 Ethernet6 (IP: 10.33.255.22),NOT RUN, +1029,dc1-svc-leaf1b,Field Notices,VerifyFieldNotice44Resolution,Verifies that the device is using the correct Aboot version per FN0044.,,NOT RUN, +1030,dc1-svc-leaf1b,Field Notices,VerifyFieldNotice72Resolution,"Verifies if the device is exposed to FN0072, and if the issue has been mitigated.",,NOT RUN, +1031,dc1-svc-leaf1b,Greent,VerifyGreenT,Verifies if a GreenT policy is created.,,NOT RUN, +1032,dc1-svc-leaf1b,Greent,VerifyGreenTCounters,Verifies if the GreenT counters are incremented.,,NOT RUN, +1033,dc1-svc-leaf1b,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches.,,NOT RUN, +1034,dc1-svc-leaf1b,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, +1035,dc1-svc-leaf1b,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, +1036,dc1-svc-leaf1b,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, +1037,dc1-svc-leaf1b,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, +1038,dc1-svc-leaf1b,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, +1039,dc1-svc-leaf1b,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +1040,dc1-svc-leaf1b,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +1041,dc1-svc-leaf1b,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, +1042,dc1-svc-leaf1b,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, +1043,dc1-svc-leaf1b,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, +1044,dc1-svc-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - P2P_LINK_TO_DC1-SPINE1_Ethernet6 = 'up',NOT RUN, +1045,dc1-svc-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - P2P_LINK_TO_DC1-SPINE2_Ethernet6 = 'up',NOT RUN, +1046,dc1-svc-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet3 - MLAG_PEER_dc1-svc-leaf1a_Ethernet3 = 'up',NOT RUN, +1047,dc1-svc-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet4 - MLAG_PEER_dc1-svc-leaf1a_Ethernet4 = 'up',NOT RUN, +1048,dc1-svc-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback0 - EVPN_Overlay_Peering = 'up',NOT RUN, +1049,dc1-svc-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up',NOT RUN, +1050,dc1-svc-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel3 - MLAG_PEER_dc1-svc-leaf1a_Po3 = 'up',NOT RUN, +1051,dc1-svc-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up',NOT RUN, +1052,dc1-svc-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4094 - MLAG_PEER = 'up',NOT RUN, +1053,dc1-svc-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vxlan1 = 'up',NOT RUN, +1054,dc1-svc-leaf1b,LANZ,VerifyLANZ,Verifies if LANZ is enabled.,,NOT RUN, +1055,dc1-svc-leaf1b,MLAG,VerifyMlagStatus,Verifies the health status of the MLAG configuration.,,NOT RUN, +1056,dc1-svc-leaf1b,PTP,VerifyPtpGMStatus,Verifies that the device is locked to a valid PTP Grandmaster.,,NOT RUN, +1057,dc1-svc-leaf1b,PTP,VerifyPtpLockStatus,Verifies that the device was locked to the upstream PTP GM in the last minute.,,NOT RUN, +1058,dc1-svc-leaf1b,PTP,VerifyPtpModeStatus,Verifies that the device is configured as a PTP Boundary Clock.,,NOT RUN, +1059,dc1-svc-leaf1b,PTP,VerifyPtpOffset,Verifies that the PTP timing offset is within +/- 1000ns from the master clock.,,NOT RUN, +1060,dc1-svc-leaf1b,PTP,VerifyPtpPortModeStatus,Verifies the PTP interfaces state.,,NOT RUN, +1061,dc1-svc-leaf1b,Routing,VerifyRoutingProtocolModel,Verifies the configured routing protocol model.,Routing protocol model: multi-agent,NOT RUN, +1062,dc1-svc-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.1 - Peer: dc1-spine1,NOT RUN, +1063,dc1-svc-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.2 - Peer: dc1-spine2,NOT RUN, +1064,dc1-svc-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.3 - Peer: dc1-leaf1a,NOT RUN, +1065,dc1-svc-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.4 - Peer: dc1-leaf1b,NOT RUN, +1066,dc1-svc-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.5 - Peer: dc1-leaf2a,NOT RUN, +1067,dc1-svc-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.3 - Peer: dc1-leaf1a,NOT RUN, +1068,dc1-svc-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.5 - Peer: dc1-leaf2a,NOT RUN, +1069,dc1-svc-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.11 - Peer: dc2-spine1,NOT RUN, +1070,dc1-svc-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.12 - Peer: dc2-spine2,NOT RUN, +1071,dc1-svc-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.13 - Peer: dc2-leaf1a,NOT RUN, +1072,dc1-svc-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.14 - Peer: dc2-leaf1b,NOT RUN, +1073,dc1-svc-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.15 - Peer: dc2-leaf2a,NOT RUN, +1074,dc1-svc-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.16 - Peer: dc2-leaf2b,NOT RUN, +1075,dc1-svc-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, +1076,dc1-svc-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com,NOT RUN, +1077,dc1-svc-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.13 - Peer: dc2-leaf1a,NOT RUN, +1078,dc1-svc-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.15 - Peer: dc2-leaf2a,NOT RUN, +1079,dc1-svc-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, +1080,dc1-svc-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.1 - Peer: dc1-wan1,NOT RUN, +1081,dc1-svc-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.2 - Peer: dc1-wan2,NOT RUN, +1082,dc1-svc-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.33.0.5 - Peer: dc1-svc-leaf1a,NOT RUN, +1083,dc1-svc-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.33.0.6 - Peer: dc1-svc-leaf1b,NOT RUN, +1084,dc1-svc-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.33.1.5 - Peer: dc1-svc-leaf1a,NOT RUN, +1085,dc1-svc-leaf1b,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,,NOT RUN, +1086,dc1-svc-leaf1b,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, +1087,dc1-svc-leaf1b,Security,VerifyAPIHttpStatus,Verifies if eAPI HTTP server is disabled globally.,,NOT RUN, +1088,dc1-svc-leaf1b,Security,VerifyAPIIPv4Acl,Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF.,,NOT RUN, +1089,dc1-svc-leaf1b,Security,VerifyAPIIPv6Acl,Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF.,,NOT RUN, +1090,dc1-svc-leaf1b,Security,VerifyAPISSLCertificate,"Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size.",,NOT RUN, +1091,dc1-svc-leaf1b,Security,VerifyBannerLogin,Verifies the login banner of a device.,,NOT RUN, +1092,dc1-svc-leaf1b,Security,VerifyBannerMotd,Verifies the motd banner of a device.,,NOT RUN, +1093,dc1-svc-leaf1b,Security,VerifyIPSecConnHealth,Verifies all IPv4 security connections.,,NOT RUN, +1094,dc1-svc-leaf1b,Security,VerifyIPv4ACL,Verifies the configuration of IPv4 ACLs.,,NOT RUN, +1095,dc1-svc-leaf1b,Security,VerifySpecificIPSecConn,Verifies IPv4 security connections for a peer.,,NOT RUN, +1096,dc1-svc-leaf1b,Security,VerifySSHIPv4Acl,Verifies if the SSHD agent has IPv4 ACL(s) configured.,,NOT RUN, +1097,dc1-svc-leaf1b,Security,VerifySSHIPv6Acl,Verifies if the SSHD agent has IPv6 ACL(s) configured.,,NOT RUN, +1098,dc1-svc-leaf1b,Security,VerifySSHStatus,Verifies if the SSHD agent is disabled in the default VRF.,,NOT RUN, +1099,dc1-svc-leaf1b,Security,VerifyTelnetStatus,Verifies if Telnet is disabled in the default VRF.,,NOT RUN, +1100,dc1-svc-leaf1b,Services,VerifyDNSLookup,Verifies the DNS name to IP address resolution.,,NOT RUN, +1101,dc1-svc-leaf1b,Services,VerifyDNSServers,Verifies if the DNS servers are correctly configured.,,NOT RUN, +1102,dc1-svc-leaf1b,Services,VerifyErrdisableRecovery,"Verifies the errdisable recovery reason, status, and interval.",,NOT RUN, +1103,dc1-svc-leaf1b,Services,VerifyHostname,Verifies the hostname of a device.,,NOT RUN, +1104,dc1-svc-leaf1b,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, +1105,dc1-svc-leaf1b,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, +1106,dc1-svc-leaf1b,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, +1107,dc1-svc-leaf1b,Software,VerifyEOSVersion,Verifies the EOS version of the device.,,NOT RUN, +1108,dc1-svc-leaf1b,Software,VerifyTerminAttrVersion,Verifies the TerminAttr version of the device.,,NOT RUN, +1109,dc1-svc-leaf1b,STUN,VerifyStunClient,Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided.,,NOT RUN, +1110,dc1-svc-leaf1b,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, +1111,dc1-svc-leaf1b,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, +1112,dc1-svc-leaf1b,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, +1113,dc1-svc-leaf1b,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, +1114,dc1-svc-leaf1b,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, +1115,dc1-svc-leaf1b,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +1116,dc1-svc-leaf1b,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +1117,dc1-svc-leaf1b,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, +1118,dc1-svc-leaf1b,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, +1119,dc1-svc-leaf1b,VLAN,VerifyVlanInternalPolicy,Verifies the VLAN internal allocation policy and the range of VLANs.,,NOT RUN, +1120,dc1-wan1,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +1121,dc1-wan1,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +1122,dc1-wan1,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, +1123,dc1-wan1,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, +1124,dc1-wan1,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, +1125,dc1-wan1,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, +1126,dc1-wan1,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, +1127,dc1-wan1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc1-leaf1a (IP: 10.255.255.10),NOT RUN, +1128,dc1-wan1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc1-leaf1b (IP: 10.255.255.20),NOT RUN, +1129,dc1-wan1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc1-wan2 (IP: 10.255.1.2),NOT RUN, +1130,dc1-wan1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 SR-TE Peer: dc1-leaf1a (IP: 10.255.255.10),NOT RUN, +1131,dc1-wan1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 SR-TE Peer: dc1-leaf1b (IP: 10.255.255.20),NOT RUN, +1132,dc1-wan1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-leaf1a (IP: 10.255.255.0),NOT RUN, +1133,dc1-wan1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-leaf1b (IP: 10.255.255.2),NOT RUN, +1134,dc1-wan1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP Link-State Peer: dc1-leaf1a (IP: 10.255.255.10),NOT RUN, +1135,dc1-wan1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP Link-State Peer: dc1-leaf1b (IP: 10.255.255.20),NOT RUN, +1136,dc1-wan1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP Path-Selection Peer: dc1-leaf1a (IP: 10.255.255.10),NOT RUN, +1137,dc1-wan1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP Path-Selection Peer: dc1-leaf1b (IP: 10.255.255.20),NOT RUN, +1138,dc1-wan1,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, +1139,dc1-wan1,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, +1140,dc1-wan1,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc1-leaf1a Ethernet6,NOT RUN, +1141,dc1-wan1,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc1-leaf1b Ethernet6,NOT RUN, +1142,dc1-wan1,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet1 (IP: 10.255.255.1) - Destination: dc1-leaf1a Ethernet6 (IP: 10.255.255.0),NOT RUN, +1143,dc1-wan1,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet2 (IP: 10.255.255.3) - Destination: dc1-leaf1b Ethernet6 (IP: 10.255.255.2),NOT RUN, +1144,dc1-wan1,Field Notices,VerifyFieldNotice44Resolution,Verifies that the device is using the correct Aboot version per FN0044.,,NOT RUN, +1145,dc1-wan1,Field Notices,VerifyFieldNotice72Resolution,"Verifies if the device is exposed to FN0072, and if the issue has been mitigated.",,NOT RUN, +1146,dc1-wan1,Greent,VerifyGreenT,Verifies if a GreenT policy is created.,,NOT RUN, +1147,dc1-wan1,Greent,VerifyGreenTCounters,Verifies if the GreenT counters are incremented.,,NOT RUN, +1148,dc1-wan1,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches.,,NOT RUN, +1149,dc1-wan1,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, +1150,dc1-wan1,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, +1151,dc1-wan1,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, +1152,dc1-wan1,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, +1153,dc1-wan1,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, +1154,dc1-wan1,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +1155,dc1-wan1,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +1156,dc1-wan1,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, +1157,dc1-wan1,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, +1158,dc1-wan1,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, +1159,dc1-wan1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Dps1 - DPS Interface = 'up',NOT RUN, +1160,dc1-wan1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - P2P_LINK_TO_DC1-LEAF1A_Ethernet6 = 'up',NOT RUN, +1161,dc1-wan1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - P2P_LINK_TO_DC1-LEAF1B_Ethernet6 = 'up',NOT RUN, +1162,dc1-wan1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet3 - mpls-sp-1_DC1-MPLS-3 = 'up',NOT RUN, +1163,dc1-wan1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet4 - isp-1_DC1-INET-3 = 'up',NOT RUN, +1164,dc1-wan1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback0 - Router_ID = 'up',NOT RUN, +1165,dc1-wan1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vxlan1 = 'up',NOT RUN, +1166,dc1-wan1,LANZ,VerifyLANZ,Verifies if LANZ is enabled.,,NOT RUN, +1167,dc1-wan1,PTP,VerifyPtpGMStatus,Verifies that the device is locked to a valid PTP Grandmaster.,,NOT RUN, +1168,dc1-wan1,PTP,VerifyPtpLockStatus,Verifies that the device was locked to the upstream PTP GM in the last minute.,,NOT RUN, +1169,dc1-wan1,PTP,VerifyPtpModeStatus,Verifies that the device is configured as a PTP Boundary Clock.,,NOT RUN, +1170,dc1-wan1,PTP,VerifyPtpOffset,Verifies that the PTP timing offset is within +/- 1000ns from the master clock.,,NOT RUN, +1171,dc1-wan1,PTP,VerifyPtpPortModeStatus,Verifies the PTP interfaces state.,,NOT RUN, +1172,dc1-wan1,Routing,VerifyRoutingProtocolModel,Verifies the configured routing protocol model.,Routing protocol model: multi-agent,NOT RUN, +1173,dc1-wan1,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,,NOT RUN, +1174,dc1-wan1,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, +1175,dc1-wan1,Security,VerifyAPIHttpStatus,Verifies if eAPI HTTP server is disabled globally.,,NOT RUN, +1176,dc1-wan1,Security,VerifyAPIIPv4Acl,Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF.,,NOT RUN, +1177,dc1-wan1,Security,VerifyAPIIPv6Acl,Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF.,,NOT RUN, +1178,dc1-wan1,Security,VerifyAPISSLCertificate,"Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size.",,NOT RUN, +1179,dc1-wan1,Security,VerifyBannerLogin,Verifies the login banner of a device.,,NOT RUN, +1180,dc1-wan1,Security,VerifyBannerMotd,Verifies the motd banner of a device.,,NOT RUN, +1181,dc1-wan1,Security,VerifyIPSecConnHealth,Verifies all IPv4 security connections.,,NOT RUN, +1182,dc1-wan1,Security,VerifyIPv4ACL,Verifies the configuration of IPv4 ACLs.,,NOT RUN, +1183,dc1-wan1,Security,VerifySpecificIPSecConn,Verifies IPv4 security connections for a peer.,,NOT RUN, +1184,dc1-wan1,Security,VerifySpecificIPSecConn,Verifies IPv4 security connections for a peer.,IPv4 Peer: 10.255.1.2 VRF: default,NOT RUN, +1185,dc1-wan1,Security,VerifySpecificIPSecConn,Verifies IPv4 security connections for a peer.,IPv4 Peer: 10.255.255.10 VRF: default,NOT RUN, +1186,dc1-wan1,Security,VerifySpecificIPSecConn,Verifies IPv4 security connections for a peer.,IPv4 Peer: 10.255.255.20 VRF: default,NOT RUN, +1187,dc1-wan1,Security,VerifySSHIPv4Acl,Verifies if the SSHD agent has IPv4 ACL(s) configured.,,NOT RUN, +1188,dc1-wan1,Security,VerifySSHIPv6Acl,Verifies if the SSHD agent has IPv6 ACL(s) configured.,,NOT RUN, +1189,dc1-wan1,Security,VerifySSHStatus,Verifies if the SSHD agent is disabled in the default VRF.,,NOT RUN, +1190,dc1-wan1,Security,VerifyTelnetStatus,Verifies if Telnet is disabled in the default VRF.,,NOT RUN, +1191,dc1-wan1,Services,VerifyDNSLookup,Verifies the DNS name to IP address resolution.,,NOT RUN, +1192,dc1-wan1,Services,VerifyDNSServers,Verifies if the DNS servers are correctly configured.,,NOT RUN, +1193,dc1-wan1,Services,VerifyErrdisableRecovery,"Verifies the errdisable recovery reason, status, and interval.",,NOT RUN, +1194,dc1-wan1,Services,VerifyHostname,Verifies the hostname of a device.,,NOT RUN, +1195,dc1-wan1,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, +1196,dc1-wan1,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, +1197,dc1-wan1,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, +1198,dc1-wan1,Software,VerifyEOSVersion,Verifies the EOS version of the device.,,NOT RUN, +1199,dc1-wan1,Software,VerifyTerminAttrVersion,Verifies the TerminAttr version of the device.,,NOT RUN, +1200,dc1-wan1,STUN,VerifyStunClient,Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided.,,NOT RUN, +1201,dc1-wan1,STUN,VerifyStunClient,Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided.,Source IPv4 Address: 100.64.3.2 Source Port: 4500,NOT RUN, +1202,dc1-wan1,STUN,VerifyStunClient,Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided.,Source IPv4 Address: 172.18.3.2 Source Port: 4500,NOT RUN, +1203,dc1-wan1,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, +1204,dc1-wan1,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, +1205,dc1-wan1,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, +1206,dc1-wan1,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, +1207,dc1-wan1,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, +1208,dc1-wan1,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +1209,dc1-wan1,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +1210,dc1-wan1,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, +1211,dc1-wan1,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, +1212,dc1-wan1,VLAN,VerifyVlanInternalPolicy,Verifies the VLAN internal allocation policy and the range of VLANs.,,NOT RUN, +1213,dc1-wan2,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +1214,dc1-wan2,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +1215,dc1-wan2,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, +1216,dc1-wan2,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, +1217,dc1-wan2,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, +1218,dc1-wan2,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, +1219,dc1-wan2,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, +1220,dc1-wan2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc1-leaf1a (IP: 10.255.255.10),NOT RUN, +1221,dc1-wan2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc1-leaf1b (IP: 10.255.255.20),NOT RUN, +1222,dc1-wan2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc1-wan1 (IP: 10.255.1.1),NOT RUN, +1223,dc1-wan2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 SR-TE Peer: dc1-leaf1a (IP: 10.255.255.10),NOT RUN, +1224,dc1-wan2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 SR-TE Peer: dc1-leaf1b (IP: 10.255.255.20),NOT RUN, +1225,dc1-wan2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-leaf1a (IP: 10.255.255.4),NOT RUN, +1226,dc1-wan2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-leaf1b (IP: 10.255.255.6),NOT RUN, +1227,dc1-wan2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP Link-State Peer: dc1-leaf1a (IP: 10.255.255.10),NOT RUN, +1228,dc1-wan2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP Link-State Peer: dc1-leaf1b (IP: 10.255.255.20),NOT RUN, +1229,dc1-wan2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP Path-Selection Peer: dc1-leaf1a (IP: 10.255.255.10),NOT RUN, +1230,dc1-wan2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP Path-Selection Peer: dc1-leaf1b (IP: 10.255.255.20),NOT RUN, +1231,dc1-wan2,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, +1232,dc1-wan2,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, +1233,dc1-wan2,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc1-leaf1a Ethernet7,NOT RUN, +1234,dc1-wan2,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc1-leaf1b Ethernet7,NOT RUN, +1235,dc1-wan2,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet1 (IP: 10.255.255.5) - Destination: dc1-leaf1a Ethernet7 (IP: 10.255.255.4),NOT RUN, +1236,dc1-wan2,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet2 (IP: 10.255.255.7) - Destination: dc1-leaf1b Ethernet7 (IP: 10.255.255.6),NOT RUN, +1237,dc1-wan2,Field Notices,VerifyFieldNotice44Resolution,Verifies that the device is using the correct Aboot version per FN0044.,,NOT RUN, +1238,dc1-wan2,Field Notices,VerifyFieldNotice72Resolution,"Verifies if the device is exposed to FN0072, and if the issue has been mitigated.",,NOT RUN, +1239,dc1-wan2,Greent,VerifyGreenT,Verifies if a GreenT policy is created.,,NOT RUN, +1240,dc1-wan2,Greent,VerifyGreenTCounters,Verifies if the GreenT counters are incremented.,,NOT RUN, +1241,dc1-wan2,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches.,,NOT RUN, +1242,dc1-wan2,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, +1243,dc1-wan2,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, +1244,dc1-wan2,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, +1245,dc1-wan2,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, +1246,dc1-wan2,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, +1247,dc1-wan2,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +1248,dc1-wan2,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +1249,dc1-wan2,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, +1250,dc1-wan2,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, +1251,dc1-wan2,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, +1252,dc1-wan2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Dps1 - DPS Interface = 'up',NOT RUN, +1253,dc1-wan2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - P2P_LINK_TO_DC1-LEAF1A_Ethernet7 = 'up',NOT RUN, +1254,dc1-wan2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - P2P_LINK_TO_DC1-LEAF1B_Ethernet7 = 'up',NOT RUN, +1255,dc1-wan2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet3 - mpls-sp-1_DC1-MPLS-4 = 'up',NOT RUN, +1256,dc1-wan2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet4 - isp-1_DC1-INET-4 = 'up',NOT RUN, +1257,dc1-wan2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback0 - Router_ID = 'up',NOT RUN, +1258,dc1-wan2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vxlan1 = 'up',NOT RUN, +1259,dc1-wan2,LANZ,VerifyLANZ,Verifies if LANZ is enabled.,,NOT RUN, +1260,dc1-wan2,PTP,VerifyPtpGMStatus,Verifies that the device is locked to a valid PTP Grandmaster.,,NOT RUN, +1261,dc1-wan2,PTP,VerifyPtpLockStatus,Verifies that the device was locked to the upstream PTP GM in the last minute.,,NOT RUN, +1262,dc1-wan2,PTP,VerifyPtpModeStatus,Verifies that the device is configured as a PTP Boundary Clock.,,NOT RUN, +1263,dc1-wan2,PTP,VerifyPtpOffset,Verifies that the PTP timing offset is within +/- 1000ns from the master clock.,,NOT RUN, +1264,dc1-wan2,PTP,VerifyPtpPortModeStatus,Verifies the PTP interfaces state.,,NOT RUN, +1265,dc1-wan2,Routing,VerifyRoutingProtocolModel,Verifies the configured routing protocol model.,Routing protocol model: multi-agent,NOT RUN, +1266,dc1-wan2,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,,NOT RUN, +1267,dc1-wan2,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, +1268,dc1-wan2,Security,VerifyAPIHttpStatus,Verifies if eAPI HTTP server is disabled globally.,,NOT RUN, +1269,dc1-wan2,Security,VerifyAPIIPv4Acl,Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF.,,NOT RUN, +1270,dc1-wan2,Security,VerifyAPIIPv6Acl,Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF.,,NOT RUN, +1271,dc1-wan2,Security,VerifyAPISSLCertificate,"Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size.",,NOT RUN, +1272,dc1-wan2,Security,VerifyBannerLogin,Verifies the login banner of a device.,,NOT RUN, +1273,dc1-wan2,Security,VerifyBannerMotd,Verifies the motd banner of a device.,,NOT RUN, +1274,dc1-wan2,Security,VerifyIPSecConnHealth,Verifies all IPv4 security connections.,,NOT RUN, +1275,dc1-wan2,Security,VerifyIPv4ACL,Verifies the configuration of IPv4 ACLs.,,NOT RUN, +1276,dc1-wan2,Security,VerifySpecificIPSecConn,Verifies IPv4 security connections for a peer.,,NOT RUN, +1277,dc1-wan2,Security,VerifySpecificIPSecConn,Verifies IPv4 security connections for a peer.,IPv4 Peer: 10.255.1.1 VRF: default,NOT RUN, +1278,dc1-wan2,Security,VerifySpecificIPSecConn,Verifies IPv4 security connections for a peer.,IPv4 Peer: 10.255.255.10 VRF: default,NOT RUN, +1279,dc1-wan2,Security,VerifySpecificIPSecConn,Verifies IPv4 security connections for a peer.,IPv4 Peer: 10.255.255.20 VRF: default,NOT RUN, +1280,dc1-wan2,Security,VerifySSHIPv4Acl,Verifies if the SSHD agent has IPv4 ACL(s) configured.,,NOT RUN, +1281,dc1-wan2,Security,VerifySSHIPv6Acl,Verifies if the SSHD agent has IPv6 ACL(s) configured.,,NOT RUN, +1282,dc1-wan2,Security,VerifySSHStatus,Verifies if the SSHD agent is disabled in the default VRF.,,NOT RUN, +1283,dc1-wan2,Security,VerifyTelnetStatus,Verifies if Telnet is disabled in the default VRF.,,NOT RUN, +1284,dc1-wan2,Services,VerifyDNSLookup,Verifies the DNS name to IP address resolution.,,NOT RUN, +1285,dc1-wan2,Services,VerifyDNSServers,Verifies if the DNS servers are correctly configured.,,NOT RUN, +1286,dc1-wan2,Services,VerifyErrdisableRecovery,"Verifies the errdisable recovery reason, status, and interval.",,NOT RUN, +1287,dc1-wan2,Services,VerifyHostname,Verifies the hostname of a device.,,NOT RUN, +1288,dc1-wan2,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, +1289,dc1-wan2,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, +1290,dc1-wan2,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, +1291,dc1-wan2,Software,VerifyEOSVersion,Verifies the EOS version of the device.,,NOT RUN, +1292,dc1-wan2,Software,VerifyTerminAttrVersion,Verifies the TerminAttr version of the device.,,NOT RUN, +1293,dc1-wan2,STUN,VerifyStunClient,Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided.,,NOT RUN, +1294,dc1-wan2,STUN,VerifyStunClient,Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided.,Source IPv4 Address: 100.64.4.2 Source Port: 4500,NOT RUN, +1295,dc1-wan2,STUN,VerifyStunClient,Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided.,Source IPv4 Address: 172.18.4.2 Source Port: 4500,NOT RUN, +1296,dc1-wan2,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, +1297,dc1-wan2,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, +1298,dc1-wan2,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, +1299,dc1-wan2,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, +1300,dc1-wan2,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, +1301,dc1-wan2,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +1302,dc1-wan2,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +1303,dc1-wan2,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, +1304,dc1-wan2,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, +1305,dc1-wan2,VLAN,VerifyVlanInternalPolicy,Verifies the VLAN internal allocation policy and the range of VLANs.,,NOT RUN, +1306,dc2-leaf1a,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +1307,dc2-leaf1a,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +1308,dc2-leaf1a,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, +1309,dc2-leaf1a,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, +1310,dc2-leaf1a,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, +1311,dc2-leaf1a,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, +1312,dc2-leaf1a,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, +1313,dc2-leaf1a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-spine1 (IP: 10.255.128.11),NOT RUN, +1314,dc2-leaf1a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-spine2 (IP: 10.255.128.12),NOT RUN, +1315,dc2-leaf1a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf1b (IP: 10.255.129.117),NOT RUN, +1316,dc2-leaf1a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-spine1 (IP: 10.255.255.104),NOT RUN, +1317,dc2-leaf1a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-spine2 (IP: 10.255.255.106),NOT RUN, +1318,dc2-leaf1a,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, +1319,dc2-leaf1a,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, +1320,dc2-leaf1a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc2-spine1 Ethernet1,NOT RUN, +1321,dc2-leaf1a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc2-spine2 Ethernet1,NOT RUN, +1322,dc2-leaf1a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet3 - Remote: dc2-leaf1b Ethernet3,NOT RUN, +1323,dc2-leaf1a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet4 - Remote: dc2-leaf1b Ethernet4,NOT RUN, +1324,dc2-leaf1a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet8 - Remote: dc2-leaf1c Ethernet1,NOT RUN, +1325,dc2-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3),NOT RUN, +1326,dc2-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4),NOT RUN, +1327,dc2-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5),NOT RUN, +1328,dc2-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1),NOT RUN, +1329,dc2-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2),NOT RUN, +1330,dc2-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5),NOT RUN, +1331,dc2-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6),NOT RUN, +1332,dc2-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1),NOT RUN, +1333,dc2-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2),NOT RUN, +1334,dc2-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.13) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13),NOT RUN, +1335,dc2-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.13) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14),NOT RUN, +1336,dc2-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.13) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15),NOT RUN, +1337,dc2-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.13) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16),NOT RUN, +1338,dc2-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.13) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17),NOT RUN, +1339,dc2-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.13) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18),NOT RUN, +1340,dc2-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.13) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11),NOT RUN, +1341,dc2-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.13) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12),NOT RUN, +1342,dc2-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet1 (IP: 10.255.255.105) - Destination: dc2-spine1 Ethernet1 (IP: 10.255.255.104),NOT RUN, +1343,dc2-leaf1a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet2 (IP: 10.255.255.107) - Destination: dc2-spine2 Ethernet1 (IP: 10.255.255.106),NOT RUN, +1344,dc2-leaf1a,Field Notices,VerifyFieldNotice44Resolution,Verifies that the device is using the correct Aboot version per FN0044.,,NOT RUN, +1345,dc2-leaf1a,Field Notices,VerifyFieldNotice72Resolution,"Verifies if the device is exposed to FN0072, and if the issue has been mitigated.",,NOT RUN, +1346,dc2-leaf1a,Greent,VerifyGreenT,Verifies if a GreenT policy is created.,,NOT RUN, +1347,dc2-leaf1a,Greent,VerifyGreenTCounters,Verifies if the GreenT counters are incremented.,,NOT RUN, +1348,dc2-leaf1a,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches.,,NOT RUN, +1349,dc2-leaf1a,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, +1350,dc2-leaf1a,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, +1351,dc2-leaf1a,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, +1352,dc2-leaf1a,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, +1353,dc2-leaf1a,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, +1354,dc2-leaf1a,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +1355,dc2-leaf1a,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +1356,dc2-leaf1a,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, +1357,dc2-leaf1a,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, +1358,dc2-leaf1a,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, +1359,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - P2P_LINK_TO_DC2-SPINE1_Ethernet1 = 'up',NOT RUN, +1360,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - P2P_LINK_TO_DC2-SPINE2_Ethernet1 = 'up',NOT RUN, +1361,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet3 - MLAG_PEER_dc2-leaf1b_Ethernet3 = 'up',NOT RUN, +1362,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet4 - MLAG_PEER_dc2-leaf1b_Ethernet4 = 'up',NOT RUN, +1363,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet5 - dc2-leaf1-server1_PCI1 = 'up',NOT RUN, +1364,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet8 - DC2-LEAF1C_Ethernet1 = 'up',NOT RUN, +1365,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback0 - EVPN_Overlay_Peering = 'up',NOT RUN, +1366,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up',NOT RUN, +1367,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback10 - VRF10_VTEP_DIAGNOSTICS = 'up',NOT RUN, +1368,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback11 - VRF11_VTEP_DIAGNOSTICS = 'up',NOT RUN, +1369,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel3 - MLAG_PEER_dc2-leaf1b_Po3 = 'up',NOT RUN, +1370,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel5 - dc2-leaf1-server1_PortChannel dc2-leaf1-server1 = 'up',NOT RUN, +1371,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel8 - DC2-LEAF1C_Po1 = 'up',NOT RUN, +1372,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan11 - VRF10_VLAN11 = 'up',NOT RUN, +1373,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan12 - VRF10_VLAN12 = 'up',NOT RUN, +1374,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan21 - VRF11_VLAN21 = 'up',NOT RUN, +1375,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan22 - VRF11_VLAN22 = 'up',NOT RUN, +1376,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan3009 - MLAG_PEER_L3_iBGP: vrf VRF10 = 'up',NOT RUN, +1377,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan3010 - MLAG_PEER_L3_iBGP: vrf VRF11 = 'up',NOT RUN, +1378,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up',NOT RUN, +1379,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4094 - MLAG_PEER = 'up',NOT RUN, +1380,dc2-leaf1a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vxlan1 = 'up',NOT RUN, +1381,dc2-leaf1a,LANZ,VerifyLANZ,Verifies if LANZ is enabled.,,NOT RUN, +1382,dc2-leaf1a,Logging,VerifyLoggingAccounting,Verifies if AAA accounting logs are generated.,,NOT RUN, +1383,dc2-leaf1a,Logging,VerifyLoggingErrors,Verifies there are no syslog messages with a severity of ERRORS or higher.,,NOT RUN, +1384,dc2-leaf1a,Logging,VerifyLoggingHostname,Verifies if logs are generated with the device FQDN.,,NOT RUN, +1385,dc2-leaf1a,Logging,VerifyLoggingHosts,Verifies logging hosts (syslog servers) for a specified VRF.,,NOT RUN, +1386,dc2-leaf1a,Logging,VerifyLoggingLogsGeneration,Verifies if logs are generated.,,NOT RUN, +1387,dc2-leaf1a,Logging,VerifyLoggingPersistent,Verifies if logging persistent is enabled and logs are saved in flash.,,NOT RUN, +1388,dc2-leaf1a,Logging,VerifyLoggingSourceInt,Verifies logging source-interface for a specified VRF.,,NOT RUN, +1389,dc2-leaf1a,Logging,VerifyLoggingTimestamp,Verifies if logs are generated with the riate timestamp.,,NOT RUN, +1390,dc2-leaf1a,MLAG,VerifyMlagConfigSanity,Verifies there are no MLAG config-sanity inconsistencies.,,NOT RUN, +1391,dc2-leaf1a,MLAG,VerifyMlagDualPrimary,Verifies the MLAG dual-primary detection parameters.,,NOT RUN, +1392,dc2-leaf1a,MLAG,VerifyMlagInterfaces,Verifies there are no inactive or active-partial MLAG ports.,,NOT RUN, +1393,dc2-leaf1a,MLAG,VerifyMlagReloadDelay,Verifies the MLAG reload-delay parameters.,,NOT RUN, +1394,dc2-leaf1a,MLAG,VerifyMlagStatus,Verifies the health status of the MLAG configuration.,,NOT RUN, +1395,dc2-leaf1a,MLAG,VerifyMlagStatus,Verifies the health status of the MLAG configuration.,,NOT RUN, +1396,dc2-leaf1a,Multicast,VerifyIGMPSnoopingGlobal,Verifies the IGMP snooping global configuration.,,NOT RUN, +1397,dc2-leaf1a,Multicast,VerifyIGMPSnoopingVlans,Verifies the IGMP snooping status for the provided VLANs.,,NOT RUN, +1398,dc2-leaf1a,PTP,VerifyPtpGMStatus,Verifies that the device is locked to a valid PTP Grandmaster.,,NOT RUN, +1399,dc2-leaf1a,PTP,VerifyPtpLockStatus,Verifies that the device was locked to the upstream PTP GM in the last minute.,,NOT RUN, +1400,dc2-leaf1a,PTP,VerifyPtpModeStatus,Verifies that the device is configured as a PTP Boundary Clock.,,NOT RUN, +1401,dc2-leaf1a,PTP,VerifyPtpOffset,Verifies that the PTP timing offset is within +/- 1000ns from the master clock.,,NOT RUN, +1402,dc2-leaf1a,PTP,VerifyPtpPortModeStatus,Verifies the PTP interfaces state.,,NOT RUN, +1403,dc2-leaf1a,Routing,VerifyRoutingProtocolModel,Verifies the configured routing protocol model.,Routing protocol model: multi-agent,NOT RUN, +1404,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.1 - Peer: dc1-spine1,NOT RUN, +1405,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.2 - Peer: dc1-spine2,NOT RUN, +1406,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.3 - Peer: dc1-leaf1a,NOT RUN, +1407,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.4 - Peer: dc1-leaf1b,NOT RUN, +1408,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.5 - Peer: dc1-leaf2a,NOT RUN, +1409,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.3 - Peer: dc1-leaf1a,NOT RUN, +1410,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.5 - Peer: dc1-leaf2a,NOT RUN, +1411,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.11 - Peer: dc2-spine1,NOT RUN, +1412,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.12 - Peer: dc2-spine2,NOT RUN, +1413,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.13 - Peer: dc2-leaf1a,NOT RUN, +1414,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.14 - Peer: dc2-leaf1b,NOT RUN, +1415,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.15 - Peer: dc2-leaf2a,NOT RUN, +1416,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.16 - Peer: dc2-leaf2b,NOT RUN, +1417,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, +1418,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com,NOT RUN, +1419,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.13 - Peer: dc2-leaf1a,NOT RUN, +1420,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.15 - Peer: dc2-leaf2a,NOT RUN, +1421,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, +1422,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.1 - Peer: dc1-wan1,NOT RUN, +1423,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.2 - Peer: dc1-wan2,NOT RUN, +1424,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.33.0.5 - Peer: dc1-svc-leaf1a,NOT RUN, +1425,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.33.0.6 - Peer: dc1-svc-leaf1b,NOT RUN, +1426,dc2-leaf1a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.33.1.5 - Peer: dc1-svc-leaf1a,NOT RUN, +1427,dc2-leaf1a,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,,NOT RUN, +1428,dc2-leaf1a,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, +1429,dc2-leaf1a,Security,VerifyAPIHttpStatus,Verifies if eAPI HTTP server is disabled globally.,,NOT RUN, +1430,dc2-leaf1a,Security,VerifyAPIIPv4Acl,Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF.,,NOT RUN, +1431,dc2-leaf1a,Security,VerifyAPIIPv6Acl,Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF.,,NOT RUN, +1432,dc2-leaf1a,Security,VerifyAPISSLCertificate,"Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size.",,NOT RUN, +1433,dc2-leaf1a,Security,VerifyBannerLogin,Verifies the login banner of a device.,,NOT RUN, +1434,dc2-leaf1a,Security,VerifyBannerMotd,Verifies the motd banner of a device.,,NOT RUN, +1435,dc2-leaf1a,Security,VerifyIPSecConnHealth,Verifies all IPv4 security connections.,,NOT RUN, +1436,dc2-leaf1a,Security,VerifyIPv4ACL,Verifies the configuration of IPv4 ACLs.,,NOT RUN, +1437,dc2-leaf1a,Security,VerifySpecificIPSecConn,Verifies IPv4 security connections for a peer.,,NOT RUN, +1438,dc2-leaf1a,Security,VerifySSHIPv4Acl,Verifies if the SSHD agent has IPv4 ACL(s) configured.,,NOT RUN, +1439,dc2-leaf1a,Security,VerifySSHIPv6Acl,Verifies if the SSHD agent has IPv6 ACL(s) configured.,,NOT RUN, +1440,dc2-leaf1a,Security,VerifySSHStatus,Verifies if the SSHD agent is disabled in the default VRF.,,NOT RUN, +1441,dc2-leaf1a,Security,VerifyTelnetStatus,Verifies if Telnet is disabled in the default VRF.,,NOT RUN, +1442,dc2-leaf1a,Services,VerifyDNSLookup,Verifies the DNS name to IP address resolution.,,NOT RUN, +1443,dc2-leaf1a,Services,VerifyDNSServers,Verifies if the DNS servers are correctly configured.,,NOT RUN, +1444,dc2-leaf1a,Services,VerifyErrdisableRecovery,"Verifies the errdisable recovery reason, status, and interval.",,NOT RUN, +1445,dc2-leaf1a,Services,VerifyHostname,Verifies the hostname of a device.,,NOT RUN, +1446,dc2-leaf1a,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, +1447,dc2-leaf1a,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, +1448,dc2-leaf1a,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, +1449,dc2-leaf1a,Software,VerifyEOSVersion,Verifies the EOS version of the device.,,NOT RUN, +1450,dc2-leaf1a,Software,VerifyTerminAttrVersion,Verifies the TerminAttr version of the device.,,NOT RUN, +1451,dc2-leaf1a,STP,VerifySTPBlockedPorts,Verifies there is no STP blocked ports.,,NOT RUN, +1452,dc2-leaf1a,STP,VerifySTPCounters,Verifies there is no errors in STP BPDU packets.,,NOT RUN, +1453,dc2-leaf1a,STP,VerifySTPForwardingPorts,Verifies that all interfaces are forwarding for a provided list of VLAN(s).,,NOT RUN, +1454,dc2-leaf1a,STP,VerifySTPMode,Verifies the configured STP mode for a provided list of VLAN(s).,,NOT RUN, +1455,dc2-leaf1a,STP,VerifySTPRootPriority,Verifies the STP root priority for a provided list of VLAN or MST instance ID(s).,,NOT RUN, +1456,dc2-leaf1a,STUN,VerifyStunClient,Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided.,,NOT RUN, +1457,dc2-leaf1a,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, +1458,dc2-leaf1a,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, +1459,dc2-leaf1a,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, +1460,dc2-leaf1a,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, +1461,dc2-leaf1a,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, +1462,dc2-leaf1a,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +1463,dc2-leaf1a,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +1464,dc2-leaf1a,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, +1465,dc2-leaf1a,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, +1466,dc2-leaf1a,VLAN,VerifyVlanInternalPolicy,Verifies the VLAN internal allocation policy and the range of VLANs.,,NOT RUN, +1467,dc2-leaf1b,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +1468,dc2-leaf1b,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +1469,dc2-leaf1b,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, +1470,dc2-leaf1b,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, +1471,dc2-leaf1b,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, +1472,dc2-leaf1b,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, +1473,dc2-leaf1b,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, +1474,dc2-leaf1b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-spine1 (IP: 10.255.128.11),NOT RUN, +1475,dc2-leaf1b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-spine2 (IP: 10.255.128.12),NOT RUN, +1476,dc2-leaf1b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf1a (IP: 10.255.129.116),NOT RUN, +1477,dc2-leaf1b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-spine1 (IP: 10.255.255.108),NOT RUN, +1478,dc2-leaf1b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-spine2 (IP: 10.255.255.110),NOT RUN, +1479,dc2-leaf1b,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, +1480,dc2-leaf1b,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, +1481,dc2-leaf1b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc2-spine1 Ethernet2,NOT RUN, +1482,dc2-leaf1b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc2-spine2 Ethernet2,NOT RUN, +1483,dc2-leaf1b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet3 - Remote: dc2-leaf1a Ethernet3,NOT RUN, +1484,dc2-leaf1b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet4 - Remote: dc2-leaf1a Ethernet4,NOT RUN, +1485,dc2-leaf1b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet8 - Remote: dc2-leaf1c Ethernet2,NOT RUN, +1486,dc2-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3),NOT RUN, +1487,dc2-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4),NOT RUN, +1488,dc2-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5),NOT RUN, +1489,dc2-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1),NOT RUN, +1490,dc2-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2),NOT RUN, +1491,dc2-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5),NOT RUN, +1492,dc2-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6),NOT RUN, +1493,dc2-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1),NOT RUN, +1494,dc2-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2),NOT RUN, +1495,dc2-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.14) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13),NOT RUN, +1496,dc2-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.14) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14),NOT RUN, +1497,dc2-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.14) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15),NOT RUN, +1498,dc2-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.14) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16),NOT RUN, +1499,dc2-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.14) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17),NOT RUN, +1500,dc2-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.14) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18),NOT RUN, +1501,dc2-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.14) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11),NOT RUN, +1502,dc2-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.14) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12),NOT RUN, +1503,dc2-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet1 (IP: 10.255.255.109) - Destination: dc2-spine1 Ethernet2 (IP: 10.255.255.108),NOT RUN, +1504,dc2-leaf1b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet2 (IP: 10.255.255.111) - Destination: dc2-spine2 Ethernet2 (IP: 10.255.255.110),NOT RUN, +1505,dc2-leaf1b,Field Notices,VerifyFieldNotice44Resolution,Verifies that the device is using the correct Aboot version per FN0044.,,NOT RUN, +1506,dc2-leaf1b,Field Notices,VerifyFieldNotice72Resolution,"Verifies if the device is exposed to FN0072, and if the issue has been mitigated.",,NOT RUN, +1507,dc2-leaf1b,Greent,VerifyGreenT,Verifies if a GreenT policy is created.,,NOT RUN, +1508,dc2-leaf1b,Greent,VerifyGreenTCounters,Verifies if the GreenT counters are incremented.,,NOT RUN, +1509,dc2-leaf1b,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches.,,NOT RUN, +1510,dc2-leaf1b,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, +1511,dc2-leaf1b,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, +1512,dc2-leaf1b,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, +1513,dc2-leaf1b,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, +1514,dc2-leaf1b,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, +1515,dc2-leaf1b,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +1516,dc2-leaf1b,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +1517,dc2-leaf1b,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, +1518,dc2-leaf1b,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, +1519,dc2-leaf1b,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, +1520,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - P2P_LINK_TO_DC2-SPINE1_Ethernet2 = 'up',NOT RUN, +1521,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - P2P_LINK_TO_DC2-SPINE2_Ethernet2 = 'up',NOT RUN, +1522,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet3 - MLAG_PEER_dc2-leaf1a_Ethernet3 = 'up',NOT RUN, +1523,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet4 - MLAG_PEER_dc2-leaf1a_Ethernet4 = 'up',NOT RUN, +1524,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet5 - dc2-leaf1-server1_PCI2 = 'up',NOT RUN, +1525,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet8 - DC2-LEAF1C_Ethernet2 = 'up',NOT RUN, +1526,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback0 - EVPN_Overlay_Peering = 'up',NOT RUN, +1527,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up',NOT RUN, +1528,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback10 - VRF10_VTEP_DIAGNOSTICS = 'up',NOT RUN, +1529,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback11 - VRF11_VTEP_DIAGNOSTICS = 'up',NOT RUN, +1530,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel3 - MLAG_PEER_dc2-leaf1a_Po3 = 'up',NOT RUN, +1531,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel5 - dc2-leaf1-server1_PortChannel dc2-leaf1-server1 = 'up',NOT RUN, +1532,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel8 - DC2-LEAF1C_Po1 = 'up',NOT RUN, +1533,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan11 - VRF10_VLAN11 = 'up',NOT RUN, +1534,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan12 - VRF10_VLAN12 = 'up',NOT RUN, +1535,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan21 - VRF11_VLAN21 = 'up',NOT RUN, +1536,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan22 - VRF11_VLAN22 = 'up',NOT RUN, +1537,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan3009 - MLAG_PEER_L3_iBGP: vrf VRF10 = 'up',NOT RUN, +1538,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan3010 - MLAG_PEER_L3_iBGP: vrf VRF11 = 'up',NOT RUN, +1539,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up',NOT RUN, +1540,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4094 - MLAG_PEER = 'up',NOT RUN, +1541,dc2-leaf1b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vxlan1 = 'up',NOT RUN, +1542,dc2-leaf1b,LANZ,VerifyLANZ,Verifies if LANZ is enabled.,,NOT RUN, +1543,dc2-leaf1b,Logging,VerifyLoggingAccounting,Verifies if AAA accounting logs are generated.,,NOT RUN, +1544,dc2-leaf1b,Logging,VerifyLoggingErrors,Verifies there are no syslog messages with a severity of ERRORS or higher.,,NOT RUN, +1545,dc2-leaf1b,Logging,VerifyLoggingHostname,Verifies if logs are generated with the device FQDN.,,NOT RUN, +1546,dc2-leaf1b,Logging,VerifyLoggingHosts,Verifies logging hosts (syslog servers) for a specified VRF.,,NOT RUN, +1547,dc2-leaf1b,Logging,VerifyLoggingLogsGeneration,Verifies if logs are generated.,,NOT RUN, +1548,dc2-leaf1b,Logging,VerifyLoggingPersistent,Verifies if logging persistent is enabled and logs are saved in flash.,,NOT RUN, +1549,dc2-leaf1b,Logging,VerifyLoggingSourceInt,Verifies logging source-interface for a specified VRF.,,NOT RUN, +1550,dc2-leaf1b,Logging,VerifyLoggingTimestamp,Verifies if logs are generated with the riate timestamp.,,NOT RUN, +1551,dc2-leaf1b,MLAG,VerifyMlagConfigSanity,Verifies there are no MLAG config-sanity inconsistencies.,,NOT RUN, +1552,dc2-leaf1b,MLAG,VerifyMlagDualPrimary,Verifies the MLAG dual-primary detection parameters.,,NOT RUN, +1553,dc2-leaf1b,MLAG,VerifyMlagInterfaces,Verifies there are no inactive or active-partial MLAG ports.,,NOT RUN, +1554,dc2-leaf1b,MLAG,VerifyMlagReloadDelay,Verifies the MLAG reload-delay parameters.,,NOT RUN, +1555,dc2-leaf1b,MLAG,VerifyMlagStatus,Verifies the health status of the MLAG configuration.,,NOT RUN, +1556,dc2-leaf1b,MLAG,VerifyMlagStatus,Verifies the health status of the MLAG configuration.,,NOT RUN, +1557,dc2-leaf1b,Multicast,VerifyIGMPSnoopingGlobal,Verifies the IGMP snooping global configuration.,,NOT RUN, +1558,dc2-leaf1b,Multicast,VerifyIGMPSnoopingVlans,Verifies the IGMP snooping status for the provided VLANs.,,NOT RUN, +1559,dc2-leaf1b,PTP,VerifyPtpGMStatus,Verifies that the device is locked to a valid PTP Grandmaster.,,NOT RUN, +1560,dc2-leaf1b,PTP,VerifyPtpLockStatus,Verifies that the device was locked to the upstream PTP GM in the last minute.,,NOT RUN, +1561,dc2-leaf1b,PTP,VerifyPtpModeStatus,Verifies that the device is configured as a PTP Boundary Clock.,,NOT RUN, +1562,dc2-leaf1b,PTP,VerifyPtpOffset,Verifies that the PTP timing offset is within +/- 1000ns from the master clock.,,NOT RUN, +1563,dc2-leaf1b,PTP,VerifyPtpPortModeStatus,Verifies the PTP interfaces state.,,NOT RUN, +1564,dc2-leaf1b,Routing,VerifyRoutingProtocolModel,Verifies the configured routing protocol model.,Routing protocol model: multi-agent,NOT RUN, +1565,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.1 - Peer: dc1-spine1,NOT RUN, +1566,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.2 - Peer: dc1-spine2,NOT RUN, +1567,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.3 - Peer: dc1-leaf1a,NOT RUN, +1568,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.4 - Peer: dc1-leaf1b,NOT RUN, +1569,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.5 - Peer: dc1-leaf2a,NOT RUN, +1570,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.3 - Peer: dc1-leaf1a,NOT RUN, +1571,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.5 - Peer: dc1-leaf2a,NOT RUN, +1572,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.11 - Peer: dc2-spine1,NOT RUN, +1573,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.12 - Peer: dc2-spine2,NOT RUN, +1574,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.13 - Peer: dc2-leaf1a,NOT RUN, +1575,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.14 - Peer: dc2-leaf1b,NOT RUN, +1576,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.15 - Peer: dc2-leaf2a,NOT RUN, +1577,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.16 - Peer: dc2-leaf2b,NOT RUN, +1578,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, +1579,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com,NOT RUN, +1580,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.13 - Peer: dc2-leaf1a,NOT RUN, +1581,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.15 - Peer: dc2-leaf2a,NOT RUN, +1582,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, +1583,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.1 - Peer: dc1-wan1,NOT RUN, +1584,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.2 - Peer: dc1-wan2,NOT RUN, +1585,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.33.0.5 - Peer: dc1-svc-leaf1a,NOT RUN, +1586,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.33.0.6 - Peer: dc1-svc-leaf1b,NOT RUN, +1587,dc2-leaf1b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.33.1.5 - Peer: dc1-svc-leaf1a,NOT RUN, +1588,dc2-leaf1b,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,,NOT RUN, +1589,dc2-leaf1b,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, +1590,dc2-leaf1b,Security,VerifyAPIHttpStatus,Verifies if eAPI HTTP server is disabled globally.,,NOT RUN, +1591,dc2-leaf1b,Security,VerifyAPIIPv4Acl,Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF.,,NOT RUN, +1592,dc2-leaf1b,Security,VerifyAPIIPv6Acl,Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF.,,NOT RUN, +1593,dc2-leaf1b,Security,VerifyAPISSLCertificate,"Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size.",,NOT RUN, +1594,dc2-leaf1b,Security,VerifyBannerLogin,Verifies the login banner of a device.,,NOT RUN, +1595,dc2-leaf1b,Security,VerifyBannerMotd,Verifies the motd banner of a device.,,NOT RUN, +1596,dc2-leaf1b,Security,VerifyIPSecConnHealth,Verifies all IPv4 security connections.,,NOT RUN, +1597,dc2-leaf1b,Security,VerifyIPv4ACL,Verifies the configuration of IPv4 ACLs.,,NOT RUN, +1598,dc2-leaf1b,Security,VerifySpecificIPSecConn,Verifies IPv4 security connections for a peer.,,NOT RUN, +1599,dc2-leaf1b,Security,VerifySSHIPv4Acl,Verifies if the SSHD agent has IPv4 ACL(s) configured.,,NOT RUN, +1600,dc2-leaf1b,Security,VerifySSHIPv6Acl,Verifies if the SSHD agent has IPv6 ACL(s) configured.,,NOT RUN, +1601,dc2-leaf1b,Security,VerifySSHStatus,Verifies if the SSHD agent is disabled in the default VRF.,,NOT RUN, +1602,dc2-leaf1b,Security,VerifyTelnetStatus,Verifies if Telnet is disabled in the default VRF.,,NOT RUN, +1603,dc2-leaf1b,Services,VerifyDNSLookup,Verifies the DNS name to IP address resolution.,,NOT RUN, +1604,dc2-leaf1b,Services,VerifyDNSServers,Verifies if the DNS servers are correctly configured.,,NOT RUN, +1605,dc2-leaf1b,Services,VerifyErrdisableRecovery,"Verifies the errdisable recovery reason, status, and interval.",,NOT RUN, +1606,dc2-leaf1b,Services,VerifyHostname,Verifies the hostname of a device.,,NOT RUN, +1607,dc2-leaf1b,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, +1608,dc2-leaf1b,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, +1609,dc2-leaf1b,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, +1610,dc2-leaf1b,Software,VerifyEOSVersion,Verifies the EOS version of the device.,,NOT RUN, +1611,dc2-leaf1b,Software,VerifyTerminAttrVersion,Verifies the TerminAttr version of the device.,,NOT RUN, +1612,dc2-leaf1b,STP,VerifySTPBlockedPorts,Verifies there is no STP blocked ports.,,NOT RUN, +1613,dc2-leaf1b,STP,VerifySTPCounters,Verifies there is no errors in STP BPDU packets.,,NOT RUN, +1614,dc2-leaf1b,STP,VerifySTPForwardingPorts,Verifies that all interfaces are forwarding for a provided list of VLAN(s).,,NOT RUN, +1615,dc2-leaf1b,STP,VerifySTPMode,Verifies the configured STP mode for a provided list of VLAN(s).,,NOT RUN, +1616,dc2-leaf1b,STP,VerifySTPRootPriority,Verifies the STP root priority for a provided list of VLAN or MST instance ID(s).,,NOT RUN, +1617,dc2-leaf1b,STUN,VerifyStunClient,Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided.,,NOT RUN, +1618,dc2-leaf1b,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, +1619,dc2-leaf1b,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, +1620,dc2-leaf1b,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, +1621,dc2-leaf1b,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, +1622,dc2-leaf1b,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, +1623,dc2-leaf1b,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +1624,dc2-leaf1b,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +1625,dc2-leaf1b,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, +1626,dc2-leaf1b,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, +1627,dc2-leaf1b,VLAN,VerifyVlanInternalPolicy,Verifies the VLAN internal allocation policy and the range of VLANs.,,NOT RUN, +1628,dc2-leaf1c,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +1629,dc2-leaf1c,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +1630,dc2-leaf1c,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, +1631,dc2-leaf1c,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, +1632,dc2-leaf1c,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, +1633,dc2-leaf1c,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, +1634,dc2-leaf1c,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, +1635,dc2-leaf1c,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, +1636,dc2-leaf1c,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, +1637,dc2-leaf1c,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc2-leaf1a Ethernet8,NOT RUN, +1638,dc2-leaf1c,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc2-leaf1b Ethernet8,NOT RUN, +1639,dc2-leaf1c,Field Notices,VerifyFieldNotice44Resolution,Verifies that the device is using the correct Aboot version per FN0044.,,NOT RUN, +1640,dc2-leaf1c,Field Notices,VerifyFieldNotice72Resolution,"Verifies if the device is exposed to FN0072, and if the issue has been mitigated.",,NOT RUN, +1641,dc2-leaf1c,Greent,VerifyGreenT,Verifies if a GreenT policy is created.,,NOT RUN, +1642,dc2-leaf1c,Greent,VerifyGreenTCounters,Verifies if the GreenT counters are incremented.,,NOT RUN, +1643,dc2-leaf1c,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches.,,NOT RUN, +1644,dc2-leaf1c,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, +1645,dc2-leaf1c,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, +1646,dc2-leaf1c,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, +1647,dc2-leaf1c,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, +1648,dc2-leaf1c,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, +1649,dc2-leaf1c,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +1650,dc2-leaf1c,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +1651,dc2-leaf1c,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, +1652,dc2-leaf1c,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, +1653,dc2-leaf1c,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, +1654,dc2-leaf1c,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - DC2-LEAF1A_Ethernet8 = 'up',NOT RUN, +1655,dc2-leaf1c,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - DC2-LEAF1B_Ethernet8 = 'up',NOT RUN, +1656,dc2-leaf1c,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet5 - dc2-leaf1-server1_iLO = 'up',NOT RUN, +1657,dc2-leaf1c,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel1 - DC2_L3_LEAF1_Po8 = 'up',NOT RUN, +1658,dc2-leaf1c,LANZ,VerifyLANZ,Verifies if LANZ is enabled.,,NOT RUN, +1659,dc2-leaf1c,PTP,VerifyPtpGMStatus,Verifies that the device is locked to a valid PTP Grandmaster.,,NOT RUN, +1660,dc2-leaf1c,PTP,VerifyPtpLockStatus,Verifies that the device was locked to the upstream PTP GM in the last minute.,,NOT RUN, +1661,dc2-leaf1c,PTP,VerifyPtpModeStatus,Verifies that the device is configured as a PTP Boundary Clock.,,NOT RUN, +1662,dc2-leaf1c,PTP,VerifyPtpOffset,Verifies that the PTP timing offset is within +/- 1000ns from the master clock.,,NOT RUN, +1663,dc2-leaf1c,PTP,VerifyPtpPortModeStatus,Verifies the PTP interfaces state.,,NOT RUN, +1664,dc2-leaf1c,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,,NOT RUN, +1665,dc2-leaf1c,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, +1666,dc2-leaf1c,Security,VerifyAPIHttpStatus,Verifies if eAPI HTTP server is disabled globally.,,NOT RUN, +1667,dc2-leaf1c,Security,VerifyAPIIPv4Acl,Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF.,,NOT RUN, +1668,dc2-leaf1c,Security,VerifyAPIIPv6Acl,Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF.,,NOT RUN, +1669,dc2-leaf1c,Security,VerifyAPISSLCertificate,"Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size.",,NOT RUN, +1670,dc2-leaf1c,Security,VerifyBannerLogin,Verifies the login banner of a device.,,NOT RUN, +1671,dc2-leaf1c,Security,VerifyBannerMotd,Verifies the motd banner of a device.,,NOT RUN, +1672,dc2-leaf1c,Security,VerifyIPSecConnHealth,Verifies all IPv4 security connections.,,NOT RUN, +1673,dc2-leaf1c,Security,VerifyIPv4ACL,Verifies the configuration of IPv4 ACLs.,,NOT RUN, +1674,dc2-leaf1c,Security,VerifySpecificIPSecConn,Verifies IPv4 security connections for a peer.,,NOT RUN, +1675,dc2-leaf1c,Security,VerifySSHIPv4Acl,Verifies if the SSHD agent has IPv4 ACL(s) configured.,,NOT RUN, +1676,dc2-leaf1c,Security,VerifySSHIPv6Acl,Verifies if the SSHD agent has IPv6 ACL(s) configured.,,NOT RUN, +1677,dc2-leaf1c,Security,VerifySSHStatus,Verifies if the SSHD agent is disabled in the default VRF.,,NOT RUN, +1678,dc2-leaf1c,Security,VerifyTelnetStatus,Verifies if Telnet is disabled in the default VRF.,,NOT RUN, +1679,dc2-leaf1c,Services,VerifyDNSLookup,Verifies the DNS name to IP address resolution.,,NOT RUN, +1680,dc2-leaf1c,Services,VerifyDNSServers,Verifies if the DNS servers are correctly configured.,,NOT RUN, +1681,dc2-leaf1c,Services,VerifyErrdisableRecovery,"Verifies the errdisable recovery reason, status, and interval.",,NOT RUN, +1682,dc2-leaf1c,Services,VerifyHostname,Verifies the hostname of a device.,,NOT RUN, +1683,dc2-leaf1c,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, +1684,dc2-leaf1c,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, +1685,dc2-leaf1c,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, +1686,dc2-leaf1c,Software,VerifyEOSVersion,Verifies the EOS version of the device.,,NOT RUN, +1687,dc2-leaf1c,Software,VerifyTerminAttrVersion,Verifies the TerminAttr version of the device.,,NOT RUN, +1688,dc2-leaf1c,STUN,VerifyStunClient,Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided.,,NOT RUN, +1689,dc2-leaf1c,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, +1690,dc2-leaf1c,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, +1691,dc2-leaf1c,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, +1692,dc2-leaf1c,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, +1693,dc2-leaf1c,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, +1694,dc2-leaf1c,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +1695,dc2-leaf1c,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +1696,dc2-leaf1c,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, +1697,dc2-leaf1c,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, +1698,dc2-leaf1c,VLAN,VerifyVlanInternalPolicy,Verifies the VLAN internal allocation policy and the range of VLANs.,,NOT RUN, +1699,dc2-leaf2a,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +1700,dc2-leaf2a,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +1701,dc2-leaf2a,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, +1702,dc2-leaf2a,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, +1703,dc2-leaf2a,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, +1704,dc2-leaf2a,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, +1705,dc2-leaf2a,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, +1706,dc2-leaf2a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc1-leaf2a (IP: 10.255.0.5),NOT RUN, +1707,dc2-leaf2a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-spine1 (IP: 10.255.128.11),NOT RUN, +1708,dc2-leaf2a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-spine2 (IP: 10.255.128.12),NOT RUN, +1709,dc2-leaf2a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc1-leaf2a (IP: 192.168.100.0),NOT RUN, +1710,dc2-leaf2a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf2b (IP: 10.255.129.121),NOT RUN, +1711,dc2-leaf2a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-spine1 (IP: 10.255.255.112),NOT RUN, +1712,dc2-leaf2a,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-spine2 (IP: 10.255.255.114),NOT RUN, +1713,dc2-leaf2a,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, +1714,dc2-leaf2a,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, +1715,dc2-leaf2a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc2-spine1 Ethernet3,NOT RUN, +1716,dc2-leaf2a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc2-spine2 Ethernet3,NOT RUN, +1717,dc2-leaf2a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet3 - Remote: dc2-leaf2b Ethernet3,NOT RUN, +1718,dc2-leaf2a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet4 - Remote: dc2-leaf2b Ethernet4,NOT RUN, +1719,dc2-leaf2a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet6 - Remote: dc1-leaf2a Ethernet6,NOT RUN, +1720,dc2-leaf2a,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet8 - Remote: dc2-leaf2c Ethernet1,NOT RUN, +1721,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3),NOT RUN, +1722,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4),NOT RUN, +1723,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5),NOT RUN, +1724,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1),NOT RUN, +1725,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2),NOT RUN, +1726,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5),NOT RUN, +1727,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6),NOT RUN, +1728,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1),NOT RUN, +1729,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2),NOT RUN, +1730,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.15) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13),NOT RUN, +1731,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.15) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14),NOT RUN, +1732,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.15) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15),NOT RUN, +1733,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.15) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16),NOT RUN, +1734,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.15) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17),NOT RUN, +1735,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.15) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18),NOT RUN, +1736,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.15) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11),NOT RUN, +1737,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.15) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12),NOT RUN, +1738,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet1 (IP: 10.255.255.113) - Destination: dc2-spine1 Ethernet3 (IP: 10.255.255.112),NOT RUN, +1739,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet2 (IP: 10.255.255.115) - Destination: dc2-spine2 Ethernet3 (IP: 10.255.255.114),NOT RUN, +1740,dc2-leaf2a,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet6 (IP: 192.168.100.1) - Destination: dc1-leaf2a Ethernet6 (IP: 192.168.100.0),NOT RUN, +1741,dc2-leaf2a,Field Notices,VerifyFieldNotice44Resolution,Verifies that the device is using the correct Aboot version per FN0044.,,NOT RUN, +1742,dc2-leaf2a,Field Notices,VerifyFieldNotice72Resolution,"Verifies if the device is exposed to FN0072, and if the issue has been mitigated.",,NOT RUN, +1743,dc2-leaf2a,Greent,VerifyGreenT,Verifies if a GreenT policy is created.,,NOT RUN, +1744,dc2-leaf2a,Greent,VerifyGreenTCounters,Verifies if the GreenT counters are incremented.,,NOT RUN, +1745,dc2-leaf2a,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches.,,NOT RUN, +1746,dc2-leaf2a,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, +1747,dc2-leaf2a,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, +1748,dc2-leaf2a,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, +1749,dc2-leaf2a,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, +1750,dc2-leaf2a,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, +1751,dc2-leaf2a,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +1752,dc2-leaf2a,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +1753,dc2-leaf2a,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, +1754,dc2-leaf2a,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, +1755,dc2-leaf2a,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, +1756,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - P2P_LINK_TO_DC2-SPINE1_Ethernet3 = 'up',NOT RUN, +1757,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - P2P_LINK_TO_DC2-SPINE2_Ethernet3 = 'up',NOT RUN, +1758,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet3 - MLAG_PEER_dc2-leaf2b_Ethernet3 = 'up',NOT RUN, +1759,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet4 - MLAG_PEER_dc2-leaf2b_Ethernet4 = 'up',NOT RUN, +1760,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet5 - dc2-leaf2-server1_PCI1 = 'up',NOT RUN, +1761,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet6 - P2P_LINK_TO_dc1-leaf2a_Ethernet6 = 'up',NOT RUN, +1762,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet8 - DC2-LEAF2C_Ethernet1 = 'up',NOT RUN, +1763,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback0 - EVPN_Overlay_Peering = 'up',NOT RUN, +1764,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up',NOT RUN, +1765,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback10 - VRF10_VTEP_DIAGNOSTICS = 'up',NOT RUN, +1766,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback11 - VRF11_VTEP_DIAGNOSTICS = 'up',NOT RUN, +1767,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel3 - MLAG_PEER_dc2-leaf2b_Po3 = 'up',NOT RUN, +1768,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel5 - dc2-leaf2-server1_PortChannel dc2-leaf2-server1 = 'up',NOT RUN, +1769,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel8 - DC2-LEAF2C_Po1 = 'up',NOT RUN, +1770,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan11 - VRF10_VLAN11 = 'up',NOT RUN, +1771,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan12 - VRF10_VLAN12 = 'up',NOT RUN, +1772,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan21 - VRF11_VLAN21 = 'up',NOT RUN, +1773,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan22 - VRF11_VLAN22 = 'up',NOT RUN, +1774,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan3009 - MLAG_PEER_L3_iBGP: vrf VRF10 = 'up',NOT RUN, +1775,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan3010 - MLAG_PEER_L3_iBGP: vrf VRF11 = 'up',NOT RUN, +1776,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up',NOT RUN, +1777,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4094 - MLAG_PEER = 'up',NOT RUN, +1778,dc2-leaf2a,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vxlan1 = 'up',NOT RUN, +1779,dc2-leaf2a,LANZ,VerifyLANZ,Verifies if LANZ is enabled.,,NOT RUN, +1780,dc2-leaf2a,Logging,VerifyLoggingAccounting,Verifies if AAA accounting logs are generated.,,NOT RUN, +1781,dc2-leaf2a,Logging,VerifyLoggingErrors,Verifies there are no syslog messages with a severity of ERRORS or higher.,,NOT RUN, +1782,dc2-leaf2a,Logging,VerifyLoggingHostname,Verifies if logs are generated with the device FQDN.,,NOT RUN, +1783,dc2-leaf2a,Logging,VerifyLoggingHosts,Verifies logging hosts (syslog servers) for a specified VRF.,,NOT RUN, +1784,dc2-leaf2a,Logging,VerifyLoggingLogsGeneration,Verifies if logs are generated.,,NOT RUN, +1785,dc2-leaf2a,Logging,VerifyLoggingPersistent,Verifies if logging persistent is enabled and logs are saved in flash.,,NOT RUN, +1786,dc2-leaf2a,Logging,VerifyLoggingSourceInt,Verifies logging source-interface for a specified VRF.,,NOT RUN, +1787,dc2-leaf2a,Logging,VerifyLoggingTimestamp,Verifies if logs are generated with the riate timestamp.,,NOT RUN, +1788,dc2-leaf2a,MLAG,VerifyMlagConfigSanity,Verifies there are no MLAG config-sanity inconsistencies.,,NOT RUN, +1789,dc2-leaf2a,MLAG,VerifyMlagDualPrimary,Verifies the MLAG dual-primary detection parameters.,,NOT RUN, +1790,dc2-leaf2a,MLAG,VerifyMlagInterfaces,Verifies there are no inactive or active-partial MLAG ports.,,NOT RUN, +1791,dc2-leaf2a,MLAG,VerifyMlagReloadDelay,Verifies the MLAG reload-delay parameters.,,NOT RUN, +1792,dc2-leaf2a,MLAG,VerifyMlagStatus,Verifies the health status of the MLAG configuration.,,NOT RUN, +1793,dc2-leaf2a,MLAG,VerifyMlagStatus,Verifies the health status of the MLAG configuration.,,NOT RUN, +1794,dc2-leaf2a,Multicast,VerifyIGMPSnoopingGlobal,Verifies the IGMP snooping global configuration.,,NOT RUN, +1795,dc2-leaf2a,Multicast,VerifyIGMPSnoopingVlans,Verifies the IGMP snooping status for the provided VLANs.,,NOT RUN, +1796,dc2-leaf2a,PTP,VerifyPtpGMStatus,Verifies that the device is locked to a valid PTP Grandmaster.,,NOT RUN, +1797,dc2-leaf2a,PTP,VerifyPtpLockStatus,Verifies that the device was locked to the upstream PTP GM in the last minute.,,NOT RUN, +1798,dc2-leaf2a,PTP,VerifyPtpModeStatus,Verifies that the device is configured as a PTP Boundary Clock.,,NOT RUN, +1799,dc2-leaf2a,PTP,VerifyPtpOffset,Verifies that the PTP timing offset is within +/- 1000ns from the master clock.,,NOT RUN, +1800,dc2-leaf2a,PTP,VerifyPtpPortModeStatus,Verifies the PTP interfaces state.,,NOT RUN, +1801,dc2-leaf2a,Routing,VerifyRoutingProtocolModel,Verifies the configured routing protocol model.,Routing protocol model: multi-agent,NOT RUN, +1802,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.1 - Peer: dc1-spine1,NOT RUN, +1803,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.2 - Peer: dc1-spine2,NOT RUN, +1804,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.3 - Peer: dc1-leaf1a,NOT RUN, +1805,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.4 - Peer: dc1-leaf1b,NOT RUN, +1806,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.5 - Peer: dc1-leaf2a,NOT RUN, +1807,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.3 - Peer: dc1-leaf1a,NOT RUN, +1808,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.5 - Peer: dc1-leaf2a,NOT RUN, +1809,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.11 - Peer: dc2-spine1,NOT RUN, +1810,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.12 - Peer: dc2-spine2,NOT RUN, +1811,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.13 - Peer: dc2-leaf1a,NOT RUN, +1812,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.14 - Peer: dc2-leaf1b,NOT RUN, +1813,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.15 - Peer: dc2-leaf2a,NOT RUN, +1814,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.16 - Peer: dc2-leaf2b,NOT RUN, +1815,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, +1816,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com,NOT RUN, +1817,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.13 - Peer: dc2-leaf1a,NOT RUN, +1818,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.15 - Peer: dc2-leaf2a,NOT RUN, +1819,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, +1820,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.1 - Peer: dc1-wan1,NOT RUN, +1821,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.2 - Peer: dc1-wan2,NOT RUN, +1822,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.33.0.5 - Peer: dc1-svc-leaf1a,NOT RUN, +1823,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.33.0.6 - Peer: dc1-svc-leaf1b,NOT RUN, +1824,dc2-leaf2a,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.33.1.5 - Peer: dc1-svc-leaf1a,NOT RUN, +1825,dc2-leaf2a,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,,NOT RUN, +1826,dc2-leaf2a,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, +1827,dc2-leaf2a,Security,VerifyAPIHttpStatus,Verifies if eAPI HTTP server is disabled globally.,,NOT RUN, +1828,dc2-leaf2a,Security,VerifyAPIIPv4Acl,Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF.,,NOT RUN, +1829,dc2-leaf2a,Security,VerifyAPIIPv6Acl,Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF.,,NOT RUN, +1830,dc2-leaf2a,Security,VerifyAPISSLCertificate,"Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size.",,NOT RUN, +1831,dc2-leaf2a,Security,VerifyBannerLogin,Verifies the login banner of a device.,,NOT RUN, +1832,dc2-leaf2a,Security,VerifyBannerMotd,Verifies the motd banner of a device.,,NOT RUN, +1833,dc2-leaf2a,Security,VerifyIPSecConnHealth,Verifies all IPv4 security connections.,,NOT RUN, +1834,dc2-leaf2a,Security,VerifyIPv4ACL,Verifies the configuration of IPv4 ACLs.,,NOT RUN, +1835,dc2-leaf2a,Security,VerifySpecificIPSecConn,Verifies IPv4 security connections for a peer.,,NOT RUN, +1836,dc2-leaf2a,Security,VerifySSHIPv4Acl,Verifies if the SSHD agent has IPv4 ACL(s) configured.,,NOT RUN, +1837,dc2-leaf2a,Security,VerifySSHIPv6Acl,Verifies if the SSHD agent has IPv6 ACL(s) configured.,,NOT RUN, +1838,dc2-leaf2a,Security,VerifySSHStatus,Verifies if the SSHD agent is disabled in the default VRF.,,NOT RUN, +1839,dc2-leaf2a,Security,VerifyTelnetStatus,Verifies if Telnet is disabled in the default VRF.,,NOT RUN, +1840,dc2-leaf2a,Services,VerifyDNSLookup,Verifies the DNS name to IP address resolution.,,NOT RUN, +1841,dc2-leaf2a,Services,VerifyDNSServers,Verifies if the DNS servers are correctly configured.,,NOT RUN, +1842,dc2-leaf2a,Services,VerifyErrdisableRecovery,"Verifies the errdisable recovery reason, status, and interval.",,NOT RUN, +1843,dc2-leaf2a,Services,VerifyHostname,Verifies the hostname of a device.,,NOT RUN, +1844,dc2-leaf2a,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, +1845,dc2-leaf2a,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, +1846,dc2-leaf2a,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, +1847,dc2-leaf2a,Software,VerifyEOSVersion,Verifies the EOS version of the device.,,NOT RUN, +1848,dc2-leaf2a,Software,VerifyTerminAttrVersion,Verifies the TerminAttr version of the device.,,NOT RUN, +1849,dc2-leaf2a,STP,VerifySTPBlockedPorts,Verifies there is no STP blocked ports.,,NOT RUN, +1850,dc2-leaf2a,STP,VerifySTPCounters,Verifies there is no errors in STP BPDU packets.,,NOT RUN, +1851,dc2-leaf2a,STP,VerifySTPForwardingPorts,Verifies that all interfaces are forwarding for a provided list of VLAN(s).,,NOT RUN, +1852,dc2-leaf2a,STP,VerifySTPMode,Verifies the configured STP mode for a provided list of VLAN(s).,,NOT RUN, +1853,dc2-leaf2a,STP,VerifySTPRootPriority,Verifies the STP root priority for a provided list of VLAN or MST instance ID(s).,,NOT RUN, +1854,dc2-leaf2a,STUN,VerifyStunClient,Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided.,,NOT RUN, +1855,dc2-leaf2a,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, +1856,dc2-leaf2a,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, +1857,dc2-leaf2a,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, +1858,dc2-leaf2a,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, +1859,dc2-leaf2a,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, +1860,dc2-leaf2a,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +1861,dc2-leaf2a,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +1862,dc2-leaf2a,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, +1863,dc2-leaf2a,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, +1864,dc2-leaf2a,VLAN,VerifyVlanInternalPolicy,Verifies the VLAN internal allocation policy and the range of VLANs.,,NOT RUN, +1865,dc2-leaf2b,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +1866,dc2-leaf2b,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +1867,dc2-leaf2b,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, +1868,dc2-leaf2b,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, +1869,dc2-leaf2b,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, +1870,dc2-leaf2b,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, +1871,dc2-leaf2b,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, +1872,dc2-leaf2b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-spine1 (IP: 10.255.128.11),NOT RUN, +1873,dc2-leaf2b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-spine2 (IP: 10.255.128.12),NOT RUN, +1874,dc2-leaf2b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf2a (IP: 10.255.129.120),NOT RUN, +1875,dc2-leaf2b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-spine1 (IP: 10.255.255.116),NOT RUN, +1876,dc2-leaf2b,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-spine2 (IP: 10.255.255.118),NOT RUN, +1877,dc2-leaf2b,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, +1878,dc2-leaf2b,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, +1879,dc2-leaf2b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc2-spine1 Ethernet4,NOT RUN, +1880,dc2-leaf2b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc2-spine2 Ethernet4,NOT RUN, +1881,dc2-leaf2b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet3 - Remote: dc2-leaf2a Ethernet3,NOT RUN, +1882,dc2-leaf2b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet4 - Remote: dc2-leaf2a Ethernet4,NOT RUN, +1883,dc2-leaf2b,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet8 - Remote: dc2-leaf2c Ethernet2,NOT RUN, +1884,dc2-leaf2b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3),NOT RUN, +1885,dc2-leaf2b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4),NOT RUN, +1886,dc2-leaf2b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5),NOT RUN, +1887,dc2-leaf2b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1),NOT RUN, +1888,dc2-leaf2b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2),NOT RUN, +1889,dc2-leaf2b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5),NOT RUN, +1890,dc2-leaf2b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6),NOT RUN, +1891,dc2-leaf2b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1),NOT RUN, +1892,dc2-leaf2b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2),NOT RUN, +1893,dc2-leaf2b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.16) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13),NOT RUN, +1894,dc2-leaf2b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.16) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14),NOT RUN, +1895,dc2-leaf2b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.16) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15),NOT RUN, +1896,dc2-leaf2b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.16) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16),NOT RUN, +1897,dc2-leaf2b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.16) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17),NOT RUN, +1898,dc2-leaf2b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.16) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18),NOT RUN, +1899,dc2-leaf2b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.16) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11),NOT RUN, +1900,dc2-leaf2b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.16) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12),NOT RUN, +1901,dc2-leaf2b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet1 (IP: 10.255.255.117) - Destination: dc2-spine1 Ethernet4 (IP: 10.255.255.116),NOT RUN, +1902,dc2-leaf2b,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet2 (IP: 10.255.255.119) - Destination: dc2-spine2 Ethernet4 (IP: 10.255.255.118),NOT RUN, +1903,dc2-leaf2b,Field Notices,VerifyFieldNotice44Resolution,Verifies that the device is using the correct Aboot version per FN0044.,,NOT RUN, +1904,dc2-leaf2b,Field Notices,VerifyFieldNotice72Resolution,"Verifies if the device is exposed to FN0072, and if the issue has been mitigated.",,NOT RUN, +1905,dc2-leaf2b,Greent,VerifyGreenT,Verifies if a GreenT policy is created.,,NOT RUN, +1906,dc2-leaf2b,Greent,VerifyGreenTCounters,Verifies if the GreenT counters are incremented.,,NOT RUN, +1907,dc2-leaf2b,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches.,,NOT RUN, +1908,dc2-leaf2b,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, +1909,dc2-leaf2b,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, +1910,dc2-leaf2b,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, +1911,dc2-leaf2b,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, +1912,dc2-leaf2b,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, +1913,dc2-leaf2b,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +1914,dc2-leaf2b,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +1915,dc2-leaf2b,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, +1916,dc2-leaf2b,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, +1917,dc2-leaf2b,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, +1918,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - P2P_LINK_TO_DC2-SPINE1_Ethernet4 = 'up',NOT RUN, +1919,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - P2P_LINK_TO_DC2-SPINE2_Ethernet4 = 'up',NOT RUN, +1920,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet3 - MLAG_PEER_dc2-leaf2a_Ethernet3 = 'up',NOT RUN, +1921,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet4 - MLAG_PEER_dc2-leaf2a_Ethernet4 = 'up',NOT RUN, +1922,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet5 - dc2-leaf2-server1_PCI2 = 'up',NOT RUN, +1923,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet6 - P2P_LINK_TO_dc1-leaf2b_Ethernet6 = 'up',NOT RUN, +1924,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet8 - DC2-LEAF2C_Ethernet2 = 'up',NOT RUN, +1925,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback0 - EVPN_Overlay_Peering = 'up',NOT RUN, +1926,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up',NOT RUN, +1927,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback10 - VRF10_VTEP_DIAGNOSTICS = 'up',NOT RUN, +1928,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback11 - VRF11_VTEP_DIAGNOSTICS = 'up',NOT RUN, +1929,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel3 - MLAG_PEER_dc2-leaf2a_Po3 = 'up',NOT RUN, +1930,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel5 - dc2-leaf2-server1_PortChannel dc2-leaf2-server1 = 'up',NOT RUN, +1931,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel8 - DC2-LEAF2C_Po1 = 'up',NOT RUN, +1932,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan11 - VRF10_VLAN11 = 'up',NOT RUN, +1933,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan12 - VRF10_VLAN12 = 'up',NOT RUN, +1934,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan21 - VRF11_VLAN21 = 'up',NOT RUN, +1935,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan22 - VRF11_VLAN22 = 'up',NOT RUN, +1936,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan3009 - MLAG_PEER_L3_iBGP: vrf VRF10 = 'up',NOT RUN, +1937,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan3010 - MLAG_PEER_L3_iBGP: vrf VRF11 = 'up',NOT RUN, +1938,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up',NOT RUN, +1939,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4094 - MLAG_PEER = 'up',NOT RUN, +1940,dc2-leaf2b,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vxlan1 = 'up',NOT RUN, +1941,dc2-leaf2b,LANZ,VerifyLANZ,Verifies if LANZ is enabled.,,NOT RUN, +1942,dc2-leaf2b,Logging,VerifyLoggingAccounting,Verifies if AAA accounting logs are generated.,,NOT RUN, +1943,dc2-leaf2b,Logging,VerifyLoggingErrors,Verifies there are no syslog messages with a severity of ERRORS or higher.,,NOT RUN, +1944,dc2-leaf2b,Logging,VerifyLoggingHostname,Verifies if logs are generated with the device FQDN.,,NOT RUN, +1945,dc2-leaf2b,Logging,VerifyLoggingHosts,Verifies logging hosts (syslog servers) for a specified VRF.,,NOT RUN, +1946,dc2-leaf2b,Logging,VerifyLoggingLogsGeneration,Verifies if logs are generated.,,NOT RUN, +1947,dc2-leaf2b,Logging,VerifyLoggingPersistent,Verifies if logging persistent is enabled and logs are saved in flash.,,NOT RUN, +1948,dc2-leaf2b,Logging,VerifyLoggingSourceInt,Verifies logging source-interface for a specified VRF.,,NOT RUN, +1949,dc2-leaf2b,Logging,VerifyLoggingTimestamp,Verifies if logs are generated with the riate timestamp.,,NOT RUN, +1950,dc2-leaf2b,MLAG,VerifyMlagConfigSanity,Verifies there are no MLAG config-sanity inconsistencies.,,NOT RUN, +1951,dc2-leaf2b,MLAG,VerifyMlagDualPrimary,Verifies the MLAG dual-primary detection parameters.,,NOT RUN, +1952,dc2-leaf2b,MLAG,VerifyMlagInterfaces,Verifies there are no inactive or active-partial MLAG ports.,,NOT RUN, +1953,dc2-leaf2b,MLAG,VerifyMlagReloadDelay,Verifies the MLAG reload-delay parameters.,,NOT RUN, +1954,dc2-leaf2b,MLAG,VerifyMlagStatus,Verifies the health status of the MLAG configuration.,,NOT RUN, +1955,dc2-leaf2b,MLAG,VerifyMlagStatus,Verifies the health status of the MLAG configuration.,,NOT RUN, +1956,dc2-leaf2b,Multicast,VerifyIGMPSnoopingGlobal,Verifies the IGMP snooping global configuration.,,NOT RUN, +1957,dc2-leaf2b,Multicast,VerifyIGMPSnoopingVlans,Verifies the IGMP snooping status for the provided VLANs.,,NOT RUN, +1958,dc2-leaf2b,PTP,VerifyPtpGMStatus,Verifies that the device is locked to a valid PTP Grandmaster.,,NOT RUN, +1959,dc2-leaf2b,PTP,VerifyPtpLockStatus,Verifies that the device was locked to the upstream PTP GM in the last minute.,,NOT RUN, +1960,dc2-leaf2b,PTP,VerifyPtpModeStatus,Verifies that the device is configured as a PTP Boundary Clock.,,NOT RUN, +1961,dc2-leaf2b,PTP,VerifyPtpOffset,Verifies that the PTP timing offset is within +/- 1000ns from the master clock.,,NOT RUN, +1962,dc2-leaf2b,PTP,VerifyPtpPortModeStatus,Verifies the PTP interfaces state.,,NOT RUN, +1963,dc2-leaf2b,Routing,VerifyRoutingProtocolModel,Verifies the configured routing protocol model.,Routing protocol model: multi-agent,NOT RUN, +1964,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.1 - Peer: dc1-spine1,NOT RUN, +1965,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.2 - Peer: dc1-spine2,NOT RUN, +1966,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.3 - Peer: dc1-leaf1a,NOT RUN, +1967,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.4 - Peer: dc1-leaf1b,NOT RUN, +1968,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.5 - Peer: dc1-leaf2a,NOT RUN, +1969,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.3 - Peer: dc1-leaf1a,NOT RUN, +1970,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.5 - Peer: dc1-leaf2a,NOT RUN, +1971,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.11 - Peer: dc2-spine1,NOT RUN, +1972,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.12 - Peer: dc2-spine2,NOT RUN, +1973,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.13 - Peer: dc2-leaf1a,NOT RUN, +1974,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.14 - Peer: dc2-leaf1b,NOT RUN, +1975,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.15 - Peer: dc2-leaf2a,NOT RUN, +1976,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.16 - Peer: dc2-leaf2b,NOT RUN, +1977,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, +1978,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com,NOT RUN, +1979,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.13 - Peer: dc2-leaf1a,NOT RUN, +1980,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.15 - Peer: dc2-leaf2a,NOT RUN, +1981,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, +1982,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.1 - Peer: dc1-wan1,NOT RUN, +1983,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.2 - Peer: dc1-wan2,NOT RUN, +1984,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.33.0.5 - Peer: dc1-svc-leaf1a,NOT RUN, +1985,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.33.0.6 - Peer: dc1-svc-leaf1b,NOT RUN, +1986,dc2-leaf2b,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.33.1.5 - Peer: dc1-svc-leaf1a,NOT RUN, +1987,dc2-leaf2b,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,,NOT RUN, +1988,dc2-leaf2b,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, +1989,dc2-leaf2b,Security,VerifyAPIHttpStatus,Verifies if eAPI HTTP server is disabled globally.,,NOT RUN, +1990,dc2-leaf2b,Security,VerifyAPIIPv4Acl,Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF.,,NOT RUN, +1991,dc2-leaf2b,Security,VerifyAPIIPv6Acl,Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF.,,NOT RUN, +1992,dc2-leaf2b,Security,VerifyAPISSLCertificate,"Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size.",,NOT RUN, +1993,dc2-leaf2b,Security,VerifyBannerLogin,Verifies the login banner of a device.,,NOT RUN, +1994,dc2-leaf2b,Security,VerifyBannerMotd,Verifies the motd banner of a device.,,NOT RUN, +1995,dc2-leaf2b,Security,VerifyIPSecConnHealth,Verifies all IPv4 security connections.,,NOT RUN, +1996,dc2-leaf2b,Security,VerifyIPv4ACL,Verifies the configuration of IPv4 ACLs.,,NOT RUN, +1997,dc2-leaf2b,Security,VerifySpecificIPSecConn,Verifies IPv4 security connections for a peer.,,NOT RUN, +1998,dc2-leaf2b,Security,VerifySSHIPv4Acl,Verifies if the SSHD agent has IPv4 ACL(s) configured.,,NOT RUN, +1999,dc2-leaf2b,Security,VerifySSHIPv6Acl,Verifies if the SSHD agent has IPv6 ACL(s) configured.,,NOT RUN, +2000,dc2-leaf2b,Security,VerifySSHStatus,Verifies if the SSHD agent is disabled in the default VRF.,,NOT RUN, +2001,dc2-leaf2b,Security,VerifyTelnetStatus,Verifies if Telnet is disabled in the default VRF.,,NOT RUN, +2002,dc2-leaf2b,Services,VerifyDNSLookup,Verifies the DNS name to IP address resolution.,,NOT RUN, +2003,dc2-leaf2b,Services,VerifyDNSServers,Verifies if the DNS servers are correctly configured.,,NOT RUN, +2004,dc2-leaf2b,Services,VerifyErrdisableRecovery,"Verifies the errdisable recovery reason, status, and interval.",,NOT RUN, +2005,dc2-leaf2b,Services,VerifyHostname,Verifies the hostname of a device.,,NOT RUN, +2006,dc2-leaf2b,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, +2007,dc2-leaf2b,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, +2008,dc2-leaf2b,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, +2009,dc2-leaf2b,Software,VerifyEOSVersion,Verifies the EOS version of the device.,,NOT RUN, +2010,dc2-leaf2b,Software,VerifyTerminAttrVersion,Verifies the TerminAttr version of the device.,,NOT RUN, +2011,dc2-leaf2b,STP,VerifySTPBlockedPorts,Verifies there is no STP blocked ports.,,NOT RUN, +2012,dc2-leaf2b,STP,VerifySTPCounters,Verifies there is no errors in STP BPDU packets.,,NOT RUN, +2013,dc2-leaf2b,STP,VerifySTPForwardingPorts,Verifies that all interfaces are forwarding for a provided list of VLAN(s).,,NOT RUN, +2014,dc2-leaf2b,STP,VerifySTPMode,Verifies the configured STP mode for a provided list of VLAN(s).,,NOT RUN, +2015,dc2-leaf2b,STP,VerifySTPRootPriority,Verifies the STP root priority for a provided list of VLAN or MST instance ID(s).,,NOT RUN, +2016,dc2-leaf2b,STUN,VerifyStunClient,Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided.,,NOT RUN, +2017,dc2-leaf2b,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, +2018,dc2-leaf2b,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, +2019,dc2-leaf2b,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, +2020,dc2-leaf2b,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, +2021,dc2-leaf2b,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, +2022,dc2-leaf2b,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +2023,dc2-leaf2b,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +2024,dc2-leaf2b,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, +2025,dc2-leaf2b,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, +2026,dc2-leaf2b,VLAN,VerifyVlanInternalPolicy,Verifies the VLAN internal allocation policy and the range of VLANs.,,NOT RUN, +2027,dc2-leaf2c,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +2028,dc2-leaf2c,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +2029,dc2-leaf2c,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, +2030,dc2-leaf2c,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, +2031,dc2-leaf2c,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, +2032,dc2-leaf2c,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, +2033,dc2-leaf2c,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, +2034,dc2-leaf2c,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, +2035,dc2-leaf2c,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, +2036,dc2-leaf2c,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc2-leaf2a Ethernet8,NOT RUN, +2037,dc2-leaf2c,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc2-leaf2b Ethernet8,NOT RUN, +2038,dc2-leaf2c,Field Notices,VerifyFieldNotice44Resolution,Verifies that the device is using the correct Aboot version per FN0044.,,NOT RUN, +2039,dc2-leaf2c,Field Notices,VerifyFieldNotice72Resolution,"Verifies if the device is exposed to FN0072, and if the issue has been mitigated.",,NOT RUN, +2040,dc2-leaf2c,Greent,VerifyGreenT,Verifies if a GreenT policy is created.,,NOT RUN, +2041,dc2-leaf2c,Greent,VerifyGreenTCounters,Verifies if the GreenT counters are incremented.,,NOT RUN, +2042,dc2-leaf2c,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches.,,NOT RUN, +2043,dc2-leaf2c,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, +2044,dc2-leaf2c,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, +2045,dc2-leaf2c,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, +2046,dc2-leaf2c,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, +2047,dc2-leaf2c,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, +2048,dc2-leaf2c,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +2049,dc2-leaf2c,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +2050,dc2-leaf2c,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, +2051,dc2-leaf2c,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, +2052,dc2-leaf2c,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, +2053,dc2-leaf2c,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - DC2-LEAF2A_Ethernet8 = 'up',NOT RUN, +2054,dc2-leaf2c,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - DC2-LEAF2B_Ethernet8 = 'up',NOT RUN, +2055,dc2-leaf2c,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet5 - dc2-leaf2-server1_iLO = 'up',NOT RUN, +2056,dc2-leaf2c,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel1 - DC2_L3_LEAF2_Po8 = 'up',NOT RUN, +2057,dc2-leaf2c,LANZ,VerifyLANZ,Verifies if LANZ is enabled.,,NOT RUN, +2058,dc2-leaf2c,PTP,VerifyPtpGMStatus,Verifies that the device is locked to a valid PTP Grandmaster.,,NOT RUN, +2059,dc2-leaf2c,PTP,VerifyPtpLockStatus,Verifies that the device was locked to the upstream PTP GM in the last minute.,,NOT RUN, +2060,dc2-leaf2c,PTP,VerifyPtpModeStatus,Verifies that the device is configured as a PTP Boundary Clock.,,NOT RUN, +2061,dc2-leaf2c,PTP,VerifyPtpOffset,Verifies that the PTP timing offset is within +/- 1000ns from the master clock.,,NOT RUN, +2062,dc2-leaf2c,PTP,VerifyPtpPortModeStatus,Verifies the PTP interfaces state.,,NOT RUN, +2063,dc2-leaf2c,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,,NOT RUN, +2064,dc2-leaf2c,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, +2065,dc2-leaf2c,Security,VerifyAPIHttpStatus,Verifies if eAPI HTTP server is disabled globally.,,NOT RUN, +2066,dc2-leaf2c,Security,VerifyAPIIPv4Acl,Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF.,,NOT RUN, +2067,dc2-leaf2c,Security,VerifyAPIIPv6Acl,Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF.,,NOT RUN, +2068,dc2-leaf2c,Security,VerifyAPISSLCertificate,"Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size.",,NOT RUN, +2069,dc2-leaf2c,Security,VerifyBannerLogin,Verifies the login banner of a device.,,NOT RUN, +2070,dc2-leaf2c,Security,VerifyBannerMotd,Verifies the motd banner of a device.,,NOT RUN, +2071,dc2-leaf2c,Security,VerifyIPSecConnHealth,Verifies all IPv4 security connections.,,NOT RUN, +2072,dc2-leaf2c,Security,VerifyIPv4ACL,Verifies the configuration of IPv4 ACLs.,,NOT RUN, +2073,dc2-leaf2c,Security,VerifySpecificIPSecConn,Verifies IPv4 security connections for a peer.,,NOT RUN, +2074,dc2-leaf2c,Security,VerifySSHIPv4Acl,Verifies if the SSHD agent has IPv4 ACL(s) configured.,,NOT RUN, +2075,dc2-leaf2c,Security,VerifySSHIPv6Acl,Verifies if the SSHD agent has IPv6 ACL(s) configured.,,NOT RUN, +2076,dc2-leaf2c,Security,VerifySSHStatus,Verifies if the SSHD agent is disabled in the default VRF.,,NOT RUN, +2077,dc2-leaf2c,Security,VerifyTelnetStatus,Verifies if Telnet is disabled in the default VRF.,,NOT RUN, +2078,dc2-leaf2c,Services,VerifyDNSLookup,Verifies the DNS name to IP address resolution.,,NOT RUN, +2079,dc2-leaf2c,Services,VerifyDNSServers,Verifies if the DNS servers are correctly configured.,,NOT RUN, +2080,dc2-leaf2c,Services,VerifyErrdisableRecovery,"Verifies the errdisable recovery reason, status, and interval.",,NOT RUN, +2081,dc2-leaf2c,Services,VerifyHostname,Verifies the hostname of a device.,,NOT RUN, +2082,dc2-leaf2c,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, +2083,dc2-leaf2c,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, +2084,dc2-leaf2c,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, +2085,dc2-leaf2c,Software,VerifyEOSVersion,Verifies the EOS version of the device.,,NOT RUN, +2086,dc2-leaf2c,Software,VerifyTerminAttrVersion,Verifies the TerminAttr version of the device.,,NOT RUN, +2087,dc2-leaf2c,STUN,VerifyStunClient,Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided.,,NOT RUN, +2088,dc2-leaf2c,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, +2089,dc2-leaf2c,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, +2090,dc2-leaf2c,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, +2091,dc2-leaf2c,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, +2092,dc2-leaf2c,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, +2093,dc2-leaf2c,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +2094,dc2-leaf2c,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +2095,dc2-leaf2c,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, +2096,dc2-leaf2c,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, +2097,dc2-leaf2c,VLAN,VerifyVlanInternalPolicy,Verifies the VLAN internal allocation policy and the range of VLANs.,,NOT RUN, +2098,dc2-leaf3a.arista.com,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +2099,dc2-leaf3a.arista.com,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +2100,dc2-leaf3a.arista.com,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, +2101,dc2-leaf3a.arista.com,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, +2102,dc2-leaf3a.arista.com,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, +2103,dc2-leaf3a.arista.com,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, +2104,dc2-leaf3a.arista.com,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, +2105,dc2-leaf3a.arista.com,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-spine1 (IP: 10.255.128.11),NOT RUN, +2106,dc2-leaf3a.arista.com,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-spine2 (IP: 10.255.128.12),NOT RUN, +2107,dc2-leaf3a.arista.com,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf3b.arista.com (IP: 10.255.129.125),NOT RUN, +2108,dc2-leaf3a.arista.com,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-spine1 (IP: 10.255.255.120),NOT RUN, +2109,dc2-leaf3a.arista.com,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-spine2 (IP: 10.255.255.122),NOT RUN, +2110,dc2-leaf3a.arista.com,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, +2111,dc2-leaf3a.arista.com,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, +2112,dc2-leaf3a.arista.com,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc2-spine1 Ethernet5,NOT RUN, +2113,dc2-leaf3a.arista.com,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc2-spine2 Ethernet5,NOT RUN, +2114,dc2-leaf3a.arista.com,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet3 - Remote: dc2-leaf3b.arista.com Ethernet3,NOT RUN, +2115,dc2-leaf3a.arista.com,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet4 - Remote: dc2-leaf3b.arista.com Ethernet4,NOT RUN, +2116,dc2-leaf3a.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3),NOT RUN, +2117,dc2-leaf3a.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4),NOT RUN, +2118,dc2-leaf3a.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5),NOT RUN, +2119,dc2-leaf3a.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1),NOT RUN, +2120,dc2-leaf3a.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2),NOT RUN, +2121,dc2-leaf3a.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5),NOT RUN, +2122,dc2-leaf3a.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6),NOT RUN, +2123,dc2-leaf3a.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1),NOT RUN, +2124,dc2-leaf3a.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2),NOT RUN, +2125,dc2-leaf3a.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.17) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13),NOT RUN, +2126,dc2-leaf3a.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.17) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14),NOT RUN, +2127,dc2-leaf3a.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.17) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15),NOT RUN, +2128,dc2-leaf3a.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.17) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16),NOT RUN, +2129,dc2-leaf3a.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.17) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17),NOT RUN, +2130,dc2-leaf3a.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.17) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18),NOT RUN, +2131,dc2-leaf3a.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.17) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11),NOT RUN, +2132,dc2-leaf3a.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.17) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12),NOT RUN, +2133,dc2-leaf3a.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet1 (IP: 10.255.255.121) - Destination: dc2-spine1 Ethernet5 (IP: 10.255.255.120),NOT RUN, +2134,dc2-leaf3a.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet2 (IP: 10.255.255.123) - Destination: dc2-spine2 Ethernet5 (IP: 10.255.255.122),NOT RUN, +2135,dc2-leaf3a.arista.com,Field Notices,VerifyFieldNotice44Resolution,Verifies that the device is using the correct Aboot version per FN0044.,,NOT RUN, +2136,dc2-leaf3a.arista.com,Field Notices,VerifyFieldNotice72Resolution,"Verifies if the device is exposed to FN0072, and if the issue has been mitigated.",,NOT RUN, +2137,dc2-leaf3a.arista.com,Greent,VerifyGreenT,Verifies if a GreenT policy is created.,,NOT RUN, +2138,dc2-leaf3a.arista.com,Greent,VerifyGreenTCounters,Verifies if the GreenT counters are incremented.,,NOT RUN, +2139,dc2-leaf3a.arista.com,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches.,,NOT RUN, +2140,dc2-leaf3a.arista.com,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, +2141,dc2-leaf3a.arista.com,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, +2142,dc2-leaf3a.arista.com,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, +2143,dc2-leaf3a.arista.com,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, +2144,dc2-leaf3a.arista.com,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, +2145,dc2-leaf3a.arista.com,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +2146,dc2-leaf3a.arista.com,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +2147,dc2-leaf3a.arista.com,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, +2148,dc2-leaf3a.arista.com,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, +2149,dc2-leaf3a.arista.com,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, +2150,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - P2P_LINK_TO_DC2-SPINE1_Ethernet5 = 'up',NOT RUN, +2151,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet11 - dc2-leaf3-fw1_e1 = 'up',NOT RUN, +2152,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - P2P_LINK_TO_DC2-SPINE2_Ethernet5 = 'up',NOT RUN, +2153,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet3 - MLAG_PEER_dc2-leaf3b.arista.com_Ethernet3 = 'up',NOT RUN, +2154,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet4 - MLAG_PEER_dc2-leaf3b.arista.com_Ethernet4 = 'up',NOT RUN, +2155,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback0 - EVPN_Overlay_Peering = 'up',NOT RUN, +2156,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up',NOT RUN, +2157,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback10 - VRF10_VTEP_DIAGNOSTICS = 'up',NOT RUN, +2158,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback11 - VRF11_VTEP_DIAGNOSTICS = 'up',NOT RUN, +2159,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel11 - dc2-leaf3-fw1_PortChannel = 'up',NOT RUN, +2160,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel3 - MLAG_PEER_dc2-leaf3b.arista.com_Po3 = 'up',NOT RUN, +2161,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan11 - VRF10_VLAN11 = 'up',NOT RUN, +2162,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan12 - VRF10_VLAN12 = 'up',NOT RUN, +2163,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan21 - VRF11_VLAN21 = 'up',NOT RUN, +2164,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan22 - VRF11_VLAN22 = 'up',NOT RUN, +2165,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan3009 - MLAG_PEER_L3_iBGP: vrf VRF10 = 'up',NOT RUN, +2166,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan3010 - MLAG_PEER_L3_iBGP: vrf VRF11 = 'up',NOT RUN, +2167,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up',NOT RUN, +2168,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4094 - MLAG_PEER = 'up',NOT RUN, +2169,dc2-leaf3a.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vxlan1 = 'up',NOT RUN, +2170,dc2-leaf3a.arista.com,LANZ,VerifyLANZ,Verifies if LANZ is enabled.,,NOT RUN, +2171,dc2-leaf3a.arista.com,Logging,VerifyLoggingAccounting,Verifies if AAA accounting logs are generated.,,NOT RUN, +2172,dc2-leaf3a.arista.com,Logging,VerifyLoggingErrors,Verifies there are no syslog messages with a severity of ERRORS or higher.,,NOT RUN, +2173,dc2-leaf3a.arista.com,Logging,VerifyLoggingHostname,Verifies if logs are generated with the device FQDN.,,NOT RUN, +2174,dc2-leaf3a.arista.com,Logging,VerifyLoggingHosts,Verifies logging hosts (syslog servers) for a specified VRF.,,NOT RUN, +2175,dc2-leaf3a.arista.com,Logging,VerifyLoggingLogsGeneration,Verifies if logs are generated.,,NOT RUN, +2176,dc2-leaf3a.arista.com,Logging,VerifyLoggingPersistent,Verifies if logging persistent is enabled and logs are saved in flash.,,NOT RUN, +2177,dc2-leaf3a.arista.com,Logging,VerifyLoggingSourceInt,Verifies logging source-interface for a specified VRF.,,NOT RUN, +2178,dc2-leaf3a.arista.com,Logging,VerifyLoggingTimestamp,Verifies if logs are generated with the riate timestamp.,,NOT RUN, +2179,dc2-leaf3a.arista.com,MLAG,VerifyMlagConfigSanity,Verifies there are no MLAG config-sanity inconsistencies.,,NOT RUN, +2180,dc2-leaf3a.arista.com,MLAG,VerifyMlagDualPrimary,Verifies the MLAG dual-primary detection parameters.,,NOT RUN, +2181,dc2-leaf3a.arista.com,MLAG,VerifyMlagInterfaces,Verifies there are no inactive or active-partial MLAG ports.,,NOT RUN, +2182,dc2-leaf3a.arista.com,MLAG,VerifyMlagReloadDelay,Verifies the MLAG reload-delay parameters.,,NOT RUN, +2183,dc2-leaf3a.arista.com,MLAG,VerifyMlagStatus,Verifies the health status of the MLAG configuration.,,NOT RUN, +2184,dc2-leaf3a.arista.com,MLAG,VerifyMlagStatus,Verifies the health status of the MLAG configuration.,,NOT RUN, +2185,dc2-leaf3a.arista.com,Multicast,VerifyIGMPSnoopingGlobal,Verifies the IGMP snooping global configuration.,,NOT RUN, +2186,dc2-leaf3a.arista.com,Multicast,VerifyIGMPSnoopingVlans,Verifies the IGMP snooping status for the provided VLANs.,,NOT RUN, +2187,dc2-leaf3a.arista.com,PTP,VerifyPtpGMStatus,Verifies that the device is locked to a valid PTP Grandmaster.,,NOT RUN, +2188,dc2-leaf3a.arista.com,PTP,VerifyPtpLockStatus,Verifies that the device was locked to the upstream PTP GM in the last minute.,,NOT RUN, +2189,dc2-leaf3a.arista.com,PTP,VerifyPtpModeStatus,Verifies that the device is configured as a PTP Boundary Clock.,,NOT RUN, +2190,dc2-leaf3a.arista.com,PTP,VerifyPtpOffset,Verifies that the PTP timing offset is within +/- 1000ns from the master clock.,,NOT RUN, +2191,dc2-leaf3a.arista.com,PTP,VerifyPtpPortModeStatus,Verifies the PTP interfaces state.,,NOT RUN, +2192,dc2-leaf3a.arista.com,Routing,VerifyRoutingProtocolModel,Verifies the configured routing protocol model.,Routing protocol model: multi-agent,NOT RUN, +2193,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.1 - Peer: dc1-spine1,NOT RUN, +2194,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.2 - Peer: dc1-spine2,NOT RUN, +2195,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.3 - Peer: dc1-leaf1a,NOT RUN, +2196,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.4 - Peer: dc1-leaf1b,NOT RUN, +2197,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.5 - Peer: dc1-leaf2a,NOT RUN, +2198,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.3 - Peer: dc1-leaf1a,NOT RUN, +2199,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.5 - Peer: dc1-leaf2a,NOT RUN, +2200,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.11 - Peer: dc2-spine1,NOT RUN, +2201,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.12 - Peer: dc2-spine2,NOT RUN, +2202,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.13 - Peer: dc2-leaf1a,NOT RUN, +2203,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.14 - Peer: dc2-leaf1b,NOT RUN, +2204,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.15 - Peer: dc2-leaf2a,NOT RUN, +2205,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.16 - Peer: dc2-leaf2b,NOT RUN, +2206,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, +2207,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com,NOT RUN, +2208,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.13 - Peer: dc2-leaf1a,NOT RUN, +2209,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.15 - Peer: dc2-leaf2a,NOT RUN, +2210,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, +2211,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.1 - Peer: dc1-wan1,NOT RUN, +2212,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.2 - Peer: dc1-wan2,NOT RUN, +2213,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.33.0.5 - Peer: dc1-svc-leaf1a,NOT RUN, +2214,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.33.0.6 - Peer: dc1-svc-leaf1b,NOT RUN, +2215,dc2-leaf3a.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.33.1.5 - Peer: dc1-svc-leaf1a,NOT RUN, +2216,dc2-leaf3a.arista.com,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,,NOT RUN, +2217,dc2-leaf3a.arista.com,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, +2218,dc2-leaf3a.arista.com,Security,VerifyAPIHttpStatus,Verifies if eAPI HTTP server is disabled globally.,,NOT RUN, +2219,dc2-leaf3a.arista.com,Security,VerifyAPIIPv4Acl,Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF.,,NOT RUN, +2220,dc2-leaf3a.arista.com,Security,VerifyAPIIPv6Acl,Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF.,,NOT RUN, +2221,dc2-leaf3a.arista.com,Security,VerifyAPISSLCertificate,"Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size.",,NOT RUN, +2222,dc2-leaf3a.arista.com,Security,VerifyBannerLogin,Verifies the login banner of a device.,,NOT RUN, +2223,dc2-leaf3a.arista.com,Security,VerifyBannerMotd,Verifies the motd banner of a device.,,NOT RUN, +2224,dc2-leaf3a.arista.com,Security,VerifyIPSecConnHealth,Verifies all IPv4 security connections.,,NOT RUN, +2225,dc2-leaf3a.arista.com,Security,VerifyIPv4ACL,Verifies the configuration of IPv4 ACLs.,,NOT RUN, +2226,dc2-leaf3a.arista.com,Security,VerifySpecificIPSecConn,Verifies IPv4 security connections for a peer.,,NOT RUN, +2227,dc2-leaf3a.arista.com,Security,VerifySSHIPv4Acl,Verifies if the SSHD agent has IPv4 ACL(s) configured.,,NOT RUN, +2228,dc2-leaf3a.arista.com,Security,VerifySSHIPv6Acl,Verifies if the SSHD agent has IPv6 ACL(s) configured.,,NOT RUN, +2229,dc2-leaf3a.arista.com,Security,VerifySSHStatus,Verifies if the SSHD agent is disabled in the default VRF.,,NOT RUN, +2230,dc2-leaf3a.arista.com,Security,VerifyTelnetStatus,Verifies if Telnet is disabled in the default VRF.,,NOT RUN, +2231,dc2-leaf3a.arista.com,Services,VerifyDNSLookup,Verifies the DNS name to IP address resolution.,,NOT RUN, +2232,dc2-leaf3a.arista.com,Services,VerifyDNSServers,Verifies if the DNS servers are correctly configured.,,NOT RUN, +2233,dc2-leaf3a.arista.com,Services,VerifyErrdisableRecovery,"Verifies the errdisable recovery reason, status, and interval.",,NOT RUN, +2234,dc2-leaf3a.arista.com,Services,VerifyHostname,Verifies the hostname of a device.,,NOT RUN, +2235,dc2-leaf3a.arista.com,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, +2236,dc2-leaf3a.arista.com,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, +2237,dc2-leaf3a.arista.com,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, +2238,dc2-leaf3a.arista.com,Software,VerifyEOSVersion,Verifies the EOS version of the device.,,NOT RUN, +2239,dc2-leaf3a.arista.com,Software,VerifyTerminAttrVersion,Verifies the TerminAttr version of the device.,,NOT RUN, +2240,dc2-leaf3a.arista.com,STP,VerifySTPBlockedPorts,Verifies there is no STP blocked ports.,,NOT RUN, +2241,dc2-leaf3a.arista.com,STP,VerifySTPCounters,Verifies there is no errors in STP BPDU packets.,,NOT RUN, +2242,dc2-leaf3a.arista.com,STP,VerifySTPForwardingPorts,Verifies that all interfaces are forwarding for a provided list of VLAN(s).,,NOT RUN, +2243,dc2-leaf3a.arista.com,STP,VerifySTPMode,Verifies the configured STP mode for a provided list of VLAN(s).,,NOT RUN, +2244,dc2-leaf3a.arista.com,STP,VerifySTPRootPriority,Verifies the STP root priority for a provided list of VLAN or MST instance ID(s).,,NOT RUN, +2245,dc2-leaf3a.arista.com,STUN,VerifyStunClient,Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided.,,NOT RUN, +2246,dc2-leaf3a.arista.com,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, +2247,dc2-leaf3a.arista.com,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, +2248,dc2-leaf3a.arista.com,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, +2249,dc2-leaf3a.arista.com,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, +2250,dc2-leaf3a.arista.com,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, +2251,dc2-leaf3a.arista.com,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +2252,dc2-leaf3a.arista.com,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +2253,dc2-leaf3a.arista.com,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, +2254,dc2-leaf3a.arista.com,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, +2255,dc2-leaf3a.arista.com,VLAN,VerifyVlanInternalPolicy,Verifies the VLAN internal allocation policy and the range of VLANs.,,NOT RUN, +2256,dc2-leaf3b.arista.com,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +2257,dc2-leaf3b.arista.com,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +2258,dc2-leaf3b.arista.com,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, +2259,dc2-leaf3b.arista.com,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, +2260,dc2-leaf3b.arista.com,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, +2261,dc2-leaf3b.arista.com,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, +2262,dc2-leaf3b.arista.com,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, +2263,dc2-leaf3b.arista.com,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-spine1 (IP: 10.255.128.11),NOT RUN, +2264,dc2-leaf3b.arista.com,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-spine2 (IP: 10.255.128.12),NOT RUN, +2265,dc2-leaf3b.arista.com,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf3a.arista.com (IP: 10.255.129.124),NOT RUN, +2266,dc2-leaf3b.arista.com,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-spine1 (IP: 10.255.255.124),NOT RUN, +2267,dc2-leaf3b.arista.com,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-spine2 (IP: 10.255.255.126),NOT RUN, +2268,dc2-leaf3b.arista.com,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, +2269,dc2-leaf3b.arista.com,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, +2270,dc2-leaf3b.arista.com,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc2-spine1 Ethernet6,NOT RUN, +2271,dc2-leaf3b.arista.com,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc2-spine2 Ethernet6,NOT RUN, +2272,dc2-leaf3b.arista.com,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet3 - Remote: dc2-leaf3a.arista.com Ethernet3,NOT RUN, +2273,dc2-leaf3b.arista.com,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet4 - Remote: dc2-leaf3a.arista.com Ethernet4,NOT RUN, +2274,dc2-leaf3b.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3),NOT RUN, +2275,dc2-leaf3b.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4),NOT RUN, +2276,dc2-leaf3b.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5),NOT RUN, +2277,dc2-leaf3b.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1),NOT RUN, +2278,dc2-leaf3b.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2),NOT RUN, +2279,dc2-leaf3b.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5),NOT RUN, +2280,dc2-leaf3b.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6),NOT RUN, +2281,dc2-leaf3b.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1),NOT RUN, +2282,dc2-leaf3b.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2),NOT RUN, +2283,dc2-leaf3b.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.18) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13),NOT RUN, +2284,dc2-leaf3b.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.18) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14),NOT RUN, +2285,dc2-leaf3b.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.18) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15),NOT RUN, +2286,dc2-leaf3b.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.18) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16),NOT RUN, +2287,dc2-leaf3b.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.18) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17),NOT RUN, +2288,dc2-leaf3b.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.18) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18),NOT RUN, +2289,dc2-leaf3b.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.18) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11),NOT RUN, +2290,dc2-leaf3b.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: Loopback0 (IP: 10.255.128.18) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12),NOT RUN, +2291,dc2-leaf3b.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet1 (IP: 10.255.255.125) - Destination: dc2-spine1 Ethernet6 (IP: 10.255.255.124),NOT RUN, +2292,dc2-leaf3b.arista.com,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet2 (IP: 10.255.255.127) - Destination: dc2-spine2 Ethernet6 (IP: 10.255.255.126),NOT RUN, +2293,dc2-leaf3b.arista.com,Field Notices,VerifyFieldNotice44Resolution,Verifies that the device is using the correct Aboot version per FN0044.,,NOT RUN, +2294,dc2-leaf3b.arista.com,Field Notices,VerifyFieldNotice72Resolution,"Verifies if the device is exposed to FN0072, and if the issue has been mitigated.",,NOT RUN, +2295,dc2-leaf3b.arista.com,Greent,VerifyGreenT,Verifies if a GreenT policy is created.,,NOT RUN, +2296,dc2-leaf3b.arista.com,Greent,VerifyGreenTCounters,Verifies if the GreenT counters are incremented.,,NOT RUN, +2297,dc2-leaf3b.arista.com,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches.,,NOT RUN, +2298,dc2-leaf3b.arista.com,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, +2299,dc2-leaf3b.arista.com,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, +2300,dc2-leaf3b.arista.com,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, +2301,dc2-leaf3b.arista.com,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, +2302,dc2-leaf3b.arista.com,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, +2303,dc2-leaf3b.arista.com,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +2304,dc2-leaf3b.arista.com,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +2305,dc2-leaf3b.arista.com,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, +2306,dc2-leaf3b.arista.com,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, +2307,dc2-leaf3b.arista.com,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, +2308,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - P2P_LINK_TO_DC2-SPINE1_Ethernet6 = 'up',NOT RUN, +2309,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet11 - dc2-leaf3-fw1_e1 = 'adminDown',NOT RUN, +2310,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - P2P_LINK_TO_DC2-SPINE2_Ethernet6 = 'up',NOT RUN, +2311,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet3 - MLAG_PEER_dc2-leaf3a.arista.com_Ethernet3 = 'up',NOT RUN, +2312,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet4 - MLAG_PEER_dc2-leaf3a.arista.com_Ethernet4 = 'up',NOT RUN, +2313,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback0 - EVPN_Overlay_Peering = 'up',NOT RUN, +2314,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up',NOT RUN, +2315,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback10 - VRF10_VTEP_DIAGNOSTICS = 'up',NOT RUN, +2316,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback11 - VRF11_VTEP_DIAGNOSTICS = 'up',NOT RUN, +2317,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel11 - dc2-leaf3-fw1_PortChannel = 'up',NOT RUN, +2318,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Port-Channel3 - MLAG_PEER_dc2-leaf3a.arista.com_Po3 = 'up',NOT RUN, +2319,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan11 - VRF10_VLAN11 = 'up',NOT RUN, +2320,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan12 - VRF10_VLAN12 = 'up',NOT RUN, +2321,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan21 - VRF11_VLAN21 = 'up',NOT RUN, +2322,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan22 - VRF11_VLAN22 = 'up',NOT RUN, +2323,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan3009 - MLAG_PEER_L3_iBGP: vrf VRF10 = 'up',NOT RUN, +2324,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan3010 - MLAG_PEER_L3_iBGP: vrf VRF11 = 'up',NOT RUN, +2325,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up',NOT RUN, +2326,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vlan4094 - MLAG_PEER = 'up',NOT RUN, +2327,dc2-leaf3b.arista.com,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Vxlan1 = 'up',NOT RUN, +2328,dc2-leaf3b.arista.com,LANZ,VerifyLANZ,Verifies if LANZ is enabled.,,NOT RUN, +2329,dc2-leaf3b.arista.com,Logging,VerifyLoggingAccounting,Verifies if AAA accounting logs are generated.,,NOT RUN, +2330,dc2-leaf3b.arista.com,Logging,VerifyLoggingErrors,Verifies there are no syslog messages with a severity of ERRORS or higher.,,NOT RUN, +2331,dc2-leaf3b.arista.com,Logging,VerifyLoggingHostname,Verifies if logs are generated with the device FQDN.,,NOT RUN, +2332,dc2-leaf3b.arista.com,Logging,VerifyLoggingHosts,Verifies logging hosts (syslog servers) for a specified VRF.,,NOT RUN, +2333,dc2-leaf3b.arista.com,Logging,VerifyLoggingLogsGeneration,Verifies if logs are generated.,,NOT RUN, +2334,dc2-leaf3b.arista.com,Logging,VerifyLoggingPersistent,Verifies if logging persistent is enabled and logs are saved in flash.,,NOT RUN, +2335,dc2-leaf3b.arista.com,Logging,VerifyLoggingSourceInt,Verifies logging source-interface for a specified VRF.,,NOT RUN, +2336,dc2-leaf3b.arista.com,Logging,VerifyLoggingTimestamp,Verifies if logs are generated with the riate timestamp.,,NOT RUN, +2337,dc2-leaf3b.arista.com,MLAG,VerifyMlagConfigSanity,Verifies there are no MLAG config-sanity inconsistencies.,,NOT RUN, +2338,dc2-leaf3b.arista.com,MLAG,VerifyMlagDualPrimary,Verifies the MLAG dual-primary detection parameters.,,NOT RUN, +2339,dc2-leaf3b.arista.com,MLAG,VerifyMlagInterfaces,Verifies there are no inactive or active-partial MLAG ports.,,NOT RUN, +2340,dc2-leaf3b.arista.com,MLAG,VerifyMlagReloadDelay,Verifies the MLAG reload-delay parameters.,,NOT RUN, +2341,dc2-leaf3b.arista.com,MLAG,VerifyMlagStatus,Verifies the health status of the MLAG configuration.,,NOT RUN, +2342,dc2-leaf3b.arista.com,MLAG,VerifyMlagStatus,Verifies the health status of the MLAG configuration.,,NOT RUN, +2343,dc2-leaf3b.arista.com,Multicast,VerifyIGMPSnoopingGlobal,Verifies the IGMP snooping global configuration.,,NOT RUN, +2344,dc2-leaf3b.arista.com,Multicast,VerifyIGMPSnoopingVlans,Verifies the IGMP snooping status for the provided VLANs.,,NOT RUN, +2345,dc2-leaf3b.arista.com,PTP,VerifyPtpGMStatus,Verifies that the device is locked to a valid PTP Grandmaster.,,NOT RUN, +2346,dc2-leaf3b.arista.com,PTP,VerifyPtpLockStatus,Verifies that the device was locked to the upstream PTP GM in the last minute.,,NOT RUN, +2347,dc2-leaf3b.arista.com,PTP,VerifyPtpModeStatus,Verifies that the device is configured as a PTP Boundary Clock.,,NOT RUN, +2348,dc2-leaf3b.arista.com,PTP,VerifyPtpOffset,Verifies that the PTP timing offset is within +/- 1000ns from the master clock.,,NOT RUN, +2349,dc2-leaf3b.arista.com,PTP,VerifyPtpPortModeStatus,Verifies the PTP interfaces state.,,NOT RUN, +2350,dc2-leaf3b.arista.com,Routing,VerifyRoutingProtocolModel,Verifies the configured routing protocol model.,Routing protocol model: multi-agent,NOT RUN, +2351,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.1 - Peer: dc1-spine1,NOT RUN, +2352,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.2 - Peer: dc1-spine2,NOT RUN, +2353,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.3 - Peer: dc1-leaf1a,NOT RUN, +2354,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.4 - Peer: dc1-leaf1b,NOT RUN, +2355,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.0.5 - Peer: dc1-leaf2a,NOT RUN, +2356,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.3 - Peer: dc1-leaf1a,NOT RUN, +2357,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.1.5 - Peer: dc1-leaf2a,NOT RUN, +2358,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.11 - Peer: dc2-spine1,NOT RUN, +2359,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.12 - Peer: dc2-spine2,NOT RUN, +2360,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.13 - Peer: dc2-leaf1a,NOT RUN, +2361,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.14 - Peer: dc2-leaf1b,NOT RUN, +2362,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.15 - Peer: dc2-leaf2a,NOT RUN, +2363,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.16 - Peer: dc2-leaf2b,NOT RUN, +2364,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, +2365,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com,NOT RUN, +2366,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.13 - Peer: dc2-leaf1a,NOT RUN, +2367,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.15 - Peer: dc2-leaf2a,NOT RUN, +2368,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com,NOT RUN, +2369,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.1 - Peer: dc1-wan1,NOT RUN, +2370,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.255.2.2 - Peer: dc1-wan2,NOT RUN, +2371,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.33.0.5 - Peer: dc1-svc-leaf1a,NOT RUN, +2372,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.33.0.6 - Peer: dc1-svc-leaf1b,NOT RUN, +2373,dc2-leaf3b.arista.com,Routing,VerifyRoutingTableEntry,Verifies that the provided routes are present in the routing table of a specified VRF.,Route: 10.33.1.5 - Peer: dc1-svc-leaf1a,NOT RUN, +2374,dc2-leaf3b.arista.com,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,,NOT RUN, +2375,dc2-leaf3b.arista.com,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, +2376,dc2-leaf3b.arista.com,Security,VerifyAPIHttpStatus,Verifies if eAPI HTTP server is disabled globally.,,NOT RUN, +2377,dc2-leaf3b.arista.com,Security,VerifyAPIIPv4Acl,Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF.,,NOT RUN, +2378,dc2-leaf3b.arista.com,Security,VerifyAPIIPv6Acl,Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF.,,NOT RUN, +2379,dc2-leaf3b.arista.com,Security,VerifyAPISSLCertificate,"Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size.",,NOT RUN, +2380,dc2-leaf3b.arista.com,Security,VerifyBannerLogin,Verifies the login banner of a device.,,NOT RUN, +2381,dc2-leaf3b.arista.com,Security,VerifyBannerMotd,Verifies the motd banner of a device.,,NOT RUN, +2382,dc2-leaf3b.arista.com,Security,VerifyIPSecConnHealth,Verifies all IPv4 security connections.,,NOT RUN, +2383,dc2-leaf3b.arista.com,Security,VerifyIPv4ACL,Verifies the configuration of IPv4 ACLs.,,NOT RUN, +2384,dc2-leaf3b.arista.com,Security,VerifySpecificIPSecConn,Verifies IPv4 security connections for a peer.,,NOT RUN, +2385,dc2-leaf3b.arista.com,Security,VerifySSHIPv4Acl,Verifies if the SSHD agent has IPv4 ACL(s) configured.,,NOT RUN, +2386,dc2-leaf3b.arista.com,Security,VerifySSHIPv6Acl,Verifies if the SSHD agent has IPv6 ACL(s) configured.,,NOT RUN, +2387,dc2-leaf3b.arista.com,Security,VerifySSHStatus,Verifies if the SSHD agent is disabled in the default VRF.,,NOT RUN, +2388,dc2-leaf3b.arista.com,Security,VerifyTelnetStatus,Verifies if Telnet is disabled in the default VRF.,,NOT RUN, +2389,dc2-leaf3b.arista.com,Services,VerifyDNSLookup,Verifies the DNS name to IP address resolution.,,NOT RUN, +2390,dc2-leaf3b.arista.com,Services,VerifyDNSServers,Verifies if the DNS servers are correctly configured.,,NOT RUN, +2391,dc2-leaf3b.arista.com,Services,VerifyErrdisableRecovery,"Verifies the errdisable recovery reason, status, and interval.",,NOT RUN, +2392,dc2-leaf3b.arista.com,Services,VerifyHostname,Verifies the hostname of a device.,,NOT RUN, +2393,dc2-leaf3b.arista.com,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, +2394,dc2-leaf3b.arista.com,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, +2395,dc2-leaf3b.arista.com,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, +2396,dc2-leaf3b.arista.com,Software,VerifyEOSVersion,Verifies the EOS version of the device.,,NOT RUN, +2397,dc2-leaf3b.arista.com,Software,VerifyTerminAttrVersion,Verifies the TerminAttr version of the device.,,NOT RUN, +2398,dc2-leaf3b.arista.com,STP,VerifySTPBlockedPorts,Verifies there is no STP blocked ports.,,NOT RUN, +2399,dc2-leaf3b.arista.com,STP,VerifySTPCounters,Verifies there is no errors in STP BPDU packets.,,NOT RUN, +2400,dc2-leaf3b.arista.com,STP,VerifySTPForwardingPorts,Verifies that all interfaces are forwarding for a provided list of VLAN(s).,,NOT RUN, +2401,dc2-leaf3b.arista.com,STP,VerifySTPMode,Verifies the configured STP mode for a provided list of VLAN(s).,,NOT RUN, +2402,dc2-leaf3b.arista.com,STP,VerifySTPRootPriority,Verifies the STP root priority for a provided list of VLAN or MST instance ID(s).,,NOT RUN, +2403,dc2-leaf3b.arista.com,STUN,VerifyStunClient,Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided.,,NOT RUN, +2404,dc2-leaf3b.arista.com,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, +2405,dc2-leaf3b.arista.com,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, +2406,dc2-leaf3b.arista.com,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, +2407,dc2-leaf3b.arista.com,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, +2408,dc2-leaf3b.arista.com,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, +2409,dc2-leaf3b.arista.com,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +2410,dc2-leaf3b.arista.com,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +2411,dc2-leaf3b.arista.com,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, +2412,dc2-leaf3b.arista.com,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, +2413,dc2-leaf3b.arista.com,VLAN,VerifyVlanInternalPolicy,Verifies the VLAN internal allocation policy and the range of VLANs.,,NOT RUN, +2414,dc2-spine1,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +2415,dc2-spine1,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +2416,dc2-spine1,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, +2417,dc2-spine1,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, +2418,dc2-spine1,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, +2419,dc2-spine1,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, +2420,dc2-spine1,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, +2421,dc2-spine1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-leaf1a (IP: 10.255.128.13),NOT RUN, +2422,dc2-spine1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-leaf1b (IP: 10.255.128.14),NOT RUN, +2423,dc2-spine1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-leaf2a (IP: 10.255.128.15),NOT RUN, +2424,dc2-spine1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-leaf2b (IP: 10.255.128.16),NOT RUN, +2425,dc2-spine1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-leaf3a.arista.com (IP: 10.255.128.17),NOT RUN, +2426,dc2-spine1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-leaf3b.arista.com (IP: 10.255.128.18),NOT RUN, +2427,dc2-spine1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf1a (IP: 10.255.255.105),NOT RUN, +2428,dc2-spine1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf1b (IP: 10.255.255.109),NOT RUN, +2429,dc2-spine1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf2a (IP: 10.255.255.113),NOT RUN, +2430,dc2-spine1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf2b (IP: 10.255.255.117),NOT RUN, +2431,dc2-spine1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf3a.arista.com (IP: 10.255.255.121),NOT RUN, +2432,dc2-spine1,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf3b.arista.com (IP: 10.255.255.125),NOT RUN, +2433,dc2-spine1,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, +2434,dc2-spine1,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, +2435,dc2-spine1,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc2-leaf1a Ethernet1,NOT RUN, +2436,dc2-spine1,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc2-leaf1b Ethernet1,NOT RUN, +2437,dc2-spine1,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet3 - Remote: dc2-leaf2a Ethernet1,NOT RUN, +2438,dc2-spine1,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet4 - Remote: dc2-leaf2b Ethernet1,NOT RUN, +2439,dc2-spine1,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet5 - Remote: dc2-leaf3a.arista.com Ethernet1,NOT RUN, +2440,dc2-spine1,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet6 - Remote: dc2-leaf3b.arista.com Ethernet1,NOT RUN, +2441,dc2-spine1,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet1 (IP: 10.255.255.104) - Destination: dc2-leaf1a Ethernet1 (IP: 10.255.255.105),NOT RUN, +2442,dc2-spine1,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet2 (IP: 10.255.255.108) - Destination: dc2-leaf1b Ethernet1 (IP: 10.255.255.109),NOT RUN, +2443,dc2-spine1,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet3 (IP: 10.255.255.112) - Destination: dc2-leaf2a Ethernet1 (IP: 10.255.255.113),NOT RUN, +2444,dc2-spine1,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet4 (IP: 10.255.255.116) - Destination: dc2-leaf2b Ethernet1 (IP: 10.255.255.117),NOT RUN, +2445,dc2-spine1,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet5 (IP: 10.255.255.120) - Destination: dc2-leaf3a.arista.com Ethernet1 (IP: 10.255.255.121),NOT RUN, +2446,dc2-spine1,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet6 (IP: 10.255.255.124) - Destination: dc2-leaf3b.arista.com Ethernet1 (IP: 10.255.255.125),NOT RUN, +2447,dc2-spine1,Field Notices,VerifyFieldNotice44Resolution,Verifies that the device is using the correct Aboot version per FN0044.,,NOT RUN, +2448,dc2-spine1,Field Notices,VerifyFieldNotice72Resolution,"Verifies if the device is exposed to FN0072, and if the issue has been mitigated.",,NOT RUN, +2449,dc2-spine1,Greent,VerifyGreenT,Verifies if a GreenT policy is created.,,NOT RUN, +2450,dc2-spine1,Greent,VerifyGreenTCounters,Verifies if the GreenT counters are incremented.,,NOT RUN, +2451,dc2-spine1,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches.,,NOT RUN, +2452,dc2-spine1,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, +2453,dc2-spine1,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, +2454,dc2-spine1,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, +2455,dc2-spine1,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, +2456,dc2-spine1,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, +2457,dc2-spine1,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +2458,dc2-spine1,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +2459,dc2-spine1,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, +2460,dc2-spine1,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, +2461,dc2-spine1,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, +2462,dc2-spine1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - P2P_LINK_TO_DC2-LEAF1A_Ethernet1 = 'up',NOT RUN, +2463,dc2-spine1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - P2P_LINK_TO_DC2-LEAF1B_Ethernet1 = 'up',NOT RUN, +2464,dc2-spine1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet3 - P2P_LINK_TO_DC2-LEAF2A_Ethernet1 = 'up',NOT RUN, +2465,dc2-spine1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet4 - P2P_LINK_TO_DC2-LEAF2B_Ethernet1 = 'up',NOT RUN, +2466,dc2-spine1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet5 - P2P_LINK_TO_DC2-LEAF3A.ARISTA.COM_Ethernet1 = 'up',NOT RUN, +2467,dc2-spine1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet6 - P2P_LINK_TO_DC2-LEAF3B.ARISTA.COM_Ethernet1 = 'up',NOT RUN, +2468,dc2-spine1,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback0 - EVPN_Overlay_Peering = 'up',NOT RUN, +2469,dc2-spine1,LANZ,VerifyLANZ,Verifies if LANZ is enabled.,,NOT RUN, +2470,dc2-spine1,PTP,VerifyPtpGMStatus,Verifies that the device is locked to a valid PTP Grandmaster.,,NOT RUN, +2471,dc2-spine1,PTP,VerifyPtpLockStatus,Verifies that the device was locked to the upstream PTP GM in the last minute.,,NOT RUN, +2472,dc2-spine1,PTP,VerifyPtpModeStatus,Verifies that the device is configured as a PTP Boundary Clock.,,NOT RUN, +2473,dc2-spine1,PTP,VerifyPtpOffset,Verifies that the PTP timing offset is within +/- 1000ns from the master clock.,,NOT RUN, +2474,dc2-spine1,PTP,VerifyPtpPortModeStatus,Verifies the PTP interfaces state.,,NOT RUN, +2475,dc2-spine1,Routing,VerifyRoutingProtocolModel,Verifies the configured routing protocol model.,Routing protocol model: multi-agent,NOT RUN, +2476,dc2-spine1,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,,NOT RUN, +2477,dc2-spine1,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, +2478,dc2-spine1,Security,VerifyAPIHttpStatus,Verifies if eAPI HTTP server is disabled globally.,,NOT RUN, +2479,dc2-spine1,Security,VerifyAPIIPv4Acl,Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF.,,NOT RUN, +2480,dc2-spine1,Security,VerifyAPIIPv6Acl,Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF.,,NOT RUN, +2481,dc2-spine1,Security,VerifyAPISSLCertificate,"Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size.",,NOT RUN, +2482,dc2-spine1,Security,VerifyBannerLogin,Verifies the login banner of a device.,,NOT RUN, +2483,dc2-spine1,Security,VerifyBannerMotd,Verifies the motd banner of a device.,,NOT RUN, +2484,dc2-spine1,Security,VerifyIPSecConnHealth,Verifies all IPv4 security connections.,,NOT RUN, +2485,dc2-spine1,Security,VerifyIPv4ACL,Verifies the configuration of IPv4 ACLs.,,NOT RUN, +2486,dc2-spine1,Security,VerifySpecificIPSecConn,Verifies IPv4 security connections for a peer.,,NOT RUN, +2487,dc2-spine1,Security,VerifySSHIPv4Acl,Verifies if the SSHD agent has IPv4 ACL(s) configured.,,NOT RUN, +2488,dc2-spine1,Security,VerifySSHIPv6Acl,Verifies if the SSHD agent has IPv6 ACL(s) configured.,,NOT RUN, +2489,dc2-spine1,Security,VerifySSHStatus,Verifies if the SSHD agent is disabled in the default VRF.,,NOT RUN, +2490,dc2-spine1,Security,VerifyTelnetStatus,Verifies if Telnet is disabled in the default VRF.,,NOT RUN, +2491,dc2-spine1,Services,VerifyDNSLookup,Verifies the DNS name to IP address resolution.,,NOT RUN, +2492,dc2-spine1,Services,VerifyDNSServers,Verifies if the DNS servers are correctly configured.,,NOT RUN, +2493,dc2-spine1,Services,VerifyErrdisableRecovery,"Verifies the errdisable recovery reason, status, and interval.",,NOT RUN, +2494,dc2-spine1,Services,VerifyHostname,Verifies the hostname of a device.,,NOT RUN, +2495,dc2-spine1,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, +2496,dc2-spine1,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, +2497,dc2-spine1,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, +2498,dc2-spine1,Software,VerifyEOSVersion,Verifies the EOS version of the device.,,NOT RUN, +2499,dc2-spine1,Software,VerifyTerminAttrVersion,Verifies the TerminAttr version of the device.,,NOT RUN, +2500,dc2-spine1,STUN,VerifyStunClient,Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided.,,NOT RUN, +2501,dc2-spine1,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, +2502,dc2-spine1,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, +2503,dc2-spine1,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, +2504,dc2-spine1,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, +2505,dc2-spine1,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, +2506,dc2-spine1,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +2507,dc2-spine1,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +2508,dc2-spine1,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, +2509,dc2-spine1,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, +2510,dc2-spine1,VLAN,VerifyVlanInternalPolicy,Verifies the VLAN internal allocation policy and the range of VLANs.,,NOT RUN, +2511,dc2-spine2,AAA,VerifyAcctConsoleMethods,"Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +2512,dc2-spine2,AAA,VerifyAcctDefaultMethods,"Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x).",,NOT RUN, +2513,dc2-spine2,AAA,VerifyAuthenMethods,"Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x).",,NOT RUN, +2514,dc2-spine2,AAA,VerifyAuthzMethods,"Verifies the AAA authorization method lists for different authorization types (commands, exec).",,NOT RUN, +2515,dc2-spine2,AAA,VerifyTacacsServerGroups,Verifies if the provided TACACS server group(s) are configured.,,NOT RUN, +2516,dc2-spine2,AAA,VerifyTacacsServers,Verifies TACACS servers are configured for a specified VRF.,,NOT RUN, +2517,dc2-spine2,AAA,VerifyTacacsSourceIntf,Verifies TACACS source-interface for a specified VRF.,,NOT RUN, +2518,dc2-spine2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-leaf1a (IP: 10.255.128.13),NOT RUN, +2519,dc2-spine2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-leaf1b (IP: 10.255.128.14),NOT RUN, +2520,dc2-spine2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-leaf2a (IP: 10.255.128.15),NOT RUN, +2521,dc2-spine2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-leaf2b (IP: 10.255.128.16),NOT RUN, +2522,dc2-spine2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-leaf3a.arista.com (IP: 10.255.128.17),NOT RUN, +2523,dc2-spine2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP EVPN Peer: dc2-leaf3b.arista.com (IP: 10.255.128.18),NOT RUN, +2524,dc2-spine2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf1a (IP: 10.255.255.107),NOT RUN, +2525,dc2-spine2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf1b (IP: 10.255.255.111),NOT RUN, +2526,dc2-spine2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf2a (IP: 10.255.255.115),NOT RUN, +2527,dc2-spine2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf2b (IP: 10.255.255.119),NOT RUN, +2528,dc2-spine2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf3a.arista.com (IP: 10.255.255.123),NOT RUN, +2529,dc2-spine2,BGP,VerifyBGPSpecificPeers,Verifies the health of specific BGP peer(s).,BGP IPv4 Unicast Peer: dc2-leaf3b.arista.com (IP: 10.255.255.127),NOT RUN, +2530,dc2-spine2,Configuration,VerifyRunningConfigDiffs,Verifies there is no difference between the running-config and the startup-config,,NOT RUN, +2531,dc2-spine2,Configuration,VerifyZeroTouch,Verifies ZeroTouch is disabled,,NOT RUN, +2532,dc2-spine2,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet1 - Remote: dc2-leaf1a Ethernet2,NOT RUN, +2533,dc2-spine2,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet2 - Remote: dc2-leaf1b Ethernet2,NOT RUN, +2534,dc2-spine2,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet3 - Remote: dc2-leaf2a Ethernet2,NOT RUN, +2535,dc2-spine2,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet4 - Remote: dc2-leaf2b Ethernet2,NOT RUN, +2536,dc2-spine2,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet5 - Remote: dc2-leaf3a.arista.com Ethernet2,NOT RUN, +2537,dc2-spine2,Connectivity,VerifyLLDPNeighbors,Verifies that the provided LLDP neighbors are connected properly.,Local: Ethernet6 - Remote: dc2-leaf3b.arista.com Ethernet2,NOT RUN, +2538,dc2-spine2,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet1 (IP: 10.255.255.106) - Destination: dc2-leaf1a Ethernet2 (IP: 10.255.255.107),NOT RUN, +2539,dc2-spine2,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet2 (IP: 10.255.255.110) - Destination: dc2-leaf1b Ethernet2 (IP: 10.255.255.111),NOT RUN, +2540,dc2-spine2,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet3 (IP: 10.255.255.114) - Destination: dc2-leaf2a Ethernet2 (IP: 10.255.255.115),NOT RUN, +2541,dc2-spine2,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet4 (IP: 10.255.255.118) - Destination: dc2-leaf2b Ethernet2 (IP: 10.255.255.119),NOT RUN, +2542,dc2-spine2,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet5 (IP: 10.255.255.122) - Destination: dc2-leaf3a.arista.com Ethernet2 (IP: 10.255.255.123),NOT RUN, +2543,dc2-spine2,Connectivity,VerifyReachability,Test the network reachability to one or many destination IP(s).,Source: P2P Interface Ethernet6 (IP: 10.255.255.126) - Destination: dc2-leaf3b.arista.com Ethernet2 (IP: 10.255.255.127),NOT RUN, +2544,dc2-spine2,Field Notices,VerifyFieldNotice44Resolution,Verifies that the device is using the correct Aboot version per FN0044.,,NOT RUN, +2545,dc2-spine2,Field Notices,VerifyFieldNotice72Resolution,"Verifies if the device is exposed to FN0072, and if the issue has been mitigated.",,NOT RUN, +2546,dc2-spine2,Greent,VerifyGreenT,Verifies if a GreenT policy is created.,,NOT RUN, +2547,dc2-spine2,Greent,VerifyGreenTCounters,Verifies if the GreenT counters are incremented.,,NOT RUN, +2548,dc2-spine2,Hardware,VerifyAdverseDrops,Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches.,,NOT RUN, +2549,dc2-spine2,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,,NOT RUN, +2550,dc2-spine2,Hardware,VerifyEnvironmentCooling,Verifies the status of power supply fans and all fan trays.,Accepted States: 'ok',NOT RUN, +2551,dc2-spine2,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,,NOT RUN, +2552,dc2-spine2,Hardware,VerifyEnvironmentPower,Verifies the power supplies status.,Accepted States: 'ok',NOT RUN, +2553,dc2-spine2,Hardware,VerifyEnvironmentSystemCooling,Verifies the system cooling status.,,NOT RUN, +2554,dc2-spine2,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +2555,dc2-spine2,Hardware,VerifyTemperature,Verifies the device temperature.,,NOT RUN, +2556,dc2-spine2,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,,NOT RUN, +2557,dc2-spine2,Hardware,VerifyTransceiversManufacturers,Verifies if all transceivers come from approved manufacturers.,"Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'",NOT RUN, +2558,dc2-spine2,Hardware,VerifyTransceiversTemperature,Verifies the transceivers temperature.,,NOT RUN, +2559,dc2-spine2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet1 - P2P_LINK_TO_DC2-LEAF1A_Ethernet2 = 'up',NOT RUN, +2560,dc2-spine2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet2 - P2P_LINK_TO_DC2-LEAF1B_Ethernet2 = 'up',NOT RUN, +2561,dc2-spine2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet3 - P2P_LINK_TO_DC2-LEAF2A_Ethernet2 = 'up',NOT RUN, +2562,dc2-spine2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet4 - P2P_LINK_TO_DC2-LEAF2B_Ethernet2 = 'up',NOT RUN, +2563,dc2-spine2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet5 - P2P_LINK_TO_DC2-LEAF3A.ARISTA.COM_Ethernet2 = 'up',NOT RUN, +2564,dc2-spine2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Ethernet6 - P2P_LINK_TO_DC2-LEAF3B.ARISTA.COM_Ethernet2 = 'up',NOT RUN, +2565,dc2-spine2,Interfaces,VerifyInterfacesStatus,Verifies the status of the provided interfaces.,Interface Loopback0 - EVPN_Overlay_Peering = 'up',NOT RUN, +2566,dc2-spine2,LANZ,VerifyLANZ,Verifies if LANZ is enabled.,,NOT RUN, +2567,dc2-spine2,PTP,VerifyPtpGMStatus,Verifies that the device is locked to a valid PTP Grandmaster.,,NOT RUN, +2568,dc2-spine2,PTP,VerifyPtpLockStatus,Verifies that the device was locked to the upstream PTP GM in the last minute.,,NOT RUN, +2569,dc2-spine2,PTP,VerifyPtpModeStatus,Verifies that the device is configured as a PTP Boundary Clock.,,NOT RUN, +2570,dc2-spine2,PTP,VerifyPtpOffset,Verifies that the PTP timing offset is within +/- 1000ns from the master clock.,,NOT RUN, +2571,dc2-spine2,PTP,VerifyPtpPortModeStatus,Verifies the PTP interfaces state.,,NOT RUN, +2572,dc2-spine2,Routing,VerifyRoutingProtocolModel,Verifies the configured routing protocol model.,Routing protocol model: multi-agent,NOT RUN, +2573,dc2-spine2,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,,NOT RUN, +2574,dc2-spine2,Security,VerifyAPIHttpsSSL,Verifies if the eAPI has a valid SSL profile.,eAPI HTTPS SSL Profile: eAPI_SSL_Profile,NOT RUN, +2575,dc2-spine2,Security,VerifyAPIHttpStatus,Verifies if eAPI HTTP server is disabled globally.,,NOT RUN, +2576,dc2-spine2,Security,VerifyAPIIPv4Acl,Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF.,,NOT RUN, +2577,dc2-spine2,Security,VerifyAPIIPv6Acl,Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF.,,NOT RUN, +2578,dc2-spine2,Security,VerifyAPISSLCertificate,"Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size.",,NOT RUN, +2579,dc2-spine2,Security,VerifyBannerLogin,Verifies the login banner of a device.,,NOT RUN, +2580,dc2-spine2,Security,VerifyBannerMotd,Verifies the motd banner of a device.,,NOT RUN, +2581,dc2-spine2,Security,VerifyIPSecConnHealth,Verifies all IPv4 security connections.,,NOT RUN, +2582,dc2-spine2,Security,VerifyIPv4ACL,Verifies the configuration of IPv4 ACLs.,,NOT RUN, +2583,dc2-spine2,Security,VerifySpecificIPSecConn,Verifies IPv4 security connections for a peer.,,NOT RUN, +2584,dc2-spine2,Security,VerifySSHIPv4Acl,Verifies if the SSHD agent has IPv4 ACL(s) configured.,,NOT RUN, +2585,dc2-spine2,Security,VerifySSHIPv6Acl,Verifies if the SSHD agent has IPv6 ACL(s) configured.,,NOT RUN, +2586,dc2-spine2,Security,VerifySSHStatus,Verifies if the SSHD agent is disabled in the default VRF.,,NOT RUN, +2587,dc2-spine2,Security,VerifyTelnetStatus,Verifies if Telnet is disabled in the default VRF.,,NOT RUN, +2588,dc2-spine2,Services,VerifyDNSLookup,Verifies the DNS name to IP address resolution.,,NOT RUN, +2589,dc2-spine2,Services,VerifyDNSServers,Verifies if the DNS servers are correctly configured.,,NOT RUN, +2590,dc2-spine2,Services,VerifyErrdisableRecovery,"Verifies the errdisable recovery reason, status, and interval.",,NOT RUN, +2591,dc2-spine2,Services,VerifyHostname,Verifies the hostname of a device.,,NOT RUN, +2592,dc2-spine2,SNMP,VerifySnmpIPv4Acl,Verifies if the SNMP agent has IPv4 ACL(s) configured.,,NOT RUN, +2593,dc2-spine2,SNMP,VerifySnmpIPv6Acl,Verifies if the SNMP agent has IPv6 ACL(s) configured.,,NOT RUN, +2594,dc2-spine2,SNMP,VerifySnmpStatus,Verifies if the SNMP agent is enabled.,,NOT RUN, +2595,dc2-spine2,Software,VerifyEOSVersion,Verifies the EOS version of the device.,,NOT RUN, +2596,dc2-spine2,Software,VerifyTerminAttrVersion,Verifies the TerminAttr version of the device.,,NOT RUN, +2597,dc2-spine2,STUN,VerifyStunClient,Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided.,,NOT RUN, +2598,dc2-spine2,System,VerifyAgentLogs,Verifies there are no agent crash reports.,,NOT RUN, +2599,dc2-spine2,System,VerifyCoredump,Verifies there are no core dump files.,,NOT RUN, +2600,dc2-spine2,System,VerifyCPUUtilization,Verifies whether the CPU utilization is below 75%.,,NOT RUN, +2601,dc2-spine2,System,VerifyFileSystemUtilization,Verifies that no partition is utilizing more than 75% of its disk space.,,NOT RUN, +2602,dc2-spine2,System,VerifyMemoryUtilization,Verifies whether the memory utilization is below 75%.,,NOT RUN, +2603,dc2-spine2,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +2604,dc2-spine2,System,VerifyNTP,Verifies if NTP is synchronised.,,NOT RUN, +2605,dc2-spine2,System,VerifyReloadCause,Verifies the last reload cause of the device.,,NOT RUN, +2606,dc2-spine2,System,VerifyUptime,Verifies the device uptime.,,NOT RUN, +2607,dc2-spine2,VLAN,VerifyVlanInternalPolicy,Verifies the VLAN internal allocation policy and the range of VLANs.,,NOT RUN, diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/FABRIC-state.md b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/FABRIC-state.md index eb55f880700..9be8eea1d1c 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/FABRIC-state.md +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/FABRIC-state.md @@ -13,57 +13,64 @@ | Total Tests | Total Tests Passed | Total Tests Failed | Total Tests Skipped | | ----------- | ------------------ | ------------------ | ------------------- | -| 1710 | 0 | 0 | 0 | +| 2607 | 0 | 0 | 0 | ### Summary Totals Device Under Test | Device Under Test | Total Tests | Tests Passed | Tests Failed | Tests Skipped | Categories Failed | Categories Skipped | | ------------------| ----------- | ------------ | ------------ | ------------- | ----------------- | ------------------ | -| dc1-leaf1a | 124 | 0 | 0 | 0 | - | - | -| dc1-leaf1b | 117 | 0 | 0 | 0 | - | - | -| dc1-leaf1c | 59 | 0 | 0 | 0 | - | - | -| dc1-leaf2a | 114 | 0 | 0 | 0 | - | - | -| dc1-leaf2c | 58 | 0 | 0 | 0 | - | - | -| dc1-spine1 | 72 | 0 | 0 | 0 | - | - | -| dc1-spine2 | 72 | 0 | 0 | 0 | - | - | -| dc1-wan1 | 51 | 0 | 0 | 0 | - | - | -| dc1-wan2 | 51 | 0 | 0 | 0 | - | - | -| dc2-leaf1a | 128 | 0 | 0 | 0 | - | - | -| dc2-leaf1b | 128 | 0 | 0 | 0 | - | - | -| dc2-leaf1c | 43 | 0 | 0 | 0 | - | - | -| dc2-leaf2a | 133 | 0 | 0 | 0 | - | - | -| dc2-leaf2b | 129 | 0 | 0 | 0 | - | - | -| dc2-leaf2c | 43 | 0 | 0 | 0 | - | - | -| dc2-leaf3a.arista.com | 125 | 0 | 0 | 0 | - | - | -| dc2-leaf3b.arista.com | 125 | 0 | 0 | 0 | - | - | -| dc2-spine1 | 69 | 0 | 0 | 0 | - | - | -| dc2-spine2 | 69 | 0 | 0 | 0 | - | - | +| dc1-leaf1a | 159 | 0 | 0 | 0 | - | - | +| dc1-leaf1b | 150 | 0 | 0 | 0 | - | - | +| dc1-leaf1c | 89 | 0 | 0 | 0 | - | - | +| dc1-leaf2a | 147 | 0 | 0 | 0 | - | - | +| dc1-leaf2c | 88 | 0 | 0 | 0 | - | - | +| dc1-spine1 | 115 | 0 | 0 | 0 | - | - | +| dc1-spine2 | 115 | 0 | 0 | 0 | - | - | +| dc1-svc-leaf1a | 128 | 0 | 0 | 0 | - | - | +| dc1-svc-leaf1b | 128 | 0 | 0 | 0 | - | - | +| dc1-wan1 | 93 | 0 | 0 | 0 | - | - | +| dc1-wan2 | 93 | 0 | 0 | 0 | - | - | +| dc2-leaf1a | 161 | 0 | 0 | 0 | - | - | +| dc2-leaf1b | 161 | 0 | 0 | 0 | - | - | +| dc2-leaf1c | 71 | 0 | 0 | 0 | - | - | +| dc2-leaf2a | 166 | 0 | 0 | 0 | - | - | +| dc2-leaf2b | 162 | 0 | 0 | 0 | - | - | +| dc2-leaf2c | 71 | 0 | 0 | 0 | - | - | +| dc2-leaf3a.arista.com | 158 | 0 | 0 | 0 | - | - | +| dc2-leaf3b.arista.com | 158 | 0 | 0 | 0 | - | - | +| dc2-spine1 | 97 | 0 | 0 | 0 | - | - | +| dc2-spine2 | 97 | 0 | 0 | 0 | - | - | ### Summary Totals Per Category | Test Category | Total Tests | Tests Passed | Tests Failed | Tests Skipped | | ------------- | ----------- | ------------ | ------------ | ------------- | -| AAA | 133 | 0 | 0 | 0 | +| AAA | 147 | 0 | 0 | 0 | | BFD | 6 | 0 | 0 | 0 | -| BGP | 86 | 0 | 0 | 0 | -| Configuration | 38 | 0 | 0 | 0 | -| Connectivity | 287 | 0 | 0 | 0 | -| Field Notices | 38 | 0 | 0 | 0 | -| Hardware | 209 | 0 | 0 | 0 | -| IGMP | 12 | 0 | 0 | 0 | -| Interfaces | 286 | 0 | 0 | 0 | +| BGP | 131 | 0 | 0 | 0 | +| Configuration | 42 | 0 | 0 | 0 | +| Connectivity | 363 | 0 | 0 | 0 | +| Field Notices | 42 | 0 | 0 | 0 | +| Greent | 42 | 0 | 0 | 0 | +| Hardware | 231 | 0 | 0 | 0 | +| Interfaces | 310 | 0 | 0 | 0 | +| LANZ | 21 | 0 | 0 | 0 | | Logging | 48 | 0 | 0 | 0 | -| MLAG | 39 | 0 | 0 | 0 | +| MLAG | 41 | 0 | 0 | 0 | | Multicast | 12 | 0 | 0 | 0 | -| OSPF | 4 | 0 | 0 | 0 | +| OSPF | 6 | 0 | 0 | 0 | +| PTP | 105 | 0 | 0 | 0 | | Profiles | 4 | 0 | 0 | 0 | -| Routing | 199 | 0 | 0 | 0 | -| SNMP | 57 | 0 | 0 | 0 | +| Routing | 274 | 0 | 0 | 0 | +| SNMP | 63 | 0 | 0 | 0 | | STP | 30 | 0 | 0 | 0 | -| Security | 19 | 0 | 0 | 0 | -| Software | 78 | 0 | 0 | 0 | -| System | 171 | 0 | 0 | 0 | -| VXLAN | 4 | 0 | 0 | 0 | +| STUN | 25 | 0 | 0 | 0 | +| Security | 321 | 0 | 0 | 0 | +| Services | 84 | 0 | 0 | 0 | +| Software | 44 | 0 | 0 | 0 | +| System | 189 | 0 | 0 | 0 | +| VLAN | 21 | 0 | 0 | 0 | +| VXLAN | 5 | 0 | 0 | 0 | ## Failed Test Results Summary @@ -81,1706 +88,2603 @@ | 5 | dc1-leaf1a | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | | 6 | dc1-leaf1a | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | | 7 | dc1-leaf1a | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | -| 8 | dc1-leaf1a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc1-spine1 (IP: 10.255.0.1) | NOT RUN | - | -| 9 | dc1-leaf1a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc1-spine2 (IP: 10.255.0.2) | NOT RUN | - | -| 10 | dc1-leaf1a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-leaf1b (IP: 10.255.1.97) | NOT RUN | - | -| 11 | dc1-leaf1a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-spine1 (IP: 10.255.255.0) | NOT RUN | - | -| 12 | dc1-leaf1a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-spine2 (IP: 10.255.255.2) | NOT RUN | - | -| 13 | dc1-leaf1a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-wan1 (IP: 10.255.255.1) | NOT RUN | - | -| 14 | dc1-leaf1a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-wan2 (IP: 10.255.255.5) | NOT RUN | - | -| 15 | dc1-leaf1a | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | -| 16 | dc1-leaf1a | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | -| 17 | dc1-leaf1a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc1-spine1 Ethernet1 | NOT RUN | - | -| 18 | dc1-leaf1a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc1-spine2 Ethernet1 | NOT RUN | - | -| 19 | dc1-leaf1a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet3 - Remote: dc1-leaf1b Ethernet3 | NOT RUN | - | -| 20 | dc1-leaf1a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet4 - Remote: dc1-leaf1b Ethernet4 | NOT RUN | - | -| 21 | dc1-leaf1a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet6 - Remote: dc1-wan1 Ethernet1 | NOT RUN | - | -| 22 | dc1-leaf1a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet7 - Remote: dc1-wan2 Ethernet1 | NOT RUN | - | -| 23 | dc1-leaf1a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet8 - Remote: dc1-leaf1c Ethernet1 | NOT RUN | - | -| 24 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3) | NOT RUN | - | -| 25 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4) | NOT RUN | - | -| 26 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5) | NOT RUN | - | -| 27 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1) | NOT RUN | - | -| 28 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2) | NOT RUN | - | -| 29 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1) | NOT RUN | - | -| 30 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2) | NOT RUN | - | -| 31 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.3) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13) | NOT RUN | - | -| 32 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.3) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14) | NOT RUN | - | -| 33 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.3) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15) | NOT RUN | - | -| 34 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.3) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16) | NOT RUN | - | -| 35 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.3) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17) | NOT RUN | - | -| 36 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.3) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18) | NOT RUN | - | -| 37 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.3) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11) | NOT RUN | - | -| 38 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.3) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12) | NOT RUN | - | -| 39 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet1 (IP: 10.255.255.1) - Destination: dc1-spine1 Ethernet1 (IP: 10.255.255.0) | NOT RUN | - | -| 40 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet2 (IP: 10.255.255.3) - Destination: dc1-spine2 Ethernet1 (IP: 10.255.255.2) | NOT RUN | - | -| 41 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet6 (IP: 10.255.255.0) - Destination: dc1-wan1 Ethernet1 (IP: 10.255.255.1) | NOT RUN | - | -| 42 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet7 (IP: 10.255.255.4) - Destination: dc1-wan2 Ethernet1 (IP: 10.255.255.5) | NOT RUN | - | -| 43 | dc1-leaf1a | Field Notices, Software | VerifyFieldNotice44Resolution | Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization) | - | NOT RUN | - | -| 44 | dc1-leaf1a | Field Notices, Software | VerifyFieldNotice72Resolution | Verifies if the device has exposeure to FN72, and if the issue has been mitigated | - | NOT RUN | - | -| 45 | dc1-leaf1a | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS7280E and DCS7500E | - | NOT RUN | - | -| 46 | dc1-leaf1a | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | -| 47 | dc1-leaf1a | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | -| 48 | dc1-leaf1a | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | -| 49 | dc1-leaf1a | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | -| 50 | dc1-leaf1a | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | -| 51 | dc1-leaf1a | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 52 | dc1-leaf1a | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 53 | dc1-leaf1a | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | -| 54 | dc1-leaf1a | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | -| 55 | dc1-leaf1a | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | -| 56 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - P2P_LINK_TO_DC1-SPINE1_Ethernet1 = 'up' | NOT RUN | - | -| 57 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - P2P_LINK_TO_DC1-SPINE2_Ethernet1 = 'up' | NOT RUN | - | -| 58 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet3 - MLAG_PEER_dc1-leaf1b_Ethernet3 = 'up' | NOT RUN | - | -| 59 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet4 - MLAG_PEER_dc1-leaf1b_Ethernet4 = 'up' | NOT RUN | - | -| 60 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet5 - dc1-leaf1-server1_PCI1 = 'up' | NOT RUN | - | -| 61 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet6 - P2P_LINK_TO_DC1-WAN1_Ethernet1 = 'up' | NOT RUN | - | -| 62 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet7 - P2P_LINK_TO_DC1-WAN2_Ethernet1 = 'up' | NOT RUN | - | -| 63 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet8 - DC1-LEAF1C_Ethernet1 = 'up' | NOT RUN | - | -| 64 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback0 - EVPN_Overlay_Peering = 'up' | NOT RUN | - | -| 65 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up' | NOT RUN | - | -| 66 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback10 - VRF10_VTEP_DIAGNOSTICS = 'up' | NOT RUN | - | -| 67 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback11 - VRF11_VTEP_DIAGNOSTICS = 'up' | NOT RUN | - | -| 68 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel3 - MLAG_PEER_dc1-leaf1b_Po3 = 'up' | NOT RUN | - | -| 69 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel5 - dc1-leaf1-server1_PortChannel dc1-leaf1-server1 = 'up' | NOT RUN | - | -| 70 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel8 - DC1-LEAF1C_Po1 = 'up' | NOT RUN | - | -| 71 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan11 - VRF10_VLAN11 = 'up' | NOT RUN | - | -| 72 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan12 - VRF10_VLAN12 = 'up' | NOT RUN | - | -| 73 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan21 - VRF11_VLAN21 = 'up' | NOT RUN | - | -| 74 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan22 - VRF11_VLAN22 = 'up' | NOT RUN | - | -| 75 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan3009 - MLAG_PEER_L3_iBGP: vrf VRF10 = 'up' | NOT RUN | - | -| 76 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan3010 - MLAG_PEER_L3_iBGP: vrf VRF11 = 'up' | NOT RUN | - | -| 77 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4085 - Inband Management = 'up' | NOT RUN | - | -| 78 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up' | NOT RUN | - | -| 79 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4094 - MLAG_PEER = 'up' | NOT RUN | - | -| 80 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vxlan1 = 'up' | NOT RUN | - | -| 81 | dc1-leaf1a | MLAG | VerifyMlagStatus | Verifies the health status of the MLAG configuration. | - | NOT RUN | - | -| 82 | dc1-leaf1a | Profiles | VerifyTcamProfile | Verify that the assigned TCAM profile is actually running on the device | - | NOT RUN | - | -| 83 | dc1-leaf1a | Profiles | VerifyUnifiedForwardingTableMode | - | - | NOT RUN | - | -| 84 | dc1-leaf1a | Routing | VerifyRoutingProtocolModel | Verifies the configured routing protocol model. | Routing protocol model: multi-agent | NOT RUN | - | -| 85 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.1 - Peer: dc1-spine1 | NOT RUN | - | -| 86 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.2 - Peer: dc1-spine2 | NOT RUN | - | -| 87 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.3 - Peer: dc1-leaf1a | NOT RUN | - | -| 88 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.4 - Peer: dc1-leaf1b | NOT RUN | - | -| 89 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.5 - Peer: dc1-leaf2a | NOT RUN | - | -| 90 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.3 - Peer: dc1-leaf1a | NOT RUN | - | -| 91 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.5 - Peer: dc1-leaf2a | NOT RUN | - | -| 92 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.11 - Peer: dc2-spine1 | NOT RUN | - | -| 93 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.12 - Peer: dc2-spine2 | NOT RUN | - | -| 94 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.13 - Peer: dc2-leaf1a | NOT RUN | - | -| 95 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.14 - Peer: dc2-leaf1b | NOT RUN | - | -| 96 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.15 - Peer: dc2-leaf2a | NOT RUN | - | -| 97 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.16 - Peer: dc2-leaf2b | NOT RUN | - | -| 98 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | -| 99 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com | NOT RUN | - | -| 100 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.13 - Peer: dc2-leaf1a | NOT RUN | - | -| 101 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.15 - Peer: dc2-leaf2a | NOT RUN | - | -| 102 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | -| 103 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.1 - Peer: dc1-wan1 | NOT RUN | - | -| 104 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.2 - Peer: dc1-wan2 | NOT RUN | - | -| 105 | dc1-leaf1a | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | -| 106 | dc1-leaf1a | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | -| 107 | dc1-leaf1a | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | -| 108 | dc1-leaf1a | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | -| 109 | dc1-leaf1a | Software | VerifyEOSExtensions | Verifies all EOS extensions installed on the device are enabled for boot persistence. | - | NOT RUN | - | -| 110 | dc1-leaf1a | Software | VerifyEOSVersion | Verifies the device is running one of the allowed EOS version. | - | NOT RUN | - | -| 111 | dc1-leaf1a | Software | VerifyTerminAttrVersion | Verifies the device is running one of the allowed TerminAttr version. | - | NOT RUN | - | -| 112 | dc1-leaf1a | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | -| 113 | dc1-leaf1a | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | -| 114 | dc1-leaf1a | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | -| 115 | dc1-leaf1a | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | -| 116 | dc1-leaf1a | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | -| 117 | dc1-leaf1a | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 118 | dc1-leaf1a | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 119 | dc1-leaf1a | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | -| 120 | dc1-leaf1a | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | -| 121 | dc1-leaf1a | VXLAN | VerifyVxlan1Interface | Verifies the Vxlan1 interface status. | - | NOT RUN | - | -| 122 | dc1-leaf1a | VXLAN | VerifyVxlanConfigSanity | Verifies there are no VXLAN config-sanity inconsistencies. | - | NOT RUN | - | -| 123 | dc1-leaf1a | VXLAN | VerifyVxlanVniBinding | Verifies the VNI-VLAN bindings of the Vxlan1 interface. | - | NOT RUN | - | -| 124 | dc1-leaf1a | VXLAN | VerifyVxlanVtep | Verifies the VTEP peers of the Vxlan1 interface | - | NOT RUN | - | -| 125 | dc1-leaf1b | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | -| 126 | dc1-leaf1b | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | -| 127 | dc1-leaf1b | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | -| 128 | dc1-leaf1b | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | -| 129 | dc1-leaf1b | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | -| 130 | dc1-leaf1b | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | -| 131 | dc1-leaf1b | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | -| 132 | dc1-leaf1b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc1-spine1 (IP: 10.255.0.1) | NOT RUN | - | -| 133 | dc1-leaf1b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc1-spine2 (IP: 10.255.0.2) | NOT RUN | - | -| 134 | dc1-leaf1b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-leaf1a (IP: 10.255.1.96) | NOT RUN | - | -| 135 | dc1-leaf1b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-spine1 (IP: 10.255.255.4) | NOT RUN | - | -| 136 | dc1-leaf1b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-spine2 (IP: 10.255.255.6) | NOT RUN | - | -| 137 | dc1-leaf1b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-wan1 (IP: 10.255.255.3) | NOT RUN | - | -| 138 | dc1-leaf1b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-wan2 (IP: 10.255.255.7) | NOT RUN | - | -| 139 | dc1-leaf1b | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | -| 140 | dc1-leaf1b | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | -| 141 | dc1-leaf1b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc1-spine1 Ethernet2 | NOT RUN | - | -| 142 | dc1-leaf1b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc1-spine2 Ethernet2 | NOT RUN | - | -| 143 | dc1-leaf1b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet3 - Remote: dc1-leaf1a Ethernet3 | NOT RUN | - | -| 144 | dc1-leaf1b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet4 - Remote: dc1-leaf1a Ethernet4 | NOT RUN | - | -| 145 | dc1-leaf1b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet6 - Remote: dc1-wan1 Ethernet2 | NOT RUN | - | -| 146 | dc1-leaf1b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet7 - Remote: dc1-wan2 Ethernet2 | NOT RUN | - | -| 147 | dc1-leaf1b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet8 - Remote: dc1-leaf1c Ethernet2 | NOT RUN | - | -| 148 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3) | NOT RUN | - | -| 149 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4) | NOT RUN | - | -| 150 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5) | NOT RUN | - | -| 151 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1) | NOT RUN | - | -| 152 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2) | NOT RUN | - | -| 153 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1) | NOT RUN | - | -| 154 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2) | NOT RUN | - | -| 155 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.4) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13) | NOT RUN | - | -| 156 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.4) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14) | NOT RUN | - | -| 157 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.4) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15) | NOT RUN | - | -| 158 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.4) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16) | NOT RUN | - | -| 159 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.4) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17) | NOT RUN | - | -| 160 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.4) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18) | NOT RUN | - | -| 161 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.4) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11) | NOT RUN | - | -| 162 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.4) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12) | NOT RUN | - | -| 163 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet1 (IP: 10.255.255.5) - Destination: dc1-spine1 Ethernet2 (IP: 10.255.255.4) | NOT RUN | - | -| 164 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet2 (IP: 10.255.255.7) - Destination: dc1-spine2 Ethernet2 (IP: 10.255.255.6) | NOT RUN | - | -| 165 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet6 (IP: 10.255.255.2) - Destination: dc1-wan1 Ethernet2 (IP: 10.255.255.3) | NOT RUN | - | -| 166 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet7 (IP: 10.255.255.6) - Destination: dc1-wan2 Ethernet2 (IP: 10.255.255.7) | NOT RUN | - | -| 167 | dc1-leaf1b | Field Notices, Software | VerifyFieldNotice44Resolution | Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization) | - | NOT RUN | - | -| 168 | dc1-leaf1b | Field Notices, Software | VerifyFieldNotice72Resolution | Verifies if the device has exposeure to FN72, and if the issue has been mitigated | - | NOT RUN | - | -| 169 | dc1-leaf1b | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS7280E and DCS7500E | - | NOT RUN | - | -| 170 | dc1-leaf1b | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | -| 171 | dc1-leaf1b | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | -| 172 | dc1-leaf1b | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | -| 173 | dc1-leaf1b | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | -| 174 | dc1-leaf1b | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | -| 175 | dc1-leaf1b | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 176 | dc1-leaf1b | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 177 | dc1-leaf1b | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | -| 178 | dc1-leaf1b | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | -| 179 | dc1-leaf1b | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | -| 180 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - P2P_LINK_TO_DC1-SPINE1_Ethernet2 = 'up' | NOT RUN | - | -| 181 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - P2P_LINK_TO_DC1-SPINE2_Ethernet2 = 'up' | NOT RUN | - | -| 182 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet3 - MLAG_PEER_dc1-leaf1a_Ethernet3 = 'up' | NOT RUN | - | -| 183 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet4 - MLAG_PEER_dc1-leaf1a_Ethernet4 = 'up' | NOT RUN | - | -| 184 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet5 - dc1-leaf1-server1_PCI2 = 'up' | NOT RUN | - | -| 185 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet6 - P2P_LINK_TO_DC1-WAN1_Ethernet2 = 'up' | NOT RUN | - | -| 186 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet7 - P2P_LINK_TO_DC1-WAN2_Ethernet2 = 'up' | NOT RUN | - | -| 187 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet8 - DC1-LEAF1C_Ethernet2 = 'up' | NOT RUN | - | -| 188 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback0 - EVPN_Overlay_Peering = 'up' | NOT RUN | - | -| 189 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up' | NOT RUN | - | -| 190 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback10 - VRF10_VTEP_DIAGNOSTICS = 'up' | NOT RUN | - | -| 191 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback11 - VRF11_VTEP_DIAGNOSTICS = 'up' | NOT RUN | - | -| 192 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel3 - MLAG_PEER_dc1-leaf1a_Po3 = 'up' | NOT RUN | - | -| 193 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel5 - dc1-leaf1-server1_PortChannel dc1-leaf1-server1 = 'up' | NOT RUN | - | -| 194 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel8 - DC1-LEAF1C_Po1 = 'up' | NOT RUN | - | -| 195 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan11 - VRF10_VLAN11 = 'up' | NOT RUN | - | -| 196 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan12 - VRF10_VLAN12 = 'up' | NOT RUN | - | -| 197 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan21 - VRF11_VLAN21 = 'up' | NOT RUN | - | -| 198 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan22 - VRF11_VLAN22 = 'up' | NOT RUN | - | -| 199 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan3009 - MLAG_PEER_L3_iBGP: vrf VRF10 = 'up' | NOT RUN | - | -| 200 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan3010 - MLAG_PEER_L3_iBGP: vrf VRF11 = 'up' | NOT RUN | - | -| 201 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4085 - Inband Management = 'up' | NOT RUN | - | -| 202 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up' | NOT RUN | - | -| 203 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4094 - MLAG_PEER = 'up' | NOT RUN | - | -| 204 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vxlan1 = 'up' | NOT RUN | - | -| 205 | dc1-leaf1b | MLAG | VerifyMlagStatus | Verifies the health status of the MLAG configuration. | - | NOT RUN | - | -| 206 | dc1-leaf1b | Routing | VerifyRoutingProtocolModel | Verifies the configured routing protocol model. | Routing protocol model: multi-agent | NOT RUN | - | -| 207 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.1 - Peer: dc1-spine1 | NOT RUN | - | -| 208 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.2 - Peer: dc1-spine2 | NOT RUN | - | -| 209 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.3 - Peer: dc1-leaf1a | NOT RUN | - | -| 210 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.4 - Peer: dc1-leaf1b | NOT RUN | - | -| 211 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.5 - Peer: dc1-leaf2a | NOT RUN | - | -| 212 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.3 - Peer: dc1-leaf1a | NOT RUN | - | -| 213 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.5 - Peer: dc1-leaf2a | NOT RUN | - | -| 214 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.11 - Peer: dc2-spine1 | NOT RUN | - | -| 215 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.12 - Peer: dc2-spine2 | NOT RUN | - | -| 216 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.13 - Peer: dc2-leaf1a | NOT RUN | - | -| 217 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.14 - Peer: dc2-leaf1b | NOT RUN | - | -| 218 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.15 - Peer: dc2-leaf2a | NOT RUN | - | -| 219 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.16 - Peer: dc2-leaf2b | NOT RUN | - | -| 220 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | -| 221 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com | NOT RUN | - | -| 222 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.13 - Peer: dc2-leaf1a | NOT RUN | - | -| 223 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.15 - Peer: dc2-leaf2a | NOT RUN | - | -| 224 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | -| 225 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.1 - Peer: dc1-wan1 | NOT RUN | - | -| 226 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.2 - Peer: dc1-wan2 | NOT RUN | - | -| 227 | dc1-leaf1b | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | -| 228 | dc1-leaf1b | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | -| 229 | dc1-leaf1b | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | -| 230 | dc1-leaf1b | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | -| 231 | dc1-leaf1b | Software | VerifyEOSVersion | Verifies the device is running one of the allowed EOS version. | - | NOT RUN | - | -| 232 | dc1-leaf1b | Software | VerifyTerminAttrVersion | Verifies the device is running one of the allowed TerminAttr version. | - | NOT RUN | - | -| 233 | dc1-leaf1b | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | -| 234 | dc1-leaf1b | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | -| 235 | dc1-leaf1b | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | -| 236 | dc1-leaf1b | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | -| 237 | dc1-leaf1b | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | -| 238 | dc1-leaf1b | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 239 | dc1-leaf1b | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 240 | dc1-leaf1b | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | -| 241 | dc1-leaf1b | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | -| 242 | dc1-leaf1c | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | -| 243 | dc1-leaf1c | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | -| 244 | dc1-leaf1c | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | -| 245 | dc1-leaf1c | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | -| 246 | dc1-leaf1c | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | -| 247 | dc1-leaf1c | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | -| 248 | dc1-leaf1c | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | -| 249 | dc1-leaf1c | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | -| 250 | dc1-leaf1c | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | -| 251 | dc1-leaf1c | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc1-leaf1a Ethernet8 | NOT RUN | - | -| 252 | dc1-leaf1c | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc1-leaf1b Ethernet8 | NOT RUN | - | -| 253 | dc1-leaf1c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3) | NOT RUN | - | -| 254 | dc1-leaf1c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4) | NOT RUN | - | -| 255 | dc1-leaf1c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5) | NOT RUN | - | -| 256 | dc1-leaf1c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1) | NOT RUN | - | -| 257 | dc1-leaf1c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2) | NOT RUN | - | -| 258 | dc1-leaf1c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1) | NOT RUN | - | -| 259 | dc1-leaf1c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2) | NOT RUN | - | -| 260 | dc1-leaf1c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13) | NOT RUN | - | -| 261 | dc1-leaf1c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14) | NOT RUN | - | -| 262 | dc1-leaf1c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15) | NOT RUN | - | -| 263 | dc1-leaf1c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16) | NOT RUN | - | -| 264 | dc1-leaf1c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17) | NOT RUN | - | -| 265 | dc1-leaf1c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18) | NOT RUN | - | -| 266 | dc1-leaf1c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11) | NOT RUN | - | -| 267 | dc1-leaf1c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12) | NOT RUN | - | -| 268 | dc1-leaf1c | Field Notices, Software | VerifyFieldNotice44Resolution | Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization) | - | NOT RUN | - | -| 269 | dc1-leaf1c | Field Notices, Software | VerifyFieldNotice72Resolution | Verifies if the device has exposeure to FN72, and if the issue has been mitigated | - | NOT RUN | - | -| 270 | dc1-leaf1c | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS7280E and DCS7500E | - | NOT RUN | - | -| 271 | dc1-leaf1c | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | -| 272 | dc1-leaf1c | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | -| 273 | dc1-leaf1c | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | -| 274 | dc1-leaf1c | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | -| 275 | dc1-leaf1c | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | -| 276 | dc1-leaf1c | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 277 | dc1-leaf1c | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 278 | dc1-leaf1c | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | -| 279 | dc1-leaf1c | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | -| 280 | dc1-leaf1c | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | -| 281 | dc1-leaf1c | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - DC1-LEAF1A_Ethernet8 = 'up' | NOT RUN | - | -| 282 | dc1-leaf1c | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - DC1-LEAF1B_Ethernet8 = 'up' | NOT RUN | - | -| 283 | dc1-leaf1c | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet5 - dc1-leaf1-server1_iLO = 'up' | NOT RUN | - | -| 284 | dc1-leaf1c | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel1 - DC1_L3_LEAF1_Po8 = 'up' | NOT RUN | - | -| 285 | dc1-leaf1c | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4085 - L2LEAF_INBAND_MGMT = 'up' | NOT RUN | - | -| 286 | dc1-leaf1c | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | -| 287 | dc1-leaf1c | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | -| 288 | dc1-leaf1c | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | -| 289 | dc1-leaf1c | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | -| 290 | dc1-leaf1c | Software | VerifyEOSVersion | Verifies the device is running one of the allowed EOS version. | - | NOT RUN | - | -| 291 | dc1-leaf1c | Software | VerifyTerminAttrVersion | Verifies the device is running one of the allowed TerminAttr version. | - | NOT RUN | - | -| 292 | dc1-leaf1c | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | -| 293 | dc1-leaf1c | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | -| 294 | dc1-leaf1c | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | -| 295 | dc1-leaf1c | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | -| 296 | dc1-leaf1c | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | -| 297 | dc1-leaf1c | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 298 | dc1-leaf1c | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 299 | dc1-leaf1c | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | -| 300 | dc1-leaf1c | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | -| 301 | dc1-leaf2a | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | -| 302 | dc1-leaf2a | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | -| 303 | dc1-leaf2a | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | -| 304 | dc1-leaf2a | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | -| 305 | dc1-leaf2a | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | -| 306 | dc1-leaf2a | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | -| 307 | dc1-leaf2a | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | -| 308 | dc1-leaf2a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc1-spine1 (IP: 10.255.0.1) | NOT RUN | - | -| 309 | dc1-leaf2a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc1-spine2 (IP: 10.255.0.2) | NOT RUN | - | -| 310 | dc1-leaf2a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-leaf2a (IP: 10.255.128.15) | NOT RUN | - | -| 311 | dc1-leaf2a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-spine1 (IP: 10.255.255.8) | NOT RUN | - | -| 312 | dc1-leaf2a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-spine2 (IP: 10.255.255.10) | NOT RUN | - | -| 313 | dc1-leaf2a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf2a (IP: 192.168.100.1) | NOT RUN | - | -| 314 | dc1-leaf2a | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | -| 315 | dc1-leaf2a | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | -| 316 | dc1-leaf2a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc1-spine1 Ethernet3 | NOT RUN | - | -| 317 | dc1-leaf2a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc1-spine2 Ethernet3 | NOT RUN | - | -| 318 | dc1-leaf2a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet6 - Remote: dc2-leaf2a Ethernet6 | NOT RUN | - | -| 319 | dc1-leaf2a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet8 - Remote: dc1-leaf2c Ethernet1 | NOT RUN | - | -| 320 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3) | NOT RUN | - | -| 321 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4) | NOT RUN | - | -| 322 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5) | NOT RUN | - | -| 323 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1) | NOT RUN | - | -| 324 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2) | NOT RUN | - | -| 325 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1) | NOT RUN | - | -| 326 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2) | NOT RUN | - | -| 327 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.5) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13) | NOT RUN | - | -| 328 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.5) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14) | NOT RUN | - | -| 329 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.5) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15) | NOT RUN | - | -| 330 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.5) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16) | NOT RUN | - | -| 331 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.5) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17) | NOT RUN | - | -| 332 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.5) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18) | NOT RUN | - | -| 333 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.5) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11) | NOT RUN | - | -| 334 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.5) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12) | NOT RUN | - | -| 335 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet1 (IP: 10.255.255.9) - Destination: dc1-spine1 Ethernet3 (IP: 10.255.255.8) | NOT RUN | - | -| 336 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet2 (IP: 10.255.255.11) - Destination: dc1-spine2 Ethernet3 (IP: 10.255.255.10) | NOT RUN | - | -| 337 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet6 (IP: 192.168.100.0) - Destination: dc2-leaf2a Ethernet6 (IP: 192.168.100.1) | NOT RUN | - | -| 338 | dc1-leaf2a | Field Notices, Software | VerifyFieldNotice44Resolution | Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization) | - | NOT RUN | - | -| 339 | dc1-leaf2a | Field Notices, Software | VerifyFieldNotice72Resolution | Verifies if the device has exposeure to FN72, and if the issue has been mitigated | - | NOT RUN | - | -| 340 | dc1-leaf2a | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS7280E and DCS7500E | - | NOT RUN | - | -| 341 | dc1-leaf2a | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | -| 342 | dc1-leaf2a | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | -| 343 | dc1-leaf2a | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | -| 344 | dc1-leaf2a | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | -| 345 | dc1-leaf2a | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | -| 346 | dc1-leaf2a | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 347 | dc1-leaf2a | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 348 | dc1-leaf2a | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | -| 349 | dc1-leaf2a | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | -| 350 | dc1-leaf2a | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | -| 351 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - P2P_LINK_TO_DC1-SPINE1_Ethernet3 = 'up' | NOT RUN | - | -| 352 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - P2P_LINK_TO_DC1-SPINE2_Ethernet3 = 'up' | NOT RUN | - | -| 353 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet3 - MLAG_PEER_dc1-leaf2b_Ethernet3 = 'up' | NOT RUN | - | -| 354 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet4 - MLAG_PEER_dc1-leaf2b_Ethernet4 = 'up' | NOT RUN | - | -| 355 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet5 - dc1-leaf2-server1_PCI1 = 'up' | NOT RUN | - | -| 356 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet6 - P2P_LINK_TO_dc2-leaf2a_Ethernet6 = 'up' | NOT RUN | - | -| 357 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet8 - DC1-LEAF2C_Ethernet1 = 'up' | NOT RUN | - | -| 358 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback0 - EVPN_Overlay_Peering = 'up' | NOT RUN | - | -| 359 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up' | NOT RUN | - | -| 360 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback10 - VRF10_VTEP_DIAGNOSTICS = 'up' | NOT RUN | - | -| 361 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback11 - VRF11_VTEP_DIAGNOSTICS = 'up' | NOT RUN | - | -| 362 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel3 - MLAG_PEER_dc1-leaf2b_Po3 = 'up' | NOT RUN | - | -| 363 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel5 - dc1-leaf2-server1_PortChannel dc1-leaf2-server1 = 'up' | NOT RUN | - | -| 364 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel8 - DC1-LEAF2C_Po1 = 'up' | NOT RUN | - | -| 365 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan11 - VRF10_VLAN11 = 'up' | NOT RUN | - | -| 366 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan12 - VRF10_VLAN12 = 'up' | NOT RUN | - | -| 367 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan21 - VRF11_VLAN21 = 'up' | NOT RUN | - | -| 368 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan22 - VRF11_VLAN22 = 'up' | NOT RUN | - | -| 369 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan3009 - MLAG_PEER_L3_iBGP: vrf VRF10 = 'up' | NOT RUN | - | -| 370 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan3010 - MLAG_PEER_L3_iBGP: vrf VRF11 = 'up' | NOT RUN | - | -| 371 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4085 - Inband Management = 'up' | NOT RUN | - | -| 372 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up' | NOT RUN | - | -| 373 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4094 - MLAG_PEER = 'up' | NOT RUN | - | -| 374 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vxlan1 = 'up' | NOT RUN | - | -| 375 | dc1-leaf2a | MLAG | VerifyMlagStatus | Verifies the health status of the MLAG configuration. | - | NOT RUN | - | -| 376 | dc1-leaf2a | Profiles | VerifyTcamProfile | Verify that the assigned TCAM profile is actually running on the device | - | NOT RUN | - | -| 377 | dc1-leaf2a | Profiles | VerifyUnifiedForwardingTableMode | - | - | NOT RUN | - | -| 378 | dc1-leaf2a | Routing | VerifyRoutingProtocolModel | Verifies the configured routing protocol model. | Routing protocol model: multi-agent | NOT RUN | - | -| 379 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.1 - Peer: dc1-spine1 | NOT RUN | - | -| 380 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.2 - Peer: dc1-spine2 | NOT RUN | - | -| 381 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.3 - Peer: dc1-leaf1a | NOT RUN | - | -| 382 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.4 - Peer: dc1-leaf1b | NOT RUN | - | -| 383 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.5 - Peer: dc1-leaf2a | NOT RUN | - | -| 384 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.3 - Peer: dc1-leaf1a | NOT RUN | - | -| 385 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.5 - Peer: dc1-leaf2a | NOT RUN | - | -| 386 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.11 - Peer: dc2-spine1 | NOT RUN | - | -| 387 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.12 - Peer: dc2-spine2 | NOT RUN | - | -| 388 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.13 - Peer: dc2-leaf1a | NOT RUN | - | -| 389 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.14 - Peer: dc2-leaf1b | NOT RUN | - | -| 390 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.15 - Peer: dc2-leaf2a | NOT RUN | - | -| 391 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.16 - Peer: dc2-leaf2b | NOT RUN | - | -| 392 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | -| 393 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com | NOT RUN | - | -| 394 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.13 - Peer: dc2-leaf1a | NOT RUN | - | -| 395 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.15 - Peer: dc2-leaf2a | NOT RUN | - | -| 396 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | -| 397 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.1 - Peer: dc1-wan1 | NOT RUN | - | -| 398 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.2 - Peer: dc1-wan2 | NOT RUN | - | -| 399 | dc1-leaf2a | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | -| 400 | dc1-leaf2a | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | -| 401 | dc1-leaf2a | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | -| 402 | dc1-leaf2a | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | -| 403 | dc1-leaf2a | Software | VerifyEOSExtensions | Verifies all EOS extensions installed on the device are enabled for boot persistence. | - | NOT RUN | - | -| 404 | dc1-leaf2a | Software | VerifyEOSVersion | Verifies the device is running one of the allowed EOS version. | - | NOT RUN | - | -| 405 | dc1-leaf2a | Software | VerifyTerminAttrVersion | Verifies the device is running one of the allowed TerminAttr version. | - | NOT RUN | - | -| 406 | dc1-leaf2a | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | -| 407 | dc1-leaf2a | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | -| 408 | dc1-leaf2a | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | -| 409 | dc1-leaf2a | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | -| 410 | dc1-leaf2a | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | -| 411 | dc1-leaf2a | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 412 | dc1-leaf2a | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 413 | dc1-leaf2a | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | -| 414 | dc1-leaf2a | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | -| 415 | dc1-leaf2c | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | -| 416 | dc1-leaf2c | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | -| 417 | dc1-leaf2c | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | -| 418 | dc1-leaf2c | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | -| 419 | dc1-leaf2c | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | -| 420 | dc1-leaf2c | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | -| 421 | dc1-leaf2c | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | -| 422 | dc1-leaf2c | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | -| 423 | dc1-leaf2c | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | -| 424 | dc1-leaf2c | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc1-leaf2a Ethernet8 | NOT RUN | - | -| 425 | dc1-leaf2c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3) | NOT RUN | - | -| 426 | dc1-leaf2c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4) | NOT RUN | - | -| 427 | dc1-leaf2c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5) | NOT RUN | - | -| 428 | dc1-leaf2c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1) | NOT RUN | - | -| 429 | dc1-leaf2c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2) | NOT RUN | - | -| 430 | dc1-leaf2c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1) | NOT RUN | - | -| 431 | dc1-leaf2c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2) | NOT RUN | - | -| 432 | dc1-leaf2c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13) | NOT RUN | - | -| 433 | dc1-leaf2c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14) | NOT RUN | - | -| 434 | dc1-leaf2c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15) | NOT RUN | - | -| 435 | dc1-leaf2c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16) | NOT RUN | - | -| 436 | dc1-leaf2c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17) | NOT RUN | - | -| 437 | dc1-leaf2c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18) | NOT RUN | - | -| 438 | dc1-leaf2c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11) | NOT RUN | - | -| 439 | dc1-leaf2c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12) | NOT RUN | - | -| 440 | dc1-leaf2c | Field Notices, Software | VerifyFieldNotice44Resolution | Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization) | - | NOT RUN | - | -| 441 | dc1-leaf2c | Field Notices, Software | VerifyFieldNotice72Resolution | Verifies if the device has exposeure to FN72, and if the issue has been mitigated | - | NOT RUN | - | -| 442 | dc1-leaf2c | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS7280E and DCS7500E | - | NOT RUN | - | -| 443 | dc1-leaf2c | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | -| 444 | dc1-leaf2c | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | -| 445 | dc1-leaf2c | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | -| 446 | dc1-leaf2c | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | -| 447 | dc1-leaf2c | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | -| 448 | dc1-leaf2c | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 449 | dc1-leaf2c | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 450 | dc1-leaf2c | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | -| 451 | dc1-leaf2c | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | -| 452 | dc1-leaf2c | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | -| 453 | dc1-leaf2c | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - DC1-LEAF2A_Ethernet8 = 'up' | NOT RUN | - | -| 454 | dc1-leaf2c | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - DC1-LEAF2B_Ethernet8 = 'adminDown' | NOT RUN | - | -| 455 | dc1-leaf2c | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet5 - dc1-leaf2-server1_iLO = 'up' | NOT RUN | - | -| 456 | dc1-leaf2c | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel1 - DC1_L3_LEAF2_Po8 = 'up' | NOT RUN | - | -| 457 | dc1-leaf2c | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4085 - L2LEAF_INBAND_MGMT = 'up' | NOT RUN | - | -| 458 | dc1-leaf2c | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | -| 459 | dc1-leaf2c | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | -| 460 | dc1-leaf2c | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | -| 461 | dc1-leaf2c | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | -| 462 | dc1-leaf2c | Software | VerifyEOSVersion | Verifies the device is running one of the allowed EOS version. | - | NOT RUN | - | -| 463 | dc1-leaf2c | Software | VerifyTerminAttrVersion | Verifies the device is running one of the allowed TerminAttr version. | - | NOT RUN | - | -| 464 | dc1-leaf2c | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | -| 465 | dc1-leaf2c | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | -| 466 | dc1-leaf2c | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | -| 467 | dc1-leaf2c | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | -| 468 | dc1-leaf2c | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | -| 469 | dc1-leaf2c | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 470 | dc1-leaf2c | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 471 | dc1-leaf2c | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | -| 472 | dc1-leaf2c | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | -| 473 | dc1-spine1 | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | -| 474 | dc1-spine1 | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | -| 475 | dc1-spine1 | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | -| 476 | dc1-spine1 | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | -| 477 | dc1-spine1 | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | -| 478 | dc1-spine1 | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | -| 479 | dc1-spine1 | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | -| 480 | dc1-spine1 | BFD | VerifyBFDPeersHealth | Verifies the health of all IPv4 BFD peers. | - | NOT RUN | - | -| 481 | dc1-spine1 | BFD | VerifyBFDPeersIntervals | Verifies the timers of the IPv4 BFD peers in the specified VRF. | - | NOT RUN | - | -| 482 | dc1-spine1 | BFD | VerifyBFDSpecificPeers | Verifies the IPv4 BFD peer's sessions and remote disc in the specified VRF. | - | NOT RUN | - | -| 483 | dc1-spine1 | BGP | VerifyBGPPeerCount | Verifies the count of BGP peers. | - | NOT RUN | - | -| 484 | dc1-spine1 | BGP | VerifyBGPPeersHealth | Verifies the health of BGP peers | - | NOT RUN | - | -| 485 | dc1-spine1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | - | NOT RUN | - | -| 486 | dc1-spine1 | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | -| 487 | dc1-spine1 | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | -| 488 | dc1-spine1 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc1-leaf1a Ethernet1 | NOT RUN | - | -| 489 | dc1-spine1 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc1-leaf1b Ethernet1 | NOT RUN | - | -| 490 | dc1-spine1 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet3 - Remote: dc1-leaf2a Ethernet1 | NOT RUN | - | -| 491 | dc1-spine1 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet1 (IP: 10.255.255.0) - Destination: dc1-leaf1a Ethernet1 (IP: 10.255.255.1) | NOT RUN | - | -| 492 | dc1-spine1 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet2 (IP: 10.255.255.4) - Destination: dc1-leaf1b Ethernet1 (IP: 10.255.255.5) | NOT RUN | - | -| 493 | dc1-spine1 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet3 (IP: 10.255.255.8) - Destination: dc1-leaf2a Ethernet1 (IP: 10.255.255.9) | NOT RUN | - | -| 494 | dc1-spine1 | Field Notices, Software | VerifyFieldNotice44Resolution | Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization) | - | NOT RUN | - | -| 495 | dc1-spine1 | Field Notices, Software | VerifyFieldNotice72Resolution | Verifies if the device has exposeure to FN72, and if the issue has been mitigated | - | NOT RUN | - | -| 496 | dc1-spine1 | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS7280E and DCS7500E | - | NOT RUN | - | -| 497 | dc1-spine1 | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | -| 498 | dc1-spine1 | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | -| 499 | dc1-spine1 | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | -| 500 | dc1-spine1 | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | -| 501 | dc1-spine1 | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | -| 502 | dc1-spine1 | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 503 | dc1-spine1 | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 504 | dc1-spine1 | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | -| 505 | dc1-spine1 | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | -| 506 | dc1-spine1 | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | -| 507 | dc1-spine1 | Interfaces | VerifyIllegalLACP | Verifies there are no illegal LACP packets in all port channels. | - | NOT RUN | - | -| 508 | dc1-spine1 | Interfaces | VerifyInterfaceDiscards | Verifies there are no interface discard counters. | - | NOT RUN | - | -| 509 | dc1-spine1 | Interfaces | VerifyInterfaceErrDisabled | Verifies there are no interfaces in the errdisabled state. | - | NOT RUN | - | -| 510 | dc1-spine1 | Interfaces | VerifyInterfaceErrors | Verifies there are no interface error counters. | - | NOT RUN | - | -| 511 | dc1-spine1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | - | NOT RUN | - | -| 512 | dc1-spine1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - P2P_LINK_TO_DC1-LEAF1A_Ethernet1 = 'up' | NOT RUN | - | -| 513 | dc1-spine1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - P2P_LINK_TO_DC1-LEAF1B_Ethernet1 = 'up' | NOT RUN | - | -| 514 | dc1-spine1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet3 - P2P_LINK_TO_DC1-LEAF2A_Ethernet1 = 'up' | NOT RUN | - | -| 515 | dc1-spine1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet4 - P2P_LINK_TO_DC1-LEAF2B_Ethernet1 = 'adminDown' | NOT RUN | - | -| 516 | dc1-spine1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback0 - EVPN_Overlay_Peering = 'up' | NOT RUN | - | -| 517 | dc1-spine1 | Interfaces | VerifyInterfaceUtilization | Verifies that all interfaces have a usage below 75%. | - | NOT RUN | - | -| 518 | dc1-spine1 | Interfaces | VerifyIPProxyARP | Verifies if Proxy ARP is enabled. | - | NOT RUN | - | -| 519 | dc1-spine1 | Interfaces | VerifyL2MTU | Verifies the global L2 MTU of all L2 interfaces. | - | NOT RUN | - | -| 520 | dc1-spine1 | Interfaces | VerifyL3MTU | Verifies the global L3 MTU of all L3 interfaces. | - | NOT RUN | - | -| 521 | dc1-spine1 | Interfaces | VerifyLoopbackCount | Verifies the number of loopback interfaces and their status. | - | NOT RUN | - | -| 522 | dc1-spine1 | Interfaces | VerifyPortChannels | Verifies there are no inactive ports in all port channels. | - | NOT RUN | - | -| 523 | dc1-spine1 | Interfaces | VerifyStormControlDrops | Verifies there are no interface storm-control drop counters. | - | NOT RUN | - | -| 524 | dc1-spine1 | Interfaces | VerifySVI | Verifies the status of all SVIs. | - | NOT RUN | - | -| 525 | dc1-spine1 | OSPF | VerifyOSPFNeighborCount | Verifies the number of OSPF neighbors in FULL state is the one we expect. | - | NOT RUN | - | -| 526 | dc1-spine1 | OSPF | VerifyOSPFNeighborState | Verifies all OSPF neighbors are in FULL state. | - | NOT RUN | - | -| 527 | dc1-spine1 | Routing | VerifyRoutingProtocolModel | Verifies the configured routing protocol model. | - | NOT RUN | - | -| 528 | dc1-spine1 | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | - | NOT RUN | - | -| 529 | dc1-spine1 | Routing | VerifyRoutingTableSize | Verifies the size of the IP routing table (default VRF). Should be between the two provided thresholds. | - | NOT RUN | - | -| 530 | dc1-spine1 | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | -| 531 | dc1-spine1 | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | -| 532 | dc1-spine1 | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | -| 533 | dc1-spine1 | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | -| 534 | dc1-spine1 | Software | VerifyEOSVersion | Verifies the device is running one of the allowed EOS version. | - | NOT RUN | - | -| 535 | dc1-spine1 | Software | VerifyTerminAttrVersion | Verifies the device is running one of the allowed TerminAttr version. | - | NOT RUN | - | -| 536 | dc1-spine1 | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | -| 537 | dc1-spine1 | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | -| 538 | dc1-spine1 | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | -| 539 | dc1-spine1 | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | -| 540 | dc1-spine1 | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | -| 541 | dc1-spine1 | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 542 | dc1-spine1 | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 543 | dc1-spine1 | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | -| 544 | dc1-spine1 | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | -| 545 | dc1-spine2 | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | -| 546 | dc1-spine2 | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | -| 547 | dc1-spine2 | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | -| 548 | dc1-spine2 | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | -| 549 | dc1-spine2 | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | -| 550 | dc1-spine2 | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | -| 551 | dc1-spine2 | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | -| 552 | dc1-spine2 | BFD | VerifyBFDPeersHealth | Verifies the health of all IPv4 BFD peers. | - | NOT RUN | - | -| 553 | dc1-spine2 | BFD | VerifyBFDPeersIntervals | Verifies the timers of the IPv4 BFD peers in the specified VRF. | - | NOT RUN | - | -| 554 | dc1-spine2 | BFD | VerifyBFDSpecificPeers | Verifies the IPv4 BFD peer's sessions and remote disc in the specified VRF. | - | NOT RUN | - | -| 555 | dc1-spine2 | BGP | VerifyBGPPeerCount | Verifies the count of BGP peers. | - | NOT RUN | - | -| 556 | dc1-spine2 | BGP | VerifyBGPPeersHealth | Verifies the health of BGP peers | - | NOT RUN | - | -| 557 | dc1-spine2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | - | NOT RUN | - | -| 558 | dc1-spine2 | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | -| 559 | dc1-spine2 | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | -| 560 | dc1-spine2 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc1-leaf1a Ethernet2 | NOT RUN | - | -| 561 | dc1-spine2 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc1-leaf1b Ethernet2 | NOT RUN | - | -| 562 | dc1-spine2 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet3 - Remote: dc1-leaf2a Ethernet2 | NOT RUN | - | -| 563 | dc1-spine2 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet1 (IP: 10.255.255.2) - Destination: dc1-leaf1a Ethernet2 (IP: 10.255.255.3) | NOT RUN | - | -| 564 | dc1-spine2 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet2 (IP: 10.255.255.6) - Destination: dc1-leaf1b Ethernet2 (IP: 10.255.255.7) | NOT RUN | - | -| 565 | dc1-spine2 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet3 (IP: 10.255.255.10) - Destination: dc1-leaf2a Ethernet2 (IP: 10.255.255.11) | NOT RUN | - | -| 566 | dc1-spine2 | Field Notices, Software | VerifyFieldNotice44Resolution | Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization) | - | NOT RUN | - | -| 567 | dc1-spine2 | Field Notices, Software | VerifyFieldNotice72Resolution | Verifies if the device has exposeure to FN72, and if the issue has been mitigated | - | NOT RUN | - | -| 568 | dc1-spine2 | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS7280E and DCS7500E | - | NOT RUN | - | -| 569 | dc1-spine2 | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | -| 570 | dc1-spine2 | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | -| 571 | dc1-spine2 | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | -| 572 | dc1-spine2 | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | -| 573 | dc1-spine2 | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | -| 574 | dc1-spine2 | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 575 | dc1-spine2 | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 576 | dc1-spine2 | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | -| 577 | dc1-spine2 | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | -| 578 | dc1-spine2 | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | -| 579 | dc1-spine2 | Interfaces | VerifyIllegalLACP | Verifies there are no illegal LACP packets in all port channels. | - | NOT RUN | - | -| 580 | dc1-spine2 | Interfaces | VerifyInterfaceDiscards | Verifies there are no interface discard counters. | - | NOT RUN | - | -| 581 | dc1-spine2 | Interfaces | VerifyInterfaceErrDisabled | Verifies there are no interfaces in the errdisabled state. | - | NOT RUN | - | -| 582 | dc1-spine2 | Interfaces | VerifyInterfaceErrors | Verifies there are no interface error counters. | - | NOT RUN | - | -| 583 | dc1-spine2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | - | NOT RUN | - | -| 584 | dc1-spine2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - P2P_LINK_TO_DC1-LEAF1A_Ethernet2 = 'up' | NOT RUN | - | -| 585 | dc1-spine2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - P2P_LINK_TO_DC1-LEAF1B_Ethernet2 = 'up' | NOT RUN | - | -| 586 | dc1-spine2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet3 - P2P_LINK_TO_DC1-LEAF2A_Ethernet2 = 'up' | NOT RUN | - | -| 587 | dc1-spine2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet4 - P2P_LINK_TO_DC1-LEAF2B_Ethernet2 = 'adminDown' | NOT RUN | - | -| 588 | dc1-spine2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback0 - EVPN_Overlay_Peering = 'up' | NOT RUN | - | -| 589 | dc1-spine2 | Interfaces | VerifyInterfaceUtilization | Verifies that all interfaces have a usage below 75%. | - | NOT RUN | - | -| 590 | dc1-spine2 | Interfaces | VerifyIPProxyARP | Verifies if Proxy ARP is enabled. | - | NOT RUN | - | -| 591 | dc1-spine2 | Interfaces | VerifyL2MTU | Verifies the global L2 MTU of all L2 interfaces. | - | NOT RUN | - | -| 592 | dc1-spine2 | Interfaces | VerifyL3MTU | Verifies the global L3 MTU of all L3 interfaces. | - | NOT RUN | - | -| 593 | dc1-spine2 | Interfaces | VerifyLoopbackCount | Verifies the number of loopback interfaces and their status. | - | NOT RUN | - | -| 594 | dc1-spine2 | Interfaces | VerifyPortChannels | Verifies there are no inactive ports in all port channels. | - | NOT RUN | - | -| 595 | dc1-spine2 | Interfaces | VerifyStormControlDrops | Verifies there are no interface storm-control drop counters. | - | NOT RUN | - | -| 596 | dc1-spine2 | Interfaces | VerifySVI | Verifies the status of all SVIs. | - | NOT RUN | - | -| 597 | dc1-spine2 | OSPF | VerifyOSPFNeighborCount | Verifies the number of OSPF neighbors in FULL state is the one we expect. | - | NOT RUN | - | -| 598 | dc1-spine2 | OSPF | VerifyOSPFNeighborState | Verifies all OSPF neighbors are in FULL state. | - | NOT RUN | - | -| 599 | dc1-spine2 | Routing | VerifyRoutingProtocolModel | Verifies the configured routing protocol model. | - | NOT RUN | - | -| 600 | dc1-spine2 | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | - | NOT RUN | - | -| 601 | dc1-spine2 | Routing | VerifyRoutingTableSize | Verifies the size of the IP routing table (default VRF). Should be between the two provided thresholds. | - | NOT RUN | - | -| 602 | dc1-spine2 | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | -| 603 | dc1-spine2 | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | -| 604 | dc1-spine2 | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | -| 605 | dc1-spine2 | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | -| 606 | dc1-spine2 | Software | VerifyEOSVersion | Verifies the device is running one of the allowed EOS version. | - | NOT RUN | - | -| 607 | dc1-spine2 | Software | VerifyTerminAttrVersion | Verifies the device is running one of the allowed TerminAttr version. | - | NOT RUN | - | -| 608 | dc1-spine2 | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | -| 609 | dc1-spine2 | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | -| 610 | dc1-spine2 | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | -| 611 | dc1-spine2 | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | -| 612 | dc1-spine2 | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | -| 613 | dc1-spine2 | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 614 | dc1-spine2 | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 615 | dc1-spine2 | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | -| 616 | dc1-spine2 | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | -| 617 | dc1-wan1 | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | -| 618 | dc1-wan1 | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | -| 619 | dc1-wan1 | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | -| 620 | dc1-wan1 | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | -| 621 | dc1-wan1 | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | -| 622 | dc1-wan1 | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | -| 623 | dc1-wan1 | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | -| 624 | dc1-wan1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-leaf1a (IP: 10.255.255.0) | NOT RUN | - | -| 625 | dc1-wan1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-leaf1b (IP: 10.255.255.2) | NOT RUN | - | -| 626 | dc1-wan1 | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | -| 627 | dc1-wan1 | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | -| 628 | dc1-wan1 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc1-leaf1a Ethernet6 | NOT RUN | - | -| 629 | dc1-wan1 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc1-leaf1b Ethernet6 | NOT RUN | - | -| 630 | dc1-wan1 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet1 (IP: 10.255.255.1) - Destination: dc1-leaf1a Ethernet6 (IP: 10.255.255.0) | NOT RUN | - | -| 631 | dc1-wan1 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet2 (IP: 10.255.255.3) - Destination: dc1-leaf1b Ethernet6 (IP: 10.255.255.2) | NOT RUN | - | -| 632 | dc1-wan1 | Field Notices, Software | VerifyFieldNotice44Resolution | Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization) | - | NOT RUN | - | -| 633 | dc1-wan1 | Field Notices, Software | VerifyFieldNotice72Resolution | Verifies if the device has exposeure to FN72, and if the issue has been mitigated | - | NOT RUN | - | -| 634 | dc1-wan1 | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS7280E and DCS7500E | - | NOT RUN | - | -| 635 | dc1-wan1 | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | -| 636 | dc1-wan1 | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | -| 637 | dc1-wan1 | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | -| 638 | dc1-wan1 | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | -| 639 | dc1-wan1 | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | -| 640 | dc1-wan1 | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 641 | dc1-wan1 | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 642 | dc1-wan1 | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | -| 643 | dc1-wan1 | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | -| 644 | dc1-wan1 | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | -| 645 | dc1-wan1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Dps1 - DPS Interface = 'up' | NOT RUN | - | -| 646 | dc1-wan1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - P2P_LINK_TO_DC1-LEAF1A_Ethernet6 = 'up' | NOT RUN | - | -| 647 | dc1-wan1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - P2P_LINK_TO_DC1-LEAF1B_Ethernet6 = 'up' | NOT RUN | - | -| 648 | dc1-wan1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet3 - mpls-sp-1_DC1-MPLS-3 = 'up' | NOT RUN | - | -| 649 | dc1-wan1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet4 - isp-1_DC1-INET-3 = 'up' | NOT RUN | - | -| 650 | dc1-wan1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback0 - Router_ID = 'up' | NOT RUN | - | -| 651 | dc1-wan1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vxlan1 = 'up' | NOT RUN | - | -| 652 | dc1-wan1 | Routing | VerifyRoutingProtocolModel | Verifies the configured routing protocol model. | Routing protocol model: multi-agent | NOT RUN | - | -| 653 | dc1-wan1 | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | -| 654 | dc1-wan1 | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | -| 655 | dc1-wan1 | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | -| 656 | dc1-wan1 | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | -| 657 | dc1-wan1 | Software | VerifyEOSVersion | Verifies the device is running one of the allowed EOS version. | - | NOT RUN | - | -| 658 | dc1-wan1 | Software | VerifyTerminAttrVersion | Verifies the device is running one of the allowed TerminAttr version. | - | NOT RUN | - | -| 659 | dc1-wan1 | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | -| 660 | dc1-wan1 | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | -| 661 | dc1-wan1 | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | -| 662 | dc1-wan1 | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | -| 663 | dc1-wan1 | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | -| 664 | dc1-wan1 | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 665 | dc1-wan1 | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 666 | dc1-wan1 | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | -| 667 | dc1-wan1 | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | -| 668 | dc1-wan2 | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | -| 669 | dc1-wan2 | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | -| 670 | dc1-wan2 | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | -| 671 | dc1-wan2 | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | -| 672 | dc1-wan2 | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | -| 673 | dc1-wan2 | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | -| 674 | dc1-wan2 | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | -| 675 | dc1-wan2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-leaf1a (IP: 10.255.255.4) | NOT RUN | - | -| 676 | dc1-wan2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-leaf1b (IP: 10.255.255.6) | NOT RUN | - | -| 677 | dc1-wan2 | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | -| 678 | dc1-wan2 | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | -| 679 | dc1-wan2 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc1-leaf1a Ethernet7 | NOT RUN | - | -| 680 | dc1-wan2 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc1-leaf1b Ethernet7 | NOT RUN | - | -| 681 | dc1-wan2 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet1 (IP: 10.255.255.5) - Destination: dc1-leaf1a Ethernet7 (IP: 10.255.255.4) | NOT RUN | - | -| 682 | dc1-wan2 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet2 (IP: 10.255.255.7) - Destination: dc1-leaf1b Ethernet7 (IP: 10.255.255.6) | NOT RUN | - | -| 683 | dc1-wan2 | Field Notices, Software | VerifyFieldNotice44Resolution | Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization) | - | NOT RUN | - | -| 684 | dc1-wan2 | Field Notices, Software | VerifyFieldNotice72Resolution | Verifies if the device has exposeure to FN72, and if the issue has been mitigated | - | NOT RUN | - | -| 685 | dc1-wan2 | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS7280E and DCS7500E | - | NOT RUN | - | -| 686 | dc1-wan2 | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | -| 687 | dc1-wan2 | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | -| 688 | dc1-wan2 | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | -| 689 | dc1-wan2 | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | -| 690 | dc1-wan2 | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | -| 691 | dc1-wan2 | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 692 | dc1-wan2 | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 693 | dc1-wan2 | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | -| 694 | dc1-wan2 | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | -| 695 | dc1-wan2 | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | -| 696 | dc1-wan2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Dps1 - DPS Interface = 'up' | NOT RUN | - | -| 697 | dc1-wan2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - P2P_LINK_TO_DC1-LEAF1A_Ethernet7 = 'up' | NOT RUN | - | -| 698 | dc1-wan2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - P2P_LINK_TO_DC1-LEAF1B_Ethernet7 = 'up' | NOT RUN | - | -| 699 | dc1-wan2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet3 - mpls-sp-1_DC1-MPLS-4 = 'up' | NOT RUN | - | -| 700 | dc1-wan2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet4 - isp-1_DC1-INET-4 = 'up' | NOT RUN | - | -| 701 | dc1-wan2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback0 - Router_ID = 'up' | NOT RUN | - | -| 702 | dc1-wan2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vxlan1 = 'up' | NOT RUN | - | -| 703 | dc1-wan2 | Routing | VerifyRoutingProtocolModel | Verifies the configured routing protocol model. | Routing protocol model: multi-agent | NOT RUN | - | -| 704 | dc1-wan2 | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | -| 705 | dc1-wan2 | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | -| 706 | dc1-wan2 | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | -| 707 | dc1-wan2 | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | -| 708 | dc1-wan2 | Software | VerifyEOSVersion | Verifies the device is running one of the allowed EOS version. | - | NOT RUN | - | -| 709 | dc1-wan2 | Software | VerifyTerminAttrVersion | Verifies the device is running one of the allowed TerminAttr version. | - | NOT RUN | - | -| 710 | dc1-wan2 | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | -| 711 | dc1-wan2 | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | -| 712 | dc1-wan2 | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | -| 713 | dc1-wan2 | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | -| 714 | dc1-wan2 | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | -| 715 | dc1-wan2 | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 716 | dc1-wan2 | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 717 | dc1-wan2 | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | -| 718 | dc1-wan2 | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | -| 719 | dc2-leaf1a | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | -| 720 | dc2-leaf1a | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | -| 721 | dc2-leaf1a | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | -| 722 | dc2-leaf1a | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | -| 723 | dc2-leaf1a | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | -| 724 | dc2-leaf1a | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | -| 725 | dc2-leaf1a | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | -| 726 | dc2-leaf1a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-spine1 (IP: 10.255.128.11) | NOT RUN | - | -| 727 | dc2-leaf1a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-spine2 (IP: 10.255.128.12) | NOT RUN | - | -| 728 | dc2-leaf1a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf1b (IP: 10.255.129.117) | NOT RUN | - | -| 729 | dc2-leaf1a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-spine1 (IP: 10.255.255.104) | NOT RUN | - | -| 730 | dc2-leaf1a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-spine2 (IP: 10.255.255.106) | NOT RUN | - | -| 731 | dc2-leaf1a | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | -| 732 | dc2-leaf1a | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | -| 733 | dc2-leaf1a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc2-spine1 Ethernet1 | NOT RUN | - | -| 734 | dc2-leaf1a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc2-spine2 Ethernet1 | NOT RUN | - | -| 735 | dc2-leaf1a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet3 - Remote: dc2-leaf1b Ethernet3 | NOT RUN | - | -| 736 | dc2-leaf1a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet4 - Remote: dc2-leaf1b Ethernet4 | NOT RUN | - | -| 737 | dc2-leaf1a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet8 - Remote: dc2-leaf1c Ethernet1 | NOT RUN | - | -| 738 | dc2-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3) | NOT RUN | - | -| 739 | dc2-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4) | NOT RUN | - | -| 740 | dc2-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5) | NOT RUN | - | -| 741 | dc2-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1) | NOT RUN | - | -| 742 | dc2-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2) | NOT RUN | - | -| 743 | dc2-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1) | NOT RUN | - | -| 744 | dc2-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2) | NOT RUN | - | -| 745 | dc2-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.13) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13) | NOT RUN | - | -| 746 | dc2-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.13) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14) | NOT RUN | - | -| 747 | dc2-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.13) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15) | NOT RUN | - | -| 748 | dc2-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.13) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16) | NOT RUN | - | -| 749 | dc2-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.13) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17) | NOT RUN | - | -| 750 | dc2-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.13) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18) | NOT RUN | - | -| 751 | dc2-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.13) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11) | NOT RUN | - | -| 752 | dc2-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.13) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12) | NOT RUN | - | -| 753 | dc2-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet1 (IP: 10.255.255.105) - Destination: dc2-spine1 Ethernet1 (IP: 10.255.255.104) | NOT RUN | - | -| 754 | dc2-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet2 (IP: 10.255.255.107) - Destination: dc2-spine2 Ethernet1 (IP: 10.255.255.106) | NOT RUN | - | -| 755 | dc2-leaf1a | Field Notices, Software | VerifyFieldNotice44Resolution | Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization) | - | NOT RUN | - | -| 756 | dc2-leaf1a | Field Notices, Software | VerifyFieldNotice72Resolution | Verifies if the device has exposeure to FN72, and if the issue has been mitigated | - | NOT RUN | - | -| 757 | dc2-leaf1a | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS7280E and DCS7500E | - | NOT RUN | - | -| 758 | dc2-leaf1a | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | -| 759 | dc2-leaf1a | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | -| 760 | dc2-leaf1a | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | -| 761 | dc2-leaf1a | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | -| 762 | dc2-leaf1a | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | -| 763 | dc2-leaf1a | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 764 | dc2-leaf1a | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 765 | dc2-leaf1a | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | -| 766 | dc2-leaf1a | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | -| 767 | dc2-leaf1a | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | -| 768 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - P2P_LINK_TO_DC2-SPINE1_Ethernet1 = 'up' | NOT RUN | - | -| 769 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - P2P_LINK_TO_DC2-SPINE2_Ethernet1 = 'up' | NOT RUN | - | -| 770 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet3 - MLAG_PEER_dc2-leaf1b_Ethernet3 = 'up' | NOT RUN | - | -| 771 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet4 - MLAG_PEER_dc2-leaf1b_Ethernet4 = 'up' | NOT RUN | - | -| 772 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet5 - dc2-leaf1-server1_PCI1 = 'up' | NOT RUN | - | -| 773 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet8 - DC2-LEAF1C_Ethernet1 = 'up' | NOT RUN | - | -| 774 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback0 - EVPN_Overlay_Peering = 'up' | NOT RUN | - | -| 775 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up' | NOT RUN | - | -| 776 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback10 - VRF10_VTEP_DIAGNOSTICS = 'up' | NOT RUN | - | -| 777 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback11 - VRF11_VTEP_DIAGNOSTICS = 'up' | NOT RUN | - | -| 778 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel3 - MLAG_PEER_dc2-leaf1b_Po3 = 'up' | NOT RUN | - | -| 779 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel5 - dc2-leaf1-server1_PortChannel dc2-leaf1-server1 = 'up' | NOT RUN | - | -| 780 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel8 - DC2-LEAF1C_Po1 = 'up' | NOT RUN | - | -| 781 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan11 - VRF10_VLAN11 = 'up' | NOT RUN | - | -| 782 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan12 - VRF10_VLAN12 = 'up' | NOT RUN | - | -| 783 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan21 - VRF11_VLAN21 = 'up' | NOT RUN | - | -| 784 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan22 - VRF11_VLAN22 = 'up' | NOT RUN | - | -| 785 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan3009 - MLAG_PEER_L3_iBGP: vrf VRF10 = 'up' | NOT RUN | - | -| 786 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan3010 - MLAG_PEER_L3_iBGP: vrf VRF11 = 'up' | NOT RUN | - | -| 787 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up' | NOT RUN | - | -| 788 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4094 - MLAG_PEER = 'up' | NOT RUN | - | -| 789 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vxlan1 = 'up' | NOT RUN | - | -| 790 | dc2-leaf1a | Logging | VerifyLoggingAccounting | Verifies if AAA accounting logs are generated. | - | NOT RUN | - | -| 791 | dc2-leaf1a | Logging | VerifyLoggingHostname | Verifies if logs are generated with the device FQDN. | - | NOT RUN | - | -| 792 | dc2-leaf1a | Logging | VerifyLoggingHosts | Verifies logging hosts (syslog servers) for a specified VRF. | - | NOT RUN | - | -| 793 | dc2-leaf1a | Logging | VerifyLoggingLogsGeneration | Verifies if logs are generated. | - | NOT RUN | - | -| 794 | dc2-leaf1a | Logging | VerifyLoggingPersistent | Verifies if logging persistent is enabled and logs are saved in flash. | - | NOT RUN | - | -| 795 | dc2-leaf1a | Logging | VerifyLoggingSourceInt | Verifies logging source-interface for a specified VRF. | - | NOT RUN | - | -| 796 | dc2-leaf1a | Logging | VerifyLoggingTimestamp | Verifies if logs are generated with the appropriate timestamp. | - | NOT RUN | - | -| 797 | dc2-leaf1a | Logging | VerifyLoggingWarning | This test verifies there are no syslog messages with a severity of ERRORS or higher. | - | NOT RUN | - | -| 798 | dc2-leaf1a | MLAG | VerifyMlagConfigSanity | Verifies there are no MLAG config-sanity inconsistencies. | - | NOT RUN | - | -| 799 | dc2-leaf1a | MLAG | VerifyMlagDualPrimary | Verifies the MLAG dual-primary detection parameters. | - | NOT RUN | - | -| 800 | dc2-leaf1a | MLAG | VerifyMlagInterfaces | Verifies there are no inactive or active-partial MLAG ports. | - | NOT RUN | - | -| 801 | dc2-leaf1a | MLAG | VerifyMlagReloadDelay | Verifies the MLAG reload-delay parameters. | - | NOT RUN | - | -| 802 | dc2-leaf1a | MLAG | VerifyMlagStatus | Verifies the health status of the MLAG configuration. | - | NOT RUN | - | -| 803 | dc2-leaf1a | MLAG | VerifyMlagStatus | Verifies the health status of the MLAG configuration. | - | NOT RUN | - | -| 804 | dc2-leaf1a | Multicast, IGMP | VerifyIGMPSnoopingGlobal | Verifies the IGMP snooping global configuration. | - | NOT RUN | - | -| 805 | dc2-leaf1a | Multicast, IGMP | VerifyIGMPSnoopingVlans | Verifies the IGMP snooping configuration for some VLANs. | - | NOT RUN | - | -| 806 | dc2-leaf1a | Routing | VerifyRoutingProtocolModel | Verifies the configured routing protocol model. | Routing protocol model: multi-agent | NOT RUN | - | -| 807 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.1 - Peer: dc1-spine1 | NOT RUN | - | -| 808 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.2 - Peer: dc1-spine2 | NOT RUN | - | -| 809 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.3 - Peer: dc1-leaf1a | NOT RUN | - | -| 810 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.4 - Peer: dc1-leaf1b | NOT RUN | - | -| 811 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.5 - Peer: dc1-leaf2a | NOT RUN | - | -| 812 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.3 - Peer: dc1-leaf1a | NOT RUN | - | -| 813 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.5 - Peer: dc1-leaf2a | NOT RUN | - | -| 814 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.11 - Peer: dc2-spine1 | NOT RUN | - | -| 815 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.12 - Peer: dc2-spine2 | NOT RUN | - | -| 816 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.13 - Peer: dc2-leaf1a | NOT RUN | - | -| 817 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.14 - Peer: dc2-leaf1b | NOT RUN | - | -| 818 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.15 - Peer: dc2-leaf2a | NOT RUN | - | -| 819 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.16 - Peer: dc2-leaf2b | NOT RUN | - | -| 820 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | -| 821 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com | NOT RUN | - | -| 822 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.13 - Peer: dc2-leaf1a | NOT RUN | - | -| 823 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.15 - Peer: dc2-leaf2a | NOT RUN | - | -| 824 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | -| 825 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.1 - Peer: dc1-wan1 | NOT RUN | - | -| 826 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.2 - Peer: dc1-wan2 | NOT RUN | - | -| 827 | dc2-leaf1a | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | -| 828 | dc2-leaf1a | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | -| 829 | dc2-leaf1a | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | -| 830 | dc2-leaf1a | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | -| 831 | dc2-leaf1a | Software | VerifyEOSVersion | Verifies the device is running one of the allowed EOS version. | - | NOT RUN | - | -| 832 | dc2-leaf1a | Software | VerifyTerminAttrVersion | Verifies the device is running one of the allowed TerminAttr version. | - | NOT RUN | - | -| 833 | dc2-leaf1a | STP | VerifySTPBlockedPorts | Verifies there is no STP blocked ports. | - | NOT RUN | - | -| 834 | dc2-leaf1a | STP | VerifySTPCounters | Verifies there is no errors in STP BPDU packets. | - | NOT RUN | - | -| 835 | dc2-leaf1a | STP | VerifySTPForwardingPorts | Verifies that all interfaces are forwarding for a provided list of VLAN(s). | - | NOT RUN | - | -| 836 | dc2-leaf1a | STP | VerifySTPMode | Verifies the configured STP mode for a provided list of VLAN(s). | - | NOT RUN | - | -| 837 | dc2-leaf1a | STP | VerifySTPRootPriority | Verifies the STP root priority for a provided list of VLAN or MST instance ID(s). | - | NOT RUN | - | -| 838 | dc2-leaf1a | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | -| 839 | dc2-leaf1a | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | -| 840 | dc2-leaf1a | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | -| 841 | dc2-leaf1a | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | -| 842 | dc2-leaf1a | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | -| 843 | dc2-leaf1a | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 844 | dc2-leaf1a | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 845 | dc2-leaf1a | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | -| 846 | dc2-leaf1a | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | -| 847 | dc2-leaf1b | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | -| 848 | dc2-leaf1b | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | -| 849 | dc2-leaf1b | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | -| 850 | dc2-leaf1b | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | -| 851 | dc2-leaf1b | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | -| 852 | dc2-leaf1b | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | -| 853 | dc2-leaf1b | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | -| 854 | dc2-leaf1b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-spine1 (IP: 10.255.128.11) | NOT RUN | - | -| 855 | dc2-leaf1b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-spine2 (IP: 10.255.128.12) | NOT RUN | - | -| 856 | dc2-leaf1b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf1a (IP: 10.255.129.116) | NOT RUN | - | -| 857 | dc2-leaf1b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-spine1 (IP: 10.255.255.108) | NOT RUN | - | -| 858 | dc2-leaf1b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-spine2 (IP: 10.255.255.110) | NOT RUN | - | -| 859 | dc2-leaf1b | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | -| 860 | dc2-leaf1b | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | -| 861 | dc2-leaf1b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc2-spine1 Ethernet2 | NOT RUN | - | -| 862 | dc2-leaf1b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc2-spine2 Ethernet2 | NOT RUN | - | -| 863 | dc2-leaf1b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet3 - Remote: dc2-leaf1a Ethernet3 | NOT RUN | - | -| 864 | dc2-leaf1b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet4 - Remote: dc2-leaf1a Ethernet4 | NOT RUN | - | -| 865 | dc2-leaf1b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet8 - Remote: dc2-leaf1c Ethernet2 | NOT RUN | - | -| 866 | dc2-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3) | NOT RUN | - | -| 867 | dc2-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4) | NOT RUN | - | -| 868 | dc2-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5) | NOT RUN | - | -| 869 | dc2-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1) | NOT RUN | - | -| 870 | dc2-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2) | NOT RUN | - | -| 871 | dc2-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1) | NOT RUN | - | -| 872 | dc2-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2) | NOT RUN | - | -| 873 | dc2-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.14) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13) | NOT RUN | - | -| 874 | dc2-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.14) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14) | NOT RUN | - | -| 875 | dc2-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.14) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15) | NOT RUN | - | -| 876 | dc2-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.14) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16) | NOT RUN | - | -| 877 | dc2-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.14) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17) | NOT RUN | - | -| 878 | dc2-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.14) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18) | NOT RUN | - | -| 879 | dc2-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.14) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11) | NOT RUN | - | -| 880 | dc2-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.14) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12) | NOT RUN | - | -| 881 | dc2-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet1 (IP: 10.255.255.109) - Destination: dc2-spine1 Ethernet2 (IP: 10.255.255.108) | NOT RUN | - | -| 882 | dc2-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet2 (IP: 10.255.255.111) - Destination: dc2-spine2 Ethernet2 (IP: 10.255.255.110) | NOT RUN | - | -| 883 | dc2-leaf1b | Field Notices, Software | VerifyFieldNotice44Resolution | Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization) | - | NOT RUN | - | -| 884 | dc2-leaf1b | Field Notices, Software | VerifyFieldNotice72Resolution | Verifies if the device has exposeure to FN72, and if the issue has been mitigated | - | NOT RUN | - | -| 885 | dc2-leaf1b | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS7280E and DCS7500E | - | NOT RUN | - | -| 886 | dc2-leaf1b | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | -| 887 | dc2-leaf1b | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | -| 888 | dc2-leaf1b | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | -| 889 | dc2-leaf1b | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | -| 890 | dc2-leaf1b | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | -| 891 | dc2-leaf1b | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 892 | dc2-leaf1b | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 893 | dc2-leaf1b | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | -| 894 | dc2-leaf1b | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | -| 895 | dc2-leaf1b | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | -| 896 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - P2P_LINK_TO_DC2-SPINE1_Ethernet2 = 'up' | NOT RUN | - | -| 897 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - P2P_LINK_TO_DC2-SPINE2_Ethernet2 = 'up' | NOT RUN | - | -| 898 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet3 - MLAG_PEER_dc2-leaf1a_Ethernet3 = 'up' | NOT RUN | - | -| 899 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet4 - MLAG_PEER_dc2-leaf1a_Ethernet4 = 'up' | NOT RUN | - | -| 900 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet5 - dc2-leaf1-server1_PCI2 = 'up' | NOT RUN | - | -| 901 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet8 - DC2-LEAF1C_Ethernet2 = 'up' | NOT RUN | - | -| 902 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback0 - EVPN_Overlay_Peering = 'up' | NOT RUN | - | -| 903 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up' | NOT RUN | - | -| 904 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback10 - VRF10_VTEP_DIAGNOSTICS = 'up' | NOT RUN | - | -| 905 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback11 - VRF11_VTEP_DIAGNOSTICS = 'up' | NOT RUN | - | -| 906 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel3 - MLAG_PEER_dc2-leaf1a_Po3 = 'up' | NOT RUN | - | -| 907 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel5 - dc2-leaf1-server1_PortChannel dc2-leaf1-server1 = 'up' | NOT RUN | - | -| 908 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel8 - DC2-LEAF1C_Po1 = 'up' | NOT RUN | - | -| 909 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan11 - VRF10_VLAN11 = 'up' | NOT RUN | - | -| 910 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan12 - VRF10_VLAN12 = 'up' | NOT RUN | - | -| 911 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan21 - VRF11_VLAN21 = 'up' | NOT RUN | - | -| 912 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan22 - VRF11_VLAN22 = 'up' | NOT RUN | - | -| 913 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan3009 - MLAG_PEER_L3_iBGP: vrf VRF10 = 'up' | NOT RUN | - | -| 914 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan3010 - MLAG_PEER_L3_iBGP: vrf VRF11 = 'up' | NOT RUN | - | -| 915 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up' | NOT RUN | - | -| 916 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4094 - MLAG_PEER = 'up' | NOT RUN | - | -| 917 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vxlan1 = 'up' | NOT RUN | - | -| 918 | dc2-leaf1b | Logging | VerifyLoggingAccounting | Verifies if AAA accounting logs are generated. | - | NOT RUN | - | -| 919 | dc2-leaf1b | Logging | VerifyLoggingHostname | Verifies if logs are generated with the device FQDN. | - | NOT RUN | - | -| 920 | dc2-leaf1b | Logging | VerifyLoggingHosts | Verifies logging hosts (syslog servers) for a specified VRF. | - | NOT RUN | - | -| 921 | dc2-leaf1b | Logging | VerifyLoggingLogsGeneration | Verifies if logs are generated. | - | NOT RUN | - | -| 922 | dc2-leaf1b | Logging | VerifyLoggingPersistent | Verifies if logging persistent is enabled and logs are saved in flash. | - | NOT RUN | - | -| 923 | dc2-leaf1b | Logging | VerifyLoggingSourceInt | Verifies logging source-interface for a specified VRF. | - | NOT RUN | - | -| 924 | dc2-leaf1b | Logging | VerifyLoggingTimestamp | Verifies if logs are generated with the appropriate timestamp. | - | NOT RUN | - | -| 925 | dc2-leaf1b | Logging | VerifyLoggingWarning | This test verifies there are no syslog messages with a severity of ERRORS or higher. | - | NOT RUN | - | -| 926 | dc2-leaf1b | MLAG | VerifyMlagConfigSanity | Verifies there are no MLAG config-sanity inconsistencies. | - | NOT RUN | - | -| 927 | dc2-leaf1b | MLAG | VerifyMlagDualPrimary | Verifies the MLAG dual-primary detection parameters. | - | NOT RUN | - | -| 928 | dc2-leaf1b | MLAG | VerifyMlagInterfaces | Verifies there are no inactive or active-partial MLAG ports. | - | NOT RUN | - | -| 929 | dc2-leaf1b | MLAG | VerifyMlagReloadDelay | Verifies the MLAG reload-delay parameters. | - | NOT RUN | - | -| 930 | dc2-leaf1b | MLAG | VerifyMlagStatus | Verifies the health status of the MLAG configuration. | - | NOT RUN | - | -| 931 | dc2-leaf1b | MLAG | VerifyMlagStatus | Verifies the health status of the MLAG configuration. | - | NOT RUN | - | -| 932 | dc2-leaf1b | Multicast, IGMP | VerifyIGMPSnoopingGlobal | Verifies the IGMP snooping global configuration. | - | NOT RUN | - | -| 933 | dc2-leaf1b | Multicast, IGMP | VerifyIGMPSnoopingVlans | Verifies the IGMP snooping configuration for some VLANs. | - | NOT RUN | - | -| 934 | dc2-leaf1b | Routing | VerifyRoutingProtocolModel | Verifies the configured routing protocol model. | Routing protocol model: multi-agent | NOT RUN | - | -| 935 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.1 - Peer: dc1-spine1 | NOT RUN | - | -| 936 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.2 - Peer: dc1-spine2 | NOT RUN | - | -| 937 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.3 - Peer: dc1-leaf1a | NOT RUN | - | -| 938 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.4 - Peer: dc1-leaf1b | NOT RUN | - | -| 939 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.5 - Peer: dc1-leaf2a | NOT RUN | - | -| 940 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.3 - Peer: dc1-leaf1a | NOT RUN | - | -| 941 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.5 - Peer: dc1-leaf2a | NOT RUN | - | -| 942 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.11 - Peer: dc2-spine1 | NOT RUN | - | -| 943 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.12 - Peer: dc2-spine2 | NOT RUN | - | -| 944 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.13 - Peer: dc2-leaf1a | NOT RUN | - | -| 945 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.14 - Peer: dc2-leaf1b | NOT RUN | - | -| 946 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.15 - Peer: dc2-leaf2a | NOT RUN | - | -| 947 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.16 - Peer: dc2-leaf2b | NOT RUN | - | -| 948 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | -| 949 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com | NOT RUN | - | -| 950 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.13 - Peer: dc2-leaf1a | NOT RUN | - | -| 951 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.15 - Peer: dc2-leaf2a | NOT RUN | - | -| 952 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | -| 953 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.1 - Peer: dc1-wan1 | NOT RUN | - | -| 954 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.2 - Peer: dc1-wan2 | NOT RUN | - | -| 955 | dc2-leaf1b | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | -| 956 | dc2-leaf1b | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | -| 957 | dc2-leaf1b | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | -| 958 | dc2-leaf1b | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | -| 959 | dc2-leaf1b | Software | VerifyEOSVersion | Verifies the device is running one of the allowed EOS version. | - | NOT RUN | - | -| 960 | dc2-leaf1b | Software | VerifyTerminAttrVersion | Verifies the device is running one of the allowed TerminAttr version. | - | NOT RUN | - | -| 961 | dc2-leaf1b | STP | VerifySTPBlockedPorts | Verifies there is no STP blocked ports. | - | NOT RUN | - | -| 962 | dc2-leaf1b | STP | VerifySTPCounters | Verifies there is no errors in STP BPDU packets. | - | NOT RUN | - | -| 963 | dc2-leaf1b | STP | VerifySTPForwardingPorts | Verifies that all interfaces are forwarding for a provided list of VLAN(s). | - | NOT RUN | - | -| 964 | dc2-leaf1b | STP | VerifySTPMode | Verifies the configured STP mode for a provided list of VLAN(s). | - | NOT RUN | - | -| 965 | dc2-leaf1b | STP | VerifySTPRootPriority | Verifies the STP root priority for a provided list of VLAN or MST instance ID(s). | - | NOT RUN | - | -| 966 | dc2-leaf1b | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | -| 967 | dc2-leaf1b | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | -| 968 | dc2-leaf1b | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | -| 969 | dc2-leaf1b | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | -| 970 | dc2-leaf1b | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | -| 971 | dc2-leaf1b | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 972 | dc2-leaf1b | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 973 | dc2-leaf1b | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | -| 974 | dc2-leaf1b | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | -| 975 | dc2-leaf1c | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | -| 976 | dc2-leaf1c | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | -| 977 | dc2-leaf1c | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | -| 978 | dc2-leaf1c | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | -| 979 | dc2-leaf1c | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | -| 980 | dc2-leaf1c | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | -| 981 | dc2-leaf1c | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | -| 982 | dc2-leaf1c | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | -| 983 | dc2-leaf1c | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | -| 984 | dc2-leaf1c | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc2-leaf1a Ethernet8 | NOT RUN | - | -| 985 | dc2-leaf1c | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc2-leaf1b Ethernet8 | NOT RUN | - | -| 986 | dc2-leaf1c | Field Notices, Software | VerifyFieldNotice44Resolution | Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization) | - | NOT RUN | - | -| 987 | dc2-leaf1c | Field Notices, Software | VerifyFieldNotice72Resolution | Verifies if the device has exposeure to FN72, and if the issue has been mitigated | - | NOT RUN | - | -| 988 | dc2-leaf1c | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS7280E and DCS7500E | - | NOT RUN | - | -| 989 | dc2-leaf1c | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | -| 990 | dc2-leaf1c | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | -| 991 | dc2-leaf1c | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | -| 992 | dc2-leaf1c | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | -| 993 | dc2-leaf1c | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | -| 994 | dc2-leaf1c | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 995 | dc2-leaf1c | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 996 | dc2-leaf1c | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | -| 997 | dc2-leaf1c | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | -| 998 | dc2-leaf1c | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | -| 999 | dc2-leaf1c | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - DC2-LEAF1A_Ethernet8 = 'up' | NOT RUN | - | -| 1000 | dc2-leaf1c | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - DC2-LEAF1B_Ethernet8 = 'up' | NOT RUN | - | -| 1001 | dc2-leaf1c | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet5 - dc2-leaf1-server1_iLO = 'up' | NOT RUN | - | -| 1002 | dc2-leaf1c | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel1 - DC2_L3_LEAF1_Po8 = 'up' | NOT RUN | - | -| 1003 | dc2-leaf1c | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | -| 1004 | dc2-leaf1c | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | -| 1005 | dc2-leaf1c | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | -| 1006 | dc2-leaf1c | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | -| 1007 | dc2-leaf1c | Software | VerifyEOSVersion | Verifies the device is running one of the allowed EOS version. | - | NOT RUN | - | -| 1008 | dc2-leaf1c | Software | VerifyTerminAttrVersion | Verifies the device is running one of the allowed TerminAttr version. | - | NOT RUN | - | -| 1009 | dc2-leaf1c | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | -| 1010 | dc2-leaf1c | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | -| 1011 | dc2-leaf1c | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | -| 1012 | dc2-leaf1c | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | -| 1013 | dc2-leaf1c | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | -| 1014 | dc2-leaf1c | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 1015 | dc2-leaf1c | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 1016 | dc2-leaf1c | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | -| 1017 | dc2-leaf1c | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | -| 1018 | dc2-leaf2a | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | -| 1019 | dc2-leaf2a | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | -| 1020 | dc2-leaf2a | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | -| 1021 | dc2-leaf2a | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | -| 1022 | dc2-leaf2a | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | -| 1023 | dc2-leaf2a | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | -| 1024 | dc2-leaf2a | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | -| 1025 | dc2-leaf2a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc1-leaf2a (IP: 10.255.0.5) | NOT RUN | - | -| 1026 | dc2-leaf2a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-spine1 (IP: 10.255.128.11) | NOT RUN | - | -| 1027 | dc2-leaf2a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-spine2 (IP: 10.255.128.12) | NOT RUN | - | -| 1028 | dc2-leaf2a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-leaf2a (IP: 192.168.100.0) | NOT RUN | - | -| 1029 | dc2-leaf2a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf2b (IP: 10.255.129.121) | NOT RUN | - | -| 1030 | dc2-leaf2a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-spine1 (IP: 10.255.255.112) | NOT RUN | - | -| 1031 | dc2-leaf2a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-spine2 (IP: 10.255.255.114) | NOT RUN | - | -| 1032 | dc2-leaf2a | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | -| 1033 | dc2-leaf2a | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | -| 1034 | dc2-leaf2a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc2-spine1 Ethernet3 | NOT RUN | - | -| 1035 | dc2-leaf2a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc2-spine2 Ethernet3 | NOT RUN | - | -| 1036 | dc2-leaf2a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet3 - Remote: dc2-leaf2b Ethernet3 | NOT RUN | - | -| 1037 | dc2-leaf2a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet4 - Remote: dc2-leaf2b Ethernet4 | NOT RUN | - | -| 1038 | dc2-leaf2a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet6 - Remote: dc1-leaf2a Ethernet6 | NOT RUN | - | -| 1039 | dc2-leaf2a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet8 - Remote: dc2-leaf2c Ethernet1 | NOT RUN | - | -| 1040 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3) | NOT RUN | - | -| 1041 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4) | NOT RUN | - | -| 1042 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5) | NOT RUN | - | -| 1043 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1) | NOT RUN | - | -| 1044 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2) | NOT RUN | - | -| 1045 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1) | NOT RUN | - | -| 1046 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2) | NOT RUN | - | -| 1047 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.15) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13) | NOT RUN | - | -| 1048 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.15) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14) | NOT RUN | - | -| 1049 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.15) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15) | NOT RUN | - | -| 1050 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.15) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16) | NOT RUN | - | -| 1051 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.15) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17) | NOT RUN | - | -| 1052 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.15) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18) | NOT RUN | - | -| 1053 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.15) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11) | NOT RUN | - | -| 1054 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.15) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12) | NOT RUN | - | -| 1055 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet1 (IP: 10.255.255.113) - Destination: dc2-spine1 Ethernet3 (IP: 10.255.255.112) | NOT RUN | - | -| 1056 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet2 (IP: 10.255.255.115) - Destination: dc2-spine2 Ethernet3 (IP: 10.255.255.114) | NOT RUN | - | -| 1057 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet6 (IP: 192.168.100.1) - Destination: dc1-leaf2a Ethernet6 (IP: 192.168.100.0) | NOT RUN | - | -| 1058 | dc2-leaf2a | Field Notices, Software | VerifyFieldNotice44Resolution | Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization) | - | NOT RUN | - | -| 1059 | dc2-leaf2a | Field Notices, Software | VerifyFieldNotice72Resolution | Verifies if the device has exposeure to FN72, and if the issue has been mitigated | - | NOT RUN | - | -| 1060 | dc2-leaf2a | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS7280E and DCS7500E | - | NOT RUN | - | -| 1061 | dc2-leaf2a | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | -| 1062 | dc2-leaf2a | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | -| 1063 | dc2-leaf2a | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | -| 1064 | dc2-leaf2a | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | -| 1065 | dc2-leaf2a | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | -| 1066 | dc2-leaf2a | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 1067 | dc2-leaf2a | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 1068 | dc2-leaf2a | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | -| 1069 | dc2-leaf2a | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | -| 1070 | dc2-leaf2a | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | -| 1071 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - P2P_LINK_TO_DC2-SPINE1_Ethernet3 = 'up' | NOT RUN | - | -| 1072 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - P2P_LINK_TO_DC2-SPINE2_Ethernet3 = 'up' | NOT RUN | - | -| 1073 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet3 - MLAG_PEER_dc2-leaf2b_Ethernet3 = 'up' | NOT RUN | - | -| 1074 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet4 - MLAG_PEER_dc2-leaf2b_Ethernet4 = 'up' | NOT RUN | - | -| 1075 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet5 - dc2-leaf2-server1_PCI1 = 'up' | NOT RUN | - | -| 1076 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet6 - P2P_LINK_TO_dc1-leaf2a_Ethernet6 = 'up' | NOT RUN | - | -| 1077 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet8 - DC2-LEAF2C_Ethernet1 = 'up' | NOT RUN | - | -| 1078 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback0 - EVPN_Overlay_Peering = 'up' | NOT RUN | - | -| 1079 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up' | NOT RUN | - | -| 1080 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback10 - VRF10_VTEP_DIAGNOSTICS = 'up' | NOT RUN | - | -| 1081 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback11 - VRF11_VTEP_DIAGNOSTICS = 'up' | NOT RUN | - | -| 1082 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel3 - MLAG_PEER_dc2-leaf2b_Po3 = 'up' | NOT RUN | - | -| 1083 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel5 - dc2-leaf2-server1_PortChannel dc2-leaf2-server1 = 'up' | NOT RUN | - | -| 1084 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel8 - DC2-LEAF2C_Po1 = 'up' | NOT RUN | - | -| 1085 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan11 - VRF10_VLAN11 = 'up' | NOT RUN | - | -| 1086 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan12 - VRF10_VLAN12 = 'up' | NOT RUN | - | -| 1087 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan21 - VRF11_VLAN21 = 'up' | NOT RUN | - | -| 1088 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan22 - VRF11_VLAN22 = 'up' | NOT RUN | - | -| 1089 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan3009 - MLAG_PEER_L3_iBGP: vrf VRF10 = 'up' | NOT RUN | - | -| 1090 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan3010 - MLAG_PEER_L3_iBGP: vrf VRF11 = 'up' | NOT RUN | - | -| 1091 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up' | NOT RUN | - | -| 1092 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4094 - MLAG_PEER = 'up' | NOT RUN | - | -| 1093 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vxlan1 = 'up' | NOT RUN | - | -| 1094 | dc2-leaf2a | Logging | VerifyLoggingAccounting | Verifies if AAA accounting logs are generated. | - | NOT RUN | - | -| 1095 | dc2-leaf2a | Logging | VerifyLoggingHostname | Verifies if logs are generated with the device FQDN. | - | NOT RUN | - | -| 1096 | dc2-leaf2a | Logging | VerifyLoggingHosts | Verifies logging hosts (syslog servers) for a specified VRF. | - | NOT RUN | - | -| 1097 | dc2-leaf2a | Logging | VerifyLoggingLogsGeneration | Verifies if logs are generated. | - | NOT RUN | - | -| 1098 | dc2-leaf2a | Logging | VerifyLoggingPersistent | Verifies if logging persistent is enabled and logs are saved in flash. | - | NOT RUN | - | -| 1099 | dc2-leaf2a | Logging | VerifyLoggingSourceInt | Verifies logging source-interface for a specified VRF. | - | NOT RUN | - | -| 1100 | dc2-leaf2a | Logging | VerifyLoggingTimestamp | Verifies if logs are generated with the appropriate timestamp. | - | NOT RUN | - | -| 1101 | dc2-leaf2a | Logging | VerifyLoggingWarning | This test verifies there are no syslog messages with a severity of ERRORS or higher. | - | NOT RUN | - | -| 1102 | dc2-leaf2a | MLAG | VerifyMlagConfigSanity | Verifies there are no MLAG config-sanity inconsistencies. | - | NOT RUN | - | -| 1103 | dc2-leaf2a | MLAG | VerifyMlagDualPrimary | Verifies the MLAG dual-primary detection parameters. | - | NOT RUN | - | -| 1104 | dc2-leaf2a | MLAG | VerifyMlagInterfaces | Verifies there are no inactive or active-partial MLAG ports. | - | NOT RUN | - | -| 1105 | dc2-leaf2a | MLAG | VerifyMlagReloadDelay | Verifies the MLAG reload-delay parameters. | - | NOT RUN | - | -| 1106 | dc2-leaf2a | MLAG | VerifyMlagStatus | Verifies the health status of the MLAG configuration. | - | NOT RUN | - | -| 1107 | dc2-leaf2a | MLAG | VerifyMlagStatus | Verifies the health status of the MLAG configuration. | - | NOT RUN | - | -| 1108 | dc2-leaf2a | Multicast, IGMP | VerifyIGMPSnoopingGlobal | Verifies the IGMP snooping global configuration. | - | NOT RUN | - | -| 1109 | dc2-leaf2a | Multicast, IGMP | VerifyIGMPSnoopingVlans | Verifies the IGMP snooping configuration for some VLANs. | - | NOT RUN | - | -| 1110 | dc2-leaf2a | Routing | VerifyRoutingProtocolModel | Verifies the configured routing protocol model. | Routing protocol model: multi-agent | NOT RUN | - | -| 1111 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.1 - Peer: dc1-spine1 | NOT RUN | - | -| 1112 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.2 - Peer: dc1-spine2 | NOT RUN | - | -| 1113 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.3 - Peer: dc1-leaf1a | NOT RUN | - | -| 1114 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.4 - Peer: dc1-leaf1b | NOT RUN | - | -| 1115 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.5 - Peer: dc1-leaf2a | NOT RUN | - | -| 1116 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.3 - Peer: dc1-leaf1a | NOT RUN | - | -| 1117 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.5 - Peer: dc1-leaf2a | NOT RUN | - | -| 1118 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.11 - Peer: dc2-spine1 | NOT RUN | - | -| 1119 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.12 - Peer: dc2-spine2 | NOT RUN | - | -| 1120 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.13 - Peer: dc2-leaf1a | NOT RUN | - | -| 1121 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.14 - Peer: dc2-leaf1b | NOT RUN | - | -| 1122 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.15 - Peer: dc2-leaf2a | NOT RUN | - | -| 1123 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.16 - Peer: dc2-leaf2b | NOT RUN | - | -| 1124 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | -| 1125 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com | NOT RUN | - | -| 1126 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.13 - Peer: dc2-leaf1a | NOT RUN | - | -| 1127 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.15 - Peer: dc2-leaf2a | NOT RUN | - | -| 1128 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | -| 1129 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.1 - Peer: dc1-wan1 | NOT RUN | - | -| 1130 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.2 - Peer: dc1-wan2 | NOT RUN | - | -| 1131 | dc2-leaf2a | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | -| 1132 | dc2-leaf2a | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | -| 1133 | dc2-leaf2a | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | -| 1134 | dc2-leaf2a | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | -| 1135 | dc2-leaf2a | Software | VerifyEOSVersion | Verifies the device is running one of the allowed EOS version. | - | NOT RUN | - | -| 1136 | dc2-leaf2a | Software | VerifyTerminAttrVersion | Verifies the device is running one of the allowed TerminAttr version. | - | NOT RUN | - | -| 1137 | dc2-leaf2a | STP | VerifySTPBlockedPorts | Verifies there is no STP blocked ports. | - | NOT RUN | - | -| 1138 | dc2-leaf2a | STP | VerifySTPCounters | Verifies there is no errors in STP BPDU packets. | - | NOT RUN | - | -| 1139 | dc2-leaf2a | STP | VerifySTPForwardingPorts | Verifies that all interfaces are forwarding for a provided list of VLAN(s). | - | NOT RUN | - | -| 1140 | dc2-leaf2a | STP | VerifySTPMode | Verifies the configured STP mode for a provided list of VLAN(s). | - | NOT RUN | - | -| 1141 | dc2-leaf2a | STP | VerifySTPRootPriority | Verifies the STP root priority for a provided list of VLAN or MST instance ID(s). | - | NOT RUN | - | -| 1142 | dc2-leaf2a | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | -| 1143 | dc2-leaf2a | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | -| 1144 | dc2-leaf2a | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | -| 1145 | dc2-leaf2a | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | -| 1146 | dc2-leaf2a | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | -| 1147 | dc2-leaf2a | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 1148 | dc2-leaf2a | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 1149 | dc2-leaf2a | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | -| 1150 | dc2-leaf2a | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | -| 1151 | dc2-leaf2b | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | -| 1152 | dc2-leaf2b | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | -| 1153 | dc2-leaf2b | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | -| 1154 | dc2-leaf2b | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | -| 1155 | dc2-leaf2b | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | -| 1156 | dc2-leaf2b | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | -| 1157 | dc2-leaf2b | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | -| 1158 | dc2-leaf2b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-spine1 (IP: 10.255.128.11) | NOT RUN | - | -| 1159 | dc2-leaf2b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-spine2 (IP: 10.255.128.12) | NOT RUN | - | -| 1160 | dc2-leaf2b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf2a (IP: 10.255.129.120) | NOT RUN | - | -| 1161 | dc2-leaf2b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-spine1 (IP: 10.255.255.116) | NOT RUN | - | -| 1162 | dc2-leaf2b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-spine2 (IP: 10.255.255.118) | NOT RUN | - | -| 1163 | dc2-leaf2b | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | -| 1164 | dc2-leaf2b | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | -| 1165 | dc2-leaf2b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc2-spine1 Ethernet4 | NOT RUN | - | -| 1166 | dc2-leaf2b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc2-spine2 Ethernet4 | NOT RUN | - | -| 1167 | dc2-leaf2b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet3 - Remote: dc2-leaf2a Ethernet3 | NOT RUN | - | -| 1168 | dc2-leaf2b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet4 - Remote: dc2-leaf2a Ethernet4 | NOT RUN | - | -| 1169 | dc2-leaf2b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet8 - Remote: dc2-leaf2c Ethernet2 | NOT RUN | - | -| 1170 | dc2-leaf2b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3) | NOT RUN | - | -| 1171 | dc2-leaf2b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4) | NOT RUN | - | -| 1172 | dc2-leaf2b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5) | NOT RUN | - | -| 1173 | dc2-leaf2b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1) | NOT RUN | - | -| 1174 | dc2-leaf2b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2) | NOT RUN | - | -| 1175 | dc2-leaf2b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1) | NOT RUN | - | -| 1176 | dc2-leaf2b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2) | NOT RUN | - | -| 1177 | dc2-leaf2b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.16) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13) | NOT RUN | - | -| 1178 | dc2-leaf2b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.16) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14) | NOT RUN | - | -| 1179 | dc2-leaf2b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.16) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15) | NOT RUN | - | -| 1180 | dc2-leaf2b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.16) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16) | NOT RUN | - | -| 1181 | dc2-leaf2b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.16) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17) | NOT RUN | - | -| 1182 | dc2-leaf2b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.16) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18) | NOT RUN | - | -| 1183 | dc2-leaf2b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.16) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11) | NOT RUN | - | -| 1184 | dc2-leaf2b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.16) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12) | NOT RUN | - | -| 1185 | dc2-leaf2b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet1 (IP: 10.255.255.117) - Destination: dc2-spine1 Ethernet4 (IP: 10.255.255.116) | NOT RUN | - | -| 1186 | dc2-leaf2b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet2 (IP: 10.255.255.119) - Destination: dc2-spine2 Ethernet4 (IP: 10.255.255.118) | NOT RUN | - | -| 1187 | dc2-leaf2b | Field Notices, Software | VerifyFieldNotice44Resolution | Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization) | - | NOT RUN | - | -| 1188 | dc2-leaf2b | Field Notices, Software | VerifyFieldNotice72Resolution | Verifies if the device has exposeure to FN72, and if the issue has been mitigated | - | NOT RUN | - | -| 1189 | dc2-leaf2b | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS7280E and DCS7500E | - | NOT RUN | - | -| 1190 | dc2-leaf2b | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | -| 1191 | dc2-leaf2b | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | -| 1192 | dc2-leaf2b | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | -| 1193 | dc2-leaf2b | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | -| 1194 | dc2-leaf2b | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | -| 1195 | dc2-leaf2b | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 1196 | dc2-leaf2b | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 1197 | dc2-leaf2b | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | -| 1198 | dc2-leaf2b | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | -| 1199 | dc2-leaf2b | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | -| 1200 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - P2P_LINK_TO_DC2-SPINE1_Ethernet4 = 'up' | NOT RUN | - | -| 1201 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - P2P_LINK_TO_DC2-SPINE2_Ethernet4 = 'up' | NOT RUN | - | -| 1202 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet3 - MLAG_PEER_dc2-leaf2a_Ethernet3 = 'up' | NOT RUN | - | -| 1203 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet4 - MLAG_PEER_dc2-leaf2a_Ethernet4 = 'up' | NOT RUN | - | -| 1204 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet5 - dc2-leaf2-server1_PCI2 = 'up' | NOT RUN | - | -| 1205 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet6 - P2P_LINK_TO_dc1-leaf2b_Ethernet6 = 'up' | NOT RUN | - | -| 1206 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet8 - DC2-LEAF2C_Ethernet2 = 'up' | NOT RUN | - | -| 1207 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback0 - EVPN_Overlay_Peering = 'up' | NOT RUN | - | -| 1208 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up' | NOT RUN | - | -| 1209 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback10 - VRF10_VTEP_DIAGNOSTICS = 'up' | NOT RUN | - | -| 1210 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback11 - VRF11_VTEP_DIAGNOSTICS = 'up' | NOT RUN | - | -| 1211 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel3 - MLAG_PEER_dc2-leaf2a_Po3 = 'up' | NOT RUN | - | -| 1212 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel5 - dc2-leaf2-server1_PortChannel dc2-leaf2-server1 = 'up' | NOT RUN | - | -| 1213 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel8 - DC2-LEAF2C_Po1 = 'up' | NOT RUN | - | -| 1214 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan11 - VRF10_VLAN11 = 'up' | NOT RUN | - | -| 1215 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan12 - VRF10_VLAN12 = 'up' | NOT RUN | - | -| 1216 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan21 - VRF11_VLAN21 = 'up' | NOT RUN | - | -| 1217 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan22 - VRF11_VLAN22 = 'up' | NOT RUN | - | -| 1218 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan3009 - MLAG_PEER_L3_iBGP: vrf VRF10 = 'up' | NOT RUN | - | -| 1219 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan3010 - MLAG_PEER_L3_iBGP: vrf VRF11 = 'up' | NOT RUN | - | -| 1220 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up' | NOT RUN | - | -| 1221 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4094 - MLAG_PEER = 'up' | NOT RUN | - | -| 1222 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vxlan1 = 'up' | NOT RUN | - | -| 1223 | dc2-leaf2b | Logging | VerifyLoggingAccounting | Verifies if AAA accounting logs are generated. | - | NOT RUN | - | -| 1224 | dc2-leaf2b | Logging | VerifyLoggingHostname | Verifies if logs are generated with the device FQDN. | - | NOT RUN | - | -| 1225 | dc2-leaf2b | Logging | VerifyLoggingHosts | Verifies logging hosts (syslog servers) for a specified VRF. | - | NOT RUN | - | -| 1226 | dc2-leaf2b | Logging | VerifyLoggingLogsGeneration | Verifies if logs are generated. | - | NOT RUN | - | -| 1227 | dc2-leaf2b | Logging | VerifyLoggingPersistent | Verifies if logging persistent is enabled and logs are saved in flash. | - | NOT RUN | - | -| 1228 | dc2-leaf2b | Logging | VerifyLoggingSourceInt | Verifies logging source-interface for a specified VRF. | - | NOT RUN | - | -| 1229 | dc2-leaf2b | Logging | VerifyLoggingTimestamp | Verifies if logs are generated with the appropriate timestamp. | - | NOT RUN | - | -| 1230 | dc2-leaf2b | Logging | VerifyLoggingWarning | This test verifies there are no syslog messages with a severity of ERRORS or higher. | - | NOT RUN | - | -| 1231 | dc2-leaf2b | MLAG | VerifyMlagConfigSanity | Verifies there are no MLAG config-sanity inconsistencies. | - | NOT RUN | - | -| 1232 | dc2-leaf2b | MLAG | VerifyMlagDualPrimary | Verifies the MLAG dual-primary detection parameters. | - | NOT RUN | - | -| 1233 | dc2-leaf2b | MLAG | VerifyMlagInterfaces | Verifies there are no inactive or active-partial MLAG ports. | - | NOT RUN | - | -| 1234 | dc2-leaf2b | MLAG | VerifyMlagReloadDelay | Verifies the MLAG reload-delay parameters. | - | NOT RUN | - | -| 1235 | dc2-leaf2b | MLAG | VerifyMlagStatus | Verifies the health status of the MLAG configuration. | - | NOT RUN | - | -| 1236 | dc2-leaf2b | MLAG | VerifyMlagStatus | Verifies the health status of the MLAG configuration. | - | NOT RUN | - | -| 1237 | dc2-leaf2b | Multicast, IGMP | VerifyIGMPSnoopingGlobal | Verifies the IGMP snooping global configuration. | - | NOT RUN | - | -| 1238 | dc2-leaf2b | Multicast, IGMP | VerifyIGMPSnoopingVlans | Verifies the IGMP snooping configuration for some VLANs. | - | NOT RUN | - | -| 1239 | dc2-leaf2b | Routing | VerifyRoutingProtocolModel | Verifies the configured routing protocol model. | Routing protocol model: multi-agent | NOT RUN | - | -| 1240 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.1 - Peer: dc1-spine1 | NOT RUN | - | -| 1241 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.2 - Peer: dc1-spine2 | NOT RUN | - | -| 1242 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.3 - Peer: dc1-leaf1a | NOT RUN | - | -| 1243 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.4 - Peer: dc1-leaf1b | NOT RUN | - | -| 1244 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.5 - Peer: dc1-leaf2a | NOT RUN | - | -| 1245 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.3 - Peer: dc1-leaf1a | NOT RUN | - | -| 1246 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.5 - Peer: dc1-leaf2a | NOT RUN | - | -| 1247 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.11 - Peer: dc2-spine1 | NOT RUN | - | -| 1248 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.12 - Peer: dc2-spine2 | NOT RUN | - | -| 1249 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.13 - Peer: dc2-leaf1a | NOT RUN | - | -| 1250 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.14 - Peer: dc2-leaf1b | NOT RUN | - | -| 1251 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.15 - Peer: dc2-leaf2a | NOT RUN | - | -| 1252 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.16 - Peer: dc2-leaf2b | NOT RUN | - | -| 1253 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | -| 1254 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com | NOT RUN | - | -| 1255 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.13 - Peer: dc2-leaf1a | NOT RUN | - | -| 1256 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.15 - Peer: dc2-leaf2a | NOT RUN | - | -| 1257 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | -| 1258 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.1 - Peer: dc1-wan1 | NOT RUN | - | -| 1259 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.2 - Peer: dc1-wan2 | NOT RUN | - | -| 1260 | dc2-leaf2b | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | -| 1261 | dc2-leaf2b | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | -| 1262 | dc2-leaf2b | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | -| 1263 | dc2-leaf2b | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | -| 1264 | dc2-leaf2b | Software | VerifyEOSVersion | Verifies the device is running one of the allowed EOS version. | - | NOT RUN | - | -| 1265 | dc2-leaf2b | Software | VerifyTerminAttrVersion | Verifies the device is running one of the allowed TerminAttr version. | - | NOT RUN | - | -| 1266 | dc2-leaf2b | STP | VerifySTPBlockedPorts | Verifies there is no STP blocked ports. | - | NOT RUN | - | -| 1267 | dc2-leaf2b | STP | VerifySTPCounters | Verifies there is no errors in STP BPDU packets. | - | NOT RUN | - | -| 1268 | dc2-leaf2b | STP | VerifySTPForwardingPorts | Verifies that all interfaces are forwarding for a provided list of VLAN(s). | - | NOT RUN | - | -| 1269 | dc2-leaf2b | STP | VerifySTPMode | Verifies the configured STP mode for a provided list of VLAN(s). | - | NOT RUN | - | -| 1270 | dc2-leaf2b | STP | VerifySTPRootPriority | Verifies the STP root priority for a provided list of VLAN or MST instance ID(s). | - | NOT RUN | - | -| 1271 | dc2-leaf2b | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | -| 1272 | dc2-leaf2b | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | -| 1273 | dc2-leaf2b | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | -| 1274 | dc2-leaf2b | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | -| 1275 | dc2-leaf2b | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | -| 1276 | dc2-leaf2b | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 1277 | dc2-leaf2b | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 1278 | dc2-leaf2b | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | -| 1279 | dc2-leaf2b | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | -| 1280 | dc2-leaf2c | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | -| 1281 | dc2-leaf2c | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | -| 1282 | dc2-leaf2c | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | -| 1283 | dc2-leaf2c | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | -| 1284 | dc2-leaf2c | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | -| 1285 | dc2-leaf2c | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | -| 1286 | dc2-leaf2c | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | -| 1287 | dc2-leaf2c | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | -| 1288 | dc2-leaf2c | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | -| 1289 | dc2-leaf2c | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc2-leaf2a Ethernet8 | NOT RUN | - | -| 1290 | dc2-leaf2c | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc2-leaf2b Ethernet8 | NOT RUN | - | -| 1291 | dc2-leaf2c | Field Notices, Software | VerifyFieldNotice44Resolution | Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization) | - | NOT RUN | - | -| 1292 | dc2-leaf2c | Field Notices, Software | VerifyFieldNotice72Resolution | Verifies if the device has exposeure to FN72, and if the issue has been mitigated | - | NOT RUN | - | -| 1293 | dc2-leaf2c | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS7280E and DCS7500E | - | NOT RUN | - | -| 1294 | dc2-leaf2c | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | -| 1295 | dc2-leaf2c | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | -| 1296 | dc2-leaf2c | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | -| 1297 | dc2-leaf2c | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | -| 1298 | dc2-leaf2c | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | -| 1299 | dc2-leaf2c | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 1300 | dc2-leaf2c | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 1301 | dc2-leaf2c | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | -| 1302 | dc2-leaf2c | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | -| 1303 | dc2-leaf2c | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | -| 1304 | dc2-leaf2c | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - DC2-LEAF2A_Ethernet8 = 'up' | NOT RUN | - | -| 1305 | dc2-leaf2c | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - DC2-LEAF2B_Ethernet8 = 'up' | NOT RUN | - | -| 1306 | dc2-leaf2c | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet5 - dc2-leaf2-server1_iLO = 'up' | NOT RUN | - | -| 1307 | dc2-leaf2c | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel1 - DC2_L3_LEAF2_Po8 = 'up' | NOT RUN | - | -| 1308 | dc2-leaf2c | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | -| 1309 | dc2-leaf2c | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | -| 1310 | dc2-leaf2c | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | -| 1311 | dc2-leaf2c | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | -| 1312 | dc2-leaf2c | Software | VerifyEOSVersion | Verifies the device is running one of the allowed EOS version. | - | NOT RUN | - | -| 1313 | dc2-leaf2c | Software | VerifyTerminAttrVersion | Verifies the device is running one of the allowed TerminAttr version. | - | NOT RUN | - | -| 1314 | dc2-leaf2c | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | -| 1315 | dc2-leaf2c | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | -| 1316 | dc2-leaf2c | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | -| 1317 | dc2-leaf2c | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | -| 1318 | dc2-leaf2c | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | -| 1319 | dc2-leaf2c | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 1320 | dc2-leaf2c | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 1321 | dc2-leaf2c | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | -| 1322 | dc2-leaf2c | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | -| 1323 | dc2-leaf3a.arista.com | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | -| 1324 | dc2-leaf3a.arista.com | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | -| 1325 | dc2-leaf3a.arista.com | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | -| 1326 | dc2-leaf3a.arista.com | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | -| 1327 | dc2-leaf3a.arista.com | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | -| 1328 | dc2-leaf3a.arista.com | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | -| 1329 | dc2-leaf3a.arista.com | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | -| 1330 | dc2-leaf3a.arista.com | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-spine1 (IP: 10.255.128.11) | NOT RUN | - | -| 1331 | dc2-leaf3a.arista.com | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-spine2 (IP: 10.255.128.12) | NOT RUN | - | -| 1332 | dc2-leaf3a.arista.com | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf3b.arista.com (IP: 10.255.129.125) | NOT RUN | - | -| 1333 | dc2-leaf3a.arista.com | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-spine1 (IP: 10.255.255.120) | NOT RUN | - | -| 1334 | dc2-leaf3a.arista.com | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-spine2 (IP: 10.255.255.122) | NOT RUN | - | -| 1335 | dc2-leaf3a.arista.com | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | -| 1336 | dc2-leaf3a.arista.com | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | -| 1337 | dc2-leaf3a.arista.com | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc2-spine1 Ethernet5 | NOT RUN | - | -| 1338 | dc2-leaf3a.arista.com | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc2-spine2 Ethernet5 | NOT RUN | - | -| 1339 | dc2-leaf3a.arista.com | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet3 - Remote: dc2-leaf3b.arista.com Ethernet3 | NOT RUN | - | -| 1340 | dc2-leaf3a.arista.com | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet4 - Remote: dc2-leaf3b.arista.com Ethernet4 | NOT RUN | - | -| 1341 | dc2-leaf3a.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3) | NOT RUN | - | -| 1342 | dc2-leaf3a.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4) | NOT RUN | - | -| 1343 | dc2-leaf3a.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5) | NOT RUN | - | -| 1344 | dc2-leaf3a.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1) | NOT RUN | - | -| 1345 | dc2-leaf3a.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2) | NOT RUN | - | -| 1346 | dc2-leaf3a.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1) | NOT RUN | - | -| 1347 | dc2-leaf3a.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2) | NOT RUN | - | -| 1348 | dc2-leaf3a.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.17) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13) | NOT RUN | - | -| 1349 | dc2-leaf3a.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.17) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14) | NOT RUN | - | -| 1350 | dc2-leaf3a.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.17) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15) | NOT RUN | - | -| 1351 | dc2-leaf3a.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.17) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16) | NOT RUN | - | -| 1352 | dc2-leaf3a.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.17) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17) | NOT RUN | - | -| 1353 | dc2-leaf3a.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.17) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18) | NOT RUN | - | -| 1354 | dc2-leaf3a.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.17) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11) | NOT RUN | - | -| 1355 | dc2-leaf3a.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.17) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12) | NOT RUN | - | -| 1356 | dc2-leaf3a.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet1 (IP: 10.255.255.121) - Destination: dc2-spine1 Ethernet5 (IP: 10.255.255.120) | NOT RUN | - | -| 1357 | dc2-leaf3a.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet2 (IP: 10.255.255.123) - Destination: dc2-spine2 Ethernet5 (IP: 10.255.255.122) | NOT RUN | - | -| 1358 | dc2-leaf3a.arista.com | Field Notices, Software | VerifyFieldNotice44Resolution | Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization) | - | NOT RUN | - | -| 1359 | dc2-leaf3a.arista.com | Field Notices, Software | VerifyFieldNotice72Resolution | Verifies if the device has exposeure to FN72, and if the issue has been mitigated | - | NOT RUN | - | -| 1360 | dc2-leaf3a.arista.com | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS7280E and DCS7500E | - | NOT RUN | - | -| 1361 | dc2-leaf3a.arista.com | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | -| 1362 | dc2-leaf3a.arista.com | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | -| 1363 | dc2-leaf3a.arista.com | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | -| 1364 | dc2-leaf3a.arista.com | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | -| 1365 | dc2-leaf3a.arista.com | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | -| 1366 | dc2-leaf3a.arista.com | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 1367 | dc2-leaf3a.arista.com | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 1368 | dc2-leaf3a.arista.com | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | -| 1369 | dc2-leaf3a.arista.com | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | -| 1370 | dc2-leaf3a.arista.com | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | -| 1371 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - P2P_LINK_TO_DC2-SPINE1_Ethernet5 = 'up' | NOT RUN | - | -| 1372 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet11 - dc2-leaf3-fw1_e1 = 'up' | NOT RUN | - | -| 1373 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - P2P_LINK_TO_DC2-SPINE2_Ethernet5 = 'up' | NOT RUN | - | -| 1374 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet3 - MLAG_PEER_dc2-leaf3b.arista.com_Ethernet3 = 'up' | NOT RUN | - | -| 1375 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet4 - MLAG_PEER_dc2-leaf3b.arista.com_Ethernet4 = 'up' | NOT RUN | - | -| 1376 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback0 - EVPN_Overlay_Peering = 'up' | NOT RUN | - | -| 1377 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up' | NOT RUN | - | -| 1378 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback10 - VRF10_VTEP_DIAGNOSTICS = 'up' | NOT RUN | - | -| 1379 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback11 - VRF11_VTEP_DIAGNOSTICS = 'up' | NOT RUN | - | -| 1380 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel11 - dc2-leaf3-fw1_PortChannel = 'up' | NOT RUN | - | -| 1381 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel3 - MLAG_PEER_dc2-leaf3b.arista.com_Po3 = 'up' | NOT RUN | - | -| 1382 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan11 - VRF10_VLAN11 = 'up' | NOT RUN | - | -| 1383 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan12 - VRF10_VLAN12 = 'up' | NOT RUN | - | -| 1384 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan21 - VRF11_VLAN21 = 'up' | NOT RUN | - | -| 1385 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan22 - VRF11_VLAN22 = 'up' | NOT RUN | - | -| 1386 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan3009 - MLAG_PEER_L3_iBGP: vrf VRF10 = 'up' | NOT RUN | - | -| 1387 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan3010 - MLAG_PEER_L3_iBGP: vrf VRF11 = 'up' | NOT RUN | - | -| 1388 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up' | NOT RUN | - | -| 1389 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4094 - MLAG_PEER = 'up' | NOT RUN | - | -| 1390 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vxlan1 = 'up' | NOT RUN | - | -| 1391 | dc2-leaf3a.arista.com | Logging | VerifyLoggingAccounting | Verifies if AAA accounting logs are generated. | - | NOT RUN | - | -| 1392 | dc2-leaf3a.arista.com | Logging | VerifyLoggingHostname | Verifies if logs are generated with the device FQDN. | - | NOT RUN | - | -| 1393 | dc2-leaf3a.arista.com | Logging | VerifyLoggingHosts | Verifies logging hosts (syslog servers) for a specified VRF. | - | NOT RUN | - | -| 1394 | dc2-leaf3a.arista.com | Logging | VerifyLoggingLogsGeneration | Verifies if logs are generated. | - | NOT RUN | - | -| 1395 | dc2-leaf3a.arista.com | Logging | VerifyLoggingPersistent | Verifies if logging persistent is enabled and logs are saved in flash. | - | NOT RUN | - | -| 1396 | dc2-leaf3a.arista.com | Logging | VerifyLoggingSourceInt | Verifies logging source-interface for a specified VRF. | - | NOT RUN | - | -| 1397 | dc2-leaf3a.arista.com | Logging | VerifyLoggingTimestamp | Verifies if logs are generated with the appropriate timestamp. | - | NOT RUN | - | -| 1398 | dc2-leaf3a.arista.com | Logging | VerifyLoggingWarning | This test verifies there are no syslog messages with a severity of ERRORS or higher. | - | NOT RUN | - | -| 1399 | dc2-leaf3a.arista.com | MLAG | VerifyMlagConfigSanity | Verifies there are no MLAG config-sanity inconsistencies. | - | NOT RUN | - | -| 1400 | dc2-leaf3a.arista.com | MLAG | VerifyMlagDualPrimary | Verifies the MLAG dual-primary detection parameters. | - | NOT RUN | - | -| 1401 | dc2-leaf3a.arista.com | MLAG | VerifyMlagInterfaces | Verifies there are no inactive or active-partial MLAG ports. | - | NOT RUN | - | -| 1402 | dc2-leaf3a.arista.com | MLAG | VerifyMlagReloadDelay | Verifies the MLAG reload-delay parameters. | - | NOT RUN | - | -| 1403 | dc2-leaf3a.arista.com | MLAG | VerifyMlagStatus | Verifies the health status of the MLAG configuration. | - | NOT RUN | - | -| 1404 | dc2-leaf3a.arista.com | MLAG | VerifyMlagStatus | Verifies the health status of the MLAG configuration. | - | NOT RUN | - | -| 1405 | dc2-leaf3a.arista.com | Multicast, IGMP | VerifyIGMPSnoopingGlobal | Verifies the IGMP snooping global configuration. | - | NOT RUN | - | -| 1406 | dc2-leaf3a.arista.com | Multicast, IGMP | VerifyIGMPSnoopingVlans | Verifies the IGMP snooping configuration for some VLANs. | - | NOT RUN | - | -| 1407 | dc2-leaf3a.arista.com | Routing | VerifyRoutingProtocolModel | Verifies the configured routing protocol model. | Routing protocol model: multi-agent | NOT RUN | - | -| 1408 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.1 - Peer: dc1-spine1 | NOT RUN | - | -| 1409 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.2 - Peer: dc1-spine2 | NOT RUN | - | -| 1410 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.3 - Peer: dc1-leaf1a | NOT RUN | - | -| 1411 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.4 - Peer: dc1-leaf1b | NOT RUN | - | -| 1412 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.5 - Peer: dc1-leaf2a | NOT RUN | - | -| 1413 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.3 - Peer: dc1-leaf1a | NOT RUN | - | -| 1414 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.5 - Peer: dc1-leaf2a | NOT RUN | - | -| 1415 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.11 - Peer: dc2-spine1 | NOT RUN | - | -| 1416 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.12 - Peer: dc2-spine2 | NOT RUN | - | -| 1417 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.13 - Peer: dc2-leaf1a | NOT RUN | - | -| 1418 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.14 - Peer: dc2-leaf1b | NOT RUN | - | -| 1419 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.15 - Peer: dc2-leaf2a | NOT RUN | - | -| 1420 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.16 - Peer: dc2-leaf2b | NOT RUN | - | -| 1421 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | -| 1422 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com | NOT RUN | - | -| 1423 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.13 - Peer: dc2-leaf1a | NOT RUN | - | -| 1424 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.15 - Peer: dc2-leaf2a | NOT RUN | - | -| 1425 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | -| 1426 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.1 - Peer: dc1-wan1 | NOT RUN | - | -| 1427 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.2 - Peer: dc1-wan2 | NOT RUN | - | -| 1428 | dc2-leaf3a.arista.com | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | -| 1429 | dc2-leaf3a.arista.com | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | -| 1430 | dc2-leaf3a.arista.com | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | -| 1431 | dc2-leaf3a.arista.com | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | -| 1432 | dc2-leaf3a.arista.com | Software | VerifyEOSVersion | Verifies the device is running one of the allowed EOS version. | - | NOT RUN | - | -| 1433 | dc2-leaf3a.arista.com | Software | VerifyTerminAttrVersion | Verifies the device is running one of the allowed TerminAttr version. | - | NOT RUN | - | -| 1434 | dc2-leaf3a.arista.com | STP | VerifySTPBlockedPorts | Verifies there is no STP blocked ports. | - | NOT RUN | - | -| 1435 | dc2-leaf3a.arista.com | STP | VerifySTPCounters | Verifies there is no errors in STP BPDU packets. | - | NOT RUN | - | -| 1436 | dc2-leaf3a.arista.com | STP | VerifySTPForwardingPorts | Verifies that all interfaces are forwarding for a provided list of VLAN(s). | - | NOT RUN | - | -| 1437 | dc2-leaf3a.arista.com | STP | VerifySTPMode | Verifies the configured STP mode for a provided list of VLAN(s). | - | NOT RUN | - | -| 1438 | dc2-leaf3a.arista.com | STP | VerifySTPRootPriority | Verifies the STP root priority for a provided list of VLAN or MST instance ID(s). | - | NOT RUN | - | -| 1439 | dc2-leaf3a.arista.com | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | -| 1440 | dc2-leaf3a.arista.com | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | -| 1441 | dc2-leaf3a.arista.com | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | -| 1442 | dc2-leaf3a.arista.com | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | -| 1443 | dc2-leaf3a.arista.com | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | -| 1444 | dc2-leaf3a.arista.com | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 1445 | dc2-leaf3a.arista.com | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 1446 | dc2-leaf3a.arista.com | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | -| 1447 | dc2-leaf3a.arista.com | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | -| 1448 | dc2-leaf3b.arista.com | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | -| 1449 | dc2-leaf3b.arista.com | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | -| 1450 | dc2-leaf3b.arista.com | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | -| 1451 | dc2-leaf3b.arista.com | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | -| 1452 | dc2-leaf3b.arista.com | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | -| 1453 | dc2-leaf3b.arista.com | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | -| 1454 | dc2-leaf3b.arista.com | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | -| 1455 | dc2-leaf3b.arista.com | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-spine1 (IP: 10.255.128.11) | NOT RUN | - | -| 1456 | dc2-leaf3b.arista.com | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-spine2 (IP: 10.255.128.12) | NOT RUN | - | -| 1457 | dc2-leaf3b.arista.com | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf3a.arista.com (IP: 10.255.129.124) | NOT RUN | - | -| 1458 | dc2-leaf3b.arista.com | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-spine1 (IP: 10.255.255.124) | NOT RUN | - | -| 1459 | dc2-leaf3b.arista.com | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-spine2 (IP: 10.255.255.126) | NOT RUN | - | -| 1460 | dc2-leaf3b.arista.com | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | -| 1461 | dc2-leaf3b.arista.com | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | -| 1462 | dc2-leaf3b.arista.com | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc2-spine1 Ethernet6 | NOT RUN | - | -| 1463 | dc2-leaf3b.arista.com | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc2-spine2 Ethernet6 | NOT RUN | - | -| 1464 | dc2-leaf3b.arista.com | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet3 - Remote: dc2-leaf3a.arista.com Ethernet3 | NOT RUN | - | -| 1465 | dc2-leaf3b.arista.com | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet4 - Remote: dc2-leaf3a.arista.com Ethernet4 | NOT RUN | - | -| 1466 | dc2-leaf3b.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3) | NOT RUN | - | -| 1467 | dc2-leaf3b.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4) | NOT RUN | - | -| 1468 | dc2-leaf3b.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5) | NOT RUN | - | -| 1469 | dc2-leaf3b.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1) | NOT RUN | - | -| 1470 | dc2-leaf3b.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2) | NOT RUN | - | -| 1471 | dc2-leaf3b.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1) | NOT RUN | - | -| 1472 | dc2-leaf3b.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2) | NOT RUN | - | -| 1473 | dc2-leaf3b.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.18) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13) | NOT RUN | - | -| 1474 | dc2-leaf3b.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.18) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14) | NOT RUN | - | -| 1475 | dc2-leaf3b.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.18) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15) | NOT RUN | - | -| 1476 | dc2-leaf3b.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.18) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16) | NOT RUN | - | -| 1477 | dc2-leaf3b.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.18) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17) | NOT RUN | - | -| 1478 | dc2-leaf3b.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.18) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18) | NOT RUN | - | -| 1479 | dc2-leaf3b.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.18) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11) | NOT RUN | - | -| 1480 | dc2-leaf3b.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.18) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12) | NOT RUN | - | -| 1481 | dc2-leaf3b.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet1 (IP: 10.255.255.125) - Destination: dc2-spine1 Ethernet6 (IP: 10.255.255.124) | NOT RUN | - | -| 1482 | dc2-leaf3b.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet2 (IP: 10.255.255.127) - Destination: dc2-spine2 Ethernet6 (IP: 10.255.255.126) | NOT RUN | - | -| 1483 | dc2-leaf3b.arista.com | Field Notices, Software | VerifyFieldNotice44Resolution | Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization) | - | NOT RUN | - | -| 1484 | dc2-leaf3b.arista.com | Field Notices, Software | VerifyFieldNotice72Resolution | Verifies if the device has exposeure to FN72, and if the issue has been mitigated | - | NOT RUN | - | -| 1485 | dc2-leaf3b.arista.com | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS7280E and DCS7500E | - | NOT RUN | - | -| 1486 | dc2-leaf3b.arista.com | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | -| 1487 | dc2-leaf3b.arista.com | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | -| 1488 | dc2-leaf3b.arista.com | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | -| 1489 | dc2-leaf3b.arista.com | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | -| 1490 | dc2-leaf3b.arista.com | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | -| 1491 | dc2-leaf3b.arista.com | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 1492 | dc2-leaf3b.arista.com | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 1493 | dc2-leaf3b.arista.com | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | -| 1494 | dc2-leaf3b.arista.com | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | -| 1495 | dc2-leaf3b.arista.com | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | -| 1496 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - P2P_LINK_TO_DC2-SPINE1_Ethernet6 = 'up' | NOT RUN | - | -| 1497 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet11 - dc2-leaf3-fw1_e1 = 'adminDown' | NOT RUN | - | -| 1498 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - P2P_LINK_TO_DC2-SPINE2_Ethernet6 = 'up' | NOT RUN | - | -| 1499 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet3 - MLAG_PEER_dc2-leaf3a.arista.com_Ethernet3 = 'up' | NOT RUN | - | -| 1500 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet4 - MLAG_PEER_dc2-leaf3a.arista.com_Ethernet4 = 'up' | NOT RUN | - | -| 1501 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback0 - EVPN_Overlay_Peering = 'up' | NOT RUN | - | -| 1502 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up' | NOT RUN | - | -| 1503 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback10 - VRF10_VTEP_DIAGNOSTICS = 'up' | NOT RUN | - | -| 1504 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback11 - VRF11_VTEP_DIAGNOSTICS = 'up' | NOT RUN | - | -| 1505 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel11 - dc2-leaf3-fw1_PortChannel = 'up' | NOT RUN | - | -| 1506 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel3 - MLAG_PEER_dc2-leaf3a.arista.com_Po3 = 'up' | NOT RUN | - | -| 1507 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan11 - VRF10_VLAN11 = 'up' | NOT RUN | - | -| 1508 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan12 - VRF10_VLAN12 = 'up' | NOT RUN | - | -| 1509 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan21 - VRF11_VLAN21 = 'up' | NOT RUN | - | -| 1510 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan22 - VRF11_VLAN22 = 'up' | NOT RUN | - | -| 1511 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan3009 - MLAG_PEER_L3_iBGP: vrf VRF10 = 'up' | NOT RUN | - | -| 1512 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan3010 - MLAG_PEER_L3_iBGP: vrf VRF11 = 'up' | NOT RUN | - | -| 1513 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up' | NOT RUN | - | -| 1514 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4094 - MLAG_PEER = 'up' | NOT RUN | - | -| 1515 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vxlan1 = 'up' | NOT RUN | - | -| 1516 | dc2-leaf3b.arista.com | Logging | VerifyLoggingAccounting | Verifies if AAA accounting logs are generated. | - | NOT RUN | - | -| 1517 | dc2-leaf3b.arista.com | Logging | VerifyLoggingHostname | Verifies if logs are generated with the device FQDN. | - | NOT RUN | - | -| 1518 | dc2-leaf3b.arista.com | Logging | VerifyLoggingHosts | Verifies logging hosts (syslog servers) for a specified VRF. | - | NOT RUN | - | -| 1519 | dc2-leaf3b.arista.com | Logging | VerifyLoggingLogsGeneration | Verifies if logs are generated. | - | NOT RUN | - | -| 1520 | dc2-leaf3b.arista.com | Logging | VerifyLoggingPersistent | Verifies if logging persistent is enabled and logs are saved in flash. | - | NOT RUN | - | -| 1521 | dc2-leaf3b.arista.com | Logging | VerifyLoggingSourceInt | Verifies logging source-interface for a specified VRF. | - | NOT RUN | - | -| 1522 | dc2-leaf3b.arista.com | Logging | VerifyLoggingTimestamp | Verifies if logs are generated with the appropriate timestamp. | - | NOT RUN | - | -| 1523 | dc2-leaf3b.arista.com | Logging | VerifyLoggingWarning | This test verifies there are no syslog messages with a severity of ERRORS or higher. | - | NOT RUN | - | -| 1524 | dc2-leaf3b.arista.com | MLAG | VerifyMlagConfigSanity | Verifies there are no MLAG config-sanity inconsistencies. | - | NOT RUN | - | -| 1525 | dc2-leaf3b.arista.com | MLAG | VerifyMlagDualPrimary | Verifies the MLAG dual-primary detection parameters. | - | NOT RUN | - | -| 1526 | dc2-leaf3b.arista.com | MLAG | VerifyMlagInterfaces | Verifies there are no inactive or active-partial MLAG ports. | - | NOT RUN | - | -| 1527 | dc2-leaf3b.arista.com | MLAG | VerifyMlagReloadDelay | Verifies the MLAG reload-delay parameters. | - | NOT RUN | - | -| 1528 | dc2-leaf3b.arista.com | MLAG | VerifyMlagStatus | Verifies the health status of the MLAG configuration. | - | NOT RUN | - | -| 1529 | dc2-leaf3b.arista.com | MLAG | VerifyMlagStatus | Verifies the health status of the MLAG configuration. | - | NOT RUN | - | -| 1530 | dc2-leaf3b.arista.com | Multicast, IGMP | VerifyIGMPSnoopingGlobal | Verifies the IGMP snooping global configuration. | - | NOT RUN | - | -| 1531 | dc2-leaf3b.arista.com | Multicast, IGMP | VerifyIGMPSnoopingVlans | Verifies the IGMP snooping configuration for some VLANs. | - | NOT RUN | - | -| 1532 | dc2-leaf3b.arista.com | Routing | VerifyRoutingProtocolModel | Verifies the configured routing protocol model. | Routing protocol model: multi-agent | NOT RUN | - | -| 1533 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.1 - Peer: dc1-spine1 | NOT RUN | - | -| 1534 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.2 - Peer: dc1-spine2 | NOT RUN | - | -| 1535 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.3 - Peer: dc1-leaf1a | NOT RUN | - | -| 1536 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.4 - Peer: dc1-leaf1b | NOT RUN | - | -| 1537 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.5 - Peer: dc1-leaf2a | NOT RUN | - | -| 1538 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.3 - Peer: dc1-leaf1a | NOT RUN | - | -| 1539 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.5 - Peer: dc1-leaf2a | NOT RUN | - | -| 1540 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.11 - Peer: dc2-spine1 | NOT RUN | - | -| 1541 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.12 - Peer: dc2-spine2 | NOT RUN | - | -| 1542 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.13 - Peer: dc2-leaf1a | NOT RUN | - | -| 1543 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.14 - Peer: dc2-leaf1b | NOT RUN | - | -| 1544 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.15 - Peer: dc2-leaf2a | NOT RUN | - | -| 1545 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.16 - Peer: dc2-leaf2b | NOT RUN | - | -| 1546 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | -| 1547 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com | NOT RUN | - | -| 1548 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.13 - Peer: dc2-leaf1a | NOT RUN | - | -| 1549 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.15 - Peer: dc2-leaf2a | NOT RUN | - | -| 1550 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | -| 1551 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.1 - Peer: dc1-wan1 | NOT RUN | - | -| 1552 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.2 - Peer: dc1-wan2 | NOT RUN | - | -| 1553 | dc2-leaf3b.arista.com | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | -| 1554 | dc2-leaf3b.arista.com | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | -| 1555 | dc2-leaf3b.arista.com | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | -| 1556 | dc2-leaf3b.arista.com | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | -| 1557 | dc2-leaf3b.arista.com | Software | VerifyEOSVersion | Verifies the device is running one of the allowed EOS version. | - | NOT RUN | - | -| 1558 | dc2-leaf3b.arista.com | Software | VerifyTerminAttrVersion | Verifies the device is running one of the allowed TerminAttr version. | - | NOT RUN | - | -| 1559 | dc2-leaf3b.arista.com | STP | VerifySTPBlockedPorts | Verifies there is no STP blocked ports. | - | NOT RUN | - | -| 1560 | dc2-leaf3b.arista.com | STP | VerifySTPCounters | Verifies there is no errors in STP BPDU packets. | - | NOT RUN | - | -| 1561 | dc2-leaf3b.arista.com | STP | VerifySTPForwardingPorts | Verifies that all interfaces are forwarding for a provided list of VLAN(s). | - | NOT RUN | - | -| 1562 | dc2-leaf3b.arista.com | STP | VerifySTPMode | Verifies the configured STP mode for a provided list of VLAN(s). | - | NOT RUN | - | -| 1563 | dc2-leaf3b.arista.com | STP | VerifySTPRootPriority | Verifies the STP root priority for a provided list of VLAN or MST instance ID(s). | - | NOT RUN | - | -| 1564 | dc2-leaf3b.arista.com | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | -| 1565 | dc2-leaf3b.arista.com | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | -| 1566 | dc2-leaf3b.arista.com | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | -| 1567 | dc2-leaf3b.arista.com | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | -| 1568 | dc2-leaf3b.arista.com | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | -| 1569 | dc2-leaf3b.arista.com | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 1570 | dc2-leaf3b.arista.com | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 1571 | dc2-leaf3b.arista.com | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | -| 1572 | dc2-leaf3b.arista.com | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | -| 1573 | dc2-spine1 | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | -| 1574 | dc2-spine1 | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | -| 1575 | dc2-spine1 | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | -| 1576 | dc2-spine1 | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | -| 1577 | dc2-spine1 | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | -| 1578 | dc2-spine1 | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | -| 1579 | dc2-spine1 | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | -| 1580 | dc2-spine1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-leaf1a (IP: 10.255.128.13) | NOT RUN | - | -| 1581 | dc2-spine1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-leaf1b (IP: 10.255.128.14) | NOT RUN | - | -| 1582 | dc2-spine1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-leaf2a (IP: 10.255.128.15) | NOT RUN | - | -| 1583 | dc2-spine1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-leaf2b (IP: 10.255.128.16) | NOT RUN | - | -| 1584 | dc2-spine1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-leaf3a.arista.com (IP: 10.255.128.17) | NOT RUN | - | -| 1585 | dc2-spine1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-leaf3b.arista.com (IP: 10.255.128.18) | NOT RUN | - | -| 1586 | dc2-spine1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf1a (IP: 10.255.255.105) | NOT RUN | - | -| 1587 | dc2-spine1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf1b (IP: 10.255.255.109) | NOT RUN | - | -| 1588 | dc2-spine1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf2a (IP: 10.255.255.113) | NOT RUN | - | -| 1589 | dc2-spine1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf2b (IP: 10.255.255.117) | NOT RUN | - | -| 1590 | dc2-spine1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf3a.arista.com (IP: 10.255.255.121) | NOT RUN | - | -| 1591 | dc2-spine1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf3b.arista.com (IP: 10.255.255.125) | NOT RUN | - | -| 1592 | dc2-spine1 | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | -| 1593 | dc2-spine1 | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | -| 1594 | dc2-spine1 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc2-leaf1a Ethernet1 | NOT RUN | - | -| 1595 | dc2-spine1 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc2-leaf1b Ethernet1 | NOT RUN | - | -| 1596 | dc2-spine1 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet3 - Remote: dc2-leaf2a Ethernet1 | NOT RUN | - | -| 1597 | dc2-spine1 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet4 - Remote: dc2-leaf2b Ethernet1 | NOT RUN | - | -| 1598 | dc2-spine1 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet5 - Remote: dc2-leaf3a.arista.com Ethernet1 | NOT RUN | - | -| 1599 | dc2-spine1 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet6 - Remote: dc2-leaf3b.arista.com Ethernet1 | NOT RUN | - | -| 1600 | dc2-spine1 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet1 (IP: 10.255.255.104) - Destination: dc2-leaf1a Ethernet1 (IP: 10.255.255.105) | NOT RUN | - | -| 1601 | dc2-spine1 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet2 (IP: 10.255.255.108) - Destination: dc2-leaf1b Ethernet1 (IP: 10.255.255.109) | NOT RUN | - | -| 1602 | dc2-spine1 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet3 (IP: 10.255.255.112) - Destination: dc2-leaf2a Ethernet1 (IP: 10.255.255.113) | NOT RUN | - | -| 1603 | dc2-spine1 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet4 (IP: 10.255.255.116) - Destination: dc2-leaf2b Ethernet1 (IP: 10.255.255.117) | NOT RUN | - | -| 1604 | dc2-spine1 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet5 (IP: 10.255.255.120) - Destination: dc2-leaf3a.arista.com Ethernet1 (IP: 10.255.255.121) | NOT RUN | - | -| 1605 | dc2-spine1 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet6 (IP: 10.255.255.124) - Destination: dc2-leaf3b.arista.com Ethernet1 (IP: 10.255.255.125) | NOT RUN | - | -| 1606 | dc2-spine1 | Field Notices, Software | VerifyFieldNotice44Resolution | Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization) | - | NOT RUN | - | -| 1607 | dc2-spine1 | Field Notices, Software | VerifyFieldNotice72Resolution | Verifies if the device has exposeure to FN72, and if the issue has been mitigated | - | NOT RUN | - | -| 1608 | dc2-spine1 | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS7280E and DCS7500E | - | NOT RUN | - | -| 1609 | dc2-spine1 | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | -| 1610 | dc2-spine1 | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | -| 1611 | dc2-spine1 | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | -| 1612 | dc2-spine1 | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | -| 1613 | dc2-spine1 | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | -| 1614 | dc2-spine1 | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 1615 | dc2-spine1 | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 1616 | dc2-spine1 | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | -| 1617 | dc2-spine1 | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | -| 1618 | dc2-spine1 | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | -| 1619 | dc2-spine1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - P2P_LINK_TO_DC2-LEAF1A_Ethernet1 = 'up' | NOT RUN | - | -| 1620 | dc2-spine1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - P2P_LINK_TO_DC2-LEAF1B_Ethernet1 = 'up' | NOT RUN | - | -| 1621 | dc2-spine1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet3 - P2P_LINK_TO_DC2-LEAF2A_Ethernet1 = 'up' | NOT RUN | - | -| 1622 | dc2-spine1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet4 - P2P_LINK_TO_DC2-LEAF2B_Ethernet1 = 'up' | NOT RUN | - | -| 1623 | dc2-spine1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet5 - P2P_LINK_TO_DC2-LEAF3A.ARISTA.COM_Ethernet1 = 'up' | NOT RUN | - | -| 1624 | dc2-spine1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet6 - P2P_LINK_TO_DC2-LEAF3B.ARISTA.COM_Ethernet1 = 'up' | NOT RUN | - | -| 1625 | dc2-spine1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback0 - EVPN_Overlay_Peering = 'up' | NOT RUN | - | -| 1626 | dc2-spine1 | Routing | VerifyRoutingProtocolModel | Verifies the configured routing protocol model. | Routing protocol model: multi-agent | NOT RUN | - | -| 1627 | dc2-spine1 | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | -| 1628 | dc2-spine1 | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | -| 1629 | dc2-spine1 | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | -| 1630 | dc2-spine1 | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | -| 1631 | dc2-spine1 | Software | VerifyEOSVersion | Verifies the device is running one of the allowed EOS version. | - | NOT RUN | - | -| 1632 | dc2-spine1 | Software | VerifyTerminAttrVersion | Verifies the device is running one of the allowed TerminAttr version. | - | NOT RUN | - | -| 1633 | dc2-spine1 | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | -| 1634 | dc2-spine1 | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | -| 1635 | dc2-spine1 | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | -| 1636 | dc2-spine1 | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | -| 1637 | dc2-spine1 | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | -| 1638 | dc2-spine1 | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 1639 | dc2-spine1 | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 1640 | dc2-spine1 | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | -| 1641 | dc2-spine1 | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | -| 1642 | dc2-spine2 | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | -| 1643 | dc2-spine2 | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | -| 1644 | dc2-spine2 | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | -| 1645 | dc2-spine2 | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | -| 1646 | dc2-spine2 | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | -| 1647 | dc2-spine2 | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | -| 1648 | dc2-spine2 | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | -| 1649 | dc2-spine2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-leaf1a (IP: 10.255.128.13) | NOT RUN | - | -| 1650 | dc2-spine2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-leaf1b (IP: 10.255.128.14) | NOT RUN | - | -| 1651 | dc2-spine2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-leaf2a (IP: 10.255.128.15) | NOT RUN | - | -| 1652 | dc2-spine2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-leaf2b (IP: 10.255.128.16) | NOT RUN | - | -| 1653 | dc2-spine2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-leaf3a.arista.com (IP: 10.255.128.17) | NOT RUN | - | -| 1654 | dc2-spine2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-leaf3b.arista.com (IP: 10.255.128.18) | NOT RUN | - | -| 1655 | dc2-spine2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf1a (IP: 10.255.255.107) | NOT RUN | - | -| 1656 | dc2-spine2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf1b (IP: 10.255.255.111) | NOT RUN | - | -| 1657 | dc2-spine2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf2a (IP: 10.255.255.115) | NOT RUN | - | -| 1658 | dc2-spine2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf2b (IP: 10.255.255.119) | NOT RUN | - | -| 1659 | dc2-spine2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf3a.arista.com (IP: 10.255.255.123) | NOT RUN | - | -| 1660 | dc2-spine2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf3b.arista.com (IP: 10.255.255.127) | NOT RUN | - | -| 1661 | dc2-spine2 | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | -| 1662 | dc2-spine2 | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | -| 1663 | dc2-spine2 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc2-leaf1a Ethernet2 | NOT RUN | - | -| 1664 | dc2-spine2 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc2-leaf1b Ethernet2 | NOT RUN | - | -| 1665 | dc2-spine2 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet3 - Remote: dc2-leaf2a Ethernet2 | NOT RUN | - | -| 1666 | dc2-spine2 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet4 - Remote: dc2-leaf2b Ethernet2 | NOT RUN | - | -| 1667 | dc2-spine2 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet5 - Remote: dc2-leaf3a.arista.com Ethernet2 | NOT RUN | - | -| 1668 | dc2-spine2 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet6 - Remote: dc2-leaf3b.arista.com Ethernet2 | NOT RUN | - | -| 1669 | dc2-spine2 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet1 (IP: 10.255.255.106) - Destination: dc2-leaf1a Ethernet2 (IP: 10.255.255.107) | NOT RUN | - | -| 1670 | dc2-spine2 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet2 (IP: 10.255.255.110) - Destination: dc2-leaf1b Ethernet2 (IP: 10.255.255.111) | NOT RUN | - | -| 1671 | dc2-spine2 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet3 (IP: 10.255.255.114) - Destination: dc2-leaf2a Ethernet2 (IP: 10.255.255.115) | NOT RUN | - | -| 1672 | dc2-spine2 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet4 (IP: 10.255.255.118) - Destination: dc2-leaf2b Ethernet2 (IP: 10.255.255.119) | NOT RUN | - | -| 1673 | dc2-spine2 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet5 (IP: 10.255.255.122) - Destination: dc2-leaf3a.arista.com Ethernet2 (IP: 10.255.255.123) | NOT RUN | - | -| 1674 | dc2-spine2 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet6 (IP: 10.255.255.126) - Destination: dc2-leaf3b.arista.com Ethernet2 (IP: 10.255.255.127) | NOT RUN | - | -| 1675 | dc2-spine2 | Field Notices, Software | VerifyFieldNotice44Resolution | Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization) | - | NOT RUN | - | -| 1676 | dc2-spine2 | Field Notices, Software | VerifyFieldNotice72Resolution | Verifies if the device has exposeure to FN72, and if the issue has been mitigated | - | NOT RUN | - | -| 1677 | dc2-spine2 | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS7280E and DCS7500E | - | NOT RUN | - | -| 1678 | dc2-spine2 | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | -| 1679 | dc2-spine2 | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | -| 1680 | dc2-spine2 | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | -| 1681 | dc2-spine2 | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | -| 1682 | dc2-spine2 | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | -| 1683 | dc2-spine2 | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 1684 | dc2-spine2 | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | -| 1685 | dc2-spine2 | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | -| 1686 | dc2-spine2 | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | -| 1687 | dc2-spine2 | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | -| 1688 | dc2-spine2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - P2P_LINK_TO_DC2-LEAF1A_Ethernet2 = 'up' | NOT RUN | - | -| 1689 | dc2-spine2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - P2P_LINK_TO_DC2-LEAF1B_Ethernet2 = 'up' | NOT RUN | - | -| 1690 | dc2-spine2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet3 - P2P_LINK_TO_DC2-LEAF2A_Ethernet2 = 'up' | NOT RUN | - | -| 1691 | dc2-spine2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet4 - P2P_LINK_TO_DC2-LEAF2B_Ethernet2 = 'up' | NOT RUN | - | -| 1692 | dc2-spine2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet5 - P2P_LINK_TO_DC2-LEAF3A.ARISTA.COM_Ethernet2 = 'up' | NOT RUN | - | -| 1693 | dc2-spine2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet6 - P2P_LINK_TO_DC2-LEAF3B.ARISTA.COM_Ethernet2 = 'up' | NOT RUN | - | -| 1694 | dc2-spine2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback0 - EVPN_Overlay_Peering = 'up' | NOT RUN | - | -| 1695 | dc2-spine2 | Routing | VerifyRoutingProtocolModel | Verifies the configured routing protocol model. | Routing protocol model: multi-agent | NOT RUN | - | -| 1696 | dc2-spine2 | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | -| 1697 | dc2-spine2 | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | -| 1698 | dc2-spine2 | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | -| 1699 | dc2-spine2 | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | -| 1700 | dc2-spine2 | Software | VerifyEOSVersion | Verifies the device is running one of the allowed EOS version. | - | NOT RUN | - | -| 1701 | dc2-spine2 | Software | VerifyTerminAttrVersion | Verifies the device is running one of the allowed TerminAttr version. | - | NOT RUN | - | -| 1702 | dc2-spine2 | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | -| 1703 | dc2-spine2 | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | -| 1704 | dc2-spine2 | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | -| 1705 | dc2-spine2 | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | -| 1706 | dc2-spine2 | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | -| 1707 | dc2-spine2 | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 1708 | dc2-spine2 | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | -| 1709 | dc2-spine2 | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | -| 1710 | dc2-spine2 | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | +| 8 | dc1-leaf1a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: 10.1.1.1 | NOT RUN | - | +| 9 | dc1-leaf1a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc1-spine1 (IP: 10.255.0.1) | NOT RUN | - | +| 10 | dc1-leaf1a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc1-spine2 (IP: 10.255.0.2) | NOT RUN | - | +| 11 | dc1-leaf1a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-leaf1b (IP: 10.255.1.97) | NOT RUN | - | +| 12 | dc1-leaf1a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-spine1 (IP: 10.255.255.0) | NOT RUN | - | +| 13 | dc1-leaf1a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-spine2 (IP: 10.255.255.2) | NOT RUN | - | +| 14 | dc1-leaf1a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-wan1 (IP: 10.255.255.1) | NOT RUN | - | +| 15 | dc1-leaf1a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-wan2 (IP: 10.255.255.5) | NOT RUN | - | +| 16 | dc1-leaf1a | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | +| 17 | dc1-leaf1a | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | +| 18 | dc1-leaf1a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc1-spine1 Ethernet1 | NOT RUN | - | +| 19 | dc1-leaf1a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc1-spine2 Ethernet1 | NOT RUN | - | +| 20 | dc1-leaf1a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet3 - Remote: dc1-leaf1b Ethernet3 | NOT RUN | - | +| 21 | dc1-leaf1a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet4 - Remote: dc1-leaf1b Ethernet4 | NOT RUN | - | +| 22 | dc1-leaf1a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet6 - Remote: dc1-wan1 Ethernet1 | NOT RUN | - | +| 23 | dc1-leaf1a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet7 - Remote: dc1-wan2 Ethernet1 | NOT RUN | - | +| 24 | dc1-leaf1a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet8 - Remote: dc1-leaf1c Ethernet1 | NOT RUN | - | +| 25 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3) | NOT RUN | - | +| 26 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4) | NOT RUN | - | +| 27 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5) | NOT RUN | - | +| 28 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1) | NOT RUN | - | +| 29 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2) | NOT RUN | - | +| 30 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5) | NOT RUN | - | +| 31 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6) | NOT RUN | - | +| 32 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1) | NOT RUN | - | +| 33 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2) | NOT RUN | - | +| 34 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.3) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13) | NOT RUN | - | +| 35 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.3) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14) | NOT RUN | - | +| 36 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.3) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15) | NOT RUN | - | +| 37 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.3) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16) | NOT RUN | - | +| 38 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.3) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17) | NOT RUN | - | +| 39 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.3) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18) | NOT RUN | - | +| 40 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.3) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11) | NOT RUN | - | +| 41 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.3) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12) | NOT RUN | - | +| 42 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet1 (IP: 10.255.255.1) - Destination: dc1-spine1 Ethernet1 (IP: 10.255.255.0) | NOT RUN | - | +| 43 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet2 (IP: 10.255.255.3) - Destination: dc1-spine2 Ethernet1 (IP: 10.255.255.2) | NOT RUN | - | +| 44 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet6 (IP: 10.255.255.0) - Destination: dc1-wan1 Ethernet1 (IP: 10.255.255.1) | NOT RUN | - | +| 45 | dc1-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet7 (IP: 10.255.255.4) - Destination: dc1-wan2 Ethernet1 (IP: 10.255.255.5) | NOT RUN | - | +| 46 | dc1-leaf1a | Field Notices | VerifyFieldNotice44Resolution | Verifies that the device is using the correct Aboot version per FN0044. | - | NOT RUN | - | +| 47 | dc1-leaf1a | Field Notices | VerifyFieldNotice72Resolution | Verifies if the device is exposed to FN0072, and if the issue has been mitigated. | - | NOT RUN | - | +| 48 | dc1-leaf1a | Greent | VerifyGreenT | Verifies if a GreenT policy is created. | - | NOT RUN | - | +| 49 | dc1-leaf1a | Greent | VerifyGreenTCounters | Verifies if the GreenT counters are incremented. | - | NOT RUN | - | +| 50 | dc1-leaf1a | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches. | - | NOT RUN | - | +| 51 | dc1-leaf1a | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | +| 52 | dc1-leaf1a | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok', 'Not Present' | NOT RUN | - | +| 53 | dc1-leaf1a | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | +| 54 | dc1-leaf1a | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok', 'Not Present' | NOT RUN | - | +| 55 | dc1-leaf1a | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | +| 56 | dc1-leaf1a | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 57 | dc1-leaf1a | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 58 | dc1-leaf1a | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | +| 59 | dc1-leaf1a | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arastra, Inc.', 'Arista Networks', 'Generic', 'Not Present' | NOT RUN | - | +| 60 | dc1-leaf1a | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | +| 61 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - P2P_LINK_TO_DC1-SPINE1_Ethernet1 = 'up' | NOT RUN | - | +| 62 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - P2P_LINK_TO_DC1-SPINE2_Ethernet1 = 'up' | NOT RUN | - | +| 63 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet3 - MLAG_PEER_dc1-leaf1b_Ethernet3 = 'up' | NOT RUN | - | +| 64 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet4 - MLAG_PEER_dc1-leaf1b_Ethernet4 = 'up' | NOT RUN | - | +| 65 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet5 - dc1-leaf1-server1_PCI1 = 'up' | NOT RUN | - | +| 66 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet6 - P2P_LINK_TO_DC1-WAN1_Ethernet1 = 'up' | NOT RUN | - | +| 67 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet7 - P2P_LINK_TO_DC1-WAN2_Ethernet1 = 'up' | NOT RUN | - | +| 68 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet8 - DC1-LEAF1C_Ethernet1 = 'up' | NOT RUN | - | +| 69 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback0 - EVPN_Overlay_Peering = 'up' | NOT RUN | - | +| 70 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up' | NOT RUN | - | +| 71 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback10 - VRF10_VTEP_DIAGNOSTICS = 'up' | NOT RUN | - | +| 72 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback11 - VRF11_VTEP_DIAGNOSTICS = 'up' | NOT RUN | - | +| 73 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel3 - MLAG_PEER_dc1-leaf1b_Po3 = 'up' | NOT RUN | - | +| 74 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel5 - dc1-leaf1-server1_PortChannel dc1-leaf1-server1 = 'up' | NOT RUN | - | +| 75 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel8 - DC1-LEAF1C_Po1 = 'up' | NOT RUN | - | +| 76 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan11 - VRF10_VLAN11 = 'up' | NOT RUN | - | +| 77 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan12 - VRF10_VLAN12 = 'up' | NOT RUN | - | +| 78 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan21 - VRF11_VLAN21 = 'up' | NOT RUN | - | +| 79 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan22 - VRF11_VLAN22 = 'up' | NOT RUN | - | +| 80 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan3009 - MLAG_PEER_L3_iBGP: vrf VRF10 = 'up' | NOT RUN | - | +| 81 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan3010 - MLAG_PEER_L3_iBGP: vrf VRF11 = 'up' | NOT RUN | - | +| 82 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4085 - Inband Management = 'up' | NOT RUN | - | +| 83 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up' | NOT RUN | - | +| 84 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4094 - MLAG_PEER = 'up' | NOT RUN | - | +| 85 | dc1-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vxlan1 = 'up' | NOT RUN | - | +| 86 | dc1-leaf1a | LANZ | VerifyLANZ | Verifies if LANZ is enabled. | - | NOT RUN | - | +| 87 | dc1-leaf1a | MLAG | VerifyMlagStatus | Verifies the health status of the MLAG configuration. | - | NOT RUN | - | +| 88 | dc1-leaf1a | Profiles | VerifyTcamProfile | Verifies the device TCAM profile. | - | NOT RUN | - | +| 89 | dc1-leaf1a | Profiles | VerifyUnifiedForwardingTableMode | Verifies the device is using the expected UFT mode. | - | NOT RUN | - | +| 90 | dc1-leaf1a | PTP | VerifyPtpGMStatus | Verifies that the device is locked to a valid PTP Grandmaster. | - | NOT RUN | - | +| 91 | dc1-leaf1a | PTP | VerifyPtpLockStatus | Verifies that the device was locked to the upstream PTP GM in the last minute. | - | NOT RUN | - | +| 92 | dc1-leaf1a | PTP | VerifyPtpModeStatus | Verifies that the device is configured as a PTP Boundary Clock. | - | NOT RUN | - | +| 93 | dc1-leaf1a | PTP | VerifyPtpOffset | Verifies that the PTP timing offset is within +/- 1000ns from the master clock. | - | NOT RUN | - | +| 94 | dc1-leaf1a | PTP | VerifyPtpPortModeStatus | Verifies the PTP interfaces state. | - | NOT RUN | - | +| 95 | dc1-leaf1a | Routing | VerifyRoutingProtocolModel | Verifies the configured routing protocol model. | Routing protocol model: multi-agent | NOT RUN | - | +| 96 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.1 - Peer: dc1-spine1 | NOT RUN | - | +| 97 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.2 - Peer: dc1-spine2 | NOT RUN | - | +| 98 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.3 - Peer: dc1-leaf1a | NOT RUN | - | +| 99 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.4 - Peer: dc1-leaf1b | NOT RUN | - | +| 100 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.5 - Peer: dc1-leaf2a | NOT RUN | - | +| 101 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.3 - Peer: dc1-leaf1a | NOT RUN | - | +| 102 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.5 - Peer: dc1-leaf2a | NOT RUN | - | +| 103 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.11 - Peer: dc2-spine1 | NOT RUN | - | +| 104 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.12 - Peer: dc2-spine2 | NOT RUN | - | +| 105 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.13 - Peer: dc2-leaf1a | NOT RUN | - | +| 106 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.14 - Peer: dc2-leaf1b | NOT RUN | - | +| 107 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.15 - Peer: dc2-leaf2a | NOT RUN | - | +| 108 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.16 - Peer: dc2-leaf2b | NOT RUN | - | +| 109 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | +| 110 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com | NOT RUN | - | +| 111 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.13 - Peer: dc2-leaf1a | NOT RUN | - | +| 112 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.15 - Peer: dc2-leaf2a | NOT RUN | - | +| 113 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | +| 114 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.1 - Peer: dc1-wan1 | NOT RUN | - | +| 115 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.2 - Peer: dc1-wan2 | NOT RUN | - | +| 116 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.33.0.5 - Peer: dc1-svc-leaf1a | NOT RUN | - | +| 117 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.33.0.6 - Peer: dc1-svc-leaf1b | NOT RUN | - | +| 118 | dc1-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.33.1.5 - Peer: dc1-svc-leaf1a | NOT RUN | - | +| 119 | dc1-leaf1a | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | - | NOT RUN | - | +| 120 | dc1-leaf1a | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | +| 121 | dc1-leaf1a | Security | VerifyAPIHttpStatus | Verifies if eAPI HTTP server is disabled globally. | - | NOT RUN | - | +| 122 | dc1-leaf1a | Security | VerifyAPIIPv4Acl | Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 123 | dc1-leaf1a | Security | VerifyAPIIPv6Acl | Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 124 | dc1-leaf1a | Security | VerifyAPISSLCertificate | Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size. | - | NOT RUN | - | +| 125 | dc1-leaf1a | Security | VerifyBannerLogin | Verifies the login banner of a device. | - | NOT RUN | - | +| 126 | dc1-leaf1a | Security | VerifyBannerMotd | Verifies the motd banner of a device. | - | NOT RUN | - | +| 127 | dc1-leaf1a | Security | VerifyIPSecConnHealth | Verifies all IPv4 security connections. | - | NOT RUN | - | +| 128 | dc1-leaf1a | Security | VerifyIPv4ACL | Verifies the configuration of IPv4 ACLs. | - | NOT RUN | - | +| 129 | dc1-leaf1a | Security | VerifySpecificIPSecConn | Verifies IPv4 security connections for a peer. | - | NOT RUN | - | +| 130 | dc1-leaf1a | Security | VerifySSHIPv4Acl | Verifies if the SSHD agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 131 | dc1-leaf1a | Security | VerifySSHIPv6Acl | Verifies if the SSHD agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 132 | dc1-leaf1a | Security | VerifySSHStatus | Verifies if the SSHD agent is disabled in the default VRF. | - | NOT RUN | - | +| 133 | dc1-leaf1a | Security | VerifyTelnetStatus | Verifies if Telnet is disabled in the default VRF. | - | NOT RUN | - | +| 134 | dc1-leaf1a | Services | VerifyDNSLookup | Verifies the DNS name to IP address resolution. | - | NOT RUN | - | +| 135 | dc1-leaf1a | Services | VerifyDNSServers | Verifies if the DNS servers are correctly configured. | - | NOT RUN | - | +| 136 | dc1-leaf1a | Services | VerifyErrdisableRecovery | Verifies the errdisable recovery reason, status, and interval. | - | NOT RUN | - | +| 137 | dc1-leaf1a | Services | VerifyHostname | Verifies the hostname of a device. | - | NOT RUN | - | +| 138 | dc1-leaf1a | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 139 | dc1-leaf1a | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 140 | dc1-leaf1a | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | +| 141 | dc1-leaf1a | Software | VerifyEOSExtensions | Verifies that all EOS extensions installed on the device are enabled for boot persistence. | - | NOT RUN | - | +| 142 | dc1-leaf1a | Software | VerifyEOSVersion | Verifies the EOS version of the device. | - | NOT RUN | - | +| 143 | dc1-leaf1a | Software | VerifyTerminAttrVersion | Verifies the TerminAttr version of the device. | - | NOT RUN | - | +| 144 | dc1-leaf1a | STUN | VerifyStunClient | Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided. | - | NOT RUN | - | +| 145 | dc1-leaf1a | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | +| 146 | dc1-leaf1a | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | +| 147 | dc1-leaf1a | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | +| 148 | dc1-leaf1a | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | +| 149 | dc1-leaf1a | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | +| 150 | dc1-leaf1a | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 151 | dc1-leaf1a | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 152 | dc1-leaf1a | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | +| 153 | dc1-leaf1a | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | +| 154 | dc1-leaf1a | VLAN | VerifyVlanInternalPolicy | Verifies the VLAN internal allocation policy and the range of VLANs. | - | NOT RUN | - | +| 155 | dc1-leaf1a | VXLAN | VerifyVxlan1ConnSettings | Verifies the interface vxlan1 source interface and UDP port. | - | NOT RUN | - | +| 156 | dc1-leaf1a | VXLAN | VerifyVxlan1Interface | Verifies the Vxlan1 interface status. | - | NOT RUN | - | +| 157 | dc1-leaf1a | VXLAN | VerifyVxlanConfigSanity | Verifies there are no VXLAN config-sanity inconsistencies. | - | NOT RUN | - | +| 158 | dc1-leaf1a | VXLAN | VerifyVxlanVniBinding | Verifies the VNI-VLAN bindings of the Vxlan1 interface. | - | NOT RUN | - | +| 159 | dc1-leaf1a | VXLAN | VerifyVxlanVtep | Verifies the VTEP peers of the Vxlan1 interface | - | NOT RUN | - | +| 160 | dc1-leaf1b | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 161 | dc1-leaf1b | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 162 | dc1-leaf1b | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | +| 163 | dc1-leaf1b | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | +| 164 | dc1-leaf1b | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | +| 165 | dc1-leaf1b | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | +| 166 | dc1-leaf1b | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | +| 167 | dc1-leaf1b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc1-spine1 (IP: 10.255.0.1) | NOT RUN | - | +| 168 | dc1-leaf1b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc1-spine2 (IP: 10.255.0.2) | NOT RUN | - | +| 169 | dc1-leaf1b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-leaf1a (IP: 10.255.1.96) | NOT RUN | - | +| 170 | dc1-leaf1b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-spine1 (IP: 10.255.255.4) | NOT RUN | - | +| 171 | dc1-leaf1b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-spine2 (IP: 10.255.255.6) | NOT RUN | - | +| 172 | dc1-leaf1b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-wan1 (IP: 10.255.255.3) | NOT RUN | - | +| 173 | dc1-leaf1b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-wan2 (IP: 10.255.255.7) | NOT RUN | - | +| 174 | dc1-leaf1b | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | +| 175 | dc1-leaf1b | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | +| 176 | dc1-leaf1b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc1-spine1 Ethernet2 | NOT RUN | - | +| 177 | dc1-leaf1b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc1-spine2 Ethernet2 | NOT RUN | - | +| 178 | dc1-leaf1b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet3 - Remote: dc1-leaf1a Ethernet3 | NOT RUN | - | +| 179 | dc1-leaf1b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet4 - Remote: dc1-leaf1a Ethernet4 | NOT RUN | - | +| 180 | dc1-leaf1b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet6 - Remote: dc1-wan1 Ethernet2 | NOT RUN | - | +| 181 | dc1-leaf1b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet7 - Remote: dc1-wan2 Ethernet2 | NOT RUN | - | +| 182 | dc1-leaf1b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet8 - Remote: dc1-leaf1c Ethernet2 | NOT RUN | - | +| 183 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3) | NOT RUN | - | +| 184 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4) | NOT RUN | - | +| 185 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5) | NOT RUN | - | +| 186 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1) | NOT RUN | - | +| 187 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2) | NOT RUN | - | +| 188 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5) | NOT RUN | - | +| 189 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6) | NOT RUN | - | +| 190 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1) | NOT RUN | - | +| 191 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2) | NOT RUN | - | +| 192 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.4) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13) | NOT RUN | - | +| 193 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.4) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14) | NOT RUN | - | +| 194 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.4) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15) | NOT RUN | - | +| 195 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.4) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16) | NOT RUN | - | +| 196 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.4) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17) | NOT RUN | - | +| 197 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.4) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18) | NOT RUN | - | +| 198 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.4) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11) | NOT RUN | - | +| 199 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.4) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12) | NOT RUN | - | +| 200 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet1 (IP: 10.255.255.5) - Destination: dc1-spine1 Ethernet2 (IP: 10.255.255.4) | NOT RUN | - | +| 201 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet2 (IP: 10.255.255.7) - Destination: dc1-spine2 Ethernet2 (IP: 10.255.255.6) | NOT RUN | - | +| 202 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet6 (IP: 10.255.255.2) - Destination: dc1-wan1 Ethernet2 (IP: 10.255.255.3) | NOT RUN | - | +| 203 | dc1-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet7 (IP: 10.255.255.6) - Destination: dc1-wan2 Ethernet2 (IP: 10.255.255.7) | NOT RUN | - | +| 204 | dc1-leaf1b | Field Notices | VerifyFieldNotice44Resolution | Verifies that the device is using the correct Aboot version per FN0044. | - | NOT RUN | - | +| 205 | dc1-leaf1b | Field Notices | VerifyFieldNotice72Resolution | Verifies if the device is exposed to FN0072, and if the issue has been mitigated. | - | NOT RUN | - | +| 206 | dc1-leaf1b | Greent | VerifyGreenT | Verifies if a GreenT policy is created. | - | NOT RUN | - | +| 207 | dc1-leaf1b | Greent | VerifyGreenTCounters | Verifies if the GreenT counters are incremented. | - | NOT RUN | - | +| 208 | dc1-leaf1b | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches. | - | NOT RUN | - | +| 209 | dc1-leaf1b | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | +| 210 | dc1-leaf1b | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | +| 211 | dc1-leaf1b | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | +| 212 | dc1-leaf1b | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | +| 213 | dc1-leaf1b | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | +| 214 | dc1-leaf1b | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 215 | dc1-leaf1b | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 216 | dc1-leaf1b | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | +| 217 | dc1-leaf1b | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | +| 218 | dc1-leaf1b | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | +| 219 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - P2P_LINK_TO_DC1-SPINE1_Ethernet2 = 'up' | NOT RUN | - | +| 220 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - P2P_LINK_TO_DC1-SPINE2_Ethernet2 = 'up' | NOT RUN | - | +| 221 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet3 - MLAG_PEER_dc1-leaf1a_Ethernet3 = 'up' | NOT RUN | - | +| 222 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet4 - MLAG_PEER_dc1-leaf1a_Ethernet4 = 'up' | NOT RUN | - | +| 223 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet5 - dc1-leaf1-server1_PCI2 = 'up' | NOT RUN | - | +| 224 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet6 - P2P_LINK_TO_DC1-WAN1_Ethernet2 = 'up' | NOT RUN | - | +| 225 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet7 - P2P_LINK_TO_DC1-WAN2_Ethernet2 = 'up' | NOT RUN | - | +| 226 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet8 - DC1-LEAF1C_Ethernet2 = 'up' | NOT RUN | - | +| 227 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback0 - EVPN_Overlay_Peering = 'up' | NOT RUN | - | +| 228 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up' | NOT RUN | - | +| 229 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback10 - VRF10_VTEP_DIAGNOSTICS = 'up' | NOT RUN | - | +| 230 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback11 - VRF11_VTEP_DIAGNOSTICS = 'up' | NOT RUN | - | +| 231 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel3 - MLAG_PEER_dc1-leaf1a_Po3 = 'up' | NOT RUN | - | +| 232 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel5 - dc1-leaf1-server1_PortChannel dc1-leaf1-server1 = 'up' | NOT RUN | - | +| 233 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel8 - DC1-LEAF1C_Po1 = 'up' | NOT RUN | - | +| 234 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan11 - VRF10_VLAN11 = 'up' | NOT RUN | - | +| 235 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan12 - VRF10_VLAN12 = 'up' | NOT RUN | - | +| 236 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan21 - VRF11_VLAN21 = 'up' | NOT RUN | - | +| 237 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan22 - VRF11_VLAN22 = 'up' | NOT RUN | - | +| 238 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan3009 - MLAG_PEER_L3_iBGP: vrf VRF10 = 'up' | NOT RUN | - | +| 239 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan3010 - MLAG_PEER_L3_iBGP: vrf VRF11 = 'up' | NOT RUN | - | +| 240 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4085 - Inband Management = 'up' | NOT RUN | - | +| 241 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up' | NOT RUN | - | +| 242 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4094 - MLAG_PEER = 'up' | NOT RUN | - | +| 243 | dc1-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vxlan1 = 'up' | NOT RUN | - | +| 244 | dc1-leaf1b | LANZ | VerifyLANZ | Verifies if LANZ is enabled. | - | NOT RUN | - | +| 245 | dc1-leaf1b | MLAG | VerifyMlagStatus | Verifies the health status of the MLAG configuration. | - | NOT RUN | - | +| 246 | dc1-leaf1b | PTP | VerifyPtpGMStatus | Verifies that the device is locked to a valid PTP Grandmaster. | - | NOT RUN | - | +| 247 | dc1-leaf1b | PTP | VerifyPtpLockStatus | Verifies that the device was locked to the upstream PTP GM in the last minute. | - | NOT RUN | - | +| 248 | dc1-leaf1b | PTP | VerifyPtpModeStatus | Verifies that the device is configured as a PTP Boundary Clock. | - | NOT RUN | - | +| 249 | dc1-leaf1b | PTP | VerifyPtpOffset | Verifies that the PTP timing offset is within +/- 1000ns from the master clock. | - | NOT RUN | - | +| 250 | dc1-leaf1b | PTP | VerifyPtpPortModeStatus | Verifies the PTP interfaces state. | - | NOT RUN | - | +| 251 | dc1-leaf1b | Routing | VerifyRoutingProtocolModel | Verifies the configured routing protocol model. | Routing protocol model: multi-agent | NOT RUN | - | +| 252 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.1 - Peer: dc1-spine1 | NOT RUN | - | +| 253 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.2 - Peer: dc1-spine2 | NOT RUN | - | +| 254 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.3 - Peer: dc1-leaf1a | NOT RUN | - | +| 255 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.4 - Peer: dc1-leaf1b | NOT RUN | - | +| 256 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.5 - Peer: dc1-leaf2a | NOT RUN | - | +| 257 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.3 - Peer: dc1-leaf1a | NOT RUN | - | +| 258 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.5 - Peer: dc1-leaf2a | NOT RUN | - | +| 259 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.11 - Peer: dc2-spine1 | NOT RUN | - | +| 260 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.12 - Peer: dc2-spine2 | NOT RUN | - | +| 261 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.13 - Peer: dc2-leaf1a | NOT RUN | - | +| 262 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.14 - Peer: dc2-leaf1b | NOT RUN | - | +| 263 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.15 - Peer: dc2-leaf2a | NOT RUN | - | +| 264 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.16 - Peer: dc2-leaf2b | NOT RUN | - | +| 265 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | +| 266 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com | NOT RUN | - | +| 267 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.13 - Peer: dc2-leaf1a | NOT RUN | - | +| 268 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.15 - Peer: dc2-leaf2a | NOT RUN | - | +| 269 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | +| 270 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.1 - Peer: dc1-wan1 | NOT RUN | - | +| 271 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.2 - Peer: dc1-wan2 | NOT RUN | - | +| 272 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.33.0.5 - Peer: dc1-svc-leaf1a | NOT RUN | - | +| 273 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.33.0.6 - Peer: dc1-svc-leaf1b | NOT RUN | - | +| 274 | dc1-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.33.1.5 - Peer: dc1-svc-leaf1a | NOT RUN | - | +| 275 | dc1-leaf1b | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | - | NOT RUN | - | +| 276 | dc1-leaf1b | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | +| 277 | dc1-leaf1b | Security | VerifyAPIHttpStatus | Verifies if eAPI HTTP server is disabled globally. | - | NOT RUN | - | +| 278 | dc1-leaf1b | Security | VerifyAPIIPv4Acl | Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 279 | dc1-leaf1b | Security | VerifyAPIIPv6Acl | Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 280 | dc1-leaf1b | Security | VerifyAPISSLCertificate | Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size. | - | NOT RUN | - | +| 281 | dc1-leaf1b | Security | VerifyBannerLogin | Verifies the login banner of a device. | - | NOT RUN | - | +| 282 | dc1-leaf1b | Security | VerifyBannerMotd | Verifies the motd banner of a device. | - | NOT RUN | - | +| 283 | dc1-leaf1b | Security | VerifyIPSecConnHealth | Verifies all IPv4 security connections. | - | NOT RUN | - | +| 284 | dc1-leaf1b | Security | VerifyIPv4ACL | Verifies the configuration of IPv4 ACLs. | - | NOT RUN | - | +| 285 | dc1-leaf1b | Security | VerifySpecificIPSecConn | Verifies IPv4 security connections for a peer. | - | NOT RUN | - | +| 286 | dc1-leaf1b | Security | VerifySSHIPv4Acl | Verifies if the SSHD agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 287 | dc1-leaf1b | Security | VerifySSHIPv6Acl | Verifies if the SSHD agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 288 | dc1-leaf1b | Security | VerifySSHStatus | Verifies if the SSHD agent is disabled in the default VRF. | - | NOT RUN | - | +| 289 | dc1-leaf1b | Security | VerifyTelnetStatus | Verifies if Telnet is disabled in the default VRF. | - | NOT RUN | - | +| 290 | dc1-leaf1b | Services | VerifyDNSLookup | Verifies the DNS name to IP address resolution. | - | NOT RUN | - | +| 291 | dc1-leaf1b | Services | VerifyDNSServers | Verifies if the DNS servers are correctly configured. | - | NOT RUN | - | +| 292 | dc1-leaf1b | Services | VerifyErrdisableRecovery | Verifies the errdisable recovery reason, status, and interval. | - | NOT RUN | - | +| 293 | dc1-leaf1b | Services | VerifyHostname | Verifies the hostname of a device. | - | NOT RUN | - | +| 294 | dc1-leaf1b | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 295 | dc1-leaf1b | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 296 | dc1-leaf1b | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | +| 297 | dc1-leaf1b | Software | VerifyEOSVersion | Verifies the EOS version of the device. | - | NOT RUN | - | +| 298 | dc1-leaf1b | Software | VerifyTerminAttrVersion | Verifies the TerminAttr version of the device. | - | NOT RUN | - | +| 299 | dc1-leaf1b | STUN | VerifyStunClient | Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided. | - | NOT RUN | - | +| 300 | dc1-leaf1b | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | +| 301 | dc1-leaf1b | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | +| 302 | dc1-leaf1b | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | +| 303 | dc1-leaf1b | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | +| 304 | dc1-leaf1b | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | +| 305 | dc1-leaf1b | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 306 | dc1-leaf1b | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 307 | dc1-leaf1b | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | +| 308 | dc1-leaf1b | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | +| 309 | dc1-leaf1b | VLAN | VerifyVlanInternalPolicy | Verifies the VLAN internal allocation policy and the range of VLANs. | - | NOT RUN | - | +| 310 | dc1-leaf1c | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 311 | dc1-leaf1c | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 312 | dc1-leaf1c | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | +| 313 | dc1-leaf1c | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | +| 314 | dc1-leaf1c | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | +| 315 | dc1-leaf1c | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | +| 316 | dc1-leaf1c | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | +| 317 | dc1-leaf1c | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | +| 318 | dc1-leaf1c | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | +| 319 | dc1-leaf1c | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc1-leaf1a Ethernet8 | NOT RUN | - | +| 320 | dc1-leaf1c | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc1-leaf1b Ethernet8 | NOT RUN | - | +| 321 | dc1-leaf1c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3) | NOT RUN | - | +| 322 | dc1-leaf1c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4) | NOT RUN | - | +| 323 | dc1-leaf1c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5) | NOT RUN | - | +| 324 | dc1-leaf1c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1) | NOT RUN | - | +| 325 | dc1-leaf1c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2) | NOT RUN | - | +| 326 | dc1-leaf1c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5) | NOT RUN | - | +| 327 | dc1-leaf1c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6) | NOT RUN | - | +| 328 | dc1-leaf1c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1) | NOT RUN | - | +| 329 | dc1-leaf1c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2) | NOT RUN | - | +| 330 | dc1-leaf1c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13) | NOT RUN | - | +| 331 | dc1-leaf1c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14) | NOT RUN | - | +| 332 | dc1-leaf1c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15) | NOT RUN | - | +| 333 | dc1-leaf1c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16) | NOT RUN | - | +| 334 | dc1-leaf1c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17) | NOT RUN | - | +| 335 | dc1-leaf1c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18) | NOT RUN | - | +| 336 | dc1-leaf1c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11) | NOT RUN | - | +| 337 | dc1-leaf1c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12) | NOT RUN | - | +| 338 | dc1-leaf1c | Field Notices | VerifyFieldNotice44Resolution | Verifies that the device is using the correct Aboot version per FN0044. | - | NOT RUN | - | +| 339 | dc1-leaf1c | Field Notices | VerifyFieldNotice72Resolution | Verifies if the device is exposed to FN0072, and if the issue has been mitigated. | - | NOT RUN | - | +| 340 | dc1-leaf1c | Greent | VerifyGreenT | Verifies if a GreenT policy is created. | - | NOT RUN | - | +| 341 | dc1-leaf1c | Greent | VerifyGreenTCounters | Verifies if the GreenT counters are incremented. | - | NOT RUN | - | +| 342 | dc1-leaf1c | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches. | - | NOT RUN | - | +| 343 | dc1-leaf1c | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | +| 344 | dc1-leaf1c | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | +| 345 | dc1-leaf1c | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | +| 346 | dc1-leaf1c | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | +| 347 | dc1-leaf1c | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | +| 348 | dc1-leaf1c | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 349 | dc1-leaf1c | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 350 | dc1-leaf1c | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | +| 351 | dc1-leaf1c | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | +| 352 | dc1-leaf1c | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | +| 353 | dc1-leaf1c | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - DC1-LEAF1A_Ethernet8 = 'up' | NOT RUN | - | +| 354 | dc1-leaf1c | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - DC1-LEAF1B_Ethernet8 = 'up' | NOT RUN | - | +| 355 | dc1-leaf1c | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet5 - dc1-leaf1-server1_iLO = 'up' | NOT RUN | - | +| 356 | dc1-leaf1c | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel1 - DC1_L3_LEAF1_Po8 = 'up' | NOT RUN | - | +| 357 | dc1-leaf1c | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4085 - L2LEAF_INBAND_MGMT = 'up' | NOT RUN | - | +| 358 | dc1-leaf1c | LANZ | VerifyLANZ | Verifies if LANZ is enabled. | - | NOT RUN | - | +| 359 | dc1-leaf1c | PTP | VerifyPtpGMStatus | Verifies that the device is locked to a valid PTP Grandmaster. | - | NOT RUN | - | +| 360 | dc1-leaf1c | PTP | VerifyPtpLockStatus | Verifies that the device was locked to the upstream PTP GM in the last minute. | - | NOT RUN | - | +| 361 | dc1-leaf1c | PTP | VerifyPtpModeStatus | Verifies that the device is configured as a PTP Boundary Clock. | - | NOT RUN | - | +| 362 | dc1-leaf1c | PTP | VerifyPtpOffset | Verifies that the PTP timing offset is within +/- 1000ns from the master clock. | - | NOT RUN | - | +| 363 | dc1-leaf1c | PTP | VerifyPtpPortModeStatus | Verifies the PTP interfaces state. | - | NOT RUN | - | +| 364 | dc1-leaf1c | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | - | NOT RUN | - | +| 365 | dc1-leaf1c | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | +| 366 | dc1-leaf1c | Security | VerifyAPIHttpStatus | Verifies if eAPI HTTP server is disabled globally. | - | NOT RUN | - | +| 367 | dc1-leaf1c | Security | VerifyAPIIPv4Acl | Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 368 | dc1-leaf1c | Security | VerifyAPIIPv6Acl | Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 369 | dc1-leaf1c | Security | VerifyAPISSLCertificate | Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size. | - | NOT RUN | - | +| 370 | dc1-leaf1c | Security | VerifyBannerLogin | Verifies the login banner of a device. | - | NOT RUN | - | +| 371 | dc1-leaf1c | Security | VerifyBannerMotd | Verifies the motd banner of a device. | - | NOT RUN | - | +| 372 | dc1-leaf1c | Security | VerifyIPSecConnHealth | Verifies all IPv4 security connections. | - | NOT RUN | - | +| 373 | dc1-leaf1c | Security | VerifyIPv4ACL | Verifies the configuration of IPv4 ACLs. | - | NOT RUN | - | +| 374 | dc1-leaf1c | Security | VerifySpecificIPSecConn | Verifies IPv4 security connections for a peer. | - | NOT RUN | - | +| 375 | dc1-leaf1c | Security | VerifySSHIPv4Acl | Verifies if the SSHD agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 376 | dc1-leaf1c | Security | VerifySSHIPv6Acl | Verifies if the SSHD agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 377 | dc1-leaf1c | Security | VerifySSHStatus | Verifies if the SSHD agent is disabled in the default VRF. | - | NOT RUN | - | +| 378 | dc1-leaf1c | Security | VerifyTelnetStatus | Verifies if Telnet is disabled in the default VRF. | - | NOT RUN | - | +| 379 | dc1-leaf1c | Services | VerifyDNSLookup | Verifies the DNS name to IP address resolution. | - | NOT RUN | - | +| 380 | dc1-leaf1c | Services | VerifyDNSServers | Verifies if the DNS servers are correctly configured. | - | NOT RUN | - | +| 381 | dc1-leaf1c | Services | VerifyErrdisableRecovery | Verifies the errdisable recovery reason, status, and interval. | - | NOT RUN | - | +| 382 | dc1-leaf1c | Services | VerifyHostname | Verifies the hostname of a device. | - | NOT RUN | - | +| 383 | dc1-leaf1c | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 384 | dc1-leaf1c | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 385 | dc1-leaf1c | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | +| 386 | dc1-leaf1c | Software | VerifyEOSVersion | Verifies the EOS version of the device. | - | NOT RUN | - | +| 387 | dc1-leaf1c | Software | VerifyTerminAttrVersion | Verifies the TerminAttr version of the device. | - | NOT RUN | - | +| 388 | dc1-leaf1c | STUN | VerifyStunClient | Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided. | - | NOT RUN | - | +| 389 | dc1-leaf1c | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | +| 390 | dc1-leaf1c | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | +| 391 | dc1-leaf1c | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | +| 392 | dc1-leaf1c | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | +| 393 | dc1-leaf1c | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | +| 394 | dc1-leaf1c | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 395 | dc1-leaf1c | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 396 | dc1-leaf1c | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | +| 397 | dc1-leaf1c | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | +| 398 | dc1-leaf1c | VLAN | VerifyVlanInternalPolicy | Verifies the VLAN internal allocation policy and the range of VLANs. | - | NOT RUN | - | +| 399 | dc1-leaf2a | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 400 | dc1-leaf2a | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 401 | dc1-leaf2a | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | +| 402 | dc1-leaf2a | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | +| 403 | dc1-leaf2a | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | +| 404 | dc1-leaf2a | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | +| 405 | dc1-leaf2a | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | +| 406 | dc1-leaf2a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc1-spine1 (IP: 10.255.0.1) | NOT RUN | - | +| 407 | dc1-leaf2a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc1-spine2 (IP: 10.255.0.2) | NOT RUN | - | +| 408 | dc1-leaf2a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-leaf2a (IP: 10.255.128.15) | NOT RUN | - | +| 409 | dc1-leaf2a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-spine1 (IP: 10.255.255.8) | NOT RUN | - | +| 410 | dc1-leaf2a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-spine2 (IP: 10.255.255.10) | NOT RUN | - | +| 411 | dc1-leaf2a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf2a (IP: 192.168.100.1) | NOT RUN | - | +| 412 | dc1-leaf2a | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | +| 413 | dc1-leaf2a | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | +| 414 | dc1-leaf2a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc1-spine1 Ethernet3 | NOT RUN | - | +| 415 | dc1-leaf2a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc1-spine2 Ethernet3 | NOT RUN | - | +| 416 | dc1-leaf2a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet6 - Remote: dc2-leaf2a Ethernet6 | NOT RUN | - | +| 417 | dc1-leaf2a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet8 - Remote: dc1-leaf2c Ethernet1 | NOT RUN | - | +| 418 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3) | NOT RUN | - | +| 419 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4) | NOT RUN | - | +| 420 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5) | NOT RUN | - | +| 421 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1) | NOT RUN | - | +| 422 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2) | NOT RUN | - | +| 423 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5) | NOT RUN | - | +| 424 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6) | NOT RUN | - | +| 425 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1) | NOT RUN | - | +| 426 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2) | NOT RUN | - | +| 427 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.5) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13) | NOT RUN | - | +| 428 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.5) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14) | NOT RUN | - | +| 429 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.5) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15) | NOT RUN | - | +| 430 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.5) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16) | NOT RUN | - | +| 431 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.5) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17) | NOT RUN | - | +| 432 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.5) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18) | NOT RUN | - | +| 433 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.5) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11) | NOT RUN | - | +| 434 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.0.5) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12) | NOT RUN | - | +| 435 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet1 (IP: 10.255.255.9) - Destination: dc1-spine1 Ethernet3 (IP: 10.255.255.8) | NOT RUN | - | +| 436 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet2 (IP: 10.255.255.11) - Destination: dc1-spine2 Ethernet3 (IP: 10.255.255.10) | NOT RUN | - | +| 437 | dc1-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet6 (IP: 192.168.100.0) - Destination: dc2-leaf2a Ethernet6 (IP: 192.168.100.1) | NOT RUN | - | +| 438 | dc1-leaf2a | Field Notices | VerifyFieldNotice44Resolution | Verifies that the device is using the correct Aboot version per FN0044. | - | NOT RUN | - | +| 439 | dc1-leaf2a | Field Notices | VerifyFieldNotice72Resolution | Verifies if the device is exposed to FN0072, and if the issue has been mitigated. | - | NOT RUN | - | +| 440 | dc1-leaf2a | Greent | VerifyGreenT | Verifies if a GreenT policy is created. | - | NOT RUN | - | +| 441 | dc1-leaf2a | Greent | VerifyGreenTCounters | Verifies if the GreenT counters are incremented. | - | NOT RUN | - | +| 442 | dc1-leaf2a | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches. | - | NOT RUN | - | +| 443 | dc1-leaf2a | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | +| 444 | dc1-leaf2a | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | +| 445 | dc1-leaf2a | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | +| 446 | dc1-leaf2a | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | +| 447 | dc1-leaf2a | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | +| 448 | dc1-leaf2a | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 449 | dc1-leaf2a | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 450 | dc1-leaf2a | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | +| 451 | dc1-leaf2a | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | +| 452 | dc1-leaf2a | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | +| 453 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - P2P_LINK_TO_DC1-SPINE1_Ethernet3 = 'up' | NOT RUN | - | +| 454 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - P2P_LINK_TO_DC1-SPINE2_Ethernet3 = 'up' | NOT RUN | - | +| 455 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet3 - MLAG_PEER_dc1-leaf2b_Ethernet3 = 'up' | NOT RUN | - | +| 456 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet4 - MLAG_PEER_dc1-leaf2b_Ethernet4 = 'up' | NOT RUN | - | +| 457 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet5 - dc1-leaf2-server1_PCI1 = 'up' | NOT RUN | - | +| 458 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet6 - P2P_LINK_TO_dc2-leaf2a_Ethernet6 = 'up' | NOT RUN | - | +| 459 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet8 - DC1-LEAF2C_Ethernet1 = 'up' | NOT RUN | - | +| 460 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback0 - EVPN_Overlay_Peering = 'up' | NOT RUN | - | +| 461 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up' | NOT RUN | - | +| 462 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback10 - VRF10_VTEP_DIAGNOSTICS = 'up' | NOT RUN | - | +| 463 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback11 - VRF11_VTEP_DIAGNOSTICS = 'up' | NOT RUN | - | +| 464 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel3 - MLAG_PEER_dc1-leaf2b_Po3 = 'up' | NOT RUN | - | +| 465 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel5 - dc1-leaf2-server1_PortChannel dc1-leaf2-server1 = 'up' | NOT RUN | - | +| 466 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel8 - DC1-LEAF2C_Po1 = 'up' | NOT RUN | - | +| 467 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan11 - VRF10_VLAN11 = 'up' | NOT RUN | - | +| 468 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan12 - VRF10_VLAN12 = 'up' | NOT RUN | - | +| 469 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan21 - VRF11_VLAN21 = 'up' | NOT RUN | - | +| 470 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan22 - VRF11_VLAN22 = 'up' | NOT RUN | - | +| 471 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan3009 - MLAG_PEER_L3_iBGP: vrf VRF10 = 'up' | NOT RUN | - | +| 472 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan3010 - MLAG_PEER_L3_iBGP: vrf VRF11 = 'up' | NOT RUN | - | +| 473 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4085 - Inband Management = 'up' | NOT RUN | - | +| 474 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up' | NOT RUN | - | +| 475 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4094 - MLAG_PEER = 'up' | NOT RUN | - | +| 476 | dc1-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vxlan1 = 'up' | NOT RUN | - | +| 477 | dc1-leaf2a | LANZ | VerifyLANZ | Verifies if LANZ is enabled. | - | NOT RUN | - | +| 478 | dc1-leaf2a | MLAG | VerifyMlagStatus | Verifies the health status of the MLAG configuration. | - | NOT RUN | - | +| 479 | dc1-leaf2a | Profiles | VerifyTcamProfile | Verifies the device TCAM profile. | - | NOT RUN | - | +| 480 | dc1-leaf2a | Profiles | VerifyUnifiedForwardingTableMode | Verifies the device is using the expected UFT mode. | - | NOT RUN | - | +| 481 | dc1-leaf2a | PTP | VerifyPtpGMStatus | Verifies that the device is locked to a valid PTP Grandmaster. | - | NOT RUN | - | +| 482 | dc1-leaf2a | PTP | VerifyPtpLockStatus | Verifies that the device was locked to the upstream PTP GM in the last minute. | - | NOT RUN | - | +| 483 | dc1-leaf2a | PTP | VerifyPtpModeStatus | Verifies that the device is configured as a PTP Boundary Clock. | - | NOT RUN | - | +| 484 | dc1-leaf2a | PTP | VerifyPtpOffset | Verifies that the PTP timing offset is within +/- 1000ns from the master clock. | - | NOT RUN | - | +| 485 | dc1-leaf2a | PTP | VerifyPtpPortModeStatus | Verifies the PTP interfaces state. | - | NOT RUN | - | +| 486 | dc1-leaf2a | Routing | VerifyRoutingProtocolModel | Verifies the configured routing protocol model. | Routing protocol model: multi-agent | NOT RUN | - | +| 487 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.1 - Peer: dc1-spine1 | NOT RUN | - | +| 488 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.2 - Peer: dc1-spine2 | NOT RUN | - | +| 489 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.3 - Peer: dc1-leaf1a | NOT RUN | - | +| 490 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.4 - Peer: dc1-leaf1b | NOT RUN | - | +| 491 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.5 - Peer: dc1-leaf2a | NOT RUN | - | +| 492 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.3 - Peer: dc1-leaf1a | NOT RUN | - | +| 493 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.5 - Peer: dc1-leaf2a | NOT RUN | - | +| 494 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.11 - Peer: dc2-spine1 | NOT RUN | - | +| 495 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.12 - Peer: dc2-spine2 | NOT RUN | - | +| 496 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.13 - Peer: dc2-leaf1a | NOT RUN | - | +| 497 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.14 - Peer: dc2-leaf1b | NOT RUN | - | +| 498 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.15 - Peer: dc2-leaf2a | NOT RUN | - | +| 499 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.16 - Peer: dc2-leaf2b | NOT RUN | - | +| 500 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | +| 501 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com | NOT RUN | - | +| 502 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.13 - Peer: dc2-leaf1a | NOT RUN | - | +| 503 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.15 - Peer: dc2-leaf2a | NOT RUN | - | +| 504 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | +| 505 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.1 - Peer: dc1-wan1 | NOT RUN | - | +| 506 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.2 - Peer: dc1-wan2 | NOT RUN | - | +| 507 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.33.0.5 - Peer: dc1-svc-leaf1a | NOT RUN | - | +| 508 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.33.0.6 - Peer: dc1-svc-leaf1b | NOT RUN | - | +| 509 | dc1-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.33.1.5 - Peer: dc1-svc-leaf1a | NOT RUN | - | +| 510 | dc1-leaf2a | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | - | NOT RUN | - | +| 511 | dc1-leaf2a | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | +| 512 | dc1-leaf2a | Security | VerifyAPIHttpStatus | Verifies if eAPI HTTP server is disabled globally. | - | NOT RUN | - | +| 513 | dc1-leaf2a | Security | VerifyAPIIPv4Acl | Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 514 | dc1-leaf2a | Security | VerifyAPIIPv6Acl | Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 515 | dc1-leaf2a | Security | VerifyAPISSLCertificate | Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size. | - | NOT RUN | - | +| 516 | dc1-leaf2a | Security | VerifyBannerLogin | Verifies the login banner of a device. | - | NOT RUN | - | +| 517 | dc1-leaf2a | Security | VerifyBannerMotd | Verifies the motd banner of a device. | - | NOT RUN | - | +| 518 | dc1-leaf2a | Security | VerifyIPSecConnHealth | Verifies all IPv4 security connections. | - | NOT RUN | - | +| 519 | dc1-leaf2a | Security | VerifyIPv4ACL | Verifies the configuration of IPv4 ACLs. | - | NOT RUN | - | +| 520 | dc1-leaf2a | Security | VerifySpecificIPSecConn | Verifies IPv4 security connections for a peer. | - | NOT RUN | - | +| 521 | dc1-leaf2a | Security | VerifySSHIPv4Acl | Verifies if the SSHD agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 522 | dc1-leaf2a | Security | VerifySSHIPv6Acl | Verifies if the SSHD agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 523 | dc1-leaf2a | Security | VerifySSHStatus | Verifies if the SSHD agent is disabled in the default VRF. | - | NOT RUN | - | +| 524 | dc1-leaf2a | Security | VerifyTelnetStatus | Verifies if Telnet is disabled in the default VRF. | - | NOT RUN | - | +| 525 | dc1-leaf2a | Services | VerifyDNSLookup | Verifies the DNS name to IP address resolution. | - | NOT RUN | - | +| 526 | dc1-leaf2a | Services | VerifyDNSServers | Verifies if the DNS servers are correctly configured. | - | NOT RUN | - | +| 527 | dc1-leaf2a | Services | VerifyErrdisableRecovery | Verifies the errdisable recovery reason, status, and interval. | - | NOT RUN | - | +| 528 | dc1-leaf2a | Services | VerifyHostname | Verifies the hostname of a device. | - | NOT RUN | - | +| 529 | dc1-leaf2a | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 530 | dc1-leaf2a | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 531 | dc1-leaf2a | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | +| 532 | dc1-leaf2a | Software | VerifyEOSExtensions | Verifies that all EOS extensions installed on the device are enabled for boot persistence. | - | NOT RUN | - | +| 533 | dc1-leaf2a | Software | VerifyEOSVersion | Verifies the EOS version of the device. | - | NOT RUN | - | +| 534 | dc1-leaf2a | Software | VerifyTerminAttrVersion | Verifies the TerminAttr version of the device. | - | NOT RUN | - | +| 535 | dc1-leaf2a | STUN | VerifyStunClient | Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided. | - | NOT RUN | - | +| 536 | dc1-leaf2a | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | +| 537 | dc1-leaf2a | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | +| 538 | dc1-leaf2a | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | +| 539 | dc1-leaf2a | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | +| 540 | dc1-leaf2a | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | +| 541 | dc1-leaf2a | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 542 | dc1-leaf2a | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 543 | dc1-leaf2a | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | +| 544 | dc1-leaf2a | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | +| 545 | dc1-leaf2a | VLAN | VerifyVlanInternalPolicy | Verifies the VLAN internal allocation policy and the range of VLANs. | - | NOT RUN | - | +| 546 | dc1-leaf2c | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 547 | dc1-leaf2c | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 548 | dc1-leaf2c | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | +| 549 | dc1-leaf2c | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | +| 550 | dc1-leaf2c | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | +| 551 | dc1-leaf2c | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | +| 552 | dc1-leaf2c | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | +| 553 | dc1-leaf2c | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | +| 554 | dc1-leaf2c | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | +| 555 | dc1-leaf2c | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc1-leaf2a Ethernet8 | NOT RUN | - | +| 556 | dc1-leaf2c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3) | NOT RUN | - | +| 557 | dc1-leaf2c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4) | NOT RUN | - | +| 558 | dc1-leaf2c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5) | NOT RUN | - | +| 559 | dc1-leaf2c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1) | NOT RUN | - | +| 560 | dc1-leaf2c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2) | NOT RUN | - | +| 561 | dc1-leaf2c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5) | NOT RUN | - | +| 562 | dc1-leaf2c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6) | NOT RUN | - | +| 563 | dc1-leaf2c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1) | NOT RUN | - | +| 564 | dc1-leaf2c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2) | NOT RUN | - | +| 565 | dc1-leaf2c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13) | NOT RUN | - | +| 566 | dc1-leaf2c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14) | NOT RUN | - | +| 567 | dc1-leaf2c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15) | NOT RUN | - | +| 568 | dc1-leaf2c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16) | NOT RUN | - | +| 569 | dc1-leaf2c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17) | NOT RUN | - | +| 570 | dc1-leaf2c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18) | NOT RUN | - | +| 571 | dc1-leaf2c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11) | NOT RUN | - | +| 572 | dc1-leaf2c | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12) | NOT RUN | - | +| 573 | dc1-leaf2c | Field Notices | VerifyFieldNotice44Resolution | Verifies that the device is using the correct Aboot version per FN0044. | - | NOT RUN | - | +| 574 | dc1-leaf2c | Field Notices | VerifyFieldNotice72Resolution | Verifies if the device is exposed to FN0072, and if the issue has been mitigated. | - | NOT RUN | - | +| 575 | dc1-leaf2c | Greent | VerifyGreenT | Verifies if a GreenT policy is created. | - | NOT RUN | - | +| 576 | dc1-leaf2c | Greent | VerifyGreenTCounters | Verifies if the GreenT counters are incremented. | - | NOT RUN | - | +| 577 | dc1-leaf2c | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches. | - | NOT RUN | - | +| 578 | dc1-leaf2c | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | +| 579 | dc1-leaf2c | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | +| 580 | dc1-leaf2c | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | +| 581 | dc1-leaf2c | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | +| 582 | dc1-leaf2c | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | +| 583 | dc1-leaf2c | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 584 | dc1-leaf2c | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 585 | dc1-leaf2c | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | +| 586 | dc1-leaf2c | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | +| 587 | dc1-leaf2c | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | +| 588 | dc1-leaf2c | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - DC1-LEAF2A_Ethernet8 = 'up' | NOT RUN | - | +| 589 | dc1-leaf2c | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - DC1-LEAF2B_Ethernet8 = 'adminDown' | NOT RUN | - | +| 590 | dc1-leaf2c | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet5 - dc1-leaf2-server1_iLO = 'up' | NOT RUN | - | +| 591 | dc1-leaf2c | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel1 - DC1_L3_LEAF2_Po8 = 'up' | NOT RUN | - | +| 592 | dc1-leaf2c | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4085 - L2LEAF_INBAND_MGMT = 'up' | NOT RUN | - | +| 593 | dc1-leaf2c | LANZ | VerifyLANZ | Verifies if LANZ is enabled. | - | NOT RUN | - | +| 594 | dc1-leaf2c | PTP | VerifyPtpGMStatus | Verifies that the device is locked to a valid PTP Grandmaster. | - | NOT RUN | - | +| 595 | dc1-leaf2c | PTP | VerifyPtpLockStatus | Verifies that the device was locked to the upstream PTP GM in the last minute. | - | NOT RUN | - | +| 596 | dc1-leaf2c | PTP | VerifyPtpModeStatus | Verifies that the device is configured as a PTP Boundary Clock. | - | NOT RUN | - | +| 597 | dc1-leaf2c | PTP | VerifyPtpOffset | Verifies that the PTP timing offset is within +/- 1000ns from the master clock. | - | NOT RUN | - | +| 598 | dc1-leaf2c | PTP | VerifyPtpPortModeStatus | Verifies the PTP interfaces state. | - | NOT RUN | - | +| 599 | dc1-leaf2c | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | - | NOT RUN | - | +| 600 | dc1-leaf2c | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | +| 601 | dc1-leaf2c | Security | VerifyAPIHttpStatus | Verifies if eAPI HTTP server is disabled globally. | - | NOT RUN | - | +| 602 | dc1-leaf2c | Security | VerifyAPIIPv4Acl | Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 603 | dc1-leaf2c | Security | VerifyAPIIPv6Acl | Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 604 | dc1-leaf2c | Security | VerifyAPISSLCertificate | Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size. | - | NOT RUN | - | +| 605 | dc1-leaf2c | Security | VerifyBannerLogin | Verifies the login banner of a device. | - | NOT RUN | - | +| 606 | dc1-leaf2c | Security | VerifyBannerMotd | Verifies the motd banner of a device. | - | NOT RUN | - | +| 607 | dc1-leaf2c | Security | VerifyIPSecConnHealth | Verifies all IPv4 security connections. | - | NOT RUN | - | +| 608 | dc1-leaf2c | Security | VerifyIPv4ACL | Verifies the configuration of IPv4 ACLs. | - | NOT RUN | - | +| 609 | dc1-leaf2c | Security | VerifySpecificIPSecConn | Verifies IPv4 security connections for a peer. | - | NOT RUN | - | +| 610 | dc1-leaf2c | Security | VerifySSHIPv4Acl | Verifies if the SSHD agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 611 | dc1-leaf2c | Security | VerifySSHIPv6Acl | Verifies if the SSHD agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 612 | dc1-leaf2c | Security | VerifySSHStatus | Verifies if the SSHD agent is disabled in the default VRF. | - | NOT RUN | - | +| 613 | dc1-leaf2c | Security | VerifyTelnetStatus | Verifies if Telnet is disabled in the default VRF. | - | NOT RUN | - | +| 614 | dc1-leaf2c | Services | VerifyDNSLookup | Verifies the DNS name to IP address resolution. | - | NOT RUN | - | +| 615 | dc1-leaf2c | Services | VerifyDNSServers | Verifies if the DNS servers are correctly configured. | - | NOT RUN | - | +| 616 | dc1-leaf2c | Services | VerifyErrdisableRecovery | Verifies the errdisable recovery reason, status, and interval. | - | NOT RUN | - | +| 617 | dc1-leaf2c | Services | VerifyHostname | Verifies the hostname of a device. | - | NOT RUN | - | +| 618 | dc1-leaf2c | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 619 | dc1-leaf2c | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 620 | dc1-leaf2c | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | +| 621 | dc1-leaf2c | Software | VerifyEOSVersion | Verifies the EOS version of the device. | - | NOT RUN | - | +| 622 | dc1-leaf2c | Software | VerifyTerminAttrVersion | Verifies the TerminAttr version of the device. | - | NOT RUN | - | +| 623 | dc1-leaf2c | STUN | VerifyStunClient | Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided. | - | NOT RUN | - | +| 624 | dc1-leaf2c | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | +| 625 | dc1-leaf2c | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | +| 626 | dc1-leaf2c | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | +| 627 | dc1-leaf2c | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | +| 628 | dc1-leaf2c | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | +| 629 | dc1-leaf2c | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 630 | dc1-leaf2c | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 631 | dc1-leaf2c | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | +| 632 | dc1-leaf2c | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | +| 633 | dc1-leaf2c | VLAN | VerifyVlanInternalPolicy | Verifies the VLAN internal allocation policy and the range of VLANs. | - | NOT RUN | - | +| 634 | dc1-spine1 | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 635 | dc1-spine1 | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 636 | dc1-spine1 | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | +| 637 | dc1-spine1 | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | +| 638 | dc1-spine1 | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | +| 639 | dc1-spine1 | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | +| 640 | dc1-spine1 | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | +| 641 | dc1-spine1 | BFD | VerifyBFDPeersHealth | Verifies the health of all IPv4 BFD peers. | - | NOT RUN | - | +| 642 | dc1-spine1 | BFD | VerifyBFDPeersIntervals | Verifies the timers of the IPv4 BFD peers in the specified VRF. | - | NOT RUN | - | +| 643 | dc1-spine1 | BFD | VerifyBFDSpecificPeers | Verifies the IPv4 BFD peer's sessions and remote disc in the specified VRF. | - | NOT RUN | - | +| 644 | dc1-spine1 | BGP | VerifyBGPAdvCommunities | Verifies the advertised communities of a BGP peer. | - | NOT RUN | - | +| 645 | dc1-spine1 | BGP | VerifyBGPExchangedRoutes | Verifies the advertised and received routes of BGP peers. | - | NOT RUN | - | +| 646 | dc1-spine1 | BGP | VerifyBGPPeerASNCap | Verifies the four octet asn capabilities of a BGP peer. | - | NOT RUN | - | +| 647 | dc1-spine1 | BGP | VerifyBGPPeerCount | Verifies the count of BGP peers. | - | NOT RUN | - | +| 648 | dc1-spine1 | BGP | VerifyBGPPeerMD5Auth | Verifies the MD5 authentication and state of a BGP peer. | - | NOT RUN | - | +| 649 | dc1-spine1 | BGP | VerifyBGPPeerMPCaps | Verifies the multiprotocol capabilities of a BGP peer. | - | NOT RUN | - | +| 650 | dc1-spine1 | BGP | VerifyBGPPeerRouteRefreshCap | Verifies the route refresh capabilities of a BGP peer. | - | NOT RUN | - | +| 651 | dc1-spine1 | BGP | VerifyBGPPeersHealth | Verifies the health of BGP peers | - | NOT RUN | - | +| 652 | dc1-spine1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | - | NOT RUN | - | +| 653 | dc1-spine1 | BGP | VerifyBGPTimers | Verifies the timers of a BGP peer. | - | NOT RUN | - | +| 654 | dc1-spine1 | BGP | VerifyEVPNType2Route | Verifies the EVPN Type-2 routes for a given IPv4 or MAC address and VNI. | - | NOT RUN | - | +| 655 | dc1-spine1 | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | +| 656 | dc1-spine1 | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | +| 657 | dc1-spine1 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc1-leaf1a Ethernet1 | NOT RUN | - | +| 658 | dc1-spine1 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc1-leaf1b Ethernet1 | NOT RUN | - | +| 659 | dc1-spine1 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet3 - Remote: dc1-leaf2a Ethernet1 | NOT RUN | - | +| 660 | dc1-spine1 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet5 - Remote: dc1-svc-leaf1a Ethernet1 | NOT RUN | - | +| 661 | dc1-spine1 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet6 - Remote: dc1-svc-leaf1b Ethernet1 | NOT RUN | - | +| 662 | dc1-spine1 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet1 (IP: 10.255.255.0) - Destination: dc1-leaf1a Ethernet1 (IP: 10.255.255.1) | NOT RUN | - | +| 663 | dc1-spine1 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet2 (IP: 10.255.255.4) - Destination: dc1-leaf1b Ethernet1 (IP: 10.255.255.5) | NOT RUN | - | +| 664 | dc1-spine1 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet3 (IP: 10.255.255.8) - Destination: dc1-leaf2a Ethernet1 (IP: 10.255.255.9) | NOT RUN | - | +| 665 | dc1-spine1 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet5 (IP: 10.33.255.16) - Destination: dc1-svc-leaf1a Ethernet1 (IP: 10.33.255.17) | NOT RUN | - | +| 666 | dc1-spine1 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet6 (IP: 10.33.255.20) - Destination: dc1-svc-leaf1b Ethernet1 (IP: 10.33.255.21) | NOT RUN | - | +| 667 | dc1-spine1 | Field Notices | VerifyFieldNotice44Resolution | Verifies that the device is using the correct Aboot version per FN0044. | - | NOT RUN | - | +| 668 | dc1-spine1 | Field Notices | VerifyFieldNotice72Resolution | Verifies if the device is exposed to FN0072, and if the issue has been mitigated. | - | NOT RUN | - | +| 669 | dc1-spine1 | Greent | VerifyGreenT | Verifies if a GreenT policy is created. | - | NOT RUN | - | +| 670 | dc1-spine1 | Greent | VerifyGreenTCounters | Verifies if the GreenT counters are incremented. | - | NOT RUN | - | +| 671 | dc1-spine1 | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches. | - | NOT RUN | - | +| 672 | dc1-spine1 | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | +| 673 | dc1-spine1 | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | +| 674 | dc1-spine1 | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | +| 675 | dc1-spine1 | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | +| 676 | dc1-spine1 | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | +| 677 | dc1-spine1 | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 678 | dc1-spine1 | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 679 | dc1-spine1 | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | +| 680 | dc1-spine1 | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | +| 681 | dc1-spine1 | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | +| 682 | dc1-spine1 | Interfaces | VerifyIllegalLACP | Verifies there are no illegal LACP packets in all port channels. | - | NOT RUN | - | +| 683 | dc1-spine1 | Interfaces | VerifyInterfaceDiscards | Verifies there are no interface discard counters. | - | NOT RUN | - | +| 684 | dc1-spine1 | Interfaces | VerifyInterfaceErrDisabled | Verifies there are no interfaces in the errdisabled state. | - | NOT RUN | - | +| 685 | dc1-spine1 | Interfaces | VerifyInterfaceErrors | Verifies there are no interface error counters. | - | NOT RUN | - | +| 686 | dc1-spine1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | - | NOT RUN | - | +| 687 | dc1-spine1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - P2P_LINK_TO_DC1-LEAF1A_Ethernet1 = 'up' | NOT RUN | - | +| 688 | dc1-spine1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - P2P_LINK_TO_DC1-LEAF1B_Ethernet1 = 'up' | NOT RUN | - | +| 689 | dc1-spine1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet3 - P2P_LINK_TO_DC1-LEAF2A_Ethernet1 = 'up' | NOT RUN | - | +| 690 | dc1-spine1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet4 - P2P_LINK_TO_DC1-LEAF2B_Ethernet1 = 'adminDown' | NOT RUN | - | +| 691 | dc1-spine1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet5 - P2P_LINK_TO_DC1-SVC-LEAF1A_Ethernet1 = 'up' | NOT RUN | - | +| 692 | dc1-spine1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet6 - P2P_LINK_TO_DC1-SVC-LEAF1B_Ethernet1 = 'up' | NOT RUN | - | +| 693 | dc1-spine1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback0 - EVPN_Overlay_Peering = 'up' | NOT RUN | - | +| 694 | dc1-spine1 | Interfaces | VerifyInterfaceUtilization | Verifies that the utilization of interfaces is below a certain threshold. | - | NOT RUN | - | +| 695 | dc1-spine1 | Interfaces | VerifyIPProxyARP | Verifies if Proxy ARP is enabled. | - | NOT RUN | - | +| 696 | dc1-spine1 | Interfaces | VerifyL2MTU | Verifies the global L2 MTU of all L2 interfaces. | - | NOT RUN | - | +| 697 | dc1-spine1 | Interfaces | VerifyL3MTU | Verifies the global L3 MTU of all L3 interfaces. | - | NOT RUN | - | +| 698 | dc1-spine1 | Interfaces | VerifyLoopbackCount | Verifies the number of loopback interfaces and their status. | - | NOT RUN | - | +| 699 | dc1-spine1 | Interfaces | VerifyPortChannels | Verifies there are no inactive ports in all port channels. | - | NOT RUN | - | +| 700 | dc1-spine1 | Interfaces | VerifyStormControlDrops | Verifies there are no interface storm-control drop counters. | - | NOT RUN | - | +| 701 | dc1-spine1 | Interfaces | VerifySVI | Verifies the status of all SVIs. | - | NOT RUN | - | +| 702 | dc1-spine1 | LANZ | VerifyLANZ | Verifies if LANZ is enabled. | - | NOT RUN | - | +| 703 | dc1-spine1 | OSPF | VerifyOSPFMaxLSA | Verifies all OSPF instances did not cross the maximum LSA threshold. | - | NOT RUN | - | +| 704 | dc1-spine1 | OSPF | VerifyOSPFNeighborCount | Verifies the number of OSPF neighbors in FULL state is the one we expect. | - | NOT RUN | - | +| 705 | dc1-spine1 | OSPF | VerifyOSPFNeighborState | Verifies all OSPF neighbors are in FULL state. | - | NOT RUN | - | +| 706 | dc1-spine1 | PTP | VerifyPtpGMStatus | Verifies that the device is locked to a valid PTP Grandmaster. | - | NOT RUN | - | +| 707 | dc1-spine1 | PTP | VerifyPtpLockStatus | Verifies that the device was locked to the upstream PTP GM in the last minute. | - | NOT RUN | - | +| 708 | dc1-spine1 | PTP | VerifyPtpModeStatus | Verifies that the device is configured as a PTP Boundary Clock. | - | NOT RUN | - | +| 709 | dc1-spine1 | PTP | VerifyPtpOffset | Verifies that the PTP timing offset is within +/- 1000ns from the master clock. | - | NOT RUN | - | +| 710 | dc1-spine1 | PTP | VerifyPtpPortModeStatus | Verifies the PTP interfaces state. | - | NOT RUN | - | +| 711 | dc1-spine1 | Routing | VerifyRoutingProtocolModel | Verifies the configured routing protocol model. | - | NOT RUN | - | +| 712 | dc1-spine1 | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | - | NOT RUN | - | +| 713 | dc1-spine1 | Routing | VerifyRoutingTableSize | Verifies the size of the IP routing table of the default VRF. | - | NOT RUN | - | +| 714 | dc1-spine1 | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | - | NOT RUN | - | +| 715 | dc1-spine1 | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | +| 716 | dc1-spine1 | Security | VerifyAPIHttpStatus | Verifies if eAPI HTTP server is disabled globally. | - | NOT RUN | - | +| 717 | dc1-spine1 | Security | VerifyAPIIPv4Acl | Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 718 | dc1-spine1 | Security | VerifyAPIIPv6Acl | Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 719 | dc1-spine1 | Security | VerifyAPISSLCertificate | Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size. | - | NOT RUN | - | +| 720 | dc1-spine1 | Security | VerifyBannerLogin | Verifies the login banner of a device. | - | NOT RUN | - | +| 721 | dc1-spine1 | Security | VerifyBannerMotd | Verifies the motd banner of a device. | - | NOT RUN | - | +| 722 | dc1-spine1 | Security | VerifyIPSecConnHealth | Verifies all IPv4 security connections. | - | NOT RUN | - | +| 723 | dc1-spine1 | Security | VerifyIPv4ACL | Verifies the configuration of IPv4 ACLs. | - | NOT RUN | - | +| 724 | dc1-spine1 | Security | VerifySpecificIPSecConn | Verifies IPv4 security connections for a peer. | - | NOT RUN | - | +| 725 | dc1-spine1 | Security | VerifySSHIPv4Acl | Verifies if the SSHD agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 726 | dc1-spine1 | Security | VerifySSHIPv6Acl | Verifies if the SSHD agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 727 | dc1-spine1 | Security | VerifySSHStatus | Verifies if the SSHD agent is disabled in the default VRF. | - | NOT RUN | - | +| 728 | dc1-spine1 | Security | VerifyTelnetStatus | Verifies if Telnet is disabled in the default VRF. | - | NOT RUN | - | +| 729 | dc1-spine1 | Services | VerifyDNSLookup | Verifies the DNS name to IP address resolution. | - | NOT RUN | - | +| 730 | dc1-spine1 | Services | VerifyDNSServers | Verifies if the DNS servers are correctly configured. | - | NOT RUN | - | +| 731 | dc1-spine1 | Services | VerifyErrdisableRecovery | Verifies the errdisable recovery reason, status, and interval. | - | NOT RUN | - | +| 732 | dc1-spine1 | Services | VerifyHostname | Verifies the hostname of a device. | - | NOT RUN | - | +| 733 | dc1-spine1 | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 734 | dc1-spine1 | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 735 | dc1-spine1 | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | +| 736 | dc1-spine1 | Software | VerifyEOSVersion | Verifies the EOS version of the device. | - | NOT RUN | - | +| 737 | dc1-spine1 | Software | VerifyTerminAttrVersion | Verifies the TerminAttr version of the device. | - | NOT RUN | - | +| 738 | dc1-spine1 | STUN | VerifyStunClient | Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided. | - | NOT RUN | - | +| 739 | dc1-spine1 | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | +| 740 | dc1-spine1 | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | +| 741 | dc1-spine1 | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | +| 742 | dc1-spine1 | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | +| 743 | dc1-spine1 | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | +| 744 | dc1-spine1 | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 745 | dc1-spine1 | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 746 | dc1-spine1 | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | +| 747 | dc1-spine1 | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | +| 748 | dc1-spine1 | VLAN | VerifyVlanInternalPolicy | Verifies the VLAN internal allocation policy and the range of VLANs. | - | NOT RUN | - | +| 749 | dc1-spine2 | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 750 | dc1-spine2 | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 751 | dc1-spine2 | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | +| 752 | dc1-spine2 | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | +| 753 | dc1-spine2 | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | +| 754 | dc1-spine2 | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | +| 755 | dc1-spine2 | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | +| 756 | dc1-spine2 | BFD | VerifyBFDPeersHealth | Verifies the health of all IPv4 BFD peers. | - | NOT RUN | - | +| 757 | dc1-spine2 | BFD | VerifyBFDPeersIntervals | Verifies the timers of the IPv4 BFD peers in the specified VRF. | - | NOT RUN | - | +| 758 | dc1-spine2 | BFD | VerifyBFDSpecificPeers | Verifies the IPv4 BFD peer's sessions and remote disc in the specified VRF. | - | NOT RUN | - | +| 759 | dc1-spine2 | BGP | VerifyBGPAdvCommunities | Verifies the advertised communities of a BGP peer. | - | NOT RUN | - | +| 760 | dc1-spine2 | BGP | VerifyBGPExchangedRoutes | Verifies the advertised and received routes of BGP peers. | - | NOT RUN | - | +| 761 | dc1-spine2 | BGP | VerifyBGPPeerASNCap | Verifies the four octet asn capabilities of a BGP peer. | - | NOT RUN | - | +| 762 | dc1-spine2 | BGP | VerifyBGPPeerCount | Verifies the count of BGP peers. | - | NOT RUN | - | +| 763 | dc1-spine2 | BGP | VerifyBGPPeerMD5Auth | Verifies the MD5 authentication and state of a BGP peer. | - | NOT RUN | - | +| 764 | dc1-spine2 | BGP | VerifyBGPPeerMPCaps | Verifies the multiprotocol capabilities of a BGP peer. | - | NOT RUN | - | +| 765 | dc1-spine2 | BGP | VerifyBGPPeerRouteRefreshCap | Verifies the route refresh capabilities of a BGP peer. | - | NOT RUN | - | +| 766 | dc1-spine2 | BGP | VerifyBGPPeersHealth | Verifies the health of BGP peers | - | NOT RUN | - | +| 767 | dc1-spine2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | - | NOT RUN | - | +| 768 | dc1-spine2 | BGP | VerifyBGPTimers | Verifies the timers of a BGP peer. | - | NOT RUN | - | +| 769 | dc1-spine2 | BGP | VerifyEVPNType2Route | Verifies the EVPN Type-2 routes for a given IPv4 or MAC address and VNI. | - | NOT RUN | - | +| 770 | dc1-spine2 | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | +| 771 | dc1-spine2 | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | +| 772 | dc1-spine2 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc1-leaf1a Ethernet2 | NOT RUN | - | +| 773 | dc1-spine2 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc1-leaf1b Ethernet2 | NOT RUN | - | +| 774 | dc1-spine2 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet3 - Remote: dc1-leaf2a Ethernet2 | NOT RUN | - | +| 775 | dc1-spine2 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet5 - Remote: dc1-svc-leaf1a Ethernet2 | NOT RUN | - | +| 776 | dc1-spine2 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet6 - Remote: dc1-svc-leaf1b Ethernet2 | NOT RUN | - | +| 777 | dc1-spine2 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet1 (IP: 10.255.255.2) - Destination: dc1-leaf1a Ethernet2 (IP: 10.255.255.3) | NOT RUN | - | +| 778 | dc1-spine2 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet2 (IP: 10.255.255.6) - Destination: dc1-leaf1b Ethernet2 (IP: 10.255.255.7) | NOT RUN | - | +| 779 | dc1-spine2 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet3 (IP: 10.255.255.10) - Destination: dc1-leaf2a Ethernet2 (IP: 10.255.255.11) | NOT RUN | - | +| 780 | dc1-spine2 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet5 (IP: 10.33.255.18) - Destination: dc1-svc-leaf1a Ethernet2 (IP: 10.33.255.19) | NOT RUN | - | +| 781 | dc1-spine2 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet6 (IP: 10.33.255.22) - Destination: dc1-svc-leaf1b Ethernet2 (IP: 10.33.255.23) | NOT RUN | - | +| 782 | dc1-spine2 | Field Notices | VerifyFieldNotice44Resolution | Verifies that the device is using the correct Aboot version per FN0044. | - | NOT RUN | - | +| 783 | dc1-spine2 | Field Notices | VerifyFieldNotice72Resolution | Verifies if the device is exposed to FN0072, and if the issue has been mitigated. | - | NOT RUN | - | +| 784 | dc1-spine2 | Greent | VerifyGreenT | Verifies if a GreenT policy is created. | - | NOT RUN | - | +| 785 | dc1-spine2 | Greent | VerifyGreenTCounters | Verifies if the GreenT counters are incremented. | - | NOT RUN | - | +| 786 | dc1-spine2 | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches. | - | NOT RUN | - | +| 787 | dc1-spine2 | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | +| 788 | dc1-spine2 | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | +| 789 | dc1-spine2 | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | +| 790 | dc1-spine2 | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | +| 791 | dc1-spine2 | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | +| 792 | dc1-spine2 | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 793 | dc1-spine2 | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 794 | dc1-spine2 | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | +| 795 | dc1-spine2 | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | +| 796 | dc1-spine2 | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | +| 797 | dc1-spine2 | Interfaces | VerifyIllegalLACP | Verifies there are no illegal LACP packets in all port channels. | - | NOT RUN | - | +| 798 | dc1-spine2 | Interfaces | VerifyInterfaceDiscards | Verifies there are no interface discard counters. | - | NOT RUN | - | +| 799 | dc1-spine2 | Interfaces | VerifyInterfaceErrDisabled | Verifies there are no interfaces in the errdisabled state. | - | NOT RUN | - | +| 800 | dc1-spine2 | Interfaces | VerifyInterfaceErrors | Verifies there are no interface error counters. | - | NOT RUN | - | +| 801 | dc1-spine2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | - | NOT RUN | - | +| 802 | dc1-spine2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - P2P_LINK_TO_DC1-LEAF1A_Ethernet2 = 'up' | NOT RUN | - | +| 803 | dc1-spine2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - P2P_LINK_TO_DC1-LEAF1B_Ethernet2 = 'up' | NOT RUN | - | +| 804 | dc1-spine2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet3 - P2P_LINK_TO_DC1-LEAF2A_Ethernet2 = 'up' | NOT RUN | - | +| 805 | dc1-spine2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet4 - P2P_LINK_TO_DC1-LEAF2B_Ethernet2 = 'adminDown' | NOT RUN | - | +| 806 | dc1-spine2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet5 - P2P_LINK_TO_DC1-SVC-LEAF1A_Ethernet2 = 'up' | NOT RUN | - | +| 807 | dc1-spine2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet6 - P2P_LINK_TO_DC1-SVC-LEAF1B_Ethernet2 = 'up' | NOT RUN | - | +| 808 | dc1-spine2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback0 - EVPN_Overlay_Peering = 'up' | NOT RUN | - | +| 809 | dc1-spine2 | Interfaces | VerifyInterfaceUtilization | Verifies that the utilization of interfaces is below a certain threshold. | - | NOT RUN | - | +| 810 | dc1-spine2 | Interfaces | VerifyIPProxyARP | Verifies if Proxy ARP is enabled. | - | NOT RUN | - | +| 811 | dc1-spine2 | Interfaces | VerifyL2MTU | Verifies the global L2 MTU of all L2 interfaces. | - | NOT RUN | - | +| 812 | dc1-spine2 | Interfaces | VerifyL3MTU | Verifies the global L3 MTU of all L3 interfaces. | - | NOT RUN | - | +| 813 | dc1-spine2 | Interfaces | VerifyLoopbackCount | Verifies the number of loopback interfaces and their status. | - | NOT RUN | - | +| 814 | dc1-spine2 | Interfaces | VerifyPortChannels | Verifies there are no inactive ports in all port channels. | - | NOT RUN | - | +| 815 | dc1-spine2 | Interfaces | VerifyStormControlDrops | Verifies there are no interface storm-control drop counters. | - | NOT RUN | - | +| 816 | dc1-spine2 | Interfaces | VerifySVI | Verifies the status of all SVIs. | - | NOT RUN | - | +| 817 | dc1-spine2 | LANZ | VerifyLANZ | Verifies if LANZ is enabled. | - | NOT RUN | - | +| 818 | dc1-spine2 | OSPF | VerifyOSPFMaxLSA | Verifies all OSPF instances did not cross the maximum LSA threshold. | - | NOT RUN | - | +| 819 | dc1-spine2 | OSPF | VerifyOSPFNeighborCount | Verifies the number of OSPF neighbors in FULL state is the one we expect. | - | NOT RUN | - | +| 820 | dc1-spine2 | OSPF | VerifyOSPFNeighborState | Verifies all OSPF neighbors are in FULL state. | - | NOT RUN | - | +| 821 | dc1-spine2 | PTP | VerifyPtpGMStatus | Verifies that the device is locked to a valid PTP Grandmaster. | - | NOT RUN | - | +| 822 | dc1-spine2 | PTP | VerifyPtpLockStatus | Verifies that the device was locked to the upstream PTP GM in the last minute. | - | NOT RUN | - | +| 823 | dc1-spine2 | PTP | VerifyPtpModeStatus | Verifies that the device is configured as a PTP Boundary Clock. | - | NOT RUN | - | +| 824 | dc1-spine2 | PTP | VerifyPtpOffset | Verifies that the PTP timing offset is within +/- 1000ns from the master clock. | - | NOT RUN | - | +| 825 | dc1-spine2 | PTP | VerifyPtpPortModeStatus | Verifies the PTP interfaces state. | - | NOT RUN | - | +| 826 | dc1-spine2 | Routing | VerifyRoutingProtocolModel | Verifies the configured routing protocol model. | - | NOT RUN | - | +| 827 | dc1-spine2 | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | - | NOT RUN | - | +| 828 | dc1-spine2 | Routing | VerifyRoutingTableSize | Verifies the size of the IP routing table of the default VRF. | - | NOT RUN | - | +| 829 | dc1-spine2 | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | - | NOT RUN | - | +| 830 | dc1-spine2 | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | +| 831 | dc1-spine2 | Security | VerifyAPIHttpStatus | Verifies if eAPI HTTP server is disabled globally. | - | NOT RUN | - | +| 832 | dc1-spine2 | Security | VerifyAPIIPv4Acl | Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 833 | dc1-spine2 | Security | VerifyAPIIPv6Acl | Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 834 | dc1-spine2 | Security | VerifyAPISSLCertificate | Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size. | - | NOT RUN | - | +| 835 | dc1-spine2 | Security | VerifyBannerLogin | Verifies the login banner of a device. | - | NOT RUN | - | +| 836 | dc1-spine2 | Security | VerifyBannerMotd | Verifies the motd banner of a device. | - | NOT RUN | - | +| 837 | dc1-spine2 | Security | VerifyIPSecConnHealth | Verifies all IPv4 security connections. | - | NOT RUN | - | +| 838 | dc1-spine2 | Security | VerifyIPv4ACL | Verifies the configuration of IPv4 ACLs. | - | NOT RUN | - | +| 839 | dc1-spine2 | Security | VerifySpecificIPSecConn | Verifies IPv4 security connections for a peer. | - | NOT RUN | - | +| 840 | dc1-spine2 | Security | VerifySSHIPv4Acl | Verifies if the SSHD agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 841 | dc1-spine2 | Security | VerifySSHIPv6Acl | Verifies if the SSHD agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 842 | dc1-spine2 | Security | VerifySSHStatus | Verifies if the SSHD agent is disabled in the default VRF. | - | NOT RUN | - | +| 843 | dc1-spine2 | Security | VerifyTelnetStatus | Verifies if Telnet is disabled in the default VRF. | - | NOT RUN | - | +| 844 | dc1-spine2 | Services | VerifyDNSLookup | Verifies the DNS name to IP address resolution. | - | NOT RUN | - | +| 845 | dc1-spine2 | Services | VerifyDNSServers | Verifies if the DNS servers are correctly configured. | - | NOT RUN | - | +| 846 | dc1-spine2 | Services | VerifyErrdisableRecovery | Verifies the errdisable recovery reason, status, and interval. | - | NOT RUN | - | +| 847 | dc1-spine2 | Services | VerifyHostname | Verifies the hostname of a device. | - | NOT RUN | - | +| 848 | dc1-spine2 | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 849 | dc1-spine2 | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 850 | dc1-spine2 | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | +| 851 | dc1-spine2 | Software | VerifyEOSVersion | Verifies the EOS version of the device. | - | NOT RUN | - | +| 852 | dc1-spine2 | Software | VerifyTerminAttrVersion | Verifies the TerminAttr version of the device. | - | NOT RUN | - | +| 853 | dc1-spine2 | STUN | VerifyStunClient | Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided. | - | NOT RUN | - | +| 854 | dc1-spine2 | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | +| 855 | dc1-spine2 | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | +| 856 | dc1-spine2 | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | +| 857 | dc1-spine2 | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | +| 858 | dc1-spine2 | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | +| 859 | dc1-spine2 | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 860 | dc1-spine2 | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 861 | dc1-spine2 | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | +| 862 | dc1-spine2 | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | +| 863 | dc1-spine2 | VLAN | VerifyVlanInternalPolicy | Verifies the VLAN internal allocation policy and the range of VLANs. | - | NOT RUN | - | +| 864 | dc1-svc-leaf1a | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 865 | dc1-svc-leaf1a | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 866 | dc1-svc-leaf1a | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | +| 867 | dc1-svc-leaf1a | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | +| 868 | dc1-svc-leaf1a | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | +| 869 | dc1-svc-leaf1a | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | +| 870 | dc1-svc-leaf1a | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | +| 871 | dc1-svc-leaf1a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc1-spine1 (IP: 10.255.0.1) | NOT RUN | - | +| 872 | dc1-svc-leaf1a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc1-spine2 (IP: 10.255.0.2) | NOT RUN | - | +| 873 | dc1-svc-leaf1a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-spine1 (IP: 10.33.255.16) | NOT RUN | - | +| 874 | dc1-svc-leaf1a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-spine2 (IP: 10.33.255.18) | NOT RUN | - | +| 875 | dc1-svc-leaf1a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-svc-leaf1b (IP: 10.33.1.105) | NOT RUN | - | +| 876 | dc1-svc-leaf1a | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | +| 877 | dc1-svc-leaf1a | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | +| 878 | dc1-svc-leaf1a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc1-spine1 Ethernet5 | NOT RUN | - | +| 879 | dc1-svc-leaf1a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc1-spine2 Ethernet5 | NOT RUN | - | +| 880 | dc1-svc-leaf1a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet3 - Remote: dc1-svc-leaf1b Ethernet3 | NOT RUN | - | +| 881 | dc1-svc-leaf1a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet4 - Remote: dc1-svc-leaf1b Ethernet4 | NOT RUN | - | +| 882 | dc1-svc-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.33.0.5) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3) | NOT RUN | - | +| 883 | dc1-svc-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.33.0.5) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4) | NOT RUN | - | +| 884 | dc1-svc-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.33.0.5) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5) | NOT RUN | - | +| 885 | dc1-svc-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.33.0.5) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1) | NOT RUN | - | +| 886 | dc1-svc-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.33.0.5) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2) | NOT RUN | - | +| 887 | dc1-svc-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.33.0.5) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5) | NOT RUN | - | +| 888 | dc1-svc-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.33.0.5) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6) | NOT RUN | - | +| 889 | dc1-svc-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.33.0.5) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1) | NOT RUN | - | +| 890 | dc1-svc-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.33.0.5) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2) | NOT RUN | - | +| 891 | dc1-svc-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.33.0.5) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13) | NOT RUN | - | +| 892 | dc1-svc-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.33.0.5) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14) | NOT RUN | - | +| 893 | dc1-svc-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.33.0.5) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15) | NOT RUN | - | +| 894 | dc1-svc-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.33.0.5) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16) | NOT RUN | - | +| 895 | dc1-svc-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.33.0.5) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17) | NOT RUN | - | +| 896 | dc1-svc-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.33.0.5) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18) | NOT RUN | - | +| 897 | dc1-svc-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.33.0.5) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11) | NOT RUN | - | +| 898 | dc1-svc-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.33.0.5) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12) | NOT RUN | - | +| 899 | dc1-svc-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet1 (IP: 10.33.255.17) - Destination: dc1-spine1 Ethernet5 (IP: 10.33.255.16) | NOT RUN | - | +| 900 | dc1-svc-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet2 (IP: 10.33.255.19) - Destination: dc1-spine2 Ethernet5 (IP: 10.33.255.18) | NOT RUN | - | +| 901 | dc1-svc-leaf1a | Field Notices | VerifyFieldNotice44Resolution | Verifies that the device is using the correct Aboot version per FN0044. | - | NOT RUN | - | +| 902 | dc1-svc-leaf1a | Field Notices | VerifyFieldNotice72Resolution | Verifies if the device is exposed to FN0072, and if the issue has been mitigated. | - | NOT RUN | - | +| 903 | dc1-svc-leaf1a | Greent | VerifyGreenT | Verifies if a GreenT policy is created. | - | NOT RUN | - | +| 904 | dc1-svc-leaf1a | Greent | VerifyGreenTCounters | Verifies if the GreenT counters are incremented. | - | NOT RUN | - | +| 905 | dc1-svc-leaf1a | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches. | - | NOT RUN | - | +| 906 | dc1-svc-leaf1a | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | +| 907 | dc1-svc-leaf1a | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | +| 908 | dc1-svc-leaf1a | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | +| 909 | dc1-svc-leaf1a | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | +| 910 | dc1-svc-leaf1a | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | +| 911 | dc1-svc-leaf1a | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 912 | dc1-svc-leaf1a | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 913 | dc1-svc-leaf1a | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | +| 914 | dc1-svc-leaf1a | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | +| 915 | dc1-svc-leaf1a | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | +| 916 | dc1-svc-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - P2P_LINK_TO_DC1-SPINE1_Ethernet5 = 'up' | NOT RUN | - | +| 917 | dc1-svc-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - P2P_LINK_TO_DC1-SPINE2_Ethernet5 = 'up' | NOT RUN | - | +| 918 | dc1-svc-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet3 - MLAG_PEER_dc1-svc-leaf1b_Ethernet3 = 'up' | NOT RUN | - | +| 919 | dc1-svc-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet4 - MLAG_PEER_dc1-svc-leaf1b_Ethernet4 = 'up' | NOT RUN | - | +| 920 | dc1-svc-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback0 - EVPN_Overlay_Peering = 'up' | NOT RUN | - | +| 921 | dc1-svc-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up' | NOT RUN | - | +| 922 | dc1-svc-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel3 - MLAG_PEER_dc1-svc-leaf1b_Po3 = 'up' | NOT RUN | - | +| 923 | dc1-svc-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up' | NOT RUN | - | +| 924 | dc1-svc-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4094 - MLAG_PEER = 'up' | NOT RUN | - | +| 925 | dc1-svc-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vxlan1 = 'up' | NOT RUN | - | +| 926 | dc1-svc-leaf1a | LANZ | VerifyLANZ | Verifies if LANZ is enabled. | - | NOT RUN | - | +| 927 | dc1-svc-leaf1a | MLAG | VerifyMlagStatus | Verifies the health status of the MLAG configuration. | - | NOT RUN | - | +| 928 | dc1-svc-leaf1a | PTP | VerifyPtpGMStatus | Verifies that the device is locked to a valid PTP Grandmaster. | - | NOT RUN | - | +| 929 | dc1-svc-leaf1a | PTP | VerifyPtpLockStatus | Verifies that the device was locked to the upstream PTP GM in the last minute. | - | NOT RUN | - | +| 930 | dc1-svc-leaf1a | PTP | VerifyPtpModeStatus | Verifies that the device is configured as a PTP Boundary Clock. | - | NOT RUN | - | +| 931 | dc1-svc-leaf1a | PTP | VerifyPtpOffset | Verifies that the PTP timing offset is within +/- 1000ns from the master clock. | - | NOT RUN | - | +| 932 | dc1-svc-leaf1a | PTP | VerifyPtpPortModeStatus | Verifies the PTP interfaces state. | - | NOT RUN | - | +| 933 | dc1-svc-leaf1a | Routing | VerifyRoutingProtocolModel | Verifies the configured routing protocol model. | Routing protocol model: multi-agent | NOT RUN | - | +| 934 | dc1-svc-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.1 - Peer: dc1-spine1 | NOT RUN | - | +| 935 | dc1-svc-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.2 - Peer: dc1-spine2 | NOT RUN | - | +| 936 | dc1-svc-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.3 - Peer: dc1-leaf1a | NOT RUN | - | +| 937 | dc1-svc-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.4 - Peer: dc1-leaf1b | NOT RUN | - | +| 938 | dc1-svc-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.5 - Peer: dc1-leaf2a | NOT RUN | - | +| 939 | dc1-svc-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.3 - Peer: dc1-leaf1a | NOT RUN | - | +| 940 | dc1-svc-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.5 - Peer: dc1-leaf2a | NOT RUN | - | +| 941 | dc1-svc-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.11 - Peer: dc2-spine1 | NOT RUN | - | +| 942 | dc1-svc-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.12 - Peer: dc2-spine2 | NOT RUN | - | +| 943 | dc1-svc-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.13 - Peer: dc2-leaf1a | NOT RUN | - | +| 944 | dc1-svc-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.14 - Peer: dc2-leaf1b | NOT RUN | - | +| 945 | dc1-svc-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.15 - Peer: dc2-leaf2a | NOT RUN | - | +| 946 | dc1-svc-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.16 - Peer: dc2-leaf2b | NOT RUN | - | +| 947 | dc1-svc-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | +| 948 | dc1-svc-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com | NOT RUN | - | +| 949 | dc1-svc-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.13 - Peer: dc2-leaf1a | NOT RUN | - | +| 950 | dc1-svc-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.15 - Peer: dc2-leaf2a | NOT RUN | - | +| 951 | dc1-svc-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | +| 952 | dc1-svc-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.1 - Peer: dc1-wan1 | NOT RUN | - | +| 953 | dc1-svc-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.2 - Peer: dc1-wan2 | NOT RUN | - | +| 954 | dc1-svc-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.33.0.5 - Peer: dc1-svc-leaf1a | NOT RUN | - | +| 955 | dc1-svc-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.33.0.6 - Peer: dc1-svc-leaf1b | NOT RUN | - | +| 956 | dc1-svc-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.33.1.5 - Peer: dc1-svc-leaf1a | NOT RUN | - | +| 957 | dc1-svc-leaf1a | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | - | NOT RUN | - | +| 958 | dc1-svc-leaf1a | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | +| 959 | dc1-svc-leaf1a | Security | VerifyAPIHttpStatus | Verifies if eAPI HTTP server is disabled globally. | - | NOT RUN | - | +| 960 | dc1-svc-leaf1a | Security | VerifyAPIIPv4Acl | Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 961 | dc1-svc-leaf1a | Security | VerifyAPIIPv6Acl | Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 962 | dc1-svc-leaf1a | Security | VerifyAPISSLCertificate | Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size. | - | NOT RUN | - | +| 963 | dc1-svc-leaf1a | Security | VerifyBannerLogin | Verifies the login banner of a device. | - | NOT RUN | - | +| 964 | dc1-svc-leaf1a | Security | VerifyBannerMotd | Verifies the motd banner of a device. | - | NOT RUN | - | +| 965 | dc1-svc-leaf1a | Security | VerifyIPSecConnHealth | Verifies all IPv4 security connections. | - | NOT RUN | - | +| 966 | dc1-svc-leaf1a | Security | VerifyIPv4ACL | Verifies the configuration of IPv4 ACLs. | - | NOT RUN | - | +| 967 | dc1-svc-leaf1a | Security | VerifySpecificIPSecConn | Verifies IPv4 security connections for a peer. | - | NOT RUN | - | +| 968 | dc1-svc-leaf1a | Security | VerifySSHIPv4Acl | Verifies if the SSHD agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 969 | dc1-svc-leaf1a | Security | VerifySSHIPv6Acl | Verifies if the SSHD agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 970 | dc1-svc-leaf1a | Security | VerifySSHStatus | Verifies if the SSHD agent is disabled in the default VRF. | - | NOT RUN | - | +| 971 | dc1-svc-leaf1a | Security | VerifyTelnetStatus | Verifies if Telnet is disabled in the default VRF. | - | NOT RUN | - | +| 972 | dc1-svc-leaf1a | Services | VerifyDNSLookup | Verifies the DNS name to IP address resolution. | - | NOT RUN | - | +| 973 | dc1-svc-leaf1a | Services | VerifyDNSServers | Verifies if the DNS servers are correctly configured. | - | NOT RUN | - | +| 974 | dc1-svc-leaf1a | Services | VerifyErrdisableRecovery | Verifies the errdisable recovery reason, status, and interval. | - | NOT RUN | - | +| 975 | dc1-svc-leaf1a | Services | VerifyHostname | Verifies the hostname of a device. | - | NOT RUN | - | +| 976 | dc1-svc-leaf1a | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 977 | dc1-svc-leaf1a | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 978 | dc1-svc-leaf1a | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | +| 979 | dc1-svc-leaf1a | Software | VerifyEOSVersion | Verifies the EOS version of the device. | - | NOT RUN | - | +| 980 | dc1-svc-leaf1a | Software | VerifyTerminAttrVersion | Verifies the TerminAttr version of the device. | - | NOT RUN | - | +| 981 | dc1-svc-leaf1a | STUN | VerifyStunClient | Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided. | - | NOT RUN | - | +| 982 | dc1-svc-leaf1a | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | +| 983 | dc1-svc-leaf1a | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | +| 984 | dc1-svc-leaf1a | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | +| 985 | dc1-svc-leaf1a | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | +| 986 | dc1-svc-leaf1a | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | +| 987 | dc1-svc-leaf1a | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 988 | dc1-svc-leaf1a | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 989 | dc1-svc-leaf1a | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | +| 990 | dc1-svc-leaf1a | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | +| 991 | dc1-svc-leaf1a | VLAN | VerifyVlanInternalPolicy | Verifies the VLAN internal allocation policy and the range of VLANs. | - | NOT RUN | - | +| 992 | dc1-svc-leaf1b | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 993 | dc1-svc-leaf1b | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 994 | dc1-svc-leaf1b | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | +| 995 | dc1-svc-leaf1b | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | +| 996 | dc1-svc-leaf1b | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | +| 997 | dc1-svc-leaf1b | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | +| 998 | dc1-svc-leaf1b | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | +| 999 | dc1-svc-leaf1b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc1-spine1 (IP: 10.255.0.1) | NOT RUN | - | +| 1000 | dc1-svc-leaf1b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc1-spine2 (IP: 10.255.0.2) | NOT RUN | - | +| 1001 | dc1-svc-leaf1b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-spine1 (IP: 10.33.255.20) | NOT RUN | - | +| 1002 | dc1-svc-leaf1b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-spine2 (IP: 10.33.255.22) | NOT RUN | - | +| 1003 | dc1-svc-leaf1b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-svc-leaf1a (IP: 10.33.1.104) | NOT RUN | - | +| 1004 | dc1-svc-leaf1b | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | +| 1005 | dc1-svc-leaf1b | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | +| 1006 | dc1-svc-leaf1b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc1-spine1 Ethernet6 | NOT RUN | - | +| 1007 | dc1-svc-leaf1b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc1-spine2 Ethernet6 | NOT RUN | - | +| 1008 | dc1-svc-leaf1b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet3 - Remote: dc1-svc-leaf1a Ethernet3 | NOT RUN | - | +| 1009 | dc1-svc-leaf1b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet4 - Remote: dc1-svc-leaf1a Ethernet4 | NOT RUN | - | +| 1010 | dc1-svc-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.33.0.6) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3) | NOT RUN | - | +| 1011 | dc1-svc-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.33.0.6) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4) | NOT RUN | - | +| 1012 | dc1-svc-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.33.0.6) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5) | NOT RUN | - | +| 1013 | dc1-svc-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.33.0.6) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1) | NOT RUN | - | +| 1014 | dc1-svc-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.33.0.6) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2) | NOT RUN | - | +| 1015 | dc1-svc-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.33.0.6) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5) | NOT RUN | - | +| 1016 | dc1-svc-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.33.0.6) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6) | NOT RUN | - | +| 1017 | dc1-svc-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.33.0.6) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1) | NOT RUN | - | +| 1018 | dc1-svc-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.33.0.6) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2) | NOT RUN | - | +| 1019 | dc1-svc-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.33.0.6) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13) | NOT RUN | - | +| 1020 | dc1-svc-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.33.0.6) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14) | NOT RUN | - | +| 1021 | dc1-svc-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.33.0.6) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15) | NOT RUN | - | +| 1022 | dc1-svc-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.33.0.6) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16) | NOT RUN | - | +| 1023 | dc1-svc-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.33.0.6) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17) | NOT RUN | - | +| 1024 | dc1-svc-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.33.0.6) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18) | NOT RUN | - | +| 1025 | dc1-svc-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.33.0.6) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11) | NOT RUN | - | +| 1026 | dc1-svc-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.33.0.6) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12) | NOT RUN | - | +| 1027 | dc1-svc-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet1 (IP: 10.33.255.21) - Destination: dc1-spine1 Ethernet6 (IP: 10.33.255.20) | NOT RUN | - | +| 1028 | dc1-svc-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet2 (IP: 10.33.255.23) - Destination: dc1-spine2 Ethernet6 (IP: 10.33.255.22) | NOT RUN | - | +| 1029 | dc1-svc-leaf1b | Field Notices | VerifyFieldNotice44Resolution | Verifies that the device is using the correct Aboot version per FN0044. | - | NOT RUN | - | +| 1030 | dc1-svc-leaf1b | Field Notices | VerifyFieldNotice72Resolution | Verifies if the device is exposed to FN0072, and if the issue has been mitigated. | - | NOT RUN | - | +| 1031 | dc1-svc-leaf1b | Greent | VerifyGreenT | Verifies if a GreenT policy is created. | - | NOT RUN | - | +| 1032 | dc1-svc-leaf1b | Greent | VerifyGreenTCounters | Verifies if the GreenT counters are incremented. | - | NOT RUN | - | +| 1033 | dc1-svc-leaf1b | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches. | - | NOT RUN | - | +| 1034 | dc1-svc-leaf1b | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | +| 1035 | dc1-svc-leaf1b | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | +| 1036 | dc1-svc-leaf1b | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | +| 1037 | dc1-svc-leaf1b | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | +| 1038 | dc1-svc-leaf1b | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | +| 1039 | dc1-svc-leaf1b | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 1040 | dc1-svc-leaf1b | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 1041 | dc1-svc-leaf1b | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | +| 1042 | dc1-svc-leaf1b | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | +| 1043 | dc1-svc-leaf1b | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | +| 1044 | dc1-svc-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - P2P_LINK_TO_DC1-SPINE1_Ethernet6 = 'up' | NOT RUN | - | +| 1045 | dc1-svc-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - P2P_LINK_TO_DC1-SPINE2_Ethernet6 = 'up' | NOT RUN | - | +| 1046 | dc1-svc-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet3 - MLAG_PEER_dc1-svc-leaf1a_Ethernet3 = 'up' | NOT RUN | - | +| 1047 | dc1-svc-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet4 - MLAG_PEER_dc1-svc-leaf1a_Ethernet4 = 'up' | NOT RUN | - | +| 1048 | dc1-svc-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback0 - EVPN_Overlay_Peering = 'up' | NOT RUN | - | +| 1049 | dc1-svc-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up' | NOT RUN | - | +| 1050 | dc1-svc-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel3 - MLAG_PEER_dc1-svc-leaf1a_Po3 = 'up' | NOT RUN | - | +| 1051 | dc1-svc-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up' | NOT RUN | - | +| 1052 | dc1-svc-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4094 - MLAG_PEER = 'up' | NOT RUN | - | +| 1053 | dc1-svc-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vxlan1 = 'up' | NOT RUN | - | +| 1054 | dc1-svc-leaf1b | LANZ | VerifyLANZ | Verifies if LANZ is enabled. | - | NOT RUN | - | +| 1055 | dc1-svc-leaf1b | MLAG | VerifyMlagStatus | Verifies the health status of the MLAG configuration. | - | NOT RUN | - | +| 1056 | dc1-svc-leaf1b | PTP | VerifyPtpGMStatus | Verifies that the device is locked to a valid PTP Grandmaster. | - | NOT RUN | - | +| 1057 | dc1-svc-leaf1b | PTP | VerifyPtpLockStatus | Verifies that the device was locked to the upstream PTP GM in the last minute. | - | NOT RUN | - | +| 1058 | dc1-svc-leaf1b | PTP | VerifyPtpModeStatus | Verifies that the device is configured as a PTP Boundary Clock. | - | NOT RUN | - | +| 1059 | dc1-svc-leaf1b | PTP | VerifyPtpOffset | Verifies that the PTP timing offset is within +/- 1000ns from the master clock. | - | NOT RUN | - | +| 1060 | dc1-svc-leaf1b | PTP | VerifyPtpPortModeStatus | Verifies the PTP interfaces state. | - | NOT RUN | - | +| 1061 | dc1-svc-leaf1b | Routing | VerifyRoutingProtocolModel | Verifies the configured routing protocol model. | Routing protocol model: multi-agent | NOT RUN | - | +| 1062 | dc1-svc-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.1 - Peer: dc1-spine1 | NOT RUN | - | +| 1063 | dc1-svc-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.2 - Peer: dc1-spine2 | NOT RUN | - | +| 1064 | dc1-svc-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.3 - Peer: dc1-leaf1a | NOT RUN | - | +| 1065 | dc1-svc-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.4 - Peer: dc1-leaf1b | NOT RUN | - | +| 1066 | dc1-svc-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.5 - Peer: dc1-leaf2a | NOT RUN | - | +| 1067 | dc1-svc-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.3 - Peer: dc1-leaf1a | NOT RUN | - | +| 1068 | dc1-svc-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.5 - Peer: dc1-leaf2a | NOT RUN | - | +| 1069 | dc1-svc-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.11 - Peer: dc2-spine1 | NOT RUN | - | +| 1070 | dc1-svc-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.12 - Peer: dc2-spine2 | NOT RUN | - | +| 1071 | dc1-svc-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.13 - Peer: dc2-leaf1a | NOT RUN | - | +| 1072 | dc1-svc-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.14 - Peer: dc2-leaf1b | NOT RUN | - | +| 1073 | dc1-svc-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.15 - Peer: dc2-leaf2a | NOT RUN | - | +| 1074 | dc1-svc-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.16 - Peer: dc2-leaf2b | NOT RUN | - | +| 1075 | dc1-svc-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | +| 1076 | dc1-svc-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com | NOT RUN | - | +| 1077 | dc1-svc-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.13 - Peer: dc2-leaf1a | NOT RUN | - | +| 1078 | dc1-svc-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.15 - Peer: dc2-leaf2a | NOT RUN | - | +| 1079 | dc1-svc-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | +| 1080 | dc1-svc-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.1 - Peer: dc1-wan1 | NOT RUN | - | +| 1081 | dc1-svc-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.2 - Peer: dc1-wan2 | NOT RUN | - | +| 1082 | dc1-svc-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.33.0.5 - Peer: dc1-svc-leaf1a | NOT RUN | - | +| 1083 | dc1-svc-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.33.0.6 - Peer: dc1-svc-leaf1b | NOT RUN | - | +| 1084 | dc1-svc-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.33.1.5 - Peer: dc1-svc-leaf1a | NOT RUN | - | +| 1085 | dc1-svc-leaf1b | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | - | NOT RUN | - | +| 1086 | dc1-svc-leaf1b | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | +| 1087 | dc1-svc-leaf1b | Security | VerifyAPIHttpStatus | Verifies if eAPI HTTP server is disabled globally. | - | NOT RUN | - | +| 1088 | dc1-svc-leaf1b | Security | VerifyAPIIPv4Acl | Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 1089 | dc1-svc-leaf1b | Security | VerifyAPIIPv6Acl | Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 1090 | dc1-svc-leaf1b | Security | VerifyAPISSLCertificate | Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size. | - | NOT RUN | - | +| 1091 | dc1-svc-leaf1b | Security | VerifyBannerLogin | Verifies the login banner of a device. | - | NOT RUN | - | +| 1092 | dc1-svc-leaf1b | Security | VerifyBannerMotd | Verifies the motd banner of a device. | - | NOT RUN | - | +| 1093 | dc1-svc-leaf1b | Security | VerifyIPSecConnHealth | Verifies all IPv4 security connections. | - | NOT RUN | - | +| 1094 | dc1-svc-leaf1b | Security | VerifyIPv4ACL | Verifies the configuration of IPv4 ACLs. | - | NOT RUN | - | +| 1095 | dc1-svc-leaf1b | Security | VerifySpecificIPSecConn | Verifies IPv4 security connections for a peer. | - | NOT RUN | - | +| 1096 | dc1-svc-leaf1b | Security | VerifySSHIPv4Acl | Verifies if the SSHD agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 1097 | dc1-svc-leaf1b | Security | VerifySSHIPv6Acl | Verifies if the SSHD agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 1098 | dc1-svc-leaf1b | Security | VerifySSHStatus | Verifies if the SSHD agent is disabled in the default VRF. | - | NOT RUN | - | +| 1099 | dc1-svc-leaf1b | Security | VerifyTelnetStatus | Verifies if Telnet is disabled in the default VRF. | - | NOT RUN | - | +| 1100 | dc1-svc-leaf1b | Services | VerifyDNSLookup | Verifies the DNS name to IP address resolution. | - | NOT RUN | - | +| 1101 | dc1-svc-leaf1b | Services | VerifyDNSServers | Verifies if the DNS servers are correctly configured. | - | NOT RUN | - | +| 1102 | dc1-svc-leaf1b | Services | VerifyErrdisableRecovery | Verifies the errdisable recovery reason, status, and interval. | - | NOT RUN | - | +| 1103 | dc1-svc-leaf1b | Services | VerifyHostname | Verifies the hostname of a device. | - | NOT RUN | - | +| 1104 | dc1-svc-leaf1b | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 1105 | dc1-svc-leaf1b | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 1106 | dc1-svc-leaf1b | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | +| 1107 | dc1-svc-leaf1b | Software | VerifyEOSVersion | Verifies the EOS version of the device. | - | NOT RUN | - | +| 1108 | dc1-svc-leaf1b | Software | VerifyTerminAttrVersion | Verifies the TerminAttr version of the device. | - | NOT RUN | - | +| 1109 | dc1-svc-leaf1b | STUN | VerifyStunClient | Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided. | - | NOT RUN | - | +| 1110 | dc1-svc-leaf1b | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | +| 1111 | dc1-svc-leaf1b | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | +| 1112 | dc1-svc-leaf1b | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | +| 1113 | dc1-svc-leaf1b | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | +| 1114 | dc1-svc-leaf1b | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | +| 1115 | dc1-svc-leaf1b | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 1116 | dc1-svc-leaf1b | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 1117 | dc1-svc-leaf1b | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | +| 1118 | dc1-svc-leaf1b | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | +| 1119 | dc1-svc-leaf1b | VLAN | VerifyVlanInternalPolicy | Verifies the VLAN internal allocation policy and the range of VLANs. | - | NOT RUN | - | +| 1120 | dc1-wan1 | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 1121 | dc1-wan1 | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 1122 | dc1-wan1 | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | +| 1123 | dc1-wan1 | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | +| 1124 | dc1-wan1 | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | +| 1125 | dc1-wan1 | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | +| 1126 | dc1-wan1 | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | +| 1127 | dc1-wan1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc1-leaf1a (IP: 10.255.255.10) | NOT RUN | - | +| 1128 | dc1-wan1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc1-leaf1b (IP: 10.255.255.20) | NOT RUN | - | +| 1129 | dc1-wan1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc1-wan2 (IP: 10.255.1.2) | NOT RUN | - | +| 1130 | dc1-wan1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 SR-TE Peer: dc1-leaf1a (IP: 10.255.255.10) | NOT RUN | - | +| 1131 | dc1-wan1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 SR-TE Peer: dc1-leaf1b (IP: 10.255.255.20) | NOT RUN | - | +| 1132 | dc1-wan1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-leaf1a (IP: 10.255.255.0) | NOT RUN | - | +| 1133 | dc1-wan1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-leaf1b (IP: 10.255.255.2) | NOT RUN | - | +| 1134 | dc1-wan1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP Link-State Peer: dc1-leaf1a (IP: 10.255.255.10) | NOT RUN | - | +| 1135 | dc1-wan1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP Link-State Peer: dc1-leaf1b (IP: 10.255.255.20) | NOT RUN | - | +| 1136 | dc1-wan1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP Path-Selection Peer: dc1-leaf1a (IP: 10.255.255.10) | NOT RUN | - | +| 1137 | dc1-wan1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP Path-Selection Peer: dc1-leaf1b (IP: 10.255.255.20) | NOT RUN | - | +| 1138 | dc1-wan1 | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | +| 1139 | dc1-wan1 | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | +| 1140 | dc1-wan1 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc1-leaf1a Ethernet6 | NOT RUN | - | +| 1141 | dc1-wan1 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc1-leaf1b Ethernet6 | NOT RUN | - | +| 1142 | dc1-wan1 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet1 (IP: 10.255.255.1) - Destination: dc1-leaf1a Ethernet6 (IP: 10.255.255.0) | NOT RUN | - | +| 1143 | dc1-wan1 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet2 (IP: 10.255.255.3) - Destination: dc1-leaf1b Ethernet6 (IP: 10.255.255.2) | NOT RUN | - | +| 1144 | dc1-wan1 | Field Notices | VerifyFieldNotice44Resolution | Verifies that the device is using the correct Aboot version per FN0044. | - | NOT RUN | - | +| 1145 | dc1-wan1 | Field Notices | VerifyFieldNotice72Resolution | Verifies if the device is exposed to FN0072, and if the issue has been mitigated. | - | NOT RUN | - | +| 1146 | dc1-wan1 | Greent | VerifyGreenT | Verifies if a GreenT policy is created. | - | NOT RUN | - | +| 1147 | dc1-wan1 | Greent | VerifyGreenTCounters | Verifies if the GreenT counters are incremented. | - | NOT RUN | - | +| 1148 | dc1-wan1 | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches. | - | NOT RUN | - | +| 1149 | dc1-wan1 | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | +| 1150 | dc1-wan1 | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | +| 1151 | dc1-wan1 | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | +| 1152 | dc1-wan1 | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | +| 1153 | dc1-wan1 | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | +| 1154 | dc1-wan1 | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 1155 | dc1-wan1 | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 1156 | dc1-wan1 | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | +| 1157 | dc1-wan1 | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | +| 1158 | dc1-wan1 | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | +| 1159 | dc1-wan1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Dps1 - DPS Interface = 'up' | NOT RUN | - | +| 1160 | dc1-wan1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - P2P_LINK_TO_DC1-LEAF1A_Ethernet6 = 'up' | NOT RUN | - | +| 1161 | dc1-wan1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - P2P_LINK_TO_DC1-LEAF1B_Ethernet6 = 'up' | NOT RUN | - | +| 1162 | dc1-wan1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet3 - mpls-sp-1_DC1-MPLS-3 = 'up' | NOT RUN | - | +| 1163 | dc1-wan1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet4 - isp-1_DC1-INET-3 = 'up' | NOT RUN | - | +| 1164 | dc1-wan1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback0 - Router_ID = 'up' | NOT RUN | - | +| 1165 | dc1-wan1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vxlan1 = 'up' | NOT RUN | - | +| 1166 | dc1-wan1 | LANZ | VerifyLANZ | Verifies if LANZ is enabled. | - | NOT RUN | - | +| 1167 | dc1-wan1 | PTP | VerifyPtpGMStatus | Verifies that the device is locked to a valid PTP Grandmaster. | - | NOT RUN | - | +| 1168 | dc1-wan1 | PTP | VerifyPtpLockStatus | Verifies that the device was locked to the upstream PTP GM in the last minute. | - | NOT RUN | - | +| 1169 | dc1-wan1 | PTP | VerifyPtpModeStatus | Verifies that the device is configured as a PTP Boundary Clock. | - | NOT RUN | - | +| 1170 | dc1-wan1 | PTP | VerifyPtpOffset | Verifies that the PTP timing offset is within +/- 1000ns from the master clock. | - | NOT RUN | - | +| 1171 | dc1-wan1 | PTP | VerifyPtpPortModeStatus | Verifies the PTP interfaces state. | - | NOT RUN | - | +| 1172 | dc1-wan1 | Routing | VerifyRoutingProtocolModel | Verifies the configured routing protocol model. | Routing protocol model: multi-agent | NOT RUN | - | +| 1173 | dc1-wan1 | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | - | NOT RUN | - | +| 1174 | dc1-wan1 | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | +| 1175 | dc1-wan1 | Security | VerifyAPIHttpStatus | Verifies if eAPI HTTP server is disabled globally. | - | NOT RUN | - | +| 1176 | dc1-wan1 | Security | VerifyAPIIPv4Acl | Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 1177 | dc1-wan1 | Security | VerifyAPIIPv6Acl | Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 1178 | dc1-wan1 | Security | VerifyAPISSLCertificate | Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size. | - | NOT RUN | - | +| 1179 | dc1-wan1 | Security | VerifyBannerLogin | Verifies the login banner of a device. | - | NOT RUN | - | +| 1180 | dc1-wan1 | Security | VerifyBannerMotd | Verifies the motd banner of a device. | - | NOT RUN | - | +| 1181 | dc1-wan1 | Security | VerifyIPSecConnHealth | Verifies all IPv4 security connections. | - | NOT RUN | - | +| 1182 | dc1-wan1 | Security | VerifyIPv4ACL | Verifies the configuration of IPv4 ACLs. | - | NOT RUN | - | +| 1183 | dc1-wan1 | Security | VerifySpecificIPSecConn | Verifies IPv4 security connections for a peer. | - | NOT RUN | - | +| 1184 | dc1-wan1 | Security | VerifySpecificIPSecConn | Verifies IPv4 security connections for a peer. | IPv4 Peer: 10.255.1.2 VRF: default | NOT RUN | - | +| 1185 | dc1-wan1 | Security | VerifySpecificIPSecConn | Verifies IPv4 security connections for a peer. | IPv4 Peer: 10.255.255.10 VRF: default | NOT RUN | - | +| 1186 | dc1-wan1 | Security | VerifySpecificIPSecConn | Verifies IPv4 security connections for a peer. | IPv4 Peer: 10.255.255.20 VRF: default | NOT RUN | - | +| 1187 | dc1-wan1 | Security | VerifySSHIPv4Acl | Verifies if the SSHD agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 1188 | dc1-wan1 | Security | VerifySSHIPv6Acl | Verifies if the SSHD agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 1189 | dc1-wan1 | Security | VerifySSHStatus | Verifies if the SSHD agent is disabled in the default VRF. | - | NOT RUN | - | +| 1190 | dc1-wan1 | Security | VerifyTelnetStatus | Verifies if Telnet is disabled in the default VRF. | - | NOT RUN | - | +| 1191 | dc1-wan1 | Services | VerifyDNSLookup | Verifies the DNS name to IP address resolution. | - | NOT RUN | - | +| 1192 | dc1-wan1 | Services | VerifyDNSServers | Verifies if the DNS servers are correctly configured. | - | NOT RUN | - | +| 1193 | dc1-wan1 | Services | VerifyErrdisableRecovery | Verifies the errdisable recovery reason, status, and interval. | - | NOT RUN | - | +| 1194 | dc1-wan1 | Services | VerifyHostname | Verifies the hostname of a device. | - | NOT RUN | - | +| 1195 | dc1-wan1 | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 1196 | dc1-wan1 | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 1197 | dc1-wan1 | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | +| 1198 | dc1-wan1 | Software | VerifyEOSVersion | Verifies the EOS version of the device. | - | NOT RUN | - | +| 1199 | dc1-wan1 | Software | VerifyTerminAttrVersion | Verifies the TerminAttr version of the device. | - | NOT RUN | - | +| 1200 | dc1-wan1 | STUN | VerifyStunClient | Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided. | - | NOT RUN | - | +| 1201 | dc1-wan1 | STUN | VerifyStunClient | Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided. | Source IPv4 Address: 100.64.3.2 Source Port: 4500 | NOT RUN | - | +| 1202 | dc1-wan1 | STUN | VerifyStunClient | Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided. | Source IPv4 Address: 172.18.3.2 Source Port: 4500 | NOT RUN | - | +| 1203 | dc1-wan1 | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | +| 1204 | dc1-wan1 | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | +| 1205 | dc1-wan1 | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | +| 1206 | dc1-wan1 | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | +| 1207 | dc1-wan1 | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | +| 1208 | dc1-wan1 | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 1209 | dc1-wan1 | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 1210 | dc1-wan1 | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | +| 1211 | dc1-wan1 | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | +| 1212 | dc1-wan1 | VLAN | VerifyVlanInternalPolicy | Verifies the VLAN internal allocation policy and the range of VLANs. | - | NOT RUN | - | +| 1213 | dc1-wan2 | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 1214 | dc1-wan2 | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 1215 | dc1-wan2 | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | +| 1216 | dc1-wan2 | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | +| 1217 | dc1-wan2 | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | +| 1218 | dc1-wan2 | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | +| 1219 | dc1-wan2 | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | +| 1220 | dc1-wan2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc1-leaf1a (IP: 10.255.255.10) | NOT RUN | - | +| 1221 | dc1-wan2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc1-leaf1b (IP: 10.255.255.20) | NOT RUN | - | +| 1222 | dc1-wan2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc1-wan1 (IP: 10.255.1.1) | NOT RUN | - | +| 1223 | dc1-wan2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 SR-TE Peer: dc1-leaf1a (IP: 10.255.255.10) | NOT RUN | - | +| 1224 | dc1-wan2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 SR-TE Peer: dc1-leaf1b (IP: 10.255.255.20) | NOT RUN | - | +| 1225 | dc1-wan2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-leaf1a (IP: 10.255.255.4) | NOT RUN | - | +| 1226 | dc1-wan2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-leaf1b (IP: 10.255.255.6) | NOT RUN | - | +| 1227 | dc1-wan2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP Link-State Peer: dc1-leaf1a (IP: 10.255.255.10) | NOT RUN | - | +| 1228 | dc1-wan2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP Link-State Peer: dc1-leaf1b (IP: 10.255.255.20) | NOT RUN | - | +| 1229 | dc1-wan2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP Path-Selection Peer: dc1-leaf1a (IP: 10.255.255.10) | NOT RUN | - | +| 1230 | dc1-wan2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP Path-Selection Peer: dc1-leaf1b (IP: 10.255.255.20) | NOT RUN | - | +| 1231 | dc1-wan2 | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | +| 1232 | dc1-wan2 | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | +| 1233 | dc1-wan2 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc1-leaf1a Ethernet7 | NOT RUN | - | +| 1234 | dc1-wan2 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc1-leaf1b Ethernet7 | NOT RUN | - | +| 1235 | dc1-wan2 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet1 (IP: 10.255.255.5) - Destination: dc1-leaf1a Ethernet7 (IP: 10.255.255.4) | NOT RUN | - | +| 1236 | dc1-wan2 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet2 (IP: 10.255.255.7) - Destination: dc1-leaf1b Ethernet7 (IP: 10.255.255.6) | NOT RUN | - | +| 1237 | dc1-wan2 | Field Notices | VerifyFieldNotice44Resolution | Verifies that the device is using the correct Aboot version per FN0044. | - | NOT RUN | - | +| 1238 | dc1-wan2 | Field Notices | VerifyFieldNotice72Resolution | Verifies if the device is exposed to FN0072, and if the issue has been mitigated. | - | NOT RUN | - | +| 1239 | dc1-wan2 | Greent | VerifyGreenT | Verifies if a GreenT policy is created. | - | NOT RUN | - | +| 1240 | dc1-wan2 | Greent | VerifyGreenTCounters | Verifies if the GreenT counters are incremented. | - | NOT RUN | - | +| 1241 | dc1-wan2 | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches. | - | NOT RUN | - | +| 1242 | dc1-wan2 | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | +| 1243 | dc1-wan2 | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | +| 1244 | dc1-wan2 | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | +| 1245 | dc1-wan2 | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | +| 1246 | dc1-wan2 | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | +| 1247 | dc1-wan2 | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 1248 | dc1-wan2 | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 1249 | dc1-wan2 | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | +| 1250 | dc1-wan2 | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | +| 1251 | dc1-wan2 | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | +| 1252 | dc1-wan2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Dps1 - DPS Interface = 'up' | NOT RUN | - | +| 1253 | dc1-wan2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - P2P_LINK_TO_DC1-LEAF1A_Ethernet7 = 'up' | NOT RUN | - | +| 1254 | dc1-wan2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - P2P_LINK_TO_DC1-LEAF1B_Ethernet7 = 'up' | NOT RUN | - | +| 1255 | dc1-wan2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet3 - mpls-sp-1_DC1-MPLS-4 = 'up' | NOT RUN | - | +| 1256 | dc1-wan2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet4 - isp-1_DC1-INET-4 = 'up' | NOT RUN | - | +| 1257 | dc1-wan2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback0 - Router_ID = 'up' | NOT RUN | - | +| 1258 | dc1-wan2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vxlan1 = 'up' | NOT RUN | - | +| 1259 | dc1-wan2 | LANZ | VerifyLANZ | Verifies if LANZ is enabled. | - | NOT RUN | - | +| 1260 | dc1-wan2 | PTP | VerifyPtpGMStatus | Verifies that the device is locked to a valid PTP Grandmaster. | - | NOT RUN | - | +| 1261 | dc1-wan2 | PTP | VerifyPtpLockStatus | Verifies that the device was locked to the upstream PTP GM in the last minute. | - | NOT RUN | - | +| 1262 | dc1-wan2 | PTP | VerifyPtpModeStatus | Verifies that the device is configured as a PTP Boundary Clock. | - | NOT RUN | - | +| 1263 | dc1-wan2 | PTP | VerifyPtpOffset | Verifies that the PTP timing offset is within +/- 1000ns from the master clock. | - | NOT RUN | - | +| 1264 | dc1-wan2 | PTP | VerifyPtpPortModeStatus | Verifies the PTP interfaces state. | - | NOT RUN | - | +| 1265 | dc1-wan2 | Routing | VerifyRoutingProtocolModel | Verifies the configured routing protocol model. | Routing protocol model: multi-agent | NOT RUN | - | +| 1266 | dc1-wan2 | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | - | NOT RUN | - | +| 1267 | dc1-wan2 | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | +| 1268 | dc1-wan2 | Security | VerifyAPIHttpStatus | Verifies if eAPI HTTP server is disabled globally. | - | NOT RUN | - | +| 1269 | dc1-wan2 | Security | VerifyAPIIPv4Acl | Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 1270 | dc1-wan2 | Security | VerifyAPIIPv6Acl | Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 1271 | dc1-wan2 | Security | VerifyAPISSLCertificate | Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size. | - | NOT RUN | - | +| 1272 | dc1-wan2 | Security | VerifyBannerLogin | Verifies the login banner of a device. | - | NOT RUN | - | +| 1273 | dc1-wan2 | Security | VerifyBannerMotd | Verifies the motd banner of a device. | - | NOT RUN | - | +| 1274 | dc1-wan2 | Security | VerifyIPSecConnHealth | Verifies all IPv4 security connections. | - | NOT RUN | - | +| 1275 | dc1-wan2 | Security | VerifyIPv4ACL | Verifies the configuration of IPv4 ACLs. | - | NOT RUN | - | +| 1276 | dc1-wan2 | Security | VerifySpecificIPSecConn | Verifies IPv4 security connections for a peer. | - | NOT RUN | - | +| 1277 | dc1-wan2 | Security | VerifySpecificIPSecConn | Verifies IPv4 security connections for a peer. | IPv4 Peer: 10.255.1.1 VRF: default | NOT RUN | - | +| 1278 | dc1-wan2 | Security | VerifySpecificIPSecConn | Verifies IPv4 security connections for a peer. | IPv4 Peer: 10.255.255.10 VRF: default | NOT RUN | - | +| 1279 | dc1-wan2 | Security | VerifySpecificIPSecConn | Verifies IPv4 security connections for a peer. | IPv4 Peer: 10.255.255.20 VRF: default | NOT RUN | - | +| 1280 | dc1-wan2 | Security | VerifySSHIPv4Acl | Verifies if the SSHD agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 1281 | dc1-wan2 | Security | VerifySSHIPv6Acl | Verifies if the SSHD agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 1282 | dc1-wan2 | Security | VerifySSHStatus | Verifies if the SSHD agent is disabled in the default VRF. | - | NOT RUN | - | +| 1283 | dc1-wan2 | Security | VerifyTelnetStatus | Verifies if Telnet is disabled in the default VRF. | - | NOT RUN | - | +| 1284 | dc1-wan2 | Services | VerifyDNSLookup | Verifies the DNS name to IP address resolution. | - | NOT RUN | - | +| 1285 | dc1-wan2 | Services | VerifyDNSServers | Verifies if the DNS servers are correctly configured. | - | NOT RUN | - | +| 1286 | dc1-wan2 | Services | VerifyErrdisableRecovery | Verifies the errdisable recovery reason, status, and interval. | - | NOT RUN | - | +| 1287 | dc1-wan2 | Services | VerifyHostname | Verifies the hostname of a device. | - | NOT RUN | - | +| 1288 | dc1-wan2 | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 1289 | dc1-wan2 | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 1290 | dc1-wan2 | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | +| 1291 | dc1-wan2 | Software | VerifyEOSVersion | Verifies the EOS version of the device. | - | NOT RUN | - | +| 1292 | dc1-wan2 | Software | VerifyTerminAttrVersion | Verifies the TerminAttr version of the device. | - | NOT RUN | - | +| 1293 | dc1-wan2 | STUN | VerifyStunClient | Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided. | - | NOT RUN | - | +| 1294 | dc1-wan2 | STUN | VerifyStunClient | Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided. | Source IPv4 Address: 100.64.4.2 Source Port: 4500 | NOT RUN | - | +| 1295 | dc1-wan2 | STUN | VerifyStunClient | Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided. | Source IPv4 Address: 172.18.4.2 Source Port: 4500 | NOT RUN | - | +| 1296 | dc1-wan2 | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | +| 1297 | dc1-wan2 | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | +| 1298 | dc1-wan2 | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | +| 1299 | dc1-wan2 | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | +| 1300 | dc1-wan2 | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | +| 1301 | dc1-wan2 | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 1302 | dc1-wan2 | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 1303 | dc1-wan2 | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | +| 1304 | dc1-wan2 | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | +| 1305 | dc1-wan2 | VLAN | VerifyVlanInternalPolicy | Verifies the VLAN internal allocation policy and the range of VLANs. | - | NOT RUN | - | +| 1306 | dc2-leaf1a | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 1307 | dc2-leaf1a | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 1308 | dc2-leaf1a | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | +| 1309 | dc2-leaf1a | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | +| 1310 | dc2-leaf1a | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | +| 1311 | dc2-leaf1a | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | +| 1312 | dc2-leaf1a | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | +| 1313 | dc2-leaf1a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-spine1 (IP: 10.255.128.11) | NOT RUN | - | +| 1314 | dc2-leaf1a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-spine2 (IP: 10.255.128.12) | NOT RUN | - | +| 1315 | dc2-leaf1a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf1b (IP: 10.255.129.117) | NOT RUN | - | +| 1316 | dc2-leaf1a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-spine1 (IP: 10.255.255.104) | NOT RUN | - | +| 1317 | dc2-leaf1a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-spine2 (IP: 10.255.255.106) | NOT RUN | - | +| 1318 | dc2-leaf1a | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | +| 1319 | dc2-leaf1a | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | +| 1320 | dc2-leaf1a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc2-spine1 Ethernet1 | NOT RUN | - | +| 1321 | dc2-leaf1a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc2-spine2 Ethernet1 | NOT RUN | - | +| 1322 | dc2-leaf1a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet3 - Remote: dc2-leaf1b Ethernet3 | NOT RUN | - | +| 1323 | dc2-leaf1a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet4 - Remote: dc2-leaf1b Ethernet4 | NOT RUN | - | +| 1324 | dc2-leaf1a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet8 - Remote: dc2-leaf1c Ethernet1 | NOT RUN | - | +| 1325 | dc2-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3) | NOT RUN | - | +| 1326 | dc2-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4) | NOT RUN | - | +| 1327 | dc2-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5) | NOT RUN | - | +| 1328 | dc2-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1) | NOT RUN | - | +| 1329 | dc2-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2) | NOT RUN | - | +| 1330 | dc2-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5) | NOT RUN | - | +| 1331 | dc2-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6) | NOT RUN | - | +| 1332 | dc2-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1) | NOT RUN | - | +| 1333 | dc2-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2) | NOT RUN | - | +| 1334 | dc2-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.13) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13) | NOT RUN | - | +| 1335 | dc2-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.13) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14) | NOT RUN | - | +| 1336 | dc2-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.13) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15) | NOT RUN | - | +| 1337 | dc2-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.13) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16) | NOT RUN | - | +| 1338 | dc2-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.13) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17) | NOT RUN | - | +| 1339 | dc2-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.13) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18) | NOT RUN | - | +| 1340 | dc2-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.13) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11) | NOT RUN | - | +| 1341 | dc2-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.13) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12) | NOT RUN | - | +| 1342 | dc2-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet1 (IP: 10.255.255.105) - Destination: dc2-spine1 Ethernet1 (IP: 10.255.255.104) | NOT RUN | - | +| 1343 | dc2-leaf1a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet2 (IP: 10.255.255.107) - Destination: dc2-spine2 Ethernet1 (IP: 10.255.255.106) | NOT RUN | - | +| 1344 | dc2-leaf1a | Field Notices | VerifyFieldNotice44Resolution | Verifies that the device is using the correct Aboot version per FN0044. | - | NOT RUN | - | +| 1345 | dc2-leaf1a | Field Notices | VerifyFieldNotice72Resolution | Verifies if the device is exposed to FN0072, and if the issue has been mitigated. | - | NOT RUN | - | +| 1346 | dc2-leaf1a | Greent | VerifyGreenT | Verifies if a GreenT policy is created. | - | NOT RUN | - | +| 1347 | dc2-leaf1a | Greent | VerifyGreenTCounters | Verifies if the GreenT counters are incremented. | - | NOT RUN | - | +| 1348 | dc2-leaf1a | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches. | - | NOT RUN | - | +| 1349 | dc2-leaf1a | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | +| 1350 | dc2-leaf1a | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | +| 1351 | dc2-leaf1a | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | +| 1352 | dc2-leaf1a | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | +| 1353 | dc2-leaf1a | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | +| 1354 | dc2-leaf1a | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 1355 | dc2-leaf1a | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 1356 | dc2-leaf1a | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | +| 1357 | dc2-leaf1a | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | +| 1358 | dc2-leaf1a | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | +| 1359 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - P2P_LINK_TO_DC2-SPINE1_Ethernet1 = 'up' | NOT RUN | - | +| 1360 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - P2P_LINK_TO_DC2-SPINE2_Ethernet1 = 'up' | NOT RUN | - | +| 1361 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet3 - MLAG_PEER_dc2-leaf1b_Ethernet3 = 'up' | NOT RUN | - | +| 1362 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet4 - MLAG_PEER_dc2-leaf1b_Ethernet4 = 'up' | NOT RUN | - | +| 1363 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet5 - dc2-leaf1-server1_PCI1 = 'up' | NOT RUN | - | +| 1364 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet8 - DC2-LEAF1C_Ethernet1 = 'up' | NOT RUN | - | +| 1365 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback0 - EVPN_Overlay_Peering = 'up' | NOT RUN | - | +| 1366 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up' | NOT RUN | - | +| 1367 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback10 - VRF10_VTEP_DIAGNOSTICS = 'up' | NOT RUN | - | +| 1368 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback11 - VRF11_VTEP_DIAGNOSTICS = 'up' | NOT RUN | - | +| 1369 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel3 - MLAG_PEER_dc2-leaf1b_Po3 = 'up' | NOT RUN | - | +| 1370 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel5 - dc2-leaf1-server1_PortChannel dc2-leaf1-server1 = 'up' | NOT RUN | - | +| 1371 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel8 - DC2-LEAF1C_Po1 = 'up' | NOT RUN | - | +| 1372 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan11 - VRF10_VLAN11 = 'up' | NOT RUN | - | +| 1373 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan12 - VRF10_VLAN12 = 'up' | NOT RUN | - | +| 1374 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan21 - VRF11_VLAN21 = 'up' | NOT RUN | - | +| 1375 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan22 - VRF11_VLAN22 = 'up' | NOT RUN | - | +| 1376 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan3009 - MLAG_PEER_L3_iBGP: vrf VRF10 = 'up' | NOT RUN | - | +| 1377 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan3010 - MLAG_PEER_L3_iBGP: vrf VRF11 = 'up' | NOT RUN | - | +| 1378 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up' | NOT RUN | - | +| 1379 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4094 - MLAG_PEER = 'up' | NOT RUN | - | +| 1380 | dc2-leaf1a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vxlan1 = 'up' | NOT RUN | - | +| 1381 | dc2-leaf1a | LANZ | VerifyLANZ | Verifies if LANZ is enabled. | - | NOT RUN | - | +| 1382 | dc2-leaf1a | Logging | VerifyLoggingAccounting | Verifies if AAA accounting logs are generated. | - | NOT RUN | - | +| 1383 | dc2-leaf1a | Logging | VerifyLoggingErrors | Verifies there are no syslog messages with a severity of ERRORS or higher. | - | NOT RUN | - | +| 1384 | dc2-leaf1a | Logging | VerifyLoggingHostname | Verifies if logs are generated with the device FQDN. | - | NOT RUN | - | +| 1385 | dc2-leaf1a | Logging | VerifyLoggingHosts | Verifies logging hosts (syslog servers) for a specified VRF. | - | NOT RUN | - | +| 1386 | dc2-leaf1a | Logging | VerifyLoggingLogsGeneration | Verifies if logs are generated. | - | NOT RUN | - | +| 1387 | dc2-leaf1a | Logging | VerifyLoggingPersistent | Verifies if logging persistent is enabled and logs are saved in flash. | - | NOT RUN | - | +| 1388 | dc2-leaf1a | Logging | VerifyLoggingSourceInt | Verifies logging source-interface for a specified VRF. | - | NOT RUN | - | +| 1389 | dc2-leaf1a | Logging | VerifyLoggingTimestamp | Verifies if logs are generated with the riate timestamp. | - | NOT RUN | - | +| 1390 | dc2-leaf1a | MLAG | VerifyMlagConfigSanity | Verifies there are no MLAG config-sanity inconsistencies. | - | NOT RUN | - | +| 1391 | dc2-leaf1a | MLAG | VerifyMlagDualPrimary | Verifies the MLAG dual-primary detection parameters. | - | NOT RUN | - | +| 1392 | dc2-leaf1a | MLAG | VerifyMlagInterfaces | Verifies there are no inactive or active-partial MLAG ports. | - | NOT RUN | - | +| 1393 | dc2-leaf1a | MLAG | VerifyMlagReloadDelay | Verifies the MLAG reload-delay parameters. | - | NOT RUN | - | +| 1394 | dc2-leaf1a | MLAG | VerifyMlagStatus | Verifies the health status of the MLAG configuration. | - | NOT RUN | - | +| 1395 | dc2-leaf1a | MLAG | VerifyMlagStatus | Verifies the health status of the MLAG configuration. | - | NOT RUN | - | +| 1396 | dc2-leaf1a | Multicast | VerifyIGMPSnoopingGlobal | Verifies the IGMP snooping global configuration. | - | NOT RUN | - | +| 1397 | dc2-leaf1a | Multicast | VerifyIGMPSnoopingVlans | Verifies the IGMP snooping status for the provided VLANs. | - | NOT RUN | - | +| 1398 | dc2-leaf1a | PTP | VerifyPtpGMStatus | Verifies that the device is locked to a valid PTP Grandmaster. | - | NOT RUN | - | +| 1399 | dc2-leaf1a | PTP | VerifyPtpLockStatus | Verifies that the device was locked to the upstream PTP GM in the last minute. | - | NOT RUN | - | +| 1400 | dc2-leaf1a | PTP | VerifyPtpModeStatus | Verifies that the device is configured as a PTP Boundary Clock. | - | NOT RUN | - | +| 1401 | dc2-leaf1a | PTP | VerifyPtpOffset | Verifies that the PTP timing offset is within +/- 1000ns from the master clock. | - | NOT RUN | - | +| 1402 | dc2-leaf1a | PTP | VerifyPtpPortModeStatus | Verifies the PTP interfaces state. | - | NOT RUN | - | +| 1403 | dc2-leaf1a | Routing | VerifyRoutingProtocolModel | Verifies the configured routing protocol model. | Routing protocol model: multi-agent | NOT RUN | - | +| 1404 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.1 - Peer: dc1-spine1 | NOT RUN | - | +| 1405 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.2 - Peer: dc1-spine2 | NOT RUN | - | +| 1406 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.3 - Peer: dc1-leaf1a | NOT RUN | - | +| 1407 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.4 - Peer: dc1-leaf1b | NOT RUN | - | +| 1408 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.5 - Peer: dc1-leaf2a | NOT RUN | - | +| 1409 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.3 - Peer: dc1-leaf1a | NOT RUN | - | +| 1410 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.5 - Peer: dc1-leaf2a | NOT RUN | - | +| 1411 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.11 - Peer: dc2-spine1 | NOT RUN | - | +| 1412 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.12 - Peer: dc2-spine2 | NOT RUN | - | +| 1413 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.13 - Peer: dc2-leaf1a | NOT RUN | - | +| 1414 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.14 - Peer: dc2-leaf1b | NOT RUN | - | +| 1415 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.15 - Peer: dc2-leaf2a | NOT RUN | - | +| 1416 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.16 - Peer: dc2-leaf2b | NOT RUN | - | +| 1417 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | +| 1418 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com | NOT RUN | - | +| 1419 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.13 - Peer: dc2-leaf1a | NOT RUN | - | +| 1420 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.15 - Peer: dc2-leaf2a | NOT RUN | - | +| 1421 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | +| 1422 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.1 - Peer: dc1-wan1 | NOT RUN | - | +| 1423 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.2 - Peer: dc1-wan2 | NOT RUN | - | +| 1424 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.33.0.5 - Peer: dc1-svc-leaf1a | NOT RUN | - | +| 1425 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.33.0.6 - Peer: dc1-svc-leaf1b | NOT RUN | - | +| 1426 | dc2-leaf1a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.33.1.5 - Peer: dc1-svc-leaf1a | NOT RUN | - | +| 1427 | dc2-leaf1a | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | - | NOT RUN | - | +| 1428 | dc2-leaf1a | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | +| 1429 | dc2-leaf1a | Security | VerifyAPIHttpStatus | Verifies if eAPI HTTP server is disabled globally. | - | NOT RUN | - | +| 1430 | dc2-leaf1a | Security | VerifyAPIIPv4Acl | Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 1431 | dc2-leaf1a | Security | VerifyAPIIPv6Acl | Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 1432 | dc2-leaf1a | Security | VerifyAPISSLCertificate | Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size. | - | NOT RUN | - | +| 1433 | dc2-leaf1a | Security | VerifyBannerLogin | Verifies the login banner of a device. | - | NOT RUN | - | +| 1434 | dc2-leaf1a | Security | VerifyBannerMotd | Verifies the motd banner of a device. | - | NOT RUN | - | +| 1435 | dc2-leaf1a | Security | VerifyIPSecConnHealth | Verifies all IPv4 security connections. | - | NOT RUN | - | +| 1436 | dc2-leaf1a | Security | VerifyIPv4ACL | Verifies the configuration of IPv4 ACLs. | - | NOT RUN | - | +| 1437 | dc2-leaf1a | Security | VerifySpecificIPSecConn | Verifies IPv4 security connections for a peer. | - | NOT RUN | - | +| 1438 | dc2-leaf1a | Security | VerifySSHIPv4Acl | Verifies if the SSHD agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 1439 | dc2-leaf1a | Security | VerifySSHIPv6Acl | Verifies if the SSHD agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 1440 | dc2-leaf1a | Security | VerifySSHStatus | Verifies if the SSHD agent is disabled in the default VRF. | - | NOT RUN | - | +| 1441 | dc2-leaf1a | Security | VerifyTelnetStatus | Verifies if Telnet is disabled in the default VRF. | - | NOT RUN | - | +| 1442 | dc2-leaf1a | Services | VerifyDNSLookup | Verifies the DNS name to IP address resolution. | - | NOT RUN | - | +| 1443 | dc2-leaf1a | Services | VerifyDNSServers | Verifies if the DNS servers are correctly configured. | - | NOT RUN | - | +| 1444 | dc2-leaf1a | Services | VerifyErrdisableRecovery | Verifies the errdisable recovery reason, status, and interval. | - | NOT RUN | - | +| 1445 | dc2-leaf1a | Services | VerifyHostname | Verifies the hostname of a device. | - | NOT RUN | - | +| 1446 | dc2-leaf1a | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 1447 | dc2-leaf1a | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 1448 | dc2-leaf1a | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | +| 1449 | dc2-leaf1a | Software | VerifyEOSVersion | Verifies the EOS version of the device. | - | NOT RUN | - | +| 1450 | dc2-leaf1a | Software | VerifyTerminAttrVersion | Verifies the TerminAttr version of the device. | - | NOT RUN | - | +| 1451 | dc2-leaf1a | STP | VerifySTPBlockedPorts | Verifies there is no STP blocked ports. | - | NOT RUN | - | +| 1452 | dc2-leaf1a | STP | VerifySTPCounters | Verifies there is no errors in STP BPDU packets. | - | NOT RUN | - | +| 1453 | dc2-leaf1a | STP | VerifySTPForwardingPorts | Verifies that all interfaces are forwarding for a provided list of VLAN(s). | - | NOT RUN | - | +| 1454 | dc2-leaf1a | STP | VerifySTPMode | Verifies the configured STP mode for a provided list of VLAN(s). | - | NOT RUN | - | +| 1455 | dc2-leaf1a | STP | VerifySTPRootPriority | Verifies the STP root priority for a provided list of VLAN or MST instance ID(s). | - | NOT RUN | - | +| 1456 | dc2-leaf1a | STUN | VerifyStunClient | Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided. | - | NOT RUN | - | +| 1457 | dc2-leaf1a | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | +| 1458 | dc2-leaf1a | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | +| 1459 | dc2-leaf1a | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | +| 1460 | dc2-leaf1a | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | +| 1461 | dc2-leaf1a | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | +| 1462 | dc2-leaf1a | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 1463 | dc2-leaf1a | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 1464 | dc2-leaf1a | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | +| 1465 | dc2-leaf1a | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | +| 1466 | dc2-leaf1a | VLAN | VerifyVlanInternalPolicy | Verifies the VLAN internal allocation policy and the range of VLANs. | - | NOT RUN | - | +| 1467 | dc2-leaf1b | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 1468 | dc2-leaf1b | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 1469 | dc2-leaf1b | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | +| 1470 | dc2-leaf1b | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | +| 1471 | dc2-leaf1b | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | +| 1472 | dc2-leaf1b | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | +| 1473 | dc2-leaf1b | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | +| 1474 | dc2-leaf1b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-spine1 (IP: 10.255.128.11) | NOT RUN | - | +| 1475 | dc2-leaf1b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-spine2 (IP: 10.255.128.12) | NOT RUN | - | +| 1476 | dc2-leaf1b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf1a (IP: 10.255.129.116) | NOT RUN | - | +| 1477 | dc2-leaf1b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-spine1 (IP: 10.255.255.108) | NOT RUN | - | +| 1478 | dc2-leaf1b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-spine2 (IP: 10.255.255.110) | NOT RUN | - | +| 1479 | dc2-leaf1b | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | +| 1480 | dc2-leaf1b | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | +| 1481 | dc2-leaf1b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc2-spine1 Ethernet2 | NOT RUN | - | +| 1482 | dc2-leaf1b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc2-spine2 Ethernet2 | NOT RUN | - | +| 1483 | dc2-leaf1b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet3 - Remote: dc2-leaf1a Ethernet3 | NOT RUN | - | +| 1484 | dc2-leaf1b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet4 - Remote: dc2-leaf1a Ethernet4 | NOT RUN | - | +| 1485 | dc2-leaf1b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet8 - Remote: dc2-leaf1c Ethernet2 | NOT RUN | - | +| 1486 | dc2-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3) | NOT RUN | - | +| 1487 | dc2-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4) | NOT RUN | - | +| 1488 | dc2-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5) | NOT RUN | - | +| 1489 | dc2-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1) | NOT RUN | - | +| 1490 | dc2-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2) | NOT RUN | - | +| 1491 | dc2-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5) | NOT RUN | - | +| 1492 | dc2-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6) | NOT RUN | - | +| 1493 | dc2-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1) | NOT RUN | - | +| 1494 | dc2-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2) | NOT RUN | - | +| 1495 | dc2-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.14) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13) | NOT RUN | - | +| 1496 | dc2-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.14) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14) | NOT RUN | - | +| 1497 | dc2-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.14) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15) | NOT RUN | - | +| 1498 | dc2-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.14) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16) | NOT RUN | - | +| 1499 | dc2-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.14) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17) | NOT RUN | - | +| 1500 | dc2-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.14) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18) | NOT RUN | - | +| 1501 | dc2-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.14) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11) | NOT RUN | - | +| 1502 | dc2-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.14) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12) | NOT RUN | - | +| 1503 | dc2-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet1 (IP: 10.255.255.109) - Destination: dc2-spine1 Ethernet2 (IP: 10.255.255.108) | NOT RUN | - | +| 1504 | dc2-leaf1b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet2 (IP: 10.255.255.111) - Destination: dc2-spine2 Ethernet2 (IP: 10.255.255.110) | NOT RUN | - | +| 1505 | dc2-leaf1b | Field Notices | VerifyFieldNotice44Resolution | Verifies that the device is using the correct Aboot version per FN0044. | - | NOT RUN | - | +| 1506 | dc2-leaf1b | Field Notices | VerifyFieldNotice72Resolution | Verifies if the device is exposed to FN0072, and if the issue has been mitigated. | - | NOT RUN | - | +| 1507 | dc2-leaf1b | Greent | VerifyGreenT | Verifies if a GreenT policy is created. | - | NOT RUN | - | +| 1508 | dc2-leaf1b | Greent | VerifyGreenTCounters | Verifies if the GreenT counters are incremented. | - | NOT RUN | - | +| 1509 | dc2-leaf1b | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches. | - | NOT RUN | - | +| 1510 | dc2-leaf1b | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | +| 1511 | dc2-leaf1b | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | +| 1512 | dc2-leaf1b | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | +| 1513 | dc2-leaf1b | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | +| 1514 | dc2-leaf1b | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | +| 1515 | dc2-leaf1b | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 1516 | dc2-leaf1b | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 1517 | dc2-leaf1b | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | +| 1518 | dc2-leaf1b | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | +| 1519 | dc2-leaf1b | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | +| 1520 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - P2P_LINK_TO_DC2-SPINE1_Ethernet2 = 'up' | NOT RUN | - | +| 1521 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - P2P_LINK_TO_DC2-SPINE2_Ethernet2 = 'up' | NOT RUN | - | +| 1522 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet3 - MLAG_PEER_dc2-leaf1a_Ethernet3 = 'up' | NOT RUN | - | +| 1523 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet4 - MLAG_PEER_dc2-leaf1a_Ethernet4 = 'up' | NOT RUN | - | +| 1524 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet5 - dc2-leaf1-server1_PCI2 = 'up' | NOT RUN | - | +| 1525 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet8 - DC2-LEAF1C_Ethernet2 = 'up' | NOT RUN | - | +| 1526 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback0 - EVPN_Overlay_Peering = 'up' | NOT RUN | - | +| 1527 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up' | NOT RUN | - | +| 1528 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback10 - VRF10_VTEP_DIAGNOSTICS = 'up' | NOT RUN | - | +| 1529 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback11 - VRF11_VTEP_DIAGNOSTICS = 'up' | NOT RUN | - | +| 1530 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel3 - MLAG_PEER_dc2-leaf1a_Po3 = 'up' | NOT RUN | - | +| 1531 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel5 - dc2-leaf1-server1_PortChannel dc2-leaf1-server1 = 'up' | NOT RUN | - | +| 1532 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel8 - DC2-LEAF1C_Po1 = 'up' | NOT RUN | - | +| 1533 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan11 - VRF10_VLAN11 = 'up' | NOT RUN | - | +| 1534 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan12 - VRF10_VLAN12 = 'up' | NOT RUN | - | +| 1535 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan21 - VRF11_VLAN21 = 'up' | NOT RUN | - | +| 1536 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan22 - VRF11_VLAN22 = 'up' | NOT RUN | - | +| 1537 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan3009 - MLAG_PEER_L3_iBGP: vrf VRF10 = 'up' | NOT RUN | - | +| 1538 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan3010 - MLAG_PEER_L3_iBGP: vrf VRF11 = 'up' | NOT RUN | - | +| 1539 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up' | NOT RUN | - | +| 1540 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4094 - MLAG_PEER = 'up' | NOT RUN | - | +| 1541 | dc2-leaf1b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vxlan1 = 'up' | NOT RUN | - | +| 1542 | dc2-leaf1b | LANZ | VerifyLANZ | Verifies if LANZ is enabled. | - | NOT RUN | - | +| 1543 | dc2-leaf1b | Logging | VerifyLoggingAccounting | Verifies if AAA accounting logs are generated. | - | NOT RUN | - | +| 1544 | dc2-leaf1b | Logging | VerifyLoggingErrors | Verifies there are no syslog messages with a severity of ERRORS or higher. | - | NOT RUN | - | +| 1545 | dc2-leaf1b | Logging | VerifyLoggingHostname | Verifies if logs are generated with the device FQDN. | - | NOT RUN | - | +| 1546 | dc2-leaf1b | Logging | VerifyLoggingHosts | Verifies logging hosts (syslog servers) for a specified VRF. | - | NOT RUN | - | +| 1547 | dc2-leaf1b | Logging | VerifyLoggingLogsGeneration | Verifies if logs are generated. | - | NOT RUN | - | +| 1548 | dc2-leaf1b | Logging | VerifyLoggingPersistent | Verifies if logging persistent is enabled and logs are saved in flash. | - | NOT RUN | - | +| 1549 | dc2-leaf1b | Logging | VerifyLoggingSourceInt | Verifies logging source-interface for a specified VRF. | - | NOT RUN | - | +| 1550 | dc2-leaf1b | Logging | VerifyLoggingTimestamp | Verifies if logs are generated with the riate timestamp. | - | NOT RUN | - | +| 1551 | dc2-leaf1b | MLAG | VerifyMlagConfigSanity | Verifies there are no MLAG config-sanity inconsistencies. | - | NOT RUN | - | +| 1552 | dc2-leaf1b | MLAG | VerifyMlagDualPrimary | Verifies the MLAG dual-primary detection parameters. | - | NOT RUN | - | +| 1553 | dc2-leaf1b | MLAG | VerifyMlagInterfaces | Verifies there are no inactive or active-partial MLAG ports. | - | NOT RUN | - | +| 1554 | dc2-leaf1b | MLAG | VerifyMlagReloadDelay | Verifies the MLAG reload-delay parameters. | - | NOT RUN | - | +| 1555 | dc2-leaf1b | MLAG | VerifyMlagStatus | Verifies the health status of the MLAG configuration. | - | NOT RUN | - | +| 1556 | dc2-leaf1b | MLAG | VerifyMlagStatus | Verifies the health status of the MLAG configuration. | - | NOT RUN | - | +| 1557 | dc2-leaf1b | Multicast | VerifyIGMPSnoopingGlobal | Verifies the IGMP snooping global configuration. | - | NOT RUN | - | +| 1558 | dc2-leaf1b | Multicast | VerifyIGMPSnoopingVlans | Verifies the IGMP snooping status for the provided VLANs. | - | NOT RUN | - | +| 1559 | dc2-leaf1b | PTP | VerifyPtpGMStatus | Verifies that the device is locked to a valid PTP Grandmaster. | - | NOT RUN | - | +| 1560 | dc2-leaf1b | PTP | VerifyPtpLockStatus | Verifies that the device was locked to the upstream PTP GM in the last minute. | - | NOT RUN | - | +| 1561 | dc2-leaf1b | PTP | VerifyPtpModeStatus | Verifies that the device is configured as a PTP Boundary Clock. | - | NOT RUN | - | +| 1562 | dc2-leaf1b | PTP | VerifyPtpOffset | Verifies that the PTP timing offset is within +/- 1000ns from the master clock. | - | NOT RUN | - | +| 1563 | dc2-leaf1b | PTP | VerifyPtpPortModeStatus | Verifies the PTP interfaces state. | - | NOT RUN | - | +| 1564 | dc2-leaf1b | Routing | VerifyRoutingProtocolModel | Verifies the configured routing protocol model. | Routing protocol model: multi-agent | NOT RUN | - | +| 1565 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.1 - Peer: dc1-spine1 | NOT RUN | - | +| 1566 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.2 - Peer: dc1-spine2 | NOT RUN | - | +| 1567 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.3 - Peer: dc1-leaf1a | NOT RUN | - | +| 1568 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.4 - Peer: dc1-leaf1b | NOT RUN | - | +| 1569 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.5 - Peer: dc1-leaf2a | NOT RUN | - | +| 1570 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.3 - Peer: dc1-leaf1a | NOT RUN | - | +| 1571 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.5 - Peer: dc1-leaf2a | NOT RUN | - | +| 1572 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.11 - Peer: dc2-spine1 | NOT RUN | - | +| 1573 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.12 - Peer: dc2-spine2 | NOT RUN | - | +| 1574 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.13 - Peer: dc2-leaf1a | NOT RUN | - | +| 1575 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.14 - Peer: dc2-leaf1b | NOT RUN | - | +| 1576 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.15 - Peer: dc2-leaf2a | NOT RUN | - | +| 1577 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.16 - Peer: dc2-leaf2b | NOT RUN | - | +| 1578 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | +| 1579 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com | NOT RUN | - | +| 1580 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.13 - Peer: dc2-leaf1a | NOT RUN | - | +| 1581 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.15 - Peer: dc2-leaf2a | NOT RUN | - | +| 1582 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | +| 1583 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.1 - Peer: dc1-wan1 | NOT RUN | - | +| 1584 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.2 - Peer: dc1-wan2 | NOT RUN | - | +| 1585 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.33.0.5 - Peer: dc1-svc-leaf1a | NOT RUN | - | +| 1586 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.33.0.6 - Peer: dc1-svc-leaf1b | NOT RUN | - | +| 1587 | dc2-leaf1b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.33.1.5 - Peer: dc1-svc-leaf1a | NOT RUN | - | +| 1588 | dc2-leaf1b | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | - | NOT RUN | - | +| 1589 | dc2-leaf1b | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | +| 1590 | dc2-leaf1b | Security | VerifyAPIHttpStatus | Verifies if eAPI HTTP server is disabled globally. | - | NOT RUN | - | +| 1591 | dc2-leaf1b | Security | VerifyAPIIPv4Acl | Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 1592 | dc2-leaf1b | Security | VerifyAPIIPv6Acl | Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 1593 | dc2-leaf1b | Security | VerifyAPISSLCertificate | Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size. | - | NOT RUN | - | +| 1594 | dc2-leaf1b | Security | VerifyBannerLogin | Verifies the login banner of a device. | - | NOT RUN | - | +| 1595 | dc2-leaf1b | Security | VerifyBannerMotd | Verifies the motd banner of a device. | - | NOT RUN | - | +| 1596 | dc2-leaf1b | Security | VerifyIPSecConnHealth | Verifies all IPv4 security connections. | - | NOT RUN | - | +| 1597 | dc2-leaf1b | Security | VerifyIPv4ACL | Verifies the configuration of IPv4 ACLs. | - | NOT RUN | - | +| 1598 | dc2-leaf1b | Security | VerifySpecificIPSecConn | Verifies IPv4 security connections for a peer. | - | NOT RUN | - | +| 1599 | dc2-leaf1b | Security | VerifySSHIPv4Acl | Verifies if the SSHD agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 1600 | dc2-leaf1b | Security | VerifySSHIPv6Acl | Verifies if the SSHD agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 1601 | dc2-leaf1b | Security | VerifySSHStatus | Verifies if the SSHD agent is disabled in the default VRF. | - | NOT RUN | - | +| 1602 | dc2-leaf1b | Security | VerifyTelnetStatus | Verifies if Telnet is disabled in the default VRF. | - | NOT RUN | - | +| 1603 | dc2-leaf1b | Services | VerifyDNSLookup | Verifies the DNS name to IP address resolution. | - | NOT RUN | - | +| 1604 | dc2-leaf1b | Services | VerifyDNSServers | Verifies if the DNS servers are correctly configured. | - | NOT RUN | - | +| 1605 | dc2-leaf1b | Services | VerifyErrdisableRecovery | Verifies the errdisable recovery reason, status, and interval. | - | NOT RUN | - | +| 1606 | dc2-leaf1b | Services | VerifyHostname | Verifies the hostname of a device. | - | NOT RUN | - | +| 1607 | dc2-leaf1b | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 1608 | dc2-leaf1b | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 1609 | dc2-leaf1b | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | +| 1610 | dc2-leaf1b | Software | VerifyEOSVersion | Verifies the EOS version of the device. | - | NOT RUN | - | +| 1611 | dc2-leaf1b | Software | VerifyTerminAttrVersion | Verifies the TerminAttr version of the device. | - | NOT RUN | - | +| 1612 | dc2-leaf1b | STP | VerifySTPBlockedPorts | Verifies there is no STP blocked ports. | - | NOT RUN | - | +| 1613 | dc2-leaf1b | STP | VerifySTPCounters | Verifies there is no errors in STP BPDU packets. | - | NOT RUN | - | +| 1614 | dc2-leaf1b | STP | VerifySTPForwardingPorts | Verifies that all interfaces are forwarding for a provided list of VLAN(s). | - | NOT RUN | - | +| 1615 | dc2-leaf1b | STP | VerifySTPMode | Verifies the configured STP mode for a provided list of VLAN(s). | - | NOT RUN | - | +| 1616 | dc2-leaf1b | STP | VerifySTPRootPriority | Verifies the STP root priority for a provided list of VLAN or MST instance ID(s). | - | NOT RUN | - | +| 1617 | dc2-leaf1b | STUN | VerifyStunClient | Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided. | - | NOT RUN | - | +| 1618 | dc2-leaf1b | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | +| 1619 | dc2-leaf1b | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | +| 1620 | dc2-leaf1b | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | +| 1621 | dc2-leaf1b | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | +| 1622 | dc2-leaf1b | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | +| 1623 | dc2-leaf1b | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 1624 | dc2-leaf1b | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 1625 | dc2-leaf1b | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | +| 1626 | dc2-leaf1b | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | +| 1627 | dc2-leaf1b | VLAN | VerifyVlanInternalPolicy | Verifies the VLAN internal allocation policy and the range of VLANs. | - | NOT RUN | - | +| 1628 | dc2-leaf1c | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 1629 | dc2-leaf1c | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 1630 | dc2-leaf1c | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | +| 1631 | dc2-leaf1c | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | +| 1632 | dc2-leaf1c | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | +| 1633 | dc2-leaf1c | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | +| 1634 | dc2-leaf1c | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | +| 1635 | dc2-leaf1c | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | +| 1636 | dc2-leaf1c | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | +| 1637 | dc2-leaf1c | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc2-leaf1a Ethernet8 | NOT RUN | - | +| 1638 | dc2-leaf1c | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc2-leaf1b Ethernet8 | NOT RUN | - | +| 1639 | dc2-leaf1c | Field Notices | VerifyFieldNotice44Resolution | Verifies that the device is using the correct Aboot version per FN0044. | - | NOT RUN | - | +| 1640 | dc2-leaf1c | Field Notices | VerifyFieldNotice72Resolution | Verifies if the device is exposed to FN0072, and if the issue has been mitigated. | - | NOT RUN | - | +| 1641 | dc2-leaf1c | Greent | VerifyGreenT | Verifies if a GreenT policy is created. | - | NOT RUN | - | +| 1642 | dc2-leaf1c | Greent | VerifyGreenTCounters | Verifies if the GreenT counters are incremented. | - | NOT RUN | - | +| 1643 | dc2-leaf1c | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches. | - | NOT RUN | - | +| 1644 | dc2-leaf1c | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | +| 1645 | dc2-leaf1c | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | +| 1646 | dc2-leaf1c | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | +| 1647 | dc2-leaf1c | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | +| 1648 | dc2-leaf1c | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | +| 1649 | dc2-leaf1c | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 1650 | dc2-leaf1c | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 1651 | dc2-leaf1c | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | +| 1652 | dc2-leaf1c | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | +| 1653 | dc2-leaf1c | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | +| 1654 | dc2-leaf1c | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - DC2-LEAF1A_Ethernet8 = 'up' | NOT RUN | - | +| 1655 | dc2-leaf1c | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - DC2-LEAF1B_Ethernet8 = 'up' | NOT RUN | - | +| 1656 | dc2-leaf1c | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet5 - dc2-leaf1-server1_iLO = 'up' | NOT RUN | - | +| 1657 | dc2-leaf1c | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel1 - DC2_L3_LEAF1_Po8 = 'up' | NOT RUN | - | +| 1658 | dc2-leaf1c | LANZ | VerifyLANZ | Verifies if LANZ is enabled. | - | NOT RUN | - | +| 1659 | dc2-leaf1c | PTP | VerifyPtpGMStatus | Verifies that the device is locked to a valid PTP Grandmaster. | - | NOT RUN | - | +| 1660 | dc2-leaf1c | PTP | VerifyPtpLockStatus | Verifies that the device was locked to the upstream PTP GM in the last minute. | - | NOT RUN | - | +| 1661 | dc2-leaf1c | PTP | VerifyPtpModeStatus | Verifies that the device is configured as a PTP Boundary Clock. | - | NOT RUN | - | +| 1662 | dc2-leaf1c | PTP | VerifyPtpOffset | Verifies that the PTP timing offset is within +/- 1000ns from the master clock. | - | NOT RUN | - | +| 1663 | dc2-leaf1c | PTP | VerifyPtpPortModeStatus | Verifies the PTP interfaces state. | - | NOT RUN | - | +| 1664 | dc2-leaf1c | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | - | NOT RUN | - | +| 1665 | dc2-leaf1c | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | +| 1666 | dc2-leaf1c | Security | VerifyAPIHttpStatus | Verifies if eAPI HTTP server is disabled globally. | - | NOT RUN | - | +| 1667 | dc2-leaf1c | Security | VerifyAPIIPv4Acl | Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 1668 | dc2-leaf1c | Security | VerifyAPIIPv6Acl | Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 1669 | dc2-leaf1c | Security | VerifyAPISSLCertificate | Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size. | - | NOT RUN | - | +| 1670 | dc2-leaf1c | Security | VerifyBannerLogin | Verifies the login banner of a device. | - | NOT RUN | - | +| 1671 | dc2-leaf1c | Security | VerifyBannerMotd | Verifies the motd banner of a device. | - | NOT RUN | - | +| 1672 | dc2-leaf1c | Security | VerifyIPSecConnHealth | Verifies all IPv4 security connections. | - | NOT RUN | - | +| 1673 | dc2-leaf1c | Security | VerifyIPv4ACL | Verifies the configuration of IPv4 ACLs. | - | NOT RUN | - | +| 1674 | dc2-leaf1c | Security | VerifySpecificIPSecConn | Verifies IPv4 security connections for a peer. | - | NOT RUN | - | +| 1675 | dc2-leaf1c | Security | VerifySSHIPv4Acl | Verifies if the SSHD agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 1676 | dc2-leaf1c | Security | VerifySSHIPv6Acl | Verifies if the SSHD agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 1677 | dc2-leaf1c | Security | VerifySSHStatus | Verifies if the SSHD agent is disabled in the default VRF. | - | NOT RUN | - | +| 1678 | dc2-leaf1c | Security | VerifyTelnetStatus | Verifies if Telnet is disabled in the default VRF. | - | NOT RUN | - | +| 1679 | dc2-leaf1c | Services | VerifyDNSLookup | Verifies the DNS name to IP address resolution. | - | NOT RUN | - | +| 1680 | dc2-leaf1c | Services | VerifyDNSServers | Verifies if the DNS servers are correctly configured. | - | NOT RUN | - | +| 1681 | dc2-leaf1c | Services | VerifyErrdisableRecovery | Verifies the errdisable recovery reason, status, and interval. | - | NOT RUN | - | +| 1682 | dc2-leaf1c | Services | VerifyHostname | Verifies the hostname of a device. | - | NOT RUN | - | +| 1683 | dc2-leaf1c | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 1684 | dc2-leaf1c | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 1685 | dc2-leaf1c | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | +| 1686 | dc2-leaf1c | Software | VerifyEOSVersion | Verifies the EOS version of the device. | - | NOT RUN | - | +| 1687 | dc2-leaf1c | Software | VerifyTerminAttrVersion | Verifies the TerminAttr version of the device. | - | NOT RUN | - | +| 1688 | dc2-leaf1c | STUN | VerifyStunClient | Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided. | - | NOT RUN | - | +| 1689 | dc2-leaf1c | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | +| 1690 | dc2-leaf1c | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | +| 1691 | dc2-leaf1c | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | +| 1692 | dc2-leaf1c | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | +| 1693 | dc2-leaf1c | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | +| 1694 | dc2-leaf1c | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 1695 | dc2-leaf1c | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 1696 | dc2-leaf1c | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | +| 1697 | dc2-leaf1c | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | +| 1698 | dc2-leaf1c | VLAN | VerifyVlanInternalPolicy | Verifies the VLAN internal allocation policy and the range of VLANs. | - | NOT RUN | - | +| 1699 | dc2-leaf2a | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 1700 | dc2-leaf2a | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 1701 | dc2-leaf2a | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | +| 1702 | dc2-leaf2a | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | +| 1703 | dc2-leaf2a | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | +| 1704 | dc2-leaf2a | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | +| 1705 | dc2-leaf2a | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | +| 1706 | dc2-leaf2a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc1-leaf2a (IP: 10.255.0.5) | NOT RUN | - | +| 1707 | dc2-leaf2a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-spine1 (IP: 10.255.128.11) | NOT RUN | - | +| 1708 | dc2-leaf2a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-spine2 (IP: 10.255.128.12) | NOT RUN | - | +| 1709 | dc2-leaf2a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc1-leaf2a (IP: 192.168.100.0) | NOT RUN | - | +| 1710 | dc2-leaf2a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf2b (IP: 10.255.129.121) | NOT RUN | - | +| 1711 | dc2-leaf2a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-spine1 (IP: 10.255.255.112) | NOT RUN | - | +| 1712 | dc2-leaf2a | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-spine2 (IP: 10.255.255.114) | NOT RUN | - | +| 1713 | dc2-leaf2a | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | +| 1714 | dc2-leaf2a | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | +| 1715 | dc2-leaf2a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc2-spine1 Ethernet3 | NOT RUN | - | +| 1716 | dc2-leaf2a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc2-spine2 Ethernet3 | NOT RUN | - | +| 1717 | dc2-leaf2a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet3 - Remote: dc2-leaf2b Ethernet3 | NOT RUN | - | +| 1718 | dc2-leaf2a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet4 - Remote: dc2-leaf2b Ethernet4 | NOT RUN | - | +| 1719 | dc2-leaf2a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet6 - Remote: dc1-leaf2a Ethernet6 | NOT RUN | - | +| 1720 | dc2-leaf2a | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet8 - Remote: dc2-leaf2c Ethernet1 | NOT RUN | - | +| 1721 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3) | NOT RUN | - | +| 1722 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4) | NOT RUN | - | +| 1723 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5) | NOT RUN | - | +| 1724 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1) | NOT RUN | - | +| 1725 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2) | NOT RUN | - | +| 1726 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5) | NOT RUN | - | +| 1727 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6) | NOT RUN | - | +| 1728 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1) | NOT RUN | - | +| 1729 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2) | NOT RUN | - | +| 1730 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.15) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13) | NOT RUN | - | +| 1731 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.15) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14) | NOT RUN | - | +| 1732 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.15) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15) | NOT RUN | - | +| 1733 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.15) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16) | NOT RUN | - | +| 1734 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.15) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17) | NOT RUN | - | +| 1735 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.15) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18) | NOT RUN | - | +| 1736 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.15) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11) | NOT RUN | - | +| 1737 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.15) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12) | NOT RUN | - | +| 1738 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet1 (IP: 10.255.255.113) - Destination: dc2-spine1 Ethernet3 (IP: 10.255.255.112) | NOT RUN | - | +| 1739 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet2 (IP: 10.255.255.115) - Destination: dc2-spine2 Ethernet3 (IP: 10.255.255.114) | NOT RUN | - | +| 1740 | dc2-leaf2a | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet6 (IP: 192.168.100.1) - Destination: dc1-leaf2a Ethernet6 (IP: 192.168.100.0) | NOT RUN | - | +| 1741 | dc2-leaf2a | Field Notices | VerifyFieldNotice44Resolution | Verifies that the device is using the correct Aboot version per FN0044. | - | NOT RUN | - | +| 1742 | dc2-leaf2a | Field Notices | VerifyFieldNotice72Resolution | Verifies if the device is exposed to FN0072, and if the issue has been mitigated. | - | NOT RUN | - | +| 1743 | dc2-leaf2a | Greent | VerifyGreenT | Verifies if a GreenT policy is created. | - | NOT RUN | - | +| 1744 | dc2-leaf2a | Greent | VerifyGreenTCounters | Verifies if the GreenT counters are incremented. | - | NOT RUN | - | +| 1745 | dc2-leaf2a | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches. | - | NOT RUN | - | +| 1746 | dc2-leaf2a | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | +| 1747 | dc2-leaf2a | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | +| 1748 | dc2-leaf2a | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | +| 1749 | dc2-leaf2a | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | +| 1750 | dc2-leaf2a | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | +| 1751 | dc2-leaf2a | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 1752 | dc2-leaf2a | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 1753 | dc2-leaf2a | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | +| 1754 | dc2-leaf2a | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | +| 1755 | dc2-leaf2a | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | +| 1756 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - P2P_LINK_TO_DC2-SPINE1_Ethernet3 = 'up' | NOT RUN | - | +| 1757 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - P2P_LINK_TO_DC2-SPINE2_Ethernet3 = 'up' | NOT RUN | - | +| 1758 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet3 - MLAG_PEER_dc2-leaf2b_Ethernet3 = 'up' | NOT RUN | - | +| 1759 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet4 - MLAG_PEER_dc2-leaf2b_Ethernet4 = 'up' | NOT RUN | - | +| 1760 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet5 - dc2-leaf2-server1_PCI1 = 'up' | NOT RUN | - | +| 1761 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet6 - P2P_LINK_TO_dc1-leaf2a_Ethernet6 = 'up' | NOT RUN | - | +| 1762 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet8 - DC2-LEAF2C_Ethernet1 = 'up' | NOT RUN | - | +| 1763 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback0 - EVPN_Overlay_Peering = 'up' | NOT RUN | - | +| 1764 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up' | NOT RUN | - | +| 1765 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback10 - VRF10_VTEP_DIAGNOSTICS = 'up' | NOT RUN | - | +| 1766 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback11 - VRF11_VTEP_DIAGNOSTICS = 'up' | NOT RUN | - | +| 1767 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel3 - MLAG_PEER_dc2-leaf2b_Po3 = 'up' | NOT RUN | - | +| 1768 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel5 - dc2-leaf2-server1_PortChannel dc2-leaf2-server1 = 'up' | NOT RUN | - | +| 1769 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel8 - DC2-LEAF2C_Po1 = 'up' | NOT RUN | - | +| 1770 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan11 - VRF10_VLAN11 = 'up' | NOT RUN | - | +| 1771 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan12 - VRF10_VLAN12 = 'up' | NOT RUN | - | +| 1772 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan21 - VRF11_VLAN21 = 'up' | NOT RUN | - | +| 1773 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan22 - VRF11_VLAN22 = 'up' | NOT RUN | - | +| 1774 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan3009 - MLAG_PEER_L3_iBGP: vrf VRF10 = 'up' | NOT RUN | - | +| 1775 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan3010 - MLAG_PEER_L3_iBGP: vrf VRF11 = 'up' | NOT RUN | - | +| 1776 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up' | NOT RUN | - | +| 1777 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4094 - MLAG_PEER = 'up' | NOT RUN | - | +| 1778 | dc2-leaf2a | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vxlan1 = 'up' | NOT RUN | - | +| 1779 | dc2-leaf2a | LANZ | VerifyLANZ | Verifies if LANZ is enabled. | - | NOT RUN | - | +| 1780 | dc2-leaf2a | Logging | VerifyLoggingAccounting | Verifies if AAA accounting logs are generated. | - | NOT RUN | - | +| 1781 | dc2-leaf2a | Logging | VerifyLoggingErrors | Verifies there are no syslog messages with a severity of ERRORS or higher. | - | NOT RUN | - | +| 1782 | dc2-leaf2a | Logging | VerifyLoggingHostname | Verifies if logs are generated with the device FQDN. | - | NOT RUN | - | +| 1783 | dc2-leaf2a | Logging | VerifyLoggingHosts | Verifies logging hosts (syslog servers) for a specified VRF. | - | NOT RUN | - | +| 1784 | dc2-leaf2a | Logging | VerifyLoggingLogsGeneration | Verifies if logs are generated. | - | NOT RUN | - | +| 1785 | dc2-leaf2a | Logging | VerifyLoggingPersistent | Verifies if logging persistent is enabled and logs are saved in flash. | - | NOT RUN | - | +| 1786 | dc2-leaf2a | Logging | VerifyLoggingSourceInt | Verifies logging source-interface for a specified VRF. | - | NOT RUN | - | +| 1787 | dc2-leaf2a | Logging | VerifyLoggingTimestamp | Verifies if logs are generated with the riate timestamp. | - | NOT RUN | - | +| 1788 | dc2-leaf2a | MLAG | VerifyMlagConfigSanity | Verifies there are no MLAG config-sanity inconsistencies. | - | NOT RUN | - | +| 1789 | dc2-leaf2a | MLAG | VerifyMlagDualPrimary | Verifies the MLAG dual-primary detection parameters. | - | NOT RUN | - | +| 1790 | dc2-leaf2a | MLAG | VerifyMlagInterfaces | Verifies there are no inactive or active-partial MLAG ports. | - | NOT RUN | - | +| 1791 | dc2-leaf2a | MLAG | VerifyMlagReloadDelay | Verifies the MLAG reload-delay parameters. | - | NOT RUN | - | +| 1792 | dc2-leaf2a | MLAG | VerifyMlagStatus | Verifies the health status of the MLAG configuration. | - | NOT RUN | - | +| 1793 | dc2-leaf2a | MLAG | VerifyMlagStatus | Verifies the health status of the MLAG configuration. | - | NOT RUN | - | +| 1794 | dc2-leaf2a | Multicast | VerifyIGMPSnoopingGlobal | Verifies the IGMP snooping global configuration. | - | NOT RUN | - | +| 1795 | dc2-leaf2a | Multicast | VerifyIGMPSnoopingVlans | Verifies the IGMP snooping status for the provided VLANs. | - | NOT RUN | - | +| 1796 | dc2-leaf2a | PTP | VerifyPtpGMStatus | Verifies that the device is locked to a valid PTP Grandmaster. | - | NOT RUN | - | +| 1797 | dc2-leaf2a | PTP | VerifyPtpLockStatus | Verifies that the device was locked to the upstream PTP GM in the last minute. | - | NOT RUN | - | +| 1798 | dc2-leaf2a | PTP | VerifyPtpModeStatus | Verifies that the device is configured as a PTP Boundary Clock. | - | NOT RUN | - | +| 1799 | dc2-leaf2a | PTP | VerifyPtpOffset | Verifies that the PTP timing offset is within +/- 1000ns from the master clock. | - | NOT RUN | - | +| 1800 | dc2-leaf2a | PTP | VerifyPtpPortModeStatus | Verifies the PTP interfaces state. | - | NOT RUN | - | +| 1801 | dc2-leaf2a | Routing | VerifyRoutingProtocolModel | Verifies the configured routing protocol model. | Routing protocol model: multi-agent | NOT RUN | - | +| 1802 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.1 - Peer: dc1-spine1 | NOT RUN | - | +| 1803 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.2 - Peer: dc1-spine2 | NOT RUN | - | +| 1804 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.3 - Peer: dc1-leaf1a | NOT RUN | - | +| 1805 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.4 - Peer: dc1-leaf1b | NOT RUN | - | +| 1806 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.5 - Peer: dc1-leaf2a | NOT RUN | - | +| 1807 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.3 - Peer: dc1-leaf1a | NOT RUN | - | +| 1808 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.5 - Peer: dc1-leaf2a | NOT RUN | - | +| 1809 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.11 - Peer: dc2-spine1 | NOT RUN | - | +| 1810 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.12 - Peer: dc2-spine2 | NOT RUN | - | +| 1811 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.13 - Peer: dc2-leaf1a | NOT RUN | - | +| 1812 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.14 - Peer: dc2-leaf1b | NOT RUN | - | +| 1813 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.15 - Peer: dc2-leaf2a | NOT RUN | - | +| 1814 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.16 - Peer: dc2-leaf2b | NOT RUN | - | +| 1815 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | +| 1816 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com | NOT RUN | - | +| 1817 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.13 - Peer: dc2-leaf1a | NOT RUN | - | +| 1818 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.15 - Peer: dc2-leaf2a | NOT RUN | - | +| 1819 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | +| 1820 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.1 - Peer: dc1-wan1 | NOT RUN | - | +| 1821 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.2 - Peer: dc1-wan2 | NOT RUN | - | +| 1822 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.33.0.5 - Peer: dc1-svc-leaf1a | NOT RUN | - | +| 1823 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.33.0.6 - Peer: dc1-svc-leaf1b | NOT RUN | - | +| 1824 | dc2-leaf2a | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.33.1.5 - Peer: dc1-svc-leaf1a | NOT RUN | - | +| 1825 | dc2-leaf2a | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | - | NOT RUN | - | +| 1826 | dc2-leaf2a | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | +| 1827 | dc2-leaf2a | Security | VerifyAPIHttpStatus | Verifies if eAPI HTTP server is disabled globally. | - | NOT RUN | - | +| 1828 | dc2-leaf2a | Security | VerifyAPIIPv4Acl | Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 1829 | dc2-leaf2a | Security | VerifyAPIIPv6Acl | Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 1830 | dc2-leaf2a | Security | VerifyAPISSLCertificate | Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size. | - | NOT RUN | - | +| 1831 | dc2-leaf2a | Security | VerifyBannerLogin | Verifies the login banner of a device. | - | NOT RUN | - | +| 1832 | dc2-leaf2a | Security | VerifyBannerMotd | Verifies the motd banner of a device. | - | NOT RUN | - | +| 1833 | dc2-leaf2a | Security | VerifyIPSecConnHealth | Verifies all IPv4 security connections. | - | NOT RUN | - | +| 1834 | dc2-leaf2a | Security | VerifyIPv4ACL | Verifies the configuration of IPv4 ACLs. | - | NOT RUN | - | +| 1835 | dc2-leaf2a | Security | VerifySpecificIPSecConn | Verifies IPv4 security connections for a peer. | - | NOT RUN | - | +| 1836 | dc2-leaf2a | Security | VerifySSHIPv4Acl | Verifies if the SSHD agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 1837 | dc2-leaf2a | Security | VerifySSHIPv6Acl | Verifies if the SSHD agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 1838 | dc2-leaf2a | Security | VerifySSHStatus | Verifies if the SSHD agent is disabled in the default VRF. | - | NOT RUN | - | +| 1839 | dc2-leaf2a | Security | VerifyTelnetStatus | Verifies if Telnet is disabled in the default VRF. | - | NOT RUN | - | +| 1840 | dc2-leaf2a | Services | VerifyDNSLookup | Verifies the DNS name to IP address resolution. | - | NOT RUN | - | +| 1841 | dc2-leaf2a | Services | VerifyDNSServers | Verifies if the DNS servers are correctly configured. | - | NOT RUN | - | +| 1842 | dc2-leaf2a | Services | VerifyErrdisableRecovery | Verifies the errdisable recovery reason, status, and interval. | - | NOT RUN | - | +| 1843 | dc2-leaf2a | Services | VerifyHostname | Verifies the hostname of a device. | - | NOT RUN | - | +| 1844 | dc2-leaf2a | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 1845 | dc2-leaf2a | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 1846 | dc2-leaf2a | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | +| 1847 | dc2-leaf2a | Software | VerifyEOSVersion | Verifies the EOS version of the device. | - | NOT RUN | - | +| 1848 | dc2-leaf2a | Software | VerifyTerminAttrVersion | Verifies the TerminAttr version of the device. | - | NOT RUN | - | +| 1849 | dc2-leaf2a | STP | VerifySTPBlockedPorts | Verifies there is no STP blocked ports. | - | NOT RUN | - | +| 1850 | dc2-leaf2a | STP | VerifySTPCounters | Verifies there is no errors in STP BPDU packets. | - | NOT RUN | - | +| 1851 | dc2-leaf2a | STP | VerifySTPForwardingPorts | Verifies that all interfaces are forwarding for a provided list of VLAN(s). | - | NOT RUN | - | +| 1852 | dc2-leaf2a | STP | VerifySTPMode | Verifies the configured STP mode for a provided list of VLAN(s). | - | NOT RUN | - | +| 1853 | dc2-leaf2a | STP | VerifySTPRootPriority | Verifies the STP root priority for a provided list of VLAN or MST instance ID(s). | - | NOT RUN | - | +| 1854 | dc2-leaf2a | STUN | VerifyStunClient | Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided. | - | NOT RUN | - | +| 1855 | dc2-leaf2a | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | +| 1856 | dc2-leaf2a | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | +| 1857 | dc2-leaf2a | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | +| 1858 | dc2-leaf2a | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | +| 1859 | dc2-leaf2a | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | +| 1860 | dc2-leaf2a | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 1861 | dc2-leaf2a | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 1862 | dc2-leaf2a | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | +| 1863 | dc2-leaf2a | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | +| 1864 | dc2-leaf2a | VLAN | VerifyVlanInternalPolicy | Verifies the VLAN internal allocation policy and the range of VLANs. | - | NOT RUN | - | +| 1865 | dc2-leaf2b | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 1866 | dc2-leaf2b | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 1867 | dc2-leaf2b | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | +| 1868 | dc2-leaf2b | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | +| 1869 | dc2-leaf2b | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | +| 1870 | dc2-leaf2b | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | +| 1871 | dc2-leaf2b | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | +| 1872 | dc2-leaf2b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-spine1 (IP: 10.255.128.11) | NOT RUN | - | +| 1873 | dc2-leaf2b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-spine2 (IP: 10.255.128.12) | NOT RUN | - | +| 1874 | dc2-leaf2b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf2a (IP: 10.255.129.120) | NOT RUN | - | +| 1875 | dc2-leaf2b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-spine1 (IP: 10.255.255.116) | NOT RUN | - | +| 1876 | dc2-leaf2b | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-spine2 (IP: 10.255.255.118) | NOT RUN | - | +| 1877 | dc2-leaf2b | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | +| 1878 | dc2-leaf2b | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | +| 1879 | dc2-leaf2b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc2-spine1 Ethernet4 | NOT RUN | - | +| 1880 | dc2-leaf2b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc2-spine2 Ethernet4 | NOT RUN | - | +| 1881 | dc2-leaf2b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet3 - Remote: dc2-leaf2a Ethernet3 | NOT RUN | - | +| 1882 | dc2-leaf2b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet4 - Remote: dc2-leaf2a Ethernet4 | NOT RUN | - | +| 1883 | dc2-leaf2b | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet8 - Remote: dc2-leaf2c Ethernet2 | NOT RUN | - | +| 1884 | dc2-leaf2b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3) | NOT RUN | - | +| 1885 | dc2-leaf2b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4) | NOT RUN | - | +| 1886 | dc2-leaf2b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5) | NOT RUN | - | +| 1887 | dc2-leaf2b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1) | NOT RUN | - | +| 1888 | dc2-leaf2b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2) | NOT RUN | - | +| 1889 | dc2-leaf2b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5) | NOT RUN | - | +| 1890 | dc2-leaf2b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6) | NOT RUN | - | +| 1891 | dc2-leaf2b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1) | NOT RUN | - | +| 1892 | dc2-leaf2b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2) | NOT RUN | - | +| 1893 | dc2-leaf2b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.16) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13) | NOT RUN | - | +| 1894 | dc2-leaf2b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.16) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14) | NOT RUN | - | +| 1895 | dc2-leaf2b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.16) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15) | NOT RUN | - | +| 1896 | dc2-leaf2b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.16) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16) | NOT RUN | - | +| 1897 | dc2-leaf2b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.16) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17) | NOT RUN | - | +| 1898 | dc2-leaf2b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.16) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18) | NOT RUN | - | +| 1899 | dc2-leaf2b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.16) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11) | NOT RUN | - | +| 1900 | dc2-leaf2b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.16) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12) | NOT RUN | - | +| 1901 | dc2-leaf2b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet1 (IP: 10.255.255.117) - Destination: dc2-spine1 Ethernet4 (IP: 10.255.255.116) | NOT RUN | - | +| 1902 | dc2-leaf2b | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet2 (IP: 10.255.255.119) - Destination: dc2-spine2 Ethernet4 (IP: 10.255.255.118) | NOT RUN | - | +| 1903 | dc2-leaf2b | Field Notices | VerifyFieldNotice44Resolution | Verifies that the device is using the correct Aboot version per FN0044. | - | NOT RUN | - | +| 1904 | dc2-leaf2b | Field Notices | VerifyFieldNotice72Resolution | Verifies if the device is exposed to FN0072, and if the issue has been mitigated. | - | NOT RUN | - | +| 1905 | dc2-leaf2b | Greent | VerifyGreenT | Verifies if a GreenT policy is created. | - | NOT RUN | - | +| 1906 | dc2-leaf2b | Greent | VerifyGreenTCounters | Verifies if the GreenT counters are incremented. | - | NOT RUN | - | +| 1907 | dc2-leaf2b | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches. | - | NOT RUN | - | +| 1908 | dc2-leaf2b | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | +| 1909 | dc2-leaf2b | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | +| 1910 | dc2-leaf2b | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | +| 1911 | dc2-leaf2b | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | +| 1912 | dc2-leaf2b | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | +| 1913 | dc2-leaf2b | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 1914 | dc2-leaf2b | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 1915 | dc2-leaf2b | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | +| 1916 | dc2-leaf2b | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | +| 1917 | dc2-leaf2b | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | +| 1918 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - P2P_LINK_TO_DC2-SPINE1_Ethernet4 = 'up' | NOT RUN | - | +| 1919 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - P2P_LINK_TO_DC2-SPINE2_Ethernet4 = 'up' | NOT RUN | - | +| 1920 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet3 - MLAG_PEER_dc2-leaf2a_Ethernet3 = 'up' | NOT RUN | - | +| 1921 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet4 - MLAG_PEER_dc2-leaf2a_Ethernet4 = 'up' | NOT RUN | - | +| 1922 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet5 - dc2-leaf2-server1_PCI2 = 'up' | NOT RUN | - | +| 1923 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet6 - P2P_LINK_TO_dc1-leaf2b_Ethernet6 = 'up' | NOT RUN | - | +| 1924 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet8 - DC2-LEAF2C_Ethernet2 = 'up' | NOT RUN | - | +| 1925 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback0 - EVPN_Overlay_Peering = 'up' | NOT RUN | - | +| 1926 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up' | NOT RUN | - | +| 1927 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback10 - VRF10_VTEP_DIAGNOSTICS = 'up' | NOT RUN | - | +| 1928 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback11 - VRF11_VTEP_DIAGNOSTICS = 'up' | NOT RUN | - | +| 1929 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel3 - MLAG_PEER_dc2-leaf2a_Po3 = 'up' | NOT RUN | - | +| 1930 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel5 - dc2-leaf2-server1_PortChannel dc2-leaf2-server1 = 'up' | NOT RUN | - | +| 1931 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel8 - DC2-LEAF2C_Po1 = 'up' | NOT RUN | - | +| 1932 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan11 - VRF10_VLAN11 = 'up' | NOT RUN | - | +| 1933 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan12 - VRF10_VLAN12 = 'up' | NOT RUN | - | +| 1934 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan21 - VRF11_VLAN21 = 'up' | NOT RUN | - | +| 1935 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan22 - VRF11_VLAN22 = 'up' | NOT RUN | - | +| 1936 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan3009 - MLAG_PEER_L3_iBGP: vrf VRF10 = 'up' | NOT RUN | - | +| 1937 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan3010 - MLAG_PEER_L3_iBGP: vrf VRF11 = 'up' | NOT RUN | - | +| 1938 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up' | NOT RUN | - | +| 1939 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4094 - MLAG_PEER = 'up' | NOT RUN | - | +| 1940 | dc2-leaf2b | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vxlan1 = 'up' | NOT RUN | - | +| 1941 | dc2-leaf2b | LANZ | VerifyLANZ | Verifies if LANZ is enabled. | - | NOT RUN | - | +| 1942 | dc2-leaf2b | Logging | VerifyLoggingAccounting | Verifies if AAA accounting logs are generated. | - | NOT RUN | - | +| 1943 | dc2-leaf2b | Logging | VerifyLoggingErrors | Verifies there are no syslog messages with a severity of ERRORS or higher. | - | NOT RUN | - | +| 1944 | dc2-leaf2b | Logging | VerifyLoggingHostname | Verifies if logs are generated with the device FQDN. | - | NOT RUN | - | +| 1945 | dc2-leaf2b | Logging | VerifyLoggingHosts | Verifies logging hosts (syslog servers) for a specified VRF. | - | NOT RUN | - | +| 1946 | dc2-leaf2b | Logging | VerifyLoggingLogsGeneration | Verifies if logs are generated. | - | NOT RUN | - | +| 1947 | dc2-leaf2b | Logging | VerifyLoggingPersistent | Verifies if logging persistent is enabled and logs are saved in flash. | - | NOT RUN | - | +| 1948 | dc2-leaf2b | Logging | VerifyLoggingSourceInt | Verifies logging source-interface for a specified VRF. | - | NOT RUN | - | +| 1949 | dc2-leaf2b | Logging | VerifyLoggingTimestamp | Verifies if logs are generated with the riate timestamp. | - | NOT RUN | - | +| 1950 | dc2-leaf2b | MLAG | VerifyMlagConfigSanity | Verifies there are no MLAG config-sanity inconsistencies. | - | NOT RUN | - | +| 1951 | dc2-leaf2b | MLAG | VerifyMlagDualPrimary | Verifies the MLAG dual-primary detection parameters. | - | NOT RUN | - | +| 1952 | dc2-leaf2b | MLAG | VerifyMlagInterfaces | Verifies there are no inactive or active-partial MLAG ports. | - | NOT RUN | - | +| 1953 | dc2-leaf2b | MLAG | VerifyMlagReloadDelay | Verifies the MLAG reload-delay parameters. | - | NOT RUN | - | +| 1954 | dc2-leaf2b | MLAG | VerifyMlagStatus | Verifies the health status of the MLAG configuration. | - | NOT RUN | - | +| 1955 | dc2-leaf2b | MLAG | VerifyMlagStatus | Verifies the health status of the MLAG configuration. | - | NOT RUN | - | +| 1956 | dc2-leaf2b | Multicast | VerifyIGMPSnoopingGlobal | Verifies the IGMP snooping global configuration. | - | NOT RUN | - | +| 1957 | dc2-leaf2b | Multicast | VerifyIGMPSnoopingVlans | Verifies the IGMP snooping status for the provided VLANs. | - | NOT RUN | - | +| 1958 | dc2-leaf2b | PTP | VerifyPtpGMStatus | Verifies that the device is locked to a valid PTP Grandmaster. | - | NOT RUN | - | +| 1959 | dc2-leaf2b | PTP | VerifyPtpLockStatus | Verifies that the device was locked to the upstream PTP GM in the last minute. | - | NOT RUN | - | +| 1960 | dc2-leaf2b | PTP | VerifyPtpModeStatus | Verifies that the device is configured as a PTP Boundary Clock. | - | NOT RUN | - | +| 1961 | dc2-leaf2b | PTP | VerifyPtpOffset | Verifies that the PTP timing offset is within +/- 1000ns from the master clock. | - | NOT RUN | - | +| 1962 | dc2-leaf2b | PTP | VerifyPtpPortModeStatus | Verifies the PTP interfaces state. | - | NOT RUN | - | +| 1963 | dc2-leaf2b | Routing | VerifyRoutingProtocolModel | Verifies the configured routing protocol model. | Routing protocol model: multi-agent | NOT RUN | - | +| 1964 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.1 - Peer: dc1-spine1 | NOT RUN | - | +| 1965 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.2 - Peer: dc1-spine2 | NOT RUN | - | +| 1966 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.3 - Peer: dc1-leaf1a | NOT RUN | - | +| 1967 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.4 - Peer: dc1-leaf1b | NOT RUN | - | +| 1968 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.5 - Peer: dc1-leaf2a | NOT RUN | - | +| 1969 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.3 - Peer: dc1-leaf1a | NOT RUN | - | +| 1970 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.5 - Peer: dc1-leaf2a | NOT RUN | - | +| 1971 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.11 - Peer: dc2-spine1 | NOT RUN | - | +| 1972 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.12 - Peer: dc2-spine2 | NOT RUN | - | +| 1973 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.13 - Peer: dc2-leaf1a | NOT RUN | - | +| 1974 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.14 - Peer: dc2-leaf1b | NOT RUN | - | +| 1975 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.15 - Peer: dc2-leaf2a | NOT RUN | - | +| 1976 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.16 - Peer: dc2-leaf2b | NOT RUN | - | +| 1977 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | +| 1978 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com | NOT RUN | - | +| 1979 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.13 - Peer: dc2-leaf1a | NOT RUN | - | +| 1980 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.15 - Peer: dc2-leaf2a | NOT RUN | - | +| 1981 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | +| 1982 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.1 - Peer: dc1-wan1 | NOT RUN | - | +| 1983 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.2 - Peer: dc1-wan2 | NOT RUN | - | +| 1984 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.33.0.5 - Peer: dc1-svc-leaf1a | NOT RUN | - | +| 1985 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.33.0.6 - Peer: dc1-svc-leaf1b | NOT RUN | - | +| 1986 | dc2-leaf2b | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.33.1.5 - Peer: dc1-svc-leaf1a | NOT RUN | - | +| 1987 | dc2-leaf2b | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | - | NOT RUN | - | +| 1988 | dc2-leaf2b | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | +| 1989 | dc2-leaf2b | Security | VerifyAPIHttpStatus | Verifies if eAPI HTTP server is disabled globally. | - | NOT RUN | - | +| 1990 | dc2-leaf2b | Security | VerifyAPIIPv4Acl | Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 1991 | dc2-leaf2b | Security | VerifyAPIIPv6Acl | Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 1992 | dc2-leaf2b | Security | VerifyAPISSLCertificate | Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size. | - | NOT RUN | - | +| 1993 | dc2-leaf2b | Security | VerifyBannerLogin | Verifies the login banner of a device. | - | NOT RUN | - | +| 1994 | dc2-leaf2b | Security | VerifyBannerMotd | Verifies the motd banner of a device. | - | NOT RUN | - | +| 1995 | dc2-leaf2b | Security | VerifyIPSecConnHealth | Verifies all IPv4 security connections. | - | NOT RUN | - | +| 1996 | dc2-leaf2b | Security | VerifyIPv4ACL | Verifies the configuration of IPv4 ACLs. | - | NOT RUN | - | +| 1997 | dc2-leaf2b | Security | VerifySpecificIPSecConn | Verifies IPv4 security connections for a peer. | - | NOT RUN | - | +| 1998 | dc2-leaf2b | Security | VerifySSHIPv4Acl | Verifies if the SSHD agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 1999 | dc2-leaf2b | Security | VerifySSHIPv6Acl | Verifies if the SSHD agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 2000 | dc2-leaf2b | Security | VerifySSHStatus | Verifies if the SSHD agent is disabled in the default VRF. | - | NOT RUN | - | +| 2001 | dc2-leaf2b | Security | VerifyTelnetStatus | Verifies if Telnet is disabled in the default VRF. | - | NOT RUN | - | +| 2002 | dc2-leaf2b | Services | VerifyDNSLookup | Verifies the DNS name to IP address resolution. | - | NOT RUN | - | +| 2003 | dc2-leaf2b | Services | VerifyDNSServers | Verifies if the DNS servers are correctly configured. | - | NOT RUN | - | +| 2004 | dc2-leaf2b | Services | VerifyErrdisableRecovery | Verifies the errdisable recovery reason, status, and interval. | - | NOT RUN | - | +| 2005 | dc2-leaf2b | Services | VerifyHostname | Verifies the hostname of a device. | - | NOT RUN | - | +| 2006 | dc2-leaf2b | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 2007 | dc2-leaf2b | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 2008 | dc2-leaf2b | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | +| 2009 | dc2-leaf2b | Software | VerifyEOSVersion | Verifies the EOS version of the device. | - | NOT RUN | - | +| 2010 | dc2-leaf2b | Software | VerifyTerminAttrVersion | Verifies the TerminAttr version of the device. | - | NOT RUN | - | +| 2011 | dc2-leaf2b | STP | VerifySTPBlockedPorts | Verifies there is no STP blocked ports. | - | NOT RUN | - | +| 2012 | dc2-leaf2b | STP | VerifySTPCounters | Verifies there is no errors in STP BPDU packets. | - | NOT RUN | - | +| 2013 | dc2-leaf2b | STP | VerifySTPForwardingPorts | Verifies that all interfaces are forwarding for a provided list of VLAN(s). | - | NOT RUN | - | +| 2014 | dc2-leaf2b | STP | VerifySTPMode | Verifies the configured STP mode for a provided list of VLAN(s). | - | NOT RUN | - | +| 2015 | dc2-leaf2b | STP | VerifySTPRootPriority | Verifies the STP root priority for a provided list of VLAN or MST instance ID(s). | - | NOT RUN | - | +| 2016 | dc2-leaf2b | STUN | VerifyStunClient | Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided. | - | NOT RUN | - | +| 2017 | dc2-leaf2b | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | +| 2018 | dc2-leaf2b | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | +| 2019 | dc2-leaf2b | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | +| 2020 | dc2-leaf2b | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | +| 2021 | dc2-leaf2b | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | +| 2022 | dc2-leaf2b | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 2023 | dc2-leaf2b | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 2024 | dc2-leaf2b | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | +| 2025 | dc2-leaf2b | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | +| 2026 | dc2-leaf2b | VLAN | VerifyVlanInternalPolicy | Verifies the VLAN internal allocation policy and the range of VLANs. | - | NOT RUN | - | +| 2027 | dc2-leaf2c | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 2028 | dc2-leaf2c | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 2029 | dc2-leaf2c | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | +| 2030 | dc2-leaf2c | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | +| 2031 | dc2-leaf2c | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | +| 2032 | dc2-leaf2c | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | +| 2033 | dc2-leaf2c | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | +| 2034 | dc2-leaf2c | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | +| 2035 | dc2-leaf2c | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | +| 2036 | dc2-leaf2c | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc2-leaf2a Ethernet8 | NOT RUN | - | +| 2037 | dc2-leaf2c | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc2-leaf2b Ethernet8 | NOT RUN | - | +| 2038 | dc2-leaf2c | Field Notices | VerifyFieldNotice44Resolution | Verifies that the device is using the correct Aboot version per FN0044. | - | NOT RUN | - | +| 2039 | dc2-leaf2c | Field Notices | VerifyFieldNotice72Resolution | Verifies if the device is exposed to FN0072, and if the issue has been mitigated. | - | NOT RUN | - | +| 2040 | dc2-leaf2c | Greent | VerifyGreenT | Verifies if a GreenT policy is created. | - | NOT RUN | - | +| 2041 | dc2-leaf2c | Greent | VerifyGreenTCounters | Verifies if the GreenT counters are incremented. | - | NOT RUN | - | +| 2042 | dc2-leaf2c | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches. | - | NOT RUN | - | +| 2043 | dc2-leaf2c | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | +| 2044 | dc2-leaf2c | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | +| 2045 | dc2-leaf2c | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | +| 2046 | dc2-leaf2c | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | +| 2047 | dc2-leaf2c | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | +| 2048 | dc2-leaf2c | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 2049 | dc2-leaf2c | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 2050 | dc2-leaf2c | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | +| 2051 | dc2-leaf2c | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | +| 2052 | dc2-leaf2c | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | +| 2053 | dc2-leaf2c | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - DC2-LEAF2A_Ethernet8 = 'up' | NOT RUN | - | +| 2054 | dc2-leaf2c | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - DC2-LEAF2B_Ethernet8 = 'up' | NOT RUN | - | +| 2055 | dc2-leaf2c | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet5 - dc2-leaf2-server1_iLO = 'up' | NOT RUN | - | +| 2056 | dc2-leaf2c | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel1 - DC2_L3_LEAF2_Po8 = 'up' | NOT RUN | - | +| 2057 | dc2-leaf2c | LANZ | VerifyLANZ | Verifies if LANZ is enabled. | - | NOT RUN | - | +| 2058 | dc2-leaf2c | PTP | VerifyPtpGMStatus | Verifies that the device is locked to a valid PTP Grandmaster. | - | NOT RUN | - | +| 2059 | dc2-leaf2c | PTP | VerifyPtpLockStatus | Verifies that the device was locked to the upstream PTP GM in the last minute. | - | NOT RUN | - | +| 2060 | dc2-leaf2c | PTP | VerifyPtpModeStatus | Verifies that the device is configured as a PTP Boundary Clock. | - | NOT RUN | - | +| 2061 | dc2-leaf2c | PTP | VerifyPtpOffset | Verifies that the PTP timing offset is within +/- 1000ns from the master clock. | - | NOT RUN | - | +| 2062 | dc2-leaf2c | PTP | VerifyPtpPortModeStatus | Verifies the PTP interfaces state. | - | NOT RUN | - | +| 2063 | dc2-leaf2c | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | - | NOT RUN | - | +| 2064 | dc2-leaf2c | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | +| 2065 | dc2-leaf2c | Security | VerifyAPIHttpStatus | Verifies if eAPI HTTP server is disabled globally. | - | NOT RUN | - | +| 2066 | dc2-leaf2c | Security | VerifyAPIIPv4Acl | Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 2067 | dc2-leaf2c | Security | VerifyAPIIPv6Acl | Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 2068 | dc2-leaf2c | Security | VerifyAPISSLCertificate | Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size. | - | NOT RUN | - | +| 2069 | dc2-leaf2c | Security | VerifyBannerLogin | Verifies the login banner of a device. | - | NOT RUN | - | +| 2070 | dc2-leaf2c | Security | VerifyBannerMotd | Verifies the motd banner of a device. | - | NOT RUN | - | +| 2071 | dc2-leaf2c | Security | VerifyIPSecConnHealth | Verifies all IPv4 security connections. | - | NOT RUN | - | +| 2072 | dc2-leaf2c | Security | VerifyIPv4ACL | Verifies the configuration of IPv4 ACLs. | - | NOT RUN | - | +| 2073 | dc2-leaf2c | Security | VerifySpecificIPSecConn | Verifies IPv4 security connections for a peer. | - | NOT RUN | - | +| 2074 | dc2-leaf2c | Security | VerifySSHIPv4Acl | Verifies if the SSHD agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 2075 | dc2-leaf2c | Security | VerifySSHIPv6Acl | Verifies if the SSHD agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 2076 | dc2-leaf2c | Security | VerifySSHStatus | Verifies if the SSHD agent is disabled in the default VRF. | - | NOT RUN | - | +| 2077 | dc2-leaf2c | Security | VerifyTelnetStatus | Verifies if Telnet is disabled in the default VRF. | - | NOT RUN | - | +| 2078 | dc2-leaf2c | Services | VerifyDNSLookup | Verifies the DNS name to IP address resolution. | - | NOT RUN | - | +| 2079 | dc2-leaf2c | Services | VerifyDNSServers | Verifies if the DNS servers are correctly configured. | - | NOT RUN | - | +| 2080 | dc2-leaf2c | Services | VerifyErrdisableRecovery | Verifies the errdisable recovery reason, status, and interval. | - | NOT RUN | - | +| 2081 | dc2-leaf2c | Services | VerifyHostname | Verifies the hostname of a device. | - | NOT RUN | - | +| 2082 | dc2-leaf2c | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 2083 | dc2-leaf2c | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 2084 | dc2-leaf2c | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | +| 2085 | dc2-leaf2c | Software | VerifyEOSVersion | Verifies the EOS version of the device. | - | NOT RUN | - | +| 2086 | dc2-leaf2c | Software | VerifyTerminAttrVersion | Verifies the TerminAttr version of the device. | - | NOT RUN | - | +| 2087 | dc2-leaf2c | STUN | VerifyStunClient | Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided. | - | NOT RUN | - | +| 2088 | dc2-leaf2c | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | +| 2089 | dc2-leaf2c | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | +| 2090 | dc2-leaf2c | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | +| 2091 | dc2-leaf2c | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | +| 2092 | dc2-leaf2c | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | +| 2093 | dc2-leaf2c | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 2094 | dc2-leaf2c | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 2095 | dc2-leaf2c | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | +| 2096 | dc2-leaf2c | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | +| 2097 | dc2-leaf2c | VLAN | VerifyVlanInternalPolicy | Verifies the VLAN internal allocation policy and the range of VLANs. | - | NOT RUN | - | +| 2098 | dc2-leaf3a.arista.com | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 2099 | dc2-leaf3a.arista.com | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 2100 | dc2-leaf3a.arista.com | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | +| 2101 | dc2-leaf3a.arista.com | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | +| 2102 | dc2-leaf3a.arista.com | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | +| 2103 | dc2-leaf3a.arista.com | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | +| 2104 | dc2-leaf3a.arista.com | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | +| 2105 | dc2-leaf3a.arista.com | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-spine1 (IP: 10.255.128.11) | NOT RUN | - | +| 2106 | dc2-leaf3a.arista.com | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-spine2 (IP: 10.255.128.12) | NOT RUN | - | +| 2107 | dc2-leaf3a.arista.com | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf3b.arista.com (IP: 10.255.129.125) | NOT RUN | - | +| 2108 | dc2-leaf3a.arista.com | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-spine1 (IP: 10.255.255.120) | NOT RUN | - | +| 2109 | dc2-leaf3a.arista.com | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-spine2 (IP: 10.255.255.122) | NOT RUN | - | +| 2110 | dc2-leaf3a.arista.com | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | +| 2111 | dc2-leaf3a.arista.com | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | +| 2112 | dc2-leaf3a.arista.com | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc2-spine1 Ethernet5 | NOT RUN | - | +| 2113 | dc2-leaf3a.arista.com | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc2-spine2 Ethernet5 | NOT RUN | - | +| 2114 | dc2-leaf3a.arista.com | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet3 - Remote: dc2-leaf3b.arista.com Ethernet3 | NOT RUN | - | +| 2115 | dc2-leaf3a.arista.com | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet4 - Remote: dc2-leaf3b.arista.com Ethernet4 | NOT RUN | - | +| 2116 | dc2-leaf3a.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3) | NOT RUN | - | +| 2117 | dc2-leaf3a.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4) | NOT RUN | - | +| 2118 | dc2-leaf3a.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5) | NOT RUN | - | +| 2119 | dc2-leaf3a.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1) | NOT RUN | - | +| 2120 | dc2-leaf3a.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2) | NOT RUN | - | +| 2121 | dc2-leaf3a.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5) | NOT RUN | - | +| 2122 | dc2-leaf3a.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6) | NOT RUN | - | +| 2123 | dc2-leaf3a.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1) | NOT RUN | - | +| 2124 | dc2-leaf3a.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2) | NOT RUN | - | +| 2125 | dc2-leaf3a.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.17) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13) | NOT RUN | - | +| 2126 | dc2-leaf3a.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.17) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14) | NOT RUN | - | +| 2127 | dc2-leaf3a.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.17) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15) | NOT RUN | - | +| 2128 | dc2-leaf3a.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.17) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16) | NOT RUN | - | +| 2129 | dc2-leaf3a.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.17) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17) | NOT RUN | - | +| 2130 | dc2-leaf3a.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.17) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18) | NOT RUN | - | +| 2131 | dc2-leaf3a.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.17) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11) | NOT RUN | - | +| 2132 | dc2-leaf3a.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.17) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12) | NOT RUN | - | +| 2133 | dc2-leaf3a.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet1 (IP: 10.255.255.121) - Destination: dc2-spine1 Ethernet5 (IP: 10.255.255.120) | NOT RUN | - | +| 2134 | dc2-leaf3a.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet2 (IP: 10.255.255.123) - Destination: dc2-spine2 Ethernet5 (IP: 10.255.255.122) | NOT RUN | - | +| 2135 | dc2-leaf3a.arista.com | Field Notices | VerifyFieldNotice44Resolution | Verifies that the device is using the correct Aboot version per FN0044. | - | NOT RUN | - | +| 2136 | dc2-leaf3a.arista.com | Field Notices | VerifyFieldNotice72Resolution | Verifies if the device is exposed to FN0072, and if the issue has been mitigated. | - | NOT RUN | - | +| 2137 | dc2-leaf3a.arista.com | Greent | VerifyGreenT | Verifies if a GreenT policy is created. | - | NOT RUN | - | +| 2138 | dc2-leaf3a.arista.com | Greent | VerifyGreenTCounters | Verifies if the GreenT counters are incremented. | - | NOT RUN | - | +| 2139 | dc2-leaf3a.arista.com | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches. | - | NOT RUN | - | +| 2140 | dc2-leaf3a.arista.com | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | +| 2141 | dc2-leaf3a.arista.com | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | +| 2142 | dc2-leaf3a.arista.com | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | +| 2143 | dc2-leaf3a.arista.com | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | +| 2144 | dc2-leaf3a.arista.com | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | +| 2145 | dc2-leaf3a.arista.com | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 2146 | dc2-leaf3a.arista.com | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 2147 | dc2-leaf3a.arista.com | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | +| 2148 | dc2-leaf3a.arista.com | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | +| 2149 | dc2-leaf3a.arista.com | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | +| 2150 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - P2P_LINK_TO_DC2-SPINE1_Ethernet5 = 'up' | NOT RUN | - | +| 2151 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet11 - dc2-leaf3-fw1_e1 = 'up' | NOT RUN | - | +| 2152 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - P2P_LINK_TO_DC2-SPINE2_Ethernet5 = 'up' | NOT RUN | - | +| 2153 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet3 - MLAG_PEER_dc2-leaf3b.arista.com_Ethernet3 = 'up' | NOT RUN | - | +| 2154 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet4 - MLAG_PEER_dc2-leaf3b.arista.com_Ethernet4 = 'up' | NOT RUN | - | +| 2155 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback0 - EVPN_Overlay_Peering = 'up' | NOT RUN | - | +| 2156 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up' | NOT RUN | - | +| 2157 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback10 - VRF10_VTEP_DIAGNOSTICS = 'up' | NOT RUN | - | +| 2158 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback11 - VRF11_VTEP_DIAGNOSTICS = 'up' | NOT RUN | - | +| 2159 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel11 - dc2-leaf3-fw1_PortChannel = 'up' | NOT RUN | - | +| 2160 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel3 - MLAG_PEER_dc2-leaf3b.arista.com_Po3 = 'up' | NOT RUN | - | +| 2161 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan11 - VRF10_VLAN11 = 'up' | NOT RUN | - | +| 2162 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan12 - VRF10_VLAN12 = 'up' | NOT RUN | - | +| 2163 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan21 - VRF11_VLAN21 = 'up' | NOT RUN | - | +| 2164 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan22 - VRF11_VLAN22 = 'up' | NOT RUN | - | +| 2165 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan3009 - MLAG_PEER_L3_iBGP: vrf VRF10 = 'up' | NOT RUN | - | +| 2166 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan3010 - MLAG_PEER_L3_iBGP: vrf VRF11 = 'up' | NOT RUN | - | +| 2167 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up' | NOT RUN | - | +| 2168 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4094 - MLAG_PEER = 'up' | NOT RUN | - | +| 2169 | dc2-leaf3a.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vxlan1 = 'up' | NOT RUN | - | +| 2170 | dc2-leaf3a.arista.com | LANZ | VerifyLANZ | Verifies if LANZ is enabled. | - | NOT RUN | - | +| 2171 | dc2-leaf3a.arista.com | Logging | VerifyLoggingAccounting | Verifies if AAA accounting logs are generated. | - | NOT RUN | - | +| 2172 | dc2-leaf3a.arista.com | Logging | VerifyLoggingErrors | Verifies there are no syslog messages with a severity of ERRORS or higher. | - | NOT RUN | - | +| 2173 | dc2-leaf3a.arista.com | Logging | VerifyLoggingHostname | Verifies if logs are generated with the device FQDN. | - | NOT RUN | - | +| 2174 | dc2-leaf3a.arista.com | Logging | VerifyLoggingHosts | Verifies logging hosts (syslog servers) for a specified VRF. | - | NOT RUN | - | +| 2175 | dc2-leaf3a.arista.com | Logging | VerifyLoggingLogsGeneration | Verifies if logs are generated. | - | NOT RUN | - | +| 2176 | dc2-leaf3a.arista.com | Logging | VerifyLoggingPersistent | Verifies if logging persistent is enabled and logs are saved in flash. | - | NOT RUN | - | +| 2177 | dc2-leaf3a.arista.com | Logging | VerifyLoggingSourceInt | Verifies logging source-interface for a specified VRF. | - | NOT RUN | - | +| 2178 | dc2-leaf3a.arista.com | Logging | VerifyLoggingTimestamp | Verifies if logs are generated with the riate timestamp. | - | NOT RUN | - | +| 2179 | dc2-leaf3a.arista.com | MLAG | VerifyMlagConfigSanity | Verifies there are no MLAG config-sanity inconsistencies. | - | NOT RUN | - | +| 2180 | dc2-leaf3a.arista.com | MLAG | VerifyMlagDualPrimary | Verifies the MLAG dual-primary detection parameters. | - | NOT RUN | - | +| 2181 | dc2-leaf3a.arista.com | MLAG | VerifyMlagInterfaces | Verifies there are no inactive or active-partial MLAG ports. | - | NOT RUN | - | +| 2182 | dc2-leaf3a.arista.com | MLAG | VerifyMlagReloadDelay | Verifies the MLAG reload-delay parameters. | - | NOT RUN | - | +| 2183 | dc2-leaf3a.arista.com | MLAG | VerifyMlagStatus | Verifies the health status of the MLAG configuration. | - | NOT RUN | - | +| 2184 | dc2-leaf3a.arista.com | MLAG | VerifyMlagStatus | Verifies the health status of the MLAG configuration. | - | NOT RUN | - | +| 2185 | dc2-leaf3a.arista.com | Multicast | VerifyIGMPSnoopingGlobal | Verifies the IGMP snooping global configuration. | - | NOT RUN | - | +| 2186 | dc2-leaf3a.arista.com | Multicast | VerifyIGMPSnoopingVlans | Verifies the IGMP snooping status for the provided VLANs. | - | NOT RUN | - | +| 2187 | dc2-leaf3a.arista.com | PTP | VerifyPtpGMStatus | Verifies that the device is locked to a valid PTP Grandmaster. | - | NOT RUN | - | +| 2188 | dc2-leaf3a.arista.com | PTP | VerifyPtpLockStatus | Verifies that the device was locked to the upstream PTP GM in the last minute. | - | NOT RUN | - | +| 2189 | dc2-leaf3a.arista.com | PTP | VerifyPtpModeStatus | Verifies that the device is configured as a PTP Boundary Clock. | - | NOT RUN | - | +| 2190 | dc2-leaf3a.arista.com | PTP | VerifyPtpOffset | Verifies that the PTP timing offset is within +/- 1000ns from the master clock. | - | NOT RUN | - | +| 2191 | dc2-leaf3a.arista.com | PTP | VerifyPtpPortModeStatus | Verifies the PTP interfaces state. | - | NOT RUN | - | +| 2192 | dc2-leaf3a.arista.com | Routing | VerifyRoutingProtocolModel | Verifies the configured routing protocol model. | Routing protocol model: multi-agent | NOT RUN | - | +| 2193 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.1 - Peer: dc1-spine1 | NOT RUN | - | +| 2194 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.2 - Peer: dc1-spine2 | NOT RUN | - | +| 2195 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.3 - Peer: dc1-leaf1a | NOT RUN | - | +| 2196 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.4 - Peer: dc1-leaf1b | NOT RUN | - | +| 2197 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.5 - Peer: dc1-leaf2a | NOT RUN | - | +| 2198 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.3 - Peer: dc1-leaf1a | NOT RUN | - | +| 2199 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.5 - Peer: dc1-leaf2a | NOT RUN | - | +| 2200 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.11 - Peer: dc2-spine1 | NOT RUN | - | +| 2201 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.12 - Peer: dc2-spine2 | NOT RUN | - | +| 2202 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.13 - Peer: dc2-leaf1a | NOT RUN | - | +| 2203 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.14 - Peer: dc2-leaf1b | NOT RUN | - | +| 2204 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.15 - Peer: dc2-leaf2a | NOT RUN | - | +| 2205 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.16 - Peer: dc2-leaf2b | NOT RUN | - | +| 2206 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | +| 2207 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com | NOT RUN | - | +| 2208 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.13 - Peer: dc2-leaf1a | NOT RUN | - | +| 2209 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.15 - Peer: dc2-leaf2a | NOT RUN | - | +| 2210 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | +| 2211 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.1 - Peer: dc1-wan1 | NOT RUN | - | +| 2212 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.2 - Peer: dc1-wan2 | NOT RUN | - | +| 2213 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.33.0.5 - Peer: dc1-svc-leaf1a | NOT RUN | - | +| 2214 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.33.0.6 - Peer: dc1-svc-leaf1b | NOT RUN | - | +| 2215 | dc2-leaf3a.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.33.1.5 - Peer: dc1-svc-leaf1a | NOT RUN | - | +| 2216 | dc2-leaf3a.arista.com | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | - | NOT RUN | - | +| 2217 | dc2-leaf3a.arista.com | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | +| 2218 | dc2-leaf3a.arista.com | Security | VerifyAPIHttpStatus | Verifies if eAPI HTTP server is disabled globally. | - | NOT RUN | - | +| 2219 | dc2-leaf3a.arista.com | Security | VerifyAPIIPv4Acl | Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 2220 | dc2-leaf3a.arista.com | Security | VerifyAPIIPv6Acl | Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 2221 | dc2-leaf3a.arista.com | Security | VerifyAPISSLCertificate | Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size. | - | NOT RUN | - | +| 2222 | dc2-leaf3a.arista.com | Security | VerifyBannerLogin | Verifies the login banner of a device. | - | NOT RUN | - | +| 2223 | dc2-leaf3a.arista.com | Security | VerifyBannerMotd | Verifies the motd banner of a device. | - | NOT RUN | - | +| 2224 | dc2-leaf3a.arista.com | Security | VerifyIPSecConnHealth | Verifies all IPv4 security connections. | - | NOT RUN | - | +| 2225 | dc2-leaf3a.arista.com | Security | VerifyIPv4ACL | Verifies the configuration of IPv4 ACLs. | - | NOT RUN | - | +| 2226 | dc2-leaf3a.arista.com | Security | VerifySpecificIPSecConn | Verifies IPv4 security connections for a peer. | - | NOT RUN | - | +| 2227 | dc2-leaf3a.arista.com | Security | VerifySSHIPv4Acl | Verifies if the SSHD agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 2228 | dc2-leaf3a.arista.com | Security | VerifySSHIPv6Acl | Verifies if the SSHD agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 2229 | dc2-leaf3a.arista.com | Security | VerifySSHStatus | Verifies if the SSHD agent is disabled in the default VRF. | - | NOT RUN | - | +| 2230 | dc2-leaf3a.arista.com | Security | VerifyTelnetStatus | Verifies if Telnet is disabled in the default VRF. | - | NOT RUN | - | +| 2231 | dc2-leaf3a.arista.com | Services | VerifyDNSLookup | Verifies the DNS name to IP address resolution. | - | NOT RUN | - | +| 2232 | dc2-leaf3a.arista.com | Services | VerifyDNSServers | Verifies if the DNS servers are correctly configured. | - | NOT RUN | - | +| 2233 | dc2-leaf3a.arista.com | Services | VerifyErrdisableRecovery | Verifies the errdisable recovery reason, status, and interval. | - | NOT RUN | - | +| 2234 | dc2-leaf3a.arista.com | Services | VerifyHostname | Verifies the hostname of a device. | - | NOT RUN | - | +| 2235 | dc2-leaf3a.arista.com | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 2236 | dc2-leaf3a.arista.com | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 2237 | dc2-leaf3a.arista.com | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | +| 2238 | dc2-leaf3a.arista.com | Software | VerifyEOSVersion | Verifies the EOS version of the device. | - | NOT RUN | - | +| 2239 | dc2-leaf3a.arista.com | Software | VerifyTerminAttrVersion | Verifies the TerminAttr version of the device. | - | NOT RUN | - | +| 2240 | dc2-leaf3a.arista.com | STP | VerifySTPBlockedPorts | Verifies there is no STP blocked ports. | - | NOT RUN | - | +| 2241 | dc2-leaf3a.arista.com | STP | VerifySTPCounters | Verifies there is no errors in STP BPDU packets. | - | NOT RUN | - | +| 2242 | dc2-leaf3a.arista.com | STP | VerifySTPForwardingPorts | Verifies that all interfaces are forwarding for a provided list of VLAN(s). | - | NOT RUN | - | +| 2243 | dc2-leaf3a.arista.com | STP | VerifySTPMode | Verifies the configured STP mode for a provided list of VLAN(s). | - | NOT RUN | - | +| 2244 | dc2-leaf3a.arista.com | STP | VerifySTPRootPriority | Verifies the STP root priority for a provided list of VLAN or MST instance ID(s). | - | NOT RUN | - | +| 2245 | dc2-leaf3a.arista.com | STUN | VerifyStunClient | Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided. | - | NOT RUN | - | +| 2246 | dc2-leaf3a.arista.com | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | +| 2247 | dc2-leaf3a.arista.com | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | +| 2248 | dc2-leaf3a.arista.com | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | +| 2249 | dc2-leaf3a.arista.com | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | +| 2250 | dc2-leaf3a.arista.com | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | +| 2251 | dc2-leaf3a.arista.com | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 2252 | dc2-leaf3a.arista.com | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 2253 | dc2-leaf3a.arista.com | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | +| 2254 | dc2-leaf3a.arista.com | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | +| 2255 | dc2-leaf3a.arista.com | VLAN | VerifyVlanInternalPolicy | Verifies the VLAN internal allocation policy and the range of VLANs. | - | NOT RUN | - | +| 2256 | dc2-leaf3b.arista.com | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 2257 | dc2-leaf3b.arista.com | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 2258 | dc2-leaf3b.arista.com | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | +| 2259 | dc2-leaf3b.arista.com | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | +| 2260 | dc2-leaf3b.arista.com | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | +| 2261 | dc2-leaf3b.arista.com | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | +| 2262 | dc2-leaf3b.arista.com | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | +| 2263 | dc2-leaf3b.arista.com | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-spine1 (IP: 10.255.128.11) | NOT RUN | - | +| 2264 | dc2-leaf3b.arista.com | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-spine2 (IP: 10.255.128.12) | NOT RUN | - | +| 2265 | dc2-leaf3b.arista.com | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf3a.arista.com (IP: 10.255.129.124) | NOT RUN | - | +| 2266 | dc2-leaf3b.arista.com | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-spine1 (IP: 10.255.255.124) | NOT RUN | - | +| 2267 | dc2-leaf3b.arista.com | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-spine2 (IP: 10.255.255.126) | NOT RUN | - | +| 2268 | dc2-leaf3b.arista.com | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | +| 2269 | dc2-leaf3b.arista.com | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | +| 2270 | dc2-leaf3b.arista.com | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc2-spine1 Ethernet6 | NOT RUN | - | +| 2271 | dc2-leaf3b.arista.com | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc2-spine2 Ethernet6 | NOT RUN | - | +| 2272 | dc2-leaf3b.arista.com | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet3 - Remote: dc2-leaf3a.arista.com Ethernet3 | NOT RUN | - | +| 2273 | dc2-leaf3b.arista.com | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet4 - Remote: dc2-leaf3a.arista.com Ethernet4 | NOT RUN | - | +| 2274 | dc2-leaf3b.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3) | NOT RUN | - | +| 2275 | dc2-leaf3b.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4) | NOT RUN | - | +| 2276 | dc2-leaf3b.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5) | NOT RUN | - | +| 2277 | dc2-leaf3b.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1) | NOT RUN | - | +| 2278 | dc2-leaf3b.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2) | NOT RUN | - | +| 2279 | dc2-leaf3b.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5) | NOT RUN | - | +| 2280 | dc2-leaf3b.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6) | NOT RUN | - | +| 2281 | dc2-leaf3b.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1) | NOT RUN | - | +| 2282 | dc2-leaf3b.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2) | NOT RUN | - | +| 2283 | dc2-leaf3b.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.18) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13) | NOT RUN | - | +| 2284 | dc2-leaf3b.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.18) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14) | NOT RUN | - | +| 2285 | dc2-leaf3b.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.18) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15) | NOT RUN | - | +| 2286 | dc2-leaf3b.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.18) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16) | NOT RUN | - | +| 2287 | dc2-leaf3b.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.18) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17) | NOT RUN | - | +| 2288 | dc2-leaf3b.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.18) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18) | NOT RUN | - | +| 2289 | dc2-leaf3b.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.18) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11) | NOT RUN | - | +| 2290 | dc2-leaf3b.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: Loopback0 (IP: 10.255.128.18) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12) | NOT RUN | - | +| 2291 | dc2-leaf3b.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet1 (IP: 10.255.255.125) - Destination: dc2-spine1 Ethernet6 (IP: 10.255.255.124) | NOT RUN | - | +| 2292 | dc2-leaf3b.arista.com | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet2 (IP: 10.255.255.127) - Destination: dc2-spine2 Ethernet6 (IP: 10.255.255.126) | NOT RUN | - | +| 2293 | dc2-leaf3b.arista.com | Field Notices | VerifyFieldNotice44Resolution | Verifies that the device is using the correct Aboot version per FN0044. | - | NOT RUN | - | +| 2294 | dc2-leaf3b.arista.com | Field Notices | VerifyFieldNotice72Resolution | Verifies if the device is exposed to FN0072, and if the issue has been mitigated. | - | NOT RUN | - | +| 2295 | dc2-leaf3b.arista.com | Greent | VerifyGreenT | Verifies if a GreenT policy is created. | - | NOT RUN | - | +| 2296 | dc2-leaf3b.arista.com | Greent | VerifyGreenTCounters | Verifies if the GreenT counters are incremented. | - | NOT RUN | - | +| 2297 | dc2-leaf3b.arista.com | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches. | - | NOT RUN | - | +| 2298 | dc2-leaf3b.arista.com | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | +| 2299 | dc2-leaf3b.arista.com | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | +| 2300 | dc2-leaf3b.arista.com | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | +| 2301 | dc2-leaf3b.arista.com | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | +| 2302 | dc2-leaf3b.arista.com | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | +| 2303 | dc2-leaf3b.arista.com | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 2304 | dc2-leaf3b.arista.com | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 2305 | dc2-leaf3b.arista.com | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | +| 2306 | dc2-leaf3b.arista.com | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | +| 2307 | dc2-leaf3b.arista.com | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | +| 2308 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - P2P_LINK_TO_DC2-SPINE1_Ethernet6 = 'up' | NOT RUN | - | +| 2309 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet11 - dc2-leaf3-fw1_e1 = 'adminDown' | NOT RUN | - | +| 2310 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - P2P_LINK_TO_DC2-SPINE2_Ethernet6 = 'up' | NOT RUN | - | +| 2311 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet3 - MLAG_PEER_dc2-leaf3a.arista.com_Ethernet3 = 'up' | NOT RUN | - | +| 2312 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet4 - MLAG_PEER_dc2-leaf3a.arista.com_Ethernet4 = 'up' | NOT RUN | - | +| 2313 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback0 - EVPN_Overlay_Peering = 'up' | NOT RUN | - | +| 2314 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up' | NOT RUN | - | +| 2315 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback10 - VRF10_VTEP_DIAGNOSTICS = 'up' | NOT RUN | - | +| 2316 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback11 - VRF11_VTEP_DIAGNOSTICS = 'up' | NOT RUN | - | +| 2317 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel11 - dc2-leaf3-fw1_PortChannel = 'up' | NOT RUN | - | +| 2318 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Port-Channel3 - MLAG_PEER_dc2-leaf3a.arista.com_Po3 = 'up' | NOT RUN | - | +| 2319 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan11 - VRF10_VLAN11 = 'up' | NOT RUN | - | +| 2320 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan12 - VRF10_VLAN12 = 'up' | NOT RUN | - | +| 2321 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan21 - VRF11_VLAN21 = 'up' | NOT RUN | - | +| 2322 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan22 - VRF11_VLAN22 = 'up' | NOT RUN | - | +| 2323 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan3009 - MLAG_PEER_L3_iBGP: vrf VRF10 = 'up' | NOT RUN | - | +| 2324 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan3010 - MLAG_PEER_L3_iBGP: vrf VRF11 = 'up' | NOT RUN | - | +| 2325 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up' | NOT RUN | - | +| 2326 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vlan4094 - MLAG_PEER = 'up' | NOT RUN | - | +| 2327 | dc2-leaf3b.arista.com | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Vxlan1 = 'up' | NOT RUN | - | +| 2328 | dc2-leaf3b.arista.com | LANZ | VerifyLANZ | Verifies if LANZ is enabled. | - | NOT RUN | - | +| 2329 | dc2-leaf3b.arista.com | Logging | VerifyLoggingAccounting | Verifies if AAA accounting logs are generated. | - | NOT RUN | - | +| 2330 | dc2-leaf3b.arista.com | Logging | VerifyLoggingErrors | Verifies there are no syslog messages with a severity of ERRORS or higher. | - | NOT RUN | - | +| 2331 | dc2-leaf3b.arista.com | Logging | VerifyLoggingHostname | Verifies if logs are generated with the device FQDN. | - | NOT RUN | - | +| 2332 | dc2-leaf3b.arista.com | Logging | VerifyLoggingHosts | Verifies logging hosts (syslog servers) for a specified VRF. | - | NOT RUN | - | +| 2333 | dc2-leaf3b.arista.com | Logging | VerifyLoggingLogsGeneration | Verifies if logs are generated. | - | NOT RUN | - | +| 2334 | dc2-leaf3b.arista.com | Logging | VerifyLoggingPersistent | Verifies if logging persistent is enabled and logs are saved in flash. | - | NOT RUN | - | +| 2335 | dc2-leaf3b.arista.com | Logging | VerifyLoggingSourceInt | Verifies logging source-interface for a specified VRF. | - | NOT RUN | - | +| 2336 | dc2-leaf3b.arista.com | Logging | VerifyLoggingTimestamp | Verifies if logs are generated with the riate timestamp. | - | NOT RUN | - | +| 2337 | dc2-leaf3b.arista.com | MLAG | VerifyMlagConfigSanity | Verifies there are no MLAG config-sanity inconsistencies. | - | NOT RUN | - | +| 2338 | dc2-leaf3b.arista.com | MLAG | VerifyMlagDualPrimary | Verifies the MLAG dual-primary detection parameters. | - | NOT RUN | - | +| 2339 | dc2-leaf3b.arista.com | MLAG | VerifyMlagInterfaces | Verifies there are no inactive or active-partial MLAG ports. | - | NOT RUN | - | +| 2340 | dc2-leaf3b.arista.com | MLAG | VerifyMlagReloadDelay | Verifies the MLAG reload-delay parameters. | - | NOT RUN | - | +| 2341 | dc2-leaf3b.arista.com | MLAG | VerifyMlagStatus | Verifies the health status of the MLAG configuration. | - | NOT RUN | - | +| 2342 | dc2-leaf3b.arista.com | MLAG | VerifyMlagStatus | Verifies the health status of the MLAG configuration. | - | NOT RUN | - | +| 2343 | dc2-leaf3b.arista.com | Multicast | VerifyIGMPSnoopingGlobal | Verifies the IGMP snooping global configuration. | - | NOT RUN | - | +| 2344 | dc2-leaf3b.arista.com | Multicast | VerifyIGMPSnoopingVlans | Verifies the IGMP snooping status for the provided VLANs. | - | NOT RUN | - | +| 2345 | dc2-leaf3b.arista.com | PTP | VerifyPtpGMStatus | Verifies that the device is locked to a valid PTP Grandmaster. | - | NOT RUN | - | +| 2346 | dc2-leaf3b.arista.com | PTP | VerifyPtpLockStatus | Verifies that the device was locked to the upstream PTP GM in the last minute. | - | NOT RUN | - | +| 2347 | dc2-leaf3b.arista.com | PTP | VerifyPtpModeStatus | Verifies that the device is configured as a PTP Boundary Clock. | - | NOT RUN | - | +| 2348 | dc2-leaf3b.arista.com | PTP | VerifyPtpOffset | Verifies that the PTP timing offset is within +/- 1000ns from the master clock. | - | NOT RUN | - | +| 2349 | dc2-leaf3b.arista.com | PTP | VerifyPtpPortModeStatus | Verifies the PTP interfaces state. | - | NOT RUN | - | +| 2350 | dc2-leaf3b.arista.com | Routing | VerifyRoutingProtocolModel | Verifies the configured routing protocol model. | Routing protocol model: multi-agent | NOT RUN | - | +| 2351 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.1 - Peer: dc1-spine1 | NOT RUN | - | +| 2352 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.2 - Peer: dc1-spine2 | NOT RUN | - | +| 2353 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.3 - Peer: dc1-leaf1a | NOT RUN | - | +| 2354 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.4 - Peer: dc1-leaf1b | NOT RUN | - | +| 2355 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.0.5 - Peer: dc1-leaf2a | NOT RUN | - | +| 2356 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.3 - Peer: dc1-leaf1a | NOT RUN | - | +| 2357 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.1.5 - Peer: dc1-leaf2a | NOT RUN | - | +| 2358 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.11 - Peer: dc2-spine1 | NOT RUN | - | +| 2359 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.12 - Peer: dc2-spine2 | NOT RUN | - | +| 2360 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.13 - Peer: dc2-leaf1a | NOT RUN | - | +| 2361 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.14 - Peer: dc2-leaf1b | NOT RUN | - | +| 2362 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.15 - Peer: dc2-leaf2a | NOT RUN | - | +| 2363 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.16 - Peer: dc2-leaf2b | NOT RUN | - | +| 2364 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | +| 2365 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com | NOT RUN | - | +| 2366 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.13 - Peer: dc2-leaf1a | NOT RUN | - | +| 2367 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.15 - Peer: dc2-leaf2a | NOT RUN | - | +| 2368 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com | NOT RUN | - | +| 2369 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.1 - Peer: dc1-wan1 | NOT RUN | - | +| 2370 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.255.2.2 - Peer: dc1-wan2 | NOT RUN | - | +| 2371 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.33.0.5 - Peer: dc1-svc-leaf1a | NOT RUN | - | +| 2372 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.33.0.6 - Peer: dc1-svc-leaf1b | NOT RUN | - | +| 2373 | dc2-leaf3b.arista.com | Routing | VerifyRoutingTableEntry | Verifies that the provided routes are present in the routing table of a specified VRF. | Route: 10.33.1.5 - Peer: dc1-svc-leaf1a | NOT RUN | - | +| 2374 | dc2-leaf3b.arista.com | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | - | NOT RUN | - | +| 2375 | dc2-leaf3b.arista.com | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | +| 2376 | dc2-leaf3b.arista.com | Security | VerifyAPIHttpStatus | Verifies if eAPI HTTP server is disabled globally. | - | NOT RUN | - | +| 2377 | dc2-leaf3b.arista.com | Security | VerifyAPIIPv4Acl | Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 2378 | dc2-leaf3b.arista.com | Security | VerifyAPIIPv6Acl | Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 2379 | dc2-leaf3b.arista.com | Security | VerifyAPISSLCertificate | Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size. | - | NOT RUN | - | +| 2380 | dc2-leaf3b.arista.com | Security | VerifyBannerLogin | Verifies the login banner of a device. | - | NOT RUN | - | +| 2381 | dc2-leaf3b.arista.com | Security | VerifyBannerMotd | Verifies the motd banner of a device. | - | NOT RUN | - | +| 2382 | dc2-leaf3b.arista.com | Security | VerifyIPSecConnHealth | Verifies all IPv4 security connections. | - | NOT RUN | - | +| 2383 | dc2-leaf3b.arista.com | Security | VerifyIPv4ACL | Verifies the configuration of IPv4 ACLs. | - | NOT RUN | - | +| 2384 | dc2-leaf3b.arista.com | Security | VerifySpecificIPSecConn | Verifies IPv4 security connections for a peer. | - | NOT RUN | - | +| 2385 | dc2-leaf3b.arista.com | Security | VerifySSHIPv4Acl | Verifies if the SSHD agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 2386 | dc2-leaf3b.arista.com | Security | VerifySSHIPv6Acl | Verifies if the SSHD agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 2387 | dc2-leaf3b.arista.com | Security | VerifySSHStatus | Verifies if the SSHD agent is disabled in the default VRF. | - | NOT RUN | - | +| 2388 | dc2-leaf3b.arista.com | Security | VerifyTelnetStatus | Verifies if Telnet is disabled in the default VRF. | - | NOT RUN | - | +| 2389 | dc2-leaf3b.arista.com | Services | VerifyDNSLookup | Verifies the DNS name to IP address resolution. | - | NOT RUN | - | +| 2390 | dc2-leaf3b.arista.com | Services | VerifyDNSServers | Verifies if the DNS servers are correctly configured. | - | NOT RUN | - | +| 2391 | dc2-leaf3b.arista.com | Services | VerifyErrdisableRecovery | Verifies the errdisable recovery reason, status, and interval. | - | NOT RUN | - | +| 2392 | dc2-leaf3b.arista.com | Services | VerifyHostname | Verifies the hostname of a device. | - | NOT RUN | - | +| 2393 | dc2-leaf3b.arista.com | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 2394 | dc2-leaf3b.arista.com | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 2395 | dc2-leaf3b.arista.com | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | +| 2396 | dc2-leaf3b.arista.com | Software | VerifyEOSVersion | Verifies the EOS version of the device. | - | NOT RUN | - | +| 2397 | dc2-leaf3b.arista.com | Software | VerifyTerminAttrVersion | Verifies the TerminAttr version of the device. | - | NOT RUN | - | +| 2398 | dc2-leaf3b.arista.com | STP | VerifySTPBlockedPorts | Verifies there is no STP blocked ports. | - | NOT RUN | - | +| 2399 | dc2-leaf3b.arista.com | STP | VerifySTPCounters | Verifies there is no errors in STP BPDU packets. | - | NOT RUN | - | +| 2400 | dc2-leaf3b.arista.com | STP | VerifySTPForwardingPorts | Verifies that all interfaces are forwarding for a provided list of VLAN(s). | - | NOT RUN | - | +| 2401 | dc2-leaf3b.arista.com | STP | VerifySTPMode | Verifies the configured STP mode for a provided list of VLAN(s). | - | NOT RUN | - | +| 2402 | dc2-leaf3b.arista.com | STP | VerifySTPRootPriority | Verifies the STP root priority for a provided list of VLAN or MST instance ID(s). | - | NOT RUN | - | +| 2403 | dc2-leaf3b.arista.com | STUN | VerifyStunClient | Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided. | - | NOT RUN | - | +| 2404 | dc2-leaf3b.arista.com | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | +| 2405 | dc2-leaf3b.arista.com | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | +| 2406 | dc2-leaf3b.arista.com | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | +| 2407 | dc2-leaf3b.arista.com | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | +| 2408 | dc2-leaf3b.arista.com | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | +| 2409 | dc2-leaf3b.arista.com | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 2410 | dc2-leaf3b.arista.com | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 2411 | dc2-leaf3b.arista.com | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | +| 2412 | dc2-leaf3b.arista.com | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | +| 2413 | dc2-leaf3b.arista.com | VLAN | VerifyVlanInternalPolicy | Verifies the VLAN internal allocation policy and the range of VLANs. | - | NOT RUN | - | +| 2414 | dc2-spine1 | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 2415 | dc2-spine1 | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 2416 | dc2-spine1 | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | +| 2417 | dc2-spine1 | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | +| 2418 | dc2-spine1 | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | +| 2419 | dc2-spine1 | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | +| 2420 | dc2-spine1 | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | +| 2421 | dc2-spine1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-leaf1a (IP: 10.255.128.13) | NOT RUN | - | +| 2422 | dc2-spine1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-leaf1b (IP: 10.255.128.14) | NOT RUN | - | +| 2423 | dc2-spine1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-leaf2a (IP: 10.255.128.15) | NOT RUN | - | +| 2424 | dc2-spine1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-leaf2b (IP: 10.255.128.16) | NOT RUN | - | +| 2425 | dc2-spine1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-leaf3a.arista.com (IP: 10.255.128.17) | NOT RUN | - | +| 2426 | dc2-spine1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-leaf3b.arista.com (IP: 10.255.128.18) | NOT RUN | - | +| 2427 | dc2-spine1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf1a (IP: 10.255.255.105) | NOT RUN | - | +| 2428 | dc2-spine1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf1b (IP: 10.255.255.109) | NOT RUN | - | +| 2429 | dc2-spine1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf2a (IP: 10.255.255.113) | NOT RUN | - | +| 2430 | dc2-spine1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf2b (IP: 10.255.255.117) | NOT RUN | - | +| 2431 | dc2-spine1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf3a.arista.com (IP: 10.255.255.121) | NOT RUN | - | +| 2432 | dc2-spine1 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf3b.arista.com (IP: 10.255.255.125) | NOT RUN | - | +| 2433 | dc2-spine1 | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | +| 2434 | dc2-spine1 | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | +| 2435 | dc2-spine1 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc2-leaf1a Ethernet1 | NOT RUN | - | +| 2436 | dc2-spine1 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc2-leaf1b Ethernet1 | NOT RUN | - | +| 2437 | dc2-spine1 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet3 - Remote: dc2-leaf2a Ethernet1 | NOT RUN | - | +| 2438 | dc2-spine1 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet4 - Remote: dc2-leaf2b Ethernet1 | NOT RUN | - | +| 2439 | dc2-spine1 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet5 - Remote: dc2-leaf3a.arista.com Ethernet1 | NOT RUN | - | +| 2440 | dc2-spine1 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet6 - Remote: dc2-leaf3b.arista.com Ethernet1 | NOT RUN | - | +| 2441 | dc2-spine1 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet1 (IP: 10.255.255.104) - Destination: dc2-leaf1a Ethernet1 (IP: 10.255.255.105) | NOT RUN | - | +| 2442 | dc2-spine1 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet2 (IP: 10.255.255.108) - Destination: dc2-leaf1b Ethernet1 (IP: 10.255.255.109) | NOT RUN | - | +| 2443 | dc2-spine1 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet3 (IP: 10.255.255.112) - Destination: dc2-leaf2a Ethernet1 (IP: 10.255.255.113) | NOT RUN | - | +| 2444 | dc2-spine1 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet4 (IP: 10.255.255.116) - Destination: dc2-leaf2b Ethernet1 (IP: 10.255.255.117) | NOT RUN | - | +| 2445 | dc2-spine1 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet5 (IP: 10.255.255.120) - Destination: dc2-leaf3a.arista.com Ethernet1 (IP: 10.255.255.121) | NOT RUN | - | +| 2446 | dc2-spine1 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet6 (IP: 10.255.255.124) - Destination: dc2-leaf3b.arista.com Ethernet1 (IP: 10.255.255.125) | NOT RUN | - | +| 2447 | dc2-spine1 | Field Notices | VerifyFieldNotice44Resolution | Verifies that the device is using the correct Aboot version per FN0044. | - | NOT RUN | - | +| 2448 | dc2-spine1 | Field Notices | VerifyFieldNotice72Resolution | Verifies if the device is exposed to FN0072, and if the issue has been mitigated. | - | NOT RUN | - | +| 2449 | dc2-spine1 | Greent | VerifyGreenT | Verifies if a GreenT policy is created. | - | NOT RUN | - | +| 2450 | dc2-spine1 | Greent | VerifyGreenTCounters | Verifies if the GreenT counters are incremented. | - | NOT RUN | - | +| 2451 | dc2-spine1 | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches. | - | NOT RUN | - | +| 2452 | dc2-spine1 | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | +| 2453 | dc2-spine1 | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | +| 2454 | dc2-spine1 | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | +| 2455 | dc2-spine1 | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | +| 2456 | dc2-spine1 | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | +| 2457 | dc2-spine1 | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 2458 | dc2-spine1 | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 2459 | dc2-spine1 | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | +| 2460 | dc2-spine1 | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | +| 2461 | dc2-spine1 | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | +| 2462 | dc2-spine1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - P2P_LINK_TO_DC2-LEAF1A_Ethernet1 = 'up' | NOT RUN | - | +| 2463 | dc2-spine1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - P2P_LINK_TO_DC2-LEAF1B_Ethernet1 = 'up' | NOT RUN | - | +| 2464 | dc2-spine1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet3 - P2P_LINK_TO_DC2-LEAF2A_Ethernet1 = 'up' | NOT RUN | - | +| 2465 | dc2-spine1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet4 - P2P_LINK_TO_DC2-LEAF2B_Ethernet1 = 'up' | NOT RUN | - | +| 2466 | dc2-spine1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet5 - P2P_LINK_TO_DC2-LEAF3A.ARISTA.COM_Ethernet1 = 'up' | NOT RUN | - | +| 2467 | dc2-spine1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet6 - P2P_LINK_TO_DC2-LEAF3B.ARISTA.COM_Ethernet1 = 'up' | NOT RUN | - | +| 2468 | dc2-spine1 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback0 - EVPN_Overlay_Peering = 'up' | NOT RUN | - | +| 2469 | dc2-spine1 | LANZ | VerifyLANZ | Verifies if LANZ is enabled. | - | NOT RUN | - | +| 2470 | dc2-spine1 | PTP | VerifyPtpGMStatus | Verifies that the device is locked to a valid PTP Grandmaster. | - | NOT RUN | - | +| 2471 | dc2-spine1 | PTP | VerifyPtpLockStatus | Verifies that the device was locked to the upstream PTP GM in the last minute. | - | NOT RUN | - | +| 2472 | dc2-spine1 | PTP | VerifyPtpModeStatus | Verifies that the device is configured as a PTP Boundary Clock. | - | NOT RUN | - | +| 2473 | dc2-spine1 | PTP | VerifyPtpOffset | Verifies that the PTP timing offset is within +/- 1000ns from the master clock. | - | NOT RUN | - | +| 2474 | dc2-spine1 | PTP | VerifyPtpPortModeStatus | Verifies the PTP interfaces state. | - | NOT RUN | - | +| 2475 | dc2-spine1 | Routing | VerifyRoutingProtocolModel | Verifies the configured routing protocol model. | Routing protocol model: multi-agent | NOT RUN | - | +| 2476 | dc2-spine1 | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | - | NOT RUN | - | +| 2477 | dc2-spine1 | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | +| 2478 | dc2-spine1 | Security | VerifyAPIHttpStatus | Verifies if eAPI HTTP server is disabled globally. | - | NOT RUN | - | +| 2479 | dc2-spine1 | Security | VerifyAPIIPv4Acl | Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 2480 | dc2-spine1 | Security | VerifyAPIIPv6Acl | Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 2481 | dc2-spine1 | Security | VerifyAPISSLCertificate | Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size. | - | NOT RUN | - | +| 2482 | dc2-spine1 | Security | VerifyBannerLogin | Verifies the login banner of a device. | - | NOT RUN | - | +| 2483 | dc2-spine1 | Security | VerifyBannerMotd | Verifies the motd banner of a device. | - | NOT RUN | - | +| 2484 | dc2-spine1 | Security | VerifyIPSecConnHealth | Verifies all IPv4 security connections. | - | NOT RUN | - | +| 2485 | dc2-spine1 | Security | VerifyIPv4ACL | Verifies the configuration of IPv4 ACLs. | - | NOT RUN | - | +| 2486 | dc2-spine1 | Security | VerifySpecificIPSecConn | Verifies IPv4 security connections for a peer. | - | NOT RUN | - | +| 2487 | dc2-spine1 | Security | VerifySSHIPv4Acl | Verifies if the SSHD agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 2488 | dc2-spine1 | Security | VerifySSHIPv6Acl | Verifies if the SSHD agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 2489 | dc2-spine1 | Security | VerifySSHStatus | Verifies if the SSHD agent is disabled in the default VRF. | - | NOT RUN | - | +| 2490 | dc2-spine1 | Security | VerifyTelnetStatus | Verifies if Telnet is disabled in the default VRF. | - | NOT RUN | - | +| 2491 | dc2-spine1 | Services | VerifyDNSLookup | Verifies the DNS name to IP address resolution. | - | NOT RUN | - | +| 2492 | dc2-spine1 | Services | VerifyDNSServers | Verifies if the DNS servers are correctly configured. | - | NOT RUN | - | +| 2493 | dc2-spine1 | Services | VerifyErrdisableRecovery | Verifies the errdisable recovery reason, status, and interval. | - | NOT RUN | - | +| 2494 | dc2-spine1 | Services | VerifyHostname | Verifies the hostname of a device. | - | NOT RUN | - | +| 2495 | dc2-spine1 | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 2496 | dc2-spine1 | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 2497 | dc2-spine1 | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | +| 2498 | dc2-spine1 | Software | VerifyEOSVersion | Verifies the EOS version of the device. | - | NOT RUN | - | +| 2499 | dc2-spine1 | Software | VerifyTerminAttrVersion | Verifies the TerminAttr version of the device. | - | NOT RUN | - | +| 2500 | dc2-spine1 | STUN | VerifyStunClient | Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided. | - | NOT RUN | - | +| 2501 | dc2-spine1 | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | +| 2502 | dc2-spine1 | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | +| 2503 | dc2-spine1 | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | +| 2504 | dc2-spine1 | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | +| 2505 | dc2-spine1 | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | +| 2506 | dc2-spine1 | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 2507 | dc2-spine1 | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 2508 | dc2-spine1 | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | +| 2509 | dc2-spine1 | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | +| 2510 | dc2-spine1 | VLAN | VerifyVlanInternalPolicy | Verifies the VLAN internal allocation policy and the range of VLANs. | - | NOT RUN | - | +| 2511 | dc2-spine2 | AAA | VerifyAcctConsoleMethods | Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 2512 | dc2-spine2 | AAA | VerifyAcctDefaultMethods | Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x). | - | NOT RUN | - | +| 2513 | dc2-spine2 | AAA | VerifyAuthenMethods | Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x). | - | NOT RUN | - | +| 2514 | dc2-spine2 | AAA | VerifyAuthzMethods | Verifies the AAA authorization method lists for different authorization types (commands, exec). | - | NOT RUN | - | +| 2515 | dc2-spine2 | AAA | VerifyTacacsServerGroups | Verifies if the provided TACACS server group(s) are configured. | - | NOT RUN | - | +| 2516 | dc2-spine2 | AAA | VerifyTacacsServers | Verifies TACACS servers are configured for a specified VRF. | - | NOT RUN | - | +| 2517 | dc2-spine2 | AAA | VerifyTacacsSourceIntf | Verifies TACACS source-interface for a specified VRF. | - | NOT RUN | - | +| 2518 | dc2-spine2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-leaf1a (IP: 10.255.128.13) | NOT RUN | - | +| 2519 | dc2-spine2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-leaf1b (IP: 10.255.128.14) | NOT RUN | - | +| 2520 | dc2-spine2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-leaf2a (IP: 10.255.128.15) | NOT RUN | - | +| 2521 | dc2-spine2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-leaf2b (IP: 10.255.128.16) | NOT RUN | - | +| 2522 | dc2-spine2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-leaf3a.arista.com (IP: 10.255.128.17) | NOT RUN | - | +| 2523 | dc2-spine2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP EVPN Peer: dc2-leaf3b.arista.com (IP: 10.255.128.18) | NOT RUN | - | +| 2524 | dc2-spine2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf1a (IP: 10.255.255.107) | NOT RUN | - | +| 2525 | dc2-spine2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf1b (IP: 10.255.255.111) | NOT RUN | - | +| 2526 | dc2-spine2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf2a (IP: 10.255.255.115) | NOT RUN | - | +| 2527 | dc2-spine2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf2b (IP: 10.255.255.119) | NOT RUN | - | +| 2528 | dc2-spine2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf3a.arista.com (IP: 10.255.255.123) | NOT RUN | - | +| 2529 | dc2-spine2 | BGP | VerifyBGPSpecificPeers | Verifies the health of specific BGP peer(s). | BGP IPv4 Unicast Peer: dc2-leaf3b.arista.com (IP: 10.255.255.127) | NOT RUN | - | +| 2530 | dc2-spine2 | Configuration | VerifyRunningConfigDiffs | Verifies there is no difference between the running-config and the startup-config | - | NOT RUN | - | +| 2531 | dc2-spine2 | Configuration | VerifyZeroTouch | Verifies ZeroTouch is disabled | - | NOT RUN | - | +| 2532 | dc2-spine2 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet1 - Remote: dc2-leaf1a Ethernet2 | NOT RUN | - | +| 2533 | dc2-spine2 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet2 - Remote: dc2-leaf1b Ethernet2 | NOT RUN | - | +| 2534 | dc2-spine2 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet3 - Remote: dc2-leaf2a Ethernet2 | NOT RUN | - | +| 2535 | dc2-spine2 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet4 - Remote: dc2-leaf2b Ethernet2 | NOT RUN | - | +| 2536 | dc2-spine2 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet5 - Remote: dc2-leaf3a.arista.com Ethernet2 | NOT RUN | - | +| 2537 | dc2-spine2 | Connectivity | VerifyLLDPNeighbors | Verifies that the provided LLDP neighbors are connected properly. | Local: Ethernet6 - Remote: dc2-leaf3b.arista.com Ethernet2 | NOT RUN | - | +| 2538 | dc2-spine2 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet1 (IP: 10.255.255.106) - Destination: dc2-leaf1a Ethernet2 (IP: 10.255.255.107) | NOT RUN | - | +| 2539 | dc2-spine2 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet2 (IP: 10.255.255.110) - Destination: dc2-leaf1b Ethernet2 (IP: 10.255.255.111) | NOT RUN | - | +| 2540 | dc2-spine2 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet3 (IP: 10.255.255.114) - Destination: dc2-leaf2a Ethernet2 (IP: 10.255.255.115) | NOT RUN | - | +| 2541 | dc2-spine2 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet4 (IP: 10.255.255.118) - Destination: dc2-leaf2b Ethernet2 (IP: 10.255.255.119) | NOT RUN | - | +| 2542 | dc2-spine2 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet5 (IP: 10.255.255.122) - Destination: dc2-leaf3a.arista.com Ethernet2 (IP: 10.255.255.123) | NOT RUN | - | +| 2543 | dc2-spine2 | Connectivity | VerifyReachability | Test the network reachability to one or many destination IP(s). | Source: P2P Interface Ethernet6 (IP: 10.255.255.126) - Destination: dc2-leaf3b.arista.com Ethernet2 (IP: 10.255.255.127) | NOT RUN | - | +| 2544 | dc2-spine2 | Field Notices | VerifyFieldNotice44Resolution | Verifies that the device is using the correct Aboot version per FN0044. | - | NOT RUN | - | +| 2545 | dc2-spine2 | Field Notices | VerifyFieldNotice72Resolution | Verifies if the device is exposed to FN0072, and if the issue has been mitigated. | - | NOT RUN | - | +| 2546 | dc2-spine2 | Greent | VerifyGreenT | Verifies if a GreenT policy is created. | - | NOT RUN | - | +| 2547 | dc2-spine2 | Greent | VerifyGreenTCounters | Verifies if the GreenT counters are incremented. | - | NOT RUN | - | +| 2548 | dc2-spine2 | Hardware | VerifyAdverseDrops | Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches. | - | NOT RUN | - | +| 2549 | dc2-spine2 | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | - | NOT RUN | - | +| 2550 | dc2-spine2 | Hardware | VerifyEnvironmentCooling | Verifies the status of power supply fans and all fan trays. | Accepted States: 'ok' | NOT RUN | - | +| 2551 | dc2-spine2 | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | - | NOT RUN | - | +| 2552 | dc2-spine2 | Hardware | VerifyEnvironmentPower | Verifies the power supplies status. | Accepted States: 'ok' | NOT RUN | - | +| 2553 | dc2-spine2 | Hardware | VerifyEnvironmentSystemCooling | Verifies the system cooling status. | - | NOT RUN | - | +| 2554 | dc2-spine2 | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 2555 | dc2-spine2 | Hardware | VerifyTemperature | Verifies the device temperature. | - | NOT RUN | - | +| 2556 | dc2-spine2 | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | - | NOT RUN | - | +| 2557 | dc2-spine2 | Hardware | VerifyTransceiversManufacturers | Verifies if all transceivers come from approved manufacturers. | Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present' | NOT RUN | - | +| 2558 | dc2-spine2 | Hardware | VerifyTransceiversTemperature | Verifies the transceivers temperature. | - | NOT RUN | - | +| 2559 | dc2-spine2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet1 - P2P_LINK_TO_DC2-LEAF1A_Ethernet2 = 'up' | NOT RUN | - | +| 2560 | dc2-spine2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet2 - P2P_LINK_TO_DC2-LEAF1B_Ethernet2 = 'up' | NOT RUN | - | +| 2561 | dc2-spine2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet3 - P2P_LINK_TO_DC2-LEAF2A_Ethernet2 = 'up' | NOT RUN | - | +| 2562 | dc2-spine2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet4 - P2P_LINK_TO_DC2-LEAF2B_Ethernet2 = 'up' | NOT RUN | - | +| 2563 | dc2-spine2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet5 - P2P_LINK_TO_DC2-LEAF3A.ARISTA.COM_Ethernet2 = 'up' | NOT RUN | - | +| 2564 | dc2-spine2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Ethernet6 - P2P_LINK_TO_DC2-LEAF3B.ARISTA.COM_Ethernet2 = 'up' | NOT RUN | - | +| 2565 | dc2-spine2 | Interfaces | VerifyInterfacesStatus | Verifies the status of the provided interfaces. | Interface Loopback0 - EVPN_Overlay_Peering = 'up' | NOT RUN | - | +| 2566 | dc2-spine2 | LANZ | VerifyLANZ | Verifies if LANZ is enabled. | - | NOT RUN | - | +| 2567 | dc2-spine2 | PTP | VerifyPtpGMStatus | Verifies that the device is locked to a valid PTP Grandmaster. | - | NOT RUN | - | +| 2568 | dc2-spine2 | PTP | VerifyPtpLockStatus | Verifies that the device was locked to the upstream PTP GM in the last minute. | - | NOT RUN | - | +| 2569 | dc2-spine2 | PTP | VerifyPtpModeStatus | Verifies that the device is configured as a PTP Boundary Clock. | - | NOT RUN | - | +| 2570 | dc2-spine2 | PTP | VerifyPtpOffset | Verifies that the PTP timing offset is within +/- 1000ns from the master clock. | - | NOT RUN | - | +| 2571 | dc2-spine2 | PTP | VerifyPtpPortModeStatus | Verifies the PTP interfaces state. | - | NOT RUN | - | +| 2572 | dc2-spine2 | Routing | VerifyRoutingProtocolModel | Verifies the configured routing protocol model. | Routing protocol model: multi-agent | NOT RUN | - | +| 2573 | dc2-spine2 | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | - | NOT RUN | - | +| 2574 | dc2-spine2 | Security | VerifyAPIHttpsSSL | Verifies if the eAPI has a valid SSL profile. | eAPI HTTPS SSL Profile: eAPI_SSL_Profile | NOT RUN | - | +| 2575 | dc2-spine2 | Security | VerifyAPIHttpStatus | Verifies if eAPI HTTP server is disabled globally. | - | NOT RUN | - | +| 2576 | dc2-spine2 | Security | VerifyAPIIPv4Acl | Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 2577 | dc2-spine2 | Security | VerifyAPIIPv6Acl | Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF. | - | NOT RUN | - | +| 2578 | dc2-spine2 | Security | VerifyAPISSLCertificate | Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size. | - | NOT RUN | - | +| 2579 | dc2-spine2 | Security | VerifyBannerLogin | Verifies the login banner of a device. | - | NOT RUN | - | +| 2580 | dc2-spine2 | Security | VerifyBannerMotd | Verifies the motd banner of a device. | - | NOT RUN | - | +| 2581 | dc2-spine2 | Security | VerifyIPSecConnHealth | Verifies all IPv4 security connections. | - | NOT RUN | - | +| 2582 | dc2-spine2 | Security | VerifyIPv4ACL | Verifies the configuration of IPv4 ACLs. | - | NOT RUN | - | +| 2583 | dc2-spine2 | Security | VerifySpecificIPSecConn | Verifies IPv4 security connections for a peer. | - | NOT RUN | - | +| 2584 | dc2-spine2 | Security | VerifySSHIPv4Acl | Verifies if the SSHD agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 2585 | dc2-spine2 | Security | VerifySSHIPv6Acl | Verifies if the SSHD agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 2586 | dc2-spine2 | Security | VerifySSHStatus | Verifies if the SSHD agent is disabled in the default VRF. | - | NOT RUN | - | +| 2587 | dc2-spine2 | Security | VerifyTelnetStatus | Verifies if Telnet is disabled in the default VRF. | - | NOT RUN | - | +| 2588 | dc2-spine2 | Services | VerifyDNSLookup | Verifies the DNS name to IP address resolution. | - | NOT RUN | - | +| 2589 | dc2-spine2 | Services | VerifyDNSServers | Verifies if the DNS servers are correctly configured. | - | NOT RUN | - | +| 2590 | dc2-spine2 | Services | VerifyErrdisableRecovery | Verifies the errdisable recovery reason, status, and interval. | - | NOT RUN | - | +| 2591 | dc2-spine2 | Services | VerifyHostname | Verifies the hostname of a device. | - | NOT RUN | - | +| 2592 | dc2-spine2 | SNMP | VerifySnmpIPv4Acl | Verifies if the SNMP agent has IPv4 ACL(s) configured. | - | NOT RUN | - | +| 2593 | dc2-spine2 | SNMP | VerifySnmpIPv6Acl | Verifies if the SNMP agent has IPv6 ACL(s) configured. | - | NOT RUN | - | +| 2594 | dc2-spine2 | SNMP | VerifySnmpStatus | Verifies if the SNMP agent is enabled. | - | NOT RUN | - | +| 2595 | dc2-spine2 | Software | VerifyEOSVersion | Verifies the EOS version of the device. | - | NOT RUN | - | +| 2596 | dc2-spine2 | Software | VerifyTerminAttrVersion | Verifies the TerminAttr version of the device. | - | NOT RUN | - | +| 2597 | dc2-spine2 | STUN | VerifyStunClient | Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided. | - | NOT RUN | - | +| 2598 | dc2-spine2 | System | VerifyAgentLogs | Verifies there are no agent crash reports. | - | NOT RUN | - | +| 2599 | dc2-spine2 | System | VerifyCoredump | Verifies there are no core dump files. | - | NOT RUN | - | +| 2600 | dc2-spine2 | System | VerifyCPUUtilization | Verifies whether the CPU utilization is below 75%. | - | NOT RUN | - | +| 2601 | dc2-spine2 | System | VerifyFileSystemUtilization | Verifies that no partition is utilizing more than 75% of its disk space. | - | NOT RUN | - | +| 2602 | dc2-spine2 | System | VerifyMemoryUtilization | Verifies whether the memory utilization is below 75%. | - | NOT RUN | - | +| 2603 | dc2-spine2 | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 2604 | dc2-spine2 | System | VerifyNTP | Verifies if NTP is synchronised. | - | NOT RUN | - | +| 2605 | dc2-spine2 | System | VerifyReloadCause | Verifies the last reload cause of the device. | - | NOT RUN | - | +| 2606 | dc2-spine2 | System | VerifyUptime | Verifies the device uptime. | - | NOT RUN | - | +| 2607 | dc2-spine2 | VLAN | VerifyVlanInternalPolicy | Verifies the VLAN internal allocation policy and the range of VLANs. | - | NOT RUN | - | diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-leaf1a-results.json b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-leaf1a-results.json index 5bc28329f3a..6d91504e53e 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-leaf1a-results.json +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-leaf1a-results.json @@ -55,6 +55,15 @@ ], "description": "Verifies TACACS source-interface for a specified VRF." }, + { + "name": "dc1-leaf1a", + "test": "VerifyBGPSpecificPeers", + "categories": [ + "bgp" + ], + "description": "Verifies the health of specific BGP peer(s).", + "custom_field": "BGP EVPN Peer: 10.1.1.1" + }, { "name": "dc1-leaf1a", "test": "VerifyBGPSpecificPeers", @@ -242,6 +251,24 @@ "description": "Test the network reachability to one or many destination IP(s).", "custom_field": "Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2)" }, + { + "name": "dc1-leaf1a", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5)" + }, + { + "name": "dc1-leaf1a", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.255.0.3) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6)" + }, { "name": "dc1-leaf1a", "test": "VerifyReachability", @@ -372,19 +399,33 @@ "name": "dc1-leaf1a", "test": "VerifyFieldNotice44Resolution", "categories": [ - "field notices", - "software" + "field notices" ], - "description": "Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization)" + "description": "Verifies that the device is using the correct Aboot version per FN0044." }, { "name": "dc1-leaf1a", "test": "VerifyFieldNotice72Resolution", "categories": [ - "field notices", - "software" + "field notices" ], - "description": "Verifies if the device has exposeure to FN72, and if the issue has been mitigated" + "description": "Verifies if the device is exposed to FN0072, and if the issue has been mitigated." + }, + { + "name": "dc1-leaf1a", + "test": "VerifyGreenT", + "categories": [ + "greent" + ], + "description": "Verifies if a GreenT policy is created." + }, + { + "name": "dc1-leaf1a", + "test": "VerifyGreenTCounters", + "categories": [ + "greent" + ], + "description": "Verifies if the GreenT counters are incremented." }, { "name": "dc1-leaf1a", @@ -392,7 +433,7 @@ "categories": [ "hardware" ], - "description": "Verifies there are no adverse drops on DCS7280E and DCS7500E" + "description": "Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches." }, { "name": "dc1-leaf1a", @@ -409,7 +450,7 @@ "hardware" ], "description": "Verifies the status of power supply fans and all fan trays.", - "custom_field": "Accepted States: 'ok'" + "custom_field": "Accepted States: 'ok', 'Not Present'" }, { "name": "dc1-leaf1a", @@ -426,7 +467,7 @@ "hardware" ], "description": "Verifies the power supplies status.", - "custom_field": "Accepted States: 'ok'" + "custom_field": "Accepted States: 'ok', 'Not Present'" }, { "name": "dc1-leaf1a", @@ -467,7 +508,7 @@ "hardware" ], "description": "Verifies if all transceivers come from approved manufacturers.", - "custom_field": "Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'" + "custom_field": "Accepted Manufacturers: 'Arastra, Inc.', 'Arista Networks', 'Generic', 'Not Present'" }, { "name": "dc1-leaf1a", @@ -702,6 +743,14 @@ "description": "Verifies the status of the provided interfaces.", "custom_field": "Interface Vxlan1 = 'up'" }, + { + "name": "dc1-leaf1a", + "test": "VerifyLANZ", + "categories": [ + "lanz" + ], + "description": "Verifies if LANZ is enabled." + }, { "name": "dc1-leaf1a", "test": "VerifyMlagStatus", @@ -716,7 +765,7 @@ "categories": [ "profiles" ], - "description": "Verify that the assigned TCAM profile is actually running on the device" + "description": "Verifies the device TCAM profile." }, { "name": "dc1-leaf1a", @@ -724,7 +773,47 @@ "categories": [ "profiles" ], - "description": "" + "description": "Verifies the device is using the expected UFT mode." + }, + { + "name": "dc1-leaf1a", + "test": "VerifyPtpGMStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is locked to a valid PTP Grandmaster." + }, + { + "name": "dc1-leaf1a", + "test": "VerifyPtpLockStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device was locked to the upstream PTP GM in the last minute." + }, + { + "name": "dc1-leaf1a", + "test": "VerifyPtpModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is configured as a PTP Boundary Clock." + }, + { + "name": "dc1-leaf1a", + "test": "VerifyPtpOffset", + "categories": [ + "ptp" + ], + "description": "Verifies that the PTP timing offset is within +/- 1000ns from the master clock." + }, + { + "name": "dc1-leaf1a", + "test": "VerifyPtpPortModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies the PTP interfaces state." }, { "name": "dc1-leaf1a", @@ -915,6 +1004,41 @@ "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", "custom_field": "Route: 10.255.2.2 - Peer: dc1-wan2" }, + { + "name": "dc1-leaf1a", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.33.0.5 - Peer: dc1-svc-leaf1a" + }, + { + "name": "dc1-leaf1a", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.33.0.6 - Peer: dc1-svc-leaf1b" + }, + { + "name": "dc1-leaf1a", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.33.1.5 - Peer: dc1-svc-leaf1a" + }, + { + "name": "dc1-leaf1a", + "test": "VerifyAPIHttpsSSL", + "categories": [ + "security" + ], + "description": "Verifies if the eAPI has a valid SSL profile." + }, { "name": "dc1-leaf1a", "test": "VerifyAPIHttpsSSL", @@ -924,6 +1048,142 @@ "description": "Verifies if the eAPI has a valid SSL profile.", "custom_field": "eAPI HTTPS SSL Profile: eAPI_SSL_Profile" }, + { + "name": "dc1-leaf1a", + "test": "VerifyAPIHttpStatus", + "categories": [ + "security" + ], + "description": "Verifies if eAPI HTTP server is disabled globally." + }, + { + "name": "dc1-leaf1a", + "test": "VerifyAPIIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF." + }, + { + "name": "dc1-leaf1a", + "test": "VerifyAPIIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF." + }, + { + "name": "dc1-leaf1a", + "test": "VerifyAPISSLCertificate", + "categories": [ + "security" + ], + "description": "Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size." + }, + { + "name": "dc1-leaf1a", + "test": "VerifyBannerLogin", + "categories": [ + "security" + ], + "description": "Verifies the login banner of a device." + }, + { + "name": "dc1-leaf1a", + "test": "VerifyBannerMotd", + "categories": [ + "security" + ], + "description": "Verifies the motd banner of a device." + }, + { + "name": "dc1-leaf1a", + "test": "VerifyIPSecConnHealth", + "categories": [ + "security" + ], + "description": "Verifies all IPv4 security connections." + }, + { + "name": "dc1-leaf1a", + "test": "VerifyIPv4ACL", + "categories": [ + "security" + ], + "description": "Verifies the configuration of IPv4 ACLs." + }, + { + "name": "dc1-leaf1a", + "test": "VerifySpecificIPSecConn", + "categories": [ + "security" + ], + "description": "Verifies IPv4 security connections for a peer." + }, + { + "name": "dc1-leaf1a", + "test": "VerifySSHIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv4 ACL(s) configured." + }, + { + "name": "dc1-leaf1a", + "test": "VerifySSHIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv6 ACL(s) configured." + }, + { + "name": "dc1-leaf1a", + "test": "VerifySSHStatus", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent is disabled in the default VRF." + }, + { + "name": "dc1-leaf1a", + "test": "VerifyTelnetStatus", + "categories": [ + "security" + ], + "description": "Verifies if Telnet is disabled in the default VRF." + }, + { + "name": "dc1-leaf1a", + "test": "VerifyDNSLookup", + "categories": [ + "services" + ], + "description": "Verifies the DNS name to IP address resolution." + }, + { + "name": "dc1-leaf1a", + "test": "VerifyDNSServers", + "categories": [ + "services" + ], + "description": "Verifies if the DNS servers are correctly configured." + }, + { + "name": "dc1-leaf1a", + "test": "VerifyErrdisableRecovery", + "categories": [ + "services" + ], + "description": "Verifies the errdisable recovery reason, status, and interval." + }, + { + "name": "dc1-leaf1a", + "test": "VerifyHostname", + "categories": [ + "services" + ], + "description": "Verifies the hostname of a device." + }, { "name": "dc1-leaf1a", "test": "VerifySnmpIPv4Acl", @@ -954,7 +1214,7 @@ "categories": [ "software" ], - "description": "Verifies all EOS extensions installed on the device are enabled for boot persistence." + "description": "Verifies that all EOS extensions installed on the device are enabled for boot persistence." }, { "name": "dc1-leaf1a", @@ -962,7 +1222,7 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed EOS version." + "description": "Verifies the EOS version of the device." }, { "name": "dc1-leaf1a", @@ -970,7 +1230,15 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed TerminAttr version." + "description": "Verifies the TerminAttr version of the device." + }, + { + "name": "dc1-leaf1a", + "test": "VerifyStunClient", + "categories": [ + "stun" + ], + "description": "Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided." }, { "name": "dc1-leaf1a", @@ -1044,6 +1312,22 @@ ], "description": "Verifies the device uptime." }, + { + "name": "dc1-leaf1a", + "test": "VerifyVlanInternalPolicy", + "categories": [ + "vlan" + ], + "description": "Verifies the VLAN internal allocation policy and the range of VLANs." + }, + { + "name": "dc1-leaf1a", + "test": "VerifyVxlan1ConnSettings", + "categories": [ + "vxlan" + ], + "description": "Verifies the interface vxlan1 source interface and UDP port." + }, { "name": "dc1-leaf1a", "test": "VerifyVxlan1Interface", diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-leaf1b-results.json b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-leaf1b-results.json index 857af982ae3..87efe9ce47f 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-leaf1b-results.json +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-leaf1b-results.json @@ -242,6 +242,24 @@ "description": "Test the network reachability to one or many destination IP(s).", "custom_field": "Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2)" }, + { + "name": "dc1-leaf1b", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5)" + }, + { + "name": "dc1-leaf1b", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.255.0.4) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6)" + }, { "name": "dc1-leaf1b", "test": "VerifyReachability", @@ -372,19 +390,33 @@ "name": "dc1-leaf1b", "test": "VerifyFieldNotice44Resolution", "categories": [ - "field notices", - "software" + "field notices" ], - "description": "Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization)" + "description": "Verifies that the device is using the correct Aboot version per FN0044." }, { "name": "dc1-leaf1b", "test": "VerifyFieldNotice72Resolution", "categories": [ - "field notices", - "software" + "field notices" + ], + "description": "Verifies if the device is exposed to FN0072, and if the issue has been mitigated." + }, + { + "name": "dc1-leaf1b", + "test": "VerifyGreenT", + "categories": [ + "greent" + ], + "description": "Verifies if a GreenT policy is created." + }, + { + "name": "dc1-leaf1b", + "test": "VerifyGreenTCounters", + "categories": [ + "greent" ], - "description": "Verifies if the device has exposeure to FN72, and if the issue has been mitigated" + "description": "Verifies if the GreenT counters are incremented." }, { "name": "dc1-leaf1b", @@ -392,7 +424,7 @@ "categories": [ "hardware" ], - "description": "Verifies there are no adverse drops on DCS7280E and DCS7500E" + "description": "Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches." }, { "name": "dc1-leaf1b", @@ -702,6 +734,14 @@ "description": "Verifies the status of the provided interfaces.", "custom_field": "Interface Vxlan1 = 'up'" }, + { + "name": "dc1-leaf1b", + "test": "VerifyLANZ", + "categories": [ + "lanz" + ], + "description": "Verifies if LANZ is enabled." + }, { "name": "dc1-leaf1b", "test": "VerifyMlagStatus", @@ -710,6 +750,46 @@ ], "description": "Verifies the health status of the MLAG configuration." }, + { + "name": "dc1-leaf1b", + "test": "VerifyPtpGMStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is locked to a valid PTP Grandmaster." + }, + { + "name": "dc1-leaf1b", + "test": "VerifyPtpLockStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device was locked to the upstream PTP GM in the last minute." + }, + { + "name": "dc1-leaf1b", + "test": "VerifyPtpModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is configured as a PTP Boundary Clock." + }, + { + "name": "dc1-leaf1b", + "test": "VerifyPtpOffset", + "categories": [ + "ptp" + ], + "description": "Verifies that the PTP timing offset is within +/- 1000ns from the master clock." + }, + { + "name": "dc1-leaf1b", + "test": "VerifyPtpPortModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies the PTP interfaces state." + }, { "name": "dc1-leaf1b", "test": "VerifyRoutingProtocolModel", @@ -899,6 +979,41 @@ "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", "custom_field": "Route: 10.255.2.2 - Peer: dc1-wan2" }, + { + "name": "dc1-leaf1b", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.33.0.5 - Peer: dc1-svc-leaf1a" + }, + { + "name": "dc1-leaf1b", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.33.0.6 - Peer: dc1-svc-leaf1b" + }, + { + "name": "dc1-leaf1b", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.33.1.5 - Peer: dc1-svc-leaf1a" + }, + { + "name": "dc1-leaf1b", + "test": "VerifyAPIHttpsSSL", + "categories": [ + "security" + ], + "description": "Verifies if the eAPI has a valid SSL profile." + }, { "name": "dc1-leaf1b", "test": "VerifyAPIHttpsSSL", @@ -908,6 +1023,142 @@ "description": "Verifies if the eAPI has a valid SSL profile.", "custom_field": "eAPI HTTPS SSL Profile: eAPI_SSL_Profile" }, + { + "name": "dc1-leaf1b", + "test": "VerifyAPIHttpStatus", + "categories": [ + "security" + ], + "description": "Verifies if eAPI HTTP server is disabled globally." + }, + { + "name": "dc1-leaf1b", + "test": "VerifyAPIIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF." + }, + { + "name": "dc1-leaf1b", + "test": "VerifyAPIIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF." + }, + { + "name": "dc1-leaf1b", + "test": "VerifyAPISSLCertificate", + "categories": [ + "security" + ], + "description": "Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size." + }, + { + "name": "dc1-leaf1b", + "test": "VerifyBannerLogin", + "categories": [ + "security" + ], + "description": "Verifies the login banner of a device." + }, + { + "name": "dc1-leaf1b", + "test": "VerifyBannerMotd", + "categories": [ + "security" + ], + "description": "Verifies the motd banner of a device." + }, + { + "name": "dc1-leaf1b", + "test": "VerifyIPSecConnHealth", + "categories": [ + "security" + ], + "description": "Verifies all IPv4 security connections." + }, + { + "name": "dc1-leaf1b", + "test": "VerifyIPv4ACL", + "categories": [ + "security" + ], + "description": "Verifies the configuration of IPv4 ACLs." + }, + { + "name": "dc1-leaf1b", + "test": "VerifySpecificIPSecConn", + "categories": [ + "security" + ], + "description": "Verifies IPv4 security connections for a peer." + }, + { + "name": "dc1-leaf1b", + "test": "VerifySSHIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv4 ACL(s) configured." + }, + { + "name": "dc1-leaf1b", + "test": "VerifySSHIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv6 ACL(s) configured." + }, + { + "name": "dc1-leaf1b", + "test": "VerifySSHStatus", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent is disabled in the default VRF." + }, + { + "name": "dc1-leaf1b", + "test": "VerifyTelnetStatus", + "categories": [ + "security" + ], + "description": "Verifies if Telnet is disabled in the default VRF." + }, + { + "name": "dc1-leaf1b", + "test": "VerifyDNSLookup", + "categories": [ + "services" + ], + "description": "Verifies the DNS name to IP address resolution." + }, + { + "name": "dc1-leaf1b", + "test": "VerifyDNSServers", + "categories": [ + "services" + ], + "description": "Verifies if the DNS servers are correctly configured." + }, + { + "name": "dc1-leaf1b", + "test": "VerifyErrdisableRecovery", + "categories": [ + "services" + ], + "description": "Verifies the errdisable recovery reason, status, and interval." + }, + { + "name": "dc1-leaf1b", + "test": "VerifyHostname", + "categories": [ + "services" + ], + "description": "Verifies the hostname of a device." + }, { "name": "dc1-leaf1b", "test": "VerifySnmpIPv4Acl", @@ -938,7 +1189,7 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed EOS version." + "description": "Verifies the EOS version of the device." }, { "name": "dc1-leaf1b", @@ -946,7 +1197,15 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed TerminAttr version." + "description": "Verifies the TerminAttr version of the device." + }, + { + "name": "dc1-leaf1b", + "test": "VerifyStunClient", + "categories": [ + "stun" + ], + "description": "Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided." }, { "name": "dc1-leaf1b", @@ -1019,5 +1278,13 @@ "system" ], "description": "Verifies the device uptime." + }, + { + "name": "dc1-leaf1b", + "test": "VerifyVlanInternalPolicy", + "categories": [ + "vlan" + ], + "description": "Verifies the VLAN internal allocation policy and the range of VLANs." } ] \ No newline at end of file diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-leaf1c-results.json b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-leaf1c-results.json index 8fd70b4073d..c6cb0e0ca42 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-leaf1c-results.json +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-leaf1c-results.json @@ -134,6 +134,24 @@ "description": "Test the network reachability to one or many destination IP(s).", "custom_field": "Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2)" }, + { + "name": "dc1-leaf1c", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5)" + }, + { + "name": "dc1-leaf1c", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.4) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6)" + }, { "name": "dc1-leaf1c", "test": "VerifyReachability", @@ -228,19 +246,33 @@ "name": "dc1-leaf1c", "test": "VerifyFieldNotice44Resolution", "categories": [ - "field notices", - "software" + "field notices" ], - "description": "Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization)" + "description": "Verifies that the device is using the correct Aboot version per FN0044." }, { "name": "dc1-leaf1c", "test": "VerifyFieldNotice72Resolution", "categories": [ - "field notices", - "software" + "field notices" + ], + "description": "Verifies if the device is exposed to FN0072, and if the issue has been mitigated." + }, + { + "name": "dc1-leaf1c", + "test": "VerifyGreenT", + "categories": [ + "greent" + ], + "description": "Verifies if a GreenT policy is created." + }, + { + "name": "dc1-leaf1c", + "test": "VerifyGreenTCounters", + "categories": [ + "greent" ], - "description": "Verifies if the device has exposeure to FN72, and if the issue has been mitigated" + "description": "Verifies if the GreenT counters are incremented." }, { "name": "dc1-leaf1c", @@ -248,7 +280,7 @@ "categories": [ "hardware" ], - "description": "Verifies there are no adverse drops on DCS7280E and DCS7500E" + "description": "Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches." }, { "name": "dc1-leaf1c", @@ -378,6 +410,62 @@ "description": "Verifies the status of the provided interfaces.", "custom_field": "Interface Vlan4085 - L2LEAF_INBAND_MGMT = 'up'" }, + { + "name": "dc1-leaf1c", + "test": "VerifyLANZ", + "categories": [ + "lanz" + ], + "description": "Verifies if LANZ is enabled." + }, + { + "name": "dc1-leaf1c", + "test": "VerifyPtpGMStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is locked to a valid PTP Grandmaster." + }, + { + "name": "dc1-leaf1c", + "test": "VerifyPtpLockStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device was locked to the upstream PTP GM in the last minute." + }, + { + "name": "dc1-leaf1c", + "test": "VerifyPtpModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is configured as a PTP Boundary Clock." + }, + { + "name": "dc1-leaf1c", + "test": "VerifyPtpOffset", + "categories": [ + "ptp" + ], + "description": "Verifies that the PTP timing offset is within +/- 1000ns from the master clock." + }, + { + "name": "dc1-leaf1c", + "test": "VerifyPtpPortModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies the PTP interfaces state." + }, + { + "name": "dc1-leaf1c", + "test": "VerifyAPIHttpsSSL", + "categories": [ + "security" + ], + "description": "Verifies if the eAPI has a valid SSL profile." + }, { "name": "dc1-leaf1c", "test": "VerifyAPIHttpsSSL", @@ -387,6 +475,142 @@ "description": "Verifies if the eAPI has a valid SSL profile.", "custom_field": "eAPI HTTPS SSL Profile: eAPI_SSL_Profile" }, + { + "name": "dc1-leaf1c", + "test": "VerifyAPIHttpStatus", + "categories": [ + "security" + ], + "description": "Verifies if eAPI HTTP server is disabled globally." + }, + { + "name": "dc1-leaf1c", + "test": "VerifyAPIIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF." + }, + { + "name": "dc1-leaf1c", + "test": "VerifyAPIIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF." + }, + { + "name": "dc1-leaf1c", + "test": "VerifyAPISSLCertificate", + "categories": [ + "security" + ], + "description": "Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size." + }, + { + "name": "dc1-leaf1c", + "test": "VerifyBannerLogin", + "categories": [ + "security" + ], + "description": "Verifies the login banner of a device." + }, + { + "name": "dc1-leaf1c", + "test": "VerifyBannerMotd", + "categories": [ + "security" + ], + "description": "Verifies the motd banner of a device." + }, + { + "name": "dc1-leaf1c", + "test": "VerifyIPSecConnHealth", + "categories": [ + "security" + ], + "description": "Verifies all IPv4 security connections." + }, + { + "name": "dc1-leaf1c", + "test": "VerifyIPv4ACL", + "categories": [ + "security" + ], + "description": "Verifies the configuration of IPv4 ACLs." + }, + { + "name": "dc1-leaf1c", + "test": "VerifySpecificIPSecConn", + "categories": [ + "security" + ], + "description": "Verifies IPv4 security connections for a peer." + }, + { + "name": "dc1-leaf1c", + "test": "VerifySSHIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv4 ACL(s) configured." + }, + { + "name": "dc1-leaf1c", + "test": "VerifySSHIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv6 ACL(s) configured." + }, + { + "name": "dc1-leaf1c", + "test": "VerifySSHStatus", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent is disabled in the default VRF." + }, + { + "name": "dc1-leaf1c", + "test": "VerifyTelnetStatus", + "categories": [ + "security" + ], + "description": "Verifies if Telnet is disabled in the default VRF." + }, + { + "name": "dc1-leaf1c", + "test": "VerifyDNSLookup", + "categories": [ + "services" + ], + "description": "Verifies the DNS name to IP address resolution." + }, + { + "name": "dc1-leaf1c", + "test": "VerifyDNSServers", + "categories": [ + "services" + ], + "description": "Verifies if the DNS servers are correctly configured." + }, + { + "name": "dc1-leaf1c", + "test": "VerifyErrdisableRecovery", + "categories": [ + "services" + ], + "description": "Verifies the errdisable recovery reason, status, and interval." + }, + { + "name": "dc1-leaf1c", + "test": "VerifyHostname", + "categories": [ + "services" + ], + "description": "Verifies the hostname of a device." + }, { "name": "dc1-leaf1c", "test": "VerifySnmpIPv4Acl", @@ -417,7 +641,7 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed EOS version." + "description": "Verifies the EOS version of the device." }, { "name": "dc1-leaf1c", @@ -425,7 +649,15 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed TerminAttr version." + "description": "Verifies the TerminAttr version of the device." + }, + { + "name": "dc1-leaf1c", + "test": "VerifyStunClient", + "categories": [ + "stun" + ], + "description": "Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided." }, { "name": "dc1-leaf1c", @@ -498,5 +730,13 @@ "system" ], "description": "Verifies the device uptime." + }, + { + "name": "dc1-leaf1c", + "test": "VerifyVlanInternalPolicy", + "categories": [ + "vlan" + ], + "description": "Verifies the VLAN internal allocation policy and the range of VLANs." } ] \ No newline at end of file diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-leaf2a-results.json b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-leaf2a-results.json index 8f070320626..3d6e1903390 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-leaf2a-results.json +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-leaf2a-results.json @@ -206,6 +206,24 @@ "description": "Test the network reachability to one or many destination IP(s).", "custom_field": "Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2)" }, + { + "name": "dc1-leaf2a", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5)" + }, + { + "name": "dc1-leaf2a", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.255.0.5) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6)" + }, { "name": "dc1-leaf2a", "test": "VerifyReachability", @@ -327,19 +345,33 @@ "name": "dc1-leaf2a", "test": "VerifyFieldNotice44Resolution", "categories": [ - "field notices", - "software" + "field notices" ], - "description": "Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization)" + "description": "Verifies that the device is using the correct Aboot version per FN0044." }, { "name": "dc1-leaf2a", "test": "VerifyFieldNotice72Resolution", "categories": [ - "field notices", - "software" + "field notices" + ], + "description": "Verifies if the device is exposed to FN0072, and if the issue has been mitigated." + }, + { + "name": "dc1-leaf2a", + "test": "VerifyGreenT", + "categories": [ + "greent" + ], + "description": "Verifies if a GreenT policy is created." + }, + { + "name": "dc1-leaf2a", + "test": "VerifyGreenTCounters", + "categories": [ + "greent" ], - "description": "Verifies if the device has exposeure to FN72, and if the issue has been mitigated" + "description": "Verifies if the GreenT counters are incremented." }, { "name": "dc1-leaf2a", @@ -347,7 +379,7 @@ "categories": [ "hardware" ], - "description": "Verifies there are no adverse drops on DCS7280E and DCS7500E" + "description": "Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches." }, { "name": "dc1-leaf2a", @@ -648,6 +680,14 @@ "description": "Verifies the status of the provided interfaces.", "custom_field": "Interface Vxlan1 = 'up'" }, + { + "name": "dc1-leaf2a", + "test": "VerifyLANZ", + "categories": [ + "lanz" + ], + "description": "Verifies if LANZ is enabled." + }, { "name": "dc1-leaf2a", "test": "VerifyMlagStatus", @@ -662,7 +702,7 @@ "categories": [ "profiles" ], - "description": "Verify that the assigned TCAM profile is actually running on the device" + "description": "Verifies the device TCAM profile." }, { "name": "dc1-leaf2a", @@ -670,7 +710,47 @@ "categories": [ "profiles" ], - "description": "" + "description": "Verifies the device is using the expected UFT mode." + }, + { + "name": "dc1-leaf2a", + "test": "VerifyPtpGMStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is locked to a valid PTP Grandmaster." + }, + { + "name": "dc1-leaf2a", + "test": "VerifyPtpLockStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device was locked to the upstream PTP GM in the last minute." + }, + { + "name": "dc1-leaf2a", + "test": "VerifyPtpModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is configured as a PTP Boundary Clock." + }, + { + "name": "dc1-leaf2a", + "test": "VerifyPtpOffset", + "categories": [ + "ptp" + ], + "description": "Verifies that the PTP timing offset is within +/- 1000ns from the master clock." + }, + { + "name": "dc1-leaf2a", + "test": "VerifyPtpPortModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies the PTP interfaces state." }, { "name": "dc1-leaf2a", @@ -861,6 +941,41 @@ "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", "custom_field": "Route: 10.255.2.2 - Peer: dc1-wan2" }, + { + "name": "dc1-leaf2a", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.33.0.5 - Peer: dc1-svc-leaf1a" + }, + { + "name": "dc1-leaf2a", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.33.0.6 - Peer: dc1-svc-leaf1b" + }, + { + "name": "dc1-leaf2a", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.33.1.5 - Peer: dc1-svc-leaf1a" + }, + { + "name": "dc1-leaf2a", + "test": "VerifyAPIHttpsSSL", + "categories": [ + "security" + ], + "description": "Verifies if the eAPI has a valid SSL profile." + }, { "name": "dc1-leaf2a", "test": "VerifyAPIHttpsSSL", @@ -870,6 +985,142 @@ "description": "Verifies if the eAPI has a valid SSL profile.", "custom_field": "eAPI HTTPS SSL Profile: eAPI_SSL_Profile" }, + { + "name": "dc1-leaf2a", + "test": "VerifyAPIHttpStatus", + "categories": [ + "security" + ], + "description": "Verifies if eAPI HTTP server is disabled globally." + }, + { + "name": "dc1-leaf2a", + "test": "VerifyAPIIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF." + }, + { + "name": "dc1-leaf2a", + "test": "VerifyAPIIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF." + }, + { + "name": "dc1-leaf2a", + "test": "VerifyAPISSLCertificate", + "categories": [ + "security" + ], + "description": "Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size." + }, + { + "name": "dc1-leaf2a", + "test": "VerifyBannerLogin", + "categories": [ + "security" + ], + "description": "Verifies the login banner of a device." + }, + { + "name": "dc1-leaf2a", + "test": "VerifyBannerMotd", + "categories": [ + "security" + ], + "description": "Verifies the motd banner of a device." + }, + { + "name": "dc1-leaf2a", + "test": "VerifyIPSecConnHealth", + "categories": [ + "security" + ], + "description": "Verifies all IPv4 security connections." + }, + { + "name": "dc1-leaf2a", + "test": "VerifyIPv4ACL", + "categories": [ + "security" + ], + "description": "Verifies the configuration of IPv4 ACLs." + }, + { + "name": "dc1-leaf2a", + "test": "VerifySpecificIPSecConn", + "categories": [ + "security" + ], + "description": "Verifies IPv4 security connections for a peer." + }, + { + "name": "dc1-leaf2a", + "test": "VerifySSHIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv4 ACL(s) configured." + }, + { + "name": "dc1-leaf2a", + "test": "VerifySSHIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv6 ACL(s) configured." + }, + { + "name": "dc1-leaf2a", + "test": "VerifySSHStatus", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent is disabled in the default VRF." + }, + { + "name": "dc1-leaf2a", + "test": "VerifyTelnetStatus", + "categories": [ + "security" + ], + "description": "Verifies if Telnet is disabled in the default VRF." + }, + { + "name": "dc1-leaf2a", + "test": "VerifyDNSLookup", + "categories": [ + "services" + ], + "description": "Verifies the DNS name to IP address resolution." + }, + { + "name": "dc1-leaf2a", + "test": "VerifyDNSServers", + "categories": [ + "services" + ], + "description": "Verifies if the DNS servers are correctly configured." + }, + { + "name": "dc1-leaf2a", + "test": "VerifyErrdisableRecovery", + "categories": [ + "services" + ], + "description": "Verifies the errdisable recovery reason, status, and interval." + }, + { + "name": "dc1-leaf2a", + "test": "VerifyHostname", + "categories": [ + "services" + ], + "description": "Verifies the hostname of a device." + }, { "name": "dc1-leaf2a", "test": "VerifySnmpIPv4Acl", @@ -900,7 +1151,7 @@ "categories": [ "software" ], - "description": "Verifies all EOS extensions installed on the device are enabled for boot persistence." + "description": "Verifies that all EOS extensions installed on the device are enabled for boot persistence." }, { "name": "dc1-leaf2a", @@ -908,7 +1159,7 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed EOS version." + "description": "Verifies the EOS version of the device." }, { "name": "dc1-leaf2a", @@ -916,7 +1167,15 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed TerminAttr version." + "description": "Verifies the TerminAttr version of the device." + }, + { + "name": "dc1-leaf2a", + "test": "VerifyStunClient", + "categories": [ + "stun" + ], + "description": "Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided." }, { "name": "dc1-leaf2a", @@ -989,5 +1248,13 @@ "system" ], "description": "Verifies the device uptime." + }, + { + "name": "dc1-leaf2a", + "test": "VerifyVlanInternalPolicy", + "categories": [ + "vlan" + ], + "description": "Verifies the VLAN internal allocation policy and the range of VLANs." } ] \ No newline at end of file diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-leaf2c-results.json b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-leaf2c-results.json index 9266acd058e..b812a2d8d6f 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-leaf2c-results.json +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-leaf2c-results.json @@ -125,6 +125,24 @@ "description": "Test the network reachability to one or many destination IP(s).", "custom_field": "Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2)" }, + { + "name": "dc1-leaf2c", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5)" + }, + { + "name": "dc1-leaf2c", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Inband MGMT SVI Vlan4085 (IP: 172.21.110.5) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6)" + }, { "name": "dc1-leaf2c", "test": "VerifyReachability", @@ -219,19 +237,33 @@ "name": "dc1-leaf2c", "test": "VerifyFieldNotice44Resolution", "categories": [ - "field notices", - "software" + "field notices" ], - "description": "Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization)" + "description": "Verifies that the device is using the correct Aboot version per FN0044." }, { "name": "dc1-leaf2c", "test": "VerifyFieldNotice72Resolution", "categories": [ - "field notices", - "software" + "field notices" + ], + "description": "Verifies if the device is exposed to FN0072, and if the issue has been mitigated." + }, + { + "name": "dc1-leaf2c", + "test": "VerifyGreenT", + "categories": [ + "greent" + ], + "description": "Verifies if a GreenT policy is created." + }, + { + "name": "dc1-leaf2c", + "test": "VerifyGreenTCounters", + "categories": [ + "greent" ], - "description": "Verifies if the device has exposeure to FN72, and if the issue has been mitigated" + "description": "Verifies if the GreenT counters are incremented." }, { "name": "dc1-leaf2c", @@ -239,7 +271,7 @@ "categories": [ "hardware" ], - "description": "Verifies there are no adverse drops on DCS7280E and DCS7500E" + "description": "Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches." }, { "name": "dc1-leaf2c", @@ -369,6 +401,62 @@ "description": "Verifies the status of the provided interfaces.", "custom_field": "Interface Vlan4085 - L2LEAF_INBAND_MGMT = 'up'" }, + { + "name": "dc1-leaf2c", + "test": "VerifyLANZ", + "categories": [ + "lanz" + ], + "description": "Verifies if LANZ is enabled." + }, + { + "name": "dc1-leaf2c", + "test": "VerifyPtpGMStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is locked to a valid PTP Grandmaster." + }, + { + "name": "dc1-leaf2c", + "test": "VerifyPtpLockStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device was locked to the upstream PTP GM in the last minute." + }, + { + "name": "dc1-leaf2c", + "test": "VerifyPtpModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is configured as a PTP Boundary Clock." + }, + { + "name": "dc1-leaf2c", + "test": "VerifyPtpOffset", + "categories": [ + "ptp" + ], + "description": "Verifies that the PTP timing offset is within +/- 1000ns from the master clock." + }, + { + "name": "dc1-leaf2c", + "test": "VerifyPtpPortModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies the PTP interfaces state." + }, + { + "name": "dc1-leaf2c", + "test": "VerifyAPIHttpsSSL", + "categories": [ + "security" + ], + "description": "Verifies if the eAPI has a valid SSL profile." + }, { "name": "dc1-leaf2c", "test": "VerifyAPIHttpsSSL", @@ -378,6 +466,142 @@ "description": "Verifies if the eAPI has a valid SSL profile.", "custom_field": "eAPI HTTPS SSL Profile: eAPI_SSL_Profile" }, + { + "name": "dc1-leaf2c", + "test": "VerifyAPIHttpStatus", + "categories": [ + "security" + ], + "description": "Verifies if eAPI HTTP server is disabled globally." + }, + { + "name": "dc1-leaf2c", + "test": "VerifyAPIIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF." + }, + { + "name": "dc1-leaf2c", + "test": "VerifyAPIIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF." + }, + { + "name": "dc1-leaf2c", + "test": "VerifyAPISSLCertificate", + "categories": [ + "security" + ], + "description": "Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size." + }, + { + "name": "dc1-leaf2c", + "test": "VerifyBannerLogin", + "categories": [ + "security" + ], + "description": "Verifies the login banner of a device." + }, + { + "name": "dc1-leaf2c", + "test": "VerifyBannerMotd", + "categories": [ + "security" + ], + "description": "Verifies the motd banner of a device." + }, + { + "name": "dc1-leaf2c", + "test": "VerifyIPSecConnHealth", + "categories": [ + "security" + ], + "description": "Verifies all IPv4 security connections." + }, + { + "name": "dc1-leaf2c", + "test": "VerifyIPv4ACL", + "categories": [ + "security" + ], + "description": "Verifies the configuration of IPv4 ACLs." + }, + { + "name": "dc1-leaf2c", + "test": "VerifySpecificIPSecConn", + "categories": [ + "security" + ], + "description": "Verifies IPv4 security connections for a peer." + }, + { + "name": "dc1-leaf2c", + "test": "VerifySSHIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv4 ACL(s) configured." + }, + { + "name": "dc1-leaf2c", + "test": "VerifySSHIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv6 ACL(s) configured." + }, + { + "name": "dc1-leaf2c", + "test": "VerifySSHStatus", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent is disabled in the default VRF." + }, + { + "name": "dc1-leaf2c", + "test": "VerifyTelnetStatus", + "categories": [ + "security" + ], + "description": "Verifies if Telnet is disabled in the default VRF." + }, + { + "name": "dc1-leaf2c", + "test": "VerifyDNSLookup", + "categories": [ + "services" + ], + "description": "Verifies the DNS name to IP address resolution." + }, + { + "name": "dc1-leaf2c", + "test": "VerifyDNSServers", + "categories": [ + "services" + ], + "description": "Verifies if the DNS servers are correctly configured." + }, + { + "name": "dc1-leaf2c", + "test": "VerifyErrdisableRecovery", + "categories": [ + "services" + ], + "description": "Verifies the errdisable recovery reason, status, and interval." + }, + { + "name": "dc1-leaf2c", + "test": "VerifyHostname", + "categories": [ + "services" + ], + "description": "Verifies the hostname of a device." + }, { "name": "dc1-leaf2c", "test": "VerifySnmpIPv4Acl", @@ -408,7 +632,7 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed EOS version." + "description": "Verifies the EOS version of the device." }, { "name": "dc1-leaf2c", @@ -416,7 +640,15 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed TerminAttr version." + "description": "Verifies the TerminAttr version of the device." + }, + { + "name": "dc1-leaf2c", + "test": "VerifyStunClient", + "categories": [ + "stun" + ], + "description": "Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided." }, { "name": "dc1-leaf2c", @@ -489,5 +721,13 @@ "system" ], "description": "Verifies the device uptime." + }, + { + "name": "dc1-leaf2c", + "test": "VerifyVlanInternalPolicy", + "categories": [ + "vlan" + ], + "description": "Verifies the VLAN internal allocation policy and the range of VLANs." } ] \ No newline at end of file diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-spine1-results.json b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-spine1-results.json index 809827d1f99..a1aced857eb 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-spine1-results.json +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-spine1-results.json @@ -79,6 +79,30 @@ ], "description": "Verifies the IPv4 BFD peer's sessions and remote disc in the specified VRF." }, + { + "name": "dc1-spine1", + "test": "VerifyBGPAdvCommunities", + "categories": [ + "bgp" + ], + "description": "Verifies the advertised communities of a BGP peer." + }, + { + "name": "dc1-spine1", + "test": "VerifyBGPExchangedRoutes", + "categories": [ + "bgp" + ], + "description": "Verifies the advertised and received routes of BGP peers." + }, + { + "name": "dc1-spine1", + "test": "VerifyBGPPeerASNCap", + "categories": [ + "bgp" + ], + "description": "Verifies the four octet asn capabilities of a BGP peer." + }, { "name": "dc1-spine1", "test": "VerifyBGPPeerCount", @@ -87,6 +111,30 @@ ], "description": "Verifies the count of BGP peers." }, + { + "name": "dc1-spine1", + "test": "VerifyBGPPeerMD5Auth", + "categories": [ + "bgp" + ], + "description": "Verifies the MD5 authentication and state of a BGP peer." + }, + { + "name": "dc1-spine1", + "test": "VerifyBGPPeerMPCaps", + "categories": [ + "bgp" + ], + "description": "Verifies the multiprotocol capabilities of a BGP peer." + }, + { + "name": "dc1-spine1", + "test": "VerifyBGPPeerRouteRefreshCap", + "categories": [ + "bgp" + ], + "description": "Verifies the route refresh capabilities of a BGP peer." + }, { "name": "dc1-spine1", "test": "VerifyBGPPeersHealth", @@ -103,6 +151,22 @@ ], "description": "Verifies the health of specific BGP peer(s)." }, + { + "name": "dc1-spine1", + "test": "VerifyBGPTimers", + "categories": [ + "bgp" + ], + "description": "Verifies the timers of a BGP peer." + }, + { + "name": "dc1-spine1", + "test": "VerifyEVPNType2Route", + "categories": [ + "bgp" + ], + "description": "Verifies the EVPN Type-2 routes for a given IPv4 or MAC address and VNI." + }, { "name": "dc1-spine1", "test": "VerifyRunningConfigDiffs", @@ -146,6 +210,24 @@ "description": "Verifies that the provided LLDP neighbors are connected properly.", "custom_field": "Local: Ethernet3 - Remote: dc1-leaf2a Ethernet1" }, + { + "name": "dc1-spine1", + "test": "VerifyLLDPNeighbors", + "categories": [ + "connectivity" + ], + "description": "Verifies that the provided LLDP neighbors are connected properly.", + "custom_field": "Local: Ethernet5 - Remote: dc1-svc-leaf1a Ethernet1" + }, + { + "name": "dc1-spine1", + "test": "VerifyLLDPNeighbors", + "categories": [ + "connectivity" + ], + "description": "Verifies that the provided LLDP neighbors are connected properly.", + "custom_field": "Local: Ethernet6 - Remote: dc1-svc-leaf1b Ethernet1" + }, { "name": "dc1-spine1", "test": "VerifyReachability", @@ -173,23 +255,55 @@ "description": "Test the network reachability to one or many destination IP(s).", "custom_field": "Source: P2P Interface Ethernet3 (IP: 10.255.255.8) - Destination: dc1-leaf2a Ethernet1 (IP: 10.255.255.9)" }, + { + "name": "dc1-spine1", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: P2P Interface Ethernet5 (IP: 10.33.255.16) - Destination: dc1-svc-leaf1a Ethernet1 (IP: 10.33.255.17)" + }, + { + "name": "dc1-spine1", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: P2P Interface Ethernet6 (IP: 10.33.255.20) - Destination: dc1-svc-leaf1b Ethernet1 (IP: 10.33.255.21)" + }, { "name": "dc1-spine1", "test": "VerifyFieldNotice44Resolution", "categories": [ - "field notices", - "software" + "field notices" ], - "description": "Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization)" + "description": "Verifies that the device is using the correct Aboot version per FN0044." }, { "name": "dc1-spine1", "test": "VerifyFieldNotice72Resolution", "categories": [ - "field notices", - "software" + "field notices" ], - "description": "Verifies if the device has exposeure to FN72, and if the issue has been mitigated" + "description": "Verifies if the device is exposed to FN0072, and if the issue has been mitigated." + }, + { + "name": "dc1-spine1", + "test": "VerifyGreenT", + "categories": [ + "greent" + ], + "description": "Verifies if a GreenT policy is created." + }, + { + "name": "dc1-spine1", + "test": "VerifyGreenTCounters", + "categories": [ + "greent" + ], + "description": "Verifies if the GreenT counters are incremented." }, { "name": "dc1-spine1", @@ -197,7 +311,7 @@ "categories": [ "hardware" ], - "description": "Verifies there are no adverse drops on DCS7280E and DCS7500E" + "description": "Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches." }, { "name": "dc1-spine1", @@ -358,6 +472,24 @@ "description": "Verifies the status of the provided interfaces.", "custom_field": "Interface Ethernet4 - P2P_LINK_TO_DC1-LEAF2B_Ethernet1 = 'adminDown'" }, + { + "name": "dc1-spine1", + "test": "VerifyInterfacesStatus", + "categories": [ + "interfaces" + ], + "description": "Verifies the status of the provided interfaces.", + "custom_field": "Interface Ethernet5 - P2P_LINK_TO_DC1-SVC-LEAF1A_Ethernet1 = 'up'" + }, + { + "name": "dc1-spine1", + "test": "VerifyInterfacesStatus", + "categories": [ + "interfaces" + ], + "description": "Verifies the status of the provided interfaces.", + "custom_field": "Interface Ethernet6 - P2P_LINK_TO_DC1-SVC-LEAF1B_Ethernet1 = 'up'" + }, { "name": "dc1-spine1", "test": "VerifyInterfacesStatus", @@ -373,7 +505,7 @@ "categories": [ "interfaces" ], - "description": "Verifies that all interfaces have a usage below 75%." + "description": "Verifies that the utilization of interfaces is below a certain threshold." }, { "name": "dc1-spine1", @@ -431,6 +563,22 @@ ], "description": "Verifies the status of all SVIs." }, + { + "name": "dc1-spine1", + "test": "VerifyLANZ", + "categories": [ + "lanz" + ], + "description": "Verifies if LANZ is enabled." + }, + { + "name": "dc1-spine1", + "test": "VerifyOSPFMaxLSA", + "categories": [ + "ospf" + ], + "description": "Verifies all OSPF instances did not cross the maximum LSA threshold." + }, { "name": "dc1-spine1", "test": "VerifyOSPFNeighborCount", @@ -447,6 +595,46 @@ ], "description": "Verifies all OSPF neighbors are in FULL state." }, + { + "name": "dc1-spine1", + "test": "VerifyPtpGMStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is locked to a valid PTP Grandmaster." + }, + { + "name": "dc1-spine1", + "test": "VerifyPtpLockStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device was locked to the upstream PTP GM in the last minute." + }, + { + "name": "dc1-spine1", + "test": "VerifyPtpModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is configured as a PTP Boundary Clock." + }, + { + "name": "dc1-spine1", + "test": "VerifyPtpOffset", + "categories": [ + "ptp" + ], + "description": "Verifies that the PTP timing offset is within +/- 1000ns from the master clock." + }, + { + "name": "dc1-spine1", + "test": "VerifyPtpPortModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies the PTP interfaces state." + }, { "name": "dc1-spine1", "test": "VerifyRoutingProtocolModel", @@ -469,7 +657,15 @@ "categories": [ "routing" ], - "description": "Verifies the size of the IP routing table (default VRF). Should be between the two provided thresholds." + "description": "Verifies the size of the IP routing table of the default VRF." + }, + { + "name": "dc1-spine1", + "test": "VerifyAPIHttpsSSL", + "categories": [ + "security" + ], + "description": "Verifies if the eAPI has a valid SSL profile." }, { "name": "dc1-spine1", @@ -480,6 +676,142 @@ "description": "Verifies if the eAPI has a valid SSL profile.", "custom_field": "eAPI HTTPS SSL Profile: eAPI_SSL_Profile" }, + { + "name": "dc1-spine1", + "test": "VerifyAPIHttpStatus", + "categories": [ + "security" + ], + "description": "Verifies if eAPI HTTP server is disabled globally." + }, + { + "name": "dc1-spine1", + "test": "VerifyAPIIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF." + }, + { + "name": "dc1-spine1", + "test": "VerifyAPIIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF." + }, + { + "name": "dc1-spine1", + "test": "VerifyAPISSLCertificate", + "categories": [ + "security" + ], + "description": "Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size." + }, + { + "name": "dc1-spine1", + "test": "VerifyBannerLogin", + "categories": [ + "security" + ], + "description": "Verifies the login banner of a device." + }, + { + "name": "dc1-spine1", + "test": "VerifyBannerMotd", + "categories": [ + "security" + ], + "description": "Verifies the motd banner of a device." + }, + { + "name": "dc1-spine1", + "test": "VerifyIPSecConnHealth", + "categories": [ + "security" + ], + "description": "Verifies all IPv4 security connections." + }, + { + "name": "dc1-spine1", + "test": "VerifyIPv4ACL", + "categories": [ + "security" + ], + "description": "Verifies the configuration of IPv4 ACLs." + }, + { + "name": "dc1-spine1", + "test": "VerifySpecificIPSecConn", + "categories": [ + "security" + ], + "description": "Verifies IPv4 security connections for a peer." + }, + { + "name": "dc1-spine1", + "test": "VerifySSHIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv4 ACL(s) configured." + }, + { + "name": "dc1-spine1", + "test": "VerifySSHIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv6 ACL(s) configured." + }, + { + "name": "dc1-spine1", + "test": "VerifySSHStatus", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent is disabled in the default VRF." + }, + { + "name": "dc1-spine1", + "test": "VerifyTelnetStatus", + "categories": [ + "security" + ], + "description": "Verifies if Telnet is disabled in the default VRF." + }, + { + "name": "dc1-spine1", + "test": "VerifyDNSLookup", + "categories": [ + "services" + ], + "description": "Verifies the DNS name to IP address resolution." + }, + { + "name": "dc1-spine1", + "test": "VerifyDNSServers", + "categories": [ + "services" + ], + "description": "Verifies if the DNS servers are correctly configured." + }, + { + "name": "dc1-spine1", + "test": "VerifyErrdisableRecovery", + "categories": [ + "services" + ], + "description": "Verifies the errdisable recovery reason, status, and interval." + }, + { + "name": "dc1-spine1", + "test": "VerifyHostname", + "categories": [ + "services" + ], + "description": "Verifies the hostname of a device." + }, { "name": "dc1-spine1", "test": "VerifySnmpIPv4Acl", @@ -510,7 +842,7 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed EOS version." + "description": "Verifies the EOS version of the device." }, { "name": "dc1-spine1", @@ -518,7 +850,15 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed TerminAttr version." + "description": "Verifies the TerminAttr version of the device." + }, + { + "name": "dc1-spine1", + "test": "VerifyStunClient", + "categories": [ + "stun" + ], + "description": "Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided." }, { "name": "dc1-spine1", @@ -591,5 +931,13 @@ "system" ], "description": "Verifies the device uptime." + }, + { + "name": "dc1-spine1", + "test": "VerifyVlanInternalPolicy", + "categories": [ + "vlan" + ], + "description": "Verifies the VLAN internal allocation policy and the range of VLANs." } ] \ No newline at end of file diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-spine2-results.json b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-spine2-results.json index 5f92828a037..d5a5fa3b62b 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-spine2-results.json +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-spine2-results.json @@ -79,6 +79,30 @@ ], "description": "Verifies the IPv4 BFD peer's sessions and remote disc in the specified VRF." }, + { + "name": "dc1-spine2", + "test": "VerifyBGPAdvCommunities", + "categories": [ + "bgp" + ], + "description": "Verifies the advertised communities of a BGP peer." + }, + { + "name": "dc1-spine2", + "test": "VerifyBGPExchangedRoutes", + "categories": [ + "bgp" + ], + "description": "Verifies the advertised and received routes of BGP peers." + }, + { + "name": "dc1-spine2", + "test": "VerifyBGPPeerASNCap", + "categories": [ + "bgp" + ], + "description": "Verifies the four octet asn capabilities of a BGP peer." + }, { "name": "dc1-spine2", "test": "VerifyBGPPeerCount", @@ -87,6 +111,30 @@ ], "description": "Verifies the count of BGP peers." }, + { + "name": "dc1-spine2", + "test": "VerifyBGPPeerMD5Auth", + "categories": [ + "bgp" + ], + "description": "Verifies the MD5 authentication and state of a BGP peer." + }, + { + "name": "dc1-spine2", + "test": "VerifyBGPPeerMPCaps", + "categories": [ + "bgp" + ], + "description": "Verifies the multiprotocol capabilities of a BGP peer." + }, + { + "name": "dc1-spine2", + "test": "VerifyBGPPeerRouteRefreshCap", + "categories": [ + "bgp" + ], + "description": "Verifies the route refresh capabilities of a BGP peer." + }, { "name": "dc1-spine2", "test": "VerifyBGPPeersHealth", @@ -103,6 +151,22 @@ ], "description": "Verifies the health of specific BGP peer(s)." }, + { + "name": "dc1-spine2", + "test": "VerifyBGPTimers", + "categories": [ + "bgp" + ], + "description": "Verifies the timers of a BGP peer." + }, + { + "name": "dc1-spine2", + "test": "VerifyEVPNType2Route", + "categories": [ + "bgp" + ], + "description": "Verifies the EVPN Type-2 routes for a given IPv4 or MAC address and VNI." + }, { "name": "dc1-spine2", "test": "VerifyRunningConfigDiffs", @@ -146,6 +210,24 @@ "description": "Verifies that the provided LLDP neighbors are connected properly.", "custom_field": "Local: Ethernet3 - Remote: dc1-leaf2a Ethernet2" }, + { + "name": "dc1-spine2", + "test": "VerifyLLDPNeighbors", + "categories": [ + "connectivity" + ], + "description": "Verifies that the provided LLDP neighbors are connected properly.", + "custom_field": "Local: Ethernet5 - Remote: dc1-svc-leaf1a Ethernet2" + }, + { + "name": "dc1-spine2", + "test": "VerifyLLDPNeighbors", + "categories": [ + "connectivity" + ], + "description": "Verifies that the provided LLDP neighbors are connected properly.", + "custom_field": "Local: Ethernet6 - Remote: dc1-svc-leaf1b Ethernet2" + }, { "name": "dc1-spine2", "test": "VerifyReachability", @@ -173,23 +255,55 @@ "description": "Test the network reachability to one or many destination IP(s).", "custom_field": "Source: P2P Interface Ethernet3 (IP: 10.255.255.10) - Destination: dc1-leaf2a Ethernet2 (IP: 10.255.255.11)" }, + { + "name": "dc1-spine2", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: P2P Interface Ethernet5 (IP: 10.33.255.18) - Destination: dc1-svc-leaf1a Ethernet2 (IP: 10.33.255.19)" + }, + { + "name": "dc1-spine2", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: P2P Interface Ethernet6 (IP: 10.33.255.22) - Destination: dc1-svc-leaf1b Ethernet2 (IP: 10.33.255.23)" + }, { "name": "dc1-spine2", "test": "VerifyFieldNotice44Resolution", "categories": [ - "field notices", - "software" + "field notices" ], - "description": "Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization)" + "description": "Verifies that the device is using the correct Aboot version per FN0044." }, { "name": "dc1-spine2", "test": "VerifyFieldNotice72Resolution", "categories": [ - "field notices", - "software" + "field notices" ], - "description": "Verifies if the device has exposeure to FN72, and if the issue has been mitigated" + "description": "Verifies if the device is exposed to FN0072, and if the issue has been mitigated." + }, + { + "name": "dc1-spine2", + "test": "VerifyGreenT", + "categories": [ + "greent" + ], + "description": "Verifies if a GreenT policy is created." + }, + { + "name": "dc1-spine2", + "test": "VerifyGreenTCounters", + "categories": [ + "greent" + ], + "description": "Verifies if the GreenT counters are incremented." }, { "name": "dc1-spine2", @@ -197,7 +311,7 @@ "categories": [ "hardware" ], - "description": "Verifies there are no adverse drops on DCS7280E and DCS7500E" + "description": "Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches." }, { "name": "dc1-spine2", @@ -358,6 +472,24 @@ "description": "Verifies the status of the provided interfaces.", "custom_field": "Interface Ethernet4 - P2P_LINK_TO_DC1-LEAF2B_Ethernet2 = 'adminDown'" }, + { + "name": "dc1-spine2", + "test": "VerifyInterfacesStatus", + "categories": [ + "interfaces" + ], + "description": "Verifies the status of the provided interfaces.", + "custom_field": "Interface Ethernet5 - P2P_LINK_TO_DC1-SVC-LEAF1A_Ethernet2 = 'up'" + }, + { + "name": "dc1-spine2", + "test": "VerifyInterfacesStatus", + "categories": [ + "interfaces" + ], + "description": "Verifies the status of the provided interfaces.", + "custom_field": "Interface Ethernet6 - P2P_LINK_TO_DC1-SVC-LEAF1B_Ethernet2 = 'up'" + }, { "name": "dc1-spine2", "test": "VerifyInterfacesStatus", @@ -373,7 +505,7 @@ "categories": [ "interfaces" ], - "description": "Verifies that all interfaces have a usage below 75%." + "description": "Verifies that the utilization of interfaces is below a certain threshold." }, { "name": "dc1-spine2", @@ -431,6 +563,22 @@ ], "description": "Verifies the status of all SVIs." }, + { + "name": "dc1-spine2", + "test": "VerifyLANZ", + "categories": [ + "lanz" + ], + "description": "Verifies if LANZ is enabled." + }, + { + "name": "dc1-spine2", + "test": "VerifyOSPFMaxLSA", + "categories": [ + "ospf" + ], + "description": "Verifies all OSPF instances did not cross the maximum LSA threshold." + }, { "name": "dc1-spine2", "test": "VerifyOSPFNeighborCount", @@ -447,6 +595,46 @@ ], "description": "Verifies all OSPF neighbors are in FULL state." }, + { + "name": "dc1-spine2", + "test": "VerifyPtpGMStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is locked to a valid PTP Grandmaster." + }, + { + "name": "dc1-spine2", + "test": "VerifyPtpLockStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device was locked to the upstream PTP GM in the last minute." + }, + { + "name": "dc1-spine2", + "test": "VerifyPtpModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is configured as a PTP Boundary Clock." + }, + { + "name": "dc1-spine2", + "test": "VerifyPtpOffset", + "categories": [ + "ptp" + ], + "description": "Verifies that the PTP timing offset is within +/- 1000ns from the master clock." + }, + { + "name": "dc1-spine2", + "test": "VerifyPtpPortModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies the PTP interfaces state." + }, { "name": "dc1-spine2", "test": "VerifyRoutingProtocolModel", @@ -469,7 +657,15 @@ "categories": [ "routing" ], - "description": "Verifies the size of the IP routing table (default VRF). Should be between the two provided thresholds." + "description": "Verifies the size of the IP routing table of the default VRF." + }, + { + "name": "dc1-spine2", + "test": "VerifyAPIHttpsSSL", + "categories": [ + "security" + ], + "description": "Verifies if the eAPI has a valid SSL profile." }, { "name": "dc1-spine2", @@ -480,6 +676,142 @@ "description": "Verifies if the eAPI has a valid SSL profile.", "custom_field": "eAPI HTTPS SSL Profile: eAPI_SSL_Profile" }, + { + "name": "dc1-spine2", + "test": "VerifyAPIHttpStatus", + "categories": [ + "security" + ], + "description": "Verifies if eAPI HTTP server is disabled globally." + }, + { + "name": "dc1-spine2", + "test": "VerifyAPIIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF." + }, + { + "name": "dc1-spine2", + "test": "VerifyAPIIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF." + }, + { + "name": "dc1-spine2", + "test": "VerifyAPISSLCertificate", + "categories": [ + "security" + ], + "description": "Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size." + }, + { + "name": "dc1-spine2", + "test": "VerifyBannerLogin", + "categories": [ + "security" + ], + "description": "Verifies the login banner of a device." + }, + { + "name": "dc1-spine2", + "test": "VerifyBannerMotd", + "categories": [ + "security" + ], + "description": "Verifies the motd banner of a device." + }, + { + "name": "dc1-spine2", + "test": "VerifyIPSecConnHealth", + "categories": [ + "security" + ], + "description": "Verifies all IPv4 security connections." + }, + { + "name": "dc1-spine2", + "test": "VerifyIPv4ACL", + "categories": [ + "security" + ], + "description": "Verifies the configuration of IPv4 ACLs." + }, + { + "name": "dc1-spine2", + "test": "VerifySpecificIPSecConn", + "categories": [ + "security" + ], + "description": "Verifies IPv4 security connections for a peer." + }, + { + "name": "dc1-spine2", + "test": "VerifySSHIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv4 ACL(s) configured." + }, + { + "name": "dc1-spine2", + "test": "VerifySSHIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv6 ACL(s) configured." + }, + { + "name": "dc1-spine2", + "test": "VerifySSHStatus", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent is disabled in the default VRF." + }, + { + "name": "dc1-spine2", + "test": "VerifyTelnetStatus", + "categories": [ + "security" + ], + "description": "Verifies if Telnet is disabled in the default VRF." + }, + { + "name": "dc1-spine2", + "test": "VerifyDNSLookup", + "categories": [ + "services" + ], + "description": "Verifies the DNS name to IP address resolution." + }, + { + "name": "dc1-spine2", + "test": "VerifyDNSServers", + "categories": [ + "services" + ], + "description": "Verifies if the DNS servers are correctly configured." + }, + { + "name": "dc1-spine2", + "test": "VerifyErrdisableRecovery", + "categories": [ + "services" + ], + "description": "Verifies the errdisable recovery reason, status, and interval." + }, + { + "name": "dc1-spine2", + "test": "VerifyHostname", + "categories": [ + "services" + ], + "description": "Verifies the hostname of a device." + }, { "name": "dc1-spine2", "test": "VerifySnmpIPv4Acl", @@ -510,7 +842,7 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed EOS version." + "description": "Verifies the EOS version of the device." }, { "name": "dc1-spine2", @@ -518,7 +850,15 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed TerminAttr version." + "description": "Verifies the TerminAttr version of the device." + }, + { + "name": "dc1-spine2", + "test": "VerifyStunClient", + "categories": [ + "stun" + ], + "description": "Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided." }, { "name": "dc1-spine2", @@ -591,5 +931,13 @@ "system" ], "description": "Verifies the device uptime." + }, + { + "name": "dc1-spine2", + "test": "VerifyVlanInternalPolicy", + "categories": [ + "vlan" + ], + "description": "Verifies the VLAN internal allocation policy and the range of VLANs." } ] \ No newline at end of file diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-svc-leaf1a-results.json b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-svc-leaf1a-results.json new file mode 100644 index 00000000000..65637a17db3 --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-svc-leaf1a-results.json @@ -0,0 +1,1092 @@ +[ + { + "name": "dc1-svc-leaf1a", + "test": "VerifyAcctConsoleMethods", + "categories": [ + "aaa" + ], + "description": "Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x)." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyAcctDefaultMethods", + "categories": [ + "aaa" + ], + "description": "Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x)." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyAuthenMethods", + "categories": [ + "aaa" + ], + "description": "Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x)." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyAuthzMethods", + "categories": [ + "aaa" + ], + "description": "Verifies the AAA authorization method lists for different authorization types (commands, exec)." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyTacacsServerGroups", + "categories": [ + "aaa" + ], + "description": "Verifies if the provided TACACS server group(s) are configured." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyTacacsServers", + "categories": [ + "aaa" + ], + "description": "Verifies TACACS servers are configured for a specified VRF." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyTacacsSourceIntf", + "categories": [ + "aaa" + ], + "description": "Verifies TACACS source-interface for a specified VRF." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyBGPSpecificPeers", + "categories": [ + "bgp" + ], + "description": "Verifies the health of specific BGP peer(s).", + "custom_field": "BGP EVPN Peer: dc1-spine1 (IP: 10.255.0.1)" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyBGPSpecificPeers", + "categories": [ + "bgp" + ], + "description": "Verifies the health of specific BGP peer(s).", + "custom_field": "BGP EVPN Peer: dc1-spine2 (IP: 10.255.0.2)" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyBGPSpecificPeers", + "categories": [ + "bgp" + ], + "description": "Verifies the health of specific BGP peer(s).", + "custom_field": "BGP IPv4 Unicast Peer: dc1-spine1 (IP: 10.33.255.16)" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyBGPSpecificPeers", + "categories": [ + "bgp" + ], + "description": "Verifies the health of specific BGP peer(s).", + "custom_field": "BGP IPv4 Unicast Peer: dc1-spine2 (IP: 10.33.255.18)" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyBGPSpecificPeers", + "categories": [ + "bgp" + ], + "description": "Verifies the health of specific BGP peer(s).", + "custom_field": "BGP IPv4 Unicast Peer: dc1-svc-leaf1b (IP: 10.33.1.105)" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyRunningConfigDiffs", + "categories": [ + "configuration" + ], + "description": "Verifies there is no difference between the running-config and the startup-config" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyZeroTouch", + "categories": [ + "configuration" + ], + "description": "Verifies ZeroTouch is disabled" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyLLDPNeighbors", + "categories": [ + "connectivity" + ], + "description": "Verifies that the provided LLDP neighbors are connected properly.", + "custom_field": "Local: Ethernet1 - Remote: dc1-spine1 Ethernet5" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyLLDPNeighbors", + "categories": [ + "connectivity" + ], + "description": "Verifies that the provided LLDP neighbors are connected properly.", + "custom_field": "Local: Ethernet2 - Remote: dc1-spine2 Ethernet5" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyLLDPNeighbors", + "categories": [ + "connectivity" + ], + "description": "Verifies that the provided LLDP neighbors are connected properly.", + "custom_field": "Local: Ethernet3 - Remote: dc1-svc-leaf1b Ethernet3" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyLLDPNeighbors", + "categories": [ + "connectivity" + ], + "description": "Verifies that the provided LLDP neighbors are connected properly.", + "custom_field": "Local: Ethernet4 - Remote: dc1-svc-leaf1b Ethernet4" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.33.0.5) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3)" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.33.0.5) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4)" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.33.0.5) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5)" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.33.0.5) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1)" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.33.0.5) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2)" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.33.0.5) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5)" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.33.0.5) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6)" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.33.0.5) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1)" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.33.0.5) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2)" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.33.0.5) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13)" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.33.0.5) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14)" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.33.0.5) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15)" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.33.0.5) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16)" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.33.0.5) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17)" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.33.0.5) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18)" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.33.0.5) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11)" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.33.0.5) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12)" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: P2P Interface Ethernet1 (IP: 10.33.255.17) - Destination: dc1-spine1 Ethernet5 (IP: 10.33.255.16)" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: P2P Interface Ethernet2 (IP: 10.33.255.19) - Destination: dc1-spine2 Ethernet5 (IP: 10.33.255.18)" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyFieldNotice44Resolution", + "categories": [ + "field notices" + ], + "description": "Verifies that the device is using the correct Aboot version per FN0044." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyFieldNotice72Resolution", + "categories": [ + "field notices" + ], + "description": "Verifies if the device is exposed to FN0072, and if the issue has been mitigated." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyGreenT", + "categories": [ + "greent" + ], + "description": "Verifies if a GreenT policy is created." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyGreenTCounters", + "categories": [ + "greent" + ], + "description": "Verifies if the GreenT counters are incremented." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyAdverseDrops", + "categories": [ + "hardware" + ], + "description": "Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyEnvironmentCooling", + "categories": [ + "hardware" + ], + "description": "Verifies the status of power supply fans and all fan trays." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyEnvironmentCooling", + "categories": [ + "hardware" + ], + "description": "Verifies the status of power supply fans and all fan trays.", + "custom_field": "Accepted States: 'ok'" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyEnvironmentPower", + "categories": [ + "hardware" + ], + "description": "Verifies the power supplies status." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyEnvironmentPower", + "categories": [ + "hardware" + ], + "description": "Verifies the power supplies status.", + "custom_field": "Accepted States: 'ok'" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyEnvironmentSystemCooling", + "categories": [ + "hardware" + ], + "description": "Verifies the system cooling status." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyTemperature", + "categories": [ + "hardware" + ], + "description": "Verifies the device temperature." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyTemperature", + "categories": [ + "hardware" + ], + "description": "Verifies the device temperature." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyTransceiversManufacturers", + "categories": [ + "hardware" + ], + "description": "Verifies if all transceivers come from approved manufacturers." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyTransceiversManufacturers", + "categories": [ + "hardware" + ], + "description": "Verifies if all transceivers come from approved manufacturers.", + "custom_field": "Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyTransceiversTemperature", + "categories": [ + "hardware" + ], + "description": "Verifies the transceivers temperature." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyInterfacesStatus", + "categories": [ + "interfaces" + ], + "description": "Verifies the status of the provided interfaces.", + "custom_field": "Interface Ethernet1 - P2P_LINK_TO_DC1-SPINE1_Ethernet5 = 'up'" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyInterfacesStatus", + "categories": [ + "interfaces" + ], + "description": "Verifies the status of the provided interfaces.", + "custom_field": "Interface Ethernet2 - P2P_LINK_TO_DC1-SPINE2_Ethernet5 = 'up'" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyInterfacesStatus", + "categories": [ + "interfaces" + ], + "description": "Verifies the status of the provided interfaces.", + "custom_field": "Interface Ethernet3 - MLAG_PEER_dc1-svc-leaf1b_Ethernet3 = 'up'" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyInterfacesStatus", + "categories": [ + "interfaces" + ], + "description": "Verifies the status of the provided interfaces.", + "custom_field": "Interface Ethernet4 - MLAG_PEER_dc1-svc-leaf1b_Ethernet4 = 'up'" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyInterfacesStatus", + "categories": [ + "interfaces" + ], + "description": "Verifies the status of the provided interfaces.", + "custom_field": "Interface Loopback0 - EVPN_Overlay_Peering = 'up'" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyInterfacesStatus", + "categories": [ + "interfaces" + ], + "description": "Verifies the status of the provided interfaces.", + "custom_field": "Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up'" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyInterfacesStatus", + "categories": [ + "interfaces" + ], + "description": "Verifies the status of the provided interfaces.", + "custom_field": "Interface Port-Channel3 - MLAG_PEER_dc1-svc-leaf1b_Po3 = 'up'" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyInterfacesStatus", + "categories": [ + "interfaces" + ], + "description": "Verifies the status of the provided interfaces.", + "custom_field": "Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up'" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyInterfacesStatus", + "categories": [ + "interfaces" + ], + "description": "Verifies the status of the provided interfaces.", + "custom_field": "Interface Vlan4094 - MLAG_PEER = 'up'" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyInterfacesStatus", + "categories": [ + "interfaces" + ], + "description": "Verifies the status of the provided interfaces.", + "custom_field": "Interface Vxlan1 = 'up'" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyLANZ", + "categories": [ + "lanz" + ], + "description": "Verifies if LANZ is enabled." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyMlagStatus", + "categories": [ + "mlag" + ], + "description": "Verifies the health status of the MLAG configuration." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyPtpGMStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is locked to a valid PTP Grandmaster." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyPtpLockStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device was locked to the upstream PTP GM in the last minute." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyPtpModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is configured as a PTP Boundary Clock." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyPtpOffset", + "categories": [ + "ptp" + ], + "description": "Verifies that the PTP timing offset is within +/- 1000ns from the master clock." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyPtpPortModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies the PTP interfaces state." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyRoutingProtocolModel", + "categories": [ + "routing" + ], + "description": "Verifies the configured routing protocol model.", + "custom_field": "Routing protocol model: multi-agent" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.0.1 - Peer: dc1-spine1" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.0.2 - Peer: dc1-spine2" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.0.3 - Peer: dc1-leaf1a" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.0.4 - Peer: dc1-leaf1b" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.0.5 - Peer: dc1-leaf2a" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.1.3 - Peer: dc1-leaf1a" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.1.5 - Peer: dc1-leaf2a" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.128.11 - Peer: dc2-spine1" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.128.12 - Peer: dc2-spine2" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.128.13 - Peer: dc2-leaf1a" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.128.14 - Peer: dc2-leaf1b" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.128.15 - Peer: dc2-leaf2a" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.128.16 - Peer: dc2-leaf2b" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.129.13 - Peer: dc2-leaf1a" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.129.15 - Peer: dc2-leaf2a" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.2.1 - Peer: dc1-wan1" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.2.2 - Peer: dc1-wan2" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.33.0.5 - Peer: dc1-svc-leaf1a" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.33.0.6 - Peer: dc1-svc-leaf1b" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.33.1.5 - Peer: dc1-svc-leaf1a" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyAPIHttpsSSL", + "categories": [ + "security" + ], + "description": "Verifies if the eAPI has a valid SSL profile." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyAPIHttpsSSL", + "categories": [ + "security" + ], + "description": "Verifies if the eAPI has a valid SSL profile.", + "custom_field": "eAPI HTTPS SSL Profile: eAPI_SSL_Profile" + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyAPIHttpStatus", + "categories": [ + "security" + ], + "description": "Verifies if eAPI HTTP server is disabled globally." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyAPIIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyAPIIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyAPISSLCertificate", + "categories": [ + "security" + ], + "description": "Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyBannerLogin", + "categories": [ + "security" + ], + "description": "Verifies the login banner of a device." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyBannerMotd", + "categories": [ + "security" + ], + "description": "Verifies the motd banner of a device." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyIPSecConnHealth", + "categories": [ + "security" + ], + "description": "Verifies all IPv4 security connections." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyIPv4ACL", + "categories": [ + "security" + ], + "description": "Verifies the configuration of IPv4 ACLs." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifySpecificIPSecConn", + "categories": [ + "security" + ], + "description": "Verifies IPv4 security connections for a peer." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifySSHIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv4 ACL(s) configured." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifySSHIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv6 ACL(s) configured." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifySSHStatus", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent is disabled in the default VRF." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyTelnetStatus", + "categories": [ + "security" + ], + "description": "Verifies if Telnet is disabled in the default VRF." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyDNSLookup", + "categories": [ + "services" + ], + "description": "Verifies the DNS name to IP address resolution." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyDNSServers", + "categories": [ + "services" + ], + "description": "Verifies if the DNS servers are correctly configured." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyErrdisableRecovery", + "categories": [ + "services" + ], + "description": "Verifies the errdisable recovery reason, status, and interval." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyHostname", + "categories": [ + "services" + ], + "description": "Verifies the hostname of a device." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifySnmpIPv4Acl", + "categories": [ + "snmp" + ], + "description": "Verifies if the SNMP agent has IPv4 ACL(s) configured." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifySnmpIPv6Acl", + "categories": [ + "snmp" + ], + "description": "Verifies if the SNMP agent has IPv6 ACL(s) configured." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifySnmpStatus", + "categories": [ + "snmp" + ], + "description": "Verifies if the SNMP agent is enabled." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyEOSVersion", + "categories": [ + "software" + ], + "description": "Verifies the EOS version of the device." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyTerminAttrVersion", + "categories": [ + "software" + ], + "description": "Verifies the TerminAttr version of the device." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyStunClient", + "categories": [ + "stun" + ], + "description": "Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyAgentLogs", + "categories": [ + "system" + ], + "description": "Verifies there are no agent crash reports." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyCoredump", + "categories": [ + "system" + ], + "description": "Verifies there are no core dump files." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyCPUUtilization", + "categories": [ + "system" + ], + "description": "Verifies whether the CPU utilization is below 75%." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyFileSystemUtilization", + "categories": [ + "system" + ], + "description": "Verifies that no partition is utilizing more than 75% of its disk space." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyMemoryUtilization", + "categories": [ + "system" + ], + "description": "Verifies whether the memory utilization is below 75%." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyNTP", + "categories": [ + "system" + ], + "description": "Verifies if NTP is synchronised." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyNTP", + "categories": [ + "system" + ], + "description": "Verifies if NTP is synchronised." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyReloadCause", + "categories": [ + "system" + ], + "description": "Verifies the last reload cause of the device." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyUptime", + "categories": [ + "system" + ], + "description": "Verifies the device uptime." + }, + { + "name": "dc1-svc-leaf1a", + "test": "VerifyVlanInternalPolicy", + "categories": [ + "vlan" + ], + "description": "Verifies the VLAN internal allocation policy and the range of VLANs." + } +] \ No newline at end of file diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-svc-leaf1b-results.json b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-svc-leaf1b-results.json new file mode 100644 index 00000000000..96909d2092f --- /dev/null +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-svc-leaf1b-results.json @@ -0,0 +1,1092 @@ +[ + { + "name": "dc1-svc-leaf1b", + "test": "VerifyAcctConsoleMethods", + "categories": [ + "aaa" + ], + "description": "Verifies the AAA accounting console method lists for different accounting types (system, exec, commands, dot1x)." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyAcctDefaultMethods", + "categories": [ + "aaa" + ], + "description": "Verifies the AAA accounting default method lists for different accounting types (system, exec, commands, dot1x)." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyAuthenMethods", + "categories": [ + "aaa" + ], + "description": "Verifies the AAA authentication method lists for different authentication types (login, enable, dot1x)." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyAuthzMethods", + "categories": [ + "aaa" + ], + "description": "Verifies the AAA authorization method lists for different authorization types (commands, exec)." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyTacacsServerGroups", + "categories": [ + "aaa" + ], + "description": "Verifies if the provided TACACS server group(s) are configured." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyTacacsServers", + "categories": [ + "aaa" + ], + "description": "Verifies TACACS servers are configured for a specified VRF." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyTacacsSourceIntf", + "categories": [ + "aaa" + ], + "description": "Verifies TACACS source-interface for a specified VRF." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyBGPSpecificPeers", + "categories": [ + "bgp" + ], + "description": "Verifies the health of specific BGP peer(s).", + "custom_field": "BGP EVPN Peer: dc1-spine1 (IP: 10.255.0.1)" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyBGPSpecificPeers", + "categories": [ + "bgp" + ], + "description": "Verifies the health of specific BGP peer(s).", + "custom_field": "BGP EVPN Peer: dc1-spine2 (IP: 10.255.0.2)" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyBGPSpecificPeers", + "categories": [ + "bgp" + ], + "description": "Verifies the health of specific BGP peer(s).", + "custom_field": "BGP IPv4 Unicast Peer: dc1-spine1 (IP: 10.33.255.20)" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyBGPSpecificPeers", + "categories": [ + "bgp" + ], + "description": "Verifies the health of specific BGP peer(s).", + "custom_field": "BGP IPv4 Unicast Peer: dc1-spine2 (IP: 10.33.255.22)" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyBGPSpecificPeers", + "categories": [ + "bgp" + ], + "description": "Verifies the health of specific BGP peer(s).", + "custom_field": "BGP IPv4 Unicast Peer: dc1-svc-leaf1a (IP: 10.33.1.104)" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyRunningConfigDiffs", + "categories": [ + "configuration" + ], + "description": "Verifies there is no difference between the running-config and the startup-config" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyZeroTouch", + "categories": [ + "configuration" + ], + "description": "Verifies ZeroTouch is disabled" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyLLDPNeighbors", + "categories": [ + "connectivity" + ], + "description": "Verifies that the provided LLDP neighbors are connected properly.", + "custom_field": "Local: Ethernet1 - Remote: dc1-spine1 Ethernet6" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyLLDPNeighbors", + "categories": [ + "connectivity" + ], + "description": "Verifies that the provided LLDP neighbors are connected properly.", + "custom_field": "Local: Ethernet2 - Remote: dc1-spine2 Ethernet6" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyLLDPNeighbors", + "categories": [ + "connectivity" + ], + "description": "Verifies that the provided LLDP neighbors are connected properly.", + "custom_field": "Local: Ethernet3 - Remote: dc1-svc-leaf1a Ethernet3" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyLLDPNeighbors", + "categories": [ + "connectivity" + ], + "description": "Verifies that the provided LLDP neighbors are connected properly.", + "custom_field": "Local: Ethernet4 - Remote: dc1-svc-leaf1a Ethernet4" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.33.0.6) - Destination: dc1-leaf1a Loopback0 (IP: 10.255.0.3)" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.33.0.6) - Destination: dc1-leaf1b Loopback0 (IP: 10.255.0.4)" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.33.0.6) - Destination: dc1-leaf2a Loopback0 (IP: 10.255.0.5)" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.33.0.6) - Destination: dc1-spine1 Loopback0 (IP: 10.255.0.1)" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.33.0.6) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2)" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.33.0.6) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5)" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.33.0.6) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6)" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.33.0.6) - Destination: dc1-wan1 Loopback0 (IP: 10.255.2.1)" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.33.0.6) - Destination: dc1-wan2 Loopback0 (IP: 10.255.2.2)" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.33.0.6) - Destination: dc2-leaf1a Loopback0 (IP: 10.255.128.13)" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.33.0.6) - Destination: dc2-leaf1b Loopback0 (IP: 10.255.128.14)" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.33.0.6) - Destination: dc2-leaf2a Loopback0 (IP: 10.255.128.15)" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.33.0.6) - Destination: dc2-leaf2b Loopback0 (IP: 10.255.128.16)" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.33.0.6) - Destination: dc2-leaf3a.arista.com Loopback0 (IP: 10.255.128.17)" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.33.0.6) - Destination: dc2-leaf3b.arista.com Loopback0 (IP: 10.255.128.18)" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.33.0.6) - Destination: dc2-spine1 Loopback0 (IP: 10.255.128.11)" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.33.0.6) - Destination: dc2-spine2 Loopback0 (IP: 10.255.128.12)" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: P2P Interface Ethernet1 (IP: 10.33.255.21) - Destination: dc1-spine1 Ethernet6 (IP: 10.33.255.20)" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: P2P Interface Ethernet2 (IP: 10.33.255.23) - Destination: dc1-spine2 Ethernet6 (IP: 10.33.255.22)" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyFieldNotice44Resolution", + "categories": [ + "field notices" + ], + "description": "Verifies that the device is using the correct Aboot version per FN0044." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyFieldNotice72Resolution", + "categories": [ + "field notices" + ], + "description": "Verifies if the device is exposed to FN0072, and if the issue has been mitigated." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyGreenT", + "categories": [ + "greent" + ], + "description": "Verifies if a GreenT policy is created." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyGreenTCounters", + "categories": [ + "greent" + ], + "description": "Verifies if the GreenT counters are incremented." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyAdverseDrops", + "categories": [ + "hardware" + ], + "description": "Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyEnvironmentCooling", + "categories": [ + "hardware" + ], + "description": "Verifies the status of power supply fans and all fan trays." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyEnvironmentCooling", + "categories": [ + "hardware" + ], + "description": "Verifies the status of power supply fans and all fan trays.", + "custom_field": "Accepted States: 'ok'" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyEnvironmentPower", + "categories": [ + "hardware" + ], + "description": "Verifies the power supplies status." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyEnvironmentPower", + "categories": [ + "hardware" + ], + "description": "Verifies the power supplies status.", + "custom_field": "Accepted States: 'ok'" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyEnvironmentSystemCooling", + "categories": [ + "hardware" + ], + "description": "Verifies the system cooling status." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyTemperature", + "categories": [ + "hardware" + ], + "description": "Verifies the device temperature." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyTemperature", + "categories": [ + "hardware" + ], + "description": "Verifies the device temperature." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyTransceiversManufacturers", + "categories": [ + "hardware" + ], + "description": "Verifies if all transceivers come from approved manufacturers." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyTransceiversManufacturers", + "categories": [ + "hardware" + ], + "description": "Verifies if all transceivers come from approved manufacturers.", + "custom_field": "Accepted Manufacturers: 'Arista Networks', 'Arastra, Inc.', 'Not Present'" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyTransceiversTemperature", + "categories": [ + "hardware" + ], + "description": "Verifies the transceivers temperature." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyInterfacesStatus", + "categories": [ + "interfaces" + ], + "description": "Verifies the status of the provided interfaces.", + "custom_field": "Interface Ethernet1 - P2P_LINK_TO_DC1-SPINE1_Ethernet6 = 'up'" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyInterfacesStatus", + "categories": [ + "interfaces" + ], + "description": "Verifies the status of the provided interfaces.", + "custom_field": "Interface Ethernet2 - P2P_LINK_TO_DC1-SPINE2_Ethernet6 = 'up'" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyInterfacesStatus", + "categories": [ + "interfaces" + ], + "description": "Verifies the status of the provided interfaces.", + "custom_field": "Interface Ethernet3 - MLAG_PEER_dc1-svc-leaf1a_Ethernet3 = 'up'" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyInterfacesStatus", + "categories": [ + "interfaces" + ], + "description": "Verifies the status of the provided interfaces.", + "custom_field": "Interface Ethernet4 - MLAG_PEER_dc1-svc-leaf1a_Ethernet4 = 'up'" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyInterfacesStatus", + "categories": [ + "interfaces" + ], + "description": "Verifies the status of the provided interfaces.", + "custom_field": "Interface Loopback0 - EVPN_Overlay_Peering = 'up'" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyInterfacesStatus", + "categories": [ + "interfaces" + ], + "description": "Verifies the status of the provided interfaces.", + "custom_field": "Interface Loopback1 - VTEP_VXLAN_Tunnel_Source = 'up'" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyInterfacesStatus", + "categories": [ + "interfaces" + ], + "description": "Verifies the status of the provided interfaces.", + "custom_field": "Interface Port-Channel3 - MLAG_PEER_dc1-svc-leaf1a_Po3 = 'up'" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyInterfacesStatus", + "categories": [ + "interfaces" + ], + "description": "Verifies the status of the provided interfaces.", + "custom_field": "Interface Vlan4093 - MLAG_PEER_L3_PEERING = 'up'" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyInterfacesStatus", + "categories": [ + "interfaces" + ], + "description": "Verifies the status of the provided interfaces.", + "custom_field": "Interface Vlan4094 - MLAG_PEER = 'up'" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyInterfacesStatus", + "categories": [ + "interfaces" + ], + "description": "Verifies the status of the provided interfaces.", + "custom_field": "Interface Vxlan1 = 'up'" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyLANZ", + "categories": [ + "lanz" + ], + "description": "Verifies if LANZ is enabled." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyMlagStatus", + "categories": [ + "mlag" + ], + "description": "Verifies the health status of the MLAG configuration." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyPtpGMStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is locked to a valid PTP Grandmaster." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyPtpLockStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device was locked to the upstream PTP GM in the last minute." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyPtpModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is configured as a PTP Boundary Clock." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyPtpOffset", + "categories": [ + "ptp" + ], + "description": "Verifies that the PTP timing offset is within +/- 1000ns from the master clock." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyPtpPortModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies the PTP interfaces state." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyRoutingProtocolModel", + "categories": [ + "routing" + ], + "description": "Verifies the configured routing protocol model.", + "custom_field": "Routing protocol model: multi-agent" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.0.1 - Peer: dc1-spine1" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.0.2 - Peer: dc1-spine2" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.0.3 - Peer: dc1-leaf1a" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.0.4 - Peer: dc1-leaf1b" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.0.5 - Peer: dc1-leaf2a" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.1.3 - Peer: dc1-leaf1a" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.1.5 - Peer: dc1-leaf2a" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.128.11 - Peer: dc2-spine1" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.128.12 - Peer: dc2-spine2" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.128.13 - Peer: dc2-leaf1a" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.128.14 - Peer: dc2-leaf1b" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.128.15 - Peer: dc2-leaf2a" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.128.16 - Peer: dc2-leaf2b" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.128.17 - Peer: dc2-leaf3a.arista.com" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.128.18 - Peer: dc2-leaf3b.arista.com" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.129.13 - Peer: dc2-leaf1a" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.129.15 - Peer: dc2-leaf2a" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.129.17 - Peer: dc2-leaf3a.arista.com" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.2.1 - Peer: dc1-wan1" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.255.2.2 - Peer: dc1-wan2" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.33.0.5 - Peer: dc1-svc-leaf1a" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.33.0.6 - Peer: dc1-svc-leaf1b" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.33.1.5 - Peer: dc1-svc-leaf1a" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyAPIHttpsSSL", + "categories": [ + "security" + ], + "description": "Verifies if the eAPI has a valid SSL profile." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyAPIHttpsSSL", + "categories": [ + "security" + ], + "description": "Verifies if the eAPI has a valid SSL profile.", + "custom_field": "eAPI HTTPS SSL Profile: eAPI_SSL_Profile" + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyAPIHttpStatus", + "categories": [ + "security" + ], + "description": "Verifies if eAPI HTTP server is disabled globally." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyAPIIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyAPIIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyAPISSLCertificate", + "categories": [ + "security" + ], + "description": "Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyBannerLogin", + "categories": [ + "security" + ], + "description": "Verifies the login banner of a device." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyBannerMotd", + "categories": [ + "security" + ], + "description": "Verifies the motd banner of a device." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyIPSecConnHealth", + "categories": [ + "security" + ], + "description": "Verifies all IPv4 security connections." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyIPv4ACL", + "categories": [ + "security" + ], + "description": "Verifies the configuration of IPv4 ACLs." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifySpecificIPSecConn", + "categories": [ + "security" + ], + "description": "Verifies IPv4 security connections for a peer." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifySSHIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv4 ACL(s) configured." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifySSHIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv6 ACL(s) configured." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifySSHStatus", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent is disabled in the default VRF." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyTelnetStatus", + "categories": [ + "security" + ], + "description": "Verifies if Telnet is disabled in the default VRF." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyDNSLookup", + "categories": [ + "services" + ], + "description": "Verifies the DNS name to IP address resolution." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyDNSServers", + "categories": [ + "services" + ], + "description": "Verifies if the DNS servers are correctly configured." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyErrdisableRecovery", + "categories": [ + "services" + ], + "description": "Verifies the errdisable recovery reason, status, and interval." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyHostname", + "categories": [ + "services" + ], + "description": "Verifies the hostname of a device." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifySnmpIPv4Acl", + "categories": [ + "snmp" + ], + "description": "Verifies if the SNMP agent has IPv4 ACL(s) configured." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifySnmpIPv6Acl", + "categories": [ + "snmp" + ], + "description": "Verifies if the SNMP agent has IPv6 ACL(s) configured." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifySnmpStatus", + "categories": [ + "snmp" + ], + "description": "Verifies if the SNMP agent is enabled." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyEOSVersion", + "categories": [ + "software" + ], + "description": "Verifies the EOS version of the device." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyTerminAttrVersion", + "categories": [ + "software" + ], + "description": "Verifies the TerminAttr version of the device." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyStunClient", + "categories": [ + "stun" + ], + "description": "Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyAgentLogs", + "categories": [ + "system" + ], + "description": "Verifies there are no agent crash reports." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyCoredump", + "categories": [ + "system" + ], + "description": "Verifies there are no core dump files." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyCPUUtilization", + "categories": [ + "system" + ], + "description": "Verifies whether the CPU utilization is below 75%." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyFileSystemUtilization", + "categories": [ + "system" + ], + "description": "Verifies that no partition is utilizing more than 75% of its disk space." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyMemoryUtilization", + "categories": [ + "system" + ], + "description": "Verifies whether the memory utilization is below 75%." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyNTP", + "categories": [ + "system" + ], + "description": "Verifies if NTP is synchronised." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyNTP", + "categories": [ + "system" + ], + "description": "Verifies if NTP is synchronised." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyReloadCause", + "categories": [ + "system" + ], + "description": "Verifies the last reload cause of the device." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyUptime", + "categories": [ + "system" + ], + "description": "Verifies the device uptime." + }, + { + "name": "dc1-svc-leaf1b", + "test": "VerifyVlanInternalPolicy", + "categories": [ + "vlan" + ], + "description": "Verifies the VLAN internal allocation policy and the range of VLANs." + } +] \ No newline at end of file diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-wan1-results.json b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-wan1-results.json index 678d7ae9745..b92992d40e5 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-wan1-results.json +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-wan1-results.json @@ -55,6 +55,51 @@ ], "description": "Verifies TACACS source-interface for a specified VRF." }, + { + "name": "dc1-wan1", + "test": "VerifyBGPSpecificPeers", + "categories": [ + "bgp" + ], + "description": "Verifies the health of specific BGP peer(s).", + "custom_field": "BGP EVPN Peer: dc1-leaf1a (IP: 10.255.255.10)" + }, + { + "name": "dc1-wan1", + "test": "VerifyBGPSpecificPeers", + "categories": [ + "bgp" + ], + "description": "Verifies the health of specific BGP peer(s).", + "custom_field": "BGP EVPN Peer: dc1-leaf1b (IP: 10.255.255.20)" + }, + { + "name": "dc1-wan1", + "test": "VerifyBGPSpecificPeers", + "categories": [ + "bgp" + ], + "description": "Verifies the health of specific BGP peer(s).", + "custom_field": "BGP EVPN Peer: dc1-wan2 (IP: 10.255.1.2)" + }, + { + "name": "dc1-wan1", + "test": "VerifyBGPSpecificPeers", + "categories": [ + "bgp" + ], + "description": "Verifies the health of specific BGP peer(s).", + "custom_field": "BGP IPv4 SR-TE Peer: dc1-leaf1a (IP: 10.255.255.10)" + }, + { + "name": "dc1-wan1", + "test": "VerifyBGPSpecificPeers", + "categories": [ + "bgp" + ], + "description": "Verifies the health of specific BGP peer(s).", + "custom_field": "BGP IPv4 SR-TE Peer: dc1-leaf1b (IP: 10.255.255.20)" + }, { "name": "dc1-wan1", "test": "VerifyBGPSpecificPeers", @@ -73,6 +118,42 @@ "description": "Verifies the health of specific BGP peer(s).", "custom_field": "BGP IPv4 Unicast Peer: dc1-leaf1b (IP: 10.255.255.2)" }, + { + "name": "dc1-wan1", + "test": "VerifyBGPSpecificPeers", + "categories": [ + "bgp" + ], + "description": "Verifies the health of specific BGP peer(s).", + "custom_field": "BGP Link-State Peer: dc1-leaf1a (IP: 10.255.255.10)" + }, + { + "name": "dc1-wan1", + "test": "VerifyBGPSpecificPeers", + "categories": [ + "bgp" + ], + "description": "Verifies the health of specific BGP peer(s).", + "custom_field": "BGP Link-State Peer: dc1-leaf1b (IP: 10.255.255.20)" + }, + { + "name": "dc1-wan1", + "test": "VerifyBGPSpecificPeers", + "categories": [ + "bgp" + ], + "description": "Verifies the health of specific BGP peer(s).", + "custom_field": "BGP Path-Selection Peer: dc1-leaf1a (IP: 10.255.255.10)" + }, + { + "name": "dc1-wan1", + "test": "VerifyBGPSpecificPeers", + "categories": [ + "bgp" + ], + "description": "Verifies the health of specific BGP peer(s).", + "custom_field": "BGP Path-Selection Peer: dc1-leaf1b (IP: 10.255.255.20)" + }, { "name": "dc1-wan1", "test": "VerifyRunningConfigDiffs", @@ -129,19 +210,33 @@ "name": "dc1-wan1", "test": "VerifyFieldNotice44Resolution", "categories": [ - "field notices", - "software" + "field notices" ], - "description": "Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization)" + "description": "Verifies that the device is using the correct Aboot version per FN0044." }, { "name": "dc1-wan1", "test": "VerifyFieldNotice72Resolution", "categories": [ - "field notices", - "software" + "field notices" + ], + "description": "Verifies if the device is exposed to FN0072, and if the issue has been mitigated." + }, + { + "name": "dc1-wan1", + "test": "VerifyGreenT", + "categories": [ + "greent" + ], + "description": "Verifies if a GreenT policy is created." + }, + { + "name": "dc1-wan1", + "test": "VerifyGreenTCounters", + "categories": [ + "greent" ], - "description": "Verifies if the device has exposeure to FN72, and if the issue has been mitigated" + "description": "Verifies if the GreenT counters are incremented." }, { "name": "dc1-wan1", @@ -149,7 +244,7 @@ "categories": [ "hardware" ], - "description": "Verifies there are no adverse drops on DCS7280E and DCS7500E" + "description": "Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches." }, { "name": "dc1-wan1", @@ -297,6 +392,54 @@ "description": "Verifies the status of the provided interfaces.", "custom_field": "Interface Vxlan1 = 'up'" }, + { + "name": "dc1-wan1", + "test": "VerifyLANZ", + "categories": [ + "lanz" + ], + "description": "Verifies if LANZ is enabled." + }, + { + "name": "dc1-wan1", + "test": "VerifyPtpGMStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is locked to a valid PTP Grandmaster." + }, + { + "name": "dc1-wan1", + "test": "VerifyPtpLockStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device was locked to the upstream PTP GM in the last minute." + }, + { + "name": "dc1-wan1", + "test": "VerifyPtpModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is configured as a PTP Boundary Clock." + }, + { + "name": "dc1-wan1", + "test": "VerifyPtpOffset", + "categories": [ + "ptp" + ], + "description": "Verifies that the PTP timing offset is within +/- 1000ns from the master clock." + }, + { + "name": "dc1-wan1", + "test": "VerifyPtpPortModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies the PTP interfaces state." + }, { "name": "dc1-wan1", "test": "VerifyRoutingProtocolModel", @@ -306,6 +449,14 @@ "description": "Verifies the configured routing protocol model.", "custom_field": "Routing protocol model: multi-agent" }, + { + "name": "dc1-wan1", + "test": "VerifyAPIHttpsSSL", + "categories": [ + "security" + ], + "description": "Verifies if the eAPI has a valid SSL profile." + }, { "name": "dc1-wan1", "test": "VerifyAPIHttpsSSL", @@ -315,6 +466,169 @@ "description": "Verifies if the eAPI has a valid SSL profile.", "custom_field": "eAPI HTTPS SSL Profile: eAPI_SSL_Profile" }, + { + "name": "dc1-wan1", + "test": "VerifyAPIHttpStatus", + "categories": [ + "security" + ], + "description": "Verifies if eAPI HTTP server is disabled globally." + }, + { + "name": "dc1-wan1", + "test": "VerifyAPIIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF." + }, + { + "name": "dc1-wan1", + "test": "VerifyAPIIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF." + }, + { + "name": "dc1-wan1", + "test": "VerifyAPISSLCertificate", + "categories": [ + "security" + ], + "description": "Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size." + }, + { + "name": "dc1-wan1", + "test": "VerifyBannerLogin", + "categories": [ + "security" + ], + "description": "Verifies the login banner of a device." + }, + { + "name": "dc1-wan1", + "test": "VerifyBannerMotd", + "categories": [ + "security" + ], + "description": "Verifies the motd banner of a device." + }, + { + "name": "dc1-wan1", + "test": "VerifyIPSecConnHealth", + "categories": [ + "security" + ], + "description": "Verifies all IPv4 security connections." + }, + { + "name": "dc1-wan1", + "test": "VerifyIPv4ACL", + "categories": [ + "security" + ], + "description": "Verifies the configuration of IPv4 ACLs." + }, + { + "name": "dc1-wan1", + "test": "VerifySpecificIPSecConn", + "categories": [ + "security" + ], + "description": "Verifies IPv4 security connections for a peer." + }, + { + "name": "dc1-wan1", + "test": "VerifySpecificIPSecConn", + "categories": [ + "security" + ], + "description": "Verifies IPv4 security connections for a peer.", + "custom_field": "IPv4 Peer: 10.255.1.2 VRF: default" + }, + { + "name": "dc1-wan1", + "test": "VerifySpecificIPSecConn", + "categories": [ + "security" + ], + "description": "Verifies IPv4 security connections for a peer.", + "custom_field": "IPv4 Peer: 10.255.255.10 VRF: default" + }, + { + "name": "dc1-wan1", + "test": "VerifySpecificIPSecConn", + "categories": [ + "security" + ], + "description": "Verifies IPv4 security connections for a peer.", + "custom_field": "IPv4 Peer: 10.255.255.20 VRF: default" + }, + { + "name": "dc1-wan1", + "test": "VerifySSHIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv4 ACL(s) configured." + }, + { + "name": "dc1-wan1", + "test": "VerifySSHIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv6 ACL(s) configured." + }, + { + "name": "dc1-wan1", + "test": "VerifySSHStatus", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent is disabled in the default VRF." + }, + { + "name": "dc1-wan1", + "test": "VerifyTelnetStatus", + "categories": [ + "security" + ], + "description": "Verifies if Telnet is disabled in the default VRF." + }, + { + "name": "dc1-wan1", + "test": "VerifyDNSLookup", + "categories": [ + "services" + ], + "description": "Verifies the DNS name to IP address resolution." + }, + { + "name": "dc1-wan1", + "test": "VerifyDNSServers", + "categories": [ + "services" + ], + "description": "Verifies if the DNS servers are correctly configured." + }, + { + "name": "dc1-wan1", + "test": "VerifyErrdisableRecovery", + "categories": [ + "services" + ], + "description": "Verifies the errdisable recovery reason, status, and interval." + }, + { + "name": "dc1-wan1", + "test": "VerifyHostname", + "categories": [ + "services" + ], + "description": "Verifies the hostname of a device." + }, { "name": "dc1-wan1", "test": "VerifySnmpIPv4Acl", @@ -345,7 +659,7 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed EOS version." + "description": "Verifies the EOS version of the device." }, { "name": "dc1-wan1", @@ -353,7 +667,33 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed TerminAttr version." + "description": "Verifies the TerminAttr version of the device." + }, + { + "name": "dc1-wan1", + "test": "VerifyStunClient", + "categories": [ + "stun" + ], + "description": "Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided." + }, + { + "name": "dc1-wan1", + "test": "VerifyStunClient", + "categories": [ + "stun" + ], + "description": "Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided.", + "custom_field": "Source IPv4 Address: 100.64.3.2 Source Port: 4500" + }, + { + "name": "dc1-wan1", + "test": "VerifyStunClient", + "categories": [ + "stun" + ], + "description": "Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided.", + "custom_field": "Source IPv4 Address: 172.18.3.2 Source Port: 4500" }, { "name": "dc1-wan1", @@ -426,5 +766,13 @@ "system" ], "description": "Verifies the device uptime." + }, + { + "name": "dc1-wan1", + "test": "VerifyVlanInternalPolicy", + "categories": [ + "vlan" + ], + "description": "Verifies the VLAN internal allocation policy and the range of VLANs." } ] \ No newline at end of file diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-wan2-results.json b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-wan2-results.json index 777625bd2aa..7c5cc93abab 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-wan2-results.json +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc1-wan2-results.json @@ -55,6 +55,51 @@ ], "description": "Verifies TACACS source-interface for a specified VRF." }, + { + "name": "dc1-wan2", + "test": "VerifyBGPSpecificPeers", + "categories": [ + "bgp" + ], + "description": "Verifies the health of specific BGP peer(s).", + "custom_field": "BGP EVPN Peer: dc1-leaf1a (IP: 10.255.255.10)" + }, + { + "name": "dc1-wan2", + "test": "VerifyBGPSpecificPeers", + "categories": [ + "bgp" + ], + "description": "Verifies the health of specific BGP peer(s).", + "custom_field": "BGP EVPN Peer: dc1-leaf1b (IP: 10.255.255.20)" + }, + { + "name": "dc1-wan2", + "test": "VerifyBGPSpecificPeers", + "categories": [ + "bgp" + ], + "description": "Verifies the health of specific BGP peer(s).", + "custom_field": "BGP EVPN Peer: dc1-wan1 (IP: 10.255.1.1)" + }, + { + "name": "dc1-wan2", + "test": "VerifyBGPSpecificPeers", + "categories": [ + "bgp" + ], + "description": "Verifies the health of specific BGP peer(s).", + "custom_field": "BGP IPv4 SR-TE Peer: dc1-leaf1a (IP: 10.255.255.10)" + }, + { + "name": "dc1-wan2", + "test": "VerifyBGPSpecificPeers", + "categories": [ + "bgp" + ], + "description": "Verifies the health of specific BGP peer(s).", + "custom_field": "BGP IPv4 SR-TE Peer: dc1-leaf1b (IP: 10.255.255.20)" + }, { "name": "dc1-wan2", "test": "VerifyBGPSpecificPeers", @@ -73,6 +118,42 @@ "description": "Verifies the health of specific BGP peer(s).", "custom_field": "BGP IPv4 Unicast Peer: dc1-leaf1b (IP: 10.255.255.6)" }, + { + "name": "dc1-wan2", + "test": "VerifyBGPSpecificPeers", + "categories": [ + "bgp" + ], + "description": "Verifies the health of specific BGP peer(s).", + "custom_field": "BGP Link-State Peer: dc1-leaf1a (IP: 10.255.255.10)" + }, + { + "name": "dc1-wan2", + "test": "VerifyBGPSpecificPeers", + "categories": [ + "bgp" + ], + "description": "Verifies the health of specific BGP peer(s).", + "custom_field": "BGP Link-State Peer: dc1-leaf1b (IP: 10.255.255.20)" + }, + { + "name": "dc1-wan2", + "test": "VerifyBGPSpecificPeers", + "categories": [ + "bgp" + ], + "description": "Verifies the health of specific BGP peer(s).", + "custom_field": "BGP Path-Selection Peer: dc1-leaf1a (IP: 10.255.255.10)" + }, + { + "name": "dc1-wan2", + "test": "VerifyBGPSpecificPeers", + "categories": [ + "bgp" + ], + "description": "Verifies the health of specific BGP peer(s).", + "custom_field": "BGP Path-Selection Peer: dc1-leaf1b (IP: 10.255.255.20)" + }, { "name": "dc1-wan2", "test": "VerifyRunningConfigDiffs", @@ -129,19 +210,33 @@ "name": "dc1-wan2", "test": "VerifyFieldNotice44Resolution", "categories": [ - "field notices", - "software" + "field notices" ], - "description": "Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization)" + "description": "Verifies that the device is using the correct Aboot version per FN0044." }, { "name": "dc1-wan2", "test": "VerifyFieldNotice72Resolution", "categories": [ - "field notices", - "software" + "field notices" + ], + "description": "Verifies if the device is exposed to FN0072, and if the issue has been mitigated." + }, + { + "name": "dc1-wan2", + "test": "VerifyGreenT", + "categories": [ + "greent" + ], + "description": "Verifies if a GreenT policy is created." + }, + { + "name": "dc1-wan2", + "test": "VerifyGreenTCounters", + "categories": [ + "greent" ], - "description": "Verifies if the device has exposeure to FN72, and if the issue has been mitigated" + "description": "Verifies if the GreenT counters are incremented." }, { "name": "dc1-wan2", @@ -149,7 +244,7 @@ "categories": [ "hardware" ], - "description": "Verifies there are no adverse drops on DCS7280E and DCS7500E" + "description": "Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches." }, { "name": "dc1-wan2", @@ -297,6 +392,54 @@ "description": "Verifies the status of the provided interfaces.", "custom_field": "Interface Vxlan1 = 'up'" }, + { + "name": "dc1-wan2", + "test": "VerifyLANZ", + "categories": [ + "lanz" + ], + "description": "Verifies if LANZ is enabled." + }, + { + "name": "dc1-wan2", + "test": "VerifyPtpGMStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is locked to a valid PTP Grandmaster." + }, + { + "name": "dc1-wan2", + "test": "VerifyPtpLockStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device was locked to the upstream PTP GM in the last minute." + }, + { + "name": "dc1-wan2", + "test": "VerifyPtpModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is configured as a PTP Boundary Clock." + }, + { + "name": "dc1-wan2", + "test": "VerifyPtpOffset", + "categories": [ + "ptp" + ], + "description": "Verifies that the PTP timing offset is within +/- 1000ns from the master clock." + }, + { + "name": "dc1-wan2", + "test": "VerifyPtpPortModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies the PTP interfaces state." + }, { "name": "dc1-wan2", "test": "VerifyRoutingProtocolModel", @@ -306,6 +449,14 @@ "description": "Verifies the configured routing protocol model.", "custom_field": "Routing protocol model: multi-agent" }, + { + "name": "dc1-wan2", + "test": "VerifyAPIHttpsSSL", + "categories": [ + "security" + ], + "description": "Verifies if the eAPI has a valid SSL profile." + }, { "name": "dc1-wan2", "test": "VerifyAPIHttpsSSL", @@ -315,6 +466,169 @@ "description": "Verifies if the eAPI has a valid SSL profile.", "custom_field": "eAPI HTTPS SSL Profile: eAPI_SSL_Profile" }, + { + "name": "dc1-wan2", + "test": "VerifyAPIHttpStatus", + "categories": [ + "security" + ], + "description": "Verifies if eAPI HTTP server is disabled globally." + }, + { + "name": "dc1-wan2", + "test": "VerifyAPIIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF." + }, + { + "name": "dc1-wan2", + "test": "VerifyAPIIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF." + }, + { + "name": "dc1-wan2", + "test": "VerifyAPISSLCertificate", + "categories": [ + "security" + ], + "description": "Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size." + }, + { + "name": "dc1-wan2", + "test": "VerifyBannerLogin", + "categories": [ + "security" + ], + "description": "Verifies the login banner of a device." + }, + { + "name": "dc1-wan2", + "test": "VerifyBannerMotd", + "categories": [ + "security" + ], + "description": "Verifies the motd banner of a device." + }, + { + "name": "dc1-wan2", + "test": "VerifyIPSecConnHealth", + "categories": [ + "security" + ], + "description": "Verifies all IPv4 security connections." + }, + { + "name": "dc1-wan2", + "test": "VerifyIPv4ACL", + "categories": [ + "security" + ], + "description": "Verifies the configuration of IPv4 ACLs." + }, + { + "name": "dc1-wan2", + "test": "VerifySpecificIPSecConn", + "categories": [ + "security" + ], + "description": "Verifies IPv4 security connections for a peer." + }, + { + "name": "dc1-wan2", + "test": "VerifySpecificIPSecConn", + "categories": [ + "security" + ], + "description": "Verifies IPv4 security connections for a peer.", + "custom_field": "IPv4 Peer: 10.255.1.1 VRF: default" + }, + { + "name": "dc1-wan2", + "test": "VerifySpecificIPSecConn", + "categories": [ + "security" + ], + "description": "Verifies IPv4 security connections for a peer.", + "custom_field": "IPv4 Peer: 10.255.255.10 VRF: default" + }, + { + "name": "dc1-wan2", + "test": "VerifySpecificIPSecConn", + "categories": [ + "security" + ], + "description": "Verifies IPv4 security connections for a peer.", + "custom_field": "IPv4 Peer: 10.255.255.20 VRF: default" + }, + { + "name": "dc1-wan2", + "test": "VerifySSHIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv4 ACL(s) configured." + }, + { + "name": "dc1-wan2", + "test": "VerifySSHIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv6 ACL(s) configured." + }, + { + "name": "dc1-wan2", + "test": "VerifySSHStatus", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent is disabled in the default VRF." + }, + { + "name": "dc1-wan2", + "test": "VerifyTelnetStatus", + "categories": [ + "security" + ], + "description": "Verifies if Telnet is disabled in the default VRF." + }, + { + "name": "dc1-wan2", + "test": "VerifyDNSLookup", + "categories": [ + "services" + ], + "description": "Verifies the DNS name to IP address resolution." + }, + { + "name": "dc1-wan2", + "test": "VerifyDNSServers", + "categories": [ + "services" + ], + "description": "Verifies if the DNS servers are correctly configured." + }, + { + "name": "dc1-wan2", + "test": "VerifyErrdisableRecovery", + "categories": [ + "services" + ], + "description": "Verifies the errdisable recovery reason, status, and interval." + }, + { + "name": "dc1-wan2", + "test": "VerifyHostname", + "categories": [ + "services" + ], + "description": "Verifies the hostname of a device." + }, { "name": "dc1-wan2", "test": "VerifySnmpIPv4Acl", @@ -345,7 +659,7 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed EOS version." + "description": "Verifies the EOS version of the device." }, { "name": "dc1-wan2", @@ -353,7 +667,33 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed TerminAttr version." + "description": "Verifies the TerminAttr version of the device." + }, + { + "name": "dc1-wan2", + "test": "VerifyStunClient", + "categories": [ + "stun" + ], + "description": "Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided." + }, + { + "name": "dc1-wan2", + "test": "VerifyStunClient", + "categories": [ + "stun" + ], + "description": "Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided.", + "custom_field": "Source IPv4 Address: 100.64.4.2 Source Port: 4500" + }, + { + "name": "dc1-wan2", + "test": "VerifyStunClient", + "categories": [ + "stun" + ], + "description": "Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided.", + "custom_field": "Source IPv4 Address: 172.18.4.2 Source Port: 4500" }, { "name": "dc1-wan2", @@ -426,5 +766,13 @@ "system" ], "description": "Verifies the device uptime." + }, + { + "name": "dc1-wan2", + "test": "VerifyVlanInternalPolicy", + "categories": [ + "vlan" + ], + "description": "Verifies the VLAN internal allocation policy and the range of VLANs." } ] \ No newline at end of file diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-leaf1a-results.json b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-leaf1a-results.json index 8d89e3d0c17..14b2d1be421 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-leaf1a-results.json +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-leaf1a-results.json @@ -206,6 +206,24 @@ "description": "Test the network reachability to one or many destination IP(s).", "custom_field": "Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2)" }, + { + "name": "dc2-leaf1a", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5)" + }, + { + "name": "dc2-leaf1a", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.255.128.13) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6)" + }, { "name": "dc2-leaf1a", "test": "VerifyReachability", @@ -318,19 +336,33 @@ "name": "dc2-leaf1a", "test": "VerifyFieldNotice44Resolution", "categories": [ - "field notices", - "software" + "field notices" ], - "description": "Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization)" + "description": "Verifies that the device is using the correct Aboot version per FN0044." }, { "name": "dc2-leaf1a", "test": "VerifyFieldNotice72Resolution", "categories": [ - "field notices", - "software" + "field notices" ], - "description": "Verifies if the device has exposeure to FN72, and if the issue has been mitigated" + "description": "Verifies if the device is exposed to FN0072, and if the issue has been mitigated." + }, + { + "name": "dc2-leaf1a", + "test": "VerifyGreenT", + "categories": [ + "greent" + ], + "description": "Verifies if a GreenT policy is created." + }, + { + "name": "dc2-leaf1a", + "test": "VerifyGreenTCounters", + "categories": [ + "greent" + ], + "description": "Verifies if the GreenT counters are incremented." }, { "name": "dc2-leaf1a", @@ -338,7 +370,7 @@ "categories": [ "hardware" ], - "description": "Verifies there are no adverse drops on DCS7280E and DCS7500E" + "description": "Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches." }, { "name": "dc2-leaf1a", @@ -621,6 +653,14 @@ "description": "Verifies the status of the provided interfaces.", "custom_field": "Interface Vxlan1 = 'up'" }, + { + "name": "dc2-leaf1a", + "test": "VerifyLANZ", + "categories": [ + "lanz" + ], + "description": "Verifies if LANZ is enabled." + }, { "name": "dc2-leaf1a", "test": "VerifyLoggingAccounting", @@ -629,6 +669,14 @@ ], "description": "Verifies if AAA accounting logs are generated." }, + { + "name": "dc2-leaf1a", + "test": "VerifyLoggingErrors", + "categories": [ + "logging" + ], + "description": "Verifies there are no syslog messages with a severity of ERRORS or higher." + }, { "name": "dc2-leaf1a", "test": "VerifyLoggingHostname", @@ -675,15 +723,7 @@ "categories": [ "logging" ], - "description": "Verifies if logs are generated with the appropriate timestamp." - }, - { - "name": "dc2-leaf1a", - "test": "VerifyLoggingWarning", - "categories": [ - "logging" - ], - "description": "This test verifies there are no syslog messages with a severity of ERRORS or higher." + "description": "Verifies if logs are generated with the riate timestamp." }, { "name": "dc2-leaf1a", @@ -737,8 +777,7 @@ "name": "dc2-leaf1a", "test": "VerifyIGMPSnoopingGlobal", "categories": [ - "multicast", - "igmp" + "multicast" ], "description": "Verifies the IGMP snooping global configuration." }, @@ -746,10 +785,49 @@ "name": "dc2-leaf1a", "test": "VerifyIGMPSnoopingVlans", "categories": [ - "multicast", - "igmp" + "multicast" ], - "description": "Verifies the IGMP snooping configuration for some VLANs." + "description": "Verifies the IGMP snooping status for the provided VLANs." + }, + { + "name": "dc2-leaf1a", + "test": "VerifyPtpGMStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is locked to a valid PTP Grandmaster." + }, + { + "name": "dc2-leaf1a", + "test": "VerifyPtpLockStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device was locked to the upstream PTP GM in the last minute." + }, + { + "name": "dc2-leaf1a", + "test": "VerifyPtpModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is configured as a PTP Boundary Clock." + }, + { + "name": "dc2-leaf1a", + "test": "VerifyPtpOffset", + "categories": [ + "ptp" + ], + "description": "Verifies that the PTP timing offset is within +/- 1000ns from the master clock." + }, + { + "name": "dc2-leaf1a", + "test": "VerifyPtpPortModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies the PTP interfaces state." }, { "name": "dc2-leaf1a", @@ -940,6 +1018,41 @@ "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", "custom_field": "Route: 10.255.2.2 - Peer: dc1-wan2" }, + { + "name": "dc2-leaf1a", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.33.0.5 - Peer: dc1-svc-leaf1a" + }, + { + "name": "dc2-leaf1a", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.33.0.6 - Peer: dc1-svc-leaf1b" + }, + { + "name": "dc2-leaf1a", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.33.1.5 - Peer: dc1-svc-leaf1a" + }, + { + "name": "dc2-leaf1a", + "test": "VerifyAPIHttpsSSL", + "categories": [ + "security" + ], + "description": "Verifies if the eAPI has a valid SSL profile." + }, { "name": "dc2-leaf1a", "test": "VerifyAPIHttpsSSL", @@ -949,6 +1062,142 @@ "description": "Verifies if the eAPI has a valid SSL profile.", "custom_field": "eAPI HTTPS SSL Profile: eAPI_SSL_Profile" }, + { + "name": "dc2-leaf1a", + "test": "VerifyAPIHttpStatus", + "categories": [ + "security" + ], + "description": "Verifies if eAPI HTTP server is disabled globally." + }, + { + "name": "dc2-leaf1a", + "test": "VerifyAPIIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF." + }, + { + "name": "dc2-leaf1a", + "test": "VerifyAPIIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF." + }, + { + "name": "dc2-leaf1a", + "test": "VerifyAPISSLCertificate", + "categories": [ + "security" + ], + "description": "Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size." + }, + { + "name": "dc2-leaf1a", + "test": "VerifyBannerLogin", + "categories": [ + "security" + ], + "description": "Verifies the login banner of a device." + }, + { + "name": "dc2-leaf1a", + "test": "VerifyBannerMotd", + "categories": [ + "security" + ], + "description": "Verifies the motd banner of a device." + }, + { + "name": "dc2-leaf1a", + "test": "VerifyIPSecConnHealth", + "categories": [ + "security" + ], + "description": "Verifies all IPv4 security connections." + }, + { + "name": "dc2-leaf1a", + "test": "VerifyIPv4ACL", + "categories": [ + "security" + ], + "description": "Verifies the configuration of IPv4 ACLs." + }, + { + "name": "dc2-leaf1a", + "test": "VerifySpecificIPSecConn", + "categories": [ + "security" + ], + "description": "Verifies IPv4 security connections for a peer." + }, + { + "name": "dc2-leaf1a", + "test": "VerifySSHIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv4 ACL(s) configured." + }, + { + "name": "dc2-leaf1a", + "test": "VerifySSHIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv6 ACL(s) configured." + }, + { + "name": "dc2-leaf1a", + "test": "VerifySSHStatus", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent is disabled in the default VRF." + }, + { + "name": "dc2-leaf1a", + "test": "VerifyTelnetStatus", + "categories": [ + "security" + ], + "description": "Verifies if Telnet is disabled in the default VRF." + }, + { + "name": "dc2-leaf1a", + "test": "VerifyDNSLookup", + "categories": [ + "services" + ], + "description": "Verifies the DNS name to IP address resolution." + }, + { + "name": "dc2-leaf1a", + "test": "VerifyDNSServers", + "categories": [ + "services" + ], + "description": "Verifies if the DNS servers are correctly configured." + }, + { + "name": "dc2-leaf1a", + "test": "VerifyErrdisableRecovery", + "categories": [ + "services" + ], + "description": "Verifies the errdisable recovery reason, status, and interval." + }, + { + "name": "dc2-leaf1a", + "test": "VerifyHostname", + "categories": [ + "services" + ], + "description": "Verifies the hostname of a device." + }, { "name": "dc2-leaf1a", "test": "VerifySnmpIPv4Acl", @@ -979,7 +1228,7 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed EOS version." + "description": "Verifies the EOS version of the device." }, { "name": "dc2-leaf1a", @@ -987,7 +1236,7 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed TerminAttr version." + "description": "Verifies the TerminAttr version of the device." }, { "name": "dc2-leaf1a", @@ -1029,6 +1278,14 @@ ], "description": "Verifies the STP root priority for a provided list of VLAN or MST instance ID(s)." }, + { + "name": "dc2-leaf1a", + "test": "VerifyStunClient", + "categories": [ + "stun" + ], + "description": "Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided." + }, { "name": "dc2-leaf1a", "test": "VerifyAgentLogs", @@ -1100,5 +1357,13 @@ "system" ], "description": "Verifies the device uptime." + }, + { + "name": "dc2-leaf1a", + "test": "VerifyVlanInternalPolicy", + "categories": [ + "vlan" + ], + "description": "Verifies the VLAN internal allocation policy and the range of VLANs." } ] \ No newline at end of file diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-leaf1b-results.json b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-leaf1b-results.json index ae6e474e197..f9fc579bfa3 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-leaf1b-results.json +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-leaf1b-results.json @@ -206,6 +206,24 @@ "description": "Test the network reachability to one or many destination IP(s).", "custom_field": "Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2)" }, + { + "name": "dc2-leaf1b", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5)" + }, + { + "name": "dc2-leaf1b", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.255.128.14) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6)" + }, { "name": "dc2-leaf1b", "test": "VerifyReachability", @@ -318,19 +336,33 @@ "name": "dc2-leaf1b", "test": "VerifyFieldNotice44Resolution", "categories": [ - "field notices", - "software" + "field notices" ], - "description": "Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization)" + "description": "Verifies that the device is using the correct Aboot version per FN0044." }, { "name": "dc2-leaf1b", "test": "VerifyFieldNotice72Resolution", "categories": [ - "field notices", - "software" + "field notices" ], - "description": "Verifies if the device has exposeure to FN72, and if the issue has been mitigated" + "description": "Verifies if the device is exposed to FN0072, and if the issue has been mitigated." + }, + { + "name": "dc2-leaf1b", + "test": "VerifyGreenT", + "categories": [ + "greent" + ], + "description": "Verifies if a GreenT policy is created." + }, + { + "name": "dc2-leaf1b", + "test": "VerifyGreenTCounters", + "categories": [ + "greent" + ], + "description": "Verifies if the GreenT counters are incremented." }, { "name": "dc2-leaf1b", @@ -338,7 +370,7 @@ "categories": [ "hardware" ], - "description": "Verifies there are no adverse drops on DCS7280E and DCS7500E" + "description": "Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches." }, { "name": "dc2-leaf1b", @@ -621,6 +653,14 @@ "description": "Verifies the status of the provided interfaces.", "custom_field": "Interface Vxlan1 = 'up'" }, + { + "name": "dc2-leaf1b", + "test": "VerifyLANZ", + "categories": [ + "lanz" + ], + "description": "Verifies if LANZ is enabled." + }, { "name": "dc2-leaf1b", "test": "VerifyLoggingAccounting", @@ -629,6 +669,14 @@ ], "description": "Verifies if AAA accounting logs are generated." }, + { + "name": "dc2-leaf1b", + "test": "VerifyLoggingErrors", + "categories": [ + "logging" + ], + "description": "Verifies there are no syslog messages with a severity of ERRORS or higher." + }, { "name": "dc2-leaf1b", "test": "VerifyLoggingHostname", @@ -675,15 +723,7 @@ "categories": [ "logging" ], - "description": "Verifies if logs are generated with the appropriate timestamp." - }, - { - "name": "dc2-leaf1b", - "test": "VerifyLoggingWarning", - "categories": [ - "logging" - ], - "description": "This test verifies there are no syslog messages with a severity of ERRORS or higher." + "description": "Verifies if logs are generated with the riate timestamp." }, { "name": "dc2-leaf1b", @@ -737,8 +777,7 @@ "name": "dc2-leaf1b", "test": "VerifyIGMPSnoopingGlobal", "categories": [ - "multicast", - "igmp" + "multicast" ], "description": "Verifies the IGMP snooping global configuration." }, @@ -746,10 +785,49 @@ "name": "dc2-leaf1b", "test": "VerifyIGMPSnoopingVlans", "categories": [ - "multicast", - "igmp" + "multicast" ], - "description": "Verifies the IGMP snooping configuration for some VLANs." + "description": "Verifies the IGMP snooping status for the provided VLANs." + }, + { + "name": "dc2-leaf1b", + "test": "VerifyPtpGMStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is locked to a valid PTP Grandmaster." + }, + { + "name": "dc2-leaf1b", + "test": "VerifyPtpLockStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device was locked to the upstream PTP GM in the last minute." + }, + { + "name": "dc2-leaf1b", + "test": "VerifyPtpModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is configured as a PTP Boundary Clock." + }, + { + "name": "dc2-leaf1b", + "test": "VerifyPtpOffset", + "categories": [ + "ptp" + ], + "description": "Verifies that the PTP timing offset is within +/- 1000ns from the master clock." + }, + { + "name": "dc2-leaf1b", + "test": "VerifyPtpPortModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies the PTP interfaces state." }, { "name": "dc2-leaf1b", @@ -940,6 +1018,41 @@ "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", "custom_field": "Route: 10.255.2.2 - Peer: dc1-wan2" }, + { + "name": "dc2-leaf1b", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.33.0.5 - Peer: dc1-svc-leaf1a" + }, + { + "name": "dc2-leaf1b", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.33.0.6 - Peer: dc1-svc-leaf1b" + }, + { + "name": "dc2-leaf1b", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.33.1.5 - Peer: dc1-svc-leaf1a" + }, + { + "name": "dc2-leaf1b", + "test": "VerifyAPIHttpsSSL", + "categories": [ + "security" + ], + "description": "Verifies if the eAPI has a valid SSL profile." + }, { "name": "dc2-leaf1b", "test": "VerifyAPIHttpsSSL", @@ -949,6 +1062,142 @@ "description": "Verifies if the eAPI has a valid SSL profile.", "custom_field": "eAPI HTTPS SSL Profile: eAPI_SSL_Profile" }, + { + "name": "dc2-leaf1b", + "test": "VerifyAPIHttpStatus", + "categories": [ + "security" + ], + "description": "Verifies if eAPI HTTP server is disabled globally." + }, + { + "name": "dc2-leaf1b", + "test": "VerifyAPIIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF." + }, + { + "name": "dc2-leaf1b", + "test": "VerifyAPIIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF." + }, + { + "name": "dc2-leaf1b", + "test": "VerifyAPISSLCertificate", + "categories": [ + "security" + ], + "description": "Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size." + }, + { + "name": "dc2-leaf1b", + "test": "VerifyBannerLogin", + "categories": [ + "security" + ], + "description": "Verifies the login banner of a device." + }, + { + "name": "dc2-leaf1b", + "test": "VerifyBannerMotd", + "categories": [ + "security" + ], + "description": "Verifies the motd banner of a device." + }, + { + "name": "dc2-leaf1b", + "test": "VerifyIPSecConnHealth", + "categories": [ + "security" + ], + "description": "Verifies all IPv4 security connections." + }, + { + "name": "dc2-leaf1b", + "test": "VerifyIPv4ACL", + "categories": [ + "security" + ], + "description": "Verifies the configuration of IPv4 ACLs." + }, + { + "name": "dc2-leaf1b", + "test": "VerifySpecificIPSecConn", + "categories": [ + "security" + ], + "description": "Verifies IPv4 security connections for a peer." + }, + { + "name": "dc2-leaf1b", + "test": "VerifySSHIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv4 ACL(s) configured." + }, + { + "name": "dc2-leaf1b", + "test": "VerifySSHIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv6 ACL(s) configured." + }, + { + "name": "dc2-leaf1b", + "test": "VerifySSHStatus", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent is disabled in the default VRF." + }, + { + "name": "dc2-leaf1b", + "test": "VerifyTelnetStatus", + "categories": [ + "security" + ], + "description": "Verifies if Telnet is disabled in the default VRF." + }, + { + "name": "dc2-leaf1b", + "test": "VerifyDNSLookup", + "categories": [ + "services" + ], + "description": "Verifies the DNS name to IP address resolution." + }, + { + "name": "dc2-leaf1b", + "test": "VerifyDNSServers", + "categories": [ + "services" + ], + "description": "Verifies if the DNS servers are correctly configured." + }, + { + "name": "dc2-leaf1b", + "test": "VerifyErrdisableRecovery", + "categories": [ + "services" + ], + "description": "Verifies the errdisable recovery reason, status, and interval." + }, + { + "name": "dc2-leaf1b", + "test": "VerifyHostname", + "categories": [ + "services" + ], + "description": "Verifies the hostname of a device." + }, { "name": "dc2-leaf1b", "test": "VerifySnmpIPv4Acl", @@ -979,7 +1228,7 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed EOS version." + "description": "Verifies the EOS version of the device." }, { "name": "dc2-leaf1b", @@ -987,7 +1236,7 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed TerminAttr version." + "description": "Verifies the TerminAttr version of the device." }, { "name": "dc2-leaf1b", @@ -1029,6 +1278,14 @@ ], "description": "Verifies the STP root priority for a provided list of VLAN or MST instance ID(s)." }, + { + "name": "dc2-leaf1b", + "test": "VerifyStunClient", + "categories": [ + "stun" + ], + "description": "Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided." + }, { "name": "dc2-leaf1b", "test": "VerifyAgentLogs", @@ -1100,5 +1357,13 @@ "system" ], "description": "Verifies the device uptime." + }, + { + "name": "dc2-leaf1b", + "test": "VerifyVlanInternalPolicy", + "categories": [ + "vlan" + ], + "description": "Verifies the VLAN internal allocation policy and the range of VLANs." } ] \ No newline at end of file diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-leaf1c-results.json b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-leaf1c-results.json index 390449a76de..8d8dd8c53bb 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-leaf1c-results.json +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-leaf1c-results.json @@ -93,19 +93,33 @@ "name": "dc2-leaf1c", "test": "VerifyFieldNotice44Resolution", "categories": [ - "field notices", - "software" + "field notices" ], - "description": "Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization)" + "description": "Verifies that the device is using the correct Aboot version per FN0044." }, { "name": "dc2-leaf1c", "test": "VerifyFieldNotice72Resolution", "categories": [ - "field notices", - "software" + "field notices" + ], + "description": "Verifies if the device is exposed to FN0072, and if the issue has been mitigated." + }, + { + "name": "dc2-leaf1c", + "test": "VerifyGreenT", + "categories": [ + "greent" + ], + "description": "Verifies if a GreenT policy is created." + }, + { + "name": "dc2-leaf1c", + "test": "VerifyGreenTCounters", + "categories": [ + "greent" ], - "description": "Verifies if the device has exposeure to FN72, and if the issue has been mitigated" + "description": "Verifies if the GreenT counters are incremented." }, { "name": "dc2-leaf1c", @@ -113,7 +127,7 @@ "categories": [ "hardware" ], - "description": "Verifies there are no adverse drops on DCS7280E and DCS7500E" + "description": "Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches." }, { "name": "dc2-leaf1c", @@ -234,6 +248,62 @@ "description": "Verifies the status of the provided interfaces.", "custom_field": "Interface Port-Channel1 - DC2_L3_LEAF1_Po8 = 'up'" }, + { + "name": "dc2-leaf1c", + "test": "VerifyLANZ", + "categories": [ + "lanz" + ], + "description": "Verifies if LANZ is enabled." + }, + { + "name": "dc2-leaf1c", + "test": "VerifyPtpGMStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is locked to a valid PTP Grandmaster." + }, + { + "name": "dc2-leaf1c", + "test": "VerifyPtpLockStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device was locked to the upstream PTP GM in the last minute." + }, + { + "name": "dc2-leaf1c", + "test": "VerifyPtpModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is configured as a PTP Boundary Clock." + }, + { + "name": "dc2-leaf1c", + "test": "VerifyPtpOffset", + "categories": [ + "ptp" + ], + "description": "Verifies that the PTP timing offset is within +/- 1000ns from the master clock." + }, + { + "name": "dc2-leaf1c", + "test": "VerifyPtpPortModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies the PTP interfaces state." + }, + { + "name": "dc2-leaf1c", + "test": "VerifyAPIHttpsSSL", + "categories": [ + "security" + ], + "description": "Verifies if the eAPI has a valid SSL profile." + }, { "name": "dc2-leaf1c", "test": "VerifyAPIHttpsSSL", @@ -243,6 +313,142 @@ "description": "Verifies if the eAPI has a valid SSL profile.", "custom_field": "eAPI HTTPS SSL Profile: eAPI_SSL_Profile" }, + { + "name": "dc2-leaf1c", + "test": "VerifyAPIHttpStatus", + "categories": [ + "security" + ], + "description": "Verifies if eAPI HTTP server is disabled globally." + }, + { + "name": "dc2-leaf1c", + "test": "VerifyAPIIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF." + }, + { + "name": "dc2-leaf1c", + "test": "VerifyAPIIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF." + }, + { + "name": "dc2-leaf1c", + "test": "VerifyAPISSLCertificate", + "categories": [ + "security" + ], + "description": "Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size." + }, + { + "name": "dc2-leaf1c", + "test": "VerifyBannerLogin", + "categories": [ + "security" + ], + "description": "Verifies the login banner of a device." + }, + { + "name": "dc2-leaf1c", + "test": "VerifyBannerMotd", + "categories": [ + "security" + ], + "description": "Verifies the motd banner of a device." + }, + { + "name": "dc2-leaf1c", + "test": "VerifyIPSecConnHealth", + "categories": [ + "security" + ], + "description": "Verifies all IPv4 security connections." + }, + { + "name": "dc2-leaf1c", + "test": "VerifyIPv4ACL", + "categories": [ + "security" + ], + "description": "Verifies the configuration of IPv4 ACLs." + }, + { + "name": "dc2-leaf1c", + "test": "VerifySpecificIPSecConn", + "categories": [ + "security" + ], + "description": "Verifies IPv4 security connections for a peer." + }, + { + "name": "dc2-leaf1c", + "test": "VerifySSHIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv4 ACL(s) configured." + }, + { + "name": "dc2-leaf1c", + "test": "VerifySSHIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv6 ACL(s) configured." + }, + { + "name": "dc2-leaf1c", + "test": "VerifySSHStatus", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent is disabled in the default VRF." + }, + { + "name": "dc2-leaf1c", + "test": "VerifyTelnetStatus", + "categories": [ + "security" + ], + "description": "Verifies if Telnet is disabled in the default VRF." + }, + { + "name": "dc2-leaf1c", + "test": "VerifyDNSLookup", + "categories": [ + "services" + ], + "description": "Verifies the DNS name to IP address resolution." + }, + { + "name": "dc2-leaf1c", + "test": "VerifyDNSServers", + "categories": [ + "services" + ], + "description": "Verifies if the DNS servers are correctly configured." + }, + { + "name": "dc2-leaf1c", + "test": "VerifyErrdisableRecovery", + "categories": [ + "services" + ], + "description": "Verifies the errdisable recovery reason, status, and interval." + }, + { + "name": "dc2-leaf1c", + "test": "VerifyHostname", + "categories": [ + "services" + ], + "description": "Verifies the hostname of a device." + }, { "name": "dc2-leaf1c", "test": "VerifySnmpIPv4Acl", @@ -273,7 +479,7 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed EOS version." + "description": "Verifies the EOS version of the device." }, { "name": "dc2-leaf1c", @@ -281,7 +487,15 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed TerminAttr version." + "description": "Verifies the TerminAttr version of the device." + }, + { + "name": "dc2-leaf1c", + "test": "VerifyStunClient", + "categories": [ + "stun" + ], + "description": "Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided." }, { "name": "dc2-leaf1c", @@ -354,5 +568,13 @@ "system" ], "description": "Verifies the device uptime." + }, + { + "name": "dc2-leaf1c", + "test": "VerifyVlanInternalPolicy", + "categories": [ + "vlan" + ], + "description": "Verifies the VLAN internal allocation policy and the range of VLANs." } ] \ No newline at end of file diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-leaf2a-results.json b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-leaf2a-results.json index b708878bcbe..208286348de 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-leaf2a-results.json +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-leaf2a-results.json @@ -233,6 +233,24 @@ "description": "Test the network reachability to one or many destination IP(s).", "custom_field": "Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2)" }, + { + "name": "dc2-leaf2a", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5)" + }, + { + "name": "dc2-leaf2a", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.255.128.15) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6)" + }, { "name": "dc2-leaf2a", "test": "VerifyReachability", @@ -354,19 +372,33 @@ "name": "dc2-leaf2a", "test": "VerifyFieldNotice44Resolution", "categories": [ - "field notices", - "software" + "field notices" ], - "description": "Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization)" + "description": "Verifies that the device is using the correct Aboot version per FN0044." }, { "name": "dc2-leaf2a", "test": "VerifyFieldNotice72Resolution", "categories": [ - "field notices", - "software" + "field notices" ], - "description": "Verifies if the device has exposeure to FN72, and if the issue has been mitigated" + "description": "Verifies if the device is exposed to FN0072, and if the issue has been mitigated." + }, + { + "name": "dc2-leaf2a", + "test": "VerifyGreenT", + "categories": [ + "greent" + ], + "description": "Verifies if a GreenT policy is created." + }, + { + "name": "dc2-leaf2a", + "test": "VerifyGreenTCounters", + "categories": [ + "greent" + ], + "description": "Verifies if the GreenT counters are incremented." }, { "name": "dc2-leaf2a", @@ -374,7 +406,7 @@ "categories": [ "hardware" ], - "description": "Verifies there are no adverse drops on DCS7280E and DCS7500E" + "description": "Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches." }, { "name": "dc2-leaf2a", @@ -666,6 +698,14 @@ "description": "Verifies the status of the provided interfaces.", "custom_field": "Interface Vxlan1 = 'up'" }, + { + "name": "dc2-leaf2a", + "test": "VerifyLANZ", + "categories": [ + "lanz" + ], + "description": "Verifies if LANZ is enabled." + }, { "name": "dc2-leaf2a", "test": "VerifyLoggingAccounting", @@ -674,6 +714,14 @@ ], "description": "Verifies if AAA accounting logs are generated." }, + { + "name": "dc2-leaf2a", + "test": "VerifyLoggingErrors", + "categories": [ + "logging" + ], + "description": "Verifies there are no syslog messages with a severity of ERRORS or higher." + }, { "name": "dc2-leaf2a", "test": "VerifyLoggingHostname", @@ -720,15 +768,7 @@ "categories": [ "logging" ], - "description": "Verifies if logs are generated with the appropriate timestamp." - }, - { - "name": "dc2-leaf2a", - "test": "VerifyLoggingWarning", - "categories": [ - "logging" - ], - "description": "This test verifies there are no syslog messages with a severity of ERRORS or higher." + "description": "Verifies if logs are generated with the riate timestamp." }, { "name": "dc2-leaf2a", @@ -782,8 +822,7 @@ "name": "dc2-leaf2a", "test": "VerifyIGMPSnoopingGlobal", "categories": [ - "multicast", - "igmp" + "multicast" ], "description": "Verifies the IGMP snooping global configuration." }, @@ -791,10 +830,49 @@ "name": "dc2-leaf2a", "test": "VerifyIGMPSnoopingVlans", "categories": [ - "multicast", - "igmp" + "multicast" ], - "description": "Verifies the IGMP snooping configuration for some VLANs." + "description": "Verifies the IGMP snooping status for the provided VLANs." + }, + { + "name": "dc2-leaf2a", + "test": "VerifyPtpGMStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is locked to a valid PTP Grandmaster." + }, + { + "name": "dc2-leaf2a", + "test": "VerifyPtpLockStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device was locked to the upstream PTP GM in the last minute." + }, + { + "name": "dc2-leaf2a", + "test": "VerifyPtpModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is configured as a PTP Boundary Clock." + }, + { + "name": "dc2-leaf2a", + "test": "VerifyPtpOffset", + "categories": [ + "ptp" + ], + "description": "Verifies that the PTP timing offset is within +/- 1000ns from the master clock." + }, + { + "name": "dc2-leaf2a", + "test": "VerifyPtpPortModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies the PTP interfaces state." }, { "name": "dc2-leaf2a", @@ -985,6 +1063,41 @@ "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", "custom_field": "Route: 10.255.2.2 - Peer: dc1-wan2" }, + { + "name": "dc2-leaf2a", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.33.0.5 - Peer: dc1-svc-leaf1a" + }, + { + "name": "dc2-leaf2a", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.33.0.6 - Peer: dc1-svc-leaf1b" + }, + { + "name": "dc2-leaf2a", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.33.1.5 - Peer: dc1-svc-leaf1a" + }, + { + "name": "dc2-leaf2a", + "test": "VerifyAPIHttpsSSL", + "categories": [ + "security" + ], + "description": "Verifies if the eAPI has a valid SSL profile." + }, { "name": "dc2-leaf2a", "test": "VerifyAPIHttpsSSL", @@ -994,6 +1107,142 @@ "description": "Verifies if the eAPI has a valid SSL profile.", "custom_field": "eAPI HTTPS SSL Profile: eAPI_SSL_Profile" }, + { + "name": "dc2-leaf2a", + "test": "VerifyAPIHttpStatus", + "categories": [ + "security" + ], + "description": "Verifies if eAPI HTTP server is disabled globally." + }, + { + "name": "dc2-leaf2a", + "test": "VerifyAPIIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF." + }, + { + "name": "dc2-leaf2a", + "test": "VerifyAPIIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF." + }, + { + "name": "dc2-leaf2a", + "test": "VerifyAPISSLCertificate", + "categories": [ + "security" + ], + "description": "Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size." + }, + { + "name": "dc2-leaf2a", + "test": "VerifyBannerLogin", + "categories": [ + "security" + ], + "description": "Verifies the login banner of a device." + }, + { + "name": "dc2-leaf2a", + "test": "VerifyBannerMotd", + "categories": [ + "security" + ], + "description": "Verifies the motd banner of a device." + }, + { + "name": "dc2-leaf2a", + "test": "VerifyIPSecConnHealth", + "categories": [ + "security" + ], + "description": "Verifies all IPv4 security connections." + }, + { + "name": "dc2-leaf2a", + "test": "VerifyIPv4ACL", + "categories": [ + "security" + ], + "description": "Verifies the configuration of IPv4 ACLs." + }, + { + "name": "dc2-leaf2a", + "test": "VerifySpecificIPSecConn", + "categories": [ + "security" + ], + "description": "Verifies IPv4 security connections for a peer." + }, + { + "name": "dc2-leaf2a", + "test": "VerifySSHIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv4 ACL(s) configured." + }, + { + "name": "dc2-leaf2a", + "test": "VerifySSHIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv6 ACL(s) configured." + }, + { + "name": "dc2-leaf2a", + "test": "VerifySSHStatus", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent is disabled in the default VRF." + }, + { + "name": "dc2-leaf2a", + "test": "VerifyTelnetStatus", + "categories": [ + "security" + ], + "description": "Verifies if Telnet is disabled in the default VRF." + }, + { + "name": "dc2-leaf2a", + "test": "VerifyDNSLookup", + "categories": [ + "services" + ], + "description": "Verifies the DNS name to IP address resolution." + }, + { + "name": "dc2-leaf2a", + "test": "VerifyDNSServers", + "categories": [ + "services" + ], + "description": "Verifies if the DNS servers are correctly configured." + }, + { + "name": "dc2-leaf2a", + "test": "VerifyErrdisableRecovery", + "categories": [ + "services" + ], + "description": "Verifies the errdisable recovery reason, status, and interval." + }, + { + "name": "dc2-leaf2a", + "test": "VerifyHostname", + "categories": [ + "services" + ], + "description": "Verifies the hostname of a device." + }, { "name": "dc2-leaf2a", "test": "VerifySnmpIPv4Acl", @@ -1024,7 +1273,7 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed EOS version." + "description": "Verifies the EOS version of the device." }, { "name": "dc2-leaf2a", @@ -1032,7 +1281,7 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed TerminAttr version." + "description": "Verifies the TerminAttr version of the device." }, { "name": "dc2-leaf2a", @@ -1074,6 +1323,14 @@ ], "description": "Verifies the STP root priority for a provided list of VLAN or MST instance ID(s)." }, + { + "name": "dc2-leaf2a", + "test": "VerifyStunClient", + "categories": [ + "stun" + ], + "description": "Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided." + }, { "name": "dc2-leaf2a", "test": "VerifyAgentLogs", @@ -1145,5 +1402,13 @@ "system" ], "description": "Verifies the device uptime." + }, + { + "name": "dc2-leaf2a", + "test": "VerifyVlanInternalPolicy", + "categories": [ + "vlan" + ], + "description": "Verifies the VLAN internal allocation policy and the range of VLANs." } ] \ No newline at end of file diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-leaf2b-results.json b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-leaf2b-results.json index 53e5fbbc166..f2cbead3208 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-leaf2b-results.json +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-leaf2b-results.json @@ -206,6 +206,24 @@ "description": "Test the network reachability to one or many destination IP(s).", "custom_field": "Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2)" }, + { + "name": "dc2-leaf2b", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5)" + }, + { + "name": "dc2-leaf2b", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.255.128.16) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6)" + }, { "name": "dc2-leaf2b", "test": "VerifyReachability", @@ -318,19 +336,33 @@ "name": "dc2-leaf2b", "test": "VerifyFieldNotice44Resolution", "categories": [ - "field notices", - "software" + "field notices" ], - "description": "Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization)" + "description": "Verifies that the device is using the correct Aboot version per FN0044." }, { "name": "dc2-leaf2b", "test": "VerifyFieldNotice72Resolution", "categories": [ - "field notices", - "software" + "field notices" ], - "description": "Verifies if the device has exposeure to FN72, and if the issue has been mitigated" + "description": "Verifies if the device is exposed to FN0072, and if the issue has been mitigated." + }, + { + "name": "dc2-leaf2b", + "test": "VerifyGreenT", + "categories": [ + "greent" + ], + "description": "Verifies if a GreenT policy is created." + }, + { + "name": "dc2-leaf2b", + "test": "VerifyGreenTCounters", + "categories": [ + "greent" + ], + "description": "Verifies if the GreenT counters are incremented." }, { "name": "dc2-leaf2b", @@ -338,7 +370,7 @@ "categories": [ "hardware" ], - "description": "Verifies there are no adverse drops on DCS7280E and DCS7500E" + "description": "Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches." }, { "name": "dc2-leaf2b", @@ -630,6 +662,14 @@ "description": "Verifies the status of the provided interfaces.", "custom_field": "Interface Vxlan1 = 'up'" }, + { + "name": "dc2-leaf2b", + "test": "VerifyLANZ", + "categories": [ + "lanz" + ], + "description": "Verifies if LANZ is enabled." + }, { "name": "dc2-leaf2b", "test": "VerifyLoggingAccounting", @@ -638,6 +678,14 @@ ], "description": "Verifies if AAA accounting logs are generated." }, + { + "name": "dc2-leaf2b", + "test": "VerifyLoggingErrors", + "categories": [ + "logging" + ], + "description": "Verifies there are no syslog messages with a severity of ERRORS or higher." + }, { "name": "dc2-leaf2b", "test": "VerifyLoggingHostname", @@ -684,15 +732,7 @@ "categories": [ "logging" ], - "description": "Verifies if logs are generated with the appropriate timestamp." - }, - { - "name": "dc2-leaf2b", - "test": "VerifyLoggingWarning", - "categories": [ - "logging" - ], - "description": "This test verifies there are no syslog messages with a severity of ERRORS or higher." + "description": "Verifies if logs are generated with the riate timestamp." }, { "name": "dc2-leaf2b", @@ -746,8 +786,7 @@ "name": "dc2-leaf2b", "test": "VerifyIGMPSnoopingGlobal", "categories": [ - "multicast", - "igmp" + "multicast" ], "description": "Verifies the IGMP snooping global configuration." }, @@ -755,10 +794,49 @@ "name": "dc2-leaf2b", "test": "VerifyIGMPSnoopingVlans", "categories": [ - "multicast", - "igmp" + "multicast" ], - "description": "Verifies the IGMP snooping configuration for some VLANs." + "description": "Verifies the IGMP snooping status for the provided VLANs." + }, + { + "name": "dc2-leaf2b", + "test": "VerifyPtpGMStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is locked to a valid PTP Grandmaster." + }, + { + "name": "dc2-leaf2b", + "test": "VerifyPtpLockStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device was locked to the upstream PTP GM in the last minute." + }, + { + "name": "dc2-leaf2b", + "test": "VerifyPtpModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is configured as a PTP Boundary Clock." + }, + { + "name": "dc2-leaf2b", + "test": "VerifyPtpOffset", + "categories": [ + "ptp" + ], + "description": "Verifies that the PTP timing offset is within +/- 1000ns from the master clock." + }, + { + "name": "dc2-leaf2b", + "test": "VerifyPtpPortModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies the PTP interfaces state." }, { "name": "dc2-leaf2b", @@ -949,6 +1027,41 @@ "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", "custom_field": "Route: 10.255.2.2 - Peer: dc1-wan2" }, + { + "name": "dc2-leaf2b", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.33.0.5 - Peer: dc1-svc-leaf1a" + }, + { + "name": "dc2-leaf2b", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.33.0.6 - Peer: dc1-svc-leaf1b" + }, + { + "name": "dc2-leaf2b", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.33.1.5 - Peer: dc1-svc-leaf1a" + }, + { + "name": "dc2-leaf2b", + "test": "VerifyAPIHttpsSSL", + "categories": [ + "security" + ], + "description": "Verifies if the eAPI has a valid SSL profile." + }, { "name": "dc2-leaf2b", "test": "VerifyAPIHttpsSSL", @@ -958,6 +1071,142 @@ "description": "Verifies if the eAPI has a valid SSL profile.", "custom_field": "eAPI HTTPS SSL Profile: eAPI_SSL_Profile" }, + { + "name": "dc2-leaf2b", + "test": "VerifyAPIHttpStatus", + "categories": [ + "security" + ], + "description": "Verifies if eAPI HTTP server is disabled globally." + }, + { + "name": "dc2-leaf2b", + "test": "VerifyAPIIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF." + }, + { + "name": "dc2-leaf2b", + "test": "VerifyAPIIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF." + }, + { + "name": "dc2-leaf2b", + "test": "VerifyAPISSLCertificate", + "categories": [ + "security" + ], + "description": "Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size." + }, + { + "name": "dc2-leaf2b", + "test": "VerifyBannerLogin", + "categories": [ + "security" + ], + "description": "Verifies the login banner of a device." + }, + { + "name": "dc2-leaf2b", + "test": "VerifyBannerMotd", + "categories": [ + "security" + ], + "description": "Verifies the motd banner of a device." + }, + { + "name": "dc2-leaf2b", + "test": "VerifyIPSecConnHealth", + "categories": [ + "security" + ], + "description": "Verifies all IPv4 security connections." + }, + { + "name": "dc2-leaf2b", + "test": "VerifyIPv4ACL", + "categories": [ + "security" + ], + "description": "Verifies the configuration of IPv4 ACLs." + }, + { + "name": "dc2-leaf2b", + "test": "VerifySpecificIPSecConn", + "categories": [ + "security" + ], + "description": "Verifies IPv4 security connections for a peer." + }, + { + "name": "dc2-leaf2b", + "test": "VerifySSHIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv4 ACL(s) configured." + }, + { + "name": "dc2-leaf2b", + "test": "VerifySSHIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv6 ACL(s) configured." + }, + { + "name": "dc2-leaf2b", + "test": "VerifySSHStatus", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent is disabled in the default VRF." + }, + { + "name": "dc2-leaf2b", + "test": "VerifyTelnetStatus", + "categories": [ + "security" + ], + "description": "Verifies if Telnet is disabled in the default VRF." + }, + { + "name": "dc2-leaf2b", + "test": "VerifyDNSLookup", + "categories": [ + "services" + ], + "description": "Verifies the DNS name to IP address resolution." + }, + { + "name": "dc2-leaf2b", + "test": "VerifyDNSServers", + "categories": [ + "services" + ], + "description": "Verifies if the DNS servers are correctly configured." + }, + { + "name": "dc2-leaf2b", + "test": "VerifyErrdisableRecovery", + "categories": [ + "services" + ], + "description": "Verifies the errdisable recovery reason, status, and interval." + }, + { + "name": "dc2-leaf2b", + "test": "VerifyHostname", + "categories": [ + "services" + ], + "description": "Verifies the hostname of a device." + }, { "name": "dc2-leaf2b", "test": "VerifySnmpIPv4Acl", @@ -988,7 +1237,7 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed EOS version." + "description": "Verifies the EOS version of the device." }, { "name": "dc2-leaf2b", @@ -996,7 +1245,7 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed TerminAttr version." + "description": "Verifies the TerminAttr version of the device." }, { "name": "dc2-leaf2b", @@ -1038,6 +1287,14 @@ ], "description": "Verifies the STP root priority for a provided list of VLAN or MST instance ID(s)." }, + { + "name": "dc2-leaf2b", + "test": "VerifyStunClient", + "categories": [ + "stun" + ], + "description": "Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided." + }, { "name": "dc2-leaf2b", "test": "VerifyAgentLogs", @@ -1109,5 +1366,13 @@ "system" ], "description": "Verifies the device uptime." + }, + { + "name": "dc2-leaf2b", + "test": "VerifyVlanInternalPolicy", + "categories": [ + "vlan" + ], + "description": "Verifies the VLAN internal allocation policy and the range of VLANs." } ] \ No newline at end of file diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-leaf2c-results.json b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-leaf2c-results.json index a6ecd2a2f83..c172c7ecbda 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-leaf2c-results.json +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-leaf2c-results.json @@ -93,19 +93,33 @@ "name": "dc2-leaf2c", "test": "VerifyFieldNotice44Resolution", "categories": [ - "field notices", - "software" + "field notices" ], - "description": "Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization)" + "description": "Verifies that the device is using the correct Aboot version per FN0044." }, { "name": "dc2-leaf2c", "test": "VerifyFieldNotice72Resolution", "categories": [ - "field notices", - "software" + "field notices" + ], + "description": "Verifies if the device is exposed to FN0072, and if the issue has been mitigated." + }, + { + "name": "dc2-leaf2c", + "test": "VerifyGreenT", + "categories": [ + "greent" + ], + "description": "Verifies if a GreenT policy is created." + }, + { + "name": "dc2-leaf2c", + "test": "VerifyGreenTCounters", + "categories": [ + "greent" ], - "description": "Verifies if the device has exposeure to FN72, and if the issue has been mitigated" + "description": "Verifies if the GreenT counters are incremented." }, { "name": "dc2-leaf2c", @@ -113,7 +127,7 @@ "categories": [ "hardware" ], - "description": "Verifies there are no adverse drops on DCS7280E and DCS7500E" + "description": "Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches." }, { "name": "dc2-leaf2c", @@ -234,6 +248,62 @@ "description": "Verifies the status of the provided interfaces.", "custom_field": "Interface Port-Channel1 - DC2_L3_LEAF2_Po8 = 'up'" }, + { + "name": "dc2-leaf2c", + "test": "VerifyLANZ", + "categories": [ + "lanz" + ], + "description": "Verifies if LANZ is enabled." + }, + { + "name": "dc2-leaf2c", + "test": "VerifyPtpGMStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is locked to a valid PTP Grandmaster." + }, + { + "name": "dc2-leaf2c", + "test": "VerifyPtpLockStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device was locked to the upstream PTP GM in the last minute." + }, + { + "name": "dc2-leaf2c", + "test": "VerifyPtpModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is configured as a PTP Boundary Clock." + }, + { + "name": "dc2-leaf2c", + "test": "VerifyPtpOffset", + "categories": [ + "ptp" + ], + "description": "Verifies that the PTP timing offset is within +/- 1000ns from the master clock." + }, + { + "name": "dc2-leaf2c", + "test": "VerifyPtpPortModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies the PTP interfaces state." + }, + { + "name": "dc2-leaf2c", + "test": "VerifyAPIHttpsSSL", + "categories": [ + "security" + ], + "description": "Verifies if the eAPI has a valid SSL profile." + }, { "name": "dc2-leaf2c", "test": "VerifyAPIHttpsSSL", @@ -243,6 +313,142 @@ "description": "Verifies if the eAPI has a valid SSL profile.", "custom_field": "eAPI HTTPS SSL Profile: eAPI_SSL_Profile" }, + { + "name": "dc2-leaf2c", + "test": "VerifyAPIHttpStatus", + "categories": [ + "security" + ], + "description": "Verifies if eAPI HTTP server is disabled globally." + }, + { + "name": "dc2-leaf2c", + "test": "VerifyAPIIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF." + }, + { + "name": "dc2-leaf2c", + "test": "VerifyAPIIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF." + }, + { + "name": "dc2-leaf2c", + "test": "VerifyAPISSLCertificate", + "categories": [ + "security" + ], + "description": "Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size." + }, + { + "name": "dc2-leaf2c", + "test": "VerifyBannerLogin", + "categories": [ + "security" + ], + "description": "Verifies the login banner of a device." + }, + { + "name": "dc2-leaf2c", + "test": "VerifyBannerMotd", + "categories": [ + "security" + ], + "description": "Verifies the motd banner of a device." + }, + { + "name": "dc2-leaf2c", + "test": "VerifyIPSecConnHealth", + "categories": [ + "security" + ], + "description": "Verifies all IPv4 security connections." + }, + { + "name": "dc2-leaf2c", + "test": "VerifyIPv4ACL", + "categories": [ + "security" + ], + "description": "Verifies the configuration of IPv4 ACLs." + }, + { + "name": "dc2-leaf2c", + "test": "VerifySpecificIPSecConn", + "categories": [ + "security" + ], + "description": "Verifies IPv4 security connections for a peer." + }, + { + "name": "dc2-leaf2c", + "test": "VerifySSHIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv4 ACL(s) configured." + }, + { + "name": "dc2-leaf2c", + "test": "VerifySSHIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv6 ACL(s) configured." + }, + { + "name": "dc2-leaf2c", + "test": "VerifySSHStatus", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent is disabled in the default VRF." + }, + { + "name": "dc2-leaf2c", + "test": "VerifyTelnetStatus", + "categories": [ + "security" + ], + "description": "Verifies if Telnet is disabled in the default VRF." + }, + { + "name": "dc2-leaf2c", + "test": "VerifyDNSLookup", + "categories": [ + "services" + ], + "description": "Verifies the DNS name to IP address resolution." + }, + { + "name": "dc2-leaf2c", + "test": "VerifyDNSServers", + "categories": [ + "services" + ], + "description": "Verifies if the DNS servers are correctly configured." + }, + { + "name": "dc2-leaf2c", + "test": "VerifyErrdisableRecovery", + "categories": [ + "services" + ], + "description": "Verifies the errdisable recovery reason, status, and interval." + }, + { + "name": "dc2-leaf2c", + "test": "VerifyHostname", + "categories": [ + "services" + ], + "description": "Verifies the hostname of a device." + }, { "name": "dc2-leaf2c", "test": "VerifySnmpIPv4Acl", @@ -273,7 +479,7 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed EOS version." + "description": "Verifies the EOS version of the device." }, { "name": "dc2-leaf2c", @@ -281,7 +487,15 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed TerminAttr version." + "description": "Verifies the TerminAttr version of the device." + }, + { + "name": "dc2-leaf2c", + "test": "VerifyStunClient", + "categories": [ + "stun" + ], + "description": "Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided." }, { "name": "dc2-leaf2c", @@ -354,5 +568,13 @@ "system" ], "description": "Verifies the device uptime." + }, + { + "name": "dc2-leaf2c", + "test": "VerifyVlanInternalPolicy", + "categories": [ + "vlan" + ], + "description": "Verifies the VLAN internal allocation policy and the range of VLANs." } ] \ No newline at end of file diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-leaf3a.arista.com-results.json b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-leaf3a.arista.com-results.json index e54684d9c0e..c6c13acddec 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-leaf3a.arista.com-results.json +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-leaf3a.arista.com-results.json @@ -197,6 +197,24 @@ "description": "Test the network reachability to one or many destination IP(s).", "custom_field": "Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2)" }, + { + "name": "dc2-leaf3a.arista.com", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5)" + }, + { + "name": "dc2-leaf3a.arista.com", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.255.128.17) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6)" + }, { "name": "dc2-leaf3a.arista.com", "test": "VerifyReachability", @@ -309,19 +327,33 @@ "name": "dc2-leaf3a.arista.com", "test": "VerifyFieldNotice44Resolution", "categories": [ - "field notices", - "software" + "field notices" ], - "description": "Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization)" + "description": "Verifies that the device is using the correct Aboot version per FN0044." }, { "name": "dc2-leaf3a.arista.com", "test": "VerifyFieldNotice72Resolution", "categories": [ - "field notices", - "software" + "field notices" ], - "description": "Verifies if the device has exposeure to FN72, and if the issue has been mitigated" + "description": "Verifies if the device is exposed to FN0072, and if the issue has been mitigated." + }, + { + "name": "dc2-leaf3a.arista.com", + "test": "VerifyGreenT", + "categories": [ + "greent" + ], + "description": "Verifies if a GreenT policy is created." + }, + { + "name": "dc2-leaf3a.arista.com", + "test": "VerifyGreenTCounters", + "categories": [ + "greent" + ], + "description": "Verifies if the GreenT counters are incremented." }, { "name": "dc2-leaf3a.arista.com", @@ -329,7 +361,7 @@ "categories": [ "hardware" ], - "description": "Verifies there are no adverse drops on DCS7280E and DCS7500E" + "description": "Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches." }, { "name": "dc2-leaf3a.arista.com", @@ -594,6 +626,14 @@ "description": "Verifies the status of the provided interfaces.", "custom_field": "Interface Vxlan1 = 'up'" }, + { + "name": "dc2-leaf3a.arista.com", + "test": "VerifyLANZ", + "categories": [ + "lanz" + ], + "description": "Verifies if LANZ is enabled." + }, { "name": "dc2-leaf3a.arista.com", "test": "VerifyLoggingAccounting", @@ -602,6 +642,14 @@ ], "description": "Verifies if AAA accounting logs are generated." }, + { + "name": "dc2-leaf3a.arista.com", + "test": "VerifyLoggingErrors", + "categories": [ + "logging" + ], + "description": "Verifies there are no syslog messages with a severity of ERRORS or higher." + }, { "name": "dc2-leaf3a.arista.com", "test": "VerifyLoggingHostname", @@ -648,15 +696,7 @@ "categories": [ "logging" ], - "description": "Verifies if logs are generated with the appropriate timestamp." - }, - { - "name": "dc2-leaf3a.arista.com", - "test": "VerifyLoggingWarning", - "categories": [ - "logging" - ], - "description": "This test verifies there are no syslog messages with a severity of ERRORS or higher." + "description": "Verifies if logs are generated with the riate timestamp." }, { "name": "dc2-leaf3a.arista.com", @@ -710,8 +750,7 @@ "name": "dc2-leaf3a.arista.com", "test": "VerifyIGMPSnoopingGlobal", "categories": [ - "multicast", - "igmp" + "multicast" ], "description": "Verifies the IGMP snooping global configuration." }, @@ -719,10 +758,49 @@ "name": "dc2-leaf3a.arista.com", "test": "VerifyIGMPSnoopingVlans", "categories": [ - "multicast", - "igmp" + "multicast" ], - "description": "Verifies the IGMP snooping configuration for some VLANs." + "description": "Verifies the IGMP snooping status for the provided VLANs." + }, + { + "name": "dc2-leaf3a.arista.com", + "test": "VerifyPtpGMStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is locked to a valid PTP Grandmaster." + }, + { + "name": "dc2-leaf3a.arista.com", + "test": "VerifyPtpLockStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device was locked to the upstream PTP GM in the last minute." + }, + { + "name": "dc2-leaf3a.arista.com", + "test": "VerifyPtpModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is configured as a PTP Boundary Clock." + }, + { + "name": "dc2-leaf3a.arista.com", + "test": "VerifyPtpOffset", + "categories": [ + "ptp" + ], + "description": "Verifies that the PTP timing offset is within +/- 1000ns from the master clock." + }, + { + "name": "dc2-leaf3a.arista.com", + "test": "VerifyPtpPortModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies the PTP interfaces state." }, { "name": "dc2-leaf3a.arista.com", @@ -913,6 +991,41 @@ "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", "custom_field": "Route: 10.255.2.2 - Peer: dc1-wan2" }, + { + "name": "dc2-leaf3a.arista.com", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.33.0.5 - Peer: dc1-svc-leaf1a" + }, + { + "name": "dc2-leaf3a.arista.com", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.33.0.6 - Peer: dc1-svc-leaf1b" + }, + { + "name": "dc2-leaf3a.arista.com", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.33.1.5 - Peer: dc1-svc-leaf1a" + }, + { + "name": "dc2-leaf3a.arista.com", + "test": "VerifyAPIHttpsSSL", + "categories": [ + "security" + ], + "description": "Verifies if the eAPI has a valid SSL profile." + }, { "name": "dc2-leaf3a.arista.com", "test": "VerifyAPIHttpsSSL", @@ -922,6 +1035,142 @@ "description": "Verifies if the eAPI has a valid SSL profile.", "custom_field": "eAPI HTTPS SSL Profile: eAPI_SSL_Profile" }, + { + "name": "dc2-leaf3a.arista.com", + "test": "VerifyAPIHttpStatus", + "categories": [ + "security" + ], + "description": "Verifies if eAPI HTTP server is disabled globally." + }, + { + "name": "dc2-leaf3a.arista.com", + "test": "VerifyAPIIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF." + }, + { + "name": "dc2-leaf3a.arista.com", + "test": "VerifyAPIIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF." + }, + { + "name": "dc2-leaf3a.arista.com", + "test": "VerifyAPISSLCertificate", + "categories": [ + "security" + ], + "description": "Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size." + }, + { + "name": "dc2-leaf3a.arista.com", + "test": "VerifyBannerLogin", + "categories": [ + "security" + ], + "description": "Verifies the login banner of a device." + }, + { + "name": "dc2-leaf3a.arista.com", + "test": "VerifyBannerMotd", + "categories": [ + "security" + ], + "description": "Verifies the motd banner of a device." + }, + { + "name": "dc2-leaf3a.arista.com", + "test": "VerifyIPSecConnHealth", + "categories": [ + "security" + ], + "description": "Verifies all IPv4 security connections." + }, + { + "name": "dc2-leaf3a.arista.com", + "test": "VerifyIPv4ACL", + "categories": [ + "security" + ], + "description": "Verifies the configuration of IPv4 ACLs." + }, + { + "name": "dc2-leaf3a.arista.com", + "test": "VerifySpecificIPSecConn", + "categories": [ + "security" + ], + "description": "Verifies IPv4 security connections for a peer." + }, + { + "name": "dc2-leaf3a.arista.com", + "test": "VerifySSHIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv4 ACL(s) configured." + }, + { + "name": "dc2-leaf3a.arista.com", + "test": "VerifySSHIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv6 ACL(s) configured." + }, + { + "name": "dc2-leaf3a.arista.com", + "test": "VerifySSHStatus", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent is disabled in the default VRF." + }, + { + "name": "dc2-leaf3a.arista.com", + "test": "VerifyTelnetStatus", + "categories": [ + "security" + ], + "description": "Verifies if Telnet is disabled in the default VRF." + }, + { + "name": "dc2-leaf3a.arista.com", + "test": "VerifyDNSLookup", + "categories": [ + "services" + ], + "description": "Verifies the DNS name to IP address resolution." + }, + { + "name": "dc2-leaf3a.arista.com", + "test": "VerifyDNSServers", + "categories": [ + "services" + ], + "description": "Verifies if the DNS servers are correctly configured." + }, + { + "name": "dc2-leaf3a.arista.com", + "test": "VerifyErrdisableRecovery", + "categories": [ + "services" + ], + "description": "Verifies the errdisable recovery reason, status, and interval." + }, + { + "name": "dc2-leaf3a.arista.com", + "test": "VerifyHostname", + "categories": [ + "services" + ], + "description": "Verifies the hostname of a device." + }, { "name": "dc2-leaf3a.arista.com", "test": "VerifySnmpIPv4Acl", @@ -952,7 +1201,7 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed EOS version." + "description": "Verifies the EOS version of the device." }, { "name": "dc2-leaf3a.arista.com", @@ -960,7 +1209,7 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed TerminAttr version." + "description": "Verifies the TerminAttr version of the device." }, { "name": "dc2-leaf3a.arista.com", @@ -1002,6 +1251,14 @@ ], "description": "Verifies the STP root priority for a provided list of VLAN or MST instance ID(s)." }, + { + "name": "dc2-leaf3a.arista.com", + "test": "VerifyStunClient", + "categories": [ + "stun" + ], + "description": "Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided." + }, { "name": "dc2-leaf3a.arista.com", "test": "VerifyAgentLogs", @@ -1073,5 +1330,13 @@ "system" ], "description": "Verifies the device uptime." + }, + { + "name": "dc2-leaf3a.arista.com", + "test": "VerifyVlanInternalPolicy", + "categories": [ + "vlan" + ], + "description": "Verifies the VLAN internal allocation policy and the range of VLANs." } ] \ No newline at end of file diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-leaf3b.arista.com-results.json b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-leaf3b.arista.com-results.json index fcebc6f26b1..770f1473fb2 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-leaf3b.arista.com-results.json +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-leaf3b.arista.com-results.json @@ -197,6 +197,24 @@ "description": "Test the network reachability to one or many destination IP(s).", "custom_field": "Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-spine2 Loopback0 (IP: 10.255.0.2)" }, + { + "name": "dc2-leaf3b.arista.com", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-svc-leaf1a Loopback0 (IP: 10.33.0.5)" + }, + { + "name": "dc2-leaf3b.arista.com", + "test": "VerifyReachability", + "categories": [ + "connectivity" + ], + "description": "Test the network reachability to one or many destination IP(s).", + "custom_field": "Source: Loopback0 (IP: 10.255.128.18) - Destination: dc1-svc-leaf1b Loopback0 (IP: 10.33.0.6)" + }, { "name": "dc2-leaf3b.arista.com", "test": "VerifyReachability", @@ -309,19 +327,33 @@ "name": "dc2-leaf3b.arista.com", "test": "VerifyFieldNotice44Resolution", "categories": [ - "field notices", - "software" + "field notices" ], - "description": "Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization)" + "description": "Verifies that the device is using the correct Aboot version per FN0044." }, { "name": "dc2-leaf3b.arista.com", "test": "VerifyFieldNotice72Resolution", "categories": [ - "field notices", - "software" + "field notices" ], - "description": "Verifies if the device has exposeure to FN72, and if the issue has been mitigated" + "description": "Verifies if the device is exposed to FN0072, and if the issue has been mitigated." + }, + { + "name": "dc2-leaf3b.arista.com", + "test": "VerifyGreenT", + "categories": [ + "greent" + ], + "description": "Verifies if a GreenT policy is created." + }, + { + "name": "dc2-leaf3b.arista.com", + "test": "VerifyGreenTCounters", + "categories": [ + "greent" + ], + "description": "Verifies if the GreenT counters are incremented." }, { "name": "dc2-leaf3b.arista.com", @@ -329,7 +361,7 @@ "categories": [ "hardware" ], - "description": "Verifies there are no adverse drops on DCS7280E and DCS7500E" + "description": "Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches." }, { "name": "dc2-leaf3b.arista.com", @@ -594,6 +626,14 @@ "description": "Verifies the status of the provided interfaces.", "custom_field": "Interface Vxlan1 = 'up'" }, + { + "name": "dc2-leaf3b.arista.com", + "test": "VerifyLANZ", + "categories": [ + "lanz" + ], + "description": "Verifies if LANZ is enabled." + }, { "name": "dc2-leaf3b.arista.com", "test": "VerifyLoggingAccounting", @@ -602,6 +642,14 @@ ], "description": "Verifies if AAA accounting logs are generated." }, + { + "name": "dc2-leaf3b.arista.com", + "test": "VerifyLoggingErrors", + "categories": [ + "logging" + ], + "description": "Verifies there are no syslog messages with a severity of ERRORS or higher." + }, { "name": "dc2-leaf3b.arista.com", "test": "VerifyLoggingHostname", @@ -648,15 +696,7 @@ "categories": [ "logging" ], - "description": "Verifies if logs are generated with the appropriate timestamp." - }, - { - "name": "dc2-leaf3b.arista.com", - "test": "VerifyLoggingWarning", - "categories": [ - "logging" - ], - "description": "This test verifies there are no syslog messages with a severity of ERRORS or higher." + "description": "Verifies if logs are generated with the riate timestamp." }, { "name": "dc2-leaf3b.arista.com", @@ -710,8 +750,7 @@ "name": "dc2-leaf3b.arista.com", "test": "VerifyIGMPSnoopingGlobal", "categories": [ - "multicast", - "igmp" + "multicast" ], "description": "Verifies the IGMP snooping global configuration." }, @@ -719,10 +758,49 @@ "name": "dc2-leaf3b.arista.com", "test": "VerifyIGMPSnoopingVlans", "categories": [ - "multicast", - "igmp" + "multicast" ], - "description": "Verifies the IGMP snooping configuration for some VLANs." + "description": "Verifies the IGMP snooping status for the provided VLANs." + }, + { + "name": "dc2-leaf3b.arista.com", + "test": "VerifyPtpGMStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is locked to a valid PTP Grandmaster." + }, + { + "name": "dc2-leaf3b.arista.com", + "test": "VerifyPtpLockStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device was locked to the upstream PTP GM in the last minute." + }, + { + "name": "dc2-leaf3b.arista.com", + "test": "VerifyPtpModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is configured as a PTP Boundary Clock." + }, + { + "name": "dc2-leaf3b.arista.com", + "test": "VerifyPtpOffset", + "categories": [ + "ptp" + ], + "description": "Verifies that the PTP timing offset is within +/- 1000ns from the master clock." + }, + { + "name": "dc2-leaf3b.arista.com", + "test": "VerifyPtpPortModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies the PTP interfaces state." }, { "name": "dc2-leaf3b.arista.com", @@ -913,6 +991,41 @@ "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", "custom_field": "Route: 10.255.2.2 - Peer: dc1-wan2" }, + { + "name": "dc2-leaf3b.arista.com", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.33.0.5 - Peer: dc1-svc-leaf1a" + }, + { + "name": "dc2-leaf3b.arista.com", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.33.0.6 - Peer: dc1-svc-leaf1b" + }, + { + "name": "dc2-leaf3b.arista.com", + "test": "VerifyRoutingTableEntry", + "categories": [ + "routing" + ], + "description": "Verifies that the provided routes are present in the routing table of a specified VRF.", + "custom_field": "Route: 10.33.1.5 - Peer: dc1-svc-leaf1a" + }, + { + "name": "dc2-leaf3b.arista.com", + "test": "VerifyAPIHttpsSSL", + "categories": [ + "security" + ], + "description": "Verifies if the eAPI has a valid SSL profile." + }, { "name": "dc2-leaf3b.arista.com", "test": "VerifyAPIHttpsSSL", @@ -922,6 +1035,142 @@ "description": "Verifies if the eAPI has a valid SSL profile.", "custom_field": "eAPI HTTPS SSL Profile: eAPI_SSL_Profile" }, + { + "name": "dc2-leaf3b.arista.com", + "test": "VerifyAPIHttpStatus", + "categories": [ + "security" + ], + "description": "Verifies if eAPI HTTP server is disabled globally." + }, + { + "name": "dc2-leaf3b.arista.com", + "test": "VerifyAPIIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF." + }, + { + "name": "dc2-leaf3b.arista.com", + "test": "VerifyAPIIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF." + }, + { + "name": "dc2-leaf3b.arista.com", + "test": "VerifyAPISSLCertificate", + "categories": [ + "security" + ], + "description": "Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size." + }, + { + "name": "dc2-leaf3b.arista.com", + "test": "VerifyBannerLogin", + "categories": [ + "security" + ], + "description": "Verifies the login banner of a device." + }, + { + "name": "dc2-leaf3b.arista.com", + "test": "VerifyBannerMotd", + "categories": [ + "security" + ], + "description": "Verifies the motd banner of a device." + }, + { + "name": "dc2-leaf3b.arista.com", + "test": "VerifyIPSecConnHealth", + "categories": [ + "security" + ], + "description": "Verifies all IPv4 security connections." + }, + { + "name": "dc2-leaf3b.arista.com", + "test": "VerifyIPv4ACL", + "categories": [ + "security" + ], + "description": "Verifies the configuration of IPv4 ACLs." + }, + { + "name": "dc2-leaf3b.arista.com", + "test": "VerifySpecificIPSecConn", + "categories": [ + "security" + ], + "description": "Verifies IPv4 security connections for a peer." + }, + { + "name": "dc2-leaf3b.arista.com", + "test": "VerifySSHIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv4 ACL(s) configured." + }, + { + "name": "dc2-leaf3b.arista.com", + "test": "VerifySSHIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv6 ACL(s) configured." + }, + { + "name": "dc2-leaf3b.arista.com", + "test": "VerifySSHStatus", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent is disabled in the default VRF." + }, + { + "name": "dc2-leaf3b.arista.com", + "test": "VerifyTelnetStatus", + "categories": [ + "security" + ], + "description": "Verifies if Telnet is disabled in the default VRF." + }, + { + "name": "dc2-leaf3b.arista.com", + "test": "VerifyDNSLookup", + "categories": [ + "services" + ], + "description": "Verifies the DNS name to IP address resolution." + }, + { + "name": "dc2-leaf3b.arista.com", + "test": "VerifyDNSServers", + "categories": [ + "services" + ], + "description": "Verifies if the DNS servers are correctly configured." + }, + { + "name": "dc2-leaf3b.arista.com", + "test": "VerifyErrdisableRecovery", + "categories": [ + "services" + ], + "description": "Verifies the errdisable recovery reason, status, and interval." + }, + { + "name": "dc2-leaf3b.arista.com", + "test": "VerifyHostname", + "categories": [ + "services" + ], + "description": "Verifies the hostname of a device." + }, { "name": "dc2-leaf3b.arista.com", "test": "VerifySnmpIPv4Acl", @@ -952,7 +1201,7 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed EOS version." + "description": "Verifies the EOS version of the device." }, { "name": "dc2-leaf3b.arista.com", @@ -960,7 +1209,7 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed TerminAttr version." + "description": "Verifies the TerminAttr version of the device." }, { "name": "dc2-leaf3b.arista.com", @@ -1002,6 +1251,14 @@ ], "description": "Verifies the STP root priority for a provided list of VLAN or MST instance ID(s)." }, + { + "name": "dc2-leaf3b.arista.com", + "test": "VerifyStunClient", + "categories": [ + "stun" + ], + "description": "Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided." + }, { "name": "dc2-leaf3b.arista.com", "test": "VerifyAgentLogs", @@ -1073,5 +1330,13 @@ "system" ], "description": "Verifies the device uptime." + }, + { + "name": "dc2-leaf3b.arista.com", + "test": "VerifyVlanInternalPolicy", + "categories": [ + "vlan" + ], + "description": "Verifies the VLAN internal allocation policy and the range of VLANs." } ] \ No newline at end of file diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-spine1-results.json b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-spine1-results.json index 7878b60f722..fbe16cbe76b 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-spine1-results.json +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-spine1-results.json @@ -291,19 +291,33 @@ "name": "dc2-spine1", "test": "VerifyFieldNotice44Resolution", "categories": [ - "field notices", - "software" + "field notices" ], - "description": "Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization)" + "description": "Verifies that the device is using the correct Aboot version per FN0044." }, { "name": "dc2-spine1", "test": "VerifyFieldNotice72Resolution", "categories": [ - "field notices", - "software" + "field notices" + ], + "description": "Verifies if the device is exposed to FN0072, and if the issue has been mitigated." + }, + { + "name": "dc2-spine1", + "test": "VerifyGreenT", + "categories": [ + "greent" + ], + "description": "Verifies if a GreenT policy is created." + }, + { + "name": "dc2-spine1", + "test": "VerifyGreenTCounters", + "categories": [ + "greent" ], - "description": "Verifies if the device has exposeure to FN72, and if the issue has been mitigated" + "description": "Verifies if the GreenT counters are incremented." }, { "name": "dc2-spine1", @@ -311,7 +325,7 @@ "categories": [ "hardware" ], - "description": "Verifies there are no adverse drops on DCS7280E and DCS7500E" + "description": "Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches." }, { "name": "dc2-spine1", @@ -459,6 +473,54 @@ "description": "Verifies the status of the provided interfaces.", "custom_field": "Interface Loopback0 - EVPN_Overlay_Peering = 'up'" }, + { + "name": "dc2-spine1", + "test": "VerifyLANZ", + "categories": [ + "lanz" + ], + "description": "Verifies if LANZ is enabled." + }, + { + "name": "dc2-spine1", + "test": "VerifyPtpGMStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is locked to a valid PTP Grandmaster." + }, + { + "name": "dc2-spine1", + "test": "VerifyPtpLockStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device was locked to the upstream PTP GM in the last minute." + }, + { + "name": "dc2-spine1", + "test": "VerifyPtpModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is configured as a PTP Boundary Clock." + }, + { + "name": "dc2-spine1", + "test": "VerifyPtpOffset", + "categories": [ + "ptp" + ], + "description": "Verifies that the PTP timing offset is within +/- 1000ns from the master clock." + }, + { + "name": "dc2-spine1", + "test": "VerifyPtpPortModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies the PTP interfaces state." + }, { "name": "dc2-spine1", "test": "VerifyRoutingProtocolModel", @@ -468,6 +530,14 @@ "description": "Verifies the configured routing protocol model.", "custom_field": "Routing protocol model: multi-agent" }, + { + "name": "dc2-spine1", + "test": "VerifyAPIHttpsSSL", + "categories": [ + "security" + ], + "description": "Verifies if the eAPI has a valid SSL profile." + }, { "name": "dc2-spine1", "test": "VerifyAPIHttpsSSL", @@ -477,6 +547,142 @@ "description": "Verifies if the eAPI has a valid SSL profile.", "custom_field": "eAPI HTTPS SSL Profile: eAPI_SSL_Profile" }, + { + "name": "dc2-spine1", + "test": "VerifyAPIHttpStatus", + "categories": [ + "security" + ], + "description": "Verifies if eAPI HTTP server is disabled globally." + }, + { + "name": "dc2-spine1", + "test": "VerifyAPIIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF." + }, + { + "name": "dc2-spine1", + "test": "VerifyAPIIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF." + }, + { + "name": "dc2-spine1", + "test": "VerifyAPISSLCertificate", + "categories": [ + "security" + ], + "description": "Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size." + }, + { + "name": "dc2-spine1", + "test": "VerifyBannerLogin", + "categories": [ + "security" + ], + "description": "Verifies the login banner of a device." + }, + { + "name": "dc2-spine1", + "test": "VerifyBannerMotd", + "categories": [ + "security" + ], + "description": "Verifies the motd banner of a device." + }, + { + "name": "dc2-spine1", + "test": "VerifyIPSecConnHealth", + "categories": [ + "security" + ], + "description": "Verifies all IPv4 security connections." + }, + { + "name": "dc2-spine1", + "test": "VerifyIPv4ACL", + "categories": [ + "security" + ], + "description": "Verifies the configuration of IPv4 ACLs." + }, + { + "name": "dc2-spine1", + "test": "VerifySpecificIPSecConn", + "categories": [ + "security" + ], + "description": "Verifies IPv4 security connections for a peer." + }, + { + "name": "dc2-spine1", + "test": "VerifySSHIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv4 ACL(s) configured." + }, + { + "name": "dc2-spine1", + "test": "VerifySSHIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv6 ACL(s) configured." + }, + { + "name": "dc2-spine1", + "test": "VerifySSHStatus", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent is disabled in the default VRF." + }, + { + "name": "dc2-spine1", + "test": "VerifyTelnetStatus", + "categories": [ + "security" + ], + "description": "Verifies if Telnet is disabled in the default VRF." + }, + { + "name": "dc2-spine1", + "test": "VerifyDNSLookup", + "categories": [ + "services" + ], + "description": "Verifies the DNS name to IP address resolution." + }, + { + "name": "dc2-spine1", + "test": "VerifyDNSServers", + "categories": [ + "services" + ], + "description": "Verifies if the DNS servers are correctly configured." + }, + { + "name": "dc2-spine1", + "test": "VerifyErrdisableRecovery", + "categories": [ + "services" + ], + "description": "Verifies the errdisable recovery reason, status, and interval." + }, + { + "name": "dc2-spine1", + "test": "VerifyHostname", + "categories": [ + "services" + ], + "description": "Verifies the hostname of a device." + }, { "name": "dc2-spine1", "test": "VerifySnmpIPv4Acl", @@ -507,7 +713,7 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed EOS version." + "description": "Verifies the EOS version of the device." }, { "name": "dc2-spine1", @@ -515,7 +721,15 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed TerminAttr version." + "description": "Verifies the TerminAttr version of the device." + }, + { + "name": "dc2-spine1", + "test": "VerifyStunClient", + "categories": [ + "stun" + ], + "description": "Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided." }, { "name": "dc2-spine1", @@ -588,5 +802,13 @@ "system" ], "description": "Verifies the device uptime." + }, + { + "name": "dc2-spine1", + "test": "VerifyVlanInternalPolicy", + "categories": [ + "vlan" + ], + "description": "Verifies the VLAN internal allocation policy and the range of VLANs." } ] \ No newline at end of file diff --git a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-spine2-results.json b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-spine2-results.json index 9f80bc971fe..9a5b18bb9e0 100644 --- a/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-spine2-results.json +++ b/ansible_collections/arista/avd/molecule/eos_validate_state/reports/test_results/dc2-spine2-results.json @@ -291,19 +291,33 @@ "name": "dc2-spine2", "test": "VerifyFieldNotice44Resolution", "categories": [ - "field notices", - "software" + "field notices" ], - "description": "Verifies the device is using an Aboot version that fix the bug discussed in the field notice 44 (Aboot manages system settings prior to EOS initialization)" + "description": "Verifies that the device is using the correct Aboot version per FN0044." }, { "name": "dc2-spine2", "test": "VerifyFieldNotice72Resolution", "categories": [ - "field notices", - "software" + "field notices" + ], + "description": "Verifies if the device is exposed to FN0072, and if the issue has been mitigated." + }, + { + "name": "dc2-spine2", + "test": "VerifyGreenT", + "categories": [ + "greent" + ], + "description": "Verifies if a GreenT policy is created." + }, + { + "name": "dc2-spine2", + "test": "VerifyGreenTCounters", + "categories": [ + "greent" ], - "description": "Verifies if the device has exposeure to FN72, and if the issue has been mitigated" + "description": "Verifies if the GreenT counters are incremented." }, { "name": "dc2-spine2", @@ -311,7 +325,7 @@ "categories": [ "hardware" ], - "description": "Verifies there are no adverse drops on DCS7280E and DCS7500E" + "description": "Verifies there are no adverse drops on DCS-7280 and DCS-7500 family switches." }, { "name": "dc2-spine2", @@ -459,6 +473,54 @@ "description": "Verifies the status of the provided interfaces.", "custom_field": "Interface Loopback0 - EVPN_Overlay_Peering = 'up'" }, + { + "name": "dc2-spine2", + "test": "VerifyLANZ", + "categories": [ + "lanz" + ], + "description": "Verifies if LANZ is enabled." + }, + { + "name": "dc2-spine2", + "test": "VerifyPtpGMStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is locked to a valid PTP Grandmaster." + }, + { + "name": "dc2-spine2", + "test": "VerifyPtpLockStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device was locked to the upstream PTP GM in the last minute." + }, + { + "name": "dc2-spine2", + "test": "VerifyPtpModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies that the device is configured as a PTP Boundary Clock." + }, + { + "name": "dc2-spine2", + "test": "VerifyPtpOffset", + "categories": [ + "ptp" + ], + "description": "Verifies that the PTP timing offset is within +/- 1000ns from the master clock." + }, + { + "name": "dc2-spine2", + "test": "VerifyPtpPortModeStatus", + "categories": [ + "ptp" + ], + "description": "Verifies the PTP interfaces state." + }, { "name": "dc2-spine2", "test": "VerifyRoutingProtocolModel", @@ -468,6 +530,14 @@ "description": "Verifies the configured routing protocol model.", "custom_field": "Routing protocol model: multi-agent" }, + { + "name": "dc2-spine2", + "test": "VerifyAPIHttpsSSL", + "categories": [ + "security" + ], + "description": "Verifies if the eAPI has a valid SSL profile." + }, { "name": "dc2-spine2", "test": "VerifyAPIHttpsSSL", @@ -477,6 +547,142 @@ "description": "Verifies if the eAPI has a valid SSL profile.", "custom_field": "eAPI HTTPS SSL Profile: eAPI_SSL_Profile" }, + { + "name": "dc2-spine2", + "test": "VerifyAPIHttpStatus", + "categories": [ + "security" + ], + "description": "Verifies if eAPI HTTP server is disabled globally." + }, + { + "name": "dc2-spine2", + "test": "VerifyAPIIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv4 ACL(s) configured for a specified VRF." + }, + { + "name": "dc2-spine2", + "test": "VerifyAPIIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if eAPI has the right number IPv6 ACL(s) configured for a specified VRF." + }, + { + "name": "dc2-spine2", + "test": "VerifyAPISSLCertificate", + "categories": [ + "security" + ], + "description": "Verifies the eAPI SSL certificate expiry, common subject name, encryption algorithm and key size." + }, + { + "name": "dc2-spine2", + "test": "VerifyBannerLogin", + "categories": [ + "security" + ], + "description": "Verifies the login banner of a device." + }, + { + "name": "dc2-spine2", + "test": "VerifyBannerMotd", + "categories": [ + "security" + ], + "description": "Verifies the motd banner of a device." + }, + { + "name": "dc2-spine2", + "test": "VerifyIPSecConnHealth", + "categories": [ + "security" + ], + "description": "Verifies all IPv4 security connections." + }, + { + "name": "dc2-spine2", + "test": "VerifyIPv4ACL", + "categories": [ + "security" + ], + "description": "Verifies the configuration of IPv4 ACLs." + }, + { + "name": "dc2-spine2", + "test": "VerifySpecificIPSecConn", + "categories": [ + "security" + ], + "description": "Verifies IPv4 security connections for a peer." + }, + { + "name": "dc2-spine2", + "test": "VerifySSHIPv4Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv4 ACL(s) configured." + }, + { + "name": "dc2-spine2", + "test": "VerifySSHIPv6Acl", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent has IPv6 ACL(s) configured." + }, + { + "name": "dc2-spine2", + "test": "VerifySSHStatus", + "categories": [ + "security" + ], + "description": "Verifies if the SSHD agent is disabled in the default VRF." + }, + { + "name": "dc2-spine2", + "test": "VerifyTelnetStatus", + "categories": [ + "security" + ], + "description": "Verifies if Telnet is disabled in the default VRF." + }, + { + "name": "dc2-spine2", + "test": "VerifyDNSLookup", + "categories": [ + "services" + ], + "description": "Verifies the DNS name to IP address resolution." + }, + { + "name": "dc2-spine2", + "test": "VerifyDNSServers", + "categories": [ + "services" + ], + "description": "Verifies if the DNS servers are correctly configured." + }, + { + "name": "dc2-spine2", + "test": "VerifyErrdisableRecovery", + "categories": [ + "services" + ], + "description": "Verifies the errdisable recovery reason, status, and interval." + }, + { + "name": "dc2-spine2", + "test": "VerifyHostname", + "categories": [ + "services" + ], + "description": "Verifies the hostname of a device." + }, { "name": "dc2-spine2", "test": "VerifySnmpIPv4Acl", @@ -507,7 +713,7 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed EOS version." + "description": "Verifies the EOS version of the device." }, { "name": "dc2-spine2", @@ -515,7 +721,15 @@ "categories": [ "software" ], - "description": "Verifies the device is running one of the allowed TerminAttr version." + "description": "Verifies the TerminAttr version of the device." + }, + { + "name": "dc2-spine2", + "test": "VerifyStunClient", + "categories": [ + "stun" + ], + "description": "Verifies the STUN client is configured with the specified IPv4 source address and port. Validate the public IP and port if provided." }, { "name": "dc2-spine2", @@ -588,5 +802,13 @@ "system" ], "description": "Verifies the device uptime." + }, + { + "name": "dc2-spine2", + "test": "VerifyVlanInternalPolicy", + "categories": [ + "vlan" + ], + "description": "Verifies the VLAN internal allocation policy and the range of VLANs." } ] \ No newline at end of file diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/documentation/devices/DC1-BL1A.md b/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/documentation/devices/DC1-BL1A.md index decc1453904..305314fd745 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/documentation/devices/DC1-BL1A.md +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/documentation/devices/DC1-BL1A.md @@ -630,10 +630,10 @@ ASN Notation: asplain | 192.168.255.2 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.3 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.4 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | -| 123.1.1.10 | 1234 | Tenant_A_WAN_Zone | - | standard extended | 0 (no limit) | - | - | - | - | - | -| 123.1.1.11 | 1234 | Tenant_A_WAN_Zone | - | standard extended | 0 (no limit) | - | - | - | - | - | -| fd5a:fe45:8831:06c5::a | 12345 | Tenant_A_WAN_Zone | - | all | - | - | - | - | - | - | -| fd5a:fe45:8831:06c5::b | 12345 | Tenant_A_WAN_Zone | - | - | - | - | - | - | - | - | +| 123.1.1.10 | 1234 | Tenant_A_WAN_Zone | - | standard extended | 0 (no limit) | - | - | - | - | - | - | +| 123.1.1.11 | 1234 | Tenant_A_WAN_Zone | - | standard extended | 0 (no limit) | - | - | - | - | - | - | +| fd5a:fe45:8831:06c5::a | 12345 | Tenant_A_WAN_Zone | - | all | - | - | - | - | - | - | - | +| fd5a:fe45:8831:06c5::b | 12345 | Tenant_A_WAN_Zone | - | - | - | - | - | - | - | - | - | #### Router BGP EVPN Address Family diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/documentation/devices/DC1-BL1B.md b/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/documentation/devices/DC1-BL1B.md index 0f931172341..2eb33cfc4ac 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/documentation/devices/DC1-BL1B.md +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/documentation/devices/DC1-BL1B.md @@ -628,10 +628,10 @@ ASN Notation: asplain | 192.168.255.2 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.3 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.4 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | -| 123.1.1.10 | 1234 | Tenant_A_WAN_Zone | - | standard extended | 0 (no limit) | - | - | - | - | - | -| 123.1.1.11 | 1234 | Tenant_A_WAN_Zone | - | standard extended | 0 (no limit) | - | - | - | - | - | -| fd5a:fe45:8831:06c5::a | 12345 | Tenant_A_WAN_Zone | - | all | - | - | - | - | - | - | -| fd5a:fe45:8831:06c5::b | 12345 | Tenant_A_WAN_Zone | - | - | - | - | - | - | - | - | +| 123.1.1.10 | 1234 | Tenant_A_WAN_Zone | - | standard extended | 0 (no limit) | - | - | - | - | - | - | +| 123.1.1.11 | 1234 | Tenant_A_WAN_Zone | - | standard extended | 0 (no limit) | - | - | - | - | - | - | +| fd5a:fe45:8831:06c5::a | 12345 | Tenant_A_WAN_Zone | - | all | - | - | - | - | - | - | - | +| fd5a:fe45:8831:06c5::b | 12345 | Tenant_A_WAN_Zone | - | - | - | - | - | - | - | - | - | #### Router BGP EVPN Address Family diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/documentation/devices/DC1-SVC3A.md b/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/documentation/devices/DC1-SVC3A.md index b3a2caebcb0..97870cab41b 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/documentation/devices/DC1-SVC3A.md +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/documentation/devices/DC1-SVC3A.md @@ -1303,15 +1303,15 @@ ASN Notation: asplain | 192.168.255.2 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.3 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.4 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | -| 10.255.252.7 | Inherited from peer group MLAG-PEERS | Tenant_A_APP_Zone | - | Inherited from peer group MLAG-PEERS | Inherited from peer group MLAG-PEERS | - | - | - | - | - | -| 10.255.252.7 | Inherited from peer group MLAG-PEERS | Tenant_A_DB_Zone | - | Inherited from peer group MLAG-PEERS | Inherited from peer group MLAG-PEERS | - | - | - | - | - | -| 10.255.252.7 | Inherited from peer group MLAG-PEERS | Tenant_A_OP_Zone | - | Inherited from peer group MLAG-PEERS | Inherited from peer group MLAG-PEERS | - | - | - | - | - | -| 10.255.252.7 | Inherited from peer group MLAG-PEERS | Tenant_A_WAN_Zone | - | Inherited from peer group MLAG-PEERS | Inherited from peer group MLAG-PEERS | - | - | - | - | - | -| 10.255.252.7 | Inherited from peer group MLAG-PEERS | Tenant_A_WEB_Zone | - | Inherited from peer group MLAG-PEERS | Inherited from peer group MLAG-PEERS | - | - | - | - | - | -| 10.255.252.7 | Inherited from peer group MLAG-PEERS | Tenant_B_OP_Zone | - | Inherited from peer group MLAG-PEERS | Inherited from peer group MLAG-PEERS | - | - | - | - | - | -| 10.255.252.7 | Inherited from peer group MLAG-PEERS | Tenant_B_WAN_Zone | - | Inherited from peer group MLAG-PEERS | Inherited from peer group MLAG-PEERS | - | - | - | - | - | -| 10.255.252.7 | Inherited from peer group MLAG-PEERS | Tenant_C_OP_Zone | - | Inherited from peer group MLAG-PEERS | Inherited from peer group MLAG-PEERS | - | - | - | - | - | -| 10.255.252.7 | Inherited from peer group MLAG-PEERS | Tenant_C_WAN_Zone | - | Inherited from peer group MLAG-PEERS | Inherited from peer group MLAG-PEERS | - | - | - | - | - | +| 10.255.252.7 | Inherited from peer group MLAG-PEERS | Tenant_A_APP_Zone | - | Inherited from peer group MLAG-PEERS | Inherited from peer group MLAG-PEERS | - | - | - | - | - | - | +| 10.255.252.7 | Inherited from peer group MLAG-PEERS | Tenant_A_DB_Zone | - | Inherited from peer group MLAG-PEERS | Inherited from peer group MLAG-PEERS | - | - | - | - | - | - | +| 10.255.252.7 | Inherited from peer group MLAG-PEERS | Tenant_A_OP_Zone | - | Inherited from peer group MLAG-PEERS | Inherited from peer group MLAG-PEERS | - | - | - | - | - | - | +| 10.255.252.7 | Inherited from peer group MLAG-PEERS | Tenant_A_WAN_Zone | - | Inherited from peer group MLAG-PEERS | Inherited from peer group MLAG-PEERS | - | - | - | - | - | - | +| 10.255.252.7 | Inherited from peer group MLAG-PEERS | Tenant_A_WEB_Zone | - | Inherited from peer group MLAG-PEERS | Inherited from peer group MLAG-PEERS | - | - | - | - | - | - | +| 10.255.252.7 | Inherited from peer group MLAG-PEERS | Tenant_B_OP_Zone | - | Inherited from peer group MLAG-PEERS | Inherited from peer group MLAG-PEERS | - | - | - | - | - | - | +| 10.255.252.7 | Inherited from peer group MLAG-PEERS | Tenant_B_WAN_Zone | - | Inherited from peer group MLAG-PEERS | Inherited from peer group MLAG-PEERS | - | - | - | - | - | - | +| 10.255.252.7 | Inherited from peer group MLAG-PEERS | Tenant_C_OP_Zone | - | Inherited from peer group MLAG-PEERS | Inherited from peer group MLAG-PEERS | - | - | - | - | - | - | +| 10.255.252.7 | Inherited from peer group MLAG-PEERS | Tenant_C_WAN_Zone | - | Inherited from peer group MLAG-PEERS | Inherited from peer group MLAG-PEERS | - | - | - | - | - | - | #### Router BGP EVPN Address Family diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/documentation/devices/DC1-SVC3B.md b/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/documentation/devices/DC1-SVC3B.md index 4a0c77bbaa4..c709ee58d2f 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/documentation/devices/DC1-SVC3B.md +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/documentation/devices/DC1-SVC3B.md @@ -1303,15 +1303,15 @@ ASN Notation: asplain | 192.168.255.2 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.3 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.4 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | -| 10.255.252.6 | Inherited from peer group MLAG-PEERS | Tenant_A_APP_Zone | - | Inherited from peer group MLAG-PEERS | Inherited from peer group MLAG-PEERS | - | - | - | - | - | -| 10.255.252.6 | Inherited from peer group MLAG-PEERS | Tenant_A_DB_Zone | - | Inherited from peer group MLAG-PEERS | Inherited from peer group MLAG-PEERS | - | - | - | - | - | -| 10.255.252.6 | Inherited from peer group MLAG-PEERS | Tenant_A_OP_Zone | - | Inherited from peer group MLAG-PEERS | Inherited from peer group MLAG-PEERS | - | - | - | - | - | -| 10.255.252.6 | Inherited from peer group MLAG-PEERS | Tenant_A_WAN_Zone | - | Inherited from peer group MLAG-PEERS | Inherited from peer group MLAG-PEERS | - | - | - | - | - | -| 10.255.252.6 | Inherited from peer group MLAG-PEERS | Tenant_A_WEB_Zone | - | Inherited from peer group MLAG-PEERS | Inherited from peer group MLAG-PEERS | - | - | - | - | - | -| 10.255.252.6 | Inherited from peer group MLAG-PEERS | Tenant_B_OP_Zone | - | Inherited from peer group MLAG-PEERS | Inherited from peer group MLAG-PEERS | - | - | - | - | - | -| 10.255.252.6 | Inherited from peer group MLAG-PEERS | Tenant_B_WAN_Zone | - | Inherited from peer group MLAG-PEERS | Inherited from peer group MLAG-PEERS | - | - | - | - | - | -| 10.255.252.6 | Inherited from peer group MLAG-PEERS | Tenant_C_OP_Zone | - | Inherited from peer group MLAG-PEERS | Inherited from peer group MLAG-PEERS | - | - | - | - | - | -| 10.255.252.6 | Inherited from peer group MLAG-PEERS | Tenant_C_WAN_Zone | - | Inherited from peer group MLAG-PEERS | Inherited from peer group MLAG-PEERS | - | - | - | - | - | +| 10.255.252.6 | Inherited from peer group MLAG-PEERS | Tenant_A_APP_Zone | - | Inherited from peer group MLAG-PEERS | Inherited from peer group MLAG-PEERS | - | - | - | - | - | - | +| 10.255.252.6 | Inherited from peer group MLAG-PEERS | Tenant_A_DB_Zone | - | Inherited from peer group MLAG-PEERS | Inherited from peer group MLAG-PEERS | - | - | - | - | - | - | +| 10.255.252.6 | Inherited from peer group MLAG-PEERS | Tenant_A_OP_Zone | - | Inherited from peer group MLAG-PEERS | Inherited from peer group MLAG-PEERS | - | - | - | - | - | - | +| 10.255.252.6 | Inherited from peer group MLAG-PEERS | Tenant_A_WAN_Zone | - | Inherited from peer group MLAG-PEERS | Inherited from peer group MLAG-PEERS | - | - | - | - | - | - | +| 10.255.252.6 | Inherited from peer group MLAG-PEERS | Tenant_A_WEB_Zone | - | Inherited from peer group MLAG-PEERS | Inherited from peer group MLAG-PEERS | - | - | - | - | - | - | +| 10.255.252.6 | Inherited from peer group MLAG-PEERS | Tenant_B_OP_Zone | - | Inherited from peer group MLAG-PEERS | Inherited from peer group MLAG-PEERS | - | - | - | - | - | - | +| 10.255.252.6 | Inherited from peer group MLAG-PEERS | Tenant_B_WAN_Zone | - | Inherited from peer group MLAG-PEERS | Inherited from peer group MLAG-PEERS | - | - | - | - | - | - | +| 10.255.252.6 | Inherited from peer group MLAG-PEERS | Tenant_C_OP_Zone | - | Inherited from peer group MLAG-PEERS | Inherited from peer group MLAG-PEERS | - | - | - | - | - | - | +| 10.255.252.6 | Inherited from peer group MLAG-PEERS | Tenant_C_WAN_Zone | - | Inherited from peer group MLAG-PEERS | Inherited from peer group MLAG-PEERS | - | - | - | - | - | - | #### Router BGP EVPN Address Family diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/intended/structured_configs/DC1-L2LEAF1A.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/intended/structured_configs/DC1-L2LEAF1A.yml index 66549ac509a..d55f255991b 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/intended/structured_configs/DC1-L2LEAF1A.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/intended/structured_configs/DC1-L2LEAF1A.yml @@ -115,9 +115,9 @@ vlan_interfaces: - name: Vlan4091 description: MLAG_PEER shutdown: false - ip_address: 10.255.247.14/31 no_autostate: true mtu: 1500 + ip_address: 10.255.247.14/31 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_DC1-L2LEAF1B_Po3 diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/intended/structured_configs/DC1-L2LEAF1B.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/intended/structured_configs/DC1-L2LEAF1B.yml index 7cd613d0f28..d474ac35f52 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/intended/structured_configs/DC1-L2LEAF1B.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/intended/structured_configs/DC1-L2LEAF1B.yml @@ -115,9 +115,9 @@ vlan_interfaces: - name: Vlan4091 description: MLAG_PEER shutdown: false - ip_address: 10.255.247.15/31 no_autostate: true mtu: 1500 + ip_address: 10.255.247.15/31 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_DC1-L2LEAF1A_Po3 diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/intended/structured_configs/DC1-L2LEAF2A.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/intended/structured_configs/DC1-L2LEAF2A.yml index ca729133b09..358ec98203b 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/intended/structured_configs/DC1-L2LEAF2A.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/intended/structured_configs/DC1-L2LEAF2A.yml @@ -142,9 +142,9 @@ vlan_interfaces: - name: Vlan4091 description: MLAG_PEER shutdown: false - ip_address: 10.255.249.16/31 no_autostate: true mtu: 1500 + ip_address: 10.255.249.16/31 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_DC1-L2LEAF2B_Po3 diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/intended/structured_configs/DC1-L2LEAF2B.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/intended/structured_configs/DC1-L2LEAF2B.yml index cb20c9db2fd..6e3cffcf553 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/intended/structured_configs/DC1-L2LEAF2B.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/intended/structured_configs/DC1-L2LEAF2B.yml @@ -142,9 +142,9 @@ vlan_interfaces: - name: Vlan4091 description: MLAG_PEER shutdown: false - ip_address: 10.255.249.17/31 no_autostate: true mtu: 1500 + ip_address: 10.255.249.17/31 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_DC1-L2LEAF2A_Po3 diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/intended/structured_configs/DC1-SVC3A.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/intended/structured_configs/DC1-SVC3A.yml index 0cefc017233..728dd1562d7 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/intended/structured_configs/DC1-SVC3A.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/intended/structured_configs/DC1-SVC3A.yml @@ -586,9 +586,9 @@ vlan_interfaces: - name: Vlan4092 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.6/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.6/31 - name: Vlan130 tenant: Tenant_A tags: diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/intended/structured_configs/DC1-SVC3B.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/intended/structured_configs/DC1-SVC3B.yml index 53160e4bc6c..90763468ea1 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/intended/structured_configs/DC1-SVC3B.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_ebgp_overlay_ebgp/intended/structured_configs/DC1-SVC3B.yml @@ -586,9 +586,9 @@ vlan_interfaces: - name: Vlan4092 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.7/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.7/31 - name: Vlan130 tenant: Tenant_A tags: diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-BL1A.md b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-BL1A.md index 269804b2010..73805cb466f 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-BL1A.md +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-BL1A.md @@ -293,13 +293,13 @@ vlan 4094 ##### ISIS -| Interface | Channel Group | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | -| Ethernet1 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet2 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet3 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet4 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet8 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | True | - | +| Interface | Channel Group | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Ethernet1 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet2 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet3 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet4 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet8 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | True | - | #### Ethernet Interfaces Device Configuration @@ -312,6 +312,7 @@ interface Ethernet1 no switchport ip address 172.31.255.41/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -323,6 +324,7 @@ interface Ethernet2 no switchport ip address 172.31.255.43/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -334,6 +336,7 @@ interface Ethernet3 no switchport ip address 172.31.255.45/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -345,6 +348,7 @@ interface Ethernet4 no switchport ip address 172.31.255.47/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -366,6 +370,7 @@ interface Ethernet8 no switchport ip address 100.64.0.0/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis hello padding @@ -457,9 +462,9 @@ interface Loopback1 ##### ISIS -| Interface | ISIS Instance | ISIS Metric | Mode | -| --------- | ------------- | ----------- | ---- | -| Vlan4093 | EVPN_UNDERLAY | 50 | point-to-point | +| Interface | ISIS Instance | ISIS BFD | ISIS Metric | Mode | +| --------- | ------------- | -------- | ----------- | ---- | +| Vlan4093 | EVPN_UNDERLAY | True | 50 | point-to-point | #### VLAN Interfaces Device Configuration @@ -471,6 +476,7 @@ interface Vlan4093 mtu 1500 ip address 10.255.251.10/31 isis enable EVPN_UNDERLAY + isis bfd isis metric 50 isis network point-to-point ! diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-BL1B.md b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-BL1B.md index 4b3f0d20856..bd45d5f3fff 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-BL1B.md +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-BL1B.md @@ -292,12 +292,12 @@ vlan 4094 ##### ISIS -| Interface | Channel Group | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | -| Ethernet1 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet2 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet3 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet4 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | +| Interface | Channel Group | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Ethernet1 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet2 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet3 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet4 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | #### Ethernet Interfaces Device Configuration @@ -310,6 +310,7 @@ interface Ethernet1 no switchport ip address 172.31.255.49/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -321,6 +322,7 @@ interface Ethernet2 no switchport ip address 172.31.255.51/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -332,6 +334,7 @@ interface Ethernet3 no switchport ip address 172.31.255.53/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -343,6 +346,7 @@ interface Ethernet4 no switchport ip address 172.31.255.55/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -443,9 +447,9 @@ interface Loopback1 ##### ISIS -| Interface | ISIS Instance | ISIS Metric | Mode | -| --------- | ------------- | ----------- | ---- | -| Vlan4093 | EVPN_UNDERLAY | 50 | point-to-point | +| Interface | ISIS Instance | ISIS BFD | ISIS Metric | Mode | +| --------- | ------------- | -------- | ----------- | ---- | +| Vlan4093 | EVPN_UNDERLAY | True | 50 | point-to-point | #### VLAN Interfaces Device Configuration @@ -457,6 +461,7 @@ interface Vlan4093 mtu 1500 ip address 10.255.251.11/31 isis enable EVPN_UNDERLAY + isis bfd isis metric 50 isis network point-to-point ! diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-LEAF1A.md b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-LEAF1A.md index 766415300ff..71aa43f2723 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-LEAF1A.md +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-LEAF1A.md @@ -232,12 +232,12 @@ vlan internal order ascending range 1006 1199 ##### ISIS -| Interface | Channel Group | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | -| Ethernet1 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet2 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet3 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet4 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | +| Interface | Channel Group | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Ethernet1 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet2 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet3 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet4 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | #### Ethernet Interfaces Device Configuration @@ -250,6 +250,7 @@ interface Ethernet1 no switchport ip address 172.31.255.1/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -261,6 +262,7 @@ interface Ethernet2 no switchport ip address 172.31.255.3/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -272,6 +274,7 @@ interface Ethernet3 no switchport ip address 172.31.255.5/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -283,6 +286,7 @@ interface Ethernet4 no switchport ip address 172.31.255.7/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-LEAF2A.md b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-LEAF2A.md index 4516f7ad6fc..1b16715d860 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-LEAF2A.md +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-LEAF2A.md @@ -293,12 +293,12 @@ vlan 4094 ##### ISIS -| Interface | Channel Group | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | -| Ethernet1 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet2 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet3 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet4 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | +| Interface | Channel Group | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Ethernet1 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet2 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet3 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet4 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | #### Ethernet Interfaces Device Configuration @@ -311,6 +311,7 @@ interface Ethernet1 no switchport ip address 172.31.255.9/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -322,6 +323,7 @@ interface Ethernet2 no switchport ip address 172.31.255.11/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -333,6 +335,7 @@ interface Ethernet3 no switchport ip address 172.31.255.13/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -344,6 +347,7 @@ interface Ethernet4 no switchport ip address 172.31.255.15/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -458,9 +462,9 @@ interface Loopback10 ##### ISIS -| Interface | ISIS Instance | ISIS Metric | Mode | -| --------- | ------------- | ----------- | ---- | -| Vlan4093 | EVPN_UNDERLAY | 50 | point-to-point | +| Interface | ISIS Instance | ISIS BFD | ISIS Metric | Mode | +| --------- | ------------- | -------- | ----------- | ---- | +| Vlan4093 | EVPN_UNDERLAY | True | 50 | point-to-point | #### VLAN Interfaces Device Configuration @@ -472,6 +476,7 @@ interface Vlan4093 mtu 1500 ip address 10.255.251.2/31 isis enable EVPN_UNDERLAY + isis bfd isis metric 50 isis network point-to-point ! diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-LEAF2B.md b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-LEAF2B.md index 2d7dc264d71..af5eba4df33 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-LEAF2B.md +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-LEAF2B.md @@ -293,12 +293,12 @@ vlan 4094 ##### ISIS -| Interface | Channel Group | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | -| Ethernet1 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet2 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet3 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet4 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | +| Interface | Channel Group | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Ethernet1 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet2 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet3 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet4 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | #### Ethernet Interfaces Device Configuration @@ -311,6 +311,7 @@ interface Ethernet1 no switchport ip address 172.31.255.17/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -322,6 +323,7 @@ interface Ethernet2 no switchport ip address 172.31.255.19/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -333,6 +335,7 @@ interface Ethernet3 no switchport ip address 172.31.255.21/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -344,6 +347,7 @@ interface Ethernet4 no switchport ip address 172.31.255.23/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -458,9 +462,9 @@ interface Loopback10 ##### ISIS -| Interface | ISIS Instance | ISIS Metric | Mode | -| --------- | ------------- | ----------- | ---- | -| Vlan4093 | EVPN_UNDERLAY | 50 | point-to-point | +| Interface | ISIS Instance | ISIS BFD | ISIS Metric | Mode | +| --------- | ------------- | -------- | ----------- | ---- | +| Vlan4093 | EVPN_UNDERLAY | True | 50 | point-to-point | #### VLAN Interfaces Device Configuration @@ -472,6 +476,7 @@ interface Vlan4093 mtu 1500 ip address 10.255.251.3/31 isis enable EVPN_UNDERLAY + isis bfd isis metric 50 isis network point-to-point ! diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-SPINE1.md b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-SPINE1.md index 0cd58bf1c20..d04941f3c4c 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-SPINE1.md +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-SPINE1.md @@ -221,15 +221,15 @@ vlan internal order ascending range 1006 1199 ##### ISIS -| Interface | Channel Group | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | -| Ethernet1 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet2 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet3 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet4 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet5 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet6 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet7 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | +| Interface | Channel Group | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Ethernet1 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet2 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet3 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet4 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet5 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet6 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet7 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | #### Ethernet Interfaces Device Configuration @@ -242,6 +242,7 @@ interface Ethernet1 no switchport ip address 172.31.255.0/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -253,6 +254,7 @@ interface Ethernet2 no switchport ip address 172.31.255.8/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -264,6 +266,7 @@ interface Ethernet3 no switchport ip address 172.31.255.16/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -275,6 +278,7 @@ interface Ethernet4 no switchport ip address 172.31.255.24/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -286,6 +290,7 @@ interface Ethernet5 no switchport ip address 172.31.255.32/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -297,6 +302,7 @@ interface Ethernet6 no switchport ip address 172.31.255.40/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -308,6 +314,7 @@ interface Ethernet7 no switchport ip address 172.31.255.48/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-SPINE2.md b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-SPINE2.md index 61728e94ef6..42a0bbf143c 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-SPINE2.md +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-SPINE2.md @@ -218,15 +218,15 @@ vlan internal order ascending range 1006 1199 ##### ISIS -| Interface | Channel Group | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | -| Ethernet1 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet2 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet3 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet4 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet5 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet6 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet7 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | +| Interface | Channel Group | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Ethernet1 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet2 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet3 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet4 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet5 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet6 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet7 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | #### Ethernet Interfaces Device Configuration @@ -239,6 +239,7 @@ interface Ethernet1 no switchport ip address 172.31.255.2/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -250,6 +251,7 @@ interface Ethernet2 no switchport ip address 172.31.255.10/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -261,6 +263,7 @@ interface Ethernet3 no switchport ip address 172.31.255.18/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -272,6 +275,7 @@ interface Ethernet4 no switchport ip address 172.31.255.26/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -283,6 +287,7 @@ interface Ethernet5 no switchport ip address 172.31.255.34/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -294,6 +299,7 @@ interface Ethernet6 no switchport ip address 172.31.255.42/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -305,6 +311,7 @@ interface Ethernet7 no switchport ip address 172.31.255.50/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-SPINE3.md b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-SPINE3.md index c254b87d811..a5db0493594 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-SPINE3.md +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-SPINE3.md @@ -218,15 +218,15 @@ vlan internal order ascending range 1006 1199 ##### ISIS -| Interface | Channel Group | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | -| Ethernet1 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet2 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet3 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet4 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet5 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet6 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet7 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | +| Interface | Channel Group | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Ethernet1 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet2 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet3 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet4 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet5 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet6 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet7 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | #### Ethernet Interfaces Device Configuration @@ -239,6 +239,7 @@ interface Ethernet1 no switchport ip address 172.31.255.4/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -250,6 +251,7 @@ interface Ethernet2 no switchport ip address 172.31.255.12/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -261,6 +263,7 @@ interface Ethernet3 no switchport ip address 172.31.255.20/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -272,6 +275,7 @@ interface Ethernet4 no switchport ip address 172.31.255.28/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -283,6 +287,7 @@ interface Ethernet5 no switchport ip address 172.31.255.36/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -294,6 +299,7 @@ interface Ethernet6 no switchport ip address 172.31.255.44/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -305,6 +311,7 @@ interface Ethernet7 no switchport ip address 172.31.255.52/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-SPINE4.md b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-SPINE4.md index fd63f240040..4208d5dcea1 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-SPINE4.md +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-SPINE4.md @@ -221,15 +221,15 @@ vlan internal order ascending range 1006 1199 ##### ISIS -| Interface | Channel Group | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | -| Ethernet1 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet2 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet3 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet4 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet5 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet6 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet7 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | +| Interface | Channel Group | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Ethernet1 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet2 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet3 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet4 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet5 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet6 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet7 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | #### Ethernet Interfaces Device Configuration @@ -242,6 +242,7 @@ interface Ethernet1 no switchport ip address 172.31.255.6/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -253,6 +254,7 @@ interface Ethernet2 no switchport ip address 172.31.255.14/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -264,6 +266,7 @@ interface Ethernet3 no switchport ip address 172.31.255.22/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -275,6 +278,7 @@ interface Ethernet4 no switchport ip address 172.31.255.30/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -286,6 +290,7 @@ interface Ethernet5 no switchport ip address 172.31.255.38/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -297,6 +302,7 @@ interface Ethernet6 no switchport ip address 172.31.255.46/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -308,6 +314,7 @@ interface Ethernet7 no switchport ip address 172.31.255.54/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-SVC3A.md b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-SVC3A.md index 598d73ef588..50af0370fe6 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-SVC3A.md +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-SVC3A.md @@ -289,12 +289,12 @@ vlan 4094 ##### ISIS -| Interface | Channel Group | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | -| Ethernet1 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet2 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet3 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet4 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | +| Interface | Channel Group | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Ethernet1 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet2 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet3 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet4 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | #### Ethernet Interfaces Device Configuration @@ -307,6 +307,7 @@ interface Ethernet1 no switchport ip address 172.31.255.25/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -318,6 +319,7 @@ interface Ethernet2 no switchport ip address 172.31.255.27/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -329,6 +331,7 @@ interface Ethernet3 no switchport ip address 172.31.255.29/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -340,6 +343,7 @@ interface Ethernet4 no switchport ip address 172.31.255.31/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -457,9 +461,9 @@ interface Loopback1 ##### ISIS -| Interface | ISIS Instance | ISIS Metric | Mode | -| --------- | ------------- | ----------- | ---- | -| Vlan4094 | EVPN_UNDERLAY | 50 | point-to-point | +| Interface | ISIS Instance | ISIS BFD | ISIS Metric | Mode | +| --------- | ------------- | -------- | ----------- | ---- | +| Vlan4094 | EVPN_UNDERLAY | True | 50 | point-to-point | #### VLAN Interfaces Device Configuration @@ -472,6 +476,7 @@ interface Vlan4094 no autostate ip address 10.255.252.6/31 isis enable EVPN_UNDERLAY + isis bfd isis metric 50 isis network point-to-point ``` diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-SVC3B.md b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-SVC3B.md index a3795f1e8a1..39510d82ed6 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-SVC3B.md +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/documentation/devices/DC1-SVC3B.md @@ -289,12 +289,12 @@ vlan 4094 ##### ISIS -| Interface | Channel Group | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | -| Ethernet1 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet2 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet3 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | -| Ethernet4 | - | EVPN_UNDERLAY | 50 | point-to-point | level-2 | - | - | +| Interface | Channel Group | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Ethernet1 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet2 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet3 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | +| Ethernet4 | - | EVPN_UNDERLAY | True | 50 | point-to-point | level-2 | - | - | #### Ethernet Interfaces Device Configuration @@ -307,6 +307,7 @@ interface Ethernet1 no switchport ip address 172.31.255.33/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -318,6 +319,7 @@ interface Ethernet2 no switchport ip address 172.31.255.35/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -329,6 +331,7 @@ interface Ethernet3 no switchport ip address 172.31.255.37/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -340,6 +343,7 @@ interface Ethernet4 no switchport ip address 172.31.255.39/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -457,9 +461,9 @@ interface Loopback1 ##### ISIS -| Interface | ISIS Instance | ISIS Metric | Mode | -| --------- | ------------- | ----------- | ---- | -| Vlan4094 | EVPN_UNDERLAY | 50 | point-to-point | +| Interface | ISIS Instance | ISIS BFD | ISIS Metric | Mode | +| --------- | ------------- | -------- | ----------- | ---- | +| Vlan4094 | EVPN_UNDERLAY | True | 50 | point-to-point | #### VLAN Interfaces Device Configuration @@ -472,6 +476,7 @@ interface Vlan4094 no autostate ip address 10.255.252.7/31 isis enable EVPN_UNDERLAY + isis bfd isis metric 50 isis network point-to-point ``` diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-BL1A.cfg b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-BL1A.cfg index f59d30d856f..7d9d34c6b8b 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-BL1A.cfg +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-BL1A.cfg @@ -52,6 +52,7 @@ interface Ethernet1 no switchport ip address 172.31.255.41/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -63,6 +64,7 @@ interface Ethernet2 no switchport ip address 172.31.255.43/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -74,6 +76,7 @@ interface Ethernet3 no switchport ip address 172.31.255.45/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -85,6 +88,7 @@ interface Ethernet4 no switchport ip address 172.31.255.47/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -106,6 +110,7 @@ interface Ethernet8 no switchport ip address 100.64.0.0/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis hello padding @@ -137,6 +142,7 @@ interface Vlan4093 mtu 1500 ip address 10.255.251.10/31 isis enable EVPN_UNDERLAY + isis bfd isis metric 50 isis network point-to-point ! diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-BL1B.cfg b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-BL1B.cfg index e8cd1026884..b15d04b734f 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-BL1B.cfg +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-BL1B.cfg @@ -52,6 +52,7 @@ interface Ethernet1 no switchport ip address 172.31.255.49/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -63,6 +64,7 @@ interface Ethernet2 no switchport ip address 172.31.255.51/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -74,6 +76,7 @@ interface Ethernet3 no switchport ip address 172.31.255.53/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -85,6 +88,7 @@ interface Ethernet4 no switchport ip address 172.31.255.55/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -125,6 +129,7 @@ interface Vlan4093 mtu 1500 ip address 10.255.251.11/31 isis enable EVPN_UNDERLAY + isis bfd isis metric 50 isis network point-to-point ! diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-LEAF1A.cfg b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-LEAF1A.cfg index fe6bf07ff31..cd2cfe0631a 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-LEAF1A.cfg +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-LEAF1A.cfg @@ -35,6 +35,7 @@ interface Ethernet1 no switchport ip address 172.31.255.1/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -46,6 +47,7 @@ interface Ethernet2 no switchport ip address 172.31.255.3/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -57,6 +59,7 @@ interface Ethernet3 no switchport ip address 172.31.255.5/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -68,6 +71,7 @@ interface Ethernet4 no switchport ip address 172.31.255.7/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-LEAF2A.cfg b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-LEAF2A.cfg index f94c0b975fe..03567d3beea 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-LEAF2A.cfg +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-LEAF2A.cfg @@ -60,6 +60,7 @@ interface Ethernet1 no switchport ip address 172.31.255.9/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -71,6 +72,7 @@ interface Ethernet2 no switchport ip address 172.31.255.11/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -82,6 +84,7 @@ interface Ethernet3 no switchport ip address 172.31.255.13/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -93,6 +96,7 @@ interface Ethernet4 no switchport ip address 172.31.255.15/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -138,6 +142,7 @@ interface Vlan4093 mtu 1500 ip address 10.255.251.2/31 isis enable EVPN_UNDERLAY + isis bfd isis metric 50 isis network point-to-point ! diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-LEAF2B.cfg b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-LEAF2B.cfg index 2738f80aa77..a01237ac11e 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-LEAF2B.cfg +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-LEAF2B.cfg @@ -60,6 +60,7 @@ interface Ethernet1 no switchport ip address 172.31.255.17/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -71,6 +72,7 @@ interface Ethernet2 no switchport ip address 172.31.255.19/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -82,6 +84,7 @@ interface Ethernet3 no switchport ip address 172.31.255.21/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -93,6 +96,7 @@ interface Ethernet4 no switchport ip address 172.31.255.23/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -138,6 +142,7 @@ interface Vlan4093 mtu 1500 ip address 10.255.251.3/31 isis enable EVPN_UNDERLAY + isis bfd isis metric 50 isis network point-to-point ! diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-SPINE1.cfg b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-SPINE1.cfg index c4f055e053f..53bd3961fff 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-SPINE1.cfg +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-SPINE1.cfg @@ -34,6 +34,7 @@ interface Ethernet1 no switchport ip address 172.31.255.0/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -45,6 +46,7 @@ interface Ethernet2 no switchport ip address 172.31.255.8/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -56,6 +58,7 @@ interface Ethernet3 no switchport ip address 172.31.255.16/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -67,6 +70,7 @@ interface Ethernet4 no switchport ip address 172.31.255.24/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -78,6 +82,7 @@ interface Ethernet5 no switchport ip address 172.31.255.32/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -89,6 +94,7 @@ interface Ethernet6 no switchport ip address 172.31.255.40/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -100,6 +106,7 @@ interface Ethernet7 no switchport ip address 172.31.255.48/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-SPINE2.cfg b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-SPINE2.cfg index 9879b4aa6a9..b4f125e3cd5 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-SPINE2.cfg +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-SPINE2.cfg @@ -34,6 +34,7 @@ interface Ethernet1 no switchport ip address 172.31.255.2/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -45,6 +46,7 @@ interface Ethernet2 no switchport ip address 172.31.255.10/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -56,6 +58,7 @@ interface Ethernet3 no switchport ip address 172.31.255.18/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -67,6 +70,7 @@ interface Ethernet4 no switchport ip address 172.31.255.26/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -78,6 +82,7 @@ interface Ethernet5 no switchport ip address 172.31.255.34/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -89,6 +94,7 @@ interface Ethernet6 no switchport ip address 172.31.255.42/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -100,6 +106,7 @@ interface Ethernet7 no switchport ip address 172.31.255.50/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-SPINE3.cfg b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-SPINE3.cfg index 737414d8b8f..e32e1aecc34 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-SPINE3.cfg +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-SPINE3.cfg @@ -34,6 +34,7 @@ interface Ethernet1 no switchport ip address 172.31.255.4/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -45,6 +46,7 @@ interface Ethernet2 no switchport ip address 172.31.255.12/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -56,6 +58,7 @@ interface Ethernet3 no switchport ip address 172.31.255.20/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -67,6 +70,7 @@ interface Ethernet4 no switchport ip address 172.31.255.28/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -78,6 +82,7 @@ interface Ethernet5 no switchport ip address 172.31.255.36/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -89,6 +94,7 @@ interface Ethernet6 no switchport ip address 172.31.255.44/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -100,6 +106,7 @@ interface Ethernet7 no switchport ip address 172.31.255.52/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-SPINE4.cfg b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-SPINE4.cfg index 528a50a11ce..adcb294d45a 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-SPINE4.cfg +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-SPINE4.cfg @@ -34,6 +34,7 @@ interface Ethernet1 no switchport ip address 172.31.255.6/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -45,6 +46,7 @@ interface Ethernet2 no switchport ip address 172.31.255.14/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -56,6 +58,7 @@ interface Ethernet3 no switchport ip address 172.31.255.22/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -67,6 +70,7 @@ interface Ethernet4 no switchport ip address 172.31.255.30/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -78,6 +82,7 @@ interface Ethernet5 no switchport ip address 172.31.255.38/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -89,6 +94,7 @@ interface Ethernet6 no switchport ip address 172.31.255.46/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -100,6 +106,7 @@ interface Ethernet7 no switchport ip address 172.31.255.54/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-SVC3A.cfg b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-SVC3A.cfg index 3cecbcab278..49e1176e9e6 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-SVC3A.cfg +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-SVC3A.cfg @@ -56,6 +56,7 @@ interface Ethernet1 no switchport ip address 172.31.255.25/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -67,6 +68,7 @@ interface Ethernet2 no switchport ip address 172.31.255.27/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -78,6 +80,7 @@ interface Ethernet3 no switchport ip address 172.31.255.29/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -89,6 +92,7 @@ interface Ethernet4 no switchport ip address 172.31.255.31/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -140,6 +144,7 @@ interface Vlan4094 no autostate ip address 10.255.252.6/31 isis enable EVPN_UNDERLAY + isis bfd isis metric 50 isis network point-to-point ! diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-SVC3B.cfg b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-SVC3B.cfg index abc2b349ef2..89984978e68 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-SVC3B.cfg +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/configs/DC1-SVC3B.cfg @@ -56,6 +56,7 @@ interface Ethernet1 no switchport ip address 172.31.255.33/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -67,6 +68,7 @@ interface Ethernet2 no switchport ip address 172.31.255.35/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -78,6 +80,7 @@ interface Ethernet3 no switchport ip address 172.31.255.37/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -89,6 +92,7 @@ interface Ethernet4 no switchport ip address 172.31.255.39/31 isis enable EVPN_UNDERLAY + isis bfd isis circuit-type level-2 isis metric 50 isis network point-to-point @@ -140,6 +144,7 @@ interface Vlan4094 no autostate ip address 10.255.252.7/31 isis enable EVPN_UNDERLAY + isis bfd isis metric 50 isis network point-to-point ! diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-BL1A.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-BL1A.yml index c1839bae8a1..6886e23801d 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-BL1A.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-BL1A.yml @@ -123,14 +123,15 @@ vlan_interfaces: mtu: 1500 ip_address: 10.255.251.10/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.10/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.10/31 port_channel_interfaces: - name: Port-Channel5 description: MLAG_PEER_DC1-BL1B_Po5 @@ -171,6 +172,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.41/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -184,6 +186,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.43/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -197,6 +200,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.45/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -210,6 +214,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.47/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -223,6 +228,7 @@ ethernet_interfaces: mtu: 1500 ip_address: 100.64.0.0/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_hello_padding: true diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-BL1B.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-BL1B.yml index db4ff00ea85..cf37a4baa0d 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-BL1B.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-BL1B.yml @@ -123,14 +123,15 @@ vlan_interfaces: mtu: 1500 ip_address: 10.255.251.11/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.11/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.11/31 port_channel_interfaces: - name: Port-Channel5 description: MLAG_PEER_DC1-BL1A_Po5 @@ -171,6 +172,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.49/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -184,6 +186,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.51/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -197,6 +200,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.53/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -210,6 +214,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.55/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-L2LEAF2A.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-L2LEAF2A.yml index 00177da14ae..0ae64d994f4 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-L2LEAF2A.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-L2LEAF2A.yml @@ -73,9 +73,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.16/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.16/31 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_DC1-L2LEAF2B_Po3 diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-L2LEAF2B.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-L2LEAF2B.yml index 3e25ba91250..e17e4fd0ebe 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-L2LEAF2B.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-L2LEAF2B.yml @@ -73,9 +73,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.17/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.17/31 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_DC1-L2LEAF2A_Po3 diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-LEAF1A.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-LEAF1A.yml index c90b876a3a1..ed359172799 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-LEAF1A.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-LEAF1A.yml @@ -115,6 +115,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.1/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -128,6 +129,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.3/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -141,6 +143,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.5/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -154,6 +157,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.7/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-LEAF2A.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-LEAF2A.yml index f4f84145c67..ae9906504fa 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-LEAF2A.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-LEAF2A.yml @@ -123,14 +123,15 @@ vlan_interfaces: mtu: 1500 ip_address: 10.255.251.2/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.2/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.2/31 port_channel_interfaces: - name: Port-Channel5 description: MLAG_PEER_DC1-LEAF2B_Po5 @@ -178,6 +179,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.9/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -191,6 +193,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.11/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -204,6 +207,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.13/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -217,6 +221,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.15/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-LEAF2B.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-LEAF2B.yml index b999a191c4d..b517e5af475 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-LEAF2B.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-LEAF2B.yml @@ -123,14 +123,15 @@ vlan_interfaces: mtu: 1500 ip_address: 10.255.251.3/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.3/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.3/31 port_channel_interfaces: - name: Port-Channel5 description: MLAG_PEER_DC1-LEAF2A_Po5 @@ -178,6 +179,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.17/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -191,6 +193,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.19/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -204,6 +207,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.21/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -217,6 +221,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.23/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-SPINE1.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-SPINE1.yml index 7b96e84c080..0262cc61219 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-SPINE1.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-SPINE1.yml @@ -132,6 +132,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.0/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -145,6 +146,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.8/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -158,6 +160,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.16/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -171,6 +174,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.24/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -184,6 +188,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.32/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -197,6 +202,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.40/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -210,6 +216,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.48/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-SPINE2.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-SPINE2.yml index c20533302ee..9da77aa27d7 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-SPINE2.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-SPINE2.yml @@ -71,6 +71,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.2/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -84,6 +85,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.10/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -97,6 +99,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.18/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -110,6 +113,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.26/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -123,6 +127,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.34/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -136,6 +141,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.42/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -149,6 +155,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.50/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-SPINE3.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-SPINE3.yml index f55222d5b94..1a5b8e031a7 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-SPINE3.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-SPINE3.yml @@ -71,6 +71,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.4/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -84,6 +85,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.12/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -97,6 +99,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.20/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -110,6 +113,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.28/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -123,6 +127,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.36/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -136,6 +141,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.44/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -149,6 +155,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.52/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-SPINE4.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-SPINE4.yml index 03135668374..30bde9038a2 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-SPINE4.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-SPINE4.yml @@ -132,6 +132,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.6/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -145,6 +146,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.14/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -158,6 +160,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.22/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -171,6 +174,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.30/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -184,6 +188,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.38/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -197,6 +202,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.46/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -210,6 +216,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.54/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-SVC3A.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-SVC3A.yml index 9c817446473..0ae3938e572 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-SVC3A.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-SVC3A.yml @@ -115,10 +115,11 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.6/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.6/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true port_channel_interfaces: @@ -168,6 +169,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.25/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -181,6 +183,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.27/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -194,6 +197,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.29/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -207,6 +211,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.31/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-SVC3B.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-SVC3B.yml index 1ca485c40f1..b2e40af49d3 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-SVC3B.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/intended/structured_configs/DC1-SVC3B.yml @@ -115,10 +115,11 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.7/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.7/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true port_channel_interfaces: @@ -168,6 +169,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.33/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -181,6 +183,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.35/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -194,6 +197,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.37/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 @@ -207,6 +211,7 @@ ethernet_interfaces: type: routed ip_address: 172.31.255.39/31 isis_enable: EVPN_UNDERLAY + isis_bfd: true isis_metric: 50 isis_network_point_to_point: true isis_circuit_type: level-2 diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/inventory/group_vars/DC1_FABRIC.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/inventory/group_vars/DC1_FABRIC.yml index c2ad31681ce..2e3cf0cde5e 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/inventory/group_vars/DC1_FABRIC.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_isis_overlay_ibgp/inventory/group_vars/DC1_FABRIC.yml @@ -6,6 +6,7 @@ fabric_name: DC1_FABRIC # ISIS Parameters when underlay_routing_protocol=ISIS underlay_routing_protocol: isis +underlay_isis_bfd: true overlay_routing_protocol: ibgp bgp_as: 65000 isis_area_id: "49.0001" diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/documentation/devices/DC1-LEAF2A.md b/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/documentation/devices/DC1-LEAF2A.md index b4ff4c33325..8922a251d56 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/documentation/devices/DC1-LEAF2A.md +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/documentation/devices/DC1-LEAF2A.md @@ -662,7 +662,7 @@ ASN Notation: asplain | 192.168.255.2 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.3 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.4 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | -| 10.255.251.3 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_B_OP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | +| 10.255.251.3 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_B_OP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | #### Router BGP EVPN Address Family diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/documentation/devices/DC1-LEAF2B.md b/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/documentation/devices/DC1-LEAF2B.md index dbc6f5dfed7..b065681de03 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/documentation/devices/DC1-LEAF2B.md +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/documentation/devices/DC1-LEAF2B.md @@ -662,7 +662,7 @@ ASN Notation: asplain | 192.168.255.2 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.3 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.4 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | -| 10.255.251.2 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_B_OP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | +| 10.255.251.2 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_B_OP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | #### Router BGP EVPN Address Family diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/documentation/devices/DC1-SVC3A.md b/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/documentation/devices/DC1-SVC3A.md index acaf083d7d6..f9ccc285432 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/documentation/devices/DC1-SVC3A.md +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/documentation/devices/DC1-SVC3A.md @@ -655,7 +655,7 @@ ASN Notation: asplain | 192.168.255.2 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.3 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.4 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | -| 10.255.252.7 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_B_OP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | +| 10.255.252.7 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_B_OP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | #### Router BGP EVPN Address Family diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/documentation/devices/DC1-SVC3B.md b/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/documentation/devices/DC1-SVC3B.md index 829963dbf16..e26ec2c9b69 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/documentation/devices/DC1-SVC3B.md +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/documentation/devices/DC1-SVC3B.md @@ -655,7 +655,7 @@ ASN Notation: asplain | 192.168.255.2 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.3 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.4 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | -| 10.255.252.6 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_B_OP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | +| 10.255.252.6 | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Tenant_B_OP_Zone | - | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | Inherited from peer group MLAG-IPv4-UNDERLAY-PEER | - | - | - | - | - | - | #### Router BGP EVPN Address Family diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/intended/structured_configs/DC1-BL1A.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/intended/structured_configs/DC1-BL1A.yml index 2c6fe9e46cb..d5522a02c04 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/intended/structured_configs/DC1-BL1A.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/intended/structured_configs/DC1-BL1A.yml @@ -141,9 +141,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.10/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.10/31 port_channel_interfaces: - name: Port-Channel5 description: MLAG_PEER_DC1-BL1B_Po5 diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/intended/structured_configs/DC1-BL1B.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/intended/structured_configs/DC1-BL1B.yml index 2fc748e6af5..1029b11fbd7 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/intended/structured_configs/DC1-BL1B.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/intended/structured_configs/DC1-BL1B.yml @@ -141,9 +141,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.11/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.11/31 port_channel_interfaces: - name: Port-Channel5 description: MLAG_PEER_DC1-BL1A_Po5 diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/intended/structured_configs/DC1-L2LEAF2A.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/intended/structured_configs/DC1-L2LEAF2A.yml index 42337849c42..65e198e0c14 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/intended/structured_configs/DC1-L2LEAF2A.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/intended/structured_configs/DC1-L2LEAF2A.yml @@ -76,9 +76,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.16/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.16/31 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_DC1-L2LEAF2B_Po3 diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/intended/structured_configs/DC1-L2LEAF2B.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/intended/structured_configs/DC1-L2LEAF2B.yml index d0966c7277a..261122a052e 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/intended/structured_configs/DC1-L2LEAF2B.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/intended/structured_configs/DC1-L2LEAF2B.yml @@ -76,9 +76,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.17/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.17/31 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_DC1-L2LEAF2A_Po3 diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/intended/structured_configs/DC1-LEAF2A.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/intended/structured_configs/DC1-LEAF2A.yml index 790dbe27918..fcabb549195 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/intended/structured_configs/DC1-LEAF2A.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/intended/structured_configs/DC1-LEAF2A.yml @@ -192,9 +192,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.2/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.2/31 - name: Vlan210 tenant: Tenant_A tags: diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/intended/structured_configs/DC1-LEAF2B.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/intended/structured_configs/DC1-LEAF2B.yml index 02c466fafd7..bf73a2d40dd 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/intended/structured_configs/DC1-LEAF2B.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/intended/structured_configs/DC1-LEAF2B.yml @@ -192,9 +192,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.3/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.3/31 - name: Vlan210 tenant: Tenant_A tags: diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/intended/structured_configs/DC1-SVC3A.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/intended/structured_configs/DC1-SVC3A.yml index 42df29689c6..c25d302f919 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/intended/structured_configs/DC1-SVC3A.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/intended/structured_configs/DC1-SVC3A.yml @@ -180,9 +180,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.6/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.6/31 ospf_network_point_to_point: true ospf_area: 0.0.0.0 - name: Vlan210 diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/intended/structured_configs/DC1-SVC3B.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/intended/structured_configs/DC1-SVC3B.yml index c7c75116093..43f937a53ff 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/intended/structured_configs/DC1-SVC3B.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_ospf_overlay_ebgp/intended/structured_configs/DC1-SVC3B.yml @@ -180,9 +180,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.7/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.7/31 ospf_network_point_to_point: true ospf_area: 0.0.0.0 - name: Vlan210 diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/documentation/devices/DC1-BL1A.md b/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/documentation/devices/DC1-BL1A.md index 08ba651322a..f058393895a 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/documentation/devices/DC1-BL1A.md +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/documentation/devices/DC1-BL1A.md @@ -612,9 +612,9 @@ ASN Notation: asplain | 192.168.255.2 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.3 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.4 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | -| 123.1.1.10 | 1234 | Tenant_A_WAN_Zone | - | standard extended | 0 (no limit) | - | - | - | - | - | -| fd5a:fe45:8831:06c5::a | 12345 | Tenant_A_WAN_Zone | - | - | - | - | - | - | - | - | -| fd5a:fe45:8831:06c5::b | 12345 | Tenant_A_WAN_Zone | - | - | - | - | - | - | - | - | +| 123.1.1.10 | 1234 | Tenant_A_WAN_Zone | - | standard extended | 0 (no limit) | - | - | - | - | - | - | +| fd5a:fe45:8831:06c5::a | 12345 | Tenant_A_WAN_Zone | - | - | - | - | - | - | - | - | - | +| fd5a:fe45:8831:06c5::b | 12345 | Tenant_A_WAN_Zone | - | - | - | - | - | - | - | - | - | #### BGP Neighbor Interfaces diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/documentation/devices/DC1-BL1B.md b/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/documentation/devices/DC1-BL1B.md index 3af83073017..adf452bdf83 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/documentation/devices/DC1-BL1B.md +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/documentation/devices/DC1-BL1B.md @@ -591,9 +591,9 @@ ASN Notation: asplain | 192.168.255.2 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.3 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.4 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | -| 123.1.1.10 | 1234 | Tenant_A_WAN_Zone | - | standard extended | 0 (no limit) | - | - | - | - | - | -| fd5a:fe45:8831:06c5::a | 12345 | Tenant_A_WAN_Zone | - | - | - | - | - | - | - | - | -| fd5a:fe45:8831:06c5::b | 12345 | Tenant_A_WAN_Zone | - | - | - | - | - | - | - | - | +| 123.1.1.10 | 1234 | Tenant_A_WAN_Zone | - | standard extended | 0 (no limit) | - | - | - | - | - | - | +| fd5a:fe45:8831:06c5::a | 12345 | Tenant_A_WAN_Zone | - | - | - | - | - | - | - | - | - | +| fd5a:fe45:8831:06c5::b | 12345 | Tenant_A_WAN_Zone | - | - | - | - | - | - | - | - | - | #### BGP Neighbor Interfaces diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/documentation/devices/DC1-LEAF2A.md b/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/documentation/devices/DC1-LEAF2A.md index dd91dd2cd32..254d8fc2094 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/documentation/devices/DC1-LEAF2A.md +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/documentation/devices/DC1-LEAF2A.md @@ -965,12 +965,12 @@ ASN Notation: asplain | 192.168.255.2 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.3 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.4 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | -| 10.255.251.3 | Inherited from peer group MLAG_PEER | Tenant_A_APP_Zone | - | Inherited from peer group MLAG_PEER | Inherited from peer group MLAG_PEER | - | - | - | - | - | -| 10.255.251.3 | Inherited from peer group MLAG_PEER | Tenant_A_DB_Zone | - | Inherited from peer group MLAG_PEER | Inherited from peer group MLAG_PEER | - | - | - | - | - | -| 10.255.251.3 | Inherited from peer group MLAG_PEER | Tenant_A_OP_Zone | - | Inherited from peer group MLAG_PEER | Inherited from peer group MLAG_PEER | - | - | - | - | - | -| 10.255.251.3 | Inherited from peer group MLAG_PEER | Tenant_A_WEB_Zone | - | Inherited from peer group MLAG_PEER | Inherited from peer group MLAG_PEER | - | - | - | - | - | -| 10.255.251.3 | Inherited from peer group MLAG_PEER | Tenant_B_OP_Zone | - | Inherited from peer group MLAG_PEER | Inherited from peer group MLAG_PEER | - | - | - | - | - | -| 10.255.251.3 | Inherited from peer group MLAG_PEER | Tenant_C_OP_Zone | - | Inherited from peer group MLAG_PEER | Inherited from peer group MLAG_PEER | - | - | - | - | - | +| 10.255.251.3 | Inherited from peer group MLAG_PEER | Tenant_A_APP_Zone | - | Inherited from peer group MLAG_PEER | Inherited from peer group MLAG_PEER | - | - | - | - | - | - | +| 10.255.251.3 | Inherited from peer group MLAG_PEER | Tenant_A_DB_Zone | - | Inherited from peer group MLAG_PEER | Inherited from peer group MLAG_PEER | - | - | - | - | - | - | +| 10.255.251.3 | Inherited from peer group MLAG_PEER | Tenant_A_OP_Zone | - | Inherited from peer group MLAG_PEER | Inherited from peer group MLAG_PEER | - | - | - | - | - | - | +| 10.255.251.3 | Inherited from peer group MLAG_PEER | Tenant_A_WEB_Zone | - | Inherited from peer group MLAG_PEER | Inherited from peer group MLAG_PEER | - | - | - | - | - | - | +| 10.255.251.3 | Inherited from peer group MLAG_PEER | Tenant_B_OP_Zone | - | Inherited from peer group MLAG_PEER | Inherited from peer group MLAG_PEER | - | - | - | - | - | - | +| 10.255.251.3 | Inherited from peer group MLAG_PEER | Tenant_C_OP_Zone | - | Inherited from peer group MLAG_PEER | Inherited from peer group MLAG_PEER | - | - | - | - | - | - | #### BGP Neighbor Interfaces diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/documentation/devices/DC1-LEAF2B.md b/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/documentation/devices/DC1-LEAF2B.md index 4e39c13d3bc..3daa9d07e3e 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/documentation/devices/DC1-LEAF2B.md +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/documentation/devices/DC1-LEAF2B.md @@ -965,12 +965,12 @@ ASN Notation: asplain | 192.168.255.2 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.3 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | | 192.168.255.4 | 65001 | default | - | Inherited from peer group EVPN-OVERLAY-PEERS | Inherited from peer group EVPN-OVERLAY-PEERS | - | Inherited from peer group EVPN-OVERLAY-PEERS | - | - | - | - | -| 10.255.251.2 | Inherited from peer group MLAG_PEER | Tenant_A_APP_Zone | - | Inherited from peer group MLAG_PEER | Inherited from peer group MLAG_PEER | - | - | - | - | - | -| 10.255.251.2 | Inherited from peer group MLAG_PEER | Tenant_A_DB_Zone | - | Inherited from peer group MLAG_PEER | Inherited from peer group MLAG_PEER | - | - | - | - | - | -| 10.255.251.2 | Inherited from peer group MLAG_PEER | Tenant_A_OP_Zone | - | Inherited from peer group MLAG_PEER | Inherited from peer group MLAG_PEER | - | - | - | - | - | -| 10.255.251.2 | Inherited from peer group MLAG_PEER | Tenant_A_WEB_Zone | - | Inherited from peer group MLAG_PEER | Inherited from peer group MLAG_PEER | - | - | - | - | - | -| 10.255.251.2 | Inherited from peer group MLAG_PEER | Tenant_B_OP_Zone | - | Inherited from peer group MLAG_PEER | Inherited from peer group MLAG_PEER | - | - | - | - | - | -| 10.255.251.2 | Inherited from peer group MLAG_PEER | Tenant_C_OP_Zone | - | Inherited from peer group MLAG_PEER | Inherited from peer group MLAG_PEER | - | - | - | - | - | +| 10.255.251.2 | Inherited from peer group MLAG_PEER | Tenant_A_APP_Zone | - | Inherited from peer group MLAG_PEER | Inherited from peer group MLAG_PEER | - | - | - | - | - | - | +| 10.255.251.2 | Inherited from peer group MLAG_PEER | Tenant_A_DB_Zone | - | Inherited from peer group MLAG_PEER | Inherited from peer group MLAG_PEER | - | - | - | - | - | - | +| 10.255.251.2 | Inherited from peer group MLAG_PEER | Tenant_A_OP_Zone | - | Inherited from peer group MLAG_PEER | Inherited from peer group MLAG_PEER | - | - | - | - | - | - | +| 10.255.251.2 | Inherited from peer group MLAG_PEER | Tenant_A_WEB_Zone | - | Inherited from peer group MLAG_PEER | Inherited from peer group MLAG_PEER | - | - | - | - | - | - | +| 10.255.251.2 | Inherited from peer group MLAG_PEER | Tenant_B_OP_Zone | - | Inherited from peer group MLAG_PEER | Inherited from peer group MLAG_PEER | - | - | - | - | - | - | +| 10.255.251.2 | Inherited from peer group MLAG_PEER | Tenant_C_OP_Zone | - | Inherited from peer group MLAG_PEER | Inherited from peer group MLAG_PEER | - | - | - | - | - | - | #### BGP Neighbor Interfaces diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-L2LEAF2A.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-L2LEAF2A.yml index 8fad3558d77..bbb12754ee0 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-L2LEAF2A.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-L2LEAF2A.yml @@ -124,9 +124,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.16/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.16/31 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_DC1-L2LEAF2B_Po3 diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-L2LEAF2B.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-L2LEAF2B.yml index aabea049bb4..a787d50d9a4 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-L2LEAF2B.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-L2LEAF2B.yml @@ -124,9 +124,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.17/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.17/31 port_channel_interfaces: - name: Port-Channel3 description: MLAG_PEER_DC1-L2LEAF2A_Po3 diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-LEAF2A.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-LEAF2A.yml index 564e0bb2035..1a365e4af77 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-LEAF2A.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-LEAF2A.yml @@ -509,9 +509,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.2/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.2/31 - name: Vlan130 tenant: Tenant_A tags: diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-LEAF2B.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-LEAF2B.yml index 7a8aa372763..b4c7b462794 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-LEAF2B.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-LEAF2B.yml @@ -509,9 +509,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.3/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.3/31 - name: Vlan130 tenant: Tenant_A tags: diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-LEAF3A.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-LEAF3A.yml index fb22322d839..8c26d5716a6 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-LEAF3A.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-LEAF3A.yml @@ -460,9 +460,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.14/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.14/31 - name: Vlan130 tenant: Tenant_A tags: diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-LEAF3B.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-LEAF3B.yml index 4a3c2a89f9d..3dff4843beb 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-LEAF3B.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-LEAF3B.yml @@ -460,9 +460,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.15/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.15/31 - name: Vlan130 tenant: Tenant_A tags: diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-LEAF4A.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-LEAF4A.yml index 782f97310fe..3fdc7f5bd5a 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-LEAF4A.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-LEAF4A.yml @@ -455,9 +455,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.18/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.18/31 - name: Vlan130 tenant: Tenant_A tags: diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-LEAF4B.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-LEAF4B.yml index eefa877c1eb..875c2e16199 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-LEAF4B.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-LEAF4B.yml @@ -455,9 +455,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.19/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.19/31 - name: Vlan130 tenant: Tenant_A tags: diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-SVC3A.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-SVC3A.yml index 09d814c021d..892d97da4d0 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-SVC3A.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-SVC3A.yml @@ -596,9 +596,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.6/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.6/31 - name: Vlan130 tenant: Tenant_A tags: diff --git a/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-SVC3B.yml b/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-SVC3B.yml index 8a9ff2fa927..0dc3336a19f 100644 --- a/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-SVC3B.yml +++ b/ansible_collections/arista/avd/molecule/evpn_underlay_rfc5549_overlay_ebgp/intended/structured_configs/DC1-SVC3B.yml @@ -596,9 +596,9 @@ vlan_interfaces: - name: Vlan4094 description: MLAG_PEER shutdown: false - ip_address: 10.255.252.7/31 no_autostate: true mtu: 1500 + ip_address: 10.255.252.7/31 - name: Vlan130 tenant: Tenant_A tags: diff --git a/ansible_collections/arista/avd/plugins/action/cv_workflow.py b/ansible_collections/arista/avd/plugins/action/cv_workflow.py index 357a6b8c1ab..cca38e61e1f 100644 --- a/ansible_collections/arista/avd/plugins/action/cv_workflow.py +++ b/ansible_collections/arista/avd/plugins/action/cv_workflow.py @@ -16,62 +16,72 @@ from ansible.plugins.action import ActionBase, display from yaml import load -from ansible_collections.arista.avd.plugins.plugin_utils.cv_client import deploy_to_cv -from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.workflows.models import ( - CloudVision, - CVChangeControl, - CVDevice, - CVDeviceTag, - CVEosConfig, - CVInterfaceTag, - CVPathfinderMetadata, - CVTimeOuts, - CVWorkspace, -) -from ansible_collections.arista.avd.plugins.plugin_utils.strip_empties import strip_empties_from_dict -from ansible_collections.arista.avd.plugins.plugin_utils.utils import PythonToAnsibleHandler, YamlLoader, get +from ansible_collections.arista.avd.plugins.plugin_utils.utils import PythonToAnsibleHandler, YamlLoader + +PLUGIN_NAME = "arista.avd.cv_workflow" + +try: + from pyavd._cv.workflows.deploy_to_cv import deploy_to_cv + from pyavd._cv.workflows.models import ( + CloudVision, + CVChangeControl, + CVDevice, + CVDeviceTag, + CVEosConfig, + CVInterfaceTag, + CVPathfinderMetadata, + CVTimeOuts, + CVWorkspace, + ) + from pyavd._utils import get, strip_empties_from_dict + + HAS_PYAVD = True +except ImportError: + HAS_PYAVD = False + LOGGER = logging.getLogger("ansible_collections.arista.avd") LOGGING_LEVELS = ["DEBUG", "INFO", "ERROR", "WARNING", "CRITICAL"] -ARGUMENT_SPEC = { - "configuration_dir": {"type": "str", "required": True}, - "structured_config_dir": {"type": "str", "required": True}, - "structured_config_suffix": {"type": "str", "default": "yml"}, - "device_list": {"type": "list", "elements": "str", "required": True}, - "strict_tags": {"type": "bool", "required": False, "default": False}, - "skip_missing_devices": {"type": "bool", "required": False, "default": False}, - "configlet_name_template": {"type": "str", "default": "AVD-${hostname}"}, - "cv_servers": {"type": "list", "elements": "str", "required": True}, - "cv_token": {"type": "str", "secret": True, "required": True}, - "cv_verify_certs": {"type": "bool", "default": True}, - "workspace": { - "type": "dict", - "options": { - "name": {"type": "str", "required": False}, - "description": {"type": "str", "required": False}, - "id": {"type": "str", "required": False}, - "requested_state": {"type": "str", "default": "built", "choices": ["pending", "built", "submitted", "abandoned", "deleted"]}, - "force": {"type": "bool", "default": False}, +if HAS_PYAVD: + ARGUMENT_SPEC = { + "configuration_dir": {"type": "str", "required": True}, + "structured_config_dir": {"type": "str", "required": True}, + "structured_config_suffix": {"type": "str", "default": "yml"}, + "device_list": {"type": "list", "elements": "str", "required": True}, + "strict_tags": {"type": "bool", "required": False, "default": False}, + "skip_missing_devices": {"type": "bool", "required": False, "default": False}, + "configlet_name_template": {"type": "str", "default": "AVD-${hostname}"}, + "cv_servers": {"type": "list", "elements": "str", "required": True}, + "cv_token": {"type": "str", "secret": True, "required": True}, + "cv_verify_certs": {"type": "bool", "default": True}, + "workspace": { + "type": "dict", + "options": { + "name": {"type": "str", "required": False}, + "description": {"type": "str", "required": False}, + "id": {"type": "str", "required": False}, + "requested_state": {"type": "str", "default": "built", "choices": ["pending", "built", "submitted", "abandoned", "deleted"]}, + "force": {"type": "bool", "default": False}, + }, }, - }, - "change_control": { - "type": "dict", - "options": { - "name": {"type": "str", "required": False}, - "description": {"type": "str", "required": False}, - "requested_state": {"type": "str", "default": "pending approval", "choices": ["pending approval", "approved", "running", "completed"]}, + "change_control": { + "type": "dict", + "options": { + "name": {"type": "str", "required": False}, + "description": {"type": "str", "required": False}, + "requested_state": {"type": "str", "default": "pending approval", "choices": ["pending approval", "approved", "running", "completed"]}, + }, }, - }, - "timeouts": { - "type": "dict", - "options": { - "workspace_build_timeout": {"type": "float", "default": CVTimeOuts.workspace_build_timeout}, - "change_control_creation_timeout": {"type": "float", "default": CVTimeOuts.change_control_creation_timeout}, + "timeouts": { + "type": "dict", + "options": { + "workspace_build_timeout": {"type": "float", "default": CVTimeOuts.workspace_build_timeout}, + "change_control_creation_timeout": {"type": "float", "default": CVTimeOuts.change_control_creation_timeout}, + }, }, - }, - "return_details": {"type": "bool", "required": False, "default": False}, -} + "return_details": {"type": "bool", "required": False, "default": False}, + } class ActionModule(ActionBase): @@ -84,6 +94,9 @@ def run(self, tmp=None, task_vars=None): result = super().run(tmp, task_vars) del tmp # tmp no longer has any effect + if not HAS_PYAVD: + raise AnsibleActionFail("The arista.avd.cv_workflow' plugin requires the 'pyavd' Python library. Got import error") + # Setup module logging setup_module_logging(result) @@ -145,6 +158,9 @@ async def deploy(self, validated_args: dict, result: dict): result_object.errors = [str(error) for error in result_object.errors] result_object.warnings = [str(warning) for warning in result_object.warnings] + # Add warnings caught by the logger + result_object.warnings.extend(result.get("warnings", [])) + # Add either all return data or only warnings, errors, failed. if validated_args["return_details"]: # Result object is converted to JSON compatible dict. @@ -152,7 +168,7 @@ async def deploy(self, validated_args: dict, result: dict): else: result.update( { - "warnings": result_object.errors, + "warnings": result_object.warnings, "errors": result_object.errors, "failed": result_object.failed, } diff --git a/ansible_collections/arista/avd/plugins/action/eos_cli_config_gen.py b/ansible_collections/arista/avd/plugins/action/eos_cli_config_gen.py new file mode 100644 index 00000000000..b36d3c22842 --- /dev/null +++ b/ansible_collections/arista/avd/plugins/action/eos_cli_config_gen.py @@ -0,0 +1,304 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import absolute_import, annotations, division, print_function + +__metaclass__ = type + +import json +import logging +from pathlib import Path + +import yaml +from ansible.errors import AnsibleActionFail +from ansible.plugins.action import ActionBase, display + +from ansible_collections.arista.avd.plugins.plugin_utils.utils import PythonToAnsibleContextFilter, PythonToAnsibleHandler, YamlLoader, cprofile, get_templar + +try: + from pyavd import get_device_config, get_device_doc, validate_structured_config + from pyavd._utils import strip_empties_from_dict, template + from pyavd.j2filters import add_md_toc + from pyavd.validation_result import ValidationResult + + HAS_PYAVD = True +except ImportError: + HAS_PYAVD = False + import typing + + ValidationResult = typing.Any + + +CUSTOM_TEMPLATES_CFG_TEMPLATE = "eos/custom-templates.j2" +CUSTOM_TEMPLATES_DOC_TEMPLATE = "documentation/custom-templates.j2" + +LOGGER = logging.getLogger("ansible_collections.arista.avd") +# Avoid duplicate logs in debug files +LOGGER.propagate = False + +ARGUMENT_SPEC = { + "structured_config_filename": {"type": "str"}, + "config_filename": {"type": "str"}, + "documentation_filename": {"type": "str"}, + "read_structured_config_from_file": {"type": "bool", "default": True}, + "conversion_mode": {"type": "str", "default": "debug"}, + "validation_mode": {"type": "str", "default": "warning"}, + "generate_device_config": {"type": "bool", "default": True}, + "generate_device_doc": {"type": "bool", "default": True}, + "device_doc_toc": {"type": "bool", "default": True}, + "cprofile_file": {"type": "str"}, +} + + +class ActionModule(ActionBase): + """Action Module for eos_cli_config_gen.""" + + @cprofile() + def run(self, tmp=None, task_vars=None): + """Ansible Action entry point.""" + if task_vars is None: + task_vars = {} + + if not HAS_PYAVD: + raise AnsibleActionFail("The arista.avd.eos_cli_config_gen' plugin requires the 'pyavd' Python library. Got import error") + + result = super().run(tmp, task_vars) + del tmp # tmp no longer has any effect + + # Setup module logging + hostname = task_vars["inventory_hostname"] + setup_module_logging(hostname, result) + + result = self.main(task_vars, result) + + return result + + def main(self, task_vars: dict, result: dict) -> dict: + """Main function in charge of validating the input variables and generating the device configuration and documentation.""" + LOGGER.debug("Validating task arguments...") + validated_args = self.validate_args() + LOGGER.debug("Validating task arguments [done].") + + try: + # Read structured config from file or task_vars and run templating to handle inline jinja. + LOGGER.debug("Preparing task vars...") + task_vars = self.prepare_task_vars( + task_vars, validated_args.get("structured_config_filename"), read_structured_config_from_file=validated_args["read_structured_config_from_file"] + ) + LOGGER.debug("Preparing task vars [done].") + + LOGGER.debug("Validating structured configuration...") + validation_result = validate_structured_config(task_vars) + LOGGER.debug("Validating structured configuration [done].") + except Exception as e: + LOGGER.error(e) + return result + + if validation_result.failed: + validation_mode = validated_args.get("validation_mode", "warning") + self._log_validation_errors(validation_result, validation_mode) + return result + + has_custom_templates = bool(task_vars.get("custom_templates")) + try: + if validated_args["generate_device_config"]: + LOGGER.debug("Rendering configuration...") + device_config = get_device_config(task_vars) + + if has_custom_templates: + LOGGER.debug("Rendering config custom templates...") + rendered_custom_templates = self.render_template_with_ansible_templar(task_vars, CUSTOM_TEMPLATES_CFG_TEMPLATE) + # Need to handle if `end` has been rendered already + if device_config.endswith("!\nend\n"): + device_config = device_config[:-6] + rendered_custom_templates + "!\nend\n" + else: + device_config += rendered_custom_templates + LOGGER.debug("Rendering config custom templates [done].") + + result["changed"] = self.write_file(device_config, validated_args["config_filename"]) + LOGGER.debug("Rendering configuration [done].") + + if validated_args["generate_device_doc"]: + LOGGER.debug("Rendering documentation...") + device_doc = get_device_doc(task_vars, add_md_toc=False) + + if has_custom_templates: + LOGGER.debug("Rendering documentation custom templates...") + device_doc += self.render_template_with_ansible_templar(task_vars, CUSTOM_TEMPLATES_DOC_TEMPLATE) + LOGGER.debug("Rendering documentation custom templates [done].") + + if validated_args["device_doc_toc"]: + device_doc = add_md_toc(device_doc, skip_lines=3) + + file_changed = self.write_file(device_doc, validated_args["documentation_filename"]) + result["changed"] = result["changed"] or file_changed + LOGGER.debug("Rendering documentation [done].") + + except Exception as error: + # Recast errors as AnsibleActionFail + msg = f"Error during plugin execution: {error}" + raise AnsibleActionFail(msg) from error + + return result + + def validate_args(self) -> dict: + """Get task arguments and validate them.""" + validation_result, validated_args = self.validate_argument_spec( + ARGUMENT_SPEC, + required_if=[ + ("read_structured_config_from_file", True, ("structured_config_filename",)), + ("generate_device_config", True, ("config_filename",)), + ("generate_device_doc", True, ("documentation_filename",)), + ], + ) + validated_args = strip_empties_from_dict(validated_args) + + # Converting to json and back to remove any AnsibeUnsafe types + return json.loads(json.dumps(validated_args)) + + def prepare_task_vars(self, task_vars: dict, structured_config_filename: str, *, read_structured_config_from_file: bool) -> dict: + """Read the structured_config and render inline Jinja. + + Parameters + ---------- + task_vars: Dictionary of task variables + structured_config_filename: The filename where the structured_config for the device is stored. + read_structured_config_from_file: Flag to indicate whether or not the structured_config_filname should be read. + + Returns + ------- + dict: Task vars updated with the structured_config content if read and all inline Jinja rendered. + + Raises + ------ + AnsibleActionFail: If templating fails. + + """ + + if read_structured_config_from_file: + task_vars.update(read_vars(structured_config_filename)) + + # Read ansible variables and perform templating to support inline jinja2 + for var in task_vars: + # TODO - reevaluate these variables + if str(var).startswith(("ansible", "molecule", "hostvars", "vars", "avd_switch_facts")): + continue + if self._templar.is_template(task_vars[var]): + # Var contains a jinja2 template. + try: + task_vars[var] = self._templar.template(task_vars[var], fail_on_undefined=False) + except Exception as e: + raise AnsibleActionFail(f"Exception during templating of task_var '{var}'") from e + + if not isinstance(task_vars, dict): + # Corner case for ansible-test where the passed task_vars is a nested chain-map + task_vars = dict(task_vars) + + return task_vars + + def render_template_with_ansible_templar(self, task_vars: dict, templatefile: str) -> str: + """Render a template with the Ansible Templar.""" + + # Get updated templar instance to be passed along to our simplified "templater" + if not hasattr(self, "ansible_templar"): + self.ansible_templar = get_templar(self, task_vars) + + return template(templatefile, task_vars, self.ansible_templar) + + def write_file(self, content: str, filename: str) -> bool: + """ + This function writes the file only if the content has changed. + + Parameters + ---------- + content: The content to write + filename: Target filename + + Returns + ------- + bool: Indicate if the content of filename has changed. + """ + path = Path(filename) + if path.exists(): + if path.read_text(encoding="UTF-8") == content: + return False + + else: + # Create parent dirs automatically. + path.parent.mkdir(mode=0o775, parents=True, exist_ok=True) + # Touch file + path.touch(mode=0o664) + + path.write_text(content, encoding="UTF-8") + return True + + def _log_validation_errors(self, validation_results: ValidationResult, validation_mode: str) -> None: + """Log validation results depending on the validation_mode + + Parameters + ---------- + validation_result: The ValidationResult object containing the errors. + validation_mode: A validated string containing one of the possible validation_mode + in [error, warning, info, debug, disabled] + + """ + for validation_error in validation_results.validation_errors: + if validation_mode == "debug": + LOGGER.debug(validation_error) + elif validation_mode == "error": + LOGGER.error(validation_error) + elif validation_mode == "info": + LOGGER.info(validation_error) + elif validation_mode == "warning": + LOGGER.warning(validation_error) + # otherwise the validation_mode is disabled + + +def setup_module_logging(hostname: str, result: dict) -> None: + """ + Add a Handler to copy the logs from the plugin into Ansible output based on their level + + Parameters + ---------- + hostname: Current Inventory device being used to augment the logs with + result: The dictionary used for the ansible module results + """ + python_to_ansible_filter = PythonToAnsibleContextFilter(hostname) + python_to_ansible_handler = PythonToAnsibleHandler(result, display) + python_to_ansible_handler.addFilter(python_to_ansible_filter) + LOGGER.addHandler(python_to_ansible_handler) + # TODO mechanism to manipulate the logger globally for pyavd + LOGGER.setLevel(logging.DEBUG) + + +def read_vars(filename: Path | str) -> dict: + """Read the file at filename and return the content as dict. + + The function supports either `json` or `yaml` format. + + Parameters + ---------- + filename: The path to the file to read as a string or a Path. + + Returns + ------- + dict: The content of the file as dict or an empty dict if the file does not exist. + + Raises + ------ + NotImplementedError: If the file extension is not json, yml or yaml. + """ + if not isinstance(filename, Path): + filename = Path(filename) + + if not filename.exists(): + LOGGER.debug("File %s does not exist, skipping reading variables...", filename) + return {} + + with filename.open(mode="r", encoding="UTF-8") as stream: + if filename.suffix in [".yml", ".yaml"]: + return yaml.load(stream, Loader=YamlLoader) + elif filename.suffix == ".json": + return json.load(stream) + else: + raise NotImplementedError(f"Unsupported file suffix for file '{filename}'") diff --git a/ansible_collections/arista/avd/plugins/action/eos_designs_facts.py b/ansible_collections/arista/avd/plugins/action/eos_designs_facts.py index a0858e008a2..2198e64002b 100644 --- a/ansible_collections/arista/avd/plugins/action/eos_designs_facts.py +++ b/ansible_collections/arista/avd/plugins/action/eos_designs_facts.py @@ -11,12 +11,24 @@ from ansible.errors import AnsibleActionFail from ansible.plugins.action import ActionBase, display -from ansible_collections.arista.avd.plugins.plugin_utils.eos_designs_facts import EosDesignsFacts -from ansible_collections.arista.avd.plugins.plugin_utils.eos_designs_shared_utils import SharedUtils -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdMissingVariableError +from ansible_collections.arista.avd.plugins.plugin_utils.pyavd_wrappers import RaiseOnUse from ansible_collections.arista.avd.plugins.plugin_utils.schema.avdschematools import AvdSchemaTools from ansible_collections.arista.avd.plugins.plugin_utils.utils import get_templar +PLUGIN_NAME = "arista.avd.eos_designs_facts" + +try: + from pyavd._eos_designs.eos_designs_facts import EosDesignsFacts + from pyavd._eos_designs.shared_utils import SharedUtils + from pyavd._errors import AristaAvdMissingVariableError +except ImportError as e: + EosDesignsFacts = SharedUtils = RaiseOnUse( + AnsibleActionFail( + f"The '{PLUGIN_NAME}' plugin requires the 'pyavd' Python library. Got import error", + orig_exc=e, + ) + ) + class ActionModule(ActionBase): def run(self, tmp=None, task_vars=None): diff --git a/ansible_collections/arista/avd/plugins/action/eos_designs_structured_config.py b/ansible_collections/arista/avd/plugins/action/eos_designs_structured_config.py index c00adc02081..fd59fa1c3f9 100644 --- a/ansible_collections/arista/avd/plugins/action/eos_designs_structured_config.py +++ b/ansible_collections/arista/avd/plugins/action/eos_designs_structured_config.py @@ -14,12 +14,22 @@ from ansible.parsing.yaml.dumper import AnsibleDumper from ansible.plugins.action import ActionBase, display -from ansible_collections.arista.avd.plugins.plugin_utils.merge import merge +from ansible_collections.arista.avd.plugins.plugin_utils.pyavd_wrappers import RaiseOnUse from ansible_collections.arista.avd.plugins.plugin_utils.schema.avdschematools import AvdSchemaTools -from ansible_collections.arista.avd.plugins.plugin_utils.strip_empties import strip_null_from_data -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get, get_templar -from ansible_collections.arista.avd.plugins.plugin_utils.utils import template as templater -from ansible_collections.arista.avd.roles.eos_designs.python_modules.get_structured_config import get_structured_config +from ansible_collections.arista.avd.plugins.plugin_utils.utils import get_templar + +PLUGIN_NAME = "arista.avd.eos_designs_structured_config" +try: + from pyavd._eos_designs.structured_config import get_structured_config + from pyavd._utils import get, merge, strip_null_from_data + from pyavd._utils import template as templater +except ImportError as e: + get_structured_config = get = merge = RaiseOnUse( + AnsibleActionFail( + f"The '{PLUGIN_NAME}' plugin requires the 'pyavd' Python library. Got import error", + orig_exc=e, + ) + ) class ActionModule(ActionBase): @@ -79,7 +89,7 @@ def run(self, tmp=None, task_vars=None): plugin_name="arista.avd.eos_cli_config_gen", ) - # Get Structured Config from builtin eos_designs python_modules + # Get Structured Config from modules in PyAVD using internal api so we can supply our own templar try: output = get_structured_config( vars=dict(task_vars), @@ -101,7 +111,7 @@ def run(self, tmp=None, task_vars=None): # Any var assignments will end up in output, so all other objects are protected. template_vars = ChainMap(output, task_vars) - # eos_designs_custom_templates can contain a list of jinja templates to run after the builtin eos_designs python_modules + # eos_designs_custom_templates can contain a list of jinja templates to run after PyAVD for template_item in eos_designs_custom_templates: template_options = template_item.get("options", {}) list_merge = template_options.get("list_merge", "append_rp") diff --git a/ansible_collections/arista/avd/plugins/action/eos_validate_state_reports.py b/ansible_collections/arista/avd/plugins/action/eos_validate_state_reports.py index ab2f3fb569f..f4b6e10386e 100644 --- a/ansible_collections/arista/avd/plugins/action/eos_validate_state_reports.py +++ b/ansible_collections/arista/avd/plugins/action/eos_validate_state_reports.py @@ -12,11 +12,24 @@ from ansible.plugins.action import ActionBase, display from ansible_collections.arista.avd.plugins.plugin_utils.eos_validate_state_utils import CSVReport, MDReport, ResultsManager -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get, get_validated_path, get_validated_value +from ansible_collections.arista.avd.plugins.plugin_utils.pyavd_wrappers import RaiseOnUse +from ansible_collections.arista.avd.plugins.plugin_utils.utils import get_validated_path, get_validated_value if TYPE_CHECKING: from pathlib import Path +PLUGIN_NAME = "arista.avd.eos_validate_state_reports" + +try: + from pyavd._utils import get +except ImportError as e: + get = RaiseOnUse( + AnsibleActionFail( + f"The '{PLUGIN_NAME}' plugin requires the 'pyavd' Python library. Got import error", + orig_exc=e, + ) + ) + def _test_results_gen(input_path: Path) -> Generator[dict, None, None]: """Generate test results from a JSON file for a specific host. diff --git a/ansible_collections/arista/avd/plugins/action/eos_validate_state_runner.py b/ansible_collections/arista/avd/plugins/action/eos_validate_state_runner.py index a257d245ed2..3d563b4fa78 100644 --- a/ansible_collections/arista/avd/plugins/action/eos_validate_state_runner.py +++ b/ansible_collections/arista/avd/plugins/action/eos_validate_state_runner.py @@ -72,7 +72,7 @@ def run(self, tmp=None, task_vars=None): logging_level = get_validated_value( data=self._task.args, key="logging_level", expected_type=str, default_value="WARNING", allowed_values=LOGGING_LEVELS ) - skipped_tests = get_validated_value(data=self._task.args, key="skipped_tests", expected_type=list, default_value=[]) + skip_tests = get_validated_value(data=self._task.args, key="skip_tests", expected_type=list, default_value=[]) save_catalog = get_validated_value(data=self._task.args, key="save_catalog", expected_type=bool, default_value=False) catalog_path = get_validated_path(path_input=self._task.args.get("device_catalog_path"), parent=True) if save_catalog else None test_results_dir = get_validated_path(path_input=self._task.args.get("test_results_dir"), parent=False) @@ -91,7 +91,7 @@ def run(self, tmp=None, task_vars=None): anta_device=anta_device, config_manager=config_manager, logging_level=logging_level, - skipped_tests=skipped_tests, + skip_tests=skip_tests, ansible_tags=ansible_tags, save_catalog_name=catalog_path, custom_anta_catalogs=custom_anta_catalogs, diff --git a/ansible_collections/arista/avd/plugins/action/validate_and_template.py b/ansible_collections/arista/avd/plugins/action/validate_and_template.py index 0af8126ea15..112d9b2a0f1 100644 --- a/ansible_collections/arista/avd/plugins/action/validate_and_template.py +++ b/ansible_collections/arista/avd/plugins/action/validate_and_template.py @@ -11,9 +11,22 @@ from ansible.errors import AnsibleActionFail from ansible.plugins.action import ActionBase, display -from ansible_collections.arista.avd.plugins.filter.add_md_toc import add_md_toc +from ansible_collections.arista.avd.plugins.plugin_utils.pyavd_wrappers import RaiseOnUse from ansible_collections.arista.avd.plugins.plugin_utils.schema.avdschematools import AvdSchemaTools -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get_templar, template +from ansible_collections.arista.avd.plugins.plugin_utils.utils import get_templar + +PLUGIN_NAME = "arista.avd.validate_and_template" + +try: + from pyavd._utils import template + from pyavd.j2filters import add_md_toc +except ImportError as e: + add_md_toc = template = RaiseOnUse( + AnsibleActionFail( + f"The '{PLUGIN_NAME}' plugin requires the 'pyavd' Python library. Got import error", + orig_exc=e, + ) + ) class ActionModule(ActionBase): diff --git a/ansible_collections/arista/avd/plugins/action/verify_requirements.py b/ansible_collections/arista/avd/plugins/action/verify_requirements.py index 620501db5a0..2e00b3f975e 100644 --- a/ansible_collections/arista/avd/plugins/action/verify_requirements.py +++ b/ansible_collections/arista/avd/plugins/action/verify_requirements.py @@ -16,8 +16,6 @@ from ansible.plugins.action import ActionBase, display from ansible.utils.collection_loader._collection_finder import _get_collection_metadata -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError - try: # Relying on packaging installed by ansible from packaging.requirements import InvalidRequirement, Requirement @@ -56,16 +54,20 @@ def _validate_python_version(info: dict, result: dict) -> bool: display.error(f"Python Version running {running_version} - Minimum Version required is {min_version}", False) return False # Keeping this for next deprecation adjust the message as required - # elif sys.version_info[:2] == MIN_PYTHON_SUPPORTED_VERSION: - # result.setdefault("deprecations", []).append( - # { - # "msg": ( - # f"You are currently running Python {running_version}. The next minor release of AVD after November 6th 2023 will drop support for Python" - # f" {min_version} as it will be dropping support for ansible-core<2.14 and ansible-core>=2.14 does not support Python {min_version} as" - # " documented here: https://docs.ansible.com/ansible/latest/reference_appendices/release_and_maintenance.html#ansible-core-support-matrix" - # ) - # } - # ) + elif sys.version_info[:2] == MIN_PYTHON_SUPPORTED_VERSION: + result.setdefault("deprecations", []).append( + { + "msg": ( + f"You are currently running Python version {running_version}. " + f"AVD version 5.0.0 will drop support for Python version {min_version}. " + "The decision has been taken to remove Python version 3.9 support in AVD " + "collection to anticipate its removal in `ansible-core`. `ansible-core` " + "version 2.15 End-Of-Life is scheduled for November 2024 and it will be the " + "last `ansible-core` version supporting Python version 3.9 as documented here: " + "https://docs.ansible.com/ansible/latest/reference_appendices/release_and_maintenance.html#ansible-core-support-matrix." + ) + } + ) return True @@ -95,7 +97,7 @@ def _validate_python_requirements(requirements: list, info: dict) -> bool: try: req = Requirement(raw_req) except InvalidRequirement as exc: - raise AristaAvdError(f"Wrong format for requirement {raw_req}") from exc + raise AnsibleActionFail(f"Wrong format for requirement {raw_req}") from exc try: installed_version = version(req.name) diff --git a/ansible_collections/arista/avd/plugins/action/yaml_templates_to_facts.py b/ansible_collections/arista/avd/plugins/action/yaml_templates_to_facts.py index d11d8475686..e3b7aa103d0 100644 --- a/ansible_collections/arista/avd/plugins/action/yaml_templates_to_facts.py +++ b/ansible_collections/arista/avd/plugins/action/yaml_templates_to_facts.py @@ -16,17 +16,28 @@ from ansible.plugins.action import ActionBase, display from ansible.utils.vars import isidentifier -from ansible_collections.arista.avd.plugins.plugin_utils.avdfacts import AvdFacts -from ansible_collections.arista.avd.plugins.plugin_utils.eos_designs_shared_utils import SharedUtils -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdMissingVariableError -from ansible_collections.arista.avd.plugins.plugin_utils.merge import merge +from ansible_collections.arista.avd.plugins.plugin_utils.pyavd_wrappers import RaiseOnUse from ansible_collections.arista.avd.plugins.plugin_utils.schema.avdschematools import AvdSchemaTools -from ansible_collections.arista.avd.plugins.plugin_utils.strip_empties import strip_null_from_data -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get, get_templar, load_python_class -from ansible_collections.arista.avd.plugins.plugin_utils.utils import template as templater +from ansible_collections.arista.avd.plugins.plugin_utils.utils import get_templar DEFAULT_PYTHON_CLASS_NAME = "AvdStructuredConfig" +PLUGIN_NAME = "arista.avd.yaml_templates_to_facts" + +try: + from pyavd._eos_designs.avdfacts import AvdFacts + from pyavd._eos_designs.shared_utils import SharedUtils + from pyavd._errors import AristaAvdMissingVariableError + from pyavd._utils import get, load_python_class, merge, strip_null_from_data + from pyavd._utils import template as templater +except ImportError as e: + AvdFacts = SharedUtils = get = load_python_class = merge = RaiseOnUse( + AnsibleActionFail( + f"The '{PLUGIN_NAME}' plugin requires the 'pyavd' Python library. Got import error", + orig_exc=e, + ) + ) + class ActionModule(ActionBase): def run(self, tmp=None, task_vars=None): @@ -147,7 +158,7 @@ def run(self, tmp=None, task_vars=None): if debug: avd_yaml_templates_to_facts_debug = task_vars.get("avd_yaml_templates_to_facts_debug", []) - # template_list can contain templates or python_modules + # template_list can contain templates or python modules for template_item in template_list: if debug: debug_item = template_item diff --git a/ansible_collections/arista/avd/plugins/filter/add_md_toc.py b/ansible_collections/arista/avd/plugins/filter/add_md_toc.py index 243e22a15c9..25e0685cf0f 100644 --- a/ansible_collections/arista/avd/plugins/filter/add_md_toc.py +++ b/ansible_collections/arista/avd/plugins/filter/add_md_toc.py @@ -8,18 +8,21 @@ __metaclass__ = type -import re -import sys -from io import StringIO +from ansible.errors import AnsibleFilterError -from jinja2.runtime import Undefined +from ansible_collections.arista.avd.plugins.plugin_utils.pyavd_wrappers import RaiseOnUse, wrap_filter -try: - import md_toc +PLUGIN_NAME = "arista.avd.add_md_toc" - HAS_MD_TOC = True -except ImportError: - HAS_MD_TOC = False +try: + from pyavd.j2filters import add_md_toc +except ImportError as e: + add_md_toc = RaiseOnUse( + AnsibleFilterError( + f"The '{PLUGIN_NAME}' plugin requires the 'pyavd' Python library. Got import error", + orig_exc=e, + ) + ) DOCUMENTATION = r""" --- @@ -75,66 +78,6 @@ """ -def add_md_toc(md_input, skip_lines=0, toc_levels=3, toc_marker=""): - """ - add_md_toc will parse the input MarkDown and add a TOC between the toc_markers - - Example - ------- - copy: - content: "{{ lookup('template','eos-device-documentation.j2') | arista.avd.add_md_toc(skip_lines=3) }}" - dest: "{{ devices_dir }}/{{ inventory_hostname }}.md" - mode: 0664 - - Parameters - ---------- - md_input: str - MarkDown which will be processed - - skip_lines: int, optional - Skip first x lines when parsing MD file - default: 0 - - toc_levels: int, optional - How many levels of headings will be included in the TOC (Default:3) - default: 3 - - toc_marker: str, optional - TOC will be inserted or updated between two of these markers in the MD file - default: '' - - - Returns - ------- - str - MD with added TOC - """ - - if isinstance(md_input, Undefined) or md_input is None or HAS_MD_TOC is False: - # Return None - return - - # Generate TOC from variable - with StringIO(md_input) as md: - stdin = sys.stdin - sys.stdin = md - try: - # Try using new md_toc api when md-toc>=9.0.0. - toc = md_toc.api.build_toc("-", keep_header_levels=toc_levels, skip_lines=skip_lines).rstrip() - except AttributeError: - # If that fails, use the previous version md-toc>=7.1.0,<9.0.0 - toc = md_toc.build_toc("-", keep_header_levels=toc_levels, skip_lines=skip_lines).rstrip() - sys.stdin = stdin - - # Insert TOC between markers - toc_marker = re.escape(toc_marker) - toc_pattern = re.compile(rf"{toc_marker}[\S\s]*?{toc_marker}") - - return toc_pattern.sub(toc, md_input, count=1) - - class FilterModule(object): def filters(self): - return { - "add_md_toc": add_md_toc, - } + return {"add_md_toc": wrap_filter(PLUGIN_NAME)(add_md_toc)} diff --git a/ansible_collections/arista/avd/plugins/filter/convert_dicts.py b/ansible_collections/arista/avd/plugins/filter/convert_dicts.py index 90b4fdd488a..1e5ef833c67 100644 --- a/ansible_collections/arista/avd/plugins/filter/convert_dicts.py +++ b/ansible_collections/arista/avd/plugins/filter/convert_dicts.py @@ -8,8 +8,21 @@ __metaclass__ = type +from ansible.errors import AnsibleFilterError -import os +from ansible_collections.arista.avd.plugins.plugin_utils.pyavd_wrappers import RaiseOnUse, wrap_filter + +PLUGIN_NAME = "arista.avd.convert_dicts" + +try: + from pyavd.j2filters import convert_dicts +except ImportError as e: + convert_dicts = RaiseOnUse( + AnsibleFilterError( + f"The '{PLUGIN_NAME}' plugin requires the 'pyavd' Python library. Got import error", + orig_exc=e, + ) + ) DOCUMENTATION = r""" --- @@ -87,99 +100,8 @@ """ -def convert_dicts(dictionary, primary_key="name", secondary_key=None): - """ - The `arista.avd.convert_dicts` filter will convert a dictionary containing nested dictionaries to a list of - dictionaries. It inserts the outer dictionary keys into each list item using the primary_key `name` (key name is - configurable) and if there is a non-dictionary value,it inserts this value to - secondary key (key name is configurable), if secondary key is provided. - - This filter is intended for: - - - Seemless data model migration from dictionaries to lists. - - Improve Ansible's processing performance when dealing with large dictionaries by converting them to lists of dictionaries. - - Note: If there is a non-dictionary value with no secondary key provided, it will pass through untouched - - To use this filter: - - ```jinja - {# convert list of dictionary with default `name:` as the primary key and None secondary key #} - {% set example_list = example_dictionary | arista.avd.convert_dicts %} - {% for example_item in example_list %} - item primary key is {{ example_item.name }} - {% endfor %} - - {# convert list of dictionary with `id:` set as the primary key and `types:` set as the secondary key #} - {% set example_list = example_dictionary | arista.avd.convert_dicts('id','types') %} - {% for example_item in example_list %} - item primary key is {{ example_item.id }} - item secondary key is {{ example_item.types }} - {% endfor %} - ``` - - Parameters - ---------- - dictionary : any - Nested Dictionary to convert - returned untouched if not a nested dictionary and list - primary_key : str, optional - Name of primary key used when inserting outer dictionary keys into items. - secondary_key : str, optional - Name of secondary key used when inserting dictionary values which are list into items. - - Returns - ------- - any - Returns list of dictionaries or input variable untouched if not a nested dictionary/list. - """ - if not isinstance(dictionary, (dict, list)) or os.environ.get("AVD_DISABLE_CONVERT_DICTS"): - # Not a dictionary/list, return the original - return dictionary - elif isinstance(dictionary, list): - output = [] - for element in dictionary: - if not isinstance(element, dict): - output.append({primary_key: element}) - elif primary_key not in element and secondary_key is not None: - # if element of nested dictionary is a dictionary but primary key is missing, insert primary and secondary keys. - for key in element: - output.append( - { - primary_key: key, - secondary_key: element[key], - } - ) - else: - output.append(element) - return output - else: - output = [] - for key in dictionary: - if secondary_key is not None: - # Add secondary key for the values if secondary key is provided - output.append( - { - primary_key: key, - secondary_key: dictionary[key], - } - ) - else: - if not isinstance(dictionary[key], dict): - # Not a nested dictionary - output.append({primary_key: key}) - else: - # Nested dictionary - output.append( - { - primary_key: key, - **dictionary[key], - } - ) - return output - - class FilterModule(object): def filters(self): return { - "convert_dicts": convert_dicts, + "convert_dicts": wrap_filter(PLUGIN_NAME)(convert_dicts), } diff --git a/ansible_collections/arista/avd/plugins/filter/decrypt.py b/ansible_collections/arista/avd/plugins/filter/decrypt.py index f63fecf7bb5..9e0abafd483 100644 --- a/ansible_collections/arista/avd/plugins/filter/decrypt.py +++ b/ansible_collections/arista/avd/plugins/filter/decrypt.py @@ -1,8 +1,21 @@ # Copyright (c) 2023-2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError, AristaAvdMissingVariableError -from ansible_collections.arista.avd.plugins.plugin_utils.password_utils import METHODS_DIR +from ansible.errors import AnsibleFilterError + +from ansible_collections.arista.avd.plugins.plugin_utils.pyavd_wrappers import RaiseOnUse, wrap_filter + +PLUGIN_NAME = "arista.avd.decrypt" + +try: + from pyavd.j2filters import decrypt +except ImportError as e: + decrypt = RaiseOnUse( + AnsibleFilterError( + f"The '{PLUGIN_NAME}' plugin requires the 'pyavd' Python library. Got import error", + orig_exc=e, + ) + ) DOCUMENTATION = r""" --- @@ -72,21 +85,8 @@ """ -def decrypt(value, passwd_type=None, key=None, **kwargs) -> str: - """ - Umbrella function to execute the correct decrypt method based on the input type - """ - if not passwd_type: - raise AristaAvdMissingVariableError("type keyword must be present to use this test") - try: - decrypt_method = METHODS_DIR[passwd_type][1] - except KeyError as exc: - raise AristaAvdError(f"Type {passwd_type} is not supported for the decrypt filter") from exc - return decrypt_method(str(value), key=key, **kwargs) - - class FilterModule(object): def filters(self): return { - "decrypt": decrypt, + "decrypt": wrap_filter(PLUGIN_NAME)(decrypt), } diff --git a/ansible_collections/arista/avd/plugins/filter/default.py b/ansible_collections/arista/avd/plugins/filter/default.py index 9307dbc6248..c092b6fd468 100644 --- a/ansible_collections/arista/avd/plugins/filter/default.py +++ b/ansible_collections/arista/avd/plugins/filter/default.py @@ -8,7 +8,21 @@ __metaclass__ = type -from jinja2.runtime import Undefined +from ansible.errors import AnsibleFilterError + +from ansible_collections.arista.avd.plugins.plugin_utils.pyavd_wrappers import RaiseOnUse, wrap_filter + +PLUGIN_NAME = "arista.avd.default" + +try: + from pyavd.j2filters import default +except ImportError as e: + default = RaiseOnUse( + AnsibleFilterError( + f"The '{PLUGIN_NAME}' plugin requires the 'pyavd' Python library. Got import error", + orig_exc=e, + ) + ) DOCUMENTATION = r""" --- @@ -47,45 +61,8 @@ """ -def default(primary_value, *default_values): - """ - default will test value if defined and is not none. - - Arista.avd.default will test value if defined and is not none. If true - return value else test default_value1. - Test of default_value1 if defined and is not none. If true return - default_value1 else test default_value2. - If we run out of default values we return none. - - Example - ------- - priority: {{ spanning_tree_priority | arista.avd.default("32768") }} - - Parameters - ---------- - primary_value : any - Ansible default value to look for - - Returns - ------- - any - Default value - """ - if isinstance(primary_value, Undefined) or primary_value is None: - # Invalid value - try defaults - if len(default_values) >= 1: - # Return the result of another loop - return default(default_values[0], *default_values[1:]) - else: - # Return None - return - else: - # Return the valid value - return primary_value - - class FilterModule(object): def filters(self): return { - "default": default, + "default": wrap_filter(PLUGIN_NAME)(default), } diff --git a/ansible_collections/arista/avd/plugins/filter/encrypt.py b/ansible_collections/arista/avd/plugins/filter/encrypt.py index fb517217798..70692d677cc 100644 --- a/ansible_collections/arista/avd/plugins/filter/encrypt.py +++ b/ansible_collections/arista/avd/plugins/filter/encrypt.py @@ -1,8 +1,21 @@ # Copyright (c) 2023-2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError, AristaAvdMissingVariableError -from ansible_collections.arista.avd.plugins.plugin_utils.password_utils import METHODS_DIR +from ansible.errors import AnsibleFilterError + +from ansible_collections.arista.avd.plugins.plugin_utils.pyavd_wrappers import RaiseOnUse, wrap_filter + +PLUGIN_NAME = "arista.avd.encrypt" + +try: + from pyavd.j2filters import encrypt +except ImportError as e: + encrypt = RaiseOnUse( + AnsibleFilterError( + f"The '{PLUGIN_NAME}' plugin requires the 'pyavd' Python library. Got import error", + orig_exc=e, + ) + ) DOCUMENTATION = r""" --- @@ -87,21 +100,8 @@ """ -def encrypt(value, passwd_type=None, key=None, **kwargs) -> str: - """ - Umbrella function to execute the correct encrypt method based on the input type - """ - if not passwd_type: - raise AristaAvdMissingVariableError("type keyword must be present to use this test") - try: - encrypt_method = METHODS_DIR[passwd_type][0] - except KeyError as exc: - raise AristaAvdError(f"Type {passwd_type} is not supported for the encrypt filter") from exc - return encrypt_method(str(value), key=key, **kwargs) - - class FilterModule(object): def filters(self): return { - "encrypt": encrypt, + "encrypt": wrap_filter(PLUGIN_NAME)(encrypt), } diff --git a/ansible_collections/arista/avd/plugins/filter/generate_esi.py b/ansible_collections/arista/avd/plugins/filter/generate_esi.py index 5349544e5f7..4af0b52bfaa 100644 --- a/ansible_collections/arista/avd/plugins/filter/generate_esi.py +++ b/ansible_collections/arista/avd/plugins/filter/generate_esi.py @@ -5,6 +5,23 @@ __metaclass__ = type +from ansible.errors import AnsibleFilterError + +from ansible_collections.arista.avd.plugins.plugin_utils.pyavd_wrappers import RaiseOnUse, wrap_filter + +PLUGIN_NAME = "arista.avd.generate_esi" + +try: + from pyavd.j2filters import generate_esi +except ImportError as e: + generate_esi = RaiseOnUse( + AnsibleFilterError( + f"The '{PLUGIN_NAME}' plugin requires the 'pyavd' Python library. Got import error", + orig_exc=e, + ) + ) + + DOCUMENTATION = r""" --- name: generate_esi @@ -23,6 +40,10 @@ description: ESI prefix value. Will be concatenated with the `short_esi`. type: string default: "0000:0000:" +deprecated: + removed_in: "5.0.0" + why: This filter is no longer used by AVD and is very simple to replace with generic Jinja syntax. + alternative: Use Jinja string concatenation instead like `{{ ~ }}` """ EXAMPLES = r""" @@ -38,12 +59,8 @@ """ -def generate_esi(esi_short, esi_prefix="0000:0000:"): - return esi_prefix + esi_short - - class FilterModule(object): def filters(self): return { - "generate_esi": generate_esi, + "generate_esi": wrap_filter(PLUGIN_NAME)(generate_esi), } diff --git a/ansible_collections/arista/avd/plugins/filter/generate_lacp_id.py b/ansible_collections/arista/avd/plugins/filter/generate_lacp_id.py index c86b5323060..f9e9b507686 100644 --- a/ansible_collections/arista/avd/plugins/filter/generate_lacp_id.py +++ b/ansible_collections/arista/avd/plugins/filter/generate_lacp_id.py @@ -5,6 +5,22 @@ __metaclass__ = type +from ansible.errors import AnsibleFilterError + +from ansible_collections.arista.avd.plugins.plugin_utils.pyavd_wrappers import RaiseOnUse, wrap_filter + +PLUGIN_NAME = "arista.avd.generate_lacp_id" + +try: + from pyavd.j2filters import generate_lacp_id +except ImportError as e: + generate_lacp_id = RaiseOnUse( + AnsibleFilterError( + f"The '{PLUGIN_NAME}' plugin requires the 'pyavd' Python library. Got import error", + orig_exc=e, + ) + ) + DOCUMENTATION = r""" --- name: generate_lacp_id @@ -19,6 +35,10 @@ description: Short ESI value as per AVD definition in eos_designs. type: string required: true +deprecated: + removed_in: "5.0.0" + why: This filter is no longer used by AVD and is very simple to replace with a generic Jinja filter. + alternative: Use the builtin `replace` filter instead like `{{ | replace(':', '.') }}` """ EXAMPLES = r""" @@ -34,12 +54,8 @@ """ -def generate_lacp_id(esi_short): - return esi_short.replace(":", ".") - - class FilterModule(object): def filters(self): return { - "generate_lacp_id": generate_lacp_id, + "generate_lacp_id": wrap_filter(PLUGIN_NAME)(generate_lacp_id), } diff --git a/ansible_collections/arista/avd/plugins/filter/generate_route_target.py b/ansible_collections/arista/avd/plugins/filter/generate_route_target.py index e13bdf8787c..5efa91b9b0d 100644 --- a/ansible_collections/arista/avd/plugins/filter/generate_route_target.py +++ b/ansible_collections/arista/avd/plugins/filter/generate_route_target.py @@ -5,7 +5,21 @@ __metaclass__ = type -import re +from ansible.errors import AnsibleFilterError + +from ansible_collections.arista.avd.plugins.plugin_utils.pyavd_wrappers import RaiseOnUse, wrap_filter + +PLUGIN_NAME = "arista.avd.generate_route_target" + +try: + from pyavd.j2filters import generate_route_target +except ImportError as e: + generate_route_target = RaiseOnUse( + AnsibleFilterError( + f"The '{PLUGIN_NAME}' plugin requires the 'pyavd' Python library. Got import error", + orig_exc=e, + ) + ) DOCUMENTATION = r""" --- @@ -21,6 +35,12 @@ description: Short ESI value as per AVD definition in eos_designs. type: string required: true +deprecated: + removed_in: "5.0.0" + why: This filter is no longer used by AVD and is very simple to replace with a generic Jinja filter. + alternative: |- + Use the builtin `ansible.builtin.regex_replace` filter instead like + `{{ | ansible.builtin.regex_replace('(\\d{2})(\\d{2}):(\\d{2})(\\d{2}):(\\d{2})(\\d{2})', '\\1:\\2:\\3:\\4:\\5:\\6') }}` """ EXAMPLES = r""" @@ -36,30 +56,8 @@ """ -def generate_route_target(esi_short): - """ - generate_route_target Transform 3 octets ESI like 0303:0202:0101 to route-target - - Parameters - ---------- - esi : str - Short ESI value as per AVD definition in eos_designs - - Returns - ------- - str - String based on route-target format like 03:03:02:02:01:01 - """ - if esi_short is None: - return None - delimiter = ":" - esi = esi_short.replace(delimiter, "") - esi_split = re.findall("..", esi) - return delimiter.join(esi_split) - - class FilterModule(object): def filters(self): return { - "generate_route_target": generate_route_target, + "generate_route_target": wrap_filter(PLUGIN_NAME)(generate_route_target), } diff --git a/ansible_collections/arista/avd/plugins/filter/hide_passwords.py b/ansible_collections/arista/avd/plugins/filter/hide_passwords.py index 468a9526e4e..540e507bd68 100644 --- a/ansible_collections/arista/avd/plugins/filter/hide_passwords.py +++ b/ansible_collections/arista/avd/plugins/filter/hide_passwords.py @@ -4,9 +4,21 @@ # # arista.avd.hide_passwords filter # -__metaclass__ = type +from ansible.errors import AnsibleFilterError -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError +from ansible_collections.arista.avd.plugins.plugin_utils.pyavd_wrappers import RaiseOnUse, wrap_filter + +PLUGIN_NAME = "arista.avd.hide_passwords" + +try: + from pyavd.j2filters import hide_passwords +except ImportError as e: + hide_passwords = RaiseOnUse( + AnsibleFilterError( + f"The '{PLUGIN_NAME}' plugin requires the 'pyavd' Python library. Got import error", + orig_exc=e, + ) + ) DOCUMENTATION = r""" name: hide_passwords @@ -40,14 +52,8 @@ """ -def hide_passwords(value: str, hide_passwords: bool = False) -> str: - if not isinstance(hide_passwords, bool): - raise AristaAvdError(f"{hide_passwords} in hide_passwords filter is not of type bool") - return "" if hide_passwords else value - - class FilterModule(object): def filters(self): return { - "hide_passwords": hide_passwords, + "hide_passwords": wrap_filter(PLUGIN_NAME)(hide_passwords), } diff --git a/ansible_collections/arista/avd/plugins/filter/is_in_filter.py b/ansible_collections/arista/avd/plugins/filter/is_in_filter.py index 78283732eff..ceb8a2db299 100644 --- a/ansible_collections/arista/avd/plugins/filter/is_in_filter.py +++ b/ansible_collections/arista/avd/plugins/filter/is_in_filter.py @@ -8,6 +8,22 @@ __metaclass__ = type +from ansible.errors import AnsibleFilterError + +from ansible_collections.arista.avd.plugins.plugin_utils.pyavd_wrappers import RaiseOnUse, wrap_filter + +PLUGIN_NAME = "arista.avd.is_in_filter" + +try: + from pyavd.j2filters import is_in_filter +except ImportError as e: + is_in_filter = RaiseOnUse( + AnsibleFilterError( + f"The '{PLUGIN_NAME}' plugin requires the 'pyavd' Python library. Got import error", + orig_exc=e, + ) + ) + DOCUMENTATION = r""" --- name: is_in_filter @@ -49,16 +65,7 @@ class FilterModule(object): - def is_in_filter(self, hostname, hostname_filter): - if hostname_filter is None: - hostname_filter = ["all"] - if "all" in hostname_filter: - return True - elif any(element in hostname for element in hostname_filter): - return True - return False - def filters(self): return { - "is_in_filter": self.is_in_filter, + "is_in_filter": wrap_filter(PLUGIN_NAME)(is_in_filter), } diff --git a/ansible_collections/arista/avd/plugins/filter/list_compress.py b/ansible_collections/arista/avd/plugins/filter/list_compress.py index a7041d60aa6..a6122379828 100644 --- a/ansible_collections/arista/avd/plugins/filter/list_compress.py +++ b/ansible_collections/arista/avd/plugins/filter/list_compress.py @@ -8,10 +8,22 @@ __metaclass__ = type -from itertools import count, groupby - from ansible.errors import AnsibleFilterError +from ansible_collections.arista.avd.plugins.plugin_utils.pyavd_wrappers import RaiseOnUse, wrap_filter + +PLUGIN_NAME = "arista.avd.list_compress" + +try: + from pyavd.j2filters import list_compress +except ImportError as e: + list_compress = RaiseOnUse( + AnsibleFilterError( + f"The '{PLUGIN_NAME}' plugin requires the 'pyavd' Python library. Got import error", + orig_exc=e, + ) + ) + DOCUMENTATION = r""" --- name: list_compress @@ -44,15 +56,8 @@ """ -def list_compress(list_to_compress): - if not isinstance(list_to_compress, list): - raise AnsibleFilterError(f"value must be of type list, got {type(list_to_compress)}") - G = (list(x) for y, x in groupby(sorted(list_to_compress), lambda x, c=count(): next(c) - x)) - return ",".join("-".join(map(str, (g[0], g[-1])[: len(g)])) for g in G) - - class FilterModule(object): def filters(self): return { - "list_compress": list_compress, + "list_compress": wrap_filter(PLUGIN_NAME)(list_compress), } diff --git a/ansible_collections/arista/avd/plugins/filter/natural_sort.py b/ansible_collections/arista/avd/plugins/filter/natural_sort.py index 0780f018ec8..e8777fa214d 100644 --- a/ansible_collections/arista/avd/plugins/filter/natural_sort.py +++ b/ansible_collections/arista/avd/plugins/filter/natural_sort.py @@ -8,10 +8,21 @@ __metaclass__ = type -import re +from ansible.errors import AnsibleFilterError -from jinja2.runtime import Undefined -from jinja2.utils import Namespace +from ansible_collections.arista.avd.plugins.plugin_utils.pyavd_wrappers import RaiseOnUse, wrap_filter + +PLUGIN_NAME = "arista.avd.natural_sort" + +try: + from pyavd.j2filters import natural_sort +except ImportError as e: + natural_sort = RaiseOnUse( + AnsibleFilterError( + f"The '{PLUGIN_NAME}' plugin requires the 'pyavd' Python library. Got import error", + orig_exc=e, + ) + ) DOCUMENTATION = r""" --- @@ -55,27 +66,8 @@ """ -def convert(text): - return int(text) if text.isdigit() else text.lower() - - -def natural_sort(iterable, sort_key=None): - if isinstance(iterable, Undefined) or iterable is None: - return [] - - def alphanum_key(key): - if sort_key is not None and isinstance(key, dict): - return [convert(c) for c in re.split("([0-9]+)", str(key.get(sort_key, key)))] - elif sort_key is not None and isinstance(key, Namespace): - return [convert(c) for c in re.split("([0-9]+)", getattr(key, sort_key))] - else: - return [convert(c) for c in re.split("([0-9]+)", str(key))] - - return sorted(iterable, key=alphanum_key) - - class FilterModule(object): def filters(self): return { - "natural_sort": natural_sort, + "natural_sort": wrap_filter(PLUGIN_NAME)(natural_sort), } diff --git a/ansible_collections/arista/avd/plugins/filter/range_expand.py b/ansible_collections/arista/avd/plugins/filter/range_expand.py index 8feea48ce81..2150f5b3cfd 100644 --- a/ansible_collections/arista/avd/plugins/filter/range_expand.py +++ b/ansible_collections/arista/avd/plugins/filter/range_expand.py @@ -8,10 +8,23 @@ __metaclass__ = type -import re - from ansible.errors import AnsibleFilterError +from ansible_collections.arista.avd.plugins.plugin_utils.pyavd_wrappers import RaiseOnUse, wrap_filter + +PLUGIN_NAME = "arista.avd.range_expand" + +try: + from pyavd.j2filters import range_expand +except ImportError as e: + range_expand = RaiseOnUse( + AnsibleFilterError( + f"The '{PLUGIN_NAME}' plugin requires the 'pyavd' Python library. Got import error", + orig_exc=e, + ) + ) + + DOCUMENTATION = r""" --- name: range_expand @@ -82,153 +95,8 @@ """ -def range_expand(range_to_expand): - if not (isinstance(range_to_expand, list) or isinstance(range_to_expand, str)): - raise AnsibleFilterError(f"value must be of type list or str, got {type(range_to_expand)}") - - result = [] - - # If we got a list, unpack it and run this function recursively - if isinstance(range_to_expand, list): - for r in range_to_expand: - result.extend(range_expand(r)) - - # Must be a str now - else: - prefix = "" - - # Unpack list in string - for one_range in range_to_expand.split(","): - if one_range is None: - continue - - # Find prefix (if any) - regex = r"^(.*?)(((\d+)-)?(\d+)\/)?(((\d+)-)?(\d+)\/)?(((\d+)-)?(\d+))(\.((\d+)-)?(\d+))?" - # Number of groups in this regex. - regex_groups = 17 - # Groups one-by-one: - # Group 1 (.*?) matches prefix ex. Ethernet, Eth, Po, Port-Channel - # Group 2 (((\d+)-)?(\d+)\/)? matches module(s) and slash ex. 12/, 1-3/ - # Group 3 ((\d+)-)? matches first module and dash ex. 1- - # Group 4 (\d+) matches first module ex. 1 - # Group 5 (\d+) matches last module ex. 12, 3 - # Group 6 (((\d+)-)?(\d+)\/)? matches parent interface(s) and slash ex. 47/, 1-48/ - # Group 7 ((\d+)-)? matches parent interface(s) and dash ex. 47- - # Group 8 (\d+) matches first parent interface ex. 1 - # Group 9 (\d+) matches last parent interface ex. 47, 48 - # Group 10 (((\d+)-)?(\d+)) matches (breakout) interface(s) ex. 1, 1-4, 1-48 - # Group 11 ((\d+)-)? matches first interfaces and dash ex. 1-, 1- - # Group 12 (\d+) matches first interface - # Group 13 (\d+) matches last interface ex. 1, 4, 48 - # Group 14 (\.((\d+)-)?(\d+))? matches dot and sub-interface(s) ex. .141, .12-15 - # Group 15 ((\d+)-)? matches first sub-interface and dash ex. 12- - # Group 16 (\d+) matches first sub-interface ex. 12 - # Group 17 (\d+) matches last sub-interface ex. 141, 15 - # Remember that the groups() object is 0-based and the group numbers above are 1-based - search_result = re.search(regex, one_range) - if search_result: - if len(search_result.groups()) == regex_groups: - groups = search_result.groups() - first_module = last_module = None - first_parent_interface = last_parent_interface = None - first_interface = last_interface = None - first_subinterface = last_subinterface = None - # Set prefix if found (otherwise use last set prefix) - if groups[0]: - prefix = groups[0] - if groups[4]: - last_module = int(groups[4]) - if groups[3]: - first_module = int(groups[3]) - else: - first_module = last_module - if groups[8]: - last_parent_interface = int(groups[8]) - if groups[7]: - first_parent_interface = int(groups[7]) - else: - first_parent_interface = last_parent_interface - if groups[12]: - last_interface = int(groups[12]) - if groups[11]: - first_interface = int(groups[11]) - else: - first_interface = last_interface - if groups[16]: - last_subinterface = int(groups[16]) - if groups[15]: - first_subinterface = int(groups[15]) - else: - first_subinterface = last_subinterface - - def expand_subinterfaces(interface_string): - result = [] - if last_subinterface is not None: - if first_subinterface > last_subinterface: - raise AnsibleFilterError( - f"Range {one_range} could not be expanded because the first subinterface {first_subinterface} is larger than last" - f" subinterface {last_subinterface} in the range." - ) - for subinterface in range(first_subinterface, last_subinterface + 1): - result.append(f"{interface_string}.{subinterface}") - else: - result.append(interface_string) - return result - - def expand_interfaces(interface_string): - result = [] - if first_interface > last_interface: - raise AnsibleFilterError( - f"Range {one_range} could not be expanded because the first interface {first_interface} is larger than last interface" - f" {last_interface} in the range." - ) - for interface in range(first_interface, last_interface + 1): - for res in expand_subinterfaces(f"{interface_string}{interface}"): - result.append(res) - return result - - def expand_parent_interfaces(interface_string): - result = [] - if last_parent_interface: - if first_parent_interface > last_parent_interface: - raise AnsibleFilterError( - f"Range {one_range} could not be expanded because the first interface {first_parent_interface} is larger than last" - f" interface {last_parent_interface} in the range." - ) - for parent_interface in range(first_parent_interface, last_parent_interface + 1): - for res in expand_interfaces(f"{interface_string}{parent_interface}/"): - result.append(res) - else: - for res in expand_interfaces(f"{interface_string}"): - result.append(res) - return result - - def expand_module(interface_string): - result = [] - if last_module: - if first_module > last_module: - raise AnsibleFilterError( - f"Range {one_range} could not be expanded because the first module {first_module} is larger than last module" - f" {last_module} in the range." - ) - for module in range(first_module, last_module + 1): - for res in expand_parent_interfaces(f"{interface_string}{module}/"): - result.append(res) - else: - for res in expand_parent_interfaces(f"{interface_string}"): - result.append(res) - return result - - result.extend(expand_module(prefix)) - - else: - raise AnsibleFilterError(f"Invalid range, got {one_range} and found {search_result.groups()}") - - return result - - class FilterModule(object): def filters(self): return { - "range_expand": range_expand, + "range_expand": wrap_filter(PLUGIN_NAME)(range_expand), } diff --git a/ansible_collections/arista/avd/plugins/filter/snmp_hash.py b/ansible_collections/arista/avd/plugins/filter/snmp_hash.py index 64ddd0d77be..1ab440e8d35 100644 --- a/ansible_collections/arista/avd/plugins/filter/snmp_hash.py +++ b/ansible_collections/arista/avd/plugins/filter/snmp_hash.py @@ -7,10 +7,22 @@ __metaclass__ = type -import hashlib - from ansible.errors import AnsibleFilterError +from ansible_collections.arista.avd.plugins.plugin_utils.pyavd_wrappers import RaiseOnUse, wrap_filter + +PLUGIN_NAME = "arista.avd.snmp_hash" + +try: + from pyavd.j2filters import snmp_hash +except ImportError as e: + snmp_hash = RaiseOnUse( + AnsibleFilterError( + f"The '{PLUGIN_NAME}' plugin requires the 'pyavd' Python library. Got import error", + orig_exc=e, + ) + ) + DOCUMENTATION = r""" --- name: snmp_hash @@ -59,114 +71,7 @@ type: string """ -PRIV_KEY_LENGTH = {"des": 128, "aes": 128, "aes192": 192, "aes256": 256} - - -def get_hash_object(auth_type: str) -> hashlib._hashlib.HASH: - """ - :param auth_type: a string in [md5|sha|sha224|sha256|sha384|sha512] - - :return: an instance of hashlib._hashlib.HASH corresponding to the - auth_type - - :raises: AnsibleFilterError, when the auth_type is not valid - """ - auth = "sha1" if auth_type == "sha" else auth_type - try: - return hashlib.new(auth) - except ValueError: - raise AnsibleFilterError(f"{auth_type} is not a valid Auth algorithm for SNMPv3") from ValueError - - -def key_from_passphrase(passphrase: str, auth_type: str) -> str: - """ - RFC 2574 section A.2 algorithm - https://www.rfc-editor.org/rfc/rfc2574.html#appendix-A2 - - :param passphrase: the passphrase to use to generate the key - :param auth_type: a string in [md5|sha|sha224|sha256|sha384|sha512] - - :return: the key generated from the passphrase using auth_type as per - the algorithm described in the RFC. - - :raises: AnsibleFilterError, when the auth_type is not valid - """ - b_passphrase = passphrase - if isinstance(passphrase, str): - b_passphrase = passphrase.encode("UTF-8", errors="strict") - hash_object = get_hash_object(auth_type) - count = 0 - password_index = 0 - password_length = len(b_passphrase) - while count < 1048576: - cp = bytearray() - for index in range(0, 64): - cp.append(b_passphrase[password_index % password_length]) - password_index += 1 - hash_object.update(cp) - count += 64 - return hash_object.hexdigest() - - -def localize_passphrase(passphrase: str, auth_type: str, engine_id: str, priv_type: str = None) -> str: - """ - Key localization as described in RFC 2574, section 2.6 - https://www.rfc-editor.org/rfc/rfc2574.html#section-2.6 - - :param passphrase: the passphrase to localize, if priv_type is None - it is the auth passphrase else it is the priv - passphrase - :param auth_type: a string in [md5|sha|sha224|sha256|sha384|sha512] - :param engine_id: an hexadecimal string containing the engine_id to be - used to localize the key - :param auth_type: an optional argument indicating the priv algorithm - in [des|aes|aes192|aes256] - - :return: the localized key generated from the passphrase using auth_type - and if required truncated to match the appropriate keylength for - the priv_type. - - :raises: AnsibleFilterError, when the auth_type or priv_type is not valid - or if the engined_id is not a proper hexadecimal string - """ - - key = bytes.fromhex(key_from_passphrase(passphrase, auth_type)) - hash_object = get_hash_object(auth_type) - try: - hash_object.update(key + bytes.fromhex(engine_id) + key) - except ValueError as error: - raise AnsibleFilterError(f"engine ID {engine_id} is not an hexadecimal string") from error - localized_key = hash_object.hexdigest() - if priv_type is not None: - try: - while len(localized_key) * 4 < PRIV_KEY_LENGTH[priv_type]: - hash_object = get_hash_object(auth_type) - hash_object.update(bytes.fromhex(localized_key)) - localized_key = localized_key + hash_object.hexdigest() - # Truncate ithe key if required - localized_key = localized_key[: PRIV_KEY_LENGTH[priv_type] // 4] - except KeyError as error: - raise AnsibleFilterError(f"{priv_type} is not a valid Priv algorithm for SNMPv3") from error - return localized_key - - -def hash_passphrase(input_dict): - try: - passphrase = input_dict["passphrase"] - auth_type = input_dict["auth"] - engine_id = input_dict["engine_id"] - except KeyError as exc: - raise AnsibleFilterError() from exc - try: - priv_type = input_dict["priv"] - except KeyError: - priv_type = None - - return localize_passphrase(passphrase, auth_type, engine_id, priv_type) - class FilterModule(object): def filters(self): - return { - "snmp_hash": hash_passphrase, - } + return {"snmp_hash": wrap_filter(PLUGIN_NAME)(snmp_hash)} diff --git a/ansible_collections/arista/avd/plugins/filter/markdown_rendering.py b/ansible_collections/arista/avd/plugins/filter/status_render.py similarity index 59% rename from ansible_collections/arista/avd/plugins/filter/markdown_rendering.py rename to ansible_collections/arista/avd/plugins/filter/status_render.py index 8e4531656e7..f5f29232b35 100644 --- a/ansible_collections/arista/avd/plugins/filter/markdown_rendering.py +++ b/ansible_collections/arista/avd/plugins/filter/status_render.py @@ -5,6 +5,21 @@ __metaclass__ = type +from ansible.errors import AnsibleFilterError + +from ansible_collections.arista.avd.plugins.plugin_utils.pyavd_wrappers import RaiseOnUse, wrap_filter + +PLUGIN_NAME = "arista.avd.status_render" + +try: + from pyavd.j2filters import status_render +except ImportError as e: + status_render = RaiseOnUse( + AnsibleFilterError( + f"The '{PLUGIN_NAME}' plugin requires the 'pyavd' Python library. Got import error", + orig_exc=e, + ) + ) DOCUMENTATION = r""" --- @@ -38,33 +53,6 @@ class FilterModule(object): - # STATIC EMOJI CODE - GH_CODE = {} - # Github MD code for Emoji checked box - GH_CODE["PASS"] = ":white_check_mark:" - # GH MD code for Emoji Fail - GH_CODE["FAIL"] = ":x:" - - def status_render(self, state_string, rendering): - """ - status_render Convert Text to EMOJI code - - Parameters - ---------- - state_string : str - Text to convert in EMOJI - rendering : string - Markdown Flavor to use for Emoji rendering. - - Returns - ------- - str - Value to render in markdown - """ - if rendering == "github": - return self.GH_CODE[state_string.upper()] - else: - return state_string def filters(self): - return {"status_render": self.status_render} + return {"status_render": wrap_filter(PLUGIN_NAME)(status_render)} diff --git a/ansible_collections/arista/avd/plugins/modules/batch_template.py b/ansible_collections/arista/avd/plugins/modules/batch_template.py index 4402c010b6d..60c196845d9 100644 --- a/ansible_collections/arista/avd/plugins/modules/batch_template.py +++ b/ansible_collections/arista/avd/plugins/modules/batch_template.py @@ -25,6 +25,10 @@ required: true type: list elements: str +deprecated: + removed_in: "5.0.0" + why: The internal 'arista.avd.batch_template' action plugin is no longer used by AVD. + alternative: The plugin is released as open source, so it can be copied and reused according to the license and copyright. """ EXAMPLES = r""" diff --git a/ansible_collections/arista/avd/plugins/modules/cv_workflow.py b/ansible_collections/arista/avd/plugins/modules/cv_workflow.py index 7529eee01b0..5472629ca4f 100644 --- a/ansible_collections/arista/avd/plugins/modules/cv_workflow.py +++ b/ansible_collections/arista/avd/plugins/modules/cv_workflow.py @@ -134,6 +134,15 @@ For large inventories this can affect performance, so it is disabled by default. type: bool default: false +notes: + - |- + When interacting with CVaaS the regional URL where the tenant is deployed should be used, e.g: + `cv_servers: [ www.cv-prod-euwest-2.arista.io ]` + To see the full list of regional URLs, please visit the [cv_deploy](../../../roles/cv_deploy/README.md#overview) + role documentation. + - |- + To generate service accounts check [cv_deploy](../../../roles/cv_deploy/README.md#steps-to-create-service-accounts-on-cloudvision) + role documentation or the CloudVision Help Center. """ EXAMPLES = r""" diff --git a/ansible_collections/arista/avd/plugins/modules/eos_cli_config_gen.py b/ansible_collections/arista/avd/plugins/modules/eos_cli_config_gen.py new file mode 100644 index 00000000000..22d88207980 --- /dev/null +++ b/ansible_collections/arista/avd/plugins/modules/eos_cli_config_gen.py @@ -0,0 +1,103 @@ +# Copyright (c) 2021-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. + +DOCUMENTATION = r""" +--- +module: eos_cli_config_gen +version_added: "4.9.0" +author: Arista Ansible Team (@aristanetworks) +short_description: Generate AVD EOS device configurations and documentations +description: |- + The `arista.avd.eos_cli_config_gen` module is an Ansible Action Plugin providing the following capabilities: + + - Validates input variables according to eos_cli_config_gen schema + - Generates device configuration and saves it to file + - Optionallu generates device documentation and saves it to file +options: + structured_config_filename: + description: The path of the structured config to load. Required if read_structured_config_from_file is true. + type: str + config_filename: + description: The path to save the generated config to. Required if generate_device_config is true. + type: str + documentation_filename: + description: The path to save the generated documentation. Required if generate_device_doc is true. + type: str + read_structured_config_from_file: + description: Flag to indicate if the structured config should be read from a file or not. + type: bool + default: true + generate_device_config: + description: Flag to generate the device configuration. + type: bool + default: true + generate_device_doc: + description: Flag to generate the device documentation. + type: bool + default: true + device_doc_toc: + description: Flag to generate the table of content for the device documentation. + type: bool + default: true + conversion_mode: + description: + - Run data conversion in either "error", "warning", "info", "debug", "quiet" or "disabled" mode. + - Conversion will perform type conversion of input variables as defined in the schema. + - Conversion is intended to help the user to identify minor issues with the input data, while still allowing the data to be validated. + - During conversion, messages will be generated with information about the host(s) and key(s) which required conversion. + - conversion_mode:disabled means that conversion will not run. + - conversion_mode:error will produce error messages and fail the task. + - conversion_mode:warning will produce warning messages. + - conversion_mode:info will produce regular log messages. + - conversion_mode:debug will produce hidden messages viewable with -v. + - conversion_mode:quiet will not produce any messages. + required: false + default: "debug" + type: str + choices: [ "error", "warning", "info", "debug", "quiet", "disabled" ] + validation_mode: + description: + - Run validation in either "error", "warning", "info", "debug" or "disabled" mode. + - Validation will validate the input variables according to the schema. + - During validation, messages will be generated with information about the host(s) and key(s) which failed validation. + - validation_mode:disabled means that validation will not run. + - validation_mode:error will produce error messages and fail the task. + - validation_mode:warning will produce warning messages. + - validation_mode:info will produce regular log messages. + - validation_mode:debug will produce hidden messages viewable with -v. + required: false + default: "warning" + type: str + choices: [ "error", "warning", "info", "debug", "disabled" ] + cprofile_file: + description: + - Filename for storing cprofile data used to debug performance issues. + - Running cprofile will slow down performance in it self, so only set this while troubleshooting. + required: false + type: str +""" + +EXAMPLES = r""" +--- +- name: Generate eos intended configuration and device documentation + arista.avd.eos_cli_config_gen: + structured_config_filename: "{{ structured_config_filename }}" + config_filename: "{{ eos_config_dir }}/{{ inventory_hostname }}.cfg" + documentation_filename: "{{ devices_dir }}/{{ inventory_hostname }}.md" + read_structured_config_from_file: true + delegate_to: localhost + vars: + structured_config_filename: "{{ structured_dir }}/{{ inventory_hostname }}.{{ avd_structured_config_file_format }}" +- name: Generate device documentation only + arista.avd.eos_cli_config_gen: + structured_config_filename: "{{ structured_config_filename }}" + config_filename: "{{ eos_config_dir }}/{{ inventory_hostname }}.cfg" + documentation_filename: "{{ devices_dir }}/{{ inventory_hostname }}.md" + read_structured_config_from_file: true + generate_device_config: false + device_doc_toc: true + delegate_to: localhost + vars: + structured_config_filename: "{{ structured_dir }}/{{ inventory_hostname }}.{{ avd_structured_config_file_format }}" +""" diff --git a/ansible_collections/arista/avd/plugins/modules/eos_validate_state_reports.py b/ansible_collections/arista/avd/plugins/modules/eos_validate_state_reports.py index b55d721bb7a..c182b7999cc 100644 --- a/ansible_collections/arista/avd/plugins/modules/eos_validate_state_reports.py +++ b/ansible_collections/arista/avd/plugins/modules/eos_validate_state_reports.py @@ -2,11 +2,6 @@ # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. -# NOTE: This is supposed to be deprecated as per -# https://docs.ansible.com/ansible/latest/dev_guide/developing_modules_documenting.html#ansible-metadata-block -# But our doc Jinja2 template renders it as preview which is what we want -ANSIBLE_METADATA = {"metadata_version": "1.0", "status": ["preview"]} - DOCUMENTATION = r""" --- module: eos_validate_state_reports @@ -59,7 +54,7 @@ seealso: - name: ANTA website description: Documentation for the ANTA test framework - link: https://anta.ninja + link: https://anta.arista.com notes: - Enabling the cProfile feature for performance profiling may impact the plugin's performance, especially in production environments. - Hosts with `is_deployed` is False are automatically skipped, and no test results are processed for these hosts. diff --git a/ansible_collections/arista/avd/plugins/modules/eos_validate_state_runner.py b/ansible_collections/arista/avd/plugins/modules/eos_validate_state_runner.py index 19029b4472e..7ea1469eca5 100644 --- a/ansible_collections/arista/avd/plugins/modules/eos_validate_state_runner.py +++ b/ansible_collections/arista/avd/plugins/modules/eos_validate_state_runner.py @@ -2,11 +2,6 @@ # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. -# NOTE: This is supposed to be deprecated as per -# https://docs.ansible.com/ansible/latest/dev_guide/developing_modules_documenting.html#ansible-metadata-block -# But our doc Jinja2 template renders it as preview which is what we want -ANSIBLE_METADATA = {"metadata_version": "1.0", "status": ["preview"]} - DOCUMENTATION = r""" --- module: eos_validate_state_runner @@ -48,7 +43,7 @@ description: - The directory where custom ANTA test catalogs are stored. - Files must be named after the device hostname or the Ansible group name and have a `.yml` or `.yaml` extension. - skipped_tests: + skip_tests: description: - A list of dictionaries specifying categories and, optionally, tests to skip. - Each dictionary must have a key `category` and can optionally include a `tests` key. @@ -65,7 +60,7 @@ - An optional list of specific tests in the category to skip (e.g., `VerifyRoutingProtocolModel` in `AvdTestBGP`). - If not specified, all tests in the category are considered. - For a complete list of available tests, - see [link to the test list](https://avd.sh/en/stable/roles/eos_validate_state/ANTA-Preview.html#test-categories). + see [link to the test list](https://avd.arista.com/stable/roles/eos_validate_state/anta_integration.html#test-categories). cprofile_file: description: - The filename for storing cProfile data, useful for debugging performance issues. @@ -73,7 +68,7 @@ seealso: - name: ANTA website description: Documentation for the ANTA test framework - link: https://anta.ninja + link: https://anta.arista.com notes: - Enabling the cProfile feature for performance profiling may impact the plugin's performance, especially in production environments. - The plugin manages the creation of JSON files, which are used for storing test results. @@ -92,7 +87,7 @@ device_catalog_path: "/my_avd_project/intended/test_catalogs/{{ inventory_hostname }}-catalog.yml" test_results_dir: "/my_avd_project/reports/test_results" custom_anta_catalogs_dir: "/my_avd_project/custom_anta_catalogs" - skipped_tests: + skip_tests: - category: AvdTestHardware - category: AvdTestBGP tests: diff --git a/ansible_collections/arista/avd/plugins/modules/inventory_to_container.py b/ansible_collections/arista/avd/plugins/modules/inventory_to_container.py index d17e81476ef..fbfb9b727fc 100644 --- a/ansible_collections/arista/avd/plugins/modules/inventory_to_container.py +++ b/ansible_collections/arista/avd/plugins/modules/inventory_to_container.py @@ -150,7 +150,7 @@ def isIterable(testing_object=None): try: iter(testing_object) # noqa return True - except TypeError as te: # noqa # pylint: disable=unused-variable + except TypeError: return False diff --git a/ansible_collections/arista/avd/plugins/modules/validate_and_template.py b/ansible_collections/arista/avd/plugins/modules/validate_and_template.py index d4c75942718..99ea84008e8 100644 --- a/ansible_collections/arista/avd/plugins/modules/validate_and_template.py +++ b/ansible_collections/arista/avd/plugins/modules/validate_and_template.py @@ -81,6 +81,10 @@ - Running cprofile will slow down performance in itself, so only set this while troubleshooting. required: false type: str +deprecated: + removed_in: "5.0.0" + why: The internal 'arista.avd.validate_and_template' action plugin is no longer used by AVD. + alternative: The plugin is released as open source, so it can be copied and reused according to the license and copyright. """ EXAMPLES = r""" diff --git a/ansible_collections/arista/avd/plugins/modules/yaml_templates_to_facts.py b/ansible_collections/arista/avd/plugins/modules/yaml_templates_to_facts.py index 07cc287a9cd..ce07f05db5c 100644 --- a/ansible_collections/arista/avd/plugins/modules/yaml_templates_to_facts.py +++ b/ansible_collections/arista/avd/plugins/modules/yaml_templates_to_facts.py @@ -123,6 +123,10 @@ required: false type: bool default: true +deprecated: + removed_in: "5.0.0" + why: The internal 'arista.avd.yaml_templates_to_facts' action plugin is no longer used by AVD. + alternative: The plugin is released as open source, so it can be copied and reused according to the license and copyright. """ EXAMPLES = r""" @@ -131,7 +135,7 @@ arista.avd.yaml_templates_to_facts: root_key: structured_config templates: - - python_module: "ansible_collections.arista.avd.roles.eos_designs.python_modules.base" + - python_module: "pyavd._eos_designs.structured_config.base" python_class_name: "AvdStructuredConfig" - template: "mlag/main.j2" - template: "designs/underlay/main.j2" diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/Makefile b/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/Makefile deleted file mode 100644 index 77445360b4f..00000000000 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/Makefile +++ /dev/null @@ -1,46 +0,0 @@ -# Example to add experimental protos: -# EXTRA_DIRS="-I ~/go/src/arista/resources" EXTRA_PROTOS="~/go/src/arista/resources/arista/configlet.v1/configlet.proto ~/go/src/arista/resources/arista/configlet.v1/services.gen.proto" make -VENDORPATH=cloudvision-apis -EXTRA_PROTOS?= -EXTRA_DIRS?= -DUMMY := $(shell \ - rm -rf $(VENDORPATH); \ - git clone --single-branch --branch trunk https://github.com/aristanetworks/cloudvision-apis.git $(VENDORPATH); \ -) - -APIPATH=api - -PYTHON ?= python3 - -ALL_PROTOS=$(shell find $(VENDORPATH) -name "*.proto") - -IMPORTS_TO_TRY_EXCEPT_1 = import aristaproto\nimport grpclib\nfrom aristaproto\.grpc\.grpclib_server import ServiceBase -TRY_EXCEPTED_IMPORTS_1 = try:\n import aristaproto\n import grpclib\n from aristaproto.grpc.grpclib_server import ServiceBase\nexcept ImportError:\n HAS_ARISTAPROTO = False\n from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_aristaproto as aristaproto\n from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_grpclib as grpclib\n ServiceBase = object\nelse:\n HAS_ARISTAPROTO = True -IMPORTS_TO_TRY_EXCEPT_2 = ^import aristaproto -TRY_EXCEPTED_IMPORTS_2 = try:\n import aristaproto\nexcept ImportError:\n HAS_ARISTAPROTO = False\n from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_aristaproto as aristaproto\nelse:\n HAS_ARISTAPROTO = True - -default: api - -.PHONY: help -help: ## Display help message - @grep -E '^[0-9a-zA-Z_-]+\.*[0-9a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' - -api-dir: - mkdir -p api - rm -rf ./api/* - -api-models: api-dir - $(PYTHON) -m grpc_tools.protoc -I $(VENDORPATH) $(EXTRA_DIRS) --python_aristaproto_out=$(APIPATH) $(ALL_PROTOS) $(EXTRA_PROTOS) - -api-ansible-sanity-import: api-models -# For most arista protos - find $(APIPATH) -name '*.py' -exec sed -z -i -e 's/$(IMPORTS_TO_TRY_EXCEPT_1)/$(TRY_EXCEPTED_IMPORTS_1)/g' {} + -# For fmp, subscriptions, time proto - find $(APIPATH) -name '*.py' -exec sed -i -e 's/$(IMPORTS_TO_TRY_EXCEPT_2)/$(TRY_EXCEPTED_IMPORTS_2)/g' {} + - -api: api-dir api-models api-ansible-sanity-import ## Build/refresh gRPC bindings in ./api - @rm -rf $(VENDORPATH) - @pre-commit run insert-license --files $(shell find $(APIPATH)/ -name "*.py") || true - @echo "--- done" - @echo "If you got here, everything went well." - @echo "All the output above is just because we use pre-commit to insert licenses into the generated files." diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/__init__.py b/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/__init__.py deleted file mode 100644 index 9bcbfd1a427..00000000000 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. - -from .workflows.deploy_to_cv import deploy_to_cv - -__all__ = ["deploy_to_cv"] diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/configstatus/v1/__init__.py b/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/configstatus/v1/__init__.py deleted file mode 100644 index 0f90cce64b4..00000000000 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/configstatus/v1/__init__.py +++ /dev/null @@ -1,1676 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -# Generated by the protocol buffer compiler. DO NOT EDIT! -# sources: arista/configstatus.v1/configstatus.proto, arista/configstatus.v1/services.gen.proto -# plugin: python-aristaproto -# This file has been @generated - -from dataclasses import dataclass -from datetime import datetime -from typing import ( - TYPE_CHECKING, - AsyncIterator, - Dict, - List, - Optional, -) - -try: - import aristaproto - import grpclib - from aristaproto.grpc.grpclib_server import ServiceBase -except ImportError: - HAS_ARISTAPROTO = False - from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_aristaproto as aristaproto - from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_grpclib as grpclib - ServiceBase = object -else: - HAS_ARISTAPROTO = True - -from ... import ( - subscriptions as __subscriptions__, - time as __time__, -) - - -if TYPE_CHECKING: - import grpclib.server - from aristaproto.grpc.grpclib_client import MetadataLike - from grpclib.metadata import Deadline - - -class ErrorCode(aristaproto.Enum): - """ - ErrorCode indicates warnings and errors produced during computing config - """ - - UNSPECIFIED = 0 - DEVICE_WARNING = 1 - """DEVICE_WARNING indicates device warning""" - - DEVICE_ERROR = 2 - """DEVICE_ERROR indicates device error""" - - UNREACHABLE_DEVICE = 3 - """UNREACHABLE_DEVICE indicates the device cannot be reached""" - - CONFIG_FILTER_ERROR = 4 - """ - CONFIG_FILTER_ERROR indicates error from partial config management filters - """ - - INTERNAL = 5 - """INTERNAL indicates internal errors""" - - -class DiffOp(aristaproto.Enum): - """ - DiffOp is the operation to a line from one side of diff to get to another - """ - - UNSPECIFIED = 0 - NOP = 1 - """NOP indicates no change. A and B are identical at this line""" - - IGNORE = 2 - """ - IGNORE indicates a line that's ignored in either A or B. - One of a_line_num or b_line_num will be -1 - """ - - ADD = 3 - """ADD is an addition of a line from A""" - - DELETE = 4 - """DELETE is deletion of a line from B""" - - CHANGE = 5 - """CHANGE is a modification to a line in A""" - - -class ConfigFilterCode(aristaproto.Enum): - """ConfigFilterCode indicates if a config line matches PCM filter(s)""" - - UNSPECIFIED = 0 - """ - UNSPECIFIED indicates config line did not match any partial config management (PCM) filter - """ - - MANAGED_LINE = 1 - """ - MANAGED_LINE indicates config line matches managed PCM filter hence is managed - """ - - UNMANAGED_LINE = 2 - """ - UNMANAGED_LINE indicates config line matches unmanaged PCM filter hence is not managed - """ - - -class ConfigSyncCode(aristaproto.Enum): - """ConfigSyncCode indicates config synchronization status""" - - UNSPECIFIED = 0 - IN_SYNC = 1 - """IN_SYNC indicates designed config and running config are identical""" - - OUT_OF_SYNC = 2 - """ - OUT_OF_SYNC indicates designed config and running config are not identical - """ - - -class ConfigSourceType(aristaproto.Enum): - """ - ConfigSourceType indicates the type of source for the proposed/designed configuration - for the device - """ - - UNSPECIFIED = 0 - NETWORK_PROVISIONING_CONFIGLET = 1 - """ - CONFIG_SOURCE_TYPE_NETWORK_PROVISIONING_CONFIGLET - configlet created from - the network provisioning workflow. - """ - - STUDIO = 2 - """CONFIG_SOURCE_TYPE_STUDIO - config generated from a regular studio""" - - STUDIO_STATIC = 3 - """ - SCONFIG_SOURCE_TYPE_STUDIO_STATIC - static config from studios framework - """ - - -class ConfigType(aristaproto.Enum): - UNSPECIFIED = 0 - RUNNING_CONFIG = 1 - DESIGNED_CONFIG = 2 - - -@dataclass(eq=False, repr=False) -class ConfigError(aristaproto.Message): - """ - ConfigError represents errors reported by CVP when handling device configuration - """ - - error_code: "ErrorCode" = aristaproto.enum_field(1) - error_msg: Optional[str] = aristaproto.message_field( - 2, wraps=aristaproto.TYPE_STRING - ) - line_num: Optional[int] = aristaproto.message_field(3, wraps=aristaproto.TYPE_INT32) - """Line_num represents line number, if any""" - - configlet_name: Optional[str] = aristaproto.message_field( - 4, wraps=aristaproto.TYPE_STRING - ) - """ - Configlet_name represents the originating configlet name. Configlet_name - and line_num point to the line where config warning or config error originate. - """ - - -@dataclass(eq=False, repr=False) -class ConfigErrors(aristaproto.Message): - values: List["ConfigError"] = aristaproto.message_field(1) - - -@dataclass(eq=False, repr=False) -class DiffEntry(aristaproto.Message): - """DiffEntry represents one entry in a Diff""" - - op: "DiffOp" = aristaproto.enum_field(1) - a_line_num: Optional[int] = aristaproto.message_field( - 2, wraps=aristaproto.TYPE_INT32 - ) - """line number in A this diff applies to""" - - b_line_num: Optional[int] = aristaproto.message_field( - 3, wraps=aristaproto.TYPE_INT32 - ) - """line number in B this diff applies to""" - - b_parent_line_num: Optional[int] = aristaproto.message_field( - 4, wraps=aristaproto.TYPE_INT32 - ) - """line number of the parent command in B""" - - a_line: Optional[str] = aristaproto.message_field(5, wraps=aristaproto.TYPE_STRING) - """content of config line in A""" - - b_line: Optional[str] = aristaproto.message_field(6, wraps=aristaproto.TYPE_STRING) - """content of config line in B""" - - a_filter_code: "ConfigFilterCode" = aristaproto.enum_field(7) - """Config filter code of the line in A""" - - b_filter_code: "ConfigFilterCode" = aristaproto.enum_field(8) - """Config filter code of the line in B""" - - a_parent_line_num: Optional[int] = aristaproto.message_field( - 9, wraps=aristaproto.TYPE_INT32 - ) - """line number of the parent command in A""" - - -@dataclass(eq=False, repr=False) -class DiffEntries(aristaproto.Message): - """DiffEntries indicates potential multiple lines of config diff""" - - values: List["DiffEntry"] = aristaproto.message_field(1) - - -@dataclass(eq=False, repr=False) -class ConfigSource(aristaproto.Message): - """ - ConfigSource describes an individual source of the proposed/designed config - """ - - source_type: "ConfigSourceType" = aristaproto.enum_field(1) - source_id: Optional[str] = aristaproto.message_field( - 2, wraps=aristaproto.TYPE_STRING - ) - """ - source_id identifier to distinguish between multiple instances of the source type - source_id is : - configlet name for CONFIG_SOURCE_TYPE_NETWORK_PROVISIONING_CONFIGLET - studio id for CONFIG_SOURCE_TYPE_STUDIO - configlet id for CONFIG_SOURCE_TYPE_STUDIO_STATIC - """ - - -@dataclass(eq=False, repr=False) -class ConfigSources(aristaproto.Message): - """ConfigSources is the list of sources of the proposed/designed config""" - - values: List["ConfigSource"] = aristaproto.message_field(1) - - -@dataclass(eq=False, repr=False) -class ConfigSummary(aristaproto.Message): - """ConfigSummary represents device configuration summary.""" - - sync: "ConfigSyncCode" = aristaproto.enum_field(1) - nop_lines: Optional[int] = aristaproto.message_field( - 2, wraps=aristaproto.TYPE_INT32 - ) - """Number of lines with code no-operation""" - - ignored_lines: Optional[int] = aristaproto.message_field( - 3, wraps=aristaproto.TYPE_INT32 - ) - """Number of lines with code IGNORE""" - - added_lines: Optional[int] = aristaproto.message_field( - 4, wraps=aristaproto.TYPE_INT32 - ) - """Number of lines with code ADD""" - - deleted_lines: Optional[int] = aristaproto.message_field( - 5, wraps=aristaproto.TYPE_INT32 - ) - """Number of lines with code DELETE""" - - changed_lines: Optional[int] = aristaproto.message_field( - 6, wraps=aristaproto.TYPE_INT32 - ) - """Number of lines with code CHANGE""" - - designed_config_errors: Optional[int] = aristaproto.message_field( - 7, wraps=aristaproto.TYPE_INT32 - ) - """Number of designed config errors""" - - designed_config_warnings: Optional[int] = aristaproto.message_field( - 8, wraps=aristaproto.TYPE_INT32 - ) - """Number of designed config warnings""" - - running_config_update_time: datetime = aristaproto.message_field(9) - """Timestamp at which running config is updated""" - - designed_config_update_time: datetime = aristaproto.message_field(10) - """Timestamp at which designed config is updated""" - - running_config_uri: Optional[str] = aristaproto.message_field( - 11, wraps=aristaproto.TYPE_STRING - ) - """ - The HTTP URI client can use to GET running config and associated errors - """ - - designed_config_uri: Optional[str] = aristaproto.message_field( - 12, wraps=aristaproto.TYPE_STRING - ) - """ - The HTTP URI client can use to GET designed config and associated errors - """ - - diff_uri: Optional[str] = aristaproto.message_field( - 13, wraps=aristaproto.TYPE_STRING - ) - """The HTTP URI client can use to GET config diff and associated errors""" - - digest: Optional[str] = aristaproto.message_field(14, wraps=aristaproto.TYPE_STRING) - """Digest (SHA-256) of the config diff.""" - - -@dataclass(eq=False, repr=False) -class ConfigKey(aristaproto.Message): - """ConfigKey uniquely identifies a config request.""" - - device_id: Optional[str] = aristaproto.message_field( - 1, wraps=aristaproto.TYPE_STRING - ) - """Device_id is the serial number of the device""" - - type: "ConfigType" = aristaproto.enum_field(2) - """Type describes the config type""" - - -@dataclass(eq=False, repr=False) -class Configuration(aristaproto.Message): - """Configuration represents device's CLI configuration""" - - key: "ConfigKey" = aristaproto.message_field(1) - uri: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) - """ - Uri represents the HTTP URI client can use to GET config body and associated errors - """ - - -@dataclass(eq=False, repr=False) -class ConfigDiffKey(aristaproto.Message): - """ConfigDiffKey uniquely identifies a configuration diff request""" - - a_device_id: Optional[str] = aristaproto.message_field( - 1, wraps=aristaproto.TYPE_STRING - ) - """ - A_device_id is the serial number of the device on A side (left hand side) - """ - - a_type: "ConfigType" = aristaproto.enum_field(2) - """A_type is the config type on A side (left hand side)""" - - a_time: datetime = aristaproto.message_field(3) - """ - A_time is the time at which to fetch config on A side (left hand side) - """ - - b_device_id: Optional[str] = aristaproto.message_field( - 4, wraps=aristaproto.TYPE_STRING - ) - """ - B_device_id is the serial number of the device on B side (right hand side) - """ - - b_type: "ConfigType" = aristaproto.enum_field(5) - """B_type is the config type on B side (right hand side)""" - - b_time: datetime = aristaproto.message_field(6) - """ - B_time is the time at which to fetch config on B side (right hand side) - """ - - -@dataclass(eq=False, repr=False) -class ConfigDiff(aristaproto.Message): - key: "ConfigDiffKey" = aristaproto.message_field(1) - """Key represents config diff key""" - - uri: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) - """ - Uri represents the HTTP URI client can use to GET config diff and associated errors - """ - - -@dataclass(eq=False, repr=False) -class SummaryKey(aristaproto.Message): - """SummaryKey uniquely identifies a device summary request""" - - device_id: Optional[str] = aristaproto.message_field( - 1, wraps=aristaproto.TYPE_STRING - ) - """Device_id is the serial number of the device""" - - -@dataclass(eq=False, repr=False) -class Summary(aristaproto.Message): - key: "SummaryKey" = aristaproto.message_field(1) - summary: "ConfigSummary" = aristaproto.message_field(2) - - -@dataclass(eq=False, repr=False) -class SecurityProfile(aristaproto.Message): - """ - SecurityProfile holds the EOS configuration for the security profile. - """ - - key: "ConfigKey" = aristaproto.message_field(1) - """key uniquely identifies the configuration""" - - config: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) - """config describes the security profile config body""" - - -@dataclass(eq=False, repr=False) -class SecurityProfileComplianceSummary(aristaproto.Message): - """ - SecurityProfileComplianceSummary holds the compliance summary for - security profile configuration. - """ - - sync: "ConfigSyncCode" = aristaproto.enum_field(1) - nop_lines: Optional[int] = aristaproto.message_field( - 2, wraps=aristaproto.TYPE_INT32 - ) - """nop_lines is the number of lines with code no-operation""" - - ignored_lines: Optional[int] = aristaproto.message_field( - 3, wraps=aristaproto.TYPE_INT32 - ) - """ignored_lines is the number of lines with code IGNORE""" - - added_lines: Optional[int] = aristaproto.message_field( - 4, wraps=aristaproto.TYPE_INT32 - ) - """added_lines is the number of lines with code ADD""" - - deleted_lines: Optional[int] = aristaproto.message_field( - 5, wraps=aristaproto.TYPE_INT32 - ) - """deleted_lines is the number of lines with code DELETE""" - - changed_lines: Optional[int] = aristaproto.message_field( - 6, wraps=aristaproto.TYPE_INT32 - ) - """changed_lines is the Number of lines with code CHANGE""" - - digest: Optional[str] = aristaproto.message_field(7, wraps=aristaproto.TYPE_STRING) - """ - digest is the digest (SHA-256 hash) of the security profile configuration diff - """ - - running_config_update_time: datetime = aristaproto.message_field(8) - """ - running_config_update_time is the timestamp at which running security profile - or running config is updated - """ - - designed_config_update_time: datetime = aristaproto.message_field(9) - """ - designed_config_update_time is the timestamp at which designed security profile or - designed config is updated - """ - - -@dataclass(eq=False, repr=False) -class SecurityProfileDiffSummary(aristaproto.Message): - """ - SecurityProfileDiffSummary holds device compliance summary w.r.t security profile. - """ - - key: "SummaryKey" = aristaproto.message_field(1) - """key uniquely identifies the Summary""" - - summary: "SecurityProfileComplianceSummary" = aristaproto.message_field(2) - """summary is the security profile configuration compliance summary""" - - -@dataclass(eq=False, repr=False) -class SecurityProfileDiff(aristaproto.Message): - """SecurityProfileDiff holds the security profile configuration diff.""" - - key: "ConfigDiffKey" = aristaproto.message_field(1) - """key represents security profile config diff key""" - - diff: "DiffEntries" = aristaproto.message_field(2) - """diff represents diff entries""" - - -@dataclass(eq=False, repr=False) -class ConfigDiffRequest(aristaproto.Message): - key: "ConfigDiffKey" = aristaproto.message_field(1) - """ - Key uniquely identifies a ConfigDiff instance to retrieve. - This value must be populated. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the time for which you are interested in the data. - If no time is given, the server will use the time at which it makes the request. - """ - - -@dataclass(eq=False, repr=False) -class ConfigDiffResponse(aristaproto.Message): - value: "ConfigDiff" = aristaproto.message_field(1) - """ - Value is the value requested. - This structure will be fully-populated as it exists in the datastore. If - optional fields were not given at creation, these fields will be empty or - set to default values. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time carries the (UTC) timestamp of the last-modification of the - ConfigDiff instance in this response. - """ - - -@dataclass(eq=False, repr=False) -class ConfigDiffStreamRequest(aristaproto.Message): - partial_eq_filter: List["ConfigDiff"] = aristaproto.message_field(1) - """ - PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. - This requires all provided fields to be equal to the response. - - While transparent to users, this field also allows services to optimize internal - subscriptions if filter(s) are sufficiently specific. - """ - - time: "__time__.TimeBounds" = aristaproto.message_field(3) - """ - TimeRange allows limiting response data to within a specified time window. - If this field is populated, at least one of the two time fields are required. - - This field is not allowed in the Subscribe RPC. - """ - - -@dataclass(eq=False, repr=False) -class ConfigDiffStreamResponse(aristaproto.Message): - value: "ConfigDiff" = aristaproto.message_field(1) - """ - Value is a value deemed relevant to the initiating request. - This structure will always have its key-field populated. Which other fields are - populated, and why, depends on the value of Operation and what triggered this notification. - """ - - time: datetime = aristaproto.message_field(2) - """Time holds the timestamp of this ConfigDiff's last modification.""" - - type: "__subscriptions__.Operation" = aristaproto.enum_field(3) - """ - Operation indicates how the ConfigDiff value in this response should be considered. - Under non-subscribe requests, this value should always be INITIAL. In a subscription, - once all initial data is streamed and the client begins to receive modification updates, - you should not see INITIAL again. - """ - - -@dataclass(eq=False, repr=False) -class ConfigurationRequest(aristaproto.Message): - key: "ConfigKey" = aristaproto.message_field(1) - """ - Key uniquely identifies a Configuration instance to retrieve. - This value must be populated. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the time for which you are interested in the data. - If no time is given, the server will use the time at which it makes the request. - """ - - -@dataclass(eq=False, repr=False) -class ConfigurationResponse(aristaproto.Message): - value: "Configuration" = aristaproto.message_field(1) - """ - Value is the value requested. - This structure will be fully-populated as it exists in the datastore. If - optional fields were not given at creation, these fields will be empty or - set to default values. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time carries the (UTC) timestamp of the last-modification of the - Configuration instance in this response. - """ - - -@dataclass(eq=False, repr=False) -class ConfigurationStreamRequest(aristaproto.Message): - partial_eq_filter: List["Configuration"] = aristaproto.message_field(1) - """ - PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. - This requires all provided fields to be equal to the response. - - While transparent to users, this field also allows services to optimize internal - subscriptions if filter(s) are sufficiently specific. - """ - - time: "__time__.TimeBounds" = aristaproto.message_field(3) - """ - TimeRange allows limiting response data to within a specified time window. - If this field is populated, at least one of the two time fields are required. - - This field is not allowed in the Subscribe RPC. - """ - - -@dataclass(eq=False, repr=False) -class ConfigurationStreamResponse(aristaproto.Message): - value: "Configuration" = aristaproto.message_field(1) - """ - Value is a value deemed relevant to the initiating request. - This structure will always have its key-field populated. Which other fields are - populated, and why, depends on the value of Operation and what triggered this notification. - """ - - time: datetime = aristaproto.message_field(2) - """Time holds the timestamp of this Configuration's last modification.""" - - type: "__subscriptions__.Operation" = aristaproto.enum_field(3) - """ - Operation indicates how the Configuration value in this response should be considered. - Under non-subscribe requests, this value should always be INITIAL. In a subscription, - once all initial data is streamed and the client begins to receive modification updates, - you should not see INITIAL again. - """ - - -@dataclass(eq=False, repr=False) -class SecurityProfileRequest(aristaproto.Message): - key: "ConfigKey" = aristaproto.message_field(1) - """ - Key uniquely identifies a SecurityProfile instance to retrieve. - This value must be populated. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the time for which you are interested in the data. - If no time is given, the server will use the time at which it makes the request. - """ - - -@dataclass(eq=False, repr=False) -class SecurityProfileResponse(aristaproto.Message): - value: "SecurityProfile" = aristaproto.message_field(1) - """ - Value is the value requested. - This structure will be fully-populated as it exists in the datastore. If - optional fields were not given at creation, these fields will be empty or - set to default values. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time carries the (UTC) timestamp of the last-modification of the - SecurityProfile instance in this response. - """ - - -@dataclass(eq=False, repr=False) -class SecurityProfileStreamRequest(aristaproto.Message): - partial_eq_filter: List["SecurityProfile"] = aristaproto.message_field(1) - """ - PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. - This requires all provided fields to be equal to the response. - - While transparent to users, this field also allows services to optimize internal - subscriptions if filter(s) are sufficiently specific. - """ - - time: "__time__.TimeBounds" = aristaproto.message_field(3) - """ - TimeRange allows limiting response data to within a specified time window. - If this field is populated, at least one of the two time fields are required. - - This field is not allowed in the Subscribe RPC. - """ - - -@dataclass(eq=False, repr=False) -class SecurityProfileStreamResponse(aristaproto.Message): - value: "SecurityProfile" = aristaproto.message_field(1) - """ - Value is a value deemed relevant to the initiating request. - This structure will always have its key-field populated. Which other fields are - populated, and why, depends on the value of Operation and what triggered this notification. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time holds the timestamp of this SecurityProfile's last modification. - """ - - type: "__subscriptions__.Operation" = aristaproto.enum_field(3) - """ - Operation indicates how the SecurityProfile value in this response should be considered. - Under non-subscribe requests, this value should always be INITIAL. In a subscription, - once all initial data is streamed and the client begins to receive modification updates, - you should not see INITIAL again. - """ - - -@dataclass(eq=False, repr=False) -class SecurityProfileDiffRequest(aristaproto.Message): - key: "ConfigDiffKey" = aristaproto.message_field(1) - """ - Key uniquely identifies a SecurityProfileDiff instance to retrieve. - This value must be populated. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the time for which you are interested in the data. - If no time is given, the server will use the time at which it makes the request. - """ - - -@dataclass(eq=False, repr=False) -class SecurityProfileDiffResponse(aristaproto.Message): - value: "SecurityProfileDiff" = aristaproto.message_field(1) - """ - Value is the value requested. - This structure will be fully-populated as it exists in the datastore. If - optional fields were not given at creation, these fields will be empty or - set to default values. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time carries the (UTC) timestamp of the last-modification of the - SecurityProfileDiff instance in this response. - """ - - -@dataclass(eq=False, repr=False) -class SecurityProfileDiffStreamRequest(aristaproto.Message): - partial_eq_filter: List["SecurityProfileDiff"] = aristaproto.message_field(1) - """ - PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. - This requires all provided fields to be equal to the response. - - While transparent to users, this field also allows services to optimize internal - subscriptions if filter(s) are sufficiently specific. - """ - - time: "__time__.TimeBounds" = aristaproto.message_field(3) - """ - TimeRange allows limiting response data to within a specified time window. - If this field is populated, at least one of the two time fields are required. - - This field is not allowed in the Subscribe RPC. - """ - - -@dataclass(eq=False, repr=False) -class SecurityProfileDiffStreamResponse(aristaproto.Message): - value: "SecurityProfileDiff" = aristaproto.message_field(1) - """ - Value is a value deemed relevant to the initiating request. - This structure will always have its key-field populated. Which other fields are - populated, and why, depends on the value of Operation and what triggered this notification. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time holds the timestamp of this SecurityProfileDiff's last modification. - """ - - type: "__subscriptions__.Operation" = aristaproto.enum_field(3) - """ - Operation indicates how the SecurityProfileDiff value in this response should be considered. - Under non-subscribe requests, this value should always be INITIAL. In a subscription, - once all initial data is streamed and the client begins to receive modification updates, - you should not see INITIAL again. - """ - - -@dataclass(eq=False, repr=False) -class SecurityProfileDiffSummaryRequest(aristaproto.Message): - key: "SummaryKey" = aristaproto.message_field(1) - """ - Key uniquely identifies a SecurityProfileDiffSummary instance to retrieve. - This value must be populated. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the time for which you are interested in the data. - If no time is given, the server will use the time at which it makes the request. - """ - - -@dataclass(eq=False, repr=False) -class SecurityProfileDiffSummaryResponse(aristaproto.Message): - value: "SecurityProfileDiffSummary" = aristaproto.message_field(1) - """ - Value is the value requested. - This structure will be fully-populated as it exists in the datastore. If - optional fields were not given at creation, these fields will be empty or - set to default values. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time carries the (UTC) timestamp of the last-modification of the - SecurityProfileDiffSummary instance in this response. - """ - - -@dataclass(eq=False, repr=False) -class SecurityProfileDiffSummaryStreamRequest(aristaproto.Message): - partial_eq_filter: List["SecurityProfileDiffSummary"] = aristaproto.message_field(1) - """ - PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. - This requires all provided fields to be equal to the response. - - While transparent to users, this field also allows services to optimize internal - subscriptions if filter(s) are sufficiently specific. - """ - - time: "__time__.TimeBounds" = aristaproto.message_field(3) - """ - TimeRange allows limiting response data to within a specified time window. - If this field is populated, at least one of the two time fields are required. - - This field is not allowed in the Subscribe RPC. - """ - - -@dataclass(eq=False, repr=False) -class SecurityProfileDiffSummaryStreamResponse(aristaproto.Message): - value: "SecurityProfileDiffSummary" = aristaproto.message_field(1) - """ - Value is a value deemed relevant to the initiating request. - This structure will always have its key-field populated. Which other fields are - populated, and why, depends on the value of Operation and what triggered this notification. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time holds the timestamp of this SecurityProfileDiffSummary's last modification. - """ - - type: "__subscriptions__.Operation" = aristaproto.enum_field(3) - """ - Operation indicates how the SecurityProfileDiffSummary value in this response should be considered. - Under non-subscribe requests, this value should always be INITIAL. In a subscription, - once all initial data is streamed and the client begins to receive modification updates, - you should not see INITIAL again. - """ - - -@dataclass(eq=False, repr=False) -class SummaryRequest(aristaproto.Message): - key: "SummaryKey" = aristaproto.message_field(1) - """ - Key uniquely identifies a Summary instance to retrieve. - This value must be populated. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the time for which you are interested in the data. - If no time is given, the server will use the time at which it makes the request. - """ - - -@dataclass(eq=False, repr=False) -class SummaryResponse(aristaproto.Message): - value: "Summary" = aristaproto.message_field(1) - """ - Value is the value requested. - This structure will be fully-populated as it exists in the datastore. If - optional fields were not given at creation, these fields will be empty or - set to default values. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time carries the (UTC) timestamp of the last-modification of the - Summary instance in this response. - """ - - -@dataclass(eq=False, repr=False) -class SummaryStreamRequest(aristaproto.Message): - partial_eq_filter: List["Summary"] = aristaproto.message_field(1) - """ - PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. - This requires all provided fields to be equal to the response. - - While transparent to users, this field also allows services to optimize internal - subscriptions if filter(s) are sufficiently specific. - """ - - time: "__time__.TimeBounds" = aristaproto.message_field(3) - """ - TimeRange allows limiting response data to within a specified time window. - If this field is populated, at least one of the two time fields are required. - - This field is not allowed in the Subscribe RPC. - """ - - -@dataclass(eq=False, repr=False) -class SummaryStreamResponse(aristaproto.Message): - value: "Summary" = aristaproto.message_field(1) - """ - Value is a value deemed relevant to the initiating request. - This structure will always have its key-field populated. Which other fields are - populated, and why, depends on the value of Operation and what triggered this notification. - """ - - time: datetime = aristaproto.message_field(2) - """Time holds the timestamp of this Summary's last modification.""" - - type: "__subscriptions__.Operation" = aristaproto.enum_field(3) - """ - Operation indicates how the Summary value in this response should be considered. - Under non-subscribe requests, this value should always be INITIAL. In a subscription, - once all initial data is streamed and the client begins to receive modification updates, - you should not see INITIAL again. - """ - - -class ConfigDiffServiceStub(aristaproto.ServiceStub): - async def get_one( - self, - config_diff_request: "ConfigDiffRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> "ConfigDiffResponse": - return await self._unary_unary( - "/arista.configstatus.v1.ConfigDiffService/GetOne", - config_diff_request, - ConfigDiffResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ) - - async def get_all( - self, - config_diff_stream_request: "ConfigDiffStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["ConfigDiffStreamResponse"]: - async for response in self._unary_stream( - "/arista.configstatus.v1.ConfigDiffService/GetAll", - config_diff_stream_request, - ConfigDiffStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - async def subscribe( - self, - config_diff_stream_request: "ConfigDiffStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["ConfigDiffStreamResponse"]: - async for response in self._unary_stream( - "/arista.configstatus.v1.ConfigDiffService/Subscribe", - config_diff_stream_request, - ConfigDiffStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - -class ConfigurationServiceStub(aristaproto.ServiceStub): - async def get_one( - self, - configuration_request: "ConfigurationRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> "ConfigurationResponse": - return await self._unary_unary( - "/arista.configstatus.v1.ConfigurationService/GetOne", - configuration_request, - ConfigurationResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ) - - async def get_all( - self, - configuration_stream_request: "ConfigurationStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["ConfigurationStreamResponse"]: - async for response in self._unary_stream( - "/arista.configstatus.v1.ConfigurationService/GetAll", - configuration_stream_request, - ConfigurationStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - async def subscribe( - self, - configuration_stream_request: "ConfigurationStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["ConfigurationStreamResponse"]: - async for response in self._unary_stream( - "/arista.configstatus.v1.ConfigurationService/Subscribe", - configuration_stream_request, - ConfigurationStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - -class SecurityProfileServiceStub(aristaproto.ServiceStub): - async def get_one( - self, - security_profile_request: "SecurityProfileRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> "SecurityProfileResponse": - return await self._unary_unary( - "/arista.configstatus.v1.SecurityProfileService/GetOne", - security_profile_request, - SecurityProfileResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ) - - async def get_all( - self, - security_profile_stream_request: "SecurityProfileStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["SecurityProfileStreamResponse"]: - async for response in self._unary_stream( - "/arista.configstatus.v1.SecurityProfileService/GetAll", - security_profile_stream_request, - SecurityProfileStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - async def subscribe( - self, - security_profile_stream_request: "SecurityProfileStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["SecurityProfileStreamResponse"]: - async for response in self._unary_stream( - "/arista.configstatus.v1.SecurityProfileService/Subscribe", - security_profile_stream_request, - SecurityProfileStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - -class SecurityProfileDiffServiceStub(aristaproto.ServiceStub): - async def get_one( - self, - security_profile_diff_request: "SecurityProfileDiffRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> "SecurityProfileDiffResponse": - return await self._unary_unary( - "/arista.configstatus.v1.SecurityProfileDiffService/GetOne", - security_profile_diff_request, - SecurityProfileDiffResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ) - - async def get_all( - self, - security_profile_diff_stream_request: "SecurityProfileDiffStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["SecurityProfileDiffStreamResponse"]: - async for response in self._unary_stream( - "/arista.configstatus.v1.SecurityProfileDiffService/GetAll", - security_profile_diff_stream_request, - SecurityProfileDiffStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - async def subscribe( - self, - security_profile_diff_stream_request: "SecurityProfileDiffStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["SecurityProfileDiffStreamResponse"]: - async for response in self._unary_stream( - "/arista.configstatus.v1.SecurityProfileDiffService/Subscribe", - security_profile_diff_stream_request, - SecurityProfileDiffStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - -class SecurityProfileDiffSummaryServiceStub(aristaproto.ServiceStub): - async def get_one( - self, - security_profile_diff_summary_request: "SecurityProfileDiffSummaryRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> "SecurityProfileDiffSummaryResponse": - return await self._unary_unary( - "/arista.configstatus.v1.SecurityProfileDiffSummaryService/GetOne", - security_profile_diff_summary_request, - SecurityProfileDiffSummaryResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ) - - async def get_all( - self, - security_profile_diff_summary_stream_request: "SecurityProfileDiffSummaryStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["SecurityProfileDiffSummaryStreamResponse"]: - async for response in self._unary_stream( - "/arista.configstatus.v1.SecurityProfileDiffSummaryService/GetAll", - security_profile_diff_summary_stream_request, - SecurityProfileDiffSummaryStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - async def subscribe( - self, - security_profile_diff_summary_stream_request: "SecurityProfileDiffSummaryStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["SecurityProfileDiffSummaryStreamResponse"]: - async for response in self._unary_stream( - "/arista.configstatus.v1.SecurityProfileDiffSummaryService/Subscribe", - security_profile_diff_summary_stream_request, - SecurityProfileDiffSummaryStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - -class SummaryServiceStub(aristaproto.ServiceStub): - async def get_one( - self, - summary_request: "SummaryRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> "SummaryResponse": - return await self._unary_unary( - "/arista.configstatus.v1.SummaryService/GetOne", - summary_request, - SummaryResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ) - - async def get_all( - self, - summary_stream_request: "SummaryStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["SummaryStreamResponse"]: - async for response in self._unary_stream( - "/arista.configstatus.v1.SummaryService/GetAll", - summary_stream_request, - SummaryStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - async def subscribe( - self, - summary_stream_request: "SummaryStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["SummaryStreamResponse"]: - async for response in self._unary_stream( - "/arista.configstatus.v1.SummaryService/Subscribe", - summary_stream_request, - SummaryStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - -class ConfigDiffServiceBase(ServiceBase): - async def get_one( - self, config_diff_request: "ConfigDiffRequest" - ) -> "ConfigDiffResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def get_all( - self, config_diff_stream_request: "ConfigDiffStreamRequest" - ) -> AsyncIterator["ConfigDiffStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def subscribe( - self, config_diff_stream_request: "ConfigDiffStreamRequest" - ) -> AsyncIterator["ConfigDiffStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def __rpc_get_one( - self, stream: "grpclib.server.Stream[ConfigDiffRequest, ConfigDiffResponse]" - ) -> None: - request = await stream.recv_message() - response = await self.get_one(request) - await stream.send_message(response) - - async def __rpc_get_all( - self, - stream: "grpclib.server.Stream[ConfigDiffStreamRequest, ConfigDiffStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.get_all, - stream, - request, - ) - - async def __rpc_subscribe( - self, - stream: "grpclib.server.Stream[ConfigDiffStreamRequest, ConfigDiffStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.subscribe, - stream, - request, - ) - - def __mapping__(self) -> Dict[str, grpclib.const.Handler]: - return { - "/arista.configstatus.v1.ConfigDiffService/GetOne": grpclib.const.Handler( - self.__rpc_get_one, - grpclib.const.Cardinality.UNARY_UNARY, - ConfigDiffRequest, - ConfigDiffResponse, - ), - "/arista.configstatus.v1.ConfigDiffService/GetAll": grpclib.const.Handler( - self.__rpc_get_all, - grpclib.const.Cardinality.UNARY_STREAM, - ConfigDiffStreamRequest, - ConfigDiffStreamResponse, - ), - "/arista.configstatus.v1.ConfigDiffService/Subscribe": grpclib.const.Handler( - self.__rpc_subscribe, - grpclib.const.Cardinality.UNARY_STREAM, - ConfigDiffStreamRequest, - ConfigDiffStreamResponse, - ), - } - - -class ConfigurationServiceBase(ServiceBase): - async def get_one( - self, configuration_request: "ConfigurationRequest" - ) -> "ConfigurationResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def get_all( - self, configuration_stream_request: "ConfigurationStreamRequest" - ) -> AsyncIterator["ConfigurationStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def subscribe( - self, configuration_stream_request: "ConfigurationStreamRequest" - ) -> AsyncIterator["ConfigurationStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def __rpc_get_one( - self, - stream: "grpclib.server.Stream[ConfigurationRequest, ConfigurationResponse]", - ) -> None: - request = await stream.recv_message() - response = await self.get_one(request) - await stream.send_message(response) - - async def __rpc_get_all( - self, - stream: "grpclib.server.Stream[ConfigurationStreamRequest, ConfigurationStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.get_all, - stream, - request, - ) - - async def __rpc_subscribe( - self, - stream: "grpclib.server.Stream[ConfigurationStreamRequest, ConfigurationStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.subscribe, - stream, - request, - ) - - def __mapping__(self) -> Dict[str, grpclib.const.Handler]: - return { - "/arista.configstatus.v1.ConfigurationService/GetOne": grpclib.const.Handler( - self.__rpc_get_one, - grpclib.const.Cardinality.UNARY_UNARY, - ConfigurationRequest, - ConfigurationResponse, - ), - "/arista.configstatus.v1.ConfigurationService/GetAll": grpclib.const.Handler( - self.__rpc_get_all, - grpclib.const.Cardinality.UNARY_STREAM, - ConfigurationStreamRequest, - ConfigurationStreamResponse, - ), - "/arista.configstatus.v1.ConfigurationService/Subscribe": grpclib.const.Handler( - self.__rpc_subscribe, - grpclib.const.Cardinality.UNARY_STREAM, - ConfigurationStreamRequest, - ConfigurationStreamResponse, - ), - } - - -class SecurityProfileServiceBase(ServiceBase): - async def get_one( - self, security_profile_request: "SecurityProfileRequest" - ) -> "SecurityProfileResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def get_all( - self, security_profile_stream_request: "SecurityProfileStreamRequest" - ) -> AsyncIterator["SecurityProfileStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def subscribe( - self, security_profile_stream_request: "SecurityProfileStreamRequest" - ) -> AsyncIterator["SecurityProfileStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def __rpc_get_one( - self, - stream: "grpclib.server.Stream[SecurityProfileRequest, SecurityProfileResponse]", - ) -> None: - request = await stream.recv_message() - response = await self.get_one(request) - await stream.send_message(response) - - async def __rpc_get_all( - self, - stream: "grpclib.server.Stream[SecurityProfileStreamRequest, SecurityProfileStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.get_all, - stream, - request, - ) - - async def __rpc_subscribe( - self, - stream: "grpclib.server.Stream[SecurityProfileStreamRequest, SecurityProfileStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.subscribe, - stream, - request, - ) - - def __mapping__(self) -> Dict[str, grpclib.const.Handler]: - return { - "/arista.configstatus.v1.SecurityProfileService/GetOne": grpclib.const.Handler( - self.__rpc_get_one, - grpclib.const.Cardinality.UNARY_UNARY, - SecurityProfileRequest, - SecurityProfileResponse, - ), - "/arista.configstatus.v1.SecurityProfileService/GetAll": grpclib.const.Handler( - self.__rpc_get_all, - grpclib.const.Cardinality.UNARY_STREAM, - SecurityProfileStreamRequest, - SecurityProfileStreamResponse, - ), - "/arista.configstatus.v1.SecurityProfileService/Subscribe": grpclib.const.Handler( - self.__rpc_subscribe, - grpclib.const.Cardinality.UNARY_STREAM, - SecurityProfileStreamRequest, - SecurityProfileStreamResponse, - ), - } - - -class SecurityProfileDiffServiceBase(ServiceBase): - async def get_one( - self, security_profile_diff_request: "SecurityProfileDiffRequest" - ) -> "SecurityProfileDiffResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def get_all( - self, security_profile_diff_stream_request: "SecurityProfileDiffStreamRequest" - ) -> AsyncIterator["SecurityProfileDiffStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def subscribe( - self, security_profile_diff_stream_request: "SecurityProfileDiffStreamRequest" - ) -> AsyncIterator["SecurityProfileDiffStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def __rpc_get_one( - self, - stream: "grpclib.server.Stream[SecurityProfileDiffRequest, SecurityProfileDiffResponse]", - ) -> None: - request = await stream.recv_message() - response = await self.get_one(request) - await stream.send_message(response) - - async def __rpc_get_all( - self, - stream: "grpclib.server.Stream[SecurityProfileDiffStreamRequest, SecurityProfileDiffStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.get_all, - stream, - request, - ) - - async def __rpc_subscribe( - self, - stream: "grpclib.server.Stream[SecurityProfileDiffStreamRequest, SecurityProfileDiffStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.subscribe, - stream, - request, - ) - - def __mapping__(self) -> Dict[str, grpclib.const.Handler]: - return { - "/arista.configstatus.v1.SecurityProfileDiffService/GetOne": grpclib.const.Handler( - self.__rpc_get_one, - grpclib.const.Cardinality.UNARY_UNARY, - SecurityProfileDiffRequest, - SecurityProfileDiffResponse, - ), - "/arista.configstatus.v1.SecurityProfileDiffService/GetAll": grpclib.const.Handler( - self.__rpc_get_all, - grpclib.const.Cardinality.UNARY_STREAM, - SecurityProfileDiffStreamRequest, - SecurityProfileDiffStreamResponse, - ), - "/arista.configstatus.v1.SecurityProfileDiffService/Subscribe": grpclib.const.Handler( - self.__rpc_subscribe, - grpclib.const.Cardinality.UNARY_STREAM, - SecurityProfileDiffStreamRequest, - SecurityProfileDiffStreamResponse, - ), - } - - -class SecurityProfileDiffSummaryServiceBase(ServiceBase): - async def get_one( - self, security_profile_diff_summary_request: "SecurityProfileDiffSummaryRequest" - ) -> "SecurityProfileDiffSummaryResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def get_all( - self, - security_profile_diff_summary_stream_request: "SecurityProfileDiffSummaryStreamRequest", - ) -> AsyncIterator["SecurityProfileDiffSummaryStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def subscribe( - self, - security_profile_diff_summary_stream_request: "SecurityProfileDiffSummaryStreamRequest", - ) -> AsyncIterator["SecurityProfileDiffSummaryStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def __rpc_get_one( - self, - stream: "grpclib.server.Stream[SecurityProfileDiffSummaryRequest, SecurityProfileDiffSummaryResponse]", - ) -> None: - request = await stream.recv_message() - response = await self.get_one(request) - await stream.send_message(response) - - async def __rpc_get_all( - self, - stream: "grpclib.server.Stream[SecurityProfileDiffSummaryStreamRequest, SecurityProfileDiffSummaryStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.get_all, - stream, - request, - ) - - async def __rpc_subscribe( - self, - stream: "grpclib.server.Stream[SecurityProfileDiffSummaryStreamRequest, SecurityProfileDiffSummaryStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.subscribe, - stream, - request, - ) - - def __mapping__(self) -> Dict[str, grpclib.const.Handler]: - return { - "/arista.configstatus.v1.SecurityProfileDiffSummaryService/GetOne": grpclib.const.Handler( - self.__rpc_get_one, - grpclib.const.Cardinality.UNARY_UNARY, - SecurityProfileDiffSummaryRequest, - SecurityProfileDiffSummaryResponse, - ), - "/arista.configstatus.v1.SecurityProfileDiffSummaryService/GetAll": grpclib.const.Handler( - self.__rpc_get_all, - grpclib.const.Cardinality.UNARY_STREAM, - SecurityProfileDiffSummaryStreamRequest, - SecurityProfileDiffSummaryStreamResponse, - ), - "/arista.configstatus.v1.SecurityProfileDiffSummaryService/Subscribe": grpclib.const.Handler( - self.__rpc_subscribe, - grpclib.const.Cardinality.UNARY_STREAM, - SecurityProfileDiffSummaryStreamRequest, - SecurityProfileDiffSummaryStreamResponse, - ), - } - - -class SummaryServiceBase(ServiceBase): - async def get_one(self, summary_request: "SummaryRequest") -> "SummaryResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def get_all( - self, summary_stream_request: "SummaryStreamRequest" - ) -> AsyncIterator["SummaryStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def subscribe( - self, summary_stream_request: "SummaryStreamRequest" - ) -> AsyncIterator["SummaryStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def __rpc_get_one( - self, stream: "grpclib.server.Stream[SummaryRequest, SummaryResponse]" - ) -> None: - request = await stream.recv_message() - response = await self.get_one(request) - await stream.send_message(response) - - async def __rpc_get_all( - self, - stream: "grpclib.server.Stream[SummaryStreamRequest, SummaryStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.get_all, - stream, - request, - ) - - async def __rpc_subscribe( - self, - stream: "grpclib.server.Stream[SummaryStreamRequest, SummaryStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.subscribe, - stream, - request, - ) - - def __mapping__(self) -> Dict[str, grpclib.const.Handler]: - return { - "/arista.configstatus.v1.SummaryService/GetOne": grpclib.const.Handler( - self.__rpc_get_one, - grpclib.const.Cardinality.UNARY_UNARY, - SummaryRequest, - SummaryResponse, - ), - "/arista.configstatus.v1.SummaryService/GetAll": grpclib.const.Handler( - self.__rpc_get_all, - grpclib.const.Cardinality.UNARY_STREAM, - SummaryStreamRequest, - SummaryStreamResponse, - ), - "/arista.configstatus.v1.SummaryService/Subscribe": grpclib.const.Handler( - self.__rpc_subscribe, - grpclib.const.Cardinality.UNARY_STREAM, - SummaryStreamRequest, - SummaryStreamResponse, - ), - } diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/dashboard/__init__.py b/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/dashboard/__init__.py deleted file mode 100644 index e772bee41fe..00000000000 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/dashboard/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/endpointlocation/__init__.py b/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/endpointlocation/__init__.py deleted file mode 100644 index e772bee41fe..00000000000 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/endpointlocation/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/event/__init__.py b/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/event/__init__.py deleted file mode 100644 index e772bee41fe..00000000000 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/event/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/event/v1/__init__.py b/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/event/v1/__init__.py deleted file mode 100644 index f3a018b3eb7..00000000000 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/event/v1/__init__.py +++ /dev/null @@ -1,988 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -# Generated by the protocol buffer compiler. DO NOT EDIT! -# sources: arista/event.v1/event.proto, arista/event.v1/services.gen.proto -# plugin: python-aristaproto -# This file has been @generated - -from dataclasses import dataclass -from datetime import datetime -from typing import ( - TYPE_CHECKING, - AsyncIterator, - Dict, - List, - Optional, -) - -try: - import aristaproto - import grpclib - from aristaproto.grpc.grpclib_server import ServiceBase -except ImportError: - HAS_ARISTAPROTO = False - from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_aristaproto as aristaproto - from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_grpclib as grpclib - ServiceBase = object -else: - HAS_ARISTAPROTO = True - -from .... import fmp as ___fmp__ -from ... import ( - subscriptions as __subscriptions__, - time as __time__, -) - - -if TYPE_CHECKING: - import grpclib.server - from aristaproto.grpc.grpclib_client import MetadataLike - from grpclib.metadata import Deadline - - -class EventSeverity(aristaproto.Enum): - """EventSeverity is the severity level of the event""" - - UNSPECIFIED = 0 - """ - EVENT_SEVERITY_UNSPECIFIED is the default value, if the severity is not specified. - """ - - INFO = 1 - """EVENT_SEVERITY_INFO is used for generally useful information.""" - - WARNING = 2 - """EVENT_SEVERITY_WARNING is used for potentially harmful conditions.""" - - ERROR = 3 - """ - EVENT_SEVERITY_ERROR is used for errors events that may allow for continued functioning. - """ - - CRITICAL = 4 - """ - EVENT_SEVERITY_CRITICAL is used to designate severe errors that impede functioning. - """ - - -class ComponentType(aristaproto.Enum): - """ - ComponentType describes the type of entity on which the event occured - """ - - UNSPECIFIED = 0 - """ - COMPONENT_TYPE_UNSPECIFIED is the default value, if the type is not specified. - """ - - DEVICE = 1 - """COMPONENT_TYPE_DEVICE is used for device events.""" - - INTERFACE = 2 - """COMPONENT_TYPE_INTERFACE is used for device interface events.""" - - TURBINE = 3 - """ - COMPONENT_TYPE_TURBINE is used for events on the internal CVP turbine - components. A turbine is an internal CV streaming analytics backend process. - """ - - DVS = 4 - """ - COMPONENT_TYPE_DVS is used for DVS events. - A vSphere Distributed Switch provides centralized management and - monitoring of the networking configuration of all workload servers that are - associated with the switch. - """ - - DVS_INTERFACE = 5 - """COMPONENT_TYPE_DVS_INTERFACE is used for DVS interface events.""" - - VM = 6 - """ - COMPONENT_TYPE_VM is used for VM events. - A VM is a software computer that, like a physical computer, runs an - operating system and applications. - """ - - VM_INTERFACE = 7 - """COMPONENT_TYPE_VM_INTERFACE is used for VM interface events.""" - - WORKLOAD_SERVER = 8 - """ - COMPONENT_TYPE_WORKLOAD_SERVER is used for workload server events. - A workload server is a server/data storage device on which the hypervisor is installed. - """ - - WORKLOAD_SERVER_INTERFACE = 9 - """ - COMPONENT_TYPE_WORKLOAD_SERVER_INTERFACE is used for workload server interface events. - """ - - APPLICATION = 10 - """COMPONENT_TYPE_APPLICATION is used for application-service events.""" - - CVP_NODE = 11 - """COMPONENT_TYPE_CVP_NODE is used for CVP node events.""" - - -@dataclass(eq=False, repr=False) -class EventComponent(aristaproto.Message): - """EventComponent describes an entity on which the event occured""" - - type: "ComponentType" = aristaproto.enum_field(1) - """type is the type of component""" - - components: Dict[str, str] = aristaproto.map_field( - 2, aristaproto.TYPE_STRING, aristaproto.TYPE_STRING - ) - """components identifies the entity on which the event occured""" - - -@dataclass(eq=False, repr=False) -class EventComponents(aristaproto.Message): - """EventComponents contains entities on which an event occured""" - - components: List["EventComponent"] = aristaproto.message_field(1) - """components describes the components on which an event occured""" - - -@dataclass(eq=False, repr=False) -class EventAck(aristaproto.Message): - """EventAck contains acknowledgement information of an event""" - - ack: Optional[bool] = aristaproto.message_field(1, wraps=aristaproto.TYPE_BOOL) - """ack is the acknowledgement state of an event""" - - acker: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) - """acker is the user that acknowledged the event""" - - ack_time: datetime = aristaproto.message_field(3) - """ack_time is the time of acknowledgement""" - - -@dataclass(eq=False, repr=False) -class EventRead(aristaproto.Message): - """EventRead contains read information of an event""" - - read: Optional[bool] = aristaproto.message_field(1, wraps=aristaproto.TYPE_BOOL) - """read is the read state of an event""" - - reader: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) - """reader is the user that read the event""" - - read_time: datetime = aristaproto.message_field(3) - """read_time is the time of read""" - - -@dataclass(eq=False, repr=False) -class EventNoteConfig(aristaproto.Message): - """ - EventNoteConfig configures a note - - NOTE: note is required when used as an argument - to Set. - """ - - note: Optional[str] = aristaproto.message_field(1, wraps=aristaproto.TYPE_STRING) - """note is the text of the note""" - - -@dataclass(eq=False, repr=False) -class EventNote(aristaproto.Message): - """EventNote is the state of a note""" - - note: Optional[str] = aristaproto.message_field(1, wraps=aristaproto.TYPE_STRING) - """note is the text of the note""" - - note_creator: Optional[str] = aristaproto.message_field( - 2, wraps=aristaproto.TYPE_STRING - ) - """note_creator is the creator of the note""" - - -@dataclass(eq=False, repr=False) -class EventKey(aristaproto.Message): - """ - EventKey uniquely identifies an event - - NOTE: All fields are required when used as an argument - to GetOne, Set or Delete. - """ - - key: Optional[str] = aristaproto.message_field(1, wraps=aristaproto.TYPE_STRING) - """key is the event data identifier""" - - timestamp: datetime = aristaproto.message_field(2) - """timestamp is the time the event occured""" - - -@dataclass(eq=False, repr=False) -class EventData(aristaproto.Message): - """EventData is additional event data""" - - data: Dict[str, str] = aristaproto.map_field( - 1, aristaproto.TYPE_STRING, aristaproto.TYPE_STRING - ) - """data is event data specific to the type of this event""" - - -@dataclass(eq=False, repr=False) -class EventNotesConfig(aristaproto.Message): - """ - EventNotesConfig configures the notes of an event - - NOTE: notes is required when used as an argument - to Set. - """ - - notes: Dict[int, "EventNoteConfig"] = aristaproto.map_field( - 1, aristaproto.TYPE_INT64, aristaproto.TYPE_MESSAGE - ) - """notes is keyed by desired note time in Unix time, in milliseconds""" - - -@dataclass(eq=False, repr=False) -class EventAnnotationConfig(aristaproto.Message): - """ - EventAnnotationConfig configures an event annotation - - NOTE: Either 1) key and ack or 2) key and notes or 3) key and read are - required when used as an argument to Set. - """ - - key: "EventKey" = aristaproto.message_field(1) - """key is the event instance identifier""" - - ack: Optional[bool] = aristaproto.message_field(2, wraps=aristaproto.TYPE_BOOL) - """ack is the acknowledgement state of an event""" - - notes: "EventNotesConfig" = aristaproto.message_field(3) - """notes is the notes on an event""" - - read: Optional[bool] = aristaproto.message_field(4, wraps=aristaproto.TYPE_BOOL) - """ - read is the read state of an event. Setting this implies that an event has been read by a user - """ - - -@dataclass(eq=False, repr=False) -class EventNotes(aristaproto.Message): - """EventNotes is the notes of an event state""" - - notes: Dict[int, "EventNote"] = aristaproto.map_field( - 1, aristaproto.TYPE_INT64, aristaproto.TYPE_MESSAGE - ) - """notes is keyed by the time desired""" - - -@dataclass(eq=False, repr=False) -class Event(aristaproto.Message): - """Event is a telemetry event""" - - key: "EventKey" = aristaproto.message_field(1) - """key is the event instance identifier""" - - severity: "EventSeverity" = aristaproto.enum_field(2) - """severity is the severity of the event""" - - title: Optional[str] = aristaproto.message_field(3, wraps=aristaproto.TYPE_STRING) - """title is the title of the event""" - - description: Optional[str] = aristaproto.message_field( - 4, wraps=aristaproto.TYPE_STRING - ) - """description is the description of the event""" - - event_type: Optional[str] = aristaproto.message_field( - 5, wraps=aristaproto.TYPE_STRING - ) - """event_type is the type of the event""" - - data: "EventData" = aristaproto.message_field(6) - """data is the data of the event""" - - components: "EventComponents" = aristaproto.message_field(7) - """components is the components on which the event occurred""" - - ack: "EventAck" = aristaproto.message_field(8) - """ack is the acknowledgement status of the event""" - - notes: "EventNotes" = aristaproto.message_field(9) - """notes is the notes of the event""" - - last_updated_time: datetime = aristaproto.message_field(10) - """last_updated_time is the time of the most recent update to the event""" - - read: "EventRead" = aristaproto.message_field(11) - """read is the read status of the event""" - - rule_id: Optional[str] = aristaproto.message_field( - 12, wraps=aristaproto.TYPE_STRING - ) - """rule_id is the label of the rule associated with the event""" - - -@dataclass(eq=False, repr=False) -class EventRequest(aristaproto.Message): - key: "EventKey" = aristaproto.message_field(1) - """ - Key uniquely identifies a Event instance to retrieve. - This value must be populated. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the time for which you are interested in the data. - If no time is given, the server will use the time at which it makes the request. - """ - - -@dataclass(eq=False, repr=False) -class EventResponse(aristaproto.Message): - value: "Event" = aristaproto.message_field(1) - """ - Value is the value requested. - This structure will be fully-populated as it exists in the datastore. If - optional fields were not given at creation, these fields will be empty or - set to default values. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time carries the (UTC) timestamp of the last-modification of the - Event instance in this response. - """ - - -@dataclass(eq=False, repr=False) -class EventStreamRequest(aristaproto.Message): - partial_eq_filter: List["Event"] = aristaproto.message_field(1) - """ - PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. - This requires all provided fields to be equal to the response. - - While transparent to users, this field also allows services to optimize internal - subscriptions if filter(s) are sufficiently specific. - """ - - time: "__time__.TimeBounds" = aristaproto.message_field(3) - """ - TimeRange allows limiting response data to within a specified time window. - If this field is populated, at least one of the two time fields are required. - - For GetAll, the fields start and end can be used as follows: - - * end: Returns the state of each Event at end. - * Each Event response is fully-specified (all fields set). - * start: Returns the state of each Event at start, followed by updates until now. - * Each Event response at start is fully-specified, but updates may be partial. - * start and end: Returns the state of each Event at start, followed by updates - until end. - * Each Event response at start is fully-specified, but updates until end may - be partial. - - This field is not allowed in the Subscribe RPC. - """ - - -@dataclass(eq=False, repr=False) -class EventStreamResponse(aristaproto.Message): - value: "Event" = aristaproto.message_field(1) - """ - Value is a value deemed relevant to the initiating request. - This structure will always have its key-field populated. Which other fields are - populated, and why, depends on the value of Operation and what triggered this notification. - """ - - time: datetime = aristaproto.message_field(2) - """Time holds the timestamp of this Event's last modification.""" - - type: "__subscriptions__.Operation" = aristaproto.enum_field(3) - """ - Operation indicates how the Event value in this response should be considered. - Under non-subscribe requests, this value should always be INITIAL. In a subscription, - once all initial data is streamed and the client begins to receive modification updates, - you should not see INITIAL again. - """ - - -@dataclass(eq=False, repr=False) -class EventAnnotationConfigRequest(aristaproto.Message): - key: "EventKey" = aristaproto.message_field(1) - """ - Key uniquely identifies a EventAnnotationConfig instance to retrieve. - This value must be populated. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the time for which you are interested in the data. - If no time is given, the server will use the time at which it makes the request. - """ - - -@dataclass(eq=False, repr=False) -class EventAnnotationConfigResponse(aristaproto.Message): - value: "EventAnnotationConfig" = aristaproto.message_field(1) - """ - Value is the value requested. - This structure will be fully-populated as it exists in the datastore. If - optional fields were not given at creation, these fields will be empty or - set to default values. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time carries the (UTC) timestamp of the last-modification of the - EventAnnotationConfig instance in this response. - """ - - -@dataclass(eq=False, repr=False) -class EventAnnotationConfigStreamRequest(aristaproto.Message): - partial_eq_filter: List["EventAnnotationConfig"] = aristaproto.message_field(1) - """ - PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. - This requires all provided fields to be equal to the response. - - While transparent to users, this field also allows services to optimize internal - subscriptions if filter(s) are sufficiently specific. - """ - - time: "__time__.TimeBounds" = aristaproto.message_field(3) - """ - TimeRange allows limiting response data to within a specified time window. - If this field is populated, at least one of the two time fields are required. - - For GetAll, the fields start and end can be used as follows: - - * end: Returns the state of each EventAnnotationConfig at end. - * Each EventAnnotationConfig response is fully-specified (all fields set). - * start: Returns the state of each EventAnnotationConfig at start, followed by updates until now. - * Each EventAnnotationConfig response at start is fully-specified, but updates may be partial. - * start and end: Returns the state of each EventAnnotationConfig at start, followed by updates - until end. - * Each EventAnnotationConfig response at start is fully-specified, but updates until end may - be partial. - - This field is not allowed in the Subscribe RPC. - """ - - -@dataclass(eq=False, repr=False) -class EventAnnotationConfigStreamResponse(aristaproto.Message): - value: "EventAnnotationConfig" = aristaproto.message_field(1) - """ - Value is a value deemed relevant to the initiating request. - This structure will always have its key-field populated. Which other fields are - populated, and why, depends on the value of Operation and what triggered this notification. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time holds the timestamp of this EventAnnotationConfig's last modification. - """ - - type: "__subscriptions__.Operation" = aristaproto.enum_field(3) - """ - Operation indicates how the EventAnnotationConfig value in this response should be considered. - Under non-subscribe requests, this value should always be INITIAL. In a subscription, - once all initial data is streamed and the client begins to receive modification updates, - you should not see INITIAL again. - """ - - -@dataclass(eq=False, repr=False) -class EventAnnotationConfigSetRequest(aristaproto.Message): - value: "EventAnnotationConfig" = aristaproto.message_field(1) - """ - EventAnnotationConfig carries the value to set into the datastore. - See the documentation on the EventAnnotationConfig struct for which fields are required. - """ - - -@dataclass(eq=False, repr=False) -class EventAnnotationConfigSetResponse(aristaproto.Message): - value: "EventAnnotationConfig" = aristaproto.message_field(1) - """ - Value carries all the values given in the EventAnnotationConfigSetRequest as well - as any server-generated values. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the (UTC) timestamp at which the system recognizes the - creation. The only guarantees made about this timestamp are: - - - it is after the time the request was received - - a time-ranged query with StartTime==CreatedAt will include this instance. - """ - - -@dataclass(eq=False, repr=False) -class EventAnnotationConfigSetSomeRequest(aristaproto.Message): - values: List["EventAnnotationConfig"] = aristaproto.message_field(1) - """ - value contains a list of EventAnnotationConfig values to write. - It is possible to provide more values than can fit within either: - - the maxiumum send size of the client - - the maximum receive size of the server - If this error occurs you must reduce the number of values sent. - See gRPC "maximum message size" documentation for more information. - """ - - -@dataclass(eq=False, repr=False) -class EventAnnotationConfigSetSomeResponse(aristaproto.Message): - key: "EventKey" = aristaproto.message_field(1) - error: str = aristaproto.string_field(2) - - -@dataclass(eq=False, repr=False) -class EventAnnotationConfigDeleteRequest(aristaproto.Message): - key: "EventKey" = aristaproto.message_field(1) - """ - Key indicates which EventAnnotationConfig instance to remove. - This field must always be set. - """ - - -@dataclass(eq=False, repr=False) -class EventAnnotationConfigDeleteResponse(aristaproto.Message): - key: "EventKey" = aristaproto.message_field(1) - """ - Key echoes back the key of the deleted EventAnnotationConfig instance. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the (UTC) timestamp at which the system recognizes the - deletion. The only guarantees made about this timestamp are: - - - it is after the time the request was received - - a time-ranged query with StartTime==DeletedAt will not include this instance. - """ - - -@dataclass(eq=False, repr=False) -class EventAnnotationConfigDeleteAllRequest(aristaproto.Message): - pass - - -@dataclass(eq=False, repr=False) -class EventAnnotationConfigDeleteAllResponse(aristaproto.Message): - type: "___fmp__.DeleteError" = aristaproto.enum_field(1) - """This describes the class of delete error.""" - - error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) - """This indicates the error message from the delete failure.""" - - key: "EventKey" = aristaproto.message_field(3) - """ - This is the key of the EventAnnotationConfig instance that failed to be deleted. - """ - - time: datetime = aristaproto.message_field(4) - """Time indicates the (UTC) timestamp when the key was being deleted.""" - - -class EventServiceStub(aristaproto.ServiceStub): - async def get_one( - self, - event_request: "EventRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> "EventResponse": - return await self._unary_unary( - "/arista.event.v1.EventService/GetOne", - event_request, - EventResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ) - - async def get_all( - self, - event_stream_request: "EventStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["EventStreamResponse"]: - async for response in self._unary_stream( - "/arista.event.v1.EventService/GetAll", - event_stream_request, - EventStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - async def subscribe( - self, - event_stream_request: "EventStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["EventStreamResponse"]: - async for response in self._unary_stream( - "/arista.event.v1.EventService/Subscribe", - event_stream_request, - EventStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - -class EventAnnotationConfigServiceStub(aristaproto.ServiceStub): - async def get_one( - self, - event_annotation_config_request: "EventAnnotationConfigRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> "EventAnnotationConfigResponse": - return await self._unary_unary( - "/arista.event.v1.EventAnnotationConfigService/GetOne", - event_annotation_config_request, - EventAnnotationConfigResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ) - - async def get_all( - self, - event_annotation_config_stream_request: "EventAnnotationConfigStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["EventAnnotationConfigStreamResponse"]: - async for response in self._unary_stream( - "/arista.event.v1.EventAnnotationConfigService/GetAll", - event_annotation_config_stream_request, - EventAnnotationConfigStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - async def subscribe( - self, - event_annotation_config_stream_request: "EventAnnotationConfigStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["EventAnnotationConfigStreamResponse"]: - async for response in self._unary_stream( - "/arista.event.v1.EventAnnotationConfigService/Subscribe", - event_annotation_config_stream_request, - EventAnnotationConfigStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - async def set( - self, - event_annotation_config_set_request: "EventAnnotationConfigSetRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> "EventAnnotationConfigSetResponse": - return await self._unary_unary( - "/arista.event.v1.EventAnnotationConfigService/Set", - event_annotation_config_set_request, - EventAnnotationConfigSetResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ) - - async def set_some( - self, - event_annotation_config_set_some_request: "EventAnnotationConfigSetSomeRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["EventAnnotationConfigSetSomeResponse"]: - async for response in self._unary_stream( - "/arista.event.v1.EventAnnotationConfigService/SetSome", - event_annotation_config_set_some_request, - EventAnnotationConfigSetSomeResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - async def delete( - self, - event_annotation_config_delete_request: "EventAnnotationConfigDeleteRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> "EventAnnotationConfigDeleteResponse": - return await self._unary_unary( - "/arista.event.v1.EventAnnotationConfigService/Delete", - event_annotation_config_delete_request, - EventAnnotationConfigDeleteResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ) - - async def delete_all( - self, - event_annotation_config_delete_all_request: "EventAnnotationConfigDeleteAllRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["EventAnnotationConfigDeleteAllResponse"]: - async for response in self._unary_stream( - "/arista.event.v1.EventAnnotationConfigService/DeleteAll", - event_annotation_config_delete_all_request, - EventAnnotationConfigDeleteAllResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - -class EventServiceBase(ServiceBase): - async def get_one(self, event_request: "EventRequest") -> "EventResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def get_all( - self, event_stream_request: "EventStreamRequest" - ) -> AsyncIterator["EventStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def subscribe( - self, event_stream_request: "EventStreamRequest" - ) -> AsyncIterator["EventStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def __rpc_get_one( - self, stream: "grpclib.server.Stream[EventRequest, EventResponse]" - ) -> None: - request = await stream.recv_message() - response = await self.get_one(request) - await stream.send_message(response) - - async def __rpc_get_all( - self, stream: "grpclib.server.Stream[EventStreamRequest, EventStreamResponse]" - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.get_all, - stream, - request, - ) - - async def __rpc_subscribe( - self, stream: "grpclib.server.Stream[EventStreamRequest, EventStreamResponse]" - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.subscribe, - stream, - request, - ) - - def __mapping__(self) -> Dict[str, grpclib.const.Handler]: - return { - "/arista.event.v1.EventService/GetOne": grpclib.const.Handler( - self.__rpc_get_one, - grpclib.const.Cardinality.UNARY_UNARY, - EventRequest, - EventResponse, - ), - "/arista.event.v1.EventService/GetAll": grpclib.const.Handler( - self.__rpc_get_all, - grpclib.const.Cardinality.UNARY_STREAM, - EventStreamRequest, - EventStreamResponse, - ), - "/arista.event.v1.EventService/Subscribe": grpclib.const.Handler( - self.__rpc_subscribe, - grpclib.const.Cardinality.UNARY_STREAM, - EventStreamRequest, - EventStreamResponse, - ), - } - - -class EventAnnotationConfigServiceBase(ServiceBase): - async def get_one( - self, event_annotation_config_request: "EventAnnotationConfigRequest" - ) -> "EventAnnotationConfigResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def get_all( - self, - event_annotation_config_stream_request: "EventAnnotationConfigStreamRequest", - ) -> AsyncIterator["EventAnnotationConfigStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def subscribe( - self, - event_annotation_config_stream_request: "EventAnnotationConfigStreamRequest", - ) -> AsyncIterator["EventAnnotationConfigStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def set( - self, event_annotation_config_set_request: "EventAnnotationConfigSetRequest" - ) -> "EventAnnotationConfigSetResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def set_some( - self, - event_annotation_config_set_some_request: "EventAnnotationConfigSetSomeRequest", - ) -> AsyncIterator["EventAnnotationConfigSetSomeResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def delete( - self, - event_annotation_config_delete_request: "EventAnnotationConfigDeleteRequest", - ) -> "EventAnnotationConfigDeleteResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def delete_all( - self, - event_annotation_config_delete_all_request: "EventAnnotationConfigDeleteAllRequest", - ) -> AsyncIterator["EventAnnotationConfigDeleteAllResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def __rpc_get_one( - self, - stream: "grpclib.server.Stream[EventAnnotationConfigRequest, EventAnnotationConfigResponse]", - ) -> None: - request = await stream.recv_message() - response = await self.get_one(request) - await stream.send_message(response) - - async def __rpc_get_all( - self, - stream: "grpclib.server.Stream[EventAnnotationConfigStreamRequest, EventAnnotationConfigStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.get_all, - stream, - request, - ) - - async def __rpc_subscribe( - self, - stream: "grpclib.server.Stream[EventAnnotationConfigStreamRequest, EventAnnotationConfigStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.subscribe, - stream, - request, - ) - - async def __rpc_set( - self, - stream: "grpclib.server.Stream[EventAnnotationConfigSetRequest, EventAnnotationConfigSetResponse]", - ) -> None: - request = await stream.recv_message() - response = await self.set(request) - await stream.send_message(response) - - async def __rpc_set_some( - self, - stream: "grpclib.server.Stream[EventAnnotationConfigSetSomeRequest, EventAnnotationConfigSetSomeResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.set_some, - stream, - request, - ) - - async def __rpc_delete( - self, - stream: "grpclib.server.Stream[EventAnnotationConfigDeleteRequest, EventAnnotationConfigDeleteResponse]", - ) -> None: - request = await stream.recv_message() - response = await self.delete(request) - await stream.send_message(response) - - async def __rpc_delete_all( - self, - stream: "grpclib.server.Stream[EventAnnotationConfigDeleteAllRequest, EventAnnotationConfigDeleteAllResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.delete_all, - stream, - request, - ) - - def __mapping__(self) -> Dict[str, grpclib.const.Handler]: - return { - "/arista.event.v1.EventAnnotationConfigService/GetOne": grpclib.const.Handler( - self.__rpc_get_one, - grpclib.const.Cardinality.UNARY_UNARY, - EventAnnotationConfigRequest, - EventAnnotationConfigResponse, - ), - "/arista.event.v1.EventAnnotationConfigService/GetAll": grpclib.const.Handler( - self.__rpc_get_all, - grpclib.const.Cardinality.UNARY_STREAM, - EventAnnotationConfigStreamRequest, - EventAnnotationConfigStreamResponse, - ), - "/arista.event.v1.EventAnnotationConfigService/Subscribe": grpclib.const.Handler( - self.__rpc_subscribe, - grpclib.const.Cardinality.UNARY_STREAM, - EventAnnotationConfigStreamRequest, - EventAnnotationConfigStreamResponse, - ), - "/arista.event.v1.EventAnnotationConfigService/Set": grpclib.const.Handler( - self.__rpc_set, - grpclib.const.Cardinality.UNARY_UNARY, - EventAnnotationConfigSetRequest, - EventAnnotationConfigSetResponse, - ), - "/arista.event.v1.EventAnnotationConfigService/SetSome": grpclib.const.Handler( - self.__rpc_set_some, - grpclib.const.Cardinality.UNARY_STREAM, - EventAnnotationConfigSetSomeRequest, - EventAnnotationConfigSetSomeResponse, - ), - "/arista.event.v1.EventAnnotationConfigService/Delete": grpclib.const.Handler( - self.__rpc_delete, - grpclib.const.Cardinality.UNARY_UNARY, - EventAnnotationConfigDeleteRequest, - EventAnnotationConfigDeleteResponse, - ), - "/arista.event.v1.EventAnnotationConfigService/DeleteAll": grpclib.const.Handler( - self.__rpc_delete_all, - grpclib.const.Cardinality.UNARY_STREAM, - EventAnnotationConfigDeleteAllRequest, - EventAnnotationConfigDeleteAllResponse, - ), - } diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/identityprovider/__init__.py b/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/identityprovider/__init__.py deleted file mode 100644 index e772bee41fe..00000000000 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/identityprovider/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/imagestatus/__init__.py b/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/imagestatus/__init__.py deleted file mode 100644 index e772bee41fe..00000000000 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/imagestatus/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/inventory/__init__.py b/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/inventory/__init__.py deleted file mode 100644 index e772bee41fe..00000000000 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/inventory/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/inventory/v1/__init__.py b/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/inventory/v1/__init__.py deleted file mode 100644 index 5ff87cc9f6f..00000000000 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/inventory/v1/__init__.py +++ /dev/null @@ -1,1979 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -# Generated by the protocol buffer compiler. DO NOT EDIT! -# sources: arista/inventory.v1/inventory.proto, arista/inventory.v1/services.gen.proto -# plugin: python-aristaproto -# This file has been @generated - -from dataclasses import dataclass -from datetime import datetime -from typing import ( - TYPE_CHECKING, - AsyncIterator, - Dict, - List, - Optional, -) - -try: - import aristaproto - import grpclib - from aristaproto.grpc.grpclib_server import ServiceBase -except ImportError: - HAS_ARISTAPROTO = False - from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_aristaproto as aristaproto - from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_grpclib as grpclib - ServiceBase = object -else: - HAS_ARISTAPROTO = True - -from .... import fmp as ___fmp__ -from ... import ( - subscriptions as __subscriptions__, - time as __time__, -) - - -if TYPE_CHECKING: - import grpclib.server - from aristaproto.grpc.grpclib_client import MetadataLike - from grpclib.metadata import Deadline - - -class StreamingStatus(aristaproto.Enum): - """ - StreamingStatus defines the status of telemetry streaming for a device. - """ - - UNSPECIFIED = 0 - INACTIVE = 1 - """ - STREAMING_STATUS_INACTIVE indicates the device is not streaming telemetry. - """ - - ACTIVE = 2 - """STREAMING_STATUS_ACTIVE indicates the device is streaming telemetry.""" - - -class OnboardingStatus(aristaproto.Enum): - """ - OnboardingStatus defines the set of possible states in the onboarding process - for a device. - """ - - UNSPECIFIED = 0 - IN_PROGRESS = 1 - """ONBOARDING_STATUS_IN_PROGRESS indicates onboarding is in progress.""" - - FAILURE = 2 - """ONBOARDING_STATUS_FAILURE indicates onboarding failed.""" - - SUCCESS = 3 - """ONBOARDING_STATUS_SUCCESS indicates onboarding succeeded.""" - - -class DecommissioningStatus(aristaproto.Enum): - """ - DecommissioningStatus defines the set of possible states in the decommissioning - process for a device. - """ - - UNSPECIFIED = 0 - IN_PROGRESS = 1 - """ - DECOMMISSIONING_STATUS_IN_PROGRESS indicates decommissioning is in progress. - """ - - FAILURE = 2 - """DECOMMISSIONING_STATUS_FAILURE indicates decommissioning failed.""" - - SUCCESS = 3 - """DECOMMISSIONING_STATUS_SUCCESS indicates decommissioning succeeded.""" - - -class ProvisioningStatus(aristaproto.Enum): - """ - ProvisioningStatus defines the set of possible states in the provisioning - process for a device. - """ - - UNSPECIFIED = 0 - IN_PROGRESS = 1 - """ - PROVISIONING_STATUS_IN_PROGRESS indicates provisioning is in progress. - """ - - FAILURE = 2 - """PROVISIONING_STATUS_FAILURE indicates provisioning failed.""" - - SUCCESS = 3 - """PROVISIONING_STATUS_SUCCESS indicates provisioning succeeded.""" - - -@dataclass(eq=False, repr=False) -class ExtendedAttributes(aristaproto.Message): - """ - ExtendedAttributes wraps any additional, potentially non-standard, features - or attributes the device reports. - """ - - feature_enabled: Dict[str, bool] = aristaproto.map_field( - 1, aristaproto.TYPE_STRING, aristaproto.TYPE_BOOL - ) - """ - feature_enabled is a map of feature name to enabled status. - If a feature is missing from this map it can be assumed off. - """ - - -@dataclass(eq=False, repr=False) -class DeviceKey(aristaproto.Message): - """DeviceKey uniquely identifies a single device.""" - - device_id: Optional[str] = aristaproto.message_field( - 1, wraps=aristaproto.TYPE_STRING - ) - """device_id is the unique identifier of the device.""" - - -@dataclass(eq=False, repr=False) -class DeviceConfiguration(aristaproto.Message): - """ - DeviceConfiguration holds the device-specific configuration for a third-party - device, as defined in https://github.com/aristanetworks/cloudvision-go. - """ - - options: Dict[str, str] = aristaproto.map_field( - 1, aristaproto.TYPE_STRING, aristaproto.TYPE_STRING - ) - """ - options is a map from device option to value. - - E.g., for an SNMP device, this could be the following: - - "address": "my_snmp_hostname", - "community": "public" - """ - - -@dataclass(eq=False, repr=False) -class UuidKey(aristaproto.Message): - """ - UUIDKey is a key that holds a UUID for an onboarding or decommissioning request. - """ - - request_id: Optional[str] = aristaproto.message_field( - 1, wraps=aristaproto.TYPE_STRING - ) - """request_id should be a UUID for the request.""" - - -@dataclass(eq=False, repr=False) -class DeviceOnboardingConfig(aristaproto.Message): - """ - DeviceOnboardingConfig describes a device onboarding request. "Onboarding" - refers to the process of initiating device streaming to CloudVision and - adding the streaming device to CloudVision's inventory. - - The request flow works as follows: - - 1. Set on DeviceOnboardingConfig sends an onboarding request with a UUID - that the user is responsible for generating. - 2. Once the server receives the request, it validates and records it. - 3. Then, the server processes it, initiating the onboarding procedure and - tracking the status of the onboarding attempt. - 4. The user may do a GetOne or Subscribe on DeviceOnboarding using the same - UUID to see the status of the request. - """ - - key: "UuidKey" = aristaproto.message_field(1) - """key identifies the request to onboard the device at hostname_or_ip.""" - - hostname_or_ip: Optional[str] = aristaproto.message_field( - 2, wraps=aristaproto.TYPE_STRING - ) - """ - hostname_or_ip is a hostname or an IP at which the device can be reached. - """ - - device_type: Optional[str] = aristaproto.message_field( - 3, wraps=aristaproto.TYPE_STRING - ) - """ - device_type describes the method by which to retrieve information for the - device. The value should be "eos" for eos devices. For third-party devices, - supported values are: "openconfig", "snmp", "cvp", "mwm", and "vCenter". - """ - - device_config: "DeviceConfiguration" = aristaproto.message_field(4) - """device_config is the configuration for a third-party device.""" - - -@dataclass(eq=False, repr=False) -class DeviceOnboarding(aristaproto.Message): - """DeviceOnboarding describes the status of an onboarding process.""" - - key: "UuidKey" = aristaproto.message_field(1) - """ - key identifies the request for which to retrieve an onboarding status. - """ - - device_id: Optional[str] = aristaproto.message_field( - 2, wraps=aristaproto.TYPE_STRING - ) - """device_id is the unique device ID that is discovered via onboarding.""" - - status: "OnboardingStatus" = aristaproto.enum_field(3) - """status describes the onboarding status of the device.""" - - error: Optional[str] = aristaproto.message_field(4, wraps=aristaproto.TYPE_STRING) - """ - error is the error that caused status to become ONBOARDING_STATUS_FAILURE. - """ - - status_message: Optional[str] = aristaproto.message_field( - 5, wraps=aristaproto.TYPE_STRING - ) - """ - status_message contains information on the status of the onboarding attempt, - if any. This is generally an unstructured log message that is for display - purposes only (its structure and contents may change). - """ - - -@dataclass(eq=False, repr=False) -class DeviceDecommissioningConfig(aristaproto.Message): - """ - DeviceDecommissioningConfig describes a device decommissioning request. - "Decommissioning" refers to the process of stopping device streaming to - CloudVision and removing it from CloudVision's inventory. - - The request flow works as follows: - - 1. Set on DeviceDecommissioningConfig sends a decommissioning request with - a UUID that the user is responsible for generating. - 2. Once the server receives the request, it validates and records it. - 3. Then, the server processes it, initiating the decommissioning procedure - and tracking the status of the decommissioning attempt. - 4. The user may do a GetOne or Subscribe on DeviceDecommissioning using the - same UUID to see the status of the request. - """ - - key: "UuidKey" = aristaproto.message_field(1) - """key identifies the request to decommission the device.""" - - device_id: Optional[str] = aristaproto.message_field( - 2, wraps=aristaproto.TYPE_STRING - ) - """ - device_id is the unique device ID that was discovered via onboarding. - """ - - force: Optional[bool] = aristaproto.message_field(3, wraps=aristaproto.TYPE_BOOL) - """ - force is a flag that indicates if the decommission is to be forced. - Normally, if there are pending or in-progress tasks associated with the device - the decommission would fail. In case of a forced decommission, such blocking - tasks would be ignored and decommissioning will be continued. - """ - - -@dataclass(eq=False, repr=False) -class DeviceDecommissioning(aristaproto.Message): - """DeviceOnboarding describes the status of a decommissioning process.""" - - key: "UuidKey" = aristaproto.message_field(1) - """ - key identifies the request for which to retrieve a decommissioning status. - """ - - status: "DecommissioningStatus" = aristaproto.enum_field(2) - """status describes the decommissioning status of the device.""" - - error: Optional[str] = aristaproto.message_field(3, wraps=aristaproto.TYPE_STRING) - """ - error is the error that caused status to become DECOMMISSIONING_STATUS_FAILURE. - """ - - status_message: Optional[str] = aristaproto.message_field( - 4, wraps=aristaproto.TYPE_STRING - ) - """ - status_message contains information on the status of the decommissioning attempt, - if any. This is generally an unstructured log message that is for display - purposes only (its structure and contents may change). - """ - - -@dataclass(eq=False, repr=False) -class Device(aristaproto.Message): - """Device describes an onboarded device.""" - - key: "DeviceKey" = aristaproto.message_field(1) - """key uniquely identifies the device.""" - - software_version: Optional[str] = aristaproto.message_field( - 2, wraps=aristaproto.TYPE_STRING - ) - """ - software_version gives the currently running device software version. - """ - - model_name: Optional[str] = aristaproto.message_field( - 3, wraps=aristaproto.TYPE_STRING - ) - """model_name describes the hardware model of this device.""" - - hardware_revision: Optional[str] = aristaproto.message_field( - 4, wraps=aristaproto.TYPE_STRING - ) - """hardware_revision describes any revisional data to the model name.""" - - fqdn: Optional[str] = aristaproto.message_field(10, wraps=aristaproto.TYPE_STRING) - """fqdn gives the device's fully qualified domain name.""" - - hostname: Optional[str] = aristaproto.message_field( - 11, wraps=aristaproto.TYPE_STRING - ) - """hostname is the hostname as reported on the device.""" - - domain_name: Optional[str] = aristaproto.message_field( - 12, wraps=aristaproto.TYPE_STRING - ) - """ - domain_name provides the domain name on which the device is registered. - """ - - system_mac_address: Optional[str] = aristaproto.message_field( - 13, wraps=aristaproto.TYPE_STRING - ) - """system_mac_address provides the MAC address of the management port.""" - - boot_time: datetime = aristaproto.message_field(20) - """boot_time indicates when the device was last booted.""" - - streaming_status: "StreamingStatus" = aristaproto.enum_field(30) - """ - streaming_status is the status of telemetry streaming for this device. - """ - - extended_attributes: "ExtendedAttributes" = aristaproto.message_field(31) - """ - extended_attributes wraps any additional, potentially non-standard, features - or attributes that the device reports. - """ - - -@dataclass(eq=False, repr=False) -class ProvisionedDevice(aristaproto.Message): - """ - ProvisionedDevice describes the provisioning status of an onboarded device - if the onboarded device is configured for provisioning. - """ - - key: "DeviceKey" = aristaproto.message_field(1) - """key uniquely identifies the device.""" - - status: "ProvisioningStatus" = aristaproto.enum_field(2) - """status describes the onboarded device's provisioning status.""" - - error: Optional[str] = aristaproto.message_field(3, wraps=aristaproto.TYPE_STRING) - """ - error is the error that caused status to become PROVISIONING_STATUS_FAILURE. - """ - - ztp_mode: Optional[bool] = aristaproto.message_field(4, wraps=aristaproto.TYPE_BOOL) - """ztp_mode indicates whether the device is in ZTP mode.""" - - ip_address: "___fmp__.IpAddress" = aristaproto.message_field(5) - """ - ip_address is the current (post-provisioning) IP address of the device. - """ - - provisioning_group_name: Optional[str] = aristaproto.message_field( - 6, wraps=aristaproto.TYPE_STRING - ) - """ - provisioning_group_name is the name of the group (also known as a container) - to which the device belongs. Any provisioning operation performed on this - group will also be performed on this device. If the device is not yet provisioned, - this will not be set. Once it is provisioned, this will be set to "undefined_container" - which indicates that the device does not yet belong to a group. At this point, - a user may set it to an existing group. - """ - - -@dataclass(eq=False, repr=False) -class DeviceRequest(aristaproto.Message): - key: "DeviceKey" = aristaproto.message_field(1) - """ - Key uniquely identifies a Device instance to retrieve. - This value must be populated. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the time for which you are interested in the data. - If no time is given, the server will use the time at which it makes the request. - """ - - -@dataclass(eq=False, repr=False) -class DeviceResponse(aristaproto.Message): - value: "Device" = aristaproto.message_field(1) - """ - Value is the value requested. - This structure will be fully-populated as it exists in the datastore. If - optional fields were not given at creation, these fields will be empty or - set to default values. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time carries the (UTC) timestamp of the last-modification of the - Device instance in this response. - """ - - -@dataclass(eq=False, repr=False) -class DeviceStreamRequest(aristaproto.Message): - partial_eq_filter: List["Device"] = aristaproto.message_field(1) - """ - PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. - This requires all provided fields to be equal to the response. - - While transparent to users, this field also allows services to optimize internal - subscriptions if filter(s) are sufficiently specific. - """ - - time: "__time__.TimeBounds" = aristaproto.message_field(3) - """ - TimeRange allows limiting response data to within a specified time window. - If this field is populated, at least one of the two time fields are required. - - This field is not allowed in the Subscribe RPC. - """ - - -@dataclass(eq=False, repr=False) -class DeviceStreamResponse(aristaproto.Message): - value: "Device" = aristaproto.message_field(1) - """ - Value is a value deemed relevant to the initiating request. - This structure will always have its key-field populated. Which other fields are - populated, and why, depends on the value of Operation and what triggered this notification. - """ - - time: datetime = aristaproto.message_field(2) - """Time holds the timestamp of this Device's last modification.""" - - type: "__subscriptions__.Operation" = aristaproto.enum_field(3) - """ - Operation indicates how the Device value in this response should be considered. - Under non-subscribe requests, this value should always be INITIAL. In a subscription, - once all initial data is streamed and the client begins to receive modification updates, - you should not see INITIAL again. - """ - - -@dataclass(eq=False, repr=False) -class DeviceDecommissioningRequest(aristaproto.Message): - key: "UuidKey" = aristaproto.message_field(1) - """ - Key uniquely identifies a DeviceDecommissioning instance to retrieve. - This value must be populated. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the time for which you are interested in the data. - If no time is given, the server will use the time at which it makes the request. - """ - - -@dataclass(eq=False, repr=False) -class DeviceDecommissioningResponse(aristaproto.Message): - value: "DeviceDecommissioning" = aristaproto.message_field(1) - """ - Value is the value requested. - This structure will be fully-populated as it exists in the datastore. If - optional fields were not given at creation, these fields will be empty or - set to default values. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time carries the (UTC) timestamp of the last-modification of the - DeviceDecommissioning instance in this response. - """ - - -@dataclass(eq=False, repr=False) -class DeviceDecommissioningStreamRequest(aristaproto.Message): - partial_eq_filter: List["DeviceDecommissioning"] = aristaproto.message_field(1) - """ - PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. - This requires all provided fields to be equal to the response. - - While transparent to users, this field also allows services to optimize internal - subscriptions if filter(s) are sufficiently specific. - """ - - time: "__time__.TimeBounds" = aristaproto.message_field(3) - """ - TimeRange allows limiting response data to within a specified time window. - If this field is populated, at least one of the two time fields are required. - - This field is not allowed in the Subscribe RPC. - """ - - -@dataclass(eq=False, repr=False) -class DeviceDecommissioningStreamResponse(aristaproto.Message): - value: "DeviceDecommissioning" = aristaproto.message_field(1) - """ - Value is a value deemed relevant to the initiating request. - This structure will always have its key-field populated. Which other fields are - populated, and why, depends on the value of Operation and what triggered this notification. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time holds the timestamp of this DeviceDecommissioning's last modification. - """ - - type: "__subscriptions__.Operation" = aristaproto.enum_field(3) - """ - Operation indicates how the DeviceDecommissioning value in this response should be considered. - Under non-subscribe requests, this value should always be INITIAL. In a subscription, - once all initial data is streamed and the client begins to receive modification updates, - you should not see INITIAL again. - """ - - -@dataclass(eq=False, repr=False) -class DeviceDecommissioningConfigRequest(aristaproto.Message): - key: "UuidKey" = aristaproto.message_field(1) - """ - Key uniquely identifies a DeviceDecommissioningConfig instance to retrieve. - This value must be populated. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the time for which you are interested in the data. - If no time is given, the server will use the time at which it makes the request. - """ - - -@dataclass(eq=False, repr=False) -class DeviceDecommissioningConfigResponse(aristaproto.Message): - value: "DeviceDecommissioningConfig" = aristaproto.message_field(1) - """ - Value is the value requested. - This structure will be fully-populated as it exists in the datastore. If - optional fields were not given at creation, these fields will be empty or - set to default values. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time carries the (UTC) timestamp of the last-modification of the - DeviceDecommissioningConfig instance in this response. - """ - - -@dataclass(eq=False, repr=False) -class DeviceDecommissioningConfigStreamRequest(aristaproto.Message): - partial_eq_filter: List["DeviceDecommissioningConfig"] = aristaproto.message_field( - 1 - ) - """ - PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. - This requires all provided fields to be equal to the response. - - While transparent to users, this field also allows services to optimize internal - subscriptions if filter(s) are sufficiently specific. - """ - - time: "__time__.TimeBounds" = aristaproto.message_field(3) - """ - TimeRange allows limiting response data to within a specified time window. - If this field is populated, at least one of the two time fields are required. - - This field is not allowed in the Subscribe RPC. - """ - - -@dataclass(eq=False, repr=False) -class DeviceDecommissioningConfigStreamResponse(aristaproto.Message): - value: "DeviceDecommissioningConfig" = aristaproto.message_field(1) - """ - Value is a value deemed relevant to the initiating request. - This structure will always have its key-field populated. Which other fields are - populated, and why, depends on the value of Operation and what triggered this notification. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time holds the timestamp of this DeviceDecommissioningConfig's last modification. - """ - - type: "__subscriptions__.Operation" = aristaproto.enum_field(3) - """ - Operation indicates how the DeviceDecommissioningConfig value in this response should be considered. - Under non-subscribe requests, this value should always be INITIAL. In a subscription, - once all initial data is streamed and the client begins to receive modification updates, - you should not see INITIAL again. - """ - - -@dataclass(eq=False, repr=False) -class DeviceDecommissioningConfigSetRequest(aristaproto.Message): - value: "DeviceDecommissioningConfig" = aristaproto.message_field(1) - """ - DeviceDecommissioningConfig carries the value to set into the datastore. - See the documentation on the DeviceDecommissioningConfig struct for which fields are required. - """ - - -@dataclass(eq=False, repr=False) -class DeviceDecommissioningConfigSetResponse(aristaproto.Message): - value: "DeviceDecommissioningConfig" = aristaproto.message_field(1) - """ - Value carries all the values given in the DeviceDecommissioningConfigSetRequest as well - as any server-generated values. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the (UTC) timestamp at which the system recognizes the - creation. The only guarantees made about this timestamp are: - - - it is after the time the request was received - - a time-ranged query with StartTime==CreatedAt will include this instance. - """ - - -@dataclass(eq=False, repr=False) -class DeviceDecommissioningConfigDeleteRequest(aristaproto.Message): - key: "UuidKey" = aristaproto.message_field(1) - """ - Key indicates which DeviceDecommissioningConfig instance to remove. - This field must always be set. - """ - - -@dataclass(eq=False, repr=False) -class DeviceDecommissioningConfigDeleteResponse(aristaproto.Message): - key: "UuidKey" = aristaproto.message_field(1) - """ - Key echoes back the key of the deleted DeviceDecommissioningConfig instance. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the (UTC) timestamp at which the system recognizes the - deletion. The only guarantees made about this timestamp are: - - - it is after the time the request was received - - a time-ranged query with StartTime==DeletedAt will not include this instance. - """ - - -@dataclass(eq=False, repr=False) -class DeviceDecommissioningConfigDeleteAllRequest(aristaproto.Message): - pass - - -@dataclass(eq=False, repr=False) -class DeviceDecommissioningConfigDeleteAllResponse(aristaproto.Message): - type: "___fmp__.DeleteError" = aristaproto.enum_field(1) - """This describes the class of delete error.""" - - error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) - """This indicates the error message from the delete failure.""" - - key: "UuidKey" = aristaproto.message_field(3) - """ - This is the key of the DeviceDecommissioningConfig instance that failed to be deleted. - """ - - time: datetime = aristaproto.message_field(4) - """Time indicates the (UTC) timestamp when the key was being deleted.""" - - -@dataclass(eq=False, repr=False) -class DeviceOnboardingRequest(aristaproto.Message): - key: "UuidKey" = aristaproto.message_field(1) - """ - Key uniquely identifies a DeviceOnboarding instance to retrieve. - This value must be populated. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the time for which you are interested in the data. - If no time is given, the server will use the time at which it makes the request. - """ - - -@dataclass(eq=False, repr=False) -class DeviceOnboardingResponse(aristaproto.Message): - value: "DeviceOnboarding" = aristaproto.message_field(1) - """ - Value is the value requested. - This structure will be fully-populated as it exists in the datastore. If - optional fields were not given at creation, these fields will be empty or - set to default values. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time carries the (UTC) timestamp of the last-modification of the - DeviceOnboarding instance in this response. - """ - - -@dataclass(eq=False, repr=False) -class DeviceOnboardingStreamRequest(aristaproto.Message): - partial_eq_filter: List["DeviceOnboarding"] = aristaproto.message_field(1) - """ - PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. - This requires all provided fields to be equal to the response. - - While transparent to users, this field also allows services to optimize internal - subscriptions if filter(s) are sufficiently specific. - """ - - time: "__time__.TimeBounds" = aristaproto.message_field(3) - """ - TimeRange allows limiting response data to within a specified time window. - If this field is populated, at least one of the two time fields are required. - - This field is not allowed in the Subscribe RPC. - """ - - -@dataclass(eq=False, repr=False) -class DeviceOnboardingStreamResponse(aristaproto.Message): - value: "DeviceOnboarding" = aristaproto.message_field(1) - """ - Value is a value deemed relevant to the initiating request. - This structure will always have its key-field populated. Which other fields are - populated, and why, depends on the value of Operation and what triggered this notification. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time holds the timestamp of this DeviceOnboarding's last modification. - """ - - type: "__subscriptions__.Operation" = aristaproto.enum_field(3) - """ - Operation indicates how the DeviceOnboarding value in this response should be considered. - Under non-subscribe requests, this value should always be INITIAL. In a subscription, - once all initial data is streamed and the client begins to receive modification updates, - you should not see INITIAL again. - """ - - -@dataclass(eq=False, repr=False) -class DeviceOnboardingConfigRequest(aristaproto.Message): - key: "UuidKey" = aristaproto.message_field(1) - """ - Key uniquely identifies a DeviceOnboardingConfig instance to retrieve. - This value must be populated. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the time for which you are interested in the data. - If no time is given, the server will use the time at which it makes the request. - """ - - -@dataclass(eq=False, repr=False) -class DeviceOnboardingConfigResponse(aristaproto.Message): - value: "DeviceOnboardingConfig" = aristaproto.message_field(1) - """ - Value is the value requested. - This structure will be fully-populated as it exists in the datastore. If - optional fields were not given at creation, these fields will be empty or - set to default values. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time carries the (UTC) timestamp of the last-modification of the - DeviceOnboardingConfig instance in this response. - """ - - -@dataclass(eq=False, repr=False) -class DeviceOnboardingConfigStreamRequest(aristaproto.Message): - partial_eq_filter: List["DeviceOnboardingConfig"] = aristaproto.message_field(1) - """ - PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. - This requires all provided fields to be equal to the response. - - While transparent to users, this field also allows services to optimize internal - subscriptions if filter(s) are sufficiently specific. - """ - - time: "__time__.TimeBounds" = aristaproto.message_field(3) - """ - TimeRange allows limiting response data to within a specified time window. - If this field is populated, at least one of the two time fields are required. - - This field is not allowed in the Subscribe RPC. - """ - - -@dataclass(eq=False, repr=False) -class DeviceOnboardingConfigStreamResponse(aristaproto.Message): - value: "DeviceOnboardingConfig" = aristaproto.message_field(1) - """ - Value is a value deemed relevant to the initiating request. - This structure will always have its key-field populated. Which other fields are - populated, and why, depends on the value of Operation and what triggered this notification. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time holds the timestamp of this DeviceOnboardingConfig's last modification. - """ - - type: "__subscriptions__.Operation" = aristaproto.enum_field(3) - """ - Operation indicates how the DeviceOnboardingConfig value in this response should be considered. - Under non-subscribe requests, this value should always be INITIAL. In a subscription, - once all initial data is streamed and the client begins to receive modification updates, - you should not see INITIAL again. - """ - - -@dataclass(eq=False, repr=False) -class DeviceOnboardingConfigSetRequest(aristaproto.Message): - value: "DeviceOnboardingConfig" = aristaproto.message_field(1) - """ - DeviceOnboardingConfig carries the value to set into the datastore. - See the documentation on the DeviceOnboardingConfig struct for which fields are required. - """ - - -@dataclass(eq=False, repr=False) -class DeviceOnboardingConfigSetResponse(aristaproto.Message): - value: "DeviceOnboardingConfig" = aristaproto.message_field(1) - """ - Value carries all the values given in the DeviceOnboardingConfigSetRequest as well - as any server-generated values. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the (UTC) timestamp at which the system recognizes the - creation. The only guarantees made about this timestamp are: - - - it is after the time the request was received - - a time-ranged query with StartTime==CreatedAt will include this instance. - """ - - -@dataclass(eq=False, repr=False) -class DeviceOnboardingConfigDeleteRequest(aristaproto.Message): - key: "UuidKey" = aristaproto.message_field(1) - """ - Key indicates which DeviceOnboardingConfig instance to remove. - This field must always be set. - """ - - -@dataclass(eq=False, repr=False) -class DeviceOnboardingConfigDeleteResponse(aristaproto.Message): - key: "UuidKey" = aristaproto.message_field(1) - """ - Key echoes back the key of the deleted DeviceOnboardingConfig instance. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the (UTC) timestamp at which the system recognizes the - deletion. The only guarantees made about this timestamp are: - - - it is after the time the request was received - - a time-ranged query with StartTime==DeletedAt will not include this instance. - """ - - -@dataclass(eq=False, repr=False) -class DeviceOnboardingConfigDeleteAllRequest(aristaproto.Message): - pass - - -@dataclass(eq=False, repr=False) -class DeviceOnboardingConfigDeleteAllResponse(aristaproto.Message): - type: "___fmp__.DeleteError" = aristaproto.enum_field(1) - """This describes the class of delete error.""" - - error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) - """This indicates the error message from the delete failure.""" - - key: "UuidKey" = aristaproto.message_field(3) - """ - This is the key of the DeviceOnboardingConfig instance that failed to be deleted. - """ - - time: datetime = aristaproto.message_field(4) - """Time indicates the (UTC) timestamp when the key was being deleted.""" - - -@dataclass(eq=False, repr=False) -class ProvisionedDeviceRequest(aristaproto.Message): - key: "DeviceKey" = aristaproto.message_field(1) - """ - Key uniquely identifies a ProvisionedDevice instance to retrieve. - This value must be populated. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the time for which you are interested in the data. - If no time is given, the server will use the time at which it makes the request. - """ - - -@dataclass(eq=False, repr=False) -class ProvisionedDeviceResponse(aristaproto.Message): - value: "ProvisionedDevice" = aristaproto.message_field(1) - """ - Value is the value requested. - This structure will be fully-populated as it exists in the datastore. If - optional fields were not given at creation, these fields will be empty or - set to default values. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time carries the (UTC) timestamp of the last-modification of the - ProvisionedDevice instance in this response. - """ - - -@dataclass(eq=False, repr=False) -class ProvisionedDeviceStreamRequest(aristaproto.Message): - partial_eq_filter: List["ProvisionedDevice"] = aristaproto.message_field(1) - """ - PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. - This requires all provided fields to be equal to the response. - - While transparent to users, this field also allows services to optimize internal - subscriptions if filter(s) are sufficiently specific. - """ - - time: "__time__.TimeBounds" = aristaproto.message_field(3) - """ - TimeRange allows limiting response data to within a specified time window. - If this field is populated, at least one of the two time fields are required. - - This field is not allowed in the Subscribe RPC. - """ - - -@dataclass(eq=False, repr=False) -class ProvisionedDeviceStreamResponse(aristaproto.Message): - value: "ProvisionedDevice" = aristaproto.message_field(1) - """ - Value is a value deemed relevant to the initiating request. - This structure will always have its key-field populated. Which other fields are - populated, and why, depends on the value of Operation and what triggered this notification. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time holds the timestamp of this ProvisionedDevice's last modification. - """ - - type: "__subscriptions__.Operation" = aristaproto.enum_field(3) - """ - Operation indicates how the ProvisionedDevice value in this response should be considered. - Under non-subscribe requests, this value should always be INITIAL. In a subscription, - once all initial data is streamed and the client begins to receive modification updates, - you should not see INITIAL again. - """ - - -class DeviceServiceStub(aristaproto.ServiceStub): - async def get_one( - self, - device_request: "DeviceRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> "DeviceResponse": - return await self._unary_unary( - "/arista.inventory.v1.DeviceService/GetOne", - device_request, - DeviceResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ) - - async def get_all( - self, - device_stream_request: "DeviceStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["DeviceStreamResponse"]: - async for response in self._unary_stream( - "/arista.inventory.v1.DeviceService/GetAll", - device_stream_request, - DeviceStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - async def subscribe( - self, - device_stream_request: "DeviceStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["DeviceStreamResponse"]: - async for response in self._unary_stream( - "/arista.inventory.v1.DeviceService/Subscribe", - device_stream_request, - DeviceStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - -class DeviceDecommissioningServiceStub(aristaproto.ServiceStub): - async def get_one( - self, - device_decommissioning_request: "DeviceDecommissioningRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> "DeviceDecommissioningResponse": - return await self._unary_unary( - "/arista.inventory.v1.DeviceDecommissioningService/GetOne", - device_decommissioning_request, - DeviceDecommissioningResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ) - - async def get_all( - self, - device_decommissioning_stream_request: "DeviceDecommissioningStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["DeviceDecommissioningStreamResponse"]: - async for response in self._unary_stream( - "/arista.inventory.v1.DeviceDecommissioningService/GetAll", - device_decommissioning_stream_request, - DeviceDecommissioningStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - async def subscribe( - self, - device_decommissioning_stream_request: "DeviceDecommissioningStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["DeviceDecommissioningStreamResponse"]: - async for response in self._unary_stream( - "/arista.inventory.v1.DeviceDecommissioningService/Subscribe", - device_decommissioning_stream_request, - DeviceDecommissioningStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - -class DeviceDecommissioningConfigServiceStub(aristaproto.ServiceStub): - async def get_one( - self, - device_decommissioning_config_request: "DeviceDecommissioningConfigRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> "DeviceDecommissioningConfigResponse": - return await self._unary_unary( - "/arista.inventory.v1.DeviceDecommissioningConfigService/GetOne", - device_decommissioning_config_request, - DeviceDecommissioningConfigResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ) - - async def get_all( - self, - device_decommissioning_config_stream_request: "DeviceDecommissioningConfigStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["DeviceDecommissioningConfigStreamResponse"]: - async for response in self._unary_stream( - "/arista.inventory.v1.DeviceDecommissioningConfigService/GetAll", - device_decommissioning_config_stream_request, - DeviceDecommissioningConfigStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - async def subscribe( - self, - device_decommissioning_config_stream_request: "DeviceDecommissioningConfigStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["DeviceDecommissioningConfigStreamResponse"]: - async for response in self._unary_stream( - "/arista.inventory.v1.DeviceDecommissioningConfigService/Subscribe", - device_decommissioning_config_stream_request, - DeviceDecommissioningConfigStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - async def set( - self, - device_decommissioning_config_set_request: "DeviceDecommissioningConfigSetRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> "DeviceDecommissioningConfigSetResponse": - return await self._unary_unary( - "/arista.inventory.v1.DeviceDecommissioningConfigService/Set", - device_decommissioning_config_set_request, - DeviceDecommissioningConfigSetResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ) - - async def delete( - self, - device_decommissioning_config_delete_request: "DeviceDecommissioningConfigDeleteRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> "DeviceDecommissioningConfigDeleteResponse": - return await self._unary_unary( - "/arista.inventory.v1.DeviceDecommissioningConfigService/Delete", - device_decommissioning_config_delete_request, - DeviceDecommissioningConfigDeleteResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ) - - async def delete_all( - self, - device_decommissioning_config_delete_all_request: "DeviceDecommissioningConfigDeleteAllRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["DeviceDecommissioningConfigDeleteAllResponse"]: - async for response in self._unary_stream( - "/arista.inventory.v1.DeviceDecommissioningConfigService/DeleteAll", - device_decommissioning_config_delete_all_request, - DeviceDecommissioningConfigDeleteAllResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - -class DeviceOnboardingServiceStub(aristaproto.ServiceStub): - async def get_one( - self, - device_onboarding_request: "DeviceOnboardingRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> "DeviceOnboardingResponse": - return await self._unary_unary( - "/arista.inventory.v1.DeviceOnboardingService/GetOne", - device_onboarding_request, - DeviceOnboardingResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ) - - async def get_all( - self, - device_onboarding_stream_request: "DeviceOnboardingStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["DeviceOnboardingStreamResponse"]: - async for response in self._unary_stream( - "/arista.inventory.v1.DeviceOnboardingService/GetAll", - device_onboarding_stream_request, - DeviceOnboardingStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - async def subscribe( - self, - device_onboarding_stream_request: "DeviceOnboardingStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["DeviceOnboardingStreamResponse"]: - async for response in self._unary_stream( - "/arista.inventory.v1.DeviceOnboardingService/Subscribe", - device_onboarding_stream_request, - DeviceOnboardingStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - -class DeviceOnboardingConfigServiceStub(aristaproto.ServiceStub): - async def get_one( - self, - device_onboarding_config_request: "DeviceOnboardingConfigRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> "DeviceOnboardingConfigResponse": - return await self._unary_unary( - "/arista.inventory.v1.DeviceOnboardingConfigService/GetOne", - device_onboarding_config_request, - DeviceOnboardingConfigResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ) - - async def get_all( - self, - device_onboarding_config_stream_request: "DeviceOnboardingConfigStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["DeviceOnboardingConfigStreamResponse"]: - async for response in self._unary_stream( - "/arista.inventory.v1.DeviceOnboardingConfigService/GetAll", - device_onboarding_config_stream_request, - DeviceOnboardingConfigStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - async def subscribe( - self, - device_onboarding_config_stream_request: "DeviceOnboardingConfigStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["DeviceOnboardingConfigStreamResponse"]: - async for response in self._unary_stream( - "/arista.inventory.v1.DeviceOnboardingConfigService/Subscribe", - device_onboarding_config_stream_request, - DeviceOnboardingConfigStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - async def set( - self, - device_onboarding_config_set_request: "DeviceOnboardingConfigSetRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> "DeviceOnboardingConfigSetResponse": - return await self._unary_unary( - "/arista.inventory.v1.DeviceOnboardingConfigService/Set", - device_onboarding_config_set_request, - DeviceOnboardingConfigSetResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ) - - async def delete( - self, - device_onboarding_config_delete_request: "DeviceOnboardingConfigDeleteRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> "DeviceOnboardingConfigDeleteResponse": - return await self._unary_unary( - "/arista.inventory.v1.DeviceOnboardingConfigService/Delete", - device_onboarding_config_delete_request, - DeviceOnboardingConfigDeleteResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ) - - async def delete_all( - self, - device_onboarding_config_delete_all_request: "DeviceOnboardingConfigDeleteAllRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["DeviceOnboardingConfigDeleteAllResponse"]: - async for response in self._unary_stream( - "/arista.inventory.v1.DeviceOnboardingConfigService/DeleteAll", - device_onboarding_config_delete_all_request, - DeviceOnboardingConfigDeleteAllResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - -class ProvisionedDeviceServiceStub(aristaproto.ServiceStub): - async def get_one( - self, - provisioned_device_request: "ProvisionedDeviceRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> "ProvisionedDeviceResponse": - return await self._unary_unary( - "/arista.inventory.v1.ProvisionedDeviceService/GetOne", - provisioned_device_request, - ProvisionedDeviceResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ) - - async def get_all( - self, - provisioned_device_stream_request: "ProvisionedDeviceStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["ProvisionedDeviceStreamResponse"]: - async for response in self._unary_stream( - "/arista.inventory.v1.ProvisionedDeviceService/GetAll", - provisioned_device_stream_request, - ProvisionedDeviceStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - async def subscribe( - self, - provisioned_device_stream_request: "ProvisionedDeviceStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["ProvisionedDeviceStreamResponse"]: - async for response in self._unary_stream( - "/arista.inventory.v1.ProvisionedDeviceService/Subscribe", - provisioned_device_stream_request, - ProvisionedDeviceStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - -class DeviceServiceBase(ServiceBase): - async def get_one(self, device_request: "DeviceRequest") -> "DeviceResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def get_all( - self, device_stream_request: "DeviceStreamRequest" - ) -> AsyncIterator["DeviceStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def subscribe( - self, device_stream_request: "DeviceStreamRequest" - ) -> AsyncIterator["DeviceStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def __rpc_get_one( - self, stream: "grpclib.server.Stream[DeviceRequest, DeviceResponse]" - ) -> None: - request = await stream.recv_message() - response = await self.get_one(request) - await stream.send_message(response) - - async def __rpc_get_all( - self, stream: "grpclib.server.Stream[DeviceStreamRequest, DeviceStreamResponse]" - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.get_all, - stream, - request, - ) - - async def __rpc_subscribe( - self, stream: "grpclib.server.Stream[DeviceStreamRequest, DeviceStreamResponse]" - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.subscribe, - stream, - request, - ) - - def __mapping__(self) -> Dict[str, grpclib.const.Handler]: - return { - "/arista.inventory.v1.DeviceService/GetOne": grpclib.const.Handler( - self.__rpc_get_one, - grpclib.const.Cardinality.UNARY_UNARY, - DeviceRequest, - DeviceResponse, - ), - "/arista.inventory.v1.DeviceService/GetAll": grpclib.const.Handler( - self.__rpc_get_all, - grpclib.const.Cardinality.UNARY_STREAM, - DeviceStreamRequest, - DeviceStreamResponse, - ), - "/arista.inventory.v1.DeviceService/Subscribe": grpclib.const.Handler( - self.__rpc_subscribe, - grpclib.const.Cardinality.UNARY_STREAM, - DeviceStreamRequest, - DeviceStreamResponse, - ), - } - - -class DeviceDecommissioningServiceBase(ServiceBase): - async def get_one( - self, device_decommissioning_request: "DeviceDecommissioningRequest" - ) -> "DeviceDecommissioningResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def get_all( - self, - device_decommissioning_stream_request: "DeviceDecommissioningStreamRequest", - ) -> AsyncIterator["DeviceDecommissioningStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def subscribe( - self, - device_decommissioning_stream_request: "DeviceDecommissioningStreamRequest", - ) -> AsyncIterator["DeviceDecommissioningStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def __rpc_get_one( - self, - stream: "grpclib.server.Stream[DeviceDecommissioningRequest, DeviceDecommissioningResponse]", - ) -> None: - request = await stream.recv_message() - response = await self.get_one(request) - await stream.send_message(response) - - async def __rpc_get_all( - self, - stream: "grpclib.server.Stream[DeviceDecommissioningStreamRequest, DeviceDecommissioningStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.get_all, - stream, - request, - ) - - async def __rpc_subscribe( - self, - stream: "grpclib.server.Stream[DeviceDecommissioningStreamRequest, DeviceDecommissioningStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.subscribe, - stream, - request, - ) - - def __mapping__(self) -> Dict[str, grpclib.const.Handler]: - return { - "/arista.inventory.v1.DeviceDecommissioningService/GetOne": grpclib.const.Handler( - self.__rpc_get_one, - grpclib.const.Cardinality.UNARY_UNARY, - DeviceDecommissioningRequest, - DeviceDecommissioningResponse, - ), - "/arista.inventory.v1.DeviceDecommissioningService/GetAll": grpclib.const.Handler( - self.__rpc_get_all, - grpclib.const.Cardinality.UNARY_STREAM, - DeviceDecommissioningStreamRequest, - DeviceDecommissioningStreamResponse, - ), - "/arista.inventory.v1.DeviceDecommissioningService/Subscribe": grpclib.const.Handler( - self.__rpc_subscribe, - grpclib.const.Cardinality.UNARY_STREAM, - DeviceDecommissioningStreamRequest, - DeviceDecommissioningStreamResponse, - ), - } - - -class DeviceDecommissioningConfigServiceBase(ServiceBase): - async def get_one( - self, - device_decommissioning_config_request: "DeviceDecommissioningConfigRequest", - ) -> "DeviceDecommissioningConfigResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def get_all( - self, - device_decommissioning_config_stream_request: "DeviceDecommissioningConfigStreamRequest", - ) -> AsyncIterator["DeviceDecommissioningConfigStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def subscribe( - self, - device_decommissioning_config_stream_request: "DeviceDecommissioningConfigStreamRequest", - ) -> AsyncIterator["DeviceDecommissioningConfigStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def set( - self, - device_decommissioning_config_set_request: "DeviceDecommissioningConfigSetRequest", - ) -> "DeviceDecommissioningConfigSetResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def delete( - self, - device_decommissioning_config_delete_request: "DeviceDecommissioningConfigDeleteRequest", - ) -> "DeviceDecommissioningConfigDeleteResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def delete_all( - self, - device_decommissioning_config_delete_all_request: "DeviceDecommissioningConfigDeleteAllRequest", - ) -> AsyncIterator["DeviceDecommissioningConfigDeleteAllResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def __rpc_get_one( - self, - stream: "grpclib.server.Stream[DeviceDecommissioningConfigRequest, DeviceDecommissioningConfigResponse]", - ) -> None: - request = await stream.recv_message() - response = await self.get_one(request) - await stream.send_message(response) - - async def __rpc_get_all( - self, - stream: "grpclib.server.Stream[DeviceDecommissioningConfigStreamRequest, DeviceDecommissioningConfigStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.get_all, - stream, - request, - ) - - async def __rpc_subscribe( - self, - stream: "grpclib.server.Stream[DeviceDecommissioningConfigStreamRequest, DeviceDecommissioningConfigStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.subscribe, - stream, - request, - ) - - async def __rpc_set( - self, - stream: "grpclib.server.Stream[DeviceDecommissioningConfigSetRequest, DeviceDecommissioningConfigSetResponse]", - ) -> None: - request = await stream.recv_message() - response = await self.set(request) - await stream.send_message(response) - - async def __rpc_delete( - self, - stream: "grpclib.server.Stream[DeviceDecommissioningConfigDeleteRequest, DeviceDecommissioningConfigDeleteResponse]", - ) -> None: - request = await stream.recv_message() - response = await self.delete(request) - await stream.send_message(response) - - async def __rpc_delete_all( - self, - stream: "grpclib.server.Stream[DeviceDecommissioningConfigDeleteAllRequest, DeviceDecommissioningConfigDeleteAllResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.delete_all, - stream, - request, - ) - - def __mapping__(self) -> Dict[str, grpclib.const.Handler]: - return { - "/arista.inventory.v1.DeviceDecommissioningConfigService/GetOne": grpclib.const.Handler( - self.__rpc_get_one, - grpclib.const.Cardinality.UNARY_UNARY, - DeviceDecommissioningConfigRequest, - DeviceDecommissioningConfigResponse, - ), - "/arista.inventory.v1.DeviceDecommissioningConfigService/GetAll": grpclib.const.Handler( - self.__rpc_get_all, - grpclib.const.Cardinality.UNARY_STREAM, - DeviceDecommissioningConfigStreamRequest, - DeviceDecommissioningConfigStreamResponse, - ), - "/arista.inventory.v1.DeviceDecommissioningConfigService/Subscribe": grpclib.const.Handler( - self.__rpc_subscribe, - grpclib.const.Cardinality.UNARY_STREAM, - DeviceDecommissioningConfigStreamRequest, - DeviceDecommissioningConfigStreamResponse, - ), - "/arista.inventory.v1.DeviceDecommissioningConfigService/Set": grpclib.const.Handler( - self.__rpc_set, - grpclib.const.Cardinality.UNARY_UNARY, - DeviceDecommissioningConfigSetRequest, - DeviceDecommissioningConfigSetResponse, - ), - "/arista.inventory.v1.DeviceDecommissioningConfigService/Delete": grpclib.const.Handler( - self.__rpc_delete, - grpclib.const.Cardinality.UNARY_UNARY, - DeviceDecommissioningConfigDeleteRequest, - DeviceDecommissioningConfigDeleteResponse, - ), - "/arista.inventory.v1.DeviceDecommissioningConfigService/DeleteAll": grpclib.const.Handler( - self.__rpc_delete_all, - grpclib.const.Cardinality.UNARY_STREAM, - DeviceDecommissioningConfigDeleteAllRequest, - DeviceDecommissioningConfigDeleteAllResponse, - ), - } - - -class DeviceOnboardingServiceBase(ServiceBase): - async def get_one( - self, device_onboarding_request: "DeviceOnboardingRequest" - ) -> "DeviceOnboardingResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def get_all( - self, device_onboarding_stream_request: "DeviceOnboardingStreamRequest" - ) -> AsyncIterator["DeviceOnboardingStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def subscribe( - self, device_onboarding_stream_request: "DeviceOnboardingStreamRequest" - ) -> AsyncIterator["DeviceOnboardingStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def __rpc_get_one( - self, - stream: "grpclib.server.Stream[DeviceOnboardingRequest, DeviceOnboardingResponse]", - ) -> None: - request = await stream.recv_message() - response = await self.get_one(request) - await stream.send_message(response) - - async def __rpc_get_all( - self, - stream: "grpclib.server.Stream[DeviceOnboardingStreamRequest, DeviceOnboardingStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.get_all, - stream, - request, - ) - - async def __rpc_subscribe( - self, - stream: "grpclib.server.Stream[DeviceOnboardingStreamRequest, DeviceOnboardingStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.subscribe, - stream, - request, - ) - - def __mapping__(self) -> Dict[str, grpclib.const.Handler]: - return { - "/arista.inventory.v1.DeviceOnboardingService/GetOne": grpclib.const.Handler( - self.__rpc_get_one, - grpclib.const.Cardinality.UNARY_UNARY, - DeviceOnboardingRequest, - DeviceOnboardingResponse, - ), - "/arista.inventory.v1.DeviceOnboardingService/GetAll": grpclib.const.Handler( - self.__rpc_get_all, - grpclib.const.Cardinality.UNARY_STREAM, - DeviceOnboardingStreamRequest, - DeviceOnboardingStreamResponse, - ), - "/arista.inventory.v1.DeviceOnboardingService/Subscribe": grpclib.const.Handler( - self.__rpc_subscribe, - grpclib.const.Cardinality.UNARY_STREAM, - DeviceOnboardingStreamRequest, - DeviceOnboardingStreamResponse, - ), - } - - -class DeviceOnboardingConfigServiceBase(ServiceBase): - async def get_one( - self, device_onboarding_config_request: "DeviceOnboardingConfigRequest" - ) -> "DeviceOnboardingConfigResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def get_all( - self, - device_onboarding_config_stream_request: "DeviceOnboardingConfigStreamRequest", - ) -> AsyncIterator["DeviceOnboardingConfigStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def subscribe( - self, - device_onboarding_config_stream_request: "DeviceOnboardingConfigStreamRequest", - ) -> AsyncIterator["DeviceOnboardingConfigStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def set( - self, device_onboarding_config_set_request: "DeviceOnboardingConfigSetRequest" - ) -> "DeviceOnboardingConfigSetResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def delete( - self, - device_onboarding_config_delete_request: "DeviceOnboardingConfigDeleteRequest", - ) -> "DeviceOnboardingConfigDeleteResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def delete_all( - self, - device_onboarding_config_delete_all_request: "DeviceOnboardingConfigDeleteAllRequest", - ) -> AsyncIterator["DeviceOnboardingConfigDeleteAllResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def __rpc_get_one( - self, - stream: "grpclib.server.Stream[DeviceOnboardingConfigRequest, DeviceOnboardingConfigResponse]", - ) -> None: - request = await stream.recv_message() - response = await self.get_one(request) - await stream.send_message(response) - - async def __rpc_get_all( - self, - stream: "grpclib.server.Stream[DeviceOnboardingConfigStreamRequest, DeviceOnboardingConfigStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.get_all, - stream, - request, - ) - - async def __rpc_subscribe( - self, - stream: "grpclib.server.Stream[DeviceOnboardingConfigStreamRequest, DeviceOnboardingConfigStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.subscribe, - stream, - request, - ) - - async def __rpc_set( - self, - stream: "grpclib.server.Stream[DeviceOnboardingConfigSetRequest, DeviceOnboardingConfigSetResponse]", - ) -> None: - request = await stream.recv_message() - response = await self.set(request) - await stream.send_message(response) - - async def __rpc_delete( - self, - stream: "grpclib.server.Stream[DeviceOnboardingConfigDeleteRequest, DeviceOnboardingConfigDeleteResponse]", - ) -> None: - request = await stream.recv_message() - response = await self.delete(request) - await stream.send_message(response) - - async def __rpc_delete_all( - self, - stream: "grpclib.server.Stream[DeviceOnboardingConfigDeleteAllRequest, DeviceOnboardingConfigDeleteAllResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.delete_all, - stream, - request, - ) - - def __mapping__(self) -> Dict[str, grpclib.const.Handler]: - return { - "/arista.inventory.v1.DeviceOnboardingConfigService/GetOne": grpclib.const.Handler( - self.__rpc_get_one, - grpclib.const.Cardinality.UNARY_UNARY, - DeviceOnboardingConfigRequest, - DeviceOnboardingConfigResponse, - ), - "/arista.inventory.v1.DeviceOnboardingConfigService/GetAll": grpclib.const.Handler( - self.__rpc_get_all, - grpclib.const.Cardinality.UNARY_STREAM, - DeviceOnboardingConfigStreamRequest, - DeviceOnboardingConfigStreamResponse, - ), - "/arista.inventory.v1.DeviceOnboardingConfigService/Subscribe": grpclib.const.Handler( - self.__rpc_subscribe, - grpclib.const.Cardinality.UNARY_STREAM, - DeviceOnboardingConfigStreamRequest, - DeviceOnboardingConfigStreamResponse, - ), - "/arista.inventory.v1.DeviceOnboardingConfigService/Set": grpclib.const.Handler( - self.__rpc_set, - grpclib.const.Cardinality.UNARY_UNARY, - DeviceOnboardingConfigSetRequest, - DeviceOnboardingConfigSetResponse, - ), - "/arista.inventory.v1.DeviceOnboardingConfigService/Delete": grpclib.const.Handler( - self.__rpc_delete, - grpclib.const.Cardinality.UNARY_UNARY, - DeviceOnboardingConfigDeleteRequest, - DeviceOnboardingConfigDeleteResponse, - ), - "/arista.inventory.v1.DeviceOnboardingConfigService/DeleteAll": grpclib.const.Handler( - self.__rpc_delete_all, - grpclib.const.Cardinality.UNARY_STREAM, - DeviceOnboardingConfigDeleteAllRequest, - DeviceOnboardingConfigDeleteAllResponse, - ), - } - - -class ProvisionedDeviceServiceBase(ServiceBase): - async def get_one( - self, provisioned_device_request: "ProvisionedDeviceRequest" - ) -> "ProvisionedDeviceResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def get_all( - self, provisioned_device_stream_request: "ProvisionedDeviceStreamRequest" - ) -> AsyncIterator["ProvisionedDeviceStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def subscribe( - self, provisioned_device_stream_request: "ProvisionedDeviceStreamRequest" - ) -> AsyncIterator["ProvisionedDeviceStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def __rpc_get_one( - self, - stream: "grpclib.server.Stream[ProvisionedDeviceRequest, ProvisionedDeviceResponse]", - ) -> None: - request = await stream.recv_message() - response = await self.get_one(request) - await stream.send_message(response) - - async def __rpc_get_all( - self, - stream: "grpclib.server.Stream[ProvisionedDeviceStreamRequest, ProvisionedDeviceStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.get_all, - stream, - request, - ) - - async def __rpc_subscribe( - self, - stream: "grpclib.server.Stream[ProvisionedDeviceStreamRequest, ProvisionedDeviceStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.subscribe, - stream, - request, - ) - - def __mapping__(self) -> Dict[str, grpclib.const.Handler]: - return { - "/arista.inventory.v1.ProvisionedDeviceService/GetOne": grpclib.const.Handler( - self.__rpc_get_one, - grpclib.const.Cardinality.UNARY_UNARY, - ProvisionedDeviceRequest, - ProvisionedDeviceResponse, - ), - "/arista.inventory.v1.ProvisionedDeviceService/GetAll": grpclib.const.Handler( - self.__rpc_get_all, - grpclib.const.Cardinality.UNARY_STREAM, - ProvisionedDeviceStreamRequest, - ProvisionedDeviceStreamResponse, - ), - "/arista.inventory.v1.ProvisionedDeviceService/Subscribe": grpclib.const.Handler( - self.__rpc_subscribe, - grpclib.const.Cardinality.UNARY_STREAM, - ProvisionedDeviceStreamRequest, - ProvisionedDeviceStreamResponse, - ), - } diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/lifecycle/__init__.py b/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/lifecycle/__init__.py deleted file mode 100644 index e772bee41fe..00000000000 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/lifecycle/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/redirector/__init__.py b/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/redirector/__init__.py deleted file mode 100644 index e772bee41fe..00000000000 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/redirector/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/redirector/v1/__init__.py b/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/redirector/v1/__init__.py deleted file mode 100644 index 79c38050d1b..00000000000 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/redirector/v1/__init__.py +++ /dev/null @@ -1,284 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -# Generated by the protocol buffer compiler. DO NOT EDIT! -# sources: arista/redirector.v1/redirector.proto, arista/redirector.v1/services.gen.proto -# plugin: python-aristaproto -# This file has been @generated - -from dataclasses import dataclass -from datetime import datetime -from typing import ( - TYPE_CHECKING, - AsyncIterator, - Dict, - List, - Optional, -) - -try: - import aristaproto - import grpclib - from aristaproto.grpc.grpclib_server import ServiceBase -except ImportError: - HAS_ARISTAPROTO = False - from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_aristaproto as aristaproto - from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_grpclib as grpclib - ServiceBase = object -else: - HAS_ARISTAPROTO = True - -from .... import fmp as ___fmp__ -from ... import ( - subscriptions as __subscriptions__, - time as __time__, -) - - -if TYPE_CHECKING: - import grpclib.server - from aristaproto.grpc.grpclib_client import MetadataLike - from grpclib.metadata import Deadline - - -@dataclass(eq=False, repr=False) -class AssignmentKey(aristaproto.Message): - """AssignmentKey allows to uniquely identify an assignment.""" - - system_id: Optional[str] = aristaproto.message_field( - 1, wraps=aristaproto.TYPE_STRING - ) - """system_id is the unique identifier of a device.""" - - -@dataclass(eq=False, repr=False) -class Assignment(aristaproto.Message): - """ - Assignment returns the information about the regional clusters that the - system is assigned to. Each cluster consists of a series of hosts, each of - which the client can use to connect. - """ - - key: "AssignmentKey" = aristaproto.message_field(1) - """key uniquely identifies the assignment of system_id to the cluster.""" - - clusters: "Clusters" = aristaproto.message_field(2) - """clusters that the system is assigned to.""" - - -@dataclass(eq=False, repr=False) -class Clusters(aristaproto.Message): - """ - Clusters wraps a cluster list which contain the information about the hosts. - """ - - values: List["Cluster"] = aristaproto.message_field(2) - """values contains the list of clusters associated with the region""" - - -@dataclass(eq=False, repr=False) -class Cluster(aristaproto.Message): - name: Optional[str] = aristaproto.message_field(1, wraps=aristaproto.TYPE_STRING) - """ - name of the cluster. The name can change over time as new clusters - are added or removed. - """ - - hosts: "___fmp__.RepeatedString" = aristaproto.message_field(2) - """hosts in the cluster that the devices can connect to.""" - - -@dataclass(eq=False, repr=False) -class AssignmentRequest(aristaproto.Message): - key: "AssignmentKey" = aristaproto.message_field(1) - """ - Key uniquely identifies a Assignment instance to retrieve. - This value must be populated. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the time for which you are interested in the data. - If no time is given, the server will use the time at which it makes the request. - """ - - -@dataclass(eq=False, repr=False) -class AssignmentResponse(aristaproto.Message): - value: "Assignment" = aristaproto.message_field(1) - """ - Value is the value requested. - This structure will be fully-populated as it exists in the datastore. If - optional fields were not given at creation, these fields will be empty or - set to default values. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time carries the (UTC) timestamp of the last-modification of the - Assignment instance in this response. - """ - - -@dataclass(eq=False, repr=False) -class AssignmentStreamRequest(aristaproto.Message): - partial_eq_filter: List["Assignment"] = aristaproto.message_field(1) - """ - PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. - This requires all provided fields to be equal to the response. - - While transparent to users, this field also allows services to optimize internal - subscriptions if filter(s) are sufficiently specific. - """ - - time: "__time__.TimeBounds" = aristaproto.message_field(3) - """ - TimeRange allows limiting response data to within a specified time window. - If this field is populated, at least one of the two time fields are required. - - This field is not allowed in the Subscribe RPC. - """ - - -@dataclass(eq=False, repr=False) -class AssignmentStreamResponse(aristaproto.Message): - value: "Assignment" = aristaproto.message_field(1) - """ - Value is a value deemed relevant to the initiating request. - This structure will always have its key-field populated. Which other fields are - populated, and why, depends on the value of Operation and what triggered this notification. - """ - - time: datetime = aristaproto.message_field(2) - """Time holds the timestamp of this Assignment's last modification.""" - - type: "__subscriptions__.Operation" = aristaproto.enum_field(3) - """ - Operation indicates how the Assignment value in this response should be considered. - Under non-subscribe requests, this value should always be INITIAL. In a subscription, - once all initial data is streamed and the client begins to receive modification updates, - you should not see INITIAL again. - """ - - -class AssignmentServiceStub(aristaproto.ServiceStub): - async def get_one( - self, - assignment_request: "AssignmentRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> "AssignmentResponse": - return await self._unary_unary( - "/arista.redirector.v1.AssignmentService/GetOne", - assignment_request, - AssignmentResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ) - - async def get_all( - self, - assignment_stream_request: "AssignmentStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["AssignmentStreamResponse"]: - async for response in self._unary_stream( - "/arista.redirector.v1.AssignmentService/GetAll", - assignment_stream_request, - AssignmentStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - async def subscribe( - self, - assignment_stream_request: "AssignmentStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["AssignmentStreamResponse"]: - async for response in self._unary_stream( - "/arista.redirector.v1.AssignmentService/Subscribe", - assignment_stream_request, - AssignmentStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - -class AssignmentServiceBase(ServiceBase): - async def get_one( - self, assignment_request: "AssignmentRequest" - ) -> "AssignmentResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def get_all( - self, assignment_stream_request: "AssignmentStreamRequest" - ) -> AsyncIterator["AssignmentStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def subscribe( - self, assignment_stream_request: "AssignmentStreamRequest" - ) -> AsyncIterator["AssignmentStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def __rpc_get_one( - self, stream: "grpclib.server.Stream[AssignmentRequest, AssignmentResponse]" - ) -> None: - request = await stream.recv_message() - response = await self.get_one(request) - await stream.send_message(response) - - async def __rpc_get_all( - self, - stream: "grpclib.server.Stream[AssignmentStreamRequest, AssignmentStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.get_all, - stream, - request, - ) - - async def __rpc_subscribe( - self, - stream: "grpclib.server.Stream[AssignmentStreamRequest, AssignmentStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.subscribe, - stream, - request, - ) - - def __mapping__(self) -> Dict[str, grpclib.const.Handler]: - return { - "/arista.redirector.v1.AssignmentService/GetOne": grpclib.const.Handler( - self.__rpc_get_one, - grpclib.const.Cardinality.UNARY_UNARY, - AssignmentRequest, - AssignmentResponse, - ), - "/arista.redirector.v1.AssignmentService/GetAll": grpclib.const.Handler( - self.__rpc_get_all, - grpclib.const.Cardinality.UNARY_STREAM, - AssignmentStreamRequest, - AssignmentStreamResponse, - ), - "/arista.redirector.v1.AssignmentService/Subscribe": grpclib.const.Handler( - self.__rpc_subscribe, - grpclib.const.Cardinality.UNARY_STREAM, - AssignmentStreamRequest, - AssignmentStreamResponse, - ), - } diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/studio/__init__.py b/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/studio/__init__.py deleted file mode 100644 index e772bee41fe..00000000000 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/studio/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/tag/__init__.py b/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/tag/__init__.py deleted file mode 100644 index e772bee41fe..00000000000 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/tag/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/tag/v1/__init__.py b/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/tag/v1/__init__.py deleted file mode 100644 index baf5dd9b3ef..00000000000 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/tag/v1/__init__.py +++ /dev/null @@ -1,2124 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -# Generated by the protocol buffer compiler. DO NOT EDIT! -# sources: arista/tag.v1/services.gen.proto, arista/tag.v1/tag.proto -# plugin: python-aristaproto -# This file has been @generated - -from dataclasses import dataclass -from datetime import datetime -from typing import ( - TYPE_CHECKING, - AsyncIterator, - Dict, - List, - Optional, -) - -try: - import aristaproto - import grpclib - from aristaproto.grpc.grpclib_server import ServiceBase -except ImportError: - HAS_ARISTAPROTO = False - from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_aristaproto as aristaproto - from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_grpclib as grpclib - ServiceBase = object -else: - HAS_ARISTAPROTO = True - -from .... import fmp as ___fmp__ -from ... import ( - subscriptions as __subscriptions__, - time as __time__, -) - - -if TYPE_CHECKING: - import grpclib.server - from aristaproto.grpc.grpclib_client import MetadataLike - from grpclib.metadata import Deadline - - -class CreatorType(aristaproto.Enum): - """CreatorType specifies an entity that creates something.""" - - UNSPECIFIED = 0 - SYSTEM = 1 - """CREATOR_TYPE_SYSTEM is the type for something created by the system.""" - - USER = 2 - """CREATOR_TYPE_USER is the type for something created by a user.""" - - -@dataclass(eq=False, repr=False) -class TagKey(aristaproto.Message): - """TagKey uniquely identifies a tag for a network element.""" - - label: Optional[str] = aristaproto.message_field(1, wraps=aristaproto.TYPE_STRING) - """Label is the label of the tag.""" - - value: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) - """Value is the value of the tag.""" - - -@dataclass(eq=False, repr=False) -class InterfaceTagConfig(aristaproto.Message): - """ - InterfaceTagConfig is a label-value pair that may or may - not be assigned to an interface. - """ - - key: "TagKey" = aristaproto.message_field(1) - """Key uniquely identifies the interface tag.""" - - -@dataclass(eq=False, repr=False) -class InterfaceTag(aristaproto.Message): - """ - InterfaceTag is a label-value pair that may or may - not be assigned to an interface. - """ - - key: "TagKey" = aristaproto.message_field(1) - """Key uniquely identifies the interface tag.""" - - creator_type: "CreatorType" = aristaproto.enum_field(2) - """CreatorType is the creator type of the tag.""" - - -@dataclass(eq=False, repr=False) -class InterfaceTagAssignmentKey(aristaproto.Message): - """ - InterfaceTagAssignmentKey uniquely identifies an interface - tag assignment. - """ - - label: Optional[str] = aristaproto.message_field(1, wraps=aristaproto.TYPE_STRING) - """Label is the label of the tag.""" - - value: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) - """Value is the value of the tag.""" - - device_id: Optional[str] = aristaproto.message_field( - 3, wraps=aristaproto.TYPE_STRING - ) - """DeviceId is the ID of the interface's device.""" - - interface_id: Optional[str] = aristaproto.message_field( - 4, wraps=aristaproto.TYPE_STRING - ) - """InterfaceId is the ID of the interface.""" - - -@dataclass(eq=False, repr=False) -class InterfaceTagAssignmentConfig(aristaproto.Message): - """ - InterfaceTagAssignmentConfig is the assignment of an interface tag - to a specific interface. - """ - - key: "InterfaceTagAssignmentKey" = aristaproto.message_field(1) - """Key uniquely identifies the interface tag assignment.""" - - -@dataclass(eq=False, repr=False) -class DeviceTagConfig(aristaproto.Message): - """ - DeviceTagConfig is a label-value pair that may or may not - be assigned to a device. - """ - - key: "TagKey" = aristaproto.message_field(1) - """Key uniquely identifies the device tag.""" - - -@dataclass(eq=False, repr=False) -class DeviceTag(aristaproto.Message): - """ - DeviceTag is a label-value pair that may or may not - be assigned to a device. - """ - - key: "TagKey" = aristaproto.message_field(1) - """Key uniquely identifies the device tag.""" - - creator_type: "CreatorType" = aristaproto.enum_field(2) - """CreatorType is the creator type of the tag.""" - - -@dataclass(eq=False, repr=False) -class DeviceTagAssignmentKey(aristaproto.Message): - """ - DeviceTagAssignmentKey uniquely identifies a device tag - assignment. - """ - - label: Optional[str] = aristaproto.message_field(1, wraps=aristaproto.TYPE_STRING) - """Label is the label of the tag.""" - - value: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) - """Value is the value of the tag.""" - - device_id: Optional[str] = aristaproto.message_field( - 3, wraps=aristaproto.TYPE_STRING - ) - """DeviceId is the ID of the device.""" - - -@dataclass(eq=False, repr=False) -class DeviceTagAssignmentConfig(aristaproto.Message): - """ - DeviceTagAssignmentConfig is the assignment of a device tag to a - specific device. - """ - - key: "DeviceTagAssignmentKey" = aristaproto.message_field(1) - """Key uniquely identifies the device tag assignment.""" - - -@dataclass(eq=False, repr=False) -class DeviceTagRequest(aristaproto.Message): - key: "TagKey" = aristaproto.message_field(1) - """ - Key uniquely identifies a DeviceTag instance to retrieve. - This value must be populated. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the time for which you are interested in the data. - If no time is given, the server will use the time at which it makes the request. - """ - - -@dataclass(eq=False, repr=False) -class DeviceTagResponse(aristaproto.Message): - value: "DeviceTag" = aristaproto.message_field(1) - """ - Value is the value requested. - This structure will be fully-populated as it exists in the datastore. If - optional fields were not given at creation, these fields will be empty or - set to default values. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time carries the (UTC) timestamp of the last-modification of the - DeviceTag instance in this response. - """ - - -@dataclass(eq=False, repr=False) -class DeviceTagStreamRequest(aristaproto.Message): - partial_eq_filter: List["DeviceTag"] = aristaproto.message_field(1) - """ - PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. - This requires all provided fields to be equal to the response. - - While transparent to users, this field also allows services to optimize internal - subscriptions if filter(s) are sufficiently specific. - """ - - time: "__time__.TimeBounds" = aristaproto.message_field(3) - """ - TimeRange allows limiting response data to within a specified time window. - If this field is populated, at least one of the two time fields are required. - - This field is not allowed in the Subscribe RPC. - """ - - -@dataclass(eq=False, repr=False) -class DeviceTagStreamResponse(aristaproto.Message): - value: "DeviceTag" = aristaproto.message_field(1) - """ - Value is a value deemed relevant to the initiating request. - This structure will always have its key-field populated. Which other fields are - populated, and why, depends on the value of Operation and what triggered this notification. - """ - - time: datetime = aristaproto.message_field(2) - """Time holds the timestamp of this DeviceTag's last modification.""" - - type: "__subscriptions__.Operation" = aristaproto.enum_field(3) - """ - Operation indicates how the DeviceTag value in this response should be considered. - Under non-subscribe requests, this value should always be INITIAL. In a subscription, - once all initial data is streamed and the client begins to receive modification updates, - you should not see INITIAL again. - """ - - -@dataclass(eq=False, repr=False) -class DeviceTagAssignmentConfigRequest(aristaproto.Message): - key: "DeviceTagAssignmentKey" = aristaproto.message_field(1) - """ - Key uniquely identifies a DeviceTagAssignmentConfig instance to retrieve. - This value must be populated. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the time for which you are interested in the data. - If no time is given, the server will use the time at which it makes the request. - """ - - -@dataclass(eq=False, repr=False) -class DeviceTagAssignmentConfigResponse(aristaproto.Message): - value: "DeviceTagAssignmentConfig" = aristaproto.message_field(1) - """ - Value is the value requested. - This structure will be fully-populated as it exists in the datastore. If - optional fields were not given at creation, these fields will be empty or - set to default values. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time carries the (UTC) timestamp of the last-modification of the - DeviceTagAssignmentConfig instance in this response. - """ - - -@dataclass(eq=False, repr=False) -class DeviceTagAssignmentConfigStreamRequest(aristaproto.Message): - partial_eq_filter: List["DeviceTagAssignmentConfig"] = aristaproto.message_field(1) - """ - PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. - This requires all provided fields to be equal to the response. - - While transparent to users, this field also allows services to optimize internal - subscriptions if filter(s) are sufficiently specific. - """ - - time: "__time__.TimeBounds" = aristaproto.message_field(3) - """ - TimeRange allows limiting response data to within a specified time window. - If this field is populated, at least one of the two time fields are required. - - This field is not allowed in the Subscribe RPC. - """ - - -@dataclass(eq=False, repr=False) -class DeviceTagAssignmentConfigStreamResponse(aristaproto.Message): - value: "DeviceTagAssignmentConfig" = aristaproto.message_field(1) - """ - Value is a value deemed relevant to the initiating request. - This structure will always have its key-field populated. Which other fields are - populated, and why, depends on the value of Operation and what triggered this notification. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time holds the timestamp of this DeviceTagAssignmentConfig's last modification. - """ - - type: "__subscriptions__.Operation" = aristaproto.enum_field(3) - """ - Operation indicates how the DeviceTagAssignmentConfig value in this response should be considered. - Under non-subscribe requests, this value should always be INITIAL. In a subscription, - once all initial data is streamed and the client begins to receive modification updates, - you should not see INITIAL again. - """ - - -@dataclass(eq=False, repr=False) -class DeviceTagAssignmentConfigSetRequest(aristaproto.Message): - value: "DeviceTagAssignmentConfig" = aristaproto.message_field(1) - """ - DeviceTagAssignmentConfig carries the value to set into the datastore. - See the documentation on the DeviceTagAssignmentConfig struct for which fields are required. - """ - - -@dataclass(eq=False, repr=False) -class DeviceTagAssignmentConfigSetResponse(aristaproto.Message): - value: "DeviceTagAssignmentConfig" = aristaproto.message_field(1) - """ - Value carries all the values given in the DeviceTagAssignmentConfigSetRequest as well - as any server-generated values. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the (UTC) timestamp at which the system recognizes the - creation. The only guarantees made about this timestamp are: - - - it is after the time the request was received - - a time-ranged query with StartTime==CreatedAt will include this instance. - """ - - -@dataclass(eq=False, repr=False) -class DeviceTagAssignmentConfigDeleteRequest(aristaproto.Message): - key: "DeviceTagAssignmentKey" = aristaproto.message_field(1) - """ - Key indicates which DeviceTagAssignmentConfig instance to remove. - This field must always be set. - """ - - -@dataclass(eq=False, repr=False) -class DeviceTagAssignmentConfigDeleteResponse(aristaproto.Message): - key: "DeviceTagAssignmentKey" = aristaproto.message_field(1) - """ - Key echoes back the key of the deleted DeviceTagAssignmentConfig instance. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the (UTC) timestamp at which the system recognizes the - deletion. The only guarantees made about this timestamp are: - - - it is after the time the request was received - - a time-ranged query with StartTime==DeletedAt will not include this instance. - """ - - -@dataclass(eq=False, repr=False) -class DeviceTagAssignmentConfigDeleteAllRequest(aristaproto.Message): - pass - - -@dataclass(eq=False, repr=False) -class DeviceTagAssignmentConfigDeleteAllResponse(aristaproto.Message): - type: "___fmp__.DeleteError" = aristaproto.enum_field(1) - """This describes the class of delete error.""" - - error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) - """This indicates the error message from the delete failure.""" - - key: "DeviceTagAssignmentKey" = aristaproto.message_field(3) - """ - This is the key of the DeviceTagAssignmentConfig instance that failed to be deleted. - """ - - time: datetime = aristaproto.message_field(4) - """Time indicates the (UTC) timestamp when the key was being deleted.""" - - -@dataclass(eq=False, repr=False) -class DeviceTagConfigRequest(aristaproto.Message): - key: "TagKey" = aristaproto.message_field(1) - """ - Key uniquely identifies a DeviceTagConfig instance to retrieve. - This value must be populated. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the time for which you are interested in the data. - If no time is given, the server will use the time at which it makes the request. - """ - - -@dataclass(eq=False, repr=False) -class DeviceTagConfigResponse(aristaproto.Message): - value: "DeviceTagConfig" = aristaproto.message_field(1) - """ - Value is the value requested. - This structure will be fully-populated as it exists in the datastore. If - optional fields were not given at creation, these fields will be empty or - set to default values. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time carries the (UTC) timestamp of the last-modification of the - DeviceTagConfig instance in this response. - """ - - -@dataclass(eq=False, repr=False) -class DeviceTagConfigStreamRequest(aristaproto.Message): - partial_eq_filter: List["DeviceTagConfig"] = aristaproto.message_field(1) - """ - PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. - This requires all provided fields to be equal to the response. - - While transparent to users, this field also allows services to optimize internal - subscriptions if filter(s) are sufficiently specific. - """ - - time: "__time__.TimeBounds" = aristaproto.message_field(3) - """ - TimeRange allows limiting response data to within a specified time window. - If this field is populated, at least one of the two time fields are required. - - This field is not allowed in the Subscribe RPC. - """ - - -@dataclass(eq=False, repr=False) -class DeviceTagConfigStreamResponse(aristaproto.Message): - value: "DeviceTagConfig" = aristaproto.message_field(1) - """ - Value is a value deemed relevant to the initiating request. - This structure will always have its key-field populated. Which other fields are - populated, and why, depends on the value of Operation and what triggered this notification. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time holds the timestamp of this DeviceTagConfig's last modification. - """ - - type: "__subscriptions__.Operation" = aristaproto.enum_field(3) - """ - Operation indicates how the DeviceTagConfig value in this response should be considered. - Under non-subscribe requests, this value should always be INITIAL. In a subscription, - once all initial data is streamed and the client begins to receive modification updates, - you should not see INITIAL again. - """ - - -@dataclass(eq=False, repr=False) -class DeviceTagConfigSetRequest(aristaproto.Message): - value: "DeviceTagConfig" = aristaproto.message_field(1) - """ - DeviceTagConfig carries the value to set into the datastore. - See the documentation on the DeviceTagConfig struct for which fields are required. - """ - - -@dataclass(eq=False, repr=False) -class DeviceTagConfigSetResponse(aristaproto.Message): - value: "DeviceTagConfig" = aristaproto.message_field(1) - """ - Value carries all the values given in the DeviceTagConfigSetRequest as well - as any server-generated values. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the (UTC) timestamp at which the system recognizes the - creation. The only guarantees made about this timestamp are: - - - it is after the time the request was received - - a time-ranged query with StartTime==CreatedAt will include this instance. - """ - - -@dataclass(eq=False, repr=False) -class DeviceTagConfigDeleteRequest(aristaproto.Message): - key: "TagKey" = aristaproto.message_field(1) - """ - Key indicates which DeviceTagConfig instance to remove. - This field must always be set. - """ - - -@dataclass(eq=False, repr=False) -class DeviceTagConfigDeleteResponse(aristaproto.Message): - key: "TagKey" = aristaproto.message_field(1) - """Key echoes back the key of the deleted DeviceTagConfig instance.""" - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the (UTC) timestamp at which the system recognizes the - deletion. The only guarantees made about this timestamp are: - - - it is after the time the request was received - - a time-ranged query with StartTime==DeletedAt will not include this instance. - """ - - -@dataclass(eq=False, repr=False) -class DeviceTagConfigDeleteAllRequest(aristaproto.Message): - pass - - -@dataclass(eq=False, repr=False) -class DeviceTagConfigDeleteAllResponse(aristaproto.Message): - type: "___fmp__.DeleteError" = aristaproto.enum_field(1) - """This describes the class of delete error.""" - - error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) - """This indicates the error message from the delete failure.""" - - key: "TagKey" = aristaproto.message_field(3) - """ - This is the key of the DeviceTagConfig instance that failed to be deleted. - """ - - time: datetime = aristaproto.message_field(4) - """Time indicates the (UTC) timestamp when the key was being deleted.""" - - -@dataclass(eq=False, repr=False) -class InterfaceTagRequest(aristaproto.Message): - key: "TagKey" = aristaproto.message_field(1) - """ - Key uniquely identifies a InterfaceTag instance to retrieve. - This value must be populated. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the time for which you are interested in the data. - If no time is given, the server will use the time at which it makes the request. - """ - - -@dataclass(eq=False, repr=False) -class InterfaceTagResponse(aristaproto.Message): - value: "InterfaceTag" = aristaproto.message_field(1) - """ - Value is the value requested. - This structure will be fully-populated as it exists in the datastore. If - optional fields were not given at creation, these fields will be empty or - set to default values. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time carries the (UTC) timestamp of the last-modification of the - InterfaceTag instance in this response. - """ - - -@dataclass(eq=False, repr=False) -class InterfaceTagStreamRequest(aristaproto.Message): - partial_eq_filter: List["InterfaceTag"] = aristaproto.message_field(1) - """ - PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. - This requires all provided fields to be equal to the response. - - While transparent to users, this field also allows services to optimize internal - subscriptions if filter(s) are sufficiently specific. - """ - - time: "__time__.TimeBounds" = aristaproto.message_field(3) - """ - TimeRange allows limiting response data to within a specified time window. - If this field is populated, at least one of the two time fields are required. - - This field is not allowed in the Subscribe RPC. - """ - - -@dataclass(eq=False, repr=False) -class InterfaceTagStreamResponse(aristaproto.Message): - value: "InterfaceTag" = aristaproto.message_field(1) - """ - Value is a value deemed relevant to the initiating request. - This structure will always have its key-field populated. Which other fields are - populated, and why, depends on the value of Operation and what triggered this notification. - """ - - time: datetime = aristaproto.message_field(2) - """Time holds the timestamp of this InterfaceTag's last modification.""" - - type: "__subscriptions__.Operation" = aristaproto.enum_field(3) - """ - Operation indicates how the InterfaceTag value in this response should be considered. - Under non-subscribe requests, this value should always be INITIAL. In a subscription, - once all initial data is streamed and the client begins to receive modification updates, - you should not see INITIAL again. - """ - - -@dataclass(eq=False, repr=False) -class InterfaceTagAssignmentConfigRequest(aristaproto.Message): - key: "InterfaceTagAssignmentKey" = aristaproto.message_field(1) - """ - Key uniquely identifies a InterfaceTagAssignmentConfig instance to retrieve. - This value must be populated. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the time for which you are interested in the data. - If no time is given, the server will use the time at which it makes the request. - """ - - -@dataclass(eq=False, repr=False) -class InterfaceTagAssignmentConfigResponse(aristaproto.Message): - value: "InterfaceTagAssignmentConfig" = aristaproto.message_field(1) - """ - Value is the value requested. - This structure will be fully-populated as it exists in the datastore. If - optional fields were not given at creation, these fields will be empty or - set to default values. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time carries the (UTC) timestamp of the last-modification of the - InterfaceTagAssignmentConfig instance in this response. - """ - - -@dataclass(eq=False, repr=False) -class InterfaceTagAssignmentConfigStreamRequest(aristaproto.Message): - partial_eq_filter: List["InterfaceTagAssignmentConfig"] = aristaproto.message_field( - 1 - ) - """ - PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. - This requires all provided fields to be equal to the response. - - While transparent to users, this field also allows services to optimize internal - subscriptions if filter(s) are sufficiently specific. - """ - - time: "__time__.TimeBounds" = aristaproto.message_field(3) - """ - TimeRange allows limiting response data to within a specified time window. - If this field is populated, at least one of the two time fields are required. - - This field is not allowed in the Subscribe RPC. - """ - - -@dataclass(eq=False, repr=False) -class InterfaceTagAssignmentConfigStreamResponse(aristaproto.Message): - value: "InterfaceTagAssignmentConfig" = aristaproto.message_field(1) - """ - Value is a value deemed relevant to the initiating request. - This structure will always have its key-field populated. Which other fields are - populated, and why, depends on the value of Operation and what triggered this notification. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time holds the timestamp of this InterfaceTagAssignmentConfig's last modification. - """ - - type: "__subscriptions__.Operation" = aristaproto.enum_field(3) - """ - Operation indicates how the InterfaceTagAssignmentConfig value in this response should be considered. - Under non-subscribe requests, this value should always be INITIAL. In a subscription, - once all initial data is streamed and the client begins to receive modification updates, - you should not see INITIAL again. - """ - - -@dataclass(eq=False, repr=False) -class InterfaceTagAssignmentConfigSetRequest(aristaproto.Message): - value: "InterfaceTagAssignmentConfig" = aristaproto.message_field(1) - """ - InterfaceTagAssignmentConfig carries the value to set into the datastore. - See the documentation on the InterfaceTagAssignmentConfig struct for which fields are required. - """ - - -@dataclass(eq=False, repr=False) -class InterfaceTagAssignmentConfigSetResponse(aristaproto.Message): - value: "InterfaceTagAssignmentConfig" = aristaproto.message_field(1) - """ - Value carries all the values given in the InterfaceTagAssignmentConfigSetRequest as well - as any server-generated values. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the (UTC) timestamp at which the system recognizes the - creation. The only guarantees made about this timestamp are: - - - it is after the time the request was received - - a time-ranged query with StartTime==CreatedAt will include this instance. - """ - - -@dataclass(eq=False, repr=False) -class InterfaceTagAssignmentConfigDeleteRequest(aristaproto.Message): - key: "InterfaceTagAssignmentKey" = aristaproto.message_field(1) - """ - Key indicates which InterfaceTagAssignmentConfig instance to remove. - This field must always be set. - """ - - -@dataclass(eq=False, repr=False) -class InterfaceTagAssignmentConfigDeleteResponse(aristaproto.Message): - key: "InterfaceTagAssignmentKey" = aristaproto.message_field(1) - """ - Key echoes back the key of the deleted InterfaceTagAssignmentConfig instance. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the (UTC) timestamp at which the system recognizes the - deletion. The only guarantees made about this timestamp are: - - - it is after the time the request was received - - a time-ranged query with StartTime==DeletedAt will not include this instance. - """ - - -@dataclass(eq=False, repr=False) -class InterfaceTagAssignmentConfigDeleteAllRequest(aristaproto.Message): - pass - - -@dataclass(eq=False, repr=False) -class InterfaceTagAssignmentConfigDeleteAllResponse(aristaproto.Message): - type: "___fmp__.DeleteError" = aristaproto.enum_field(1) - """This describes the class of delete error.""" - - error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) - """This indicates the error message from the delete failure.""" - - key: "InterfaceTagAssignmentKey" = aristaproto.message_field(3) - """ - This is the key of the InterfaceTagAssignmentConfig instance that failed to be deleted. - """ - - time: datetime = aristaproto.message_field(4) - """Time indicates the (UTC) timestamp when the key was being deleted.""" - - -@dataclass(eq=False, repr=False) -class InterfaceTagConfigRequest(aristaproto.Message): - key: "TagKey" = aristaproto.message_field(1) - """ - Key uniquely identifies a InterfaceTagConfig instance to retrieve. - This value must be populated. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the time for which you are interested in the data. - If no time is given, the server will use the time at which it makes the request. - """ - - -@dataclass(eq=False, repr=False) -class InterfaceTagConfigResponse(aristaproto.Message): - value: "InterfaceTagConfig" = aristaproto.message_field(1) - """ - Value is the value requested. - This structure will be fully-populated as it exists in the datastore. If - optional fields were not given at creation, these fields will be empty or - set to default values. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time carries the (UTC) timestamp of the last-modification of the - InterfaceTagConfig instance in this response. - """ - - -@dataclass(eq=False, repr=False) -class InterfaceTagConfigStreamRequest(aristaproto.Message): - partial_eq_filter: List["InterfaceTagConfig"] = aristaproto.message_field(1) - """ - PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. - This requires all provided fields to be equal to the response. - - While transparent to users, this field also allows services to optimize internal - subscriptions if filter(s) are sufficiently specific. - """ - - time: "__time__.TimeBounds" = aristaproto.message_field(3) - """ - TimeRange allows limiting response data to within a specified time window. - If this field is populated, at least one of the two time fields are required. - - This field is not allowed in the Subscribe RPC. - """ - - -@dataclass(eq=False, repr=False) -class InterfaceTagConfigStreamResponse(aristaproto.Message): - value: "InterfaceTagConfig" = aristaproto.message_field(1) - """ - Value is a value deemed relevant to the initiating request. - This structure will always have its key-field populated. Which other fields are - populated, and why, depends on the value of Operation and what triggered this notification. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time holds the timestamp of this InterfaceTagConfig's last modification. - """ - - type: "__subscriptions__.Operation" = aristaproto.enum_field(3) - """ - Operation indicates how the InterfaceTagConfig value in this response should be considered. - Under non-subscribe requests, this value should always be INITIAL. In a subscription, - once all initial data is streamed and the client begins to receive modification updates, - you should not see INITIAL again. - """ - - -@dataclass(eq=False, repr=False) -class InterfaceTagConfigSetRequest(aristaproto.Message): - value: "InterfaceTagConfig" = aristaproto.message_field(1) - """ - InterfaceTagConfig carries the value to set into the datastore. - See the documentation on the InterfaceTagConfig struct for which fields are required. - """ - - -@dataclass(eq=False, repr=False) -class InterfaceTagConfigSetResponse(aristaproto.Message): - value: "InterfaceTagConfig" = aristaproto.message_field(1) - """ - Value carries all the values given in the InterfaceTagConfigSetRequest as well - as any server-generated values. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the (UTC) timestamp at which the system recognizes the - creation. The only guarantees made about this timestamp are: - - - it is after the time the request was received - - a time-ranged query with StartTime==CreatedAt will include this instance. - """ - - -@dataclass(eq=False, repr=False) -class InterfaceTagConfigDeleteRequest(aristaproto.Message): - key: "TagKey" = aristaproto.message_field(1) - """ - Key indicates which InterfaceTagConfig instance to remove. - This field must always be set. - """ - - -@dataclass(eq=False, repr=False) -class InterfaceTagConfigDeleteResponse(aristaproto.Message): - key: "TagKey" = aristaproto.message_field(1) - """Key echoes back the key of the deleted InterfaceTagConfig instance.""" - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the (UTC) timestamp at which the system recognizes the - deletion. The only guarantees made about this timestamp are: - - - it is after the time the request was received - - a time-ranged query with StartTime==DeletedAt will not include this instance. - """ - - -@dataclass(eq=False, repr=False) -class InterfaceTagConfigDeleteAllRequest(aristaproto.Message): - pass - - -@dataclass(eq=False, repr=False) -class InterfaceTagConfigDeleteAllResponse(aristaproto.Message): - type: "___fmp__.DeleteError" = aristaproto.enum_field(1) - """This describes the class of delete error.""" - - error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) - """This indicates the error message from the delete failure.""" - - key: "TagKey" = aristaproto.message_field(3) - """ - This is the key of the InterfaceTagConfig instance that failed to be deleted. - """ - - time: datetime = aristaproto.message_field(4) - """Time indicates the (UTC) timestamp when the key was being deleted.""" - - -class DeviceTagServiceStub(aristaproto.ServiceStub): - async def get_one( - self, - device_tag_request: "DeviceTagRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> "DeviceTagResponse": - return await self._unary_unary( - "/arista.tag.v1.DeviceTagService/GetOne", - device_tag_request, - DeviceTagResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ) - - async def get_all( - self, - device_tag_stream_request: "DeviceTagStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["DeviceTagStreamResponse"]: - async for response in self._unary_stream( - "/arista.tag.v1.DeviceTagService/GetAll", - device_tag_stream_request, - DeviceTagStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - async def subscribe( - self, - device_tag_stream_request: "DeviceTagStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["DeviceTagStreamResponse"]: - async for response in self._unary_stream( - "/arista.tag.v1.DeviceTagService/Subscribe", - device_tag_stream_request, - DeviceTagStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - -class DeviceTagAssignmentConfigServiceStub(aristaproto.ServiceStub): - async def get_one( - self, - device_tag_assignment_config_request: "DeviceTagAssignmentConfigRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> "DeviceTagAssignmentConfigResponse": - return await self._unary_unary( - "/arista.tag.v1.DeviceTagAssignmentConfigService/GetOne", - device_tag_assignment_config_request, - DeviceTagAssignmentConfigResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ) - - async def get_all( - self, - device_tag_assignment_config_stream_request: "DeviceTagAssignmentConfigStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["DeviceTagAssignmentConfigStreamResponse"]: - async for response in self._unary_stream( - "/arista.tag.v1.DeviceTagAssignmentConfigService/GetAll", - device_tag_assignment_config_stream_request, - DeviceTagAssignmentConfigStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - async def subscribe( - self, - device_tag_assignment_config_stream_request: "DeviceTagAssignmentConfigStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["DeviceTagAssignmentConfigStreamResponse"]: - async for response in self._unary_stream( - "/arista.tag.v1.DeviceTagAssignmentConfigService/Subscribe", - device_tag_assignment_config_stream_request, - DeviceTagAssignmentConfigStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - async def set( - self, - device_tag_assignment_config_set_request: "DeviceTagAssignmentConfigSetRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> "DeviceTagAssignmentConfigSetResponse": - return await self._unary_unary( - "/arista.tag.v1.DeviceTagAssignmentConfigService/Set", - device_tag_assignment_config_set_request, - DeviceTagAssignmentConfigSetResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ) - - async def delete( - self, - device_tag_assignment_config_delete_request: "DeviceTagAssignmentConfigDeleteRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> "DeviceTagAssignmentConfigDeleteResponse": - return await self._unary_unary( - "/arista.tag.v1.DeviceTagAssignmentConfigService/Delete", - device_tag_assignment_config_delete_request, - DeviceTagAssignmentConfigDeleteResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ) - - async def delete_all( - self, - device_tag_assignment_config_delete_all_request: "DeviceTagAssignmentConfigDeleteAllRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["DeviceTagAssignmentConfigDeleteAllResponse"]: - async for response in self._unary_stream( - "/arista.tag.v1.DeviceTagAssignmentConfigService/DeleteAll", - device_tag_assignment_config_delete_all_request, - DeviceTagAssignmentConfigDeleteAllResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - -class DeviceTagConfigServiceStub(aristaproto.ServiceStub): - async def get_one( - self, - device_tag_config_request: "DeviceTagConfigRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> "DeviceTagConfigResponse": - return await self._unary_unary( - "/arista.tag.v1.DeviceTagConfigService/GetOne", - device_tag_config_request, - DeviceTagConfigResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ) - - async def get_all( - self, - device_tag_config_stream_request: "DeviceTagConfigStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["DeviceTagConfigStreamResponse"]: - async for response in self._unary_stream( - "/arista.tag.v1.DeviceTagConfigService/GetAll", - device_tag_config_stream_request, - DeviceTagConfigStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - async def subscribe( - self, - device_tag_config_stream_request: "DeviceTagConfigStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["DeviceTagConfigStreamResponse"]: - async for response in self._unary_stream( - "/arista.tag.v1.DeviceTagConfigService/Subscribe", - device_tag_config_stream_request, - DeviceTagConfigStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - async def set( - self, - device_tag_config_set_request: "DeviceTagConfigSetRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> "DeviceTagConfigSetResponse": - return await self._unary_unary( - "/arista.tag.v1.DeviceTagConfigService/Set", - device_tag_config_set_request, - DeviceTagConfigSetResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ) - - async def delete( - self, - device_tag_config_delete_request: "DeviceTagConfigDeleteRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> "DeviceTagConfigDeleteResponse": - return await self._unary_unary( - "/arista.tag.v1.DeviceTagConfigService/Delete", - device_tag_config_delete_request, - DeviceTagConfigDeleteResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ) - - async def delete_all( - self, - device_tag_config_delete_all_request: "DeviceTagConfigDeleteAllRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["DeviceTagConfigDeleteAllResponse"]: - async for response in self._unary_stream( - "/arista.tag.v1.DeviceTagConfigService/DeleteAll", - device_tag_config_delete_all_request, - DeviceTagConfigDeleteAllResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - -class InterfaceTagServiceStub(aristaproto.ServiceStub): - async def get_one( - self, - interface_tag_request: "InterfaceTagRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> "InterfaceTagResponse": - return await self._unary_unary( - "/arista.tag.v1.InterfaceTagService/GetOne", - interface_tag_request, - InterfaceTagResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ) - - async def get_all( - self, - interface_tag_stream_request: "InterfaceTagStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["InterfaceTagStreamResponse"]: - async for response in self._unary_stream( - "/arista.tag.v1.InterfaceTagService/GetAll", - interface_tag_stream_request, - InterfaceTagStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - async def subscribe( - self, - interface_tag_stream_request: "InterfaceTagStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["InterfaceTagStreamResponse"]: - async for response in self._unary_stream( - "/arista.tag.v1.InterfaceTagService/Subscribe", - interface_tag_stream_request, - InterfaceTagStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - -class InterfaceTagAssignmentConfigServiceStub(aristaproto.ServiceStub): - async def get_one( - self, - interface_tag_assignment_config_request: "InterfaceTagAssignmentConfigRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> "InterfaceTagAssignmentConfigResponse": - return await self._unary_unary( - "/arista.tag.v1.InterfaceTagAssignmentConfigService/GetOne", - interface_tag_assignment_config_request, - InterfaceTagAssignmentConfigResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ) - - async def get_all( - self, - interface_tag_assignment_config_stream_request: "InterfaceTagAssignmentConfigStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["InterfaceTagAssignmentConfigStreamResponse"]: - async for response in self._unary_stream( - "/arista.tag.v1.InterfaceTagAssignmentConfigService/GetAll", - interface_tag_assignment_config_stream_request, - InterfaceTagAssignmentConfigStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - async def subscribe( - self, - interface_tag_assignment_config_stream_request: "InterfaceTagAssignmentConfigStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["InterfaceTagAssignmentConfigStreamResponse"]: - async for response in self._unary_stream( - "/arista.tag.v1.InterfaceTagAssignmentConfigService/Subscribe", - interface_tag_assignment_config_stream_request, - InterfaceTagAssignmentConfigStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - async def set( - self, - interface_tag_assignment_config_set_request: "InterfaceTagAssignmentConfigSetRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> "InterfaceTagAssignmentConfigSetResponse": - return await self._unary_unary( - "/arista.tag.v1.InterfaceTagAssignmentConfigService/Set", - interface_tag_assignment_config_set_request, - InterfaceTagAssignmentConfigSetResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ) - - async def delete( - self, - interface_tag_assignment_config_delete_request: "InterfaceTagAssignmentConfigDeleteRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> "InterfaceTagAssignmentConfigDeleteResponse": - return await self._unary_unary( - "/arista.tag.v1.InterfaceTagAssignmentConfigService/Delete", - interface_tag_assignment_config_delete_request, - InterfaceTagAssignmentConfigDeleteResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ) - - async def delete_all( - self, - interface_tag_assignment_config_delete_all_request: "InterfaceTagAssignmentConfigDeleteAllRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["InterfaceTagAssignmentConfigDeleteAllResponse"]: - async for response in self._unary_stream( - "/arista.tag.v1.InterfaceTagAssignmentConfigService/DeleteAll", - interface_tag_assignment_config_delete_all_request, - InterfaceTagAssignmentConfigDeleteAllResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - -class InterfaceTagConfigServiceStub(aristaproto.ServiceStub): - async def get_one( - self, - interface_tag_config_request: "InterfaceTagConfigRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> "InterfaceTagConfigResponse": - return await self._unary_unary( - "/arista.tag.v1.InterfaceTagConfigService/GetOne", - interface_tag_config_request, - InterfaceTagConfigResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ) - - async def get_all( - self, - interface_tag_config_stream_request: "InterfaceTagConfigStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["InterfaceTagConfigStreamResponse"]: - async for response in self._unary_stream( - "/arista.tag.v1.InterfaceTagConfigService/GetAll", - interface_tag_config_stream_request, - InterfaceTagConfigStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - async def subscribe( - self, - interface_tag_config_stream_request: "InterfaceTagConfigStreamRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["InterfaceTagConfigStreamResponse"]: - async for response in self._unary_stream( - "/arista.tag.v1.InterfaceTagConfigService/Subscribe", - interface_tag_config_stream_request, - InterfaceTagConfigStreamResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - async def set( - self, - interface_tag_config_set_request: "InterfaceTagConfigSetRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> "InterfaceTagConfigSetResponse": - return await self._unary_unary( - "/arista.tag.v1.InterfaceTagConfigService/Set", - interface_tag_config_set_request, - InterfaceTagConfigSetResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ) - - async def delete( - self, - interface_tag_config_delete_request: "InterfaceTagConfigDeleteRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> "InterfaceTagConfigDeleteResponse": - return await self._unary_unary( - "/arista.tag.v1.InterfaceTagConfigService/Delete", - interface_tag_config_delete_request, - InterfaceTagConfigDeleteResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ) - - async def delete_all( - self, - interface_tag_config_delete_all_request: "InterfaceTagConfigDeleteAllRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["InterfaceTagConfigDeleteAllResponse"]: - async for response in self._unary_stream( - "/arista.tag.v1.InterfaceTagConfigService/DeleteAll", - interface_tag_config_delete_all_request, - InterfaceTagConfigDeleteAllResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ): - yield response - - -class DeviceTagServiceBase(ServiceBase): - async def get_one( - self, device_tag_request: "DeviceTagRequest" - ) -> "DeviceTagResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def get_all( - self, device_tag_stream_request: "DeviceTagStreamRequest" - ) -> AsyncIterator["DeviceTagStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def subscribe( - self, device_tag_stream_request: "DeviceTagStreamRequest" - ) -> AsyncIterator["DeviceTagStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def __rpc_get_one( - self, stream: "grpclib.server.Stream[DeviceTagRequest, DeviceTagResponse]" - ) -> None: - request = await stream.recv_message() - response = await self.get_one(request) - await stream.send_message(response) - - async def __rpc_get_all( - self, - stream: "grpclib.server.Stream[DeviceTagStreamRequest, DeviceTagStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.get_all, - stream, - request, - ) - - async def __rpc_subscribe( - self, - stream: "grpclib.server.Stream[DeviceTagStreamRequest, DeviceTagStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.subscribe, - stream, - request, - ) - - def __mapping__(self) -> Dict[str, grpclib.const.Handler]: - return { - "/arista.tag.v1.DeviceTagService/GetOne": grpclib.const.Handler( - self.__rpc_get_one, - grpclib.const.Cardinality.UNARY_UNARY, - DeviceTagRequest, - DeviceTagResponse, - ), - "/arista.tag.v1.DeviceTagService/GetAll": grpclib.const.Handler( - self.__rpc_get_all, - grpclib.const.Cardinality.UNARY_STREAM, - DeviceTagStreamRequest, - DeviceTagStreamResponse, - ), - "/arista.tag.v1.DeviceTagService/Subscribe": grpclib.const.Handler( - self.__rpc_subscribe, - grpclib.const.Cardinality.UNARY_STREAM, - DeviceTagStreamRequest, - DeviceTagStreamResponse, - ), - } - - -class DeviceTagAssignmentConfigServiceBase(ServiceBase): - async def get_one( - self, device_tag_assignment_config_request: "DeviceTagAssignmentConfigRequest" - ) -> "DeviceTagAssignmentConfigResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def get_all( - self, - device_tag_assignment_config_stream_request: "DeviceTagAssignmentConfigStreamRequest", - ) -> AsyncIterator["DeviceTagAssignmentConfigStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def subscribe( - self, - device_tag_assignment_config_stream_request: "DeviceTagAssignmentConfigStreamRequest", - ) -> AsyncIterator["DeviceTagAssignmentConfigStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def set( - self, - device_tag_assignment_config_set_request: "DeviceTagAssignmentConfigSetRequest", - ) -> "DeviceTagAssignmentConfigSetResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def delete( - self, - device_tag_assignment_config_delete_request: "DeviceTagAssignmentConfigDeleteRequest", - ) -> "DeviceTagAssignmentConfigDeleteResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def delete_all( - self, - device_tag_assignment_config_delete_all_request: "DeviceTagAssignmentConfigDeleteAllRequest", - ) -> AsyncIterator["DeviceTagAssignmentConfigDeleteAllResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def __rpc_get_one( - self, - stream: "grpclib.server.Stream[DeviceTagAssignmentConfigRequest, DeviceTagAssignmentConfigResponse]", - ) -> None: - request = await stream.recv_message() - response = await self.get_one(request) - await stream.send_message(response) - - async def __rpc_get_all( - self, - stream: "grpclib.server.Stream[DeviceTagAssignmentConfigStreamRequest, DeviceTagAssignmentConfigStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.get_all, - stream, - request, - ) - - async def __rpc_subscribe( - self, - stream: "grpclib.server.Stream[DeviceTagAssignmentConfigStreamRequest, DeviceTagAssignmentConfigStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.subscribe, - stream, - request, - ) - - async def __rpc_set( - self, - stream: "grpclib.server.Stream[DeviceTagAssignmentConfigSetRequest, DeviceTagAssignmentConfigSetResponse]", - ) -> None: - request = await stream.recv_message() - response = await self.set(request) - await stream.send_message(response) - - async def __rpc_delete( - self, - stream: "grpclib.server.Stream[DeviceTagAssignmentConfigDeleteRequest, DeviceTagAssignmentConfigDeleteResponse]", - ) -> None: - request = await stream.recv_message() - response = await self.delete(request) - await stream.send_message(response) - - async def __rpc_delete_all( - self, - stream: "grpclib.server.Stream[DeviceTagAssignmentConfigDeleteAllRequest, DeviceTagAssignmentConfigDeleteAllResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.delete_all, - stream, - request, - ) - - def __mapping__(self) -> Dict[str, grpclib.const.Handler]: - return { - "/arista.tag.v1.DeviceTagAssignmentConfigService/GetOne": grpclib.const.Handler( - self.__rpc_get_one, - grpclib.const.Cardinality.UNARY_UNARY, - DeviceTagAssignmentConfigRequest, - DeviceTagAssignmentConfigResponse, - ), - "/arista.tag.v1.DeviceTagAssignmentConfigService/GetAll": grpclib.const.Handler( - self.__rpc_get_all, - grpclib.const.Cardinality.UNARY_STREAM, - DeviceTagAssignmentConfigStreamRequest, - DeviceTagAssignmentConfigStreamResponse, - ), - "/arista.tag.v1.DeviceTagAssignmentConfigService/Subscribe": grpclib.const.Handler( - self.__rpc_subscribe, - grpclib.const.Cardinality.UNARY_STREAM, - DeviceTagAssignmentConfigStreamRequest, - DeviceTagAssignmentConfigStreamResponse, - ), - "/arista.tag.v1.DeviceTagAssignmentConfigService/Set": grpclib.const.Handler( - self.__rpc_set, - grpclib.const.Cardinality.UNARY_UNARY, - DeviceTagAssignmentConfigSetRequest, - DeviceTagAssignmentConfigSetResponse, - ), - "/arista.tag.v1.DeviceTagAssignmentConfigService/Delete": grpclib.const.Handler( - self.__rpc_delete, - grpclib.const.Cardinality.UNARY_UNARY, - DeviceTagAssignmentConfigDeleteRequest, - DeviceTagAssignmentConfigDeleteResponse, - ), - "/arista.tag.v1.DeviceTagAssignmentConfigService/DeleteAll": grpclib.const.Handler( - self.__rpc_delete_all, - grpclib.const.Cardinality.UNARY_STREAM, - DeviceTagAssignmentConfigDeleteAllRequest, - DeviceTagAssignmentConfigDeleteAllResponse, - ), - } - - -class DeviceTagConfigServiceBase(ServiceBase): - async def get_one( - self, device_tag_config_request: "DeviceTagConfigRequest" - ) -> "DeviceTagConfigResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def get_all( - self, device_tag_config_stream_request: "DeviceTagConfigStreamRequest" - ) -> AsyncIterator["DeviceTagConfigStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def subscribe( - self, device_tag_config_stream_request: "DeviceTagConfigStreamRequest" - ) -> AsyncIterator["DeviceTagConfigStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def set( - self, device_tag_config_set_request: "DeviceTagConfigSetRequest" - ) -> "DeviceTagConfigSetResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def delete( - self, device_tag_config_delete_request: "DeviceTagConfigDeleteRequest" - ) -> "DeviceTagConfigDeleteResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def delete_all( - self, device_tag_config_delete_all_request: "DeviceTagConfigDeleteAllRequest" - ) -> AsyncIterator["DeviceTagConfigDeleteAllResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def __rpc_get_one( - self, - stream: "grpclib.server.Stream[DeviceTagConfigRequest, DeviceTagConfigResponse]", - ) -> None: - request = await stream.recv_message() - response = await self.get_one(request) - await stream.send_message(response) - - async def __rpc_get_all( - self, - stream: "grpclib.server.Stream[DeviceTagConfigStreamRequest, DeviceTagConfigStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.get_all, - stream, - request, - ) - - async def __rpc_subscribe( - self, - stream: "grpclib.server.Stream[DeviceTagConfigStreamRequest, DeviceTagConfigStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.subscribe, - stream, - request, - ) - - async def __rpc_set( - self, - stream: "grpclib.server.Stream[DeviceTagConfigSetRequest, DeviceTagConfigSetResponse]", - ) -> None: - request = await stream.recv_message() - response = await self.set(request) - await stream.send_message(response) - - async def __rpc_delete( - self, - stream: "grpclib.server.Stream[DeviceTagConfigDeleteRequest, DeviceTagConfigDeleteResponse]", - ) -> None: - request = await stream.recv_message() - response = await self.delete(request) - await stream.send_message(response) - - async def __rpc_delete_all( - self, - stream: "grpclib.server.Stream[DeviceTagConfigDeleteAllRequest, DeviceTagConfigDeleteAllResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.delete_all, - stream, - request, - ) - - def __mapping__(self) -> Dict[str, grpclib.const.Handler]: - return { - "/arista.tag.v1.DeviceTagConfigService/GetOne": grpclib.const.Handler( - self.__rpc_get_one, - grpclib.const.Cardinality.UNARY_UNARY, - DeviceTagConfigRequest, - DeviceTagConfigResponse, - ), - "/arista.tag.v1.DeviceTagConfigService/GetAll": grpclib.const.Handler( - self.__rpc_get_all, - grpclib.const.Cardinality.UNARY_STREAM, - DeviceTagConfigStreamRequest, - DeviceTagConfigStreamResponse, - ), - "/arista.tag.v1.DeviceTagConfigService/Subscribe": grpclib.const.Handler( - self.__rpc_subscribe, - grpclib.const.Cardinality.UNARY_STREAM, - DeviceTagConfigStreamRequest, - DeviceTagConfigStreamResponse, - ), - "/arista.tag.v1.DeviceTagConfigService/Set": grpclib.const.Handler( - self.__rpc_set, - grpclib.const.Cardinality.UNARY_UNARY, - DeviceTagConfigSetRequest, - DeviceTagConfigSetResponse, - ), - "/arista.tag.v1.DeviceTagConfigService/Delete": grpclib.const.Handler( - self.__rpc_delete, - grpclib.const.Cardinality.UNARY_UNARY, - DeviceTagConfigDeleteRequest, - DeviceTagConfigDeleteResponse, - ), - "/arista.tag.v1.DeviceTagConfigService/DeleteAll": grpclib.const.Handler( - self.__rpc_delete_all, - grpclib.const.Cardinality.UNARY_STREAM, - DeviceTagConfigDeleteAllRequest, - DeviceTagConfigDeleteAllResponse, - ), - } - - -class InterfaceTagServiceBase(ServiceBase): - async def get_one( - self, interface_tag_request: "InterfaceTagRequest" - ) -> "InterfaceTagResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def get_all( - self, interface_tag_stream_request: "InterfaceTagStreamRequest" - ) -> AsyncIterator["InterfaceTagStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def subscribe( - self, interface_tag_stream_request: "InterfaceTagStreamRequest" - ) -> AsyncIterator["InterfaceTagStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def __rpc_get_one( - self, stream: "grpclib.server.Stream[InterfaceTagRequest, InterfaceTagResponse]" - ) -> None: - request = await stream.recv_message() - response = await self.get_one(request) - await stream.send_message(response) - - async def __rpc_get_all( - self, - stream: "grpclib.server.Stream[InterfaceTagStreamRequest, InterfaceTagStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.get_all, - stream, - request, - ) - - async def __rpc_subscribe( - self, - stream: "grpclib.server.Stream[InterfaceTagStreamRequest, InterfaceTagStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.subscribe, - stream, - request, - ) - - def __mapping__(self) -> Dict[str, grpclib.const.Handler]: - return { - "/arista.tag.v1.InterfaceTagService/GetOne": grpclib.const.Handler( - self.__rpc_get_one, - grpclib.const.Cardinality.UNARY_UNARY, - InterfaceTagRequest, - InterfaceTagResponse, - ), - "/arista.tag.v1.InterfaceTagService/GetAll": grpclib.const.Handler( - self.__rpc_get_all, - grpclib.const.Cardinality.UNARY_STREAM, - InterfaceTagStreamRequest, - InterfaceTagStreamResponse, - ), - "/arista.tag.v1.InterfaceTagService/Subscribe": grpclib.const.Handler( - self.__rpc_subscribe, - grpclib.const.Cardinality.UNARY_STREAM, - InterfaceTagStreamRequest, - InterfaceTagStreamResponse, - ), - } - - -class InterfaceTagAssignmentConfigServiceBase(ServiceBase): - async def get_one( - self, - interface_tag_assignment_config_request: "InterfaceTagAssignmentConfigRequest", - ) -> "InterfaceTagAssignmentConfigResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def get_all( - self, - interface_tag_assignment_config_stream_request: "InterfaceTagAssignmentConfigStreamRequest", - ) -> AsyncIterator["InterfaceTagAssignmentConfigStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def subscribe( - self, - interface_tag_assignment_config_stream_request: "InterfaceTagAssignmentConfigStreamRequest", - ) -> AsyncIterator["InterfaceTagAssignmentConfigStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def set( - self, - interface_tag_assignment_config_set_request: "InterfaceTagAssignmentConfigSetRequest", - ) -> "InterfaceTagAssignmentConfigSetResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def delete( - self, - interface_tag_assignment_config_delete_request: "InterfaceTagAssignmentConfigDeleteRequest", - ) -> "InterfaceTagAssignmentConfigDeleteResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def delete_all( - self, - interface_tag_assignment_config_delete_all_request: "InterfaceTagAssignmentConfigDeleteAllRequest", - ) -> AsyncIterator["InterfaceTagAssignmentConfigDeleteAllResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def __rpc_get_one( - self, - stream: "grpclib.server.Stream[InterfaceTagAssignmentConfigRequest, InterfaceTagAssignmentConfigResponse]", - ) -> None: - request = await stream.recv_message() - response = await self.get_one(request) - await stream.send_message(response) - - async def __rpc_get_all( - self, - stream: "grpclib.server.Stream[InterfaceTagAssignmentConfigStreamRequest, InterfaceTagAssignmentConfigStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.get_all, - stream, - request, - ) - - async def __rpc_subscribe( - self, - stream: "grpclib.server.Stream[InterfaceTagAssignmentConfigStreamRequest, InterfaceTagAssignmentConfigStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.subscribe, - stream, - request, - ) - - async def __rpc_set( - self, - stream: "grpclib.server.Stream[InterfaceTagAssignmentConfigSetRequest, InterfaceTagAssignmentConfigSetResponse]", - ) -> None: - request = await stream.recv_message() - response = await self.set(request) - await stream.send_message(response) - - async def __rpc_delete( - self, - stream: "grpclib.server.Stream[InterfaceTagAssignmentConfigDeleteRequest, InterfaceTagAssignmentConfigDeleteResponse]", - ) -> None: - request = await stream.recv_message() - response = await self.delete(request) - await stream.send_message(response) - - async def __rpc_delete_all( - self, - stream: "grpclib.server.Stream[InterfaceTagAssignmentConfigDeleteAllRequest, InterfaceTagAssignmentConfigDeleteAllResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.delete_all, - stream, - request, - ) - - def __mapping__(self) -> Dict[str, grpclib.const.Handler]: - return { - "/arista.tag.v1.InterfaceTagAssignmentConfigService/GetOne": grpclib.const.Handler( - self.__rpc_get_one, - grpclib.const.Cardinality.UNARY_UNARY, - InterfaceTagAssignmentConfigRequest, - InterfaceTagAssignmentConfigResponse, - ), - "/arista.tag.v1.InterfaceTagAssignmentConfigService/GetAll": grpclib.const.Handler( - self.__rpc_get_all, - grpclib.const.Cardinality.UNARY_STREAM, - InterfaceTagAssignmentConfigStreamRequest, - InterfaceTagAssignmentConfigStreamResponse, - ), - "/arista.tag.v1.InterfaceTagAssignmentConfigService/Subscribe": grpclib.const.Handler( - self.__rpc_subscribe, - grpclib.const.Cardinality.UNARY_STREAM, - InterfaceTagAssignmentConfigStreamRequest, - InterfaceTagAssignmentConfigStreamResponse, - ), - "/arista.tag.v1.InterfaceTagAssignmentConfigService/Set": grpclib.const.Handler( - self.__rpc_set, - grpclib.const.Cardinality.UNARY_UNARY, - InterfaceTagAssignmentConfigSetRequest, - InterfaceTagAssignmentConfigSetResponse, - ), - "/arista.tag.v1.InterfaceTagAssignmentConfigService/Delete": grpclib.const.Handler( - self.__rpc_delete, - grpclib.const.Cardinality.UNARY_UNARY, - InterfaceTagAssignmentConfigDeleteRequest, - InterfaceTagAssignmentConfigDeleteResponse, - ), - "/arista.tag.v1.InterfaceTagAssignmentConfigService/DeleteAll": grpclib.const.Handler( - self.__rpc_delete_all, - grpclib.const.Cardinality.UNARY_STREAM, - InterfaceTagAssignmentConfigDeleteAllRequest, - InterfaceTagAssignmentConfigDeleteAllResponse, - ), - } - - -class InterfaceTagConfigServiceBase(ServiceBase): - async def get_one( - self, interface_tag_config_request: "InterfaceTagConfigRequest" - ) -> "InterfaceTagConfigResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def get_all( - self, interface_tag_config_stream_request: "InterfaceTagConfigStreamRequest" - ) -> AsyncIterator["InterfaceTagConfigStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def subscribe( - self, interface_tag_config_stream_request: "InterfaceTagConfigStreamRequest" - ) -> AsyncIterator["InterfaceTagConfigStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def set( - self, interface_tag_config_set_request: "InterfaceTagConfigSetRequest" - ) -> "InterfaceTagConfigSetResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def delete( - self, interface_tag_config_delete_request: "InterfaceTagConfigDeleteRequest" - ) -> "InterfaceTagConfigDeleteResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def delete_all( - self, - interface_tag_config_delete_all_request: "InterfaceTagConfigDeleteAllRequest", - ) -> AsyncIterator["InterfaceTagConfigDeleteAllResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def __rpc_get_one( - self, - stream: "grpclib.server.Stream[InterfaceTagConfigRequest, InterfaceTagConfigResponse]", - ) -> None: - request = await stream.recv_message() - response = await self.get_one(request) - await stream.send_message(response) - - async def __rpc_get_all( - self, - stream: "grpclib.server.Stream[InterfaceTagConfigStreamRequest, InterfaceTagConfigStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.get_all, - stream, - request, - ) - - async def __rpc_subscribe( - self, - stream: "grpclib.server.Stream[InterfaceTagConfigStreamRequest, InterfaceTagConfigStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.subscribe, - stream, - request, - ) - - async def __rpc_set( - self, - stream: "grpclib.server.Stream[InterfaceTagConfigSetRequest, InterfaceTagConfigSetResponse]", - ) -> None: - request = await stream.recv_message() - response = await self.set(request) - await stream.send_message(response) - - async def __rpc_delete( - self, - stream: "grpclib.server.Stream[InterfaceTagConfigDeleteRequest, InterfaceTagConfigDeleteResponse]", - ) -> None: - request = await stream.recv_message() - response = await self.delete(request) - await stream.send_message(response) - - async def __rpc_delete_all( - self, - stream: "grpclib.server.Stream[InterfaceTagConfigDeleteAllRequest, InterfaceTagConfigDeleteAllResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.delete_all, - stream, - request, - ) - - def __mapping__(self) -> Dict[str, grpclib.const.Handler]: - return { - "/arista.tag.v1.InterfaceTagConfigService/GetOne": grpclib.const.Handler( - self.__rpc_get_one, - grpclib.const.Cardinality.UNARY_UNARY, - InterfaceTagConfigRequest, - InterfaceTagConfigResponse, - ), - "/arista.tag.v1.InterfaceTagConfigService/GetAll": grpclib.const.Handler( - self.__rpc_get_all, - grpclib.const.Cardinality.UNARY_STREAM, - InterfaceTagConfigStreamRequest, - InterfaceTagConfigStreamResponse, - ), - "/arista.tag.v1.InterfaceTagConfigService/Subscribe": grpclib.const.Handler( - self.__rpc_subscribe, - grpclib.const.Cardinality.UNARY_STREAM, - InterfaceTagConfigStreamRequest, - InterfaceTagConfigStreamResponse, - ), - "/arista.tag.v1.InterfaceTagConfigService/Set": grpclib.const.Handler( - self.__rpc_set, - grpclib.const.Cardinality.UNARY_UNARY, - InterfaceTagConfigSetRequest, - InterfaceTagConfigSetResponse, - ), - "/arista.tag.v1.InterfaceTagConfigService/Delete": grpclib.const.Handler( - self.__rpc_delete, - grpclib.const.Cardinality.UNARY_UNARY, - InterfaceTagConfigDeleteRequest, - InterfaceTagConfigDeleteResponse, - ), - "/arista.tag.v1.InterfaceTagConfigService/DeleteAll": grpclib.const.Handler( - self.__rpc_delete_all, - grpclib.const.Cardinality.UNARY_STREAM, - InterfaceTagConfigDeleteAllRequest, - InterfaceTagConfigDeleteAllResponse, - ), - } diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/workspace/__init__.py b/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/workspace/__init__.py deleted file mode 100644 index e772bee41fe..00000000000 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/workspace/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/client/__init__.py b/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/client/__init__.py deleted file mode 100644 index 8ea7a0e59d0..00000000000 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/client/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -from .cv_client import CVClient - -__all__ = ["CVClient"] diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/mocked_classes.py b/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/mocked_classes.py deleted file mode 100644 index bcff2c9b077..00000000000 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/mocked_classes.py +++ /dev/null @@ -1,104 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -""" -Dummy class for mock aristaproto. Required to pass ansible sanity tests. -Once things move away from the ansible collection this can be removed again. -""" - -ARISTAPROTO_ATTRIBUTES = [ - "Casing", - "DATETIME_ZERO", - "Enum", - "FIXED_TYPES", - "FieldMetadata", - "INFINITY", - "INT_64_TYPES", - "Message", - "NAN", - "NEG_INFINITY", - "PACKED_TYPES", - "PLACEHOLDER", - "ParsedField", - "ProtoClassMetadata", - "SIZE_DELIMITED", - "ServiceStub", - "TYPE_BOOL", - "TYPE_BYTES", - "TYPE_DOUBLE", - "TYPE_ENUM", - "TYPE_FIXED32", - "TYPE_FIXED64", - "TYPE_FLOAT", - "TYPE_INT32", - "TYPE_INT64", - "TYPE_MAP", - "TYPE_MESSAGE", - "TYPE_SFIXED32", - "TYPE_SFIXED64", - "TYPE_SINT32", - "TYPE_SINT64", - "TYPE_STRING", - "TYPE_UINT32", - "TYPE_UINT64", - "WIRE_FIXED_32", - "WIRE_FIXED_32_TYPES", - "WIRE_FIXED_64", - "WIRE_FIXED_64_TYPES", - "WIRE_LEN_DELIM", - "WIRE_LEN_DELIM_TYPES", - "WIRE_VARINT", - "WIRE_VARINT_TYPES", - "bool_field", - "bytes_field", - "casing", - "datetime_default_gen", - "decode_varint", - "double_field", - "dump_varint", - "encode_varint", - "enum_field", - "fixed32_field", - "fixed64_field", - "float_field", - "int32_field", - "int64_field", - "load_fields", - "load_varint", - "map_field", - "message_field", - "parse_fields", - "serialized_on_wire", - "sfixed32_field", - "sfixed64_field", - "sint32_field", - "sint64_field", - "size_varint", - "string_field", - "uint32_field", - "uint64_field", - "which_one_of", -] - - -class mocked_aristaproto: - pass - - -class mocked_grpclib: - class const: - class Handler: - pass - - -def dummy_callable(*args, **kwargs): - pass - - -for attribute in ARISTAPROTO_ATTRIBUTES: - if attribute.isupper(): - setattr(mocked_aristaproto, attribute, "dummyvalue") - elif attribute[:1].isupper(): - setattr(mocked_aristaproto, attribute, object) - else: - setattr(mocked_aristaproto, attribute, dummy_callable) diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/workflows/deploy_configs_to_cv.py b/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/workflows/deploy_configs_to_cv.py deleted file mode 100644 index 5139300bc1a..00000000000 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/workflows/deploy_configs_to_cv.py +++ /dev/null @@ -1,133 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -from __future__ import annotations - -from asyncio import gather -from logging import getLogger - -from ...utils import batch -from ..client import CVClient -from .models import CVEosConfig, DeployToCvResult - -LOGGER = getLogger(__name__) - -CONFIGLET_ID_PREFIX = "avd-" -CONFIGLET_NAME_PREFIX = "AVD_" -CONFIGLET_CONTAINER_ID = f"{CONFIGLET_ID_PREFIX}configlets" -STATIC_CONFIGLET_STUDIO_ID = "studio-static-configlet" - - -async def deploy_configs_to_cv(configs: list[CVEosConfig], result: DeployToCvResult, cv_client: CVClient) -> None: - """ - Deploy given configs using "Static Configlet Studio" - - - Create/verify a single configuration container named "AVD Configurations". - - Upload Configlets and assign to devices. - - TODO: See if this can be optimized to check if the configlets are already in place and correct. A hash would have been nice. - TODO: Split long configs into multiple configlets for 990KB chunks. Need to figure out how to batch it. - """ - - LOGGER.info("deploy_configs_to_cv: %s", len(configs)) - - if not configs: - return - - # Build Todo with CVEosConfig objects that exist on CloudVision. Add the rest to skipped. - result.skipped_configs.extend(config for config in configs if not config.device._exists_on_cv) - LOGGER.info("deploy_configs_to_cv: %s skipped configs because they devices are missing.", len(result.skipped_configs)) - todo_configs = [config for config in configs if config.device._exists_on_cv] - LOGGER.info("deploy_configs_to_cv: %s todo configs.", len(todo_configs)) - - # No need to continue if we have nothing to do. - if not todo_configs: - return - - # Get or create root level container for AVD configurations. Using the hardcoded id from CONFIGLET_CONTAINER_ID. - cv_containers = await cv_client.get_configlet_containers(workspace_id=result.workspace.id, container_ids=[CONFIGLET_CONTAINER_ID]) - LOGGER.info("deploy_configs_to_cv: Got AVD root container? %s", bool(cv_containers)) - if not cv_containers: - # Create the root level container - LOGGER.info("deploy_configs_to_cv: Creating AVD root container '%s'", CONFIGLET_CONTAINER_ID) - await cv_client.set_configlet_container( - workspace_id=result.workspace.id, - container_id=CONFIGLET_CONTAINER_ID, - display_name="AVD Configurations", - description="Configurations created and uploaded by AVD", - query="device:*", - ) - # Add the root level container to the list of root level containers using the studio inputs API (!?!) - root_containers: list = await cv_client.get_studio_inputs_with_path( - studio_id=STATIC_CONFIGLET_STUDIO_ID, workspace_id=result.workspace.id, input_path=["configletAssignmentRoots"], default_value=[] - ) - LOGGER.info("deploy_configs_to_cv: Found %s root containers.", len(root_containers)) - if CONFIGLET_CONTAINER_ID not in root_containers: - LOGGER.info("deploy_configs_to_cv: AVD root container not assigned as root container in Static Config Studio. Fixing...") - root_containers.append(CONFIGLET_CONTAINER_ID) - await cv_client.set_studio_inputs( - studio_id=STATIC_CONFIGLET_STUDIO_ID, - workspace_id=result.workspace.id, - input_path=["configletAssignmentRoots"], - inputs=root_containers, - ) - cv_containers = await cv_client.get_configlet_containers( - workspace_id=result.workspace.id, - container_ids=[CONFIGLET_CONTAINER_ID], - ) - - existing_device_container_ids = cv_containers[0].child_assignment_ids.values - LOGGER.info("deploy_configs_to_cv: %s existing device containers under AVD root container.", len(existing_device_container_ids)) - update_device_container_ids = existing_device_container_ids.copy() - - # Bluntly setting everything like nothing was there. - # Alternative would be to pull down all configlets and containers - # to compare them with the target. - configlet_coroutines = [] - container_coroutines = [] - for config in todo_configs: - # For now we reuse configlet_id as container_id. - container_id = configlet_id = f"{CONFIGLET_ID_PREFIX}{config.device.serial_number}" - configlet_coroutines.append( - cv_client.set_configlet_from_file( - workspace_id=result.workspace.id, - configlet_id=configlet_id, - file=config.file, - display_name=config.configlet_name or f"{CONFIGLET_NAME_PREFIX}{config.device.hostname}", - description=f"Configuration created and uploaded by AVD for {config.device.hostname}", - ) - ) - container_coroutines.append( - cv_client.set_configlet_container( - workspace_id=result.workspace.id, - container_id=container_id, - display_name=f"{config.device.hostname}", - description=f"Configuration created and uploaded by AVD for {config.device.hostname}", - query=f"device:{config.device.serial_number}", - configlet_ids=[configlet_id], - ) - ) - if container_id not in update_device_container_ids: - update_device_container_ids.append(container_id) - - result.deployed_configs.append(config) - - # First create all configlets in parallel coroutines. - LOGGER.info("deploy_configs_to_cv: Deploying %s configlets in batches of 20.", len(configlet_coroutines)) - for index, coroutines in enumerate(batch(configlet_coroutines, 20), start=1): - LOGGER.info("deploy_configs_to_cv: Batch %s", index) - await gather(*coroutines) - # Next create all containers in parallel coroutines. - LOGGER.info("deploy_configs_to_cv: Deploying %s configlet assignments / containers in batches of 20.", len(container_coroutines)) - for index, coroutines in enumerate(batch(container_coroutines, 20), start=1): - LOGGER.info("deploy_configs_to_cv: Batch %s", index) - await gather(*coroutines) - - # Update the device_container_ids on the root level container. - if update_device_container_ids != existing_device_container_ids: - LOGGER.info("deploy_configs_to_cv: Updating root container children.") - await cv_client.set_configlet_container( - workspace_id=result.workspace.id, - container_id=CONFIGLET_CONTAINER_ID, - child_assignment_ids=update_device_container_ids, - ) diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_facts/MOVED_TO_PYAVD.txt b/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_facts/MOVED_TO_PYAVD.txt new file mode 100644 index 00000000000..b0177c5e71c --- /dev/null +++ b/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_facts/MOVED_TO_PYAVD.txt @@ -0,0 +1 @@ +The eos_designs_facts Python module has been moved to PyAVD in the folder /python-avd/pyavd/_eos_designs/eos_designs_facts/ diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_facts/__init__.py b/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_facts/__init__.py deleted file mode 100644 index 26507a41db8..00000000000 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_facts/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -from .eos_designs_facts import EosDesignsFacts - -__all__ = ["EosDesignsFacts"] diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/MOVED_TO_PYAVD.txt b/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/MOVED_TO_PYAVD.txt new file mode 100644 index 00000000000..c8e9d4aa6dd --- /dev/null +++ b/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/MOVED_TO_PYAVD.txt @@ -0,0 +1 @@ +The eos_designs_shared_utils Python module has been moved to PyAVD in the folder /python-avd/pyavd/_eos_designs/shared_utils/ diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/__init__.py b/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/__init__.py deleted file mode 100644 index 9f4d9a5d3a0..00000000000 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -from .shared_utils import SharedUtils - -__all__ = ["SharedUtils"] diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/l3_interfaces.py b/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/l3_interfaces.py deleted file mode 100644 index bcd9061c373..00000000000 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/l3_interfaces.py +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -from __future__ import annotations - -from functools import cached_property -from typing import TYPE_CHECKING - -from ansible_collections.arista.avd.plugins.plugin_utils.merge import merge -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get, get_item - -if TYPE_CHECKING: - from .shared_utils import SharedUtils - - -class L3InterfacesMixin: - """ - Mixin Class providing a subset of SharedUtils - Class should only be used as Mixin to the SharedUtils class - Using type-hint on self to get proper type-hints on attributes across all Mixins. - """ - - def apply_l3_interfaces_profile(self: SharedUtils, l3_interface: dict) -> dict: - """ - Apply a profile to an l3_interface - """ - if "profile" not in l3_interface: - # Nothing to do - return l3_interface - - profile = get_item(self.l3_interface_profiles, "profile", l3_interface["profile"], default={}) - merged_dict: dict = merge(profile, l3_interface, list_merge="replace", destructive_merge=False) - merged_dict.pop("profile", None) - return merged_dict - - @cached_property - def l3_interface_profiles(self: SharedUtils) -> list: - return get(self.hostvars, "l3_interface_profiles", default=[]) - - # TODO: Add sflow knob under fabric_sflow to cover l3_interfaces defined under the node_types. - # @cached_property - # def _l3_interfaces_sflow(self) -> bool | None: - # return get(self._hostvars, f"fabric_sflow.{self.data_model}") - - @cached_property - def l3_interfaces(self: SharedUtils) -> list: - """ - Returns the list of l3_interfaces, where any referenced profiles are applied. - """ - if not (l3_interfaces := get(self.switch_data_combined, "l3_interfaces")): - return [] - - # Apply l3_interfaces._profile if set. Silently ignoring missing profile. - if self.l3_interface_profiles: - l3_interfaces = [self.apply_l3_interfaces_profile(l3_interface) for l3_interface in l3_interfaces] - - return l3_interfaces diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_validate_state_utils/ansible_eos_device.py b/ansible_collections/arista/avd/plugins/plugin_utils/eos_validate_state_utils/ansible_eos_device.py index be14990bf79..132372dae7f 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_validate_state_utils/ansible_eos_device.py +++ b/ansible_collections/arista/avd/plugins/plugin_utils/eos_validate_state_utils/ansible_eos_device.py @@ -10,22 +10,26 @@ from typing import TYPE_CHECKING, Generator from urllib.error import HTTPError -from ansible.errors import AnsibleConnectionFailure +from ansible.errors import AnsibleActionFail, AnsibleConnectionFailure from ansible.module_utils.connection import ConnectionError -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError +from ansible_collections.arista.avd.plugins.plugin_utils.pyavd_wrappers import RaiseOnUse -logger = getLogger(__name__) - -REQUIRED_ANTA_VERSION = "v0.13.0" -"""This is temporary until the ANTA mode is out of preview and the `anta` Python library requirement is added to -the AVD repository's `requirements.txt` file. This constant and the condition below must be removed once the requirement is added.""" +PLUGIN_NAME = "arista.avd.eos_validate_state" try: - from anta import __version__ as anta_version + from pyavd._errors import AristaAvdError +except ImportError as e: + AristaAvdError = RaiseOnUse( + AnsibleActionFail( + f"The '{PLUGIN_NAME}' plugin requires the 'pyavd' Python library. Got import error", + orig_exc=e, + ) + ) + +logger = getLogger(__name__) - if anta_version != REQUIRED_ANTA_VERSION: - raise AristaAvdError(message=f"AVD requires 'anta' Python library version {REQUIRED_ANTA_VERSION}, found {anta_version}") +try: from anta import __DEBUG__ from anta.device import AntaDevice from anta.logger import anta_log_exception @@ -35,20 +39,6 @@ HAS_ANTA = False # Next line to make ansible-test sanity happy AntaDevice = object -except TypeError as e: - # Known bug with Python 3.9.7 and Pydantic `conint`, impacting ANTA. Issue: https://github.com/arista-netdevops-community/anta/issues/557 - if "Interval() takes no arguments" in str(e): - msg = ( - "The ANTA testing framework, utilized in the AVD eos_validate_state role, has identified a compatibility issue with Python 3.9.x. " - "We recommend trying a different Python version; 3.9.13 has been confirmed to work, or consider upgrading to version 3.10 or newer.\n" - "For further assistance or to report your Python version, please visit the AVD and ANTA GitHub repositories:\n" - "https://github.com/aristanetworks/avd/\n" - "https://github.com/arista-netdevops-community/anta" - ) - raise AristaAvdError(msg) from e - else: - # If the TypeError is not related to the known bug, raise it to avoid silencing other issues - raise if TYPE_CHECKING: from ansible.plugins.connection import ConnectionBase @@ -84,11 +74,21 @@ def __init__(self, name: str, connection: ConnectionBase, tags: list | None = No super().__init__(name, tags, disable_cache=False) self.check_mode = check_mode + + # Check the ansible connection is defined + if not self.check_mode and not hasattr(connection, "_sub_plugin"): + raise AristaAvdError( + message="AVD could not determine the Ansible connection plugin used. " + "Please ensure that the 'ansible_network_os' and 'ansible_connection' variables are set to 'eos' and 'httpapi' respectively for this host." + ) # In check_mode we don't care that we cannot connect to the device if self.check_mode or (plugin_name := connection._sub_plugin.get("name")) == ANSIBLE_EOS_PLUGIN_NAME: self._connection = connection else: - raise AristaAvdError(message=f"The provided Ansible connection does not use EOS HttpApi plugin: {plugin_name}") + raise AristaAvdError( + message=f"The provided Ansible connection does not use EOS HttpApi plugin: {plugin_name}. " + "Please ensure that the 'ansible_network_os' and 'ansible_connection' variables are set to 'eos' and 'httpapi' respectively for this host." + ) @property def _keys(self) -> tuple: @@ -104,7 +104,7 @@ def __rich_repr__(self) -> Generator: if __DEBUG__: yield "_connection", connection_vars - async def _collect(self, command: AntaCommand) -> None: + async def _collect(self, command: AntaCommand, *, collection_id: str | None = None) -> None: """Collect device command result using Ansible HttpApi connection plugin. Supports outformat 'json' and 'text' as output structure. @@ -112,6 +112,7 @@ async def _collect(self, command: AntaCommand) -> None: Args: ---- command (AntaCommand): The command to collect. + collection_id (str, optional): This parameter is not used in this implementation. Defaults to None. If there is an exception while collecting the command, the exception will be propagated and handled in ANTA. That means ANTA will set the test result to 'error', the play will diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_validate_state_utils/config_manager.py b/ansible_collections/arista/avd/plugins/plugin_utils/eos_validate_state_utils/config_manager.py index 49d4932e9dd..45eb3ccd6ed 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_validate_state_utils/config_manager.py +++ b/ansible_collections/arista/avd/plugins/plugin_utils/eos_validate_state_utils/config_manager.py @@ -8,8 +8,22 @@ from ipaddress import ip_interface from typing import Mapping -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get, get_item +from ansible.errors import AnsibleActionFail + +from ansible_collections.arista.avd.plugins.plugin_utils.pyavd_wrappers import RaiseOnUse + +PLUGIN_NAME = "arista.avd.eos_validate_state" + +try: + from pyavd._errors import AristaAvdError + from pyavd._utils import get, get_item +except ImportError as e: + AristaAvdError = RaiseOnUse( + AnsibleActionFail( + f"The '{PLUGIN_NAME}' plugin requires the 'pyavd' Python library. Got import error", + orig_exc=e, + ) + ) LOGGER = logging.getLogger(__name__) @@ -19,7 +33,7 @@ class ConfigManager: This class is used to manage the structured configuration of the devices and to generate variables for the eos_validate_state tests. - It should be initialized per device and the instance should be passed to the AvdTestBase classe. + It should be initialized per device and the instance should be passed to the AvdTestBase class. """ def __init__(self, device_name: str, hostvars: Mapping) -> None: diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_validate_state_utils/get_anta_results.py b/ansible_collections/arista/avd/plugins/plugin_utils/eos_validate_state_utils/get_anta_results.py index 44fd7d2432f..aca4aaf2929 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_validate_state_utils/get_anta_results.py +++ b/ansible_collections/arista/avd/plugins/plugin_utils/eos_validate_state_utils/get_anta_results.py @@ -7,13 +7,27 @@ from asyncio import run from typing import TYPE_CHECKING +from ansible.errors import AnsibleActionFail from yaml import CSafeLoader, YAMLError, dump, load -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError from ansible_collections.arista.avd.plugins.plugin_utils.merge import merge_catalogs -from ansible_collections.arista.avd.plugins.plugin_utils.utils import NoAliasDumper, get_item +from ansible_collections.arista.avd.plugins.plugin_utils.pyavd_wrappers import RaiseOnUse +from ansible_collections.arista.avd.plugins.plugin_utils.utils import NoAliasDumper from ansible_collections.arista.avd.roles.eos_validate_state.python_modules.constants import AVD_TEST_CLASSES +PLUGIN_NAME = "arista.avd.eos_validate_state" + +try: + from pyavd._errors import AristaAvdError + from pyavd._utils import get_item +except ImportError as e: + AristaAvdError = get_item = RaiseOnUse( + AnsibleActionFail( + f"The '{PLUGIN_NAME}' plugin requires the 'pyavd' Python library. Got import error", + orig_exc=e, + ) + ) + if TYPE_CHECKING: from pathlib import Path @@ -43,7 +57,7 @@ def get_anta_results( anta_device: AntaDevice, config_manager: ConfigManager, logging_level: str, - skipped_tests: list[dict], + skip_tests: list[dict], ansible_tags: dict | None = None, save_catalog_name: Path | None = None, custom_anta_catalogs: list[Path] | None = None, @@ -59,9 +73,9 @@ def get_anta_results( When running in Ansible, the action plugin will pass an AnsibleEOSDevice instance. config_manager (ConfigManager): The device ConfigManager object containing data to be used by the tests. logging_level (str): The level at which ANTA should be logging. - skipped_tests (list[dict]): A list of dictionary containing the categories and/or tests to skip. + skip_tests (list[dict]): A list of dictionary containing the categories and/or tests to skip. ansible_tags (dict): An optional dictionary containing the tags to maintain legacy filtering behavior for - `eos_validate_state`. This is ignored if `skipped_tests` is set. + `eos_validate_state`. This is ignored if `skip_tests` is set. save_catalog_name (str): When set, the generated catalog is saved to a file using this name. custom_anta_catalogs (list[Path]): An optional list of custom ANTA catalog files to merge with the generated catalog. yaml_dumper (Dumper): Dumper to use to dump the ANTA catalog. Default is NoAliasDumper to avoid anchors. @@ -79,14 +93,14 @@ def get_anta_results( # Setup ANTA logging setup_logging(level=logging_level) - if skipped_tests: - LOGGER.warning("The variable 'skipped_tests' has been set. Ansible tags are ignored for filtering tests.") + if skip_tests: + LOGGER.warning("The variable 'skip_tests' has been set. Ansible tags are ignored for filtering tests.") # Backward compatibility with legacy eos_validate_state Ansible tags elif ansible_tags: run_tags = ansible_tags.get("ansible_run_tags", ()) skip_tags = ansible_tags.get("ansible_skip_tags", ()) - # Update the skipped_tests variable according to Ansible tags - skipped_tests = get_skipped_tests_from_tags(run_tags, skip_tags) + # Update the skip_tests variable according to Ansible tags + skip_tests = get_skip_tests_from_tags(run_tags, skip_tags) device_name = anta_device.name @@ -94,7 +108,7 @@ def get_anta_results( custom_catalog = load_custom_catalogs(custom_anta_catalogs) if custom_anta_catalogs else None # Create the ANTA Catalog object with the appropriate skipped tests if any - tests = generate_tests(config_manager, skipped_tests, custom_catalog) + tests = generate_tests(config_manager, skip_tests, custom_catalog) anta_catalog = AntaCatalog.from_dict(data=tests) if tests else AntaCatalog() if save_catalog_name is not None: @@ -115,7 +129,7 @@ def get_anta_results( run(anta_runner(manager, inventory, anta_catalog)) if len(anta_catalog.tests) > 0 else LOGGER.warning("Test catalog is empty!") # Convert the ANTA TestResult models to dictionaries, excluding default values - results = [result.model_dump(exclude_defaults=True) for result in manager.get_results()] + results = [result.model_dump(exclude_defaults=True) for result in manager.results] # Return sorted results return sorted( @@ -165,7 +179,7 @@ def dump_to_file(tests: dict, filename: Path, yaml_dumper: Dumper = NoAliasDumpe dump(tests, fd, Dumper=yaml_dumper) -def get_skipped_tests_from_tags(run_tags: tuple, skip_tags: tuple) -> list[dict]: +def get_skip_tests_from_tags(run_tags: tuple, skip_tags: tuple) -> list[dict]: """Get the list of AVD test categories to skip from the Ansible tags. Args: @@ -197,18 +211,18 @@ def get_skipped_tests_from_tags(run_tags: tuple, skip_tags: tuple) -> list[dict] return result -def generate_tests(config_manager: ConfigManager, skipped_tests: list[dict], custom_catalog: dict | None = None) -> RawCatalogInput: - """Create the test catalog in a dictionnary format generated from the AVD test classes. +def generate_tests(config_manager: ConfigManager, skip_tests: list[dict], custom_catalog: dict | None = None) -> RawCatalogInput: + """Create the test catalog in a dictionary format generated from the AVD test classes. Test definitions are generated from the AVD structured_config for each AVD test classes and are merged together with an optional custom_catalog to create the final catalog. - Tests can be skipped from the catalog depending on `skipped_tests`. + Tests can be skipped from the catalog depending on `skip_tests`. Args: ---- config_manager (ConfigManager): The device ConfigManager object containing data to be used by the tests. - skipped_tests (list[dict]): A list of dictionary containing the categories and/or tests to skip. + skip_tests (list[dict]): A list of dictionary containing the categories and/or tests to skip. custom_catalog (dict): An optional custom catalog to merge with the generated catalog. Returns: @@ -220,9 +234,9 @@ def generate_tests(config_manager: ConfigManager, skipped_tests: list[dict], cus for avd_test_class in AVD_TEST_CLASSES: # Check if the whole class is to be skipped - class_skip_config = get_item(skipped_tests, "category", avd_test_class.__name__) + class_skip_config = get_item(skip_tests, "category", avd_test_class.__name__) if class_skip_config is not None and not class_skip_config.get("tests"): - msg = f"Skipping all tests of {avd_test_class.__name__} per the `skipped_tests` input variable." + msg = f"Skipping all tests of {avd_test_class.__name__} per the `skip_tests` input variable." LOGGER.info(msg) continue @@ -231,12 +245,12 @@ def generate_tests(config_manager: ConfigManager, skipped_tests: list[dict], cus generated_tests = eos_validate_state_module.render() # Remove the individual tests that are to be skipped - if class_skip_config is not None and (avd_test_class_skipped_tests := class_skip_config.get("tests")) is not None: - msg = f"Skipping the following tests of {avd_test_class.__name__} per the `skipped_tests` input variable: " - msg += ", ".join(avd_test_class_skipped_tests) + if class_skip_config is not None and (avd_test_class_skip_tests := class_skip_config.get("tests")) is not None: + msg = f"Skipping the following tests of {avd_test_class.__name__} per the `skip_tests` input variable: " + msg += ", ".join(avd_test_class_skip_tests) LOGGER.info(msg) for anta_tests in generated_tests.values(): - anta_tests[:] = [test for test in anta_tests if next(iter(test.keys())) not in avd_test_class_skipped_tests] + anta_tests[:] = [test for test in anta_tests if next(iter(test.keys())) not in avd_test_class_skip_tests] catalog = merge_catalogs(catalog, generated_tests) @@ -264,7 +278,7 @@ def create_dry_run_report(device_name: str, catalog: AntaCatalog, manager: Resul description = res_ow.description if res_ow and res_ow.description else test_definition.test.description custom_field = res_ow.custom_field if res_ow else None - manager.add_test_result( + manager.add( TestResult( name=device_name, test=test_definition.test.name, diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_validate_state_utils/mixins.py b/ansible_collections/arista/avd/plugins/plugin_utils/eos_validate_state_utils/mixins.py index f7187b8eb97..f6fe6aa8963 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_validate_state_utils/mixins.py +++ b/ansible_collections/arista/avd/plugins/plugin_utils/eos_validate_state_utils/mixins.py @@ -5,8 +5,22 @@ import logging -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdMissingVariableError -from ansible_collections.arista.avd.plugins.plugin_utils.utils import default, get, get_item, log_message +from ansible.errors import AnsibleActionFail + +from ansible_collections.arista.avd.plugins.plugin_utils.pyavd_wrappers import RaiseOnUse +from ansible_collections.arista.avd.plugins.plugin_utils.utils import log_message + +PLUGIN_NAME = "arista.avd.eos_validate_state" + +try: + from pyavd._utils import default, get, get_item +except ImportError as e: + get = get_item = default = RaiseOnUse( + AnsibleActionFail( + f"The '{PLUGIN_NAME}' plugin requires the 'pyavd' Python library. Got import error", + orig_exc=e, + ) + ) LOGGER = logging.getLogger(__name__) @@ -66,7 +80,7 @@ def get_interface_ip(self, interface_model: str, interface_name: str, host: str Args: ---- interface_model (str): Interface model in the structured config (e.g., ethernet_interfaces). - interface_name (str): Interface name to retrive the IP. + interface_name (str): Interface name to retrieve the IP. host (str): Host to verify. Defaults to the host running the test. Returns: @@ -74,15 +88,16 @@ def get_interface_ip(self, interface_model: str, interface_name: str, host: str str | None: IP address of the host interface or None if unavailable. """ host_struct_cfg = self.config_manager.get_host_structured_config(host=host) if host else self.structured_config - try: - interfaces = get(host_struct_cfg, interface_model, required=True) - interface = get_item(interfaces, "name", interface_name, required=True) - return get(interface, "ip_address", required=True) - except AristaAvdMissingVariableError: + interfaces = get(host_struct_cfg, interface_model, default=[]) + interface = get_item(interfaces, "name", interface_name, default={}) + ip_address = get(interface, "ip_address") + if ip_address is None: log_msg = f"Host '{host or self.device_name}' interface '{interface_name}' IP address is unavailable. {self.__class__.__name__} is skipped." LOGGER.warning(log_msg) return None + return ip_address + def is_subinterface(self, interface: dict) -> bool: """Check if the interface is a subinterface. diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/errors/__init__.py b/ansible_collections/arista/avd/plugins/plugin_utils/errors/__init__.py deleted file mode 100644 index 230cb9beadd..00000000000 --- a/ansible_collections/arista/avd/plugins/plugin_utils/errors/__init__.py +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -from .errors import ( - AristaAvdDuplicateDataError, - AristaAvdError, - AristaAvdMissingVariableError, - AvdConversionWarning, - AvdDeprecationWarning, - AvdSchemaError, - AvdValidationError, -) - -__all__ = [ - "AristaAvdError", - "AristaAvdDuplicateDataError", - "AristaAvdMissingVariableError", - "AvdConversionWarning", - "AvdDeprecationWarning", - "AvdSchemaError", - "AvdValidationError", -] diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/merge/__init__.py b/ansible_collections/arista/avd/plugins/plugin_utils/merge/__init__.py index 5954c45bd19..5bc10f29346 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/merge/__init__.py +++ b/ansible_collections/arista/avd/plugins/plugin_utils/merge/__init__.py @@ -1,7 +1,7 @@ # Copyright (c) 2023-2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. -from .merge import merge + from .mergecatalog import merge_catalogs -__all__ = ["merge", "merge_catalogs"] +__all__ = ["merge_catalogs"] diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/merge/mergecatalog.py b/ansible_collections/arista/avd/plugins/plugin_utils/merge/mergecatalog.py index f595b5cada0..9439ea43176 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/merge/mergecatalog.py +++ b/ansible_collections/arista/avd/plugins/plugin_utils/merge/mergecatalog.py @@ -3,7 +3,21 @@ # that can be found in the LICENSE file. from __future__ import annotations -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError +from ansible.errors import AnsibleActionFail + +from ansible_collections.arista.avd.plugins.plugin_utils.pyavd_wrappers import RaiseOnUse + +PLUGIN_NAME = "arista.avd.eos_validate_state" + +try: + from pyavd._errors import AristaAvdError +except ImportError as e: + AristaAvdError = RaiseOnUse( + AnsibleActionFail( + f"The '{PLUGIN_NAME}' plugin requires the 'pyavd' Python library. Got import error", + orig_exc=e, + ) + ) try: from deepmerge import always_merger diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/password_utils/password.py b/ansible_collections/arista/avd/plugins/plugin_utils/password_utils/password.py deleted file mode 100644 index 7d1ff48bc0f..00000000000 --- a/ansible_collections/arista/avd/plugins/plugin_utils/password_utils/password.py +++ /dev/null @@ -1,238 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -""" -Used by Encrypt / Decrypt filters -""" -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError, AristaAvdMissingVariableError - -from .password_utils import cbc_decrypt, cbc_encrypt - - -def _validate_password_and_key(password: str, key: str) -> None: - """ - Validates the password and key values - - Raises AristaAvdMissingVariableError if one is missinge - Raises AristaAvdError if Password is not a string - """ - if not key: - raise AristaAvdMissingVariableError("Key is required for encryption") - - if not password: - raise AristaAvdMissingVariableError("Password is required for encryption") - - if not isinstance(password, str): - raise AristaAvdError(f"Password MUST be of type 'str' but is of type {type(password)}") - - -############## -# OSPF -############## -def ospf_simple_encrypt(password: str, key: str) -> str: - """ - Encrypt a password for OSPF simple authentication - - should be the interface name e.g. "Ethernet1" - - The key is transformed to : _passwd for simple authentication - - Returns the encrypted password as a string - """ - _validate_password_and_key(password, key) - - data = bytes(password, encoding="UTF-8") - key_b = bytes(f"{key}_passwd", encoding="UTF-8") - - return cbc_encrypt(key_b, data).decode() - - -def ospf_simple_decrypt(password: str, key: str) -> str: - """ - Decrypt a password for OSPF simple authentication - - should be the interface name e.g. "Ethernet1" - - The key is transformed to either: _passwd for simple authentication - - Returns the decrypted password as a string - - Raises AristaAvdError is decryption fails - """ - _validate_password_and_key(password, key) - - data = bytes(password, encoding="UTF-8") - key_b = bytes(f"{key}_passwd", encoding="UTF-8") - - try: - return cbc_decrypt(key_b, data).decode() - except Exception as exc: - raise AristaAvdError("OSPF password decryption failed - check the input parameters") from exc - - -OSPF_MESSAGE_DIGEST_HASH_ALGORITHMS = ["md5", "sha1", "sha256", "sha384", "sha512"] - - -def ospf_message_digest_encrypt(password: str, key: str, hash_algorithm: str = None, key_id: str = None) -> str: - """ - Encrypt a password for Message Digest Keys - - should be the interface name e.g. "Ethernet1" - MUST be in ["md5", "sha1", "sha256", "sha384", "sha512"] - MUST be set - - The key is transformed to either:: _Key_ for message digest keys - - Returns the encrypted password as a string - """ - _validate_password_and_key(password, key) - if hash_algorithm is None or key_id is None: - raise AristaAvdMissingVariableError("For OSPF message digest keys, both hash_algorithm and key_id are required") - if hash_algorithm not in OSPF_MESSAGE_DIGEST_HASH_ALGORITHMS: - raise AristaAvdError(f"For OSPF message digest keys, `hash_algorithm` must be in {OSPF_MESSAGE_DIGEST_HASH_ALGORITHMS}") - - data = bytes(password, encoding="UTF-8") - key_b = bytes(f"{key}_{hash_algorithm}Key_{key_id}", encoding="UTF-8") - - return cbc_encrypt(key_b, data).decode() - - -def ospf_message_digest_decrypt(password: str, key: str, hash_algorithm: str = None, key_id: str = None) -> str: - """ - Decrypt a password for Message Digest Keys - - should be the interface name e.g. "Ethernet1" - MUST be in ["md5", "sha1", "sha256", "sha384", "sha512"] - MUST be set - - The key is transformed to either:: _Key_ for message digest keys - - Returns the decrypted password as a string - - Raises AristaAvdError is decryption fails - """ - _validate_password_and_key(password, key) - if hash_algorithm is None or key_id is None: - raise AristaAvdMissingVariableError("For OSPF message digest keys, both hash_algorithm and key_id are required") - if hash_algorithm not in OSPF_MESSAGE_DIGEST_HASH_ALGORITHMS: - raise AristaAvdError(f"For OSPF message digest keys, `hash_algorithm` must be in {OSPF_MESSAGE_DIGEST_HASH_ALGORITHMS}") - - data = bytes(password, encoding="UTF-8") - key_b = bytes(f"{key}_{hash_algorithm}Key_{key_id}", encoding="UTF-8") - - try: - return cbc_decrypt(key_b, data).decode() - except Exception as exc: - raise AristaAvdError("OSPF password decryption failed - check the input parameters") from exc - - -############## -# BGP -############## -def bgp_encrypt(password: str, key) -> str: - """ - Encrypt a password. The key is either _passwd or _passwd - - Returns the encrypted password as a string - """ - _validate_password_and_key(password, key) - - data = bytes(password, encoding="UTF-8") - key = bytes(f"{key}_passwd", encoding="UTF-8") - - return cbc_encrypt(key, data).decode() - - -def bgp_decrypt(password: str, key) -> str: - """ - Decrypt a password. The key is either _passwd or _passwd - - Returns the decrypted password as a string - - Raises AristaAvdError is decryption fails - """ - _validate_password_and_key(password, key) - - data = bytes(password, encoding="UTF-8") - key = bytes(f"{key}_passwd", encoding="UTF-8") - - try: - return cbc_decrypt(key, data).decode() - except Exception as exc: - raise AristaAvdError("BGP password decryption failed - check the input parameters") from exc - - -############## -# ISIS -############## -_ISIS_MODE_MAP = { - "none": "noAuth", - "text": "clearText", - "md5": "md5", - "sha": "sha", - "sha-1": "sha_1", - "sha-224": "sha_224", - "sha-256": "sha_256", - "sha-384": "sha_384", - "sha-512": "sha_512", -} - - -def _validate_isis_args(password: str, key: str, mode: str): - if not password: - raise AristaAvdError("Password is required for encryption/decryption") - - if not isinstance(password, str): - raise AristaAvdError(f"Password MUST be of type 'str' but is of type {type(password)}") - - if not isinstance(key, str): - raise AristaAvdError(f"Key MUST be of type 'str' but is of type {type(key)}") - - if not isinstance(mode, str): - raise AristaAvdError(f"Mode MUST be a string with one of the following options: {list(_ISIS_MODE_MAP)}. Got '{mode}'.") - - if not mode: - raise AristaAvdError("Mode is required for encryption/decryption") - - -def _get_isis_key(key: str, mode: str) -> bytes: - return bytes(f"{key}_{_ISIS_MODE_MAP[mode]}", encoding="UTF-8") - - -def isis_encrypt(password: str, key: str, mode: str) -> str: - """ - Encrypt a password for ISIS authentication. - - Args: - password: Password as string - key: ISIS instance name as string. - mode: 'none', 'text', 'md5' or 'sha' or for shared-secret mode 'sha-1', 'sha-224', 'sha-256', 'sha-384', 'sha-512'. - - Returns the encrypted password as a string. - """ - _validate_isis_args(password, key, mode) - - data = bytes(password, encoding="UTF-8") - - return cbc_encrypt(_get_isis_key(key, mode), data).decode() - - -def isis_decrypt(password: str, key: str, mode: str) -> str: - """ - Decrypt a password for ISIS authentication. - - ISIS instance name. - 'none', 'text', 'md5' or 'sha' or for shared-secret mode 'sha-1', 'sha-224', 'sha-256', 'sha-384', 'sha-512'. - - Returns the decrypted password as a string. - - Raises AristaAvdError is decryption fails - """ - _validate_isis_args(password, key, mode) - - data = bytes(password, encoding="UTF-8") - - try: - return cbc_decrypt(_get_isis_key(key, mode), data).decode() - except Exception as exc: - raise AristaAvdError("ISIS password decryption failed - check the input parameters") from exc diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/pyavd_wrappers.py b/ansible_collections/arista/avd/plugins/plugin_utils/pyavd_wrappers.py new file mode 100644 index 00000000000..23c07d0f4fd --- /dev/null +++ b/ansible_collections/arista/avd/plugins/plugin_utils/pyavd_wrappers.py @@ -0,0 +1,68 @@ +# Copyright (c) 2019-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import absolute_import, annotations, division, print_function + +__metaclass__ = type + +import warnings +from functools import partial, wraps +from typing import Callable, Literal + +from ansible.errors import AnsibleFilterError, AnsibleInternalError, AnsibleTemplateError, AnsibleUndefinedVariable +from ansible.module_utils.basic import to_native +from ansible.utils.display import Display +from jinja2.exceptions import UndefinedError + +display = Display() + + +class RaiseOnUse: + """ + Class that will delay raises of errors until the instance is called. + + Used with Ansible try/except import logic to not fail on import of plugins, but instead fail on first use. + """ + + def __init__(self, exception: Exception): + self.exception = exception + + def __call__(self, *args, **kwargs): + raise self.exception + + +def wrap_plugin(plugin_type: Literal["filter", "test"], name: str) -> Callable: + plugin_map = { + "filter": AnsibleFilterError, + "test": AnsibleTemplateError, + } + + if plugin_type not in plugin_map: + raise AnsibleInternalError(f"Wrong plugin type {plugin_type} passed to wrap_plugin.") + + def wrap_plugin_decorator(func: Callable) -> Callable: + @wraps(func) + def plugin_wrapper(*args, **kwargs): + """Wrapper function for plugins. + + NOTE: if the same warning is raised multiple times, Ansible Display() will print only one + """ + try: + with warnings.catch_warnings(record=True) as w: + result = func(*args, **kwargs) + if w: + for warning in w: + display.warning(str(warning.message)) + return result + except UndefinedError as e: + raise AnsibleUndefinedVariable(f"{plugin_type.capitalize()} '{name}' failed: {to_native(e)}", orig_exc=e) from e + except Exception as e: + raise plugin_map[plugin_type](f"{plugin_type.capitalize()} '{name}' failed: {to_native(e)}", orig_exc=e) from e + + return plugin_wrapper + + return wrap_plugin_decorator + + +wrap_filter = partial(wrap_plugin, "filter") +wrap_test = partial(wrap_plugin, "test") diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/schema/MOVED_TO_PYAVD.txt b/ansible_collections/arista/avd/plugins/plugin_utils/schema/MOVED_TO_PYAVD.txt new file mode 100644 index 00000000000..7cc7294e0b7 --- /dev/null +++ b/ansible_collections/arista/avd/plugins/plugin_utils/schema/MOVED_TO_PYAVD.txt @@ -0,0 +1 @@ +The schema code and metaschema have been moved to PyAVD in the folder /python-avd/pyavd/_schema/ diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/schema/avdschemaresolver.py b/ansible_collections/arista/avd/plugins/plugin_utils/schema/avdschemaresolver.py deleted file mode 100644 index fe9ad133d59..00000000000 --- a/ansible_collections/arista/avd/plugins/plugin_utils/schema/avdschemaresolver.py +++ /dev/null @@ -1,105 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -from __future__ import absolute_import, annotations, division, print_function - -__metaclass__ = type - -from copy import deepcopy - -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError -from ansible_collections.arista.avd.plugins.plugin_utils.merge import merge -from ansible_collections.arista.avd.plugins.plugin_utils.schema.refresolver import create_refresolver - -try: - import jsonschema - import jsonschema._types - import jsonschema._validators - import jsonschema.protocols - import jsonschema.validators -except ImportError as imp_exc: - JSONSCHEMA_IMPORT_ERROR = imp_exc -else: - JSONSCHEMA_IMPORT_ERROR = None - - -def _keys(validator, keys: dict, resolved_schema: dict, schema: dict): - # Resolve the child schemas - for key, childschema in keys.items(): - if "$ref" in childschema: - _ref_on_child(validator, childschema["$ref"], resolved_schema["keys"][key]) - yield from validator.descend( - resolved_schema["keys"][key], - resolved_schema["keys"][key], - path=key, - schema_path=key, - ) - - -def _dynamic_keys(validator, dynamic_keys: dict, resolved_schema: dict, schema: dict): - # Resolve the child schemas - for key, childschema in dynamic_keys.items(): - if "$ref" in childschema: - _ref_on_child(validator, childschema["$ref"], resolved_schema["dynamic_keys"][key]) - yield from validator.descend( - resolved_schema["dynamic_keys"][key], - resolved_schema["dynamic_keys"][key], - path=key, - schema_path=key, - ) - - -def _items(validator, items: dict, resolved_schema: dict, schema: dict): - # Resolve the child schema - if "$ref" in items: - _ref_on_child(validator, items["$ref"], resolved_schema["items"]) - yield from validator.descend( - resolved_schema["items"], - resolved_schema["items"], - path=0, - schema_path=0, - ) - - -def _ref_on_child(validator, ref, child_schema: dict): - """ - This function resolves the $ref referenced schema, - then merges with any schema defined at the same level - - In place update of supplied child_schema - """ - scope, ref_schema = validator.resolver.resolve(ref) - ref_schema = deepcopy(ref_schema) - child_schema.pop("$ref", None) - merge(child_schema, ref_schema, same_key_strategy="use_existing") - # Resolve new refs inherited from the first ref. - if "$ref" in child_schema: - _ref_on_child(validator, child_schema["$ref"], child_schema) - - -class AvdSchemaResolver: - def __new__(cls, schema, store): - """ - AvdSchemaResolver is used to resolve $ref in AVD Schemas. - - It is used to generate full documentation covering all nested schemas. - - Since we return generators, we cannot also return the resolved schema. - Instead we use the "instance" in jsonschema - the variable normally holding - the data to be validated - called "resolved_schema" above. - The "resolved_schema" must contain a copy of the original schema, and then - the $ref resolver will merge in the resolved schema and do in-place update. - """ - if JSONSCHEMA_IMPORT_ERROR: - raise AristaAvdError('Python library "jsonschema" must be installed to use this plugin') from JSONSCHEMA_IMPORT_ERROR - - ValidatorClass = jsonschema.validators.create( - meta_schema=store["avd_meta_schema"], - validators={ - "items": _items, - "keys": _keys, - "dynamic_keys": _dynamic_keys, - }, - ) - - return ValidatorClass(schema, resolver=create_refresolver(schema, store)) diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/schema/avdschematools.py b/ansible_collections/arista/avd/plugins/plugin_utils/schema/avdschematools.py index 0611df2f462..f7d3c3d2f28 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/schema/avdschematools.py +++ b/ansible_collections/arista/avd/plugins/plugin_utils/schema/avdschematools.py @@ -8,8 +8,15 @@ from ansible.errors import AnsibleActionFail from ansible.utils.display import Display -from ansible_collections.arista.avd.plugins.plugin_utils.errors.errors import AvdDeprecationWarning -from ansible_collections.arista.avd.plugins.plugin_utils.schema.avdschema import AristaAvdError, AvdSchema +from ansible_collections.arista.avd.plugins.plugin_utils.pyavd_wrappers import RaiseOnUse + +try: + from pyavd._errors import AristaAvdError, AvdDeprecationWarning + from pyavd._schema.avdschema import AvdSchema +except ImportError as e: + AvdSchema = RaiseOnUse(AnsibleActionFail("The 'arista.avd' collection requires the 'pyavd' Python library. Got import error", orig_exc=e)) + AristaAvdError = AvdDeprecationWarning = ImportError + VALID_CONVERSION_MODES = ["disabled", "error", "warning", "info", "debug", "quiet"] DEFAULT_CONVERSION_MODE = "debug" diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/schema/avdtodocumentationschemaconverter.py b/ansible_collections/arista/avd/plugins/plugin_utils/schema/avdtodocumentationschemaconverter.py deleted file mode 100644 index b94dc6b2891..00000000000 --- a/ansible_collections/arista/avd/plugins/plugin_utils/schema/avdtodocumentationschemaconverter.py +++ /dev/null @@ -1,457 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -from __future__ import absolute_import, annotations, division, print_function - -__metaclass__ = type - -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError -from ansible_collections.arista.avd.plugins.plugin_utils.schema.avdschema import AvdSchema - -# The DEFAULT_TABLE value is only used a dummy value for unset "table" value. -DEFAULT_TABLE = "_default_table_value_if_not_set" - - -def get_deprecation(schema: dict) -> tuple[str, str]: - """ - Build deprecation details for documentation if deprecation is set on the schema element. - - This function is also imported into avdtojsonschemaconverter - - Returns - ------- - deprecation_label : str | None - If deprecated or removed this is "removed" or "deprecated". Should be added as label - on the key by the calling function. - deprecation : str | None - Deprecation or removal message which should be added to the key comment field by the calling function. - """ - if (deprecation := schema.get("deprecation")) is None: - return None, None - - if removed := deprecation.get("removed"): - removed_verb = "was" - state_verb = "was" - state = "removed" - else: - removed_verb = "will be" - state_verb = "is" - state = "deprecated" - - output = [f"This key {state_verb} {state}."] - - if (remove_in_version := deprecation.get("remove_in_version")) is not None: - output.append(f"Support {removed_verb} removed in AVD version {remove_in_version}.") - elif (remove_after_date := deprecation.get("remove_after_date")) is not None: - output.append(f"Support {removed_verb} removed in the first major AVD version released after {remove_after_date}.") - elif removed: - output.append(f"Support {removed_verb} removed in AVD.") - - if (new_key := deprecation.get("new_key")) is not None: - output.append(f"Use {new_key} instead.") - - if (url := deprecation.get("url")) is not None: - output.append(f"See [here]({url}) for details.") - - return state, " ".join(output) - - -class AvdToDocumentationSchemaConverter: - def __init__(self, avdschema: AvdSchema): - self._avdschema = avdschema - - def convert_schema_to_tables(self) -> dict: - """ - This converter will convert the schema to a dict of tables - - By default a table will be created per root-key, containing all keys below. - This default behaviors can be overridden by setting "documentation_options.table" - in the schema. See the schema documentation for details. - - Example: - { - "MyTable": { - "display_name": "MyTable", - "table": [{ - "variable": "foo", - "type": "List, Items: Dictionary", - },{ - "variable": " - bar", - "type": "String", - "required": "Yes, Unique", - "description": "Description of foo.bar", - }] - "yaml": ['foo:', " - bar: ""'] - } - } - """ - - # Get fully resolved schema (where all $ref has been expanded recursively) - schema = self._avdschema.resolved_schema - - built_tables = self.build_tables(schema=schema) - return {table["display_name"]: table for table in built_tables} - - def build_tables(self, schema: dict): - tables = self._get_tables(schema) - - # Skip the default table, since we want a unique table per root key if table is not set. - if DEFAULT_TABLE in tables: - tables.remove(DEFAULT_TABLE) - - output = [] - # Build tables for keys where "documentation_options.table" is set in their schema - for table in tables: - built_table = self.build_table(table=table, schema=schema) - # Only append if the table contain rows - if built_table["table"]: - output.append(built_table) - - # Build tables for all root keys if "documentation_options.table" is not set in their schema - schema_keys = self._get_keys(schema) - for key, childschema in schema_keys.items(): - table_schema = {"keys": {key: childschema}} - built_table = self.build_table(table=DEFAULT_TABLE, schema=table_schema) - # Only append if the table contain rows - if built_table["table"]: - output.append(built_table) - - return output - - def build_table(self, table: str, schema: dict): - built_table = {} - - if table == DEFAULT_TABLE: - # Single key table - main_key = list(schema["keys"].keys())[0] - built_table["display_name"] = str(main_key).lower().replace("_", "-") - else: - # Combined table - built_table["display_name"] = table - - schema_keys = self._get_keys(schema) - - built_table["table"] = [] - built_table["yaml"] = [] - for key, childschema in schema_keys.items(): - if table not in self._get_tables(childschema): - # Skip key if none of the underlying keys have the relevant table - continue - built_table["table"].extend( - self.build_table_row( - var_name=key, - schema=childschema, - indentation=0, - var_path=[], - table=table, - ) - ) - built_table["yaml"].extend(self.build_yaml_row(var_name=key, schema=childschema, indentation=0, table=table)) - - return built_table - - def build_table_row( - self, - var_name: str, - schema: dict, - indentation: int, - var_path: list, - table: str, - parent_schema: dict = None, - first_list_item_key: bool = False, - ): - output = [] - - row_indentation = " " * indentation - if first_list_item_key: - # Make an indentation of " " into " - " to show this is a list item in YAML format - row_indentation = f"{row_indentation[:-2]}- " - - row = {} - row["var_path"] = ".".join(var_path + [var_name]) - row["variable"] = f"{row_indentation}{var_name}" - row["type"] = self.type(schema) - required = self.required(schema, var_name, parent_schema) - if required is not None: - row["required"] = required - - default = self.default(schema) - if default is not None: - row["default"] = default - - restrictions = self.restrictions(schema) - if restrictions is not None: - row["restrictions"] = restrictions - - description = self.description(schema) - if description is not None: - row["description"] = description - - deprecation_label, deprecation = get_deprecation(schema) - if deprecation is not None: - row["deprecation_label"] = deprecation_label - row["deprecation"] = deprecation - - output.append(row) - - if schema.get("keys") or schema.get("dynamic_keys"): - output.extend(self.keys(schema, indentation, var_path + [var_name], table)) - elif schema.get("items"): - output.extend(self.items(schema, indentation, var_path + [var_name], table)) - - return output - - def build_yaml_row( - self, - var_name: str, - schema: dict, - indentation: int, - table: str, - first_list_item_key: bool = False, - ): - output = [] - - deprecation_label = get_deprecation(schema)[0] - if deprecation_label == "removed": - return output - - row_indentation = " " * indentation - if first_list_item_key: - # Make an indentation of " " into " - " to show this is a list item in YAML format - row_indentation = f"{row_indentation[:-2]}- " - - row = f"{row_indentation}{var_name}:" - var_type = schema.get("type") - - if var_type == "dict" and (schema_keys := self._get_keys(schema)) and not schema.get("documentation_options", {}).get("hide_keys"): - output.append(row) - for key, childschema in schema_keys.items(): - if table not in self._get_tables(childschema): - # Skip key if none of the underlying keys have the relevant table - continue - - rows = self.build_yaml_row( - var_name=key, - schema=childschema, - indentation=indentation + 2, - table=table, - ) - output.extend(rows) - elif var_type == "list" and (schema_items := schema.get("items")): - output.append(row) - schema_items_type = schema_items.get("type") - if schema_items_type == "dict" and "keys" in schema_items: - schema_primary_key = schema.get("primary_key") - schema_keys = self._get_keys(schema_items) - first = True - included_primary_key = False - for key, childschema in schema_keys.items(): - if table not in self._get_tables(childschema): - if key == schema_primary_key: - # Include the primary key even if it was not assigned to this table. - included_primary_key = True - else: - # Skip key if none of the underlying keys have the relevant table - continue - - rows = self.build_yaml_row( - var_name=key, - schema=childschema, - indentation=indentation + 4, - table=table, - first_list_item_key=first, - ) - output.extend(rows) - first = False - - if included_primary_key and len(output) == 1: - # return no rows if output only contains the included primary key - return [] - - else: - row_indentation = " " * indentation - row = f"{row_indentation} - <{schema_items_type}>" - output.append(row) - else: - row = f"{row} <{var_type}>" - output.append(row) - - return output - - def type(self, schema: dict): - if "$ref" in schema: - # TODO: Expand references and generate full documentation - # Add a guard for $ref in the other functions later. - return "$ref" - - type_converters = { - "str": "String", - "int": "Integer", - "bool": "Boolean", - "dict": "Dictionary", - "list": "List", - } - schema_type = schema.get("type") - if not schema_type: - raise AristaAvdError(f"'type' key not defined in schema: {schema}") - - output = type_converters.get(schema_type) - if not output: - raise AristaAvdError(f"Unknown 'type': {schema_type}") - - if schema_type == "list": - schema_items_type = schema.get("items", {}).get("type") - if not schema_items_type: - return output - items_type = type_converters.get(schema_items_type) - if not items_type: - return output - output = f"{output}, items: {items_type}" - - return output - - def keys(self, schema: dict, indentation: int, var_path: list, table: str): - output = [] - - if schema.get("documentation_options", {}).get("hide_keys"): - # Skip documenting the keys. - # Used for not including all of eos_cli_config_gen for structured_config keys. - return output - - schema_keys = self._get_keys(schema) - - for key, childschema in schema_keys.items(): - if table not in self._get_tables(childschema): - # Skip key if none of the underlying keys have the relevant table - continue - rows = self.build_table_row( - var_name=key, - schema=childschema, - indentation=indentation + 2, - var_path=var_path, - table=table, - parent_schema=schema, - ) - output.extend(rows) - return output - - def items(self, schema: dict, indentation: int, var_path: list, table: str): - output = [] - schema_items = schema.get("items", {}) - schema_primary_key = schema.get("primary_key") - schema_items_type = schema_items.get("type") - if schema_items_type == "dict": - schema_keys = self._get_keys(schema_items) - first = True - included_primary_key = False - for key, childschema in schema_keys.items(): - if table not in self._get_tables(childschema): - if key == schema_primary_key: - # Include the primary key even if it was not assigned to this table. - included_primary_key = True - else: - # Skip key if none of the underlying keys have the relevant table - continue - - rows = self.build_table_row( - var_name=key, - schema=childschema, - indentation=indentation + 4, - var_path=(var_path + ["[]"]), - table=table, - parent_schema=schema, - first_list_item_key=first, - ) - output.extend(rows) - first = False - - if included_primary_key and len(output) == 1: - # return no rows if output only contains the included primary key - return [] - - else: - output = self.build_table_row( - var_name=f"<{schema_items_type}>", - schema=schema_items, - indentation=indentation + 4, - var_path=(var_path + ["[]"]), - table=table, - parent_schema=schema, - first_list_item_key=True, - ) - return output - - def required(self, schema: dict, var_name: str, parent_schema: dict): - output = None - if parent_schema and parent_schema.get("primary_key") == var_name: - output = "Required, Unique" - elif schema.get("required"): - output = "Required" - return output - - def default(self, schema: dict): - return schema.get("default") - - def restrictions(self, schema: dict): - restrictions = [] - if schema.get("convert_to_lower_case"): - restrictions.append("Value is converted to lower case") - if schema.get("min") is not None: - restrictions.append(f"Min: {schema['min']}") - if schema.get("max") is not None: - restrictions.append(f"Max: {schema['max']}") - if schema.get("min_length") is not None: - restrictions.append(f"Min Length: {schema['min_length']}") - if schema.get("max_length") is not None: - restrictions.append(f"Max Length: {schema['max_length']}") - if schema.get("format") is not None: - restrictions.append(f"Format: {schema['format']}") - if schema.get("dynamic_valid_values") is not None: - schema.setdefault("valid_values", []) - valid_value = f"" - if valid_value not in schema["valid_values"]: - schema["valid_values"].append(valid_value) - if schema.get("valid_values") is not None: - restrictions.append("Valid Values:") - for valid_value in schema["valid_values"]: - restrictions.append(f"- {valid_value}") - if schema.get("pattern") is not None: - restrictions.append(f"Pattern: {schema['pattern']}") - - if restrictions: - return "
".join(restrictions) - return None - - def description(self, schema: dict): - if schema.get("description"): - return str(schema["description"]).replace("\n", "
") - return None - - def _get_tables(self, schema: dict, parent_table: str = DEFAULT_TABLE): - """ - Get list of tables recursively for this schema and all childschemas. - Handles inheritance by accepting the parent_table argument which will be used as the default table. - """ - table = schema.setdefault("documentation_options", {}).setdefault("table", parent_table) - tables = {table} - - if "keys" in schema: - for key, childschema in schema["keys"].items(): - tables.update(self._get_tables(childschema, parent_table=table)) - - if "dynamic_keys" in schema: - for key, childschema in schema["dynamic_keys"].items(): - tables.update(self._get_tables(childschema, parent_table=table)) - - if "items" in schema: - tables.update(self._get_tables(schema["items"], parent_table=table)) - - # Return sorted list of unique tables - return sorted(tables) - - def _get_keys(self, schema: dict): - # Return keys with dynamic keys first and regular keys last. - dynamic_keys = schema.get("dynamic_keys", {}) - keys = {f"<{dynamic_key}>": subschema for dynamic_key, subschema in dynamic_keys.items()} - keys.update(schema.get("keys", {})) - return keys diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/schema/default_schemas.py b/ansible_collections/arista/avd/plugins/plugin_utils/schema/default_schemas.py deleted file mode 100644 index 4c565f99214..00000000000 --- a/ansible_collections/arista/avd/plugins/plugin_utils/schema/default_schemas.py +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -from pathlib import Path - -collection_dir = Path(__file__).parents[3] -DEFAULT_SCHEMAS = { - "avd_meta_schema": collection_dir.joinpath("plugins", "plugin_utils", "schema", "avd_meta_schema.json"), - "eos_cli_config_gen": collection_dir.joinpath("roles", "eos_cli_config_gen", "schemas", "eos_cli_config_gen.schema.yml"), - "eos_designs": collection_dir.joinpath("roles", "eos_designs", "schemas", "eos_designs.schema.yml"), -} -DEFAULT_PICKLED_SCHEMAS = { - "avd_meta_schema": collection_dir.joinpath("plugins", "plugin_utils", "schema", "avd_meta_schema.pickle"), - "eos_cli_config_gen": collection_dir.joinpath("roles", "eos_cli_config_gen", "schemas", "eos_cli_config_gen.schema.pickle"), - "eos_designs": collection_dir.joinpath("roles", "eos_designs", "schemas", "eos_designs.schema.pickle"), -} diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/schema/refresolver.py b/ansible_collections/arista/avd/plugins/plugin_utils/schema/refresolver.py deleted file mode 100644 index 81189bb9cd0..00000000000 --- a/ansible_collections/arista/avd/plugins/plugin_utils/schema/refresolver.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError - -try: - import jsonschema - import jsonschema.validators -except ImportError as imp_exc: - JSONSCHEMA_IMPORT_ERROR = imp_exc -else: - JSONSCHEMA_IMPORT_ERROR = None - - -def create_refresolver(schema: dict, store: dict): - if JSONSCHEMA_IMPORT_ERROR: - raise AristaAvdError('Python library "jsonschema" must be installed to use this plugin') from JSONSCHEMA_IMPORT_ERROR - - return jsonschema.validators.RefResolver( - base_uri=schema.get("$id", ""), - referrer=schema, - store=store, - ) diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/schema/store.py b/ansible_collections/arista/avd/plugins/plugin_utils/schema/store.py deleted file mode 100644 index 8753ca94e71..00000000000 --- a/ansible_collections/arista/avd/plugins/plugin_utils/schema/store.py +++ /dev/null @@ -1,140 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -from copy import deepcopy -from functools import lru_cache -from hashlib import sha1 -from pickle import HIGHEST_PROTOCOL -from pickle import dump as pickle_dump -from pickle import load as pickle_load - -from yaml import safe_load - -from .avdschemaresolver import AvdSchemaResolver -from .default_schemas import DEFAULT_PICKLED_SCHEMAS, DEFAULT_SCHEMAS - - -@lru_cache -def create_store(load_from_yaml=False, force_rebuild=False) -> dict[str, dict]: - """ - Create and return a schema store which is a dict of all our schemas like - { - "avd_meta_schema": {...avd meta schema as dict...}, - "eos_cli_config_gen": {...schema as dict...}, - "eos_designs": {...schema as dict...}, - } - The function is cached to save time on multiple calls. - - If load_from_yaml is True it will read and return unresolved schemas from yml/json files. - - If force_rebuild is True or if this is the first time running AVD after changing schemas/upgrade/install - the schema yml/json files will be read, fully resolved, saved as pickle to a file and returned in the - store dict. - """ - store = {} - - # Load from YAML if set. This is used by the tool that creates the pickle. - if load_from_yaml: - return _create_store_from_yaml() - - # Recompile schemas if needed and store in pickles for next time. - elif force_rebuild or _should_recompile_schemas(): - return _compile_schemas() - - # Load from Pickle. - for id, schema_file in DEFAULT_PICKLED_SCHEMAS.items(): - with open(schema_file, "rb") as file: - store[id] = pickle_load(file) - - return store - - -def _should_recompile_schemas() -> bool: - """ - Returns true if pickled schemas should be recompiled - """ - # Check if any pickled schema is missing - for id, pickle_file in DEFAULT_PICKLED_SCHEMAS.items(): - if not pickle_file.exists(): - return True - - # Check if any hash file is missing and if any stored hash does not match the hash of the schema file - for id, schema_file in DEFAULT_SCHEMAS.items(): - hash_file = schema_file.with_suffix(".sha1") - if not hash_file.exists(): - return True - - existing_hash = hash_file.with_suffix(".sha1").read_text(encoding="UTF-8") - new_hash = sha1(schema_file.read_bytes(), usedforsecurity=False).hexdigest() - if existing_hash != new_hash: - return True - - return False - - -def _create_store_from_yaml() -> dict[str, dict]: - """ - Returns a schema store loaded from yaml/json files with $ref - """ - store = {} - for id, schema_file in DEFAULT_SCHEMAS.items(): - with open(schema_file, "r", encoding="UTF-8") as stream: - store[id] = safe_load(stream) - return store - - -def _compile_schemas() -> dict: - """ - Load schemas from yaml files, - create a temporary "store", - resolve all $refs and save the resulting schemas as pickles - """ - schema_store = _create_store_from_yaml() - - # We rely on eos_cli_config_gen being before eos_designs, - # so anything in eos_cli_config_gen can be resolved and $def popped before resolving from eos_designs. - for schema_name, pickle_file in DEFAULT_PICKLED_SCHEMAS.items(): - if schema_name == "avd_meta_schema": - # Do not resolve $ref in the meta schema. - resolved_schema = schema_store[schema_name] - else: - resolved_schema = _resolve_schema(schema_store[schema_name], schema_store) - - # Inplace update the schema store with the resolved variant without $def. - # This is needed so eos_designs will not resolve to a schema with another $ref. - schema_store[schema_name] = resolved_schema - - # Update pickle file with binary version of the completely resolved schema. - try: - with pickle_file.open("wb") as stream: - pickle_dump(resolved_schema, stream, HIGHEST_PROTOCOL) - - # Update the .sha1 file with the new hash of the yaml schema file. - schema_file = DEFAULT_SCHEMAS[schema_name] - new_hash = sha1(schema_file.read_bytes(), usedforsecurity=False).hexdigest() - schema_file.with_suffix(".sha1").write_text(new_hash, encoding="UTF-8") - except PermissionError: - # Ignoring PermissionError so we can operate in read-only environments - # (like "ansible-test units" containers). - pass - - return schema_store - - -def _resolve_schema(schema: dict, store: dict) -> dict: - """ - Get fully resolved schema (where all $ref has been expanded recursively) - .schemaresolver performs inplace update of the argument so we give it a copy of the existing schema. - """ - resolved_schema = deepcopy(schema) - schemaresolver = AvdSchemaResolver(resolved_schema, store) - resolve_errors = schemaresolver.iter_errors(resolved_schema) - for resolve_error in resolve_errors: - if isinstance(resolve_error, Exception): - # TODO: Raise multiple errors or abstract them - raise resolve_error - - # Since the schema is now fully resolved we can drop the $defs. - resolved_schema.pop("$defs", None) - - return resolved_schema diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/utils/__init__.py b/ansible_collections/arista/avd/plugins/plugin_utils/utils/__init__.py index 7c1f425cde3..5a6120dbaef 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/utils/__init__.py +++ b/ansible_collections/arista/avd/plugins/plugin_utils/utils/__init__.py @@ -1,51 +1,28 @@ # Copyright (c) 2023-2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. -from .append_if_not_duplicate import append_if_not_duplicate -from .batch import batch -from .compare_dicts import compare_dicts +from ansible_collections.arista.avd.plugins.plugin_utils.pyavd_wrappers import RaiseOnUse + from .compile_searchpath import compile_searchpath from .cprofile_decorator import cprofile -from .default import default -from .get import get -from .get_all import get_all, get_all_with_path -from .get_indices_of_duplicate_items import get_indices_of_duplicate_items -from .get_ip_from_pool import get_ip_from_pool -from .get_item import get_item from .get_templar import get_templar from .get_validated_path import get_validated_path from .get_validated_value import get_validated_value -from .groupby import groupby -from .load_python_class import load_python_class from .log_message import log_message from .python_to_ansible_logging_handler import PythonToAnsibleContextFilter, PythonToAnsibleHandler -from .replace_or_append_item import replace_or_append_item -from .template import template -from .template_var import template_var -from .unique import unique from .yaml_dumper import NoAliasDumper, YamlDumper from .yaml_loader import YamlLoader +# TODO: AVD5.0.0 Some utils are exposed in custom modules code, so we will need to keep it here until 5.0 +try: + from pyavd._utils import get, template, template_var +except ImportError as e: + get = template = template_var = RaiseOnUse(ImportError(f"The 'arista.avd' collection requires the 'pyavd' Python library. Got import error {e}")) + __all__ = [ - "append_if_not_duplicate", - "batch", - "compare_dicts", "compile_searchpath", - "default", - "get", - "get_all", - "get_all_with_path", - "get_indices_of_duplicate_items", - "get_ip_from_pool", - "get_item", "get_templar", - "groupby", - "load_python_class", "log_message", - "replace_or_append_item", - "template", - "template_var", - "unique", "PythonToAnsibleContextFilter", "PythonToAnsibleHandler", "NoAliasDumper", @@ -54,4 +31,7 @@ "cprofile", "YamlDumper", "YamlLoader", + "get", + "template", + "template_var", ] diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/utils/get.py b/ansible_collections/arista/avd/plugins/plugin_utils/utils/get.py deleted file mode 100644 index c8609d9fa07..00000000000 --- a/ansible_collections/arista/avd/plugins/plugin_utils/utils/get.py +++ /dev/null @@ -1,53 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdMissingVariableError - - -def get(dictionary, key, default=None, required=False, org_key=None, separator="."): - """ - Get a value from a dictionary or nested dictionaries. - - Key supports dot-notation like "foo.bar" to do deeper lookups. - Returns the supplied default value or None if the key is not found and required is False. - - Parameters - ---------- - dictionary : dict - Dictionary to get key from - key : str - Dictionary Key - supporting dot-notation for nested dictionaries - default : any - Default value returned if the key is not found - required : bool - Fail if the key is not found - org_key : str - Internal variable used for raising exception with the full key name even when called recursively - separator: str - String to use as the separator parameter in the split function. Useful in cases when the key - can contain variables with "." inside (e.g. hostnames) - - Returns - ------- - any - Value or default value - - Raises - ------ - AristaAvdMissingVariableError - If the key is not found and required == True - """ - - if org_key is None: - org_key = key - keys = str(key).split(separator) - value = dictionary.get(keys[0]) - if value is None: - if required is True: - raise AristaAvdMissingVariableError(org_key) - return default - else: - if len(keys) > 1: - return get(value, separator.join(keys[1:]), default=default, required=required, org_key=org_key, separator=separator) - else: - return value diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/utils/log_message.py b/ansible_collections/arista/avd/plugins/plugin_utils/utils/log_message.py index c17b3816bdf..8f08113e395 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/utils/log_message.py +++ b/ansible_collections/arista/avd/plugins/plugin_utils/utils/log_message.py @@ -6,8 +6,6 @@ import logging from typing import Any -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError - LOGGER = logging.getLogger(__name__) LOGGING_LEVELS = ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"] @@ -36,7 +34,7 @@ def log_message( """ # Validate logging level if log_level.upper() not in LOGGING_LEVELS: - raise AristaAvdError("Invalid logging level. Please choose from DEBUG, INFO, WARNING, ERROR, CRITICAL.") + raise ValueError("Invalid logging level. Please choose from DEBUG, INFO, WARNING, ERROR, CRITICAL.") dot_notation = f"{key_path}.{key}" if key_path else f"{key}" msg_type = "is missing" if not value else f"!= '{value}'" diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/utils/python_to_ansible_logging_handler.py b/ansible_collections/arista/avd/plugins/plugin_utils/utils/python_to_ansible_logging_handler.py index ca70436e164..c4f975f64ac 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/utils/python_to_ansible_logging_handler.py +++ b/ansible_collections/arista/avd/plugins/plugin_utils/utils/python_to_ansible_logging_handler.py @@ -22,8 +22,7 @@ class PythonToAnsibleHandler(Handler): * send WARNING logs to result["warning"] for the plugins that will be display in the logs * send INFO logs to display.v which can be visualized using `-v` in the ansible-playbook argument provided the logger level is set to INFO or above - * send DEBUG logs to display.v which can be visualized in the debug logs of ansible provided the - logger level is set to INFO or above + * send DEBUG logs to display.vvv which can be visualized when running a playbook with `-vvv` """ def __init__(self, result: dict, display: Display) -> None: @@ -45,7 +44,7 @@ def emit(self, record: LogRecord) -> None: elif record.levelno == logging.INFO: self.display.v(str(message)) elif record.levelno == logging.DEBUG: - self.display.debug(str(message)) + self.display.vvv(str(message)) def _format_msg(self, record: LogRecord) -> str: """ diff --git a/ansible_collections/arista/avd/plugins/test/contains.py b/ansible_collections/arista/avd/plugins/test/contains.py index c7ae7cc8a78..915a6377855 100644 --- a/ansible_collections/arista/avd/plugins/test/contains.py +++ b/ansible_collections/arista/avd/plugins/test/contains.py @@ -24,7 +24,22 @@ __metaclass__ = type -from jinja2.runtime import Undefined +from ansible.errors import AnsibleTemplateError + +from ansible_collections.arista.avd.plugins.plugin_utils.pyavd_wrappers import RaiseOnUse, wrap_test + +PLUGIN_NAME = "arista.avd.contains" + +try: + from pyavd.j2tests.contains import contains +except ImportError as e: + contains = RaiseOnUse( + AnsibleTemplateError( + f"The '{PLUGIN_NAME}' plugin requires the 'pyavd' Python library. Got import error", + orig_exc=e, + ) + ) + DOCUMENTATION = r""" --- @@ -66,53 +81,6 @@ """ -def contains(value, test_value=None): - """ - contains - Ansible test plugin to test if a list contains one or more elements - - Arista.avd.contains will test value and argument if defined and is not none and return false if any one them doesn't pass. - Test value can be one value or a list of values to test for. - - Example: - 1. Test for one element in list - {% if switch.vlans is arista.avd.contains(123) %} - ... - {% endif %} - 2. Test for multiple elements in list - {% if switch.vlans is arista.avd.contains([123, 456]) %} - ... - {% endif %} - - Parameters - ---------- - value : any - List to test - test_value : single item or list of items - Value(s) to test for in value - - Returns - ------- - boolean - True if variable matches criteria, False in other cases. - """ - if isinstance(value, Undefined) or value is None or not isinstance(value, list): - # Invalid value - return false - return False - elif isinstance(test_value, Undefined) or value is None: - # Invalid value - return false - return False - elif isinstance(test_value, list) and not set(value).isdisjoint(test_value): - # test_value is list so test if value and test_value has any common items - return True - elif test_value in value: - # Test if test_value is in value - return True - else: - return False - - class TestModule(object): def tests(self): - return { - "contains": contains, - } + return {"contains": wrap_test(PLUGIN_NAME)(contains)} diff --git a/ansible_collections/arista/avd/plugins/test/defined.py b/ansible_collections/arista/avd/plugins/test/defined.py index d4e6c0b73ce..7067247eec6 100644 --- a/ansible_collections/arista/avd/plugins/test/defined.py +++ b/ansible_collections/arista/avd/plugins/test/defined.py @@ -25,9 +25,22 @@ __metaclass__ = type -from ansible.errors import AnsibleError -from ansible.utils.display import Display -from jinja2.runtime import Undefined +from ansible.errors import AnsibleTemplateError + +from ansible_collections.arista.avd.plugins.plugin_utils.pyavd_wrappers import RaiseOnUse, wrap_test + +PLUGIN_NAME = "arista.avd.defined" + +try: + from pyavd.j2tests.defined import defined +except ImportError as e: + defined = RaiseOnUse( + AnsibleTemplateError( + f"The '{PLUGIN_NAME}' plugin requires the 'pyavd' Python library. Got import error", + orig_exc=e, + ) + ) + DOCUMENTATION = r""" --- @@ -84,106 +97,6 @@ """ -def defined(value, test_value=None, var_type=None, fail_action=None, var_name=None, run_tests=False): - """ - defined - Ansible test plugin to test if a variable is defined and not none - - Arista.avd.defined will test value if defined and is not none and return true or false. - If test_value is supplied, the value must also pass == test_value to return true. - If var_type is supplied, the value must also be of the specified class/type - If fail_action is 'warning' a warning will be emitted on failure. - If fail_action is 'error' an error will be emitted on failure and the task will fail. - If var_name is supplied it will be used in the warning and error messages to ease troubleshooting. - - Examples: - 1. Test if var is defined and not none: - {% if spanning_tree is arista.avd.defined %} - ... - {% endif %} - - 2. Test if variable is defined, not none and has value "something" - {% if extremely_long_variable_name is arista.avd.defined("something") %} - ... - {% endif %} - - 3. Test if variable is defined and of not print a warning message with the variable name - {% if my_dict.my_list[12].my_var is arista.avd.defined(fail_action='warning', var_name='my_dict.my_list[12].my_var' %} - - Parameters - ---------- - value : any - Value to test from ansible - test_value : any, optional - Value to test in addition of defined and not none, by default None - var_type : ['float', 'int', 'str', 'list', 'dict', 'tuple', 'bool'], optional - Type or Class to test for - fail_action : ['warning', 'error'], optional - Optional action if test fails to emit a Warning or Error - var_name : , optional - Optional string to use as variable name in warning or error messages - - Returns - ------- - boolean - True if variable matches criteria, False in other cases. - """ - display = Display() - if isinstance(value, Undefined) or value is None: - # Invalid value - return false - if str(fail_action).lower() == "warning": - display._warns = {} - if var_name is not None: - display.warning(f"{var_name} was expected but not set. Output may be incorrect or incomplete!") - else: - display.warning("A variable was expected but not set. Output may be incorrect or incomplete!") - elif str(fail_action).lower() == "error": - if var_name is not None: - raise AnsibleError(f"{var_name} was expected but not set!") - else: - raise AnsibleError("A variable was expected but not set!") - if run_tests: - return False, display._warns - return False - - elif test_value is not None and value != test_value: - # Valid value but not matching the optional argument - if str(fail_action).lower() == "warning": - display._warns = {} - if var_name is not None: - display.warning(f"{var_name} was set to {value} but we expected {test_value}. Output may be incorrect or incomplete!") - else: - display.warning(f"A variable was set to {value} but we expected {test_value}. Output may be incorrect or incomplete!") - elif str(fail_action).lower() == "error": - if var_name is not None: - raise AnsibleError(f"{var_name} was set to {value} but we expected {test_value}!") - else: - raise AnsibleError(f"A variable was set to {value} but we expected {test_value}!") - if run_tests: - return False, display._warns - return False - elif str(var_type).lower() in ["float", "int", "str", "list", "dict", "tuple", "bool"] and str(var_type).lower() != type(value).__name__: - # Invalid class - return false - if str(fail_action).lower() == "warning": - display._warns = {} - if var_name is not None: - display.warning(f"{var_name} was a {type(value).__name__} but we expected a {str(var_type).lower()}. Output may be incorrect or incomplete!") - else: - display.warning(f"A variable was a {type(value).__name__} but we expected a {str(var_type).lower()}. Output may be incorrect or incomplete!") - elif str(fail_action).lower() == "error": - if var_name is not None: - raise AnsibleError(f"{var_name} was a {type(value).__name__} but we expected a {str(var_type).lower()}!") - else: - raise AnsibleError(f"A variable was a {type(value).__name__} but we expected a {str(var_type).lower()}!") - if run_tests: - return False, display._warns - return False - else: - # Valid value and is matching optional argument if provided - return true - return True - - class TestModule(object): def tests(self): - return { - "defined": defined, - } + return {"defined": wrap_test(PLUGIN_NAME)(defined)} diff --git a/ansible_collections/arista/avd/pylintrc b/ansible_collections/arista/avd/pylintrc new file mode 100644 index 00000000000..90361c656f2 --- /dev/null +++ b/ansible_collections/arista/avd/pylintrc @@ -0,0 +1,126 @@ +# Configuration applied to collection by ansible-test +# https://github.com/ansible/ansible/blob/devel/test/lib/ansible_test/_data/sanity/pylint/config/collection.cfg + +[MESSAGES CONTROL] +disable= + abstract-method, + access-member-before-definition, + arguments-differ, + assignment-from-no-return, + assignment-from-none, + attribute-defined-outside-init, + bad-indentation, + bad-mcs-classmethod-argument, + broad-except, + c-extension-no-member, + cell-var-from-loop, + chained-comparison, + comparison-with-callable, + consider-iterating-dictionary, + consider-merging-isinstance, + consider-using-dict-comprehension, + consider-using-enumerate, + consider-using-get, + consider-using-in, + consider-using-set-comprehension, + consider-using-ternary, + deprecated-method, + deprecated-module, + eval-used, + exec-used, + expression-not-assigned, + fixme, + function-redefined, + global-statement, + global-variable-undefined, + import-error, + import-self, + inconsistent-return-statements, + invalid-envvar-default, + invalid-name, + invalid-sequence-index, + keyword-arg-before-vararg, + len-as-condition, + line-too-long, + literal-comparison, + locally-disabled, + method-hidden, + missing-docstring, + no-else-raise, + no-else-return, + no-member, + no-name-in-module, + no-value-for-parameter, + non-iterator-returned, + not-a-mapping, + not-an-iterable, + not-callable, + pointless-statement, + pointless-string-statement, + possibly-unused-variable, + protected-access, + redefined-argument-from-local, + redefined-builtin, + redefined-outer-name, + reimported, + relative-beyond-top-level, # https://github.com/PyCQA/pylint/issues/2967 + signature-differs, + simplifiable-if-expression, + simplifiable-if-statement, + subprocess-popen-preexec-fn, + super-init-not-called, + superfluous-parens, + too-few-public-methods, + too-many-ancestors, + too-many-arguments, + too-many-boolean-expressions, + too-many-branches, + too-many-function-args, + too-many-instance-attributes, + too-many-lines, + too-many-locals, + too-many-nested-blocks, + too-many-public-methods, + too-many-return-statements, + too-many-statements, + trailing-comma-tuple, + trailing-comma-tuple, + try-except-raise, + unbalanced-tuple-unpacking, + undefined-loop-variable, + unexpected-keyword-arg, + ungrouped-imports, + unidiomatic-typecheck, + unnecessary-pass, + unsubscriptable-object, + unsupported-assignment-operation, + unsupported-delete-operation, + unsupported-membership-test, + unused-argument, + unused-import, + unused-variable, + used-before-assignment, + useless-object-inheritance, + useless-return, + useless-super-delegation, + wrong-import-order, + wrong-import-position, + +[BASIC] +bad-names=foo, + bar, + baz, + toto, + tutu, + tata, + _, + +good-names=i, + j, + k, + ex, + Run, + +[TYPECHECK] +ignored-modules= + _MovedItems, diff --git a/ansible_collections/arista/avd/requirements-dev.txt b/ansible_collections/arista/avd/requirements-dev.txt index dea140e444e..f414cb2c473 100644 --- a/ansible_collections/arista/avd/requirements-dev.txt +++ b/ansible_collections/arista/avd/requirements-dev.txt @@ -1,23 +1,30 @@ -ansible-core>=2.14.0,<2.17.0 -ansible-lint>=6.21.0 +# Installing PyAVD as editable install. +# Providing config-settings in a requirements file is only supported by very recent pip versions. +# The editable_mode=compat is required for pylance to work correctly. +# The path is relative to the root of the repo, so this only works when executed from there. +-e python-avd --config-settings editable_mode=compat +ansible-core>=2.15.0,<2.18.0 +ansible-lint>=6.21.0,<24.5.0 +codespell>=2.2.6 pycodestyle flake8 -pylint>=2.16.1 +# Hitting various pylint bugs for 'possibly-used-before-assignment' introduced in 3.2.0 +pylint>=2.16.1,<3.2.0 twine pre-commit>=3.2.0 pre-commit-hooks>=3.3.0 identify>=1.4.20 -docker +docker>=7.1.0 molecule>=6.0 molecule-plugins[docker]>=23.4.0 yamllint treelib>=1.5.5 -md-toc>=7.1.0 natsort -jsonschema>=4.5.1,<4.18 +jsonschema>=4.10.3 +referencing>=0.35.0 deepmerge>=1.1.0 isort==5.13.2 -black==24.3.0 +black==24.4.2 ansible-doc-extractor>=0.1.10 tox pydantic>=2.3.0 diff --git a/ansible_collections/arista/avd/requirements.txt b/ansible_collections/arista/avd/requirements.txt index 1aa8d7ca6ec..c11d26acd08 100644 --- a/ansible_collections/arista/avd/requirements.txt +++ b/ansible_collections/arista/avd/requirements.txt @@ -1,13 +1,3 @@ -netaddr>=0.7.19 -Jinja2>=3.0.0 -treelib>=1.5.5 -cvprac>=1.3.1 -jsonschema>=4.5.1,<4.18 -requests>=2.27.0 -PyYAML>=6.0.0 -md-toc>=7.1.0 -deepmerge>=1.1.0 -cryptography>=38.0.4 -# No anta requirement until the eos_validate_state integration is out of preview. -# anta>=1.0.0 -aristaproto>=0.1.1 +# PyAVD must follow the exact same version as the Ansible collection. +# For development this should be installed as an editable install as specified in requirement-dev.txt +pyavd[ansible-collection]==4.10.0-dev0 diff --git a/ansible_collections/arista/avd/roles/cv_deploy/README.md b/ansible_collections/arista/avd/roles/cv_deploy/README.md index 562ad14f059..145b572d5d4 100644 --- a/ansible_collections/arista/avd/roles/cv_deploy/README.md +++ b/ansible_collections/arista/avd/roles/cv_deploy/README.md @@ -28,9 +28,29 @@ The available identification depends on the configured AVD variables. The API to CloudVision is using gRPC over encrypted HTTP/2. +!!! Note + + Please note that in case of using CVaaS, the correct regional URL where the CVaaS tenant is deployed must be used + for the `cv_server` var. The following are the cluster URLs used in production: + + | Region | URL | + |--------|-----| + | United States 1a | `www.arista.io` | + | United States 1b | `www.cv-prod-us-central1-b.arista.io`| + | United States 1c | `www.cv-prod-us-central1-c.arista.io`| + | Canada | `www.cv-prod-na-northeast1-b.arista.io` | + | Europe West 2| `www.cv-prod-euwest-2.arista.io` | + | Japan| `www.cv-prod-apnortheast-1.arista.io` | + | Australia | `www.cv-prod-ausoutheast-1.arista.io` | + | United Kingdon | `www.cv-prod-uk-1.arista.io` | + +!!! Warning + + URLs without `www` are not supported. + ## Limitations -- It is not possible to authenticate with username/password. +- It is not possible to authenticate with username/password. See the [instructions below](#steps-to-create-service-accounts-on-cloudvision) on how to create a service account on CloudVision. - Configuration deployment is based on the "Static Configuration Studio" which is still a Beta feature on CloudVision. - This role is **only** supported on **CloudVision as a Service (CVaaS)** or "on-prem" **CloudVision 2024.1.0** or later. - Make sure to enable "Studios - End-to-End Provisioning" under Settings, Features. @@ -235,6 +255,27 @@ roles/cv_deploy/defaults/main/directories.yml --8<-- ``` +## Steps to create service accounts on CloudVision + +1. Go to Settings and Tools --> Access Control --> Service Accounts --> click `+ New Service Account` + +```text +Account name: AVD +Description: "Automation with AVD" +Give a description under "Generated Service Account Token" +Specify the "valid until" date. +Make sure to copy the generated password. You only get view it once. +Click "Save" to exit the dialogue box. +``` + +![Figure: 1](../../media/serviceaccount1.png) +![Figure: 2](../../media/serviceaccount2.png) +![Figure: 3](../../media/serviceaccount3.png) + +!!! note + The name of the service account must match a username configured to be authorized on + EOS, otherwise device interactive API calls might fail due to authorization denial. + ## License Project is published under [Apache 2.0 License](../../LICENSE) diff --git a/ansible_collections/arista/avd/roles/cvp_configlet_upload/README.md b/ansible_collections/arista/avd/roles/cvp_configlet_upload/README.md index 84612ce8d5b..99f0c837b32 100644 --- a/ansible_collections/arista/avd/roles/cvp_configlet_upload/README.md +++ b/ansible_collections/arista/avd/roles/cvp_configlet_upload/README.md @@ -62,7 +62,7 @@ For complete list of authentication options available with CloudVision Ansible c - **`configlet_directory`**: Folder where local configlets are stored. Default: `configlets`. - **`file_extension`**: File extension to look for configlet in their local folder. Default: `conf`. - **`configlets_cvp_prefix`**: Prefix to use for configlet on CV side. Default: *Not set* and it's required. -- **`execute_tasks`**: `true` / `false`. Support automatically excuting pending tasks. Default: `false`. +- **`execute_tasks`**: `true` / `false`. Support automatically executing pending tasks. Default: `false`. - **`cv_collection`**: Version of CloudVision collection to use. Can be `v1` or `v3`. Default is `v3`. *Example*: @@ -101,7 +101,7 @@ ansible-playbook playbook.to.deploy.with.cvp.yml --tags "provision" ## Requirements -Requirements are located here: [avd-requirements](../../README.md#Requirements) +Requirements are located here: [avd-requirements](../../docs/installation/collection-installation.md#additional-python-libraries-required) ## License diff --git a/ansible_collections/arista/avd/roles/dhcp_provisioner/README.md b/ansible_collections/arista/avd/roles/dhcp_provisioner/README.md index 9748eb77ee6..59b9fa854ad 100644 --- a/ansible_collections/arista/avd/roles/dhcp_provisioner/README.md +++ b/ansible_collections/arista/avd/roles/dhcp_provisioner/README.md @@ -128,7 +128,7 @@ custom_structured_configuration_daemon_terminattr: ## Requirements -Requirements are located here: [avd-requirements](../../README.md#Requirements) +Requirements are located here: [avd-requirements](../../docs/installation/collection-installation.md#additional-python-libraries-required) ## License diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/input-variables.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/input-variables.md index cf5faf3ca6d..dcd71896859 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/input-variables.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/input-variables.md @@ -363,10 +363,16 @@ roles/eos_cli_config_gen/docs/tables/port-channel-interfaces.md roles/eos_cli_config_gen/docs/tables/switchport-default.md --8<-- +### Switchport port security + +--8<-- +roles/eos_cli_config_gen/docs/tables/switchport-port-security.md +--8<-- + ### Transceiver QSFP default mode 4x10 --8<-- -transceiver-qsfp-default-mode-4x10.md +roles/eos_cli_config_gen/docs/tables/transceiver-qsfp-default-mode-4x10.md --8<-- ### Tunnel interfaces @@ -815,6 +821,12 @@ roles/eos_cli_config_gen/docs/tables/ip-routing.md roles/eos_cli_config_gen/docs/tables/ip-virtual-router-mac-address.md --8<-- +### IPv6 DHCP relay + +--8<-- +roles/eos_cli_config_gen/docs/tables/ipv6-dhcp-relay.md +--8<-- + ### IPv6 ICMP redirects --8<-- @@ -943,6 +955,12 @@ roles/eos_cli_config_gen/docs/tables/vrfs.md roles/eos_cli_config_gen/docs/tables/ip-security.md --8<-- +### Router segment-security + +--8<-- +roles/eos_cli_config_gen/docs/tables/router-segment-security.md +--8<-- + ## Switching ### MLAG configuration diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/aaa-accounting.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/aaa-accounting.md index 835a15f8951..9a3d9cd1ac5 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/aaa-accounting.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/aaa-accounting.md @@ -11,30 +11,30 @@ | [  exec](## "aaa_accounting.exec") | Dictionary | | | | | | [    console](## "aaa_accounting.exec.console") | Dictionary | | | | | | [      type](## "aaa_accounting.exec.console.type") | String | | | Valid Values:
- none
- start-stop
- stop-only | | - | [      group](## "aaa_accounting.exec.console.group") | String | | | | Group Name | + | [      group](## "aaa_accounting.exec.console.group") | String | | | | Group Name. | | [      logging](## "aaa_accounting.exec.console.logging") | Boolean | | | | | | [    default](## "aaa_accounting.exec.default") | Dictionary | | | | | | [      type](## "aaa_accounting.exec.default.type") | String | | | Valid Values:
- none
- start-stop
- stop-only | | - | [      group](## "aaa_accounting.exec.default.group") | String | | | | Group Name | + | [      group](## "aaa_accounting.exec.default.group") | String | | | | Group Name. | | [      logging](## "aaa_accounting.exec.default.logging") | Boolean | | | | | | [  system](## "aaa_accounting.system") | Dictionary | | | | | | [    default](## "aaa_accounting.system.default") | Dictionary | | | | | | [      type](## "aaa_accounting.system.default.type") | String | | | Valid Values:
- none
- start-stop
- stop-only | | - | [      group](## "aaa_accounting.system.default.group") | String | | | | Group Name | + | [      group](## "aaa_accounting.system.default.group") | String | | | | Group Name. | | [  dot1x](## "aaa_accounting.dot1x") | Dictionary | | | | | | [    default](## "aaa_accounting.dot1x.default") | Dictionary | | | | | | [      type](## "aaa_accounting.dot1x.default.type") | String | | | Valid Values:
- start-stop
- stop-only | | - | [      group](## "aaa_accounting.dot1x.default.group") | String | | | | Group Name | + | [      group](## "aaa_accounting.dot1x.default.group") | String | | | | Group Name. | | [  commands](## "aaa_accounting.commands") | Dictionary | | | | | | [    console](## "aaa_accounting.commands.console") | List, items: Dictionary | | | | | - | [      - commands](## "aaa_accounting.commands.console.[].commands") | String | | | | Privelege level 'all' or 0-15 | + | [      - commands](## "aaa_accounting.commands.console.[].commands") | String | | | | Privilege level 'all' or 0-15. | | [        type](## "aaa_accounting.commands.console.[].type") | String | | | Valid Values:
- none
- start-stop
- stop-only | | - | [        group](## "aaa_accounting.commands.console.[].group") | String | | | | Group Name | + | [        group](## "aaa_accounting.commands.console.[].group") | String | | | | Group Name. | | [        logging](## "aaa_accounting.commands.console.[].logging") | Boolean | | | | | | [    default](## "aaa_accounting.commands.default") | List, items: Dictionary | | | | | - | [      - commands](## "aaa_accounting.commands.default.[].commands") | String | | | | Privelege level 'all' or 0-15 | + | [      - commands](## "aaa_accounting.commands.default.[].commands") | String | | | | Privilege level 'all' or 0-15. | | [        type](## "aaa_accounting.commands.default.[].type") | String | | | Valid Values:
- none
- start-stop
- stop-only | | - | [        group](## "aaa_accounting.commands.default.[].group") | String | | | | Group Name | + | [        group](## "aaa_accounting.commands.default.[].group") | String | | | | Group Name. | | [        logging](## "aaa_accounting.commands.default.[].logging") | Boolean | | | | | === "YAML" @@ -45,44 +45,44 @@ console: type: - # Group Name + # Group Name. group: logging: default: type: - # Group Name + # Group Name. group: logging: system: default: type: - # Group Name + # Group Name. group: dot1x: default: type: - # Group Name + # Group Name. group: commands: console: - # Privelege level 'all' or 0-15 + # Privilege level 'all' or 0-15. - commands: type: - # Group Name + # Group Name. group: logging: default: - # Privelege level 'all' or 0-15 + # Privilege level 'all' or 0-15. - commands: type: - # Group Name + # Group Name. group: logging: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/aaa-authorization.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/aaa-authorization.md index 3d3aeac7037..cce23d76822 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/aaa-authorization.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/aaa-authorization.md @@ -20,7 +20,7 @@ | [  commands](## "aaa_authorization.commands") | Dictionary | | | | | | [    all_default](## "aaa_authorization.commands.all_default") | String | | | | Command authorization method(s) as a string.
Examples:
- "group tacacs+ local"
- "group MYGROUP none"
- "group tacacs+ group MYGROUP local
| | [    privilege](## "aaa_authorization.commands.privilege") | List, items: Dictionary | | | | | - | [      - level](## "aaa_authorization.commands.privilege.[].level") | String | | | | Privilege level(s) 0-15 | + | [      - level](## "aaa_authorization.commands.privilege.[].level") | String | | | | Privilege level(s) 0-15. | | [        default](## "aaa_authorization.commands.privilege.[].default") | String | | | | Command authorization method(s) as a string.
Examples:
- "group tacacs+ local"
- "group MYGROUP none"
- "group tacacs+ group MYGROUP local"
| === "YAML" @@ -52,7 +52,7 @@ all_default: privilege: - # Privilege level(s) 0-15 + # Privilege level(s) 0-15. - level: # Command authorization method(s) as a string. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/aaa-server-groups.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/aaa-server-groups.md index 04accfbbdcc..7ed05b6c873 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/aaa-server-groups.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/aaa-server-groups.md @@ -8,25 +8,25 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [aaa_server_groups](## "aaa_server_groups") | List, items: Dictionary | | | | | - | [  - name](## "aaa_server_groups.[].name") | String | | | | Group name | + | [  - name](## "aaa_server_groups.[].name") | String | | | | Group name. | | [    type](## "aaa_server_groups.[].type") | String | | | Valid Values:
- tacacs+
- radius
- ldap | | | [    servers](## "aaa_server_groups.[].servers") | List, items: Dictionary | | | | | - | [      - server](## "aaa_server_groups.[].servers.[].server") | String | | | | Hostname or IP address | - | [        vrf](## "aaa_server_groups.[].servers.[].vrf") | String | | | | VRF name | + | [      - server](## "aaa_server_groups.[].servers.[].server") | String | | | | Hostname or IP address. | + | [        vrf](## "aaa_server_groups.[].servers.[].vrf") | String | | | | VRF name. | === "YAML" ```yaml aaa_server_groups: - # Group name + # Group name. - name: type: servers: - # Hostname or IP address + # Hostname or IP address. - server: - # VRF name + # VRF name. vrf: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/access-lists.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/access-lists.md index de8ff2abe7f..a054ae53c5a 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/access-lists.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/access-lists.md @@ -8,26 +8,31 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [access_lists](## "access_lists") | List, items: Dictionary | | | | | - | [  - name](## "access_lists.[].name") | String | Required, Unique | | | Access-list Name | + | [  - name](## "access_lists.[].name") | String | Required, Unique | | | Access-list Name. | | [    counters_per_entry](## "access_lists.[].counters_per_entry") | Boolean | | | | | + | [    permit_response_traffic](## "access_lists.[].permit_response_traffic") | String | | | Valid Values:
- nat | Permit response traffic automatically based on NAT translations.
Minimum EOS version requirement 4.32.2F. | | [    sequence_numbers](## "access_lists.[].sequence_numbers") | List, items: Dictionary | Required | | | | - | [      - sequence](## "access_lists.[].sequence_numbers.[].sequence") | Integer | Required, Unique | | | Sequence ID | - | [        action](## "access_lists.[].sequence_numbers.[].action") | String | Required | | | Action as string
Example: "deny ip any any"
| + | [      - sequence](## "access_lists.[].sequence_numbers.[].sequence") | Integer | Required, Unique | | | Sequence ID. | + | [        action](## "access_lists.[].sequence_numbers.[].action") | String | Required | | | Action as string.
Example: "deny ip any any"
| === "YAML" ```yaml access_lists: - # Access-list Name + # Access-list Name. - name: counters_per_entry: + + # Permit response traffic automatically based on NAT translations. + # Minimum EOS version requirement 4.32.2F. + permit_response_traffic: sequence_numbers: # required - # Sequence ID + # Sequence ID. - sequence: - # Action as string + # Action as string. # Example: "deny ip any any" action: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/address-locking.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/address-locking.md index 82f4e482d8a..c978f35d955 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/address-locking.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/address-locking.md @@ -9,16 +9,16 @@ | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [address_locking](## "address_locking") | Dictionary | | | | | | [  dhcp_servers_ipv4](## "address_locking.dhcp_servers_ipv4") | List, items: String | | | | | - | [    - <str>](## "address_locking.dhcp_servers_ipv4.[]") | String | | | | DHCP server IPv4 address | - | [  disabled](## "address_locking.disabled") | Boolean | | | | Disable IP locking on configured ports | + | [    - <str>](## "address_locking.dhcp_servers_ipv4.[]") | String | | | | DHCP server IPv4 address. | + | [  disabled](## "address_locking.disabled") | Boolean | | | | Disable IP locking on configured ports. | | [  leases](## "address_locking.leases") | List, items: Dictionary | | | | | - | [    - ip](## "address_locking.leases.[].ip") | String | Required | | | IP address | - | [      mac](## "address_locking.leases.[].mac") | String | Required | | | MAC address (hhhh.hhhh.hhhh or hh:hh:hh:hh:hh:hh) | + | [    - ip](## "address_locking.leases.[].ip") | String | Required | | | IP address. | + | [      mac](## "address_locking.leases.[].mac") | String | Required | | | MAC address (hhhh.hhhh.hhhh or hh:hh:hh:hh:hh:hh). | | [  local_interface](## "address_locking.local_interface") | String | | | | | | [  locked_address](## "address_locking.locked_address") | Dictionary | | | | | - | [    expiration_mac_disabled](## "address_locking.locked_address.expiration_mac_disabled") | Boolean | | | | Configure deauthorizing locked addresses upon MAC aging out | - | [    ipv4_enforcement_disabled](## "address_locking.locked_address.ipv4_enforcement_disabled") | Boolean | | | | Configure enforcement for locked IPv4 addresses | - | [    ipv6_enforcement_disabled](## "address_locking.locked_address.ipv6_enforcement_disabled") | Boolean | | | | Configure enforcement for locked IPv6 addresses | + | [    expiration_mac_disabled](## "address_locking.locked_address.expiration_mac_disabled") | Boolean | | | | Configure deauthorizing locked addresses upon MAC aging out. | + | [    ipv4_enforcement_disabled](## "address_locking.locked_address.ipv4_enforcement_disabled") | Boolean | | | | Configure enforcement for locked IPv4 addresses. | + | [    ipv6_enforcement_disabled](## "address_locking.locked_address.ipv6_enforcement_disabled") | Boolean | | | | Configure enforcement for locked IPv6 addresses. | === "YAML" @@ -26,27 +26,27 @@ address_locking: dhcp_servers_ipv4: - # DHCP server IPv4 address + # DHCP server IPv4 address. - - # Disable IP locking on configured ports + # Disable IP locking on configured ports. disabled: leases: - # IP address + # IP address. - ip: - # MAC address (hhhh.hhhh.hhhh or hh:hh:hh:hh:hh:hh) + # MAC address (hhhh.hhhh.hhhh or hh:hh:hh:hh:hh:hh). mac: local_interface: locked_address: - # Configure deauthorizing locked addresses upon MAC aging out + # Configure deauthorizing locked addresses upon MAC aging out. expiration_mac_disabled: - # Configure enforcement for locked IPv4 addresses + # Configure enforcement for locked IPv4 addresses. ipv4_enforcement_disabled: - # Configure enforcement for locked IPv6 addresses + # Configure enforcement for locked IPv6 addresses. ipv6_enforcement_disabled: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/application-traffic-recognition.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/application-traffic-recognition.md index be46ed6c1b0..484ab2af356 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/application-traffic-recognition.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/application-traffic-recognition.md @@ -23,18 +23,28 @@ | [        prefix_values](## "application_traffic_recognition.field_sets.ipv4_prefixes.[].prefix_values") | List, items: String | | | | | | [          - <str>](## "application_traffic_recognition.field_sets.ipv4_prefixes.[].prefix_values.[]") | String | | | | IP prefix (ex 1.2.3.0/24). | | [  applications](## "application_traffic_recognition.applications") | Dictionary | | | | | - | [    ipv4_applications](## "application_traffic_recognition.applications.ipv4_applications") | List, items: Dictionary | | | | List of user defined IPv4 applications. | + | [    ipv4_applications](## "application_traffic_recognition.applications.ipv4_applications") | List, items: Dictionary | | | | List of user defined IPv4 applications. The name should be unique over all defined applications (ipv4 and l4). | | [      - name](## "application_traffic_recognition.applications.ipv4_applications.[].name") | String | Required, Unique | | | Application name. | | [        src_prefix_set_name](## "application_traffic_recognition.applications.ipv4_applications.[].src_prefix_set_name") | String | | | | Source prefix set name. | | [        dest_prefix_set_name](## "application_traffic_recognition.applications.ipv4_applications.[].dest_prefix_set_name") | String | | | | Destination prefix set name. | - | [        protocols](## "application_traffic_recognition.applications.ipv4_applications.[].protocols") | List, items: String | | | | List of protocols to consider for this application.

To use port field-sets (source, destination or both), the list
must contain only one or two protocols, either `tcp` or `udp`.
When using both protocols, one line is rendered for each in the configuration,
hence the field-sets must have the same value for `tcp_src_port_set_name` and
`udp_src_port_set_name` and for `tcp_dest_port_set_name` and `udp_dest_port_set_name`
if set in order to generate valid configuration in EOS. | + | [        protocols](## "application_traffic_recognition.applications.ipv4_applications.[].protocols") | List, items: String | | | | List of protocols to consider for this application.
To use port field-sets (source, destination or both), the list
must contain only one or two protocols, either `tcp` or `udp`.
When using both protocols, one line is rendered for each in the configuration,
hence the field-sets must have the same value for `tcp_src_port_set_name` and
`udp_src_port_set_name` and for `tcp_dest_port_set_name` and `udp_dest_port_set_name`
if set in order to generate valid configuration in EOS. | | [          - <str>](## "application_traffic_recognition.applications.ipv4_applications.[].protocols.[]") | String | | | Valid Values:
- ahp
- esp
- icmp
- igmp
- ospf
- pim
- rsvp
- tcp
- udp
- vrrp | | - | [        protocol_ranges](## "application_traffic_recognition.applications.ipv4_applications.[].protocol_ranges") | List, items: String | | | | Acccept protocol value(s) or range(s).
Protocol values can be between 1 and 255. | + | [        protocol_ranges](## "application_traffic_recognition.applications.ipv4_applications.[].protocol_ranges") | List, items: String | | | | Accept protocol value(s) or range(s).
Protocol values can be between 1 and 255. | | [          - <str>](## "application_traffic_recognition.applications.ipv4_applications.[].protocol_ranges.[]") | String | | | | | - | [        udp_src_port_set_name](## "application_traffic_recognition.applications.ipv4_applications.[].udp_src_port_set_name") | String | | | | Name of field set for UDP source ports.

When the `protocols` list contain both `tcp` and `udp`, this key value
must be the same as `tcp_src_port_set_name`. | - | [        tcp_src_port_set_name](## "application_traffic_recognition.applications.ipv4_applications.[].tcp_src_port_set_name") | String | | | | Name of field set for TCP source ports.

When the `protocols` list contain both `tcp` and `udp`, this key value
must be the same as `udp_src_port_set_name`. | - | [        udp_dest_port_set_name](## "application_traffic_recognition.applications.ipv4_applications.[].udp_dest_port_set_name") | String | | | | Name of field set for UDP destination ports.

When the `protocols` list contain both `tcp` and `udp`, this key value
must be the same as `tcp_dest_port_set_name`. | - | [        tcp_dest_port_set_name](## "application_traffic_recognition.applications.ipv4_applications.[].tcp_dest_port_set_name") | String | | | | Name of field set for TCP destination ports.

When the `protocols` list contain both `tcp` and `udp`, this key value
must be the same as `udp_dest_port_set_name`. | + | [        udp_src_port_set_name](## "application_traffic_recognition.applications.ipv4_applications.[].udp_src_port_set_name") | String | | | | Name of field set for UDP source ports.
When the `protocols` list contain both `tcp` and `udp`, this key value
must be the same as `tcp_src_port_set_name`. | + | [        tcp_src_port_set_name](## "application_traffic_recognition.applications.ipv4_applications.[].tcp_src_port_set_name") | String | | | | Name of field set for TCP source ports.
When the `protocols` list contain both `tcp` and `udp`, this key value
must be the same as `udp_src_port_set_name`. | + | [        udp_dest_port_set_name](## "application_traffic_recognition.applications.ipv4_applications.[].udp_dest_port_set_name") | String | | | | Name of field set for UDP destination ports.
When the `protocols` list contain both `tcp` and `udp`, this key value
must be the same as `tcp_dest_port_set_name`. | + | [        tcp_dest_port_set_name](## "application_traffic_recognition.applications.ipv4_applications.[].tcp_dest_port_set_name") | String | | | | Name of field set for TCP destination ports.
When the `protocols` list contain both `tcp` and `udp`, this key value
must be the same as `udp_dest_port_set_name`. | + | [    l4_applications](## "application_traffic_recognition.applications.l4_applications") | List, items: Dictionary | | | | List of user defined L4 applications. The name should be unique over all defined applications (ipv4 and l4). | + | [      - name](## "application_traffic_recognition.applications.l4_applications.[].name") | String | Required, Unique | | | Application name. | + | [        protocols](## "application_traffic_recognition.applications.l4_applications.[].protocols") | List, items: String | | | | List of protocols to consider for this application.
To use port field-sets (source, destination or both), the list
must contain only one or two protocols, either `tcp` or `udp`.
When using both protocols, one line is rendered for each in the configuration,
hence the field-sets must have the same value for `tcp_src_port_set_name` and
`udp_src_port_set_name` and for `tcp_dest_port_set_name` and `udp_dest_port_set_name`
if set in order to generate valid configuration in EOS. | + | [          - <str>](## "application_traffic_recognition.applications.l4_applications.[].protocols.[]") | String | | | Valid Values:
- ahp
- esp
- icmp
- igmp
- ospf
- pim
- rsvp
- tcp
- udp
- vrrp | | + | [        protocol_ranges](## "application_traffic_recognition.applications.l4_applications.[].protocol_ranges") | List, items: String | | | | Accept protocol value(s) or range(s).
Protocol values can be between 1 and 255. | + | [          - <str>](## "application_traffic_recognition.applications.l4_applications.[].protocol_ranges.[]") | String | | | | | + | [        udp_src_port_set_name](## "application_traffic_recognition.applications.l4_applications.[].udp_src_port_set_name") | String | | | | Name of field set for UDP source ports.
When the `protocols` list contain both `tcp` and `udp`, this key value
must be the same as `tcp_src_port_set_name`. | + | [        tcp_src_port_set_name](## "application_traffic_recognition.applications.l4_applications.[].tcp_src_port_set_name") | String | | | | Name of field set for TCP source ports.
When the `protocols` list contain both `tcp` and `udp`, this key value
must be the same as `udp_src_port_set_name`. | + | [        udp_dest_port_set_name](## "application_traffic_recognition.applications.l4_applications.[].udp_dest_port_set_name") | String | | | | Name of field set for UDP destination ports.
When the `protocols` list contain both `tcp` and `udp`, this key value
must be the same as `tcp_dest_port_set_name`. | + | [        tcp_dest_port_set_name](## "application_traffic_recognition.applications.l4_applications.[].tcp_dest_port_set_name") | String | | | | Name of field set for TCP destination ports.
When the `protocols` list contain both `tcp` and `udp`, this key value
must be the same as `udp_dest_port_set_name`. | | [  application_profiles](## "application_traffic_recognition.application_profiles") | List, items: Dictionary | | | | Group of applications. | | [    - name](## "application_traffic_recognition.application_profiles.[].name") | String | | | | Application Profile name. | | [      applications](## "application_traffic_recognition.application_profiles.[].applications") | List, items: Dictionary | | | | List of applications part of the application profile. | @@ -93,7 +103,7 @@ - applications: - # List of user defined IPv4 applications. + # List of user defined IPv4 applications. The name should be unique over all defined applications (ipv4 and l4). ipv4_applications: # Application name. @@ -106,7 +116,6 @@ dest_prefix_set_name: # List of protocols to consider for this application. - # # To use port field-sets (source, destination or both), the list # must contain only one or two protocols, either `tcp` or `udp`. # When using both protocols, one line is rendered for each in the configuration, @@ -116,31 +125,68 @@ protocols: - - # Acccept protocol value(s) or range(s). + # Accept protocol value(s) or range(s). + # Protocol values can be between 1 and 255. + protocol_ranges: + - + + # Name of field set for UDP source ports. + # When the `protocols` list contain both `tcp` and `udp`, this key value + # must be the same as `tcp_src_port_set_name`. + udp_src_port_set_name: + + # Name of field set for TCP source ports. + # When the `protocols` list contain both `tcp` and `udp`, this key value + # must be the same as `udp_src_port_set_name`. + tcp_src_port_set_name: + + # Name of field set for UDP destination ports. + # When the `protocols` list contain both `tcp` and `udp`, this key value + # must be the same as `tcp_dest_port_set_name`. + udp_dest_port_set_name: + + # Name of field set for TCP destination ports. + # When the `protocols` list contain both `tcp` and `udp`, this key value + # must be the same as `udp_dest_port_set_name`. + tcp_dest_port_set_name: + + # List of user defined L4 applications. The name should be unique over all defined applications (ipv4 and l4). + l4_applications: + + # Application name. + - name: + + # List of protocols to consider for this application. + # To use port field-sets (source, destination or both), the list + # must contain only one or two protocols, either `tcp` or `udp`. + # When using both protocols, one line is rendered for each in the configuration, + # hence the field-sets must have the same value for `tcp_src_port_set_name` and + # `udp_src_port_set_name` and for `tcp_dest_port_set_name` and `udp_dest_port_set_name` + # if set in order to generate valid configuration in EOS. + protocols: + - + + # Accept protocol value(s) or range(s). # Protocol values can be between 1 and 255. protocol_ranges: - # Name of field set for UDP source ports. - # # When the `protocols` list contain both `tcp` and `udp`, this key value # must be the same as `tcp_src_port_set_name`. udp_src_port_set_name: # Name of field set for TCP source ports. - # # When the `protocols` list contain both `tcp` and `udp`, this key value # must be the same as `udp_src_port_set_name`. tcp_src_port_set_name: # Name of field set for UDP destination ports. - # # When the `protocols` list contain both `tcp` and `udp`, this key value # must be the same as `tcp_dest_port_set_name`. udp_dest_port_set_name: # Name of field set for TCP destination ports. - # # When the `protocols` list contain both `tcp` and `udp`, this key value # must be the same as `udp_dest_port_set_name`. tcp_dest_port_set_name: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/arp.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/arp.md index 636a8eb8f9a..1f6d5281b74 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/arp.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/arp.md @@ -8,8 +8,11 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [arp](## "arp") | Dictionary | | | | | + | [  persistent](## "arp.persistent") | Dictionary | | | | | + | [    enabled](## "arp.persistent.enabled") | Boolean | Required | | | Restore the ARP cache after reboot. | + | [    refresh_delay](## "arp.persistent.refresh_delay") | Integer | | | Min: 600
Max: 3600 | Time to wait in seconds before refreshing the ARP cache after reboot (EOS default 600). | | [  aging](## "arp.aging") | Dictionary | | | | | - | [    timeout_default](## "arp.aging.timeout_default") | Integer | | | Min: 60
Max: 65535 | Timeout in seconds | + | [    timeout_default](## "arp.aging.timeout_default") | Integer | | | Min: 60
Max: 65535 | Timeout in seconds. | | [  static_entries](## "arp.static_entries") | List, items: Dictionary | | | | Static ARP entries. | | [    - ipv4_address](## "arp.static_entries.[].ipv4_address") | String | Required | | | ARP entry IPv4 address. | | [      vrf](## "arp.static_entries.[].vrf") | String | | | | ARP entry VRF. | @@ -19,9 +22,16 @@ ```yaml arp: + persistent: + + # Restore the ARP cache after reboot. + enabled: + + # Time to wait in seconds before refreshing the ARP cache after reboot (EOS default 600). + refresh_delay: aging: - # Timeout in seconds + # Timeout in seconds. timeout_default: # Static ARP entries. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/as-path.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/as-path.md index 61ee3b08c14..0d4a5bdd59e 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/as-path.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/as-path.md @@ -10,10 +10,10 @@ | [as_path](## "as_path") | Dictionary | | | | | | [  regex_mode](## "as_path.regex_mode") | String | | | Valid Values:
- asn
- string | | | [  access_lists](## "as_path.access_lists") | List, items: Dictionary | | | | | - | [    - name](## "as_path.access_lists.[].name") | String | | | | Access List Name | + | [    - name](## "as_path.access_lists.[].name") | String | | | | Access List Name. | | [      entries](## "as_path.access_lists.[].entries") | List, items: Dictionary | | | | | | [        - type](## "as_path.access_lists.[].entries.[].type") | String | | | Valid Values:
- permit
- deny | | - | [          match](## "as_path.access_lists.[].entries.[].match") | String | | | | Regex To Match | + | [          match](## "as_path.access_lists.[].entries.[].match") | String | | | | Regex To Match. | | [          origin](## "as_path.access_lists.[].entries.[].origin") | String | | `any` | Valid Values:
- any
- egp
- igp
- incomplete | | === "YAML" @@ -23,12 +23,12 @@ regex_mode: access_lists: - # Access List Name + # Access List Name. - name: entries: - type: - # Regex To Match + # Regex To Match. match: origin: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/banners.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/banners.md index a08c17273f6..09c1b6a35ff 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/banners.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/banners.md @@ -8,17 +8,17 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [banners](## "banners") | Dictionary | | | | | - | [  login](## "banners.login") | String | | | | Multiline string ending with EOF on the last line | - | [  motd](## "banners.motd") | String | | | | Multiline string ending with EOF on the last line | + | [  login](## "banners.login") | String | | | | Multiline string ending with EOF on the last line. | + | [  motd](## "banners.motd") | String | | | | Multiline string ending with EOF on the last line. | === "YAML" ```yaml banners: - # Multiline string ending with EOF on the last line + # Multiline string ending with EOF on the last line. login: - # Multiline string ending with EOF on the last line + # Multiline string ending with EOF on the last line. motd: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/bgp-groups.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/bgp-groups.md index d86ba5acafd..db60c80a1ec 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/bgp-groups.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/bgp-groups.md @@ -8,25 +8,25 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [bgp_groups](## "bgp_groups") | List, items: Dictionary | | | | | - | [  - name](## "bgp_groups.[].name") | String | Required, Unique | | | Group Name | + | [  - name](## "bgp_groups.[].name") | String | Required, Unique | | | Group Name. | | [    vrf](## "bgp_groups.[].vrf") | String | | | | | | [    neighbors](## "bgp_groups.[].neighbors") | List, items: String | | | | | | [      - <str>](## "bgp_groups.[].neighbors.[]") | String | | | | | | [    bgp_maintenance_profiles](## "bgp_groups.[].bgp_maintenance_profiles") | List, items: String | | | | | - | [      - <str>](## "bgp_groups.[].bgp_maintenance_profiles.[]") | String | | | | Profile Name | + | [      - <str>](## "bgp_groups.[].bgp_maintenance_profiles.[]") | String | | | | Profile Name. | === "YAML" ```yaml bgp_groups: - # Group Name + # Group Name. - name: vrf: neighbors: - bgp_maintenance_profiles: - # Profile Name + # Profile Name. - ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/boot.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/boot.md index d5fabb08369..02dc2b75702 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/boot.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/boot.md @@ -7,19 +7,19 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | - | [boot](## "boot") | Dictionary | | | | Set the Aboot password
| + | [boot](## "boot") | Dictionary | | | | Set the Aboot password.
| | [  secret](## "boot.secret") | Dictionary | | | | | | [    hash_algorithm](## "boot.secret.hash_algorithm") | String | | `sha512` | Valid Values:
- md5
- sha512 | | - | [    key](## "boot.secret.key") | String | | | | Hashed Password | + | [    key](## "boot.secret.key") | String | | | | Hashed Password. | === "YAML" ```yaml - # Set the Aboot password + # Set the Aboot password. boot: secret: hash_algorithm: - # Hashed Password + # Hashed Password. key: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/class-maps.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/class-maps.md index 4dded1baa43..e174e749d67 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/class-maps.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/class-maps.md @@ -9,17 +9,17 @@ | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [class_maps](## "class_maps") | Dictionary | | | | | | [  pbr](## "class_maps.pbr") | List, items: Dictionary | | | | | - | [    - name](## "class_maps.pbr.[].name") | String | Required, Unique | | | Class-Map Name | + | [    - name](## "class_maps.pbr.[].name") | String | Required, Unique | | | Class-Map Name. | | [      ip](## "class_maps.pbr.[].ip") | Dictionary | | | | | - | [        access_group](## "class_maps.pbr.[].ip.access_group") | String | | | | Standard Access-List Name | + | [        access_group](## "class_maps.pbr.[].ip.access_group") | String | | | | Standard Access-List Name. | | [  qos](## "class_maps.qos") | List, items: Dictionary | | | | | - | [    - name](## "class_maps.qos.[].name") | String | Required, Unique | | | Class-Map Name | - | [      vlan](## "class_maps.qos.[].vlan") | String | | | | VLAN value(s) or range(s) of VLAN values | - | [      cos](## "class_maps.qos.[].cos") | String | | | | CoS value(s) or range(s) of CoS values | + | [    - name](## "class_maps.qos.[].name") | String | Required, Unique | | | Class-Map Name. | + | [      vlan](## "class_maps.qos.[].vlan") | String | | | | VLAN value(s) or range(s) of VLAN values. | + | [      cos](## "class_maps.qos.[].cos") | String | | | | CoS value(s) or range(s) of CoS values. | | [      ip](## "class_maps.qos.[].ip") | Dictionary | | | | | - | [        access_group](## "class_maps.qos.[].ip.access_group") | String | | | | IPv4 Access-List Name | + | [        access_group](## "class_maps.qos.[].ip.access_group") | String | | | | IPv4 Access-List Name. | | [      ipv6](## "class_maps.qos.[].ipv6") | Dictionary | | | | | - | [        access_group](## "class_maps.qos.[].ipv6.access_group") | String | | | | IPv6 Access-List Name | + | [        access_group](## "class_maps.qos.[].ipv6.access_group") | String | | | | IPv6 Access-List Name. | === "YAML" @@ -27,28 +27,28 @@ class_maps: pbr: - # Class-Map Name + # Class-Map Name. - name: ip: - # Standard Access-List Name + # Standard Access-List Name. access_group: qos: - # Class-Map Name + # Class-Map Name. - name: - # VLAN value(s) or range(s) of VLAN values + # VLAN value(s) or range(s) of VLAN values. vlan: - # CoS value(s) or range(s) of CoS values + # CoS value(s) or range(s) of CoS values. cos: ip: - # IPv4 Access-List Name + # IPv4 Access-List Name. access_group: ipv6: - # IPv6 Access-List Name + # IPv6 Access-List Name. access_group: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/community-lists.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/community-lists.md index d65173453a3..a7827fea8c7 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/community-lists.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/community-lists.md @@ -8,18 +8,18 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [community_lists](## "community_lists") | List, items: Dictionary | | | | | - | [  - name](## "community_lists.[].name") | String | Required, Unique | | | Community-list Name | - | [    action](## "community_lists.[].action") | String | Required | | | Action as string
Example: "permit GSHUT 65123:123"
| + | [  - name](## "community_lists.[].name") | String | Required, Unique | | | Community-list Name. | + | [    action](## "community_lists.[].action") | String | Required | | | Action as string.
Example: "permit GSHUT 65123:123"
| === "YAML" ```yaml community_lists: - # Community-list Name + # Community-list Name. - name: - # Action as string + # Action as string. # Example: "permit GSHUT 65123:123" action: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/custom-templates.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/custom-templates.md index 965f50c1096..0fb17aa5144 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/custom-templates.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/custom-templates.md @@ -8,7 +8,7 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [custom_templates](## "custom_templates") | List, items: String | | | | - Custom templates can be added below the playbook directory.
- If a location above the directory is desired, a symbolic link can be used.
- Example under the `playbooks` directory create symbolic link with the following command:

```bash
ln -s ../../shared_repo/custom_avd_templates/ ./custom_avd_templates
```

- The output will be rendered at the end of the configuration.
- The order of custom templates in the list can be important if they overlap.
- It is recommended to use a `!` delimiter at the top of each custom template.

Add `custom_templates` to group/host variables:
| - | [  - <str>](## "custom_templates.[]") | String | | | | Template relative path below playbook directory | + | [  - <str>](## "custom_templates.[]") | String | | | | Template relative path below playbook directory. | === "YAML" @@ -28,6 +28,6 @@ # Add `custom_templates` to group/host variables: custom_templates: - # Template relative path below playbook directory + # Template relative path below playbook directory. - ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/cvx.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/cvx.md index 6e65a3d3a7b..616246fcd46 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/cvx.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/cvx.md @@ -10,14 +10,14 @@ | [cvx](## "cvx") | Dictionary | | | | CVX server features are not supported on physical switches. See `management_cvx` for client configurations. | | [  shutdown](## "cvx.shutdown") | Boolean | | | | | | [  peer_hosts](## "cvx.peer_hosts") | List, items: String | | | | | - | [    - <str>](## "cvx.peer_hosts.[]") | String | | | | IP address or hostname | + | [    - <str>](## "cvx.peer_hosts.[]") | String | | | | IP address or hostname. | | [  services](## "cvx.services") | Dictionary | | | | | | [    mcs](## "cvx.services.mcs") | Dictionary | | | | | | [      redis](## "cvx.services.mcs.redis") | Dictionary | | | | | - | [        password](## "cvx.services.mcs.redis.password") | String | | | | Hashed password using the password_type | + | [        password](## "cvx.services.mcs.redis.password") | String | | | | Hashed password using the password_type. | | [        password_type](## "cvx.services.mcs.redis.password_type") | String | | `7` | Valid Values:
- 0
- 7
- 8a | | | [      shutdown](## "cvx.services.mcs.shutdown") | Boolean | | | | | - | [    vxlan](## "cvx.services.vxlan") | Dictionary | | | | VXLAN Controller service | + | [    vxlan](## "cvx.services.vxlan") | Dictionary | | | | VXLAN Controller service. | | [      shutdown](## "cvx.services.vxlan.shutdown") | Boolean | | | | | | [      vtep_mac_learning](## "cvx.services.vxlan.vtep_mac_learning") | String | | | Valid Values:
- control-plane
- data-plane | | @@ -29,18 +29,18 @@ shutdown: peer_hosts: - # IP address or hostname + # IP address or hostname. - services: mcs: redis: - # Hashed password using the password_type + # Hashed password using the password_type. password: password_type: shutdown: - # VXLAN Controller service + # VXLAN Controller service. vxlan: shutdown: vtep_mac_learning: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/daemon-terminattr.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/daemon-terminattr.md index 7ae1fdfb6b5..2ab49b745ab 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/daemon-terminattr.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/daemon-terminattr.md @@ -8,44 +8,44 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [daemon_terminattr](## "daemon_terminattr") | Dictionary | | | | You can either provide a list of IPs/FQDNs to target on-premise Cloudvision cluster or use DNS name for your Cloudvision as a Service instance.
Streaming to multiple clusters both on-prem and cloud service is supported.

!!! note
For TerminAttr version recommendation and EOS compatibility matrix, please refer to the latest TerminAttr Release Notes
which always contain the latest recommended versions and minimum required versions per EOS release.
| - | [  cvaddrs](## "daemon_terminattr.cvaddrs") | List, items: String | | | | Streaming address(es) for CloudVision single cluster
- TCP 9910 is used for CV on-prem
- TCP 443 is used for CV as a Service
| - | [    - <str>](## "daemon_terminattr.cvaddrs.[]") | String | | | | Server address in the format `:` | - | [  clusters](## "daemon_terminattr.clusters") | List, items: Dictionary | | | | Multiple CloudVision clusters
| - | [    - name](## "daemon_terminattr.clusters.[].name") | String | Required, Unique | | | Cluster Name | - | [      cvaddrs](## "daemon_terminattr.clusters.[].cvaddrs") | List, items: String | | | | Streaming address(es) for CloudVision cluster
- TCP 9910 is used for CV on-prem
- TCP 443 is used for CV as a Service
| - | [        - <str>](## "daemon_terminattr.clusters.[].cvaddrs.[]") | String | | | | Server address in the format `:` | - | [      cvauth](## "daemon_terminattr.clusters.[].cvauth") | Dictionary | | | | Authentication scheme used to connect to CloudVision
| + | [  cvaddrs](## "daemon_terminattr.cvaddrs") | List, items: String | | | | Streaming address(es) for CloudVision single cluster.
- TCP 9910 is used for CV on-prem
- TCP 443 is used for CV as a Service
| + | [    - <str>](## "daemon_terminattr.cvaddrs.[]") | String | | | | Server address in the format `:`. | + | [  clusters](## "daemon_terminattr.clusters") | List, items: Dictionary | | | | Multiple CloudVision clusters.
| + | [    - name](## "daemon_terminattr.clusters.[].name") | String | Required, Unique | | | Cluster Name. | + | [      cvaddrs](## "daemon_terminattr.clusters.[].cvaddrs") | List, items: String | | | | Streaming address(es) for CloudVision cluster.
- TCP 9910 is used for CV on-prem
- TCP 443 is used for CV as a Service
| + | [        - <str>](## "daemon_terminattr.clusters.[].cvaddrs.[]") | String | | | | Server address in the format `:`. | + | [      cvauth](## "daemon_terminattr.clusters.[].cvauth") | Dictionary | | | | Authentication scheme used to connect to CloudVision.
| | [        method](## "daemon_terminattr.clusters.[].cvauth.method") | String | | | Valid Values:
- token
- token-secure
- key
- certs | | | [        key](## "daemon_terminattr.clusters.[].cvauth.key") | String | | | | | - | [        token_file](## "daemon_terminattr.clusters.[].cvauth.token_file") | String | | | | Token file path
e.g. "/tmp/token"
| - | [        cert_file](## "daemon_terminattr.clusters.[].cvauth.cert_file") | String | | | | Client certificate file path
e.g. "/persist/secure/ssl/terminattr/primary/certs/client.crt"
| - | [        ca_file](## "daemon_terminattr.clusters.[].cvauth.ca_file") | String | | | | CA certificate file path (on-prem only)
e.g. "/persist/secure/ssl/terminattr/primary/certs/ca.crt"
| - | [        key_file](## "daemon_terminattr.clusters.[].cvauth.key_file") | String | | | | Client certificate key file path
e.g. "/persist/secure/ssl/terminattr/primary/keys/client.key"
| - | [      cvobscurekeyfile](## "daemon_terminattr.clusters.[].cvobscurekeyfile") | Boolean | | | | Encrypt the private key used for authentication to CloudVision
| - | [      cvproxy](## "daemon_terminattr.clusters.[].cvproxy") | String | | | | Proxy server through which CloudVision is reachable. Useful when the CloudVision server is hosted in the cloud.
The expected form is http://[user:password@]ip:port, e.g.: `http://arista:arista@10.83.12.78:3128`. Available as of TerminAttr v1.13.0
| - | [      cvsourceip](## "daemon_terminattr.clusters.[].cvsourceip") | String | | | | Set source IP address in case of in-band managament
| - | [      cvsourceintf](## "daemon_terminattr.clusters.[].cvsourceintf") | String | | | | Set source interface in case of in-band managament. Available as of TerminAttr v1.23.0.
The interface name is case sensitive and has to match the interface name in the running-config, e.g.:Vlan100.
| - | [      cvvrf](## "daemon_terminattr.clusters.[].cvvrf") | String | | | | The VRF to use to connect to CloudVision
| - | [  cvauth](## "daemon_terminattr.cvauth") | Dictionary | | | | Authentication scheme used to connect to CloudVision
| + | [        token_file](## "daemon_terminattr.clusters.[].cvauth.token_file") | String | | | | Token file path.
e.g. "/tmp/token"
| + | [        cert_file](## "daemon_terminattr.clusters.[].cvauth.cert_file") | String | | | | Client certificate file path.
e.g. "/persist/secure/ssl/terminattr/primary/certs/client.crt"
| + | [        ca_file](## "daemon_terminattr.clusters.[].cvauth.ca_file") | String | | | | CA certificate file path (on-prem only).
e.g. "/persist/secure/ssl/terminattr/primary/certs/ca.crt"
| + | [        key_file](## "daemon_terminattr.clusters.[].cvauth.key_file") | String | | | | Client certificate key file path.
e.g. "/persist/secure/ssl/terminattr/primary/keys/client.key"
| + | [      cvobscurekeyfile](## "daemon_terminattr.clusters.[].cvobscurekeyfile") | Boolean | | | | Encrypt the private key used for authentication to CloudVision.
| + | [      cvproxy](## "daemon_terminattr.clusters.[].cvproxy") | String | | | | Proxy server through which CloudVision is reachable. Useful when the CloudVision server is hosted in the cloud.
The expected form is http://[user:password@]ip:port, e.g.: `http://arista:arista@10.83.12.78:3128`. Available as of TerminAttr v1.13.0.
| + | [      cvsourceip](## "daemon_terminattr.clusters.[].cvsourceip") | String | | | | Set source IP address in case of in-band management.
| + | [      cvsourceintf](## "daemon_terminattr.clusters.[].cvsourceintf") | String | | | | Set source interface in case of in-band management. Available as of TerminAttr v1.23.0.
The interface name is case sensitive and has to match the interface name in the running-config, e.g.:Vlan100.
| + | [      cvvrf](## "daemon_terminattr.clusters.[].cvvrf") | String | | | | The VRF to use to connect to CloudVision.
| + | [  cvauth](## "daemon_terminattr.cvauth") | Dictionary | | | | Authentication scheme used to connect to CloudVision.
| | [    method](## "daemon_terminattr.cvauth.method") | String | | | Valid Values:
- token
- token-secure
- key
- certs | | | [    key](## "daemon_terminattr.cvauth.key") | String | | | | | - | [    token_file](## "daemon_terminattr.cvauth.token_file") | String | | | | Token file path
e.g. "/tmp/token"
| - | [    cert_file](## "daemon_terminattr.cvauth.cert_file") | String | | | | Client certificate file path
e.g. "/persist/secure/ssl/terminattr/primary/certs/client.crt"
| - | [    ca_file](## "daemon_terminattr.cvauth.ca_file") | String | | | | CA certificate file path (on-prem only)
e.g. "/persist/secure/ssl/terminattr/primary/certs/ca.crt"
| - | [    key_file](## "daemon_terminattr.cvauth.key_file") | String | | | | Client certificate key file path
e.g. "/persist/secure/ssl/terminattr/primary/keys/client.key"
| - | [  cvobscurekeyfile](## "daemon_terminattr.cvobscurekeyfile") | Boolean | | | | Encrypt the private key used for authentication to CloudVision
| - | [  cvproxy](## "daemon_terminattr.cvproxy") | String | | | | Proxy server through which CloudVision is reachable. Useful when the CloudVision server is hosted in the cloud.
The expected form is http://[user:password@]ip:port, e.g.: `http://arista:arista@10.83.12.78:3128`. Available as of TerminAttr v1.13.0
| - | [  cvsourceip](## "daemon_terminattr.cvsourceip") | String | | | | Set source IP address in case of in-band managament
| - | [  cvsourceintf](## "daemon_terminattr.cvsourceintf") | String | | | | Set source interface in case of in-band managament.
The interface name is case sensitive and has to match the interface name in the running-config, e.g.:Vlan100.
| - | [  cvvrf](## "daemon_terminattr.cvvrf") | String | | | | The VRF to use to connect to CloudVision
| - | [  cvgnmi](## "daemon_terminattr.cvgnmi") | Boolean | | | | Stream states from EOS gNMI servers (Openconfig) to CloudVision. Available as of TerminAttr v1.13.1
| - | [  disable_aaa](## "daemon_terminattr.disable_aaa") | Boolean | | | | Disable AAA authorization and accounting.
When setting this flag, all commands pushed from CloudVision are applied directly to the CLI without authorization
| - | [  grpcaddr](## "daemon_terminattr.grpcaddr") | String | | | | Set the gRPC server address, the default is 127.0.0.1:6042
e.g. "MGMT/0.0.0.0:6042"
| - | [  grpcreadonly](## "daemon_terminattr.grpcreadonly") | Boolean | | | | gNMI read-only mode - Disable gnmi.Set()
| + | [    token_file](## "daemon_terminattr.cvauth.token_file") | String | | | | Token file path.
e.g. "/tmp/token"
| + | [    cert_file](## "daemon_terminattr.cvauth.cert_file") | String | | | | Client certificate file path.
e.g. "/persist/secure/ssl/terminattr/primary/certs/client.crt"
| + | [    ca_file](## "daemon_terminattr.cvauth.ca_file") | String | | | | CA certificate file path (on-prem only).
e.g. "/persist/secure/ssl/terminattr/primary/certs/ca.crt"
| + | [    key_file](## "daemon_terminattr.cvauth.key_file") | String | | | | Client certificate key file path.
e.g. "/persist/secure/ssl/terminattr/primary/keys/client.key"
| + | [  cvobscurekeyfile](## "daemon_terminattr.cvobscurekeyfile") | Boolean | | | | Encrypt the private key used for authentication to CloudVision.
| + | [  cvproxy](## "daemon_terminattr.cvproxy") | String | | | | Proxy server through which CloudVision is reachable. Useful when the CloudVision server is hosted in the cloud.
The expected form is http://[user:password@]ip:port, e.g.: `http://arista:arista@10.83.12.78:3128`. Available as of TerminAttr v1.13.0.
| + | [  cvsourceip](## "daemon_terminattr.cvsourceip") | String | | | | Set source IP address in case of in-band management.
| + | [  cvsourceintf](## "daemon_terminattr.cvsourceintf") | String | | | | Set source interface in case of in-band management.
The interface name is case sensitive and has to match the interface name in the running-config, e.g.:Vlan100.
| + | [  cvvrf](## "daemon_terminattr.cvvrf") | String | | | | The VRF to use to connect to CloudVision.
| + | [  cvgnmi](## "daemon_terminattr.cvgnmi") | Boolean | | | | Stream states from EOS gNMI servers (Openconfig) to CloudVision. Available as of TerminAttr v1.13.1.
| + | [  disable_aaa](## "daemon_terminattr.disable_aaa") | Boolean | | | | Disable AAA authorization and accounting.
When setting this flag, all commands pushed from CloudVision are applied directly to the CLI without authorization.
| + | [  grpcaddr](## "daemon_terminattr.grpcaddr") | String | | | | Set the gRPC server address, the default is 127.0.0.1:6042.
e.g. "MGMT/0.0.0.0:6042"
| + | [  grpcreadonly](## "daemon_terminattr.grpcreadonly") | Boolean | | | | gNMI read-only mode - Disable gnmi.Set().
| | [  ingestexclude](## "daemon_terminattr.ingestexclude") | String | | | | Exclude paths from Sysdb on the ingest side.
e.g. "/Sysdb/cell/1/agent,/Sysdb/cell/2/agent"
| | [  smashexcludes](## "daemon_terminattr.smashexcludes") | String | | | | Exclude paths from the shared memory table.
e.g. "ale,flexCounter,hardware,kni,pulse,strata"
| | [  taillogs](## "daemon_terminattr.taillogs") | String | | | | Enable log file collection; /var/log/messages is streamed by default if no path is set.
e.g. "/var/log/messages"
| - | [  ecodhcpaddr](## "daemon_terminattr.ecodhcpaddr") | String | | | | ECO DHCP Collector address or ECO DHCP Fingerprint listening address in standalone mode (default "127.0.0.1:67")
| + | [  ecodhcpaddr](## "daemon_terminattr.ecodhcpaddr") | String | | | | ECO DHCP Collector address or ECO DHCP Fingerprint listening address in standalone mode (default "127.0.0.1:67").
| | [  ipfix](## "daemon_terminattr.ipfix") | Boolean | | | | Enable IPFIX provider (TerminAttr default is true).
This flag is enabled by default and does not have to be added to the daemon configuration.
| | [  ipfixaddr](## "daemon_terminattr.ipfixaddr") | String | | | | ECO IPFIX Collector address to listen on to receive IPFIX packets (TerminAttr default "127.0.0.1:4739").
| | [  sflow](## "daemon_terminattr.sflow") | Boolean | | | | Enable sFlow provider (TerminAttr default is true).
| @@ -64,116 +64,116 @@ # which always contain the latest recommended versions and minimum required versions per EOS release. daemon_terminattr: - # Streaming address(es) for CloudVision single cluster + # Streaming address(es) for CloudVision single cluster. # - TCP 9910 is used for CV on-prem # - TCP 443 is used for CV as a Service cvaddrs: - # Server address in the format `:` + # Server address in the format `:`. - - # Multiple CloudVision clusters + # Multiple CloudVision clusters. clusters: - # Cluster Name + # Cluster Name. - name: - # Streaming address(es) for CloudVision cluster + # Streaming address(es) for CloudVision cluster. # - TCP 9910 is used for CV on-prem # - TCP 443 is used for CV as a Service cvaddrs: - # Server address in the format `:` + # Server address in the format `:`. - - # Authentication scheme used to connect to CloudVision + # Authentication scheme used to connect to CloudVision. cvauth: method: key: - # Token file path + # Token file path. # e.g. "/tmp/token" token_file: - # Client certificate file path + # Client certificate file path. # e.g. "/persist/secure/ssl/terminattr/primary/certs/client.crt" cert_file: - # CA certificate file path (on-prem only) + # CA certificate file path (on-prem only). # e.g. "/persist/secure/ssl/terminattr/primary/certs/ca.crt" ca_file: - # Client certificate key file path + # Client certificate key file path. # e.g. "/persist/secure/ssl/terminattr/primary/keys/client.key" key_file: - # Encrypt the private key used for authentication to CloudVision + # Encrypt the private key used for authentication to CloudVision. cvobscurekeyfile: # Proxy server through which CloudVision is reachable. Useful when the CloudVision server is hosted in the cloud. - # The expected form is http://[user:password@]ip:port, e.g.: `http://arista:arista@10.83.12.78:3128`. Available as of TerminAttr v1.13.0 + # The expected form is http://[user:password@]ip:port, e.g.: `http://arista:arista@10.83.12.78:3128`. Available as of TerminAttr v1.13.0. cvproxy: - # Set source IP address in case of in-band managament + # Set source IP address in case of in-band management. cvsourceip: - # Set source interface in case of in-band managament. Available as of TerminAttr v1.23.0. + # Set source interface in case of in-band management. Available as of TerminAttr v1.23.0. # The interface name is case sensitive and has to match the interface name in the running-config, e.g.:Vlan100. cvsourceintf: - # The VRF to use to connect to CloudVision + # The VRF to use to connect to CloudVision. cvvrf: - # Authentication scheme used to connect to CloudVision + # Authentication scheme used to connect to CloudVision. cvauth: method: key: - # Token file path + # Token file path. # e.g. "/tmp/token" token_file: - # Client certificate file path + # Client certificate file path. # e.g. "/persist/secure/ssl/terminattr/primary/certs/client.crt" cert_file: - # CA certificate file path (on-prem only) + # CA certificate file path (on-prem only). # e.g. "/persist/secure/ssl/terminattr/primary/certs/ca.crt" ca_file: - # Client certificate key file path + # Client certificate key file path. # e.g. "/persist/secure/ssl/terminattr/primary/keys/client.key" key_file: - # Encrypt the private key used for authentication to CloudVision + # Encrypt the private key used for authentication to CloudVision. cvobscurekeyfile: # Proxy server through which CloudVision is reachable. Useful when the CloudVision server is hosted in the cloud. - # The expected form is http://[user:password@]ip:port, e.g.: `http://arista:arista@10.83.12.78:3128`. Available as of TerminAttr v1.13.0 + # The expected form is http://[user:password@]ip:port, e.g.: `http://arista:arista@10.83.12.78:3128`. Available as of TerminAttr v1.13.0. cvproxy: - # Set source IP address in case of in-band managament + # Set source IP address in case of in-band management. cvsourceip: - # Set source interface in case of in-band managament. + # Set source interface in case of in-band management. # The interface name is case sensitive and has to match the interface name in the running-config, e.g.:Vlan100. cvsourceintf: - # The VRF to use to connect to CloudVision + # The VRF to use to connect to CloudVision. cvvrf: - # Stream states from EOS gNMI servers (Openconfig) to CloudVision. Available as of TerminAttr v1.13.1 + # Stream states from EOS gNMI servers (Openconfig) to CloudVision. Available as of TerminAttr v1.13.1. cvgnmi: # Disable AAA authorization and accounting. - # When setting this flag, all commands pushed from CloudVision are applied directly to the CLI without authorization + # When setting this flag, all commands pushed from CloudVision are applied directly to the CLI without authorization. disable_aaa: - # Set the gRPC server address, the default is 127.0.0.1:6042 + # Set the gRPC server address, the default is 127.0.0.1:6042. # e.g. "MGMT/0.0.0.0:6042" grpcaddr: - # gNMI read-only mode - Disable gnmi.Set() + # gNMI read-only mode - Disable gnmi.Set(). grpcreadonly: # Exclude paths from Sysdb on the ingest side. @@ -188,7 +188,7 @@ # e.g. "/var/log/messages" taillogs: - # ECO DHCP Collector address or ECO DHCP Fingerprint listening address in standalone mode (default "127.0.0.1:67") + # ECO DHCP Collector address or ECO DHCP Fingerprint listening address in standalone mode (default "127.0.0.1:67"). ecodhcpaddr: # Enable IPFIX provider (TerminAttr default is true). diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/daemons.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/daemons.md index e7ae3e2b04d..bf60130592b 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/daemons.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/daemons.md @@ -8,8 +8,8 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [daemons](## "daemons") | List, items: Dictionary | | | | This will add a daemon to the eos configuration that is most useful when trying to run OpenConfig clients like ocprometheus. | - | [  - name](## "daemons.[].name") | String | Required, Unique | | | Daemon Name | - | [    exec](## "daemons.[].exec") | String | Required | | | command to run as a daemon
| + | [  - name](## "daemons.[].name") | String | Required, Unique | | | Daemon Name. | + | [    exec](## "daemons.[].exec") | String | Required | | | command to run as a daemon.
| | [    enabled](## "daemons.[].enabled") | Boolean | | `True` | | | === "YAML" @@ -18,10 +18,10 @@ # This will add a daemon to the eos configuration that is most useful when trying to run OpenConfig clients like ocprometheus. daemons: - # Daemon Name + # Daemon Name. - name: - # command to run as a daemon + # command to run as a daemon. exec: enabled: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/dhcp-relay.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/dhcp-relay.md index 2ab52991e59..5acd2cd6b72 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/dhcp-relay.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/dhcp-relay.md @@ -9,7 +9,7 @@ | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [dhcp_relay](## "dhcp_relay") | Dictionary | | | | | | [  servers](## "dhcp_relay.servers") | List, items: String | | | | | - | [    - <str>](## "dhcp_relay.servers.[]") | String | | | | Server IP or Hostname | + | [    - <str>](## "dhcp_relay.servers.[]") | String | | | | Server IP or Hostname. | | [  tunnel_requests_disabled](## "dhcp_relay.tunnel_requests_disabled") | Boolean | | | | | | [  mlag_peerlink_requests_disabled](## "dhcp_relay.mlag_peerlink_requests_disabled") | Boolean | | | | | @@ -19,7 +19,7 @@ dhcp_relay: servers: - # Server IP or Hostname + # Server IP or Hostname. - tunnel_requests_disabled: mlag_peerlink_requests_disabled: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/dhcp-servers.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/dhcp-servers.md index 44407122a37..1826e741e27 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/dhcp-servers.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/dhcp-servers.md @@ -12,6 +12,13 @@ | [    vrf](## "dhcp_servers.[].vrf") | String | Required, Unique | | | VRF in which to configure the DHCP server, use `default` to indicate default VRF. | | [    dns_domain_name_ipv4](## "dhcp_servers.[].dns_domain_name_ipv4") | String | | | | | | [    dns_domain_name_ipv6](## "dhcp_servers.[].dns_domain_name_ipv6") | String | | | | | + | [    dns_servers_ipv4](## "dhcp_servers.[].dns_servers_ipv4") | List, items: String | | | Min Length: 1 | List of DNS servers for IPv4 clients. | + | [      - <str>](## "dhcp_servers.[].dns_servers_ipv4.[]") | String | Required | | | IPv4 address of DNS server. | + | [    dns_servers_ipv6](## "dhcp_servers.[].dns_servers_ipv6") | List, items: String | | | Min Length: 1 | List of DNS servers for IPv6 clients. | + | [      - <str>](## "dhcp_servers.[].dns_servers_ipv6.[]") | String | Required | | | IPv6 address of DNS server. | + | [    tftp_server](## "dhcp_servers.[].tftp_server") | Dictionary | | | | | + | [      file_ipv4](## "dhcp_servers.[].tftp_server.file_ipv4") | String | | | Min Length: 1
Max Length: 255 | Name of TFTP file for IPv4 clients. | + | [      file_ipv6](## "dhcp_servers.[].tftp_server.file_ipv6") | String | | | Min Length: 1
Max Length: 255 | Name of TFTP file for IPv6 clients. | | [    ipv4_vendor_options](## "dhcp_servers.[].ipv4_vendor_options") | List, items: Dictionary | | | | | | [      - vendor_id](## "dhcp_servers.[].ipv4_vendor_options.[].vendor_id") | String | Required, Unique | | | | | [        sub_options](## "dhcp_servers.[].ipv4_vendor_options.[].sub_options") | List, items: Dictionary | | | | | @@ -44,6 +51,25 @@ vrf: dns_domain_name_ipv4: dns_domain_name_ipv6: + + # List of DNS servers for IPv4 clients. + dns_servers_ipv4: # >=1 items + + # IPv4 address of DNS server. + - + + # List of DNS servers for IPv6 clients. + dns_servers_ipv6: # >=1 items + + # IPv6 address of DNS server. + - + tftp_server: + + # Name of TFTP file for IPv4 clients. + file_ipv4: + + # Name of TFTP file for IPv6 clients. + file_ipv6: ipv4_vendor_options: - vendor_id: sub_options: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/dns-domain.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/dns-domain.md index 8ce5df29fac..d202f6a1b5e 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/dns-domain.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/dns-domain.md @@ -7,11 +7,11 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | - | [dns_domain](## "dns_domain") | String | | | | Domain Name | + | [dns_domain](## "dns_domain") | String | | | | Domain Name. | === "YAML" ```yaml - # Domain Name + # Domain Name. dns_domain: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/domain-list.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/domain-list.md index 216a392a3ba..910a91e3660 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/domain-list.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/domain-list.md @@ -7,15 +7,15 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | - | [domain_list](## "domain_list") | List, items: String | | | | Search list of DNS domains | - | [  - <str>](## "domain_list.[]") | String | | | | Domain name | + | [domain_list](## "domain_list") | List, items: String | | | | Search list of DNS domains. | + | [  - <str>](## "domain_list.[]") | String | | | | Domain name. | === "YAML" ```yaml - # Search list of DNS domains + # Search list of DNS domains. domain_list: - # Domain name + # Domain name. - ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/dot1x.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/dot1x.md index 05736d45bca..b35ca208d50 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/dot1x.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/dot1x.md @@ -37,6 +37,23 @@ | [        apply_alternate](## "dot1x.aaa.unresponsive.phone_action.apply_alternate") | Boolean | | | | Apply alternate action if primary action fails.
eg. aaa unresponsive phone action apply cached-results else traffic allow | | [        traffic_allow](## "dot1x.aaa.unresponsive.phone_action.traffic_allow") | Boolean | | | | Set action for supplicant traffic when AAA times out. | | [      recovery_action_reauthenticate](## "dot1x.aaa.unresponsive.recovery_action_reauthenticate") | Boolean | | | | | + | [    accounting_update_interval](## "dot1x.aaa.accounting_update_interval") | Integer | | | Min: 5
Max: 65535 | Interval period in seconds. | + | [  captive_portal](## "dot1x.captive_portal") | Dictionary | | | | Web authentication feature authenticates a supplicant through a web page, referred to as a captive portal. | + | [    enabled](## "dot1x.captive_portal.enabled") | Boolean | Required | | | | + | [    url](## "dot1x.captive_portal.url") | String | | | | Supported URL type:
- http: http://[:]
- https: https://[:] | + | [    ssl_profile](## "dot1x.captive_portal.ssl_profile") | String | | | | | + | [    start_limit_infinite](## "dot1x.captive_portal.start_limit_infinite") | Boolean | | | | Set captive-portal start limit to infinte. | + | [    access_list_ipv4](## "dot1x.captive_portal.access_list_ipv4") | String | | | | Standard access-list name. | + | [  supplicant](## "dot1x.supplicant") | Dictionary | | | | | + | [    profiles](## "dot1x.supplicant.profiles") | List, items: Dictionary | | | | Dot1x supplicant profiles. | + | [      - name](## "dot1x.supplicant.profiles.[].name") | String | Required, Unique | | | | + | [        eap_method](## "dot1x.supplicant.profiles.[].eap_method") | String | | | Valid Values:
- fast
- tls | Extensible Authentication Protocol method:
- EAP Flexible Authentication via Secure Tunneling.
- EAP with Transport Layer Security. | + | [        identity](## "dot1x.supplicant.profiles.[].identity") | String | | | | User identity. | + | [        passphrase_type](## "dot1x.supplicant.profiles.[].passphrase_type") | String | | `7` | Valid Values:
- 0
- 7
- 8a | | + | [        passphrase](## "dot1x.supplicant.profiles.[].passphrase") | String | | | | Extensible Authentication Protocol password. | + | [        ssl_profile](## "dot1x.supplicant.profiles.[].ssl_profile") | String | | | | | + | [    logging](## "dot1x.supplicant.logging") | Boolean | | | | Enable supplicant logging. | + | [    disconnect_cached_results_timeout](## "dot1x.supplicant.disconnect_cached_results_timeout") | Integer | | | Min: 60
Max: 65535 | Timeout in seconds for removing a disconnected supplicant. | === "YAML" @@ -107,4 +124,47 @@ # Set action for supplicant traffic when AAA times out. traffic_allow: recovery_action_reauthenticate: + + # Interval period in seconds. + accounting_update_interval: + + # Web authentication feature authenticates a supplicant through a web page, referred to as a captive portal. + captive_portal: + enabled: + + # Supported URL type: + # - http: http://[:] + # - https: https://[:] + url: + ssl_profile: + + # Set captive-portal start limit to infinte. + start_limit_infinite: + + # Standard access-list name. + access_list_ipv4: + supplicant: + + # Dot1x supplicant profiles. + profiles: + - name: + + # Extensible Authentication Protocol method: + # - EAP Flexible Authentication via Secure Tunneling. + # - EAP with Transport Layer Security. + eap_method: + + # User identity. + identity: + passphrase_type: + + # Extensible Authentication Protocol password. + passphrase: + ssl_profile: + + # Enable supplicant logging. + logging: + + # Timeout in seconds for removing a disconnected supplicant. + disconnect_cached_results_timeout: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/dynamic-prefix-lists.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/dynamic-prefix-lists.md index b127eff3cda..90e1b0c0ff5 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/dynamic-prefix-lists.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/dynamic-prefix-lists.md @@ -8,27 +8,27 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [dynamic_prefix_lists](## "dynamic_prefix_lists") | List, items: Dictionary | | | | | - | [  - name](## "dynamic_prefix_lists.[].name") | String | | | | Dynamic prefix-list name | - | [    match_map](## "dynamic_prefix_lists.[].match_map") | String | | | | Route-map name | + | [  - name](## "dynamic_prefix_lists.[].name") | String | | | | Dynamic prefix-list name. | + | [    match_map](## "dynamic_prefix_lists.[].match_map") | String | | | | Route-map name. | | [    prefix_list](## "dynamic_prefix_lists.[].prefix_list") | Dictionary | | | | | - | [      ipv4](## "dynamic_prefix_lists.[].prefix_list.ipv4") | String | | | | Prefix-list name | - | [      ipv6](## "dynamic_prefix_lists.[].prefix_list.ipv6") | String | | | | Prefix-list name | + | [      ipv4](## "dynamic_prefix_lists.[].prefix_list.ipv4") | String | | | | Prefix-list name. | + | [      ipv6](## "dynamic_prefix_lists.[].prefix_list.ipv6") | String | | | | Prefix-list name. | === "YAML" ```yaml dynamic_prefix_lists: - # Dynamic prefix-list name + # Dynamic prefix-list name. - name: - # Route-map name + # Route-map name. match_map: prefix_list: - # Prefix-list name + # Prefix-list name. ipv4: - # Prefix-list name + # Prefix-list name. ipv6: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/eos-cli-config-gen-configuration.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/eos-cli-config-gen-configuration.md index 95ef50b3941..4cc21d778dc 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/eos-cli-config-gen-configuration.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/eos-cli-config-gen-configuration.md @@ -8,13 +8,13 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [eos_cli_config_gen_configuration](## "eos_cli_config_gen_configuration") | Dictionary | | | | | - | [  hide_passwords](## "eos_cli_config_gen_configuration.hide_passwords") | Boolean | | `False` | | Replace the input data using the `hide_passwords` filter in the Jinja2 templates by '' in the configruation if true
| + | [  hide_passwords](## "eos_cli_config_gen_configuration.hide_passwords") | Boolean | | `False` | | Replace the input data using the `hide_passwords` filter in the Jinja2 templates by '' in the configuration if true.
| === "YAML" ```yaml eos_cli_config_gen_configuration: - # Replace the input data using the `hide_passwords` filter in the Jinja2 templates by '' in the configruation if true + # Replace the input data using the `hide_passwords` filter in the Jinja2 templates by '' in the configuration if true. hide_passwords: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/eos-cli-config-gen-documentation.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/eos-cli-config-gen-documentation.md index 3b469b43c19..77329680e7c 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/eos-cli-config-gen-documentation.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/eos-cli-config-gen-documentation.md @@ -8,13 +8,13 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [eos_cli_config_gen_documentation](## "eos_cli_config_gen_documentation") | Dictionary | | | | | - | [  hide_passwords](## "eos_cli_config_gen_documentation.hide_passwords") | Boolean | | `True` | | Replace the input data using the `hide_passwords` filter in the Jinja2 templates by '' in the documentation if true
| + | [  hide_passwords](## "eos_cli_config_gen_documentation.hide_passwords") | Boolean | | `True` | | Replace the input data using the `hide_passwords` filter in the Jinja2 templates by '' in the documentation if true.
| === "YAML" ```yaml eos_cli_config_gen_documentation: - # Replace the input data using the `hide_passwords` filter in the Jinja2 templates by '' in the documentation if true + # Replace the input data using the `hide_passwords` filter in the Jinja2 templates by '' in the documentation if true. hide_passwords: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/eos-cli.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/eos-cli.md index 76f8975bbca..b4301e30da7 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/eos-cli.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/eos-cli.md @@ -7,11 +7,11 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | - | [eos_cli](## "eos_cli") | String | | | | Multiline string with EOS CLI rendered directly on the root level of the final EOS configuration | + | [eos_cli](## "eos_cli") | String | | | | Multiline string with EOS CLI rendered directly on the root level of the final EOS configuration. | === "YAML" ```yaml - # Multiline string with EOS CLI rendered directly on the root level of the final EOS configuration + # Multiline string with EOS CLI rendered directly on the root level of the final EOS configuration. eos_cli: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/errdisable.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/errdisable.md index 6bc79584645..cb56f19267d 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/errdisable.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/errdisable.md @@ -14,7 +14,7 @@ | [  recovery](## "errdisable.recovery") | Dictionary | | | | | | [    causes](## "errdisable.recovery.causes") | List, items: String | | | | | | [      - <str>](## "errdisable.recovery.causes.[]") | String | | | Valid Values:
- arp-inspection
- bpduguard
- dot1x
- hitless-reload-down
- lacp-rate-limit
- link-flap
- no-internal-vlan
- portchannelguard
- portsec
- speed-misconfigured
- tap-port-init
- tapagg
- uplink-failure-detection
- xcvr-misconfigured
- xcvr-overheat
- xcvr-power-unsupported
- xcvr-unsupported | | - | [    interval](## "errdisable.recovery.interval") | Integer | | `300` | Min: 30
Max: 86400 | Interval in seconds | + | [    interval](## "errdisable.recovery.interval") | Integer | | `300` | Min: 30
Max: 86400 | Interval in seconds. | === "YAML" @@ -27,6 +27,6 @@ causes: - - # Interval in seconds + # Interval in seconds. interval: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ethernet-interfaces.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ethernet-interfaces.md index a620cd53a2d..7ab88329a20 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ethernet-interfaces.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ethernet-interfaces.md @@ -11,31 +11,31 @@ | [  - name](## "ethernet_interfaces.[].name") | String | Required, Unique | | | | | [    description](## "ethernet_interfaces.[].description") | String | | | | | | [    shutdown](## "ethernet_interfaces.[].shutdown") | Boolean | | | | | - | [    load_interval](## "ethernet_interfaces.[].load_interval") | Integer | | | Min: 0
Max: 600 | Interval in seconds for updating interface counters" | + | [    load_interval](## "ethernet_interfaces.[].load_interval") | Integer | | | Min: 0
Max: 600 | Interval in seconds for updating interface counters. | | [    speed](## "ethernet_interfaces.[].speed") | String | | | | Speed should be set in the format `` or `forced ` or `auto `. | | [    mtu](## "ethernet_interfaces.[].mtu") | Integer | | | Min: 68
Max: 65535 | | - | [    l2_mtu](## "ethernet_interfaces.[].l2_mtu") | Integer | | | Min: 68
Max: 65535 | "l2_mtu" should only be defined for platforms supporting the "l2 mtu" CLI
| - | [    l2_mru](## "ethernet_interfaces.[].l2_mru") | Integer | | | Min: 68
Max: 65535 | "l2_mru" should only be defined for platforms supporting the "l2 mru" CLI
| - | [    vlans](## "ethernet_interfaces.[].vlans") | String | | | | List of switchport vlans as string
For a trunk port this would be a range like "1-200,300"
For an access port this would be a single vlan "123"
| + | [    l2_mtu](## "ethernet_interfaces.[].l2_mtu") | Integer | | | Min: 68
Max: 65535 | "l2_mtu" should only be defined for platforms supporting the "l2 mtu" CLI.
| + | [    l2_mru](## "ethernet_interfaces.[].l2_mru") | Integer | | | Min: 68
Max: 65535 | "l2_mru" should only be defined for platforms supporting the "l2 mru" CLI.
| + | [    vlans](## "ethernet_interfaces.[].vlans") | String | | | | List of switchport vlans as string.
For a trunk port this would be a range like "1-200,300".
For an access port this would be a single vlan "123".
| | [    native_vlan](## "ethernet_interfaces.[].native_vlan") | Integer | | | | | - | [    native_vlan_tag](## "ethernet_interfaces.[].native_vlan_tag") | Boolean | | | | If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence | + | [    native_vlan_tag](## "ethernet_interfaces.[].native_vlan_tag") | Boolean | | | | If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence. | | [    mode](## "ethernet_interfaces.[].mode") | String | | | Valid Values:
- access
- dot1q-tunnel
- trunk
- trunk phone | | | [    phone](## "ethernet_interfaces.[].phone") | Dictionary | | | | | | [      trunk](## "ethernet_interfaces.[].phone.trunk") | String | | | Valid Values:
- tagged
- tagged phone
- untagged
- untagged phone | | | [      vlan](## "ethernet_interfaces.[].phone.vlan") | Integer | | | Min: 1
Max: 4094 | | | [    l2_protocol](## "ethernet_interfaces.[].l2_protocol") | Dictionary | | | | | - | [      encapsulation_dot1q_vlan](## "ethernet_interfaces.[].l2_protocol.encapsulation_dot1q_vlan") | Integer | | | | Vlan tag to configure on sub-interface | - | [      forwarding_profile](## "ethernet_interfaces.[].l2_protocol.forwarding_profile") | String | | | | L2 protocol forwarding profile | + | [      encapsulation_dot1q_vlan](## "ethernet_interfaces.[].l2_protocol.encapsulation_dot1q_vlan") | Integer | | | | Vlan tag to configure on sub-interface. | + | [      forwarding_profile](## "ethernet_interfaces.[].l2_protocol.forwarding_profile") | String | | | | L2 protocol forwarding profile. | | [    trunk_groups](## "ethernet_interfaces.[].trunk_groups") | List, items: String | | | | | | [      - <str>](## "ethernet_interfaces.[].trunk_groups.[]") | String | | | | | | [    type](## "ethernet_interfaces.[].type") | String | | | Valid Values:
- routed
- switched
- l3dot1q
- l2dot1q
- port-channel-member | l3dot1q and l2dot1q are used for sub-interfaces. The parent interface should be defined as routed.
Interface will not be listed in device documentation, unless "type" is set.
| | [    snmp_trap_link_change](## "ethernet_interfaces.[].snmp_trap_link_change") | Boolean | | | | | | [    address_locking](## "ethernet_interfaces.[].address_locking") | Dictionary | | | | | - | [      ipv4](## "ethernet_interfaces.[].address_locking.ipv4") | Boolean | | | | Enable address locking for IPv4 | - | [      ipv6](## "ethernet_interfaces.[].address_locking.ipv6") | Boolean | | | | Enable address locking for IPv6 | + | [      ipv4](## "ethernet_interfaces.[].address_locking.ipv4") | Boolean | | | | Enable address locking for IPv4. | + | [      ipv6](## "ethernet_interfaces.[].address_locking.ipv6") | Boolean | | | | Enable address locking for IPv6. | | [    flowcontrol](## "ethernet_interfaces.[].flowcontrol") | Dictionary | | | | | | [      received](## "ethernet_interfaces.[].flowcontrol.received") | String | | | Valid Values:
- desired
- on
- off | | - | [    vrf](## "ethernet_interfaces.[].vrf") | String | | | | VRF name | + | [    vrf](## "ethernet_interfaces.[].vrf") | String | | | | VRF name. | | [    flow_tracker](## "ethernet_interfaces.[].flow_tracker") | Dictionary | | | | | | [      sampled](## "ethernet_interfaces.[].flow_tracker.sampled") | String | | | | Sampled flow tracker name. | | [      hardware](## "ethernet_interfaces.[].flow_tracker.hardware") | String | | | | Hardware flow tracker name. | @@ -44,48 +44,48 @@ | [      fire_code](## "ethernet_interfaces.[].error_correction_encoding.fire_code") | Boolean | | | | | | [      reed_solomon](## "ethernet_interfaces.[].error_correction_encoding.reed_solomon") | Boolean | | | | | | [    link_tracking_groups](## "ethernet_interfaces.[].link_tracking_groups") | List, items: Dictionary | | | | | - | [      - name](## "ethernet_interfaces.[].link_tracking_groups.[].name") | String | Required, Unique | | | Group name | + | [      - name](## "ethernet_interfaces.[].link_tracking_groups.[].name") | String | Required, Unique | | | Group name. | | [        direction](## "ethernet_interfaces.[].link_tracking_groups.[].direction") | String | | | Valid Values:
- upstream
- downstream | | | [    evpn_ethernet_segment](## "ethernet_interfaces.[].evpn_ethernet_segment") | Dictionary | | | | | - | [      identifier](## "ethernet_interfaces.[].evpn_ethernet_segment.identifier") | String | | | | EVPN Ethernet Segment Identifier (Type 1 format) | + | [      identifier](## "ethernet_interfaces.[].evpn_ethernet_segment.identifier") | String | | | | EVPN Ethernet Segment Identifier (Type 1 format). | | [      redundancy](## "ethernet_interfaces.[].evpn_ethernet_segment.redundancy") | String | | | Valid Values:
- all-active
- single-active | | | [      designated_forwarder_election](## "ethernet_interfaces.[].evpn_ethernet_segment.designated_forwarder_election") | Dictionary | | | | | | [        algorithm](## "ethernet_interfaces.[].evpn_ethernet_segment.designated_forwarder_election.algorithm") | String | | | Valid Values:
- modulus
- preference | | - | [        preference_value](## "ethernet_interfaces.[].evpn_ethernet_segment.designated_forwarder_election.preference_value") | Integer | | | Min: 0
Max: 65535 | Preference_value is only used when "algorithm" is "preference" | - | [        dont_preempt](## "ethernet_interfaces.[].evpn_ethernet_segment.designated_forwarder_election.dont_preempt") | Boolean | | | | Dont_preempt is only used when "algorithm" is "preference" | + | [        preference_value](## "ethernet_interfaces.[].evpn_ethernet_segment.designated_forwarder_election.preference_value") | Integer | | | Min: 0
Max: 65535 | Preference_value is only used when "algorithm" is "preference". | + | [        dont_preempt](## "ethernet_interfaces.[].evpn_ethernet_segment.designated_forwarder_election.dont_preempt") | Boolean | | | | Dont_preempt is only used when "algorithm" is "preference". | | [        hold_time](## "ethernet_interfaces.[].evpn_ethernet_segment.designated_forwarder_election.hold_time") | Integer | | | | | | [        subsequent_hold_time](## "ethernet_interfaces.[].evpn_ethernet_segment.designated_forwarder_election.subsequent_hold_time") | Integer | | | | | | [        candidate_reachability_required](## "ethernet_interfaces.[].evpn_ethernet_segment.designated_forwarder_election.candidate_reachability_required") | Boolean | | | | | | [      mpls](## "ethernet_interfaces.[].evpn_ethernet_segment.mpls") | Dictionary | | | | | | [        shared_index](## "ethernet_interfaces.[].evpn_ethernet_segment.mpls.shared_index") | Integer | | | Min: 1
Max: 1024 | | | [        tunnel_flood_filter_time](## "ethernet_interfaces.[].evpn_ethernet_segment.mpls.tunnel_flood_filter_time") | Integer | | | | | - | [      route_target](## "ethernet_interfaces.[].evpn_ethernet_segment.route_target") | String | | | | EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx | - | [    encapsulation_dot1q_vlan](## "ethernet_interfaces.[].encapsulation_dot1q_vlan") | Integer | | | | VLAN tag to configure on sub-interface | + | [      route_target](## "ethernet_interfaces.[].evpn_ethernet_segment.route_target") | String | | | | EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx. | + | [    encapsulation_dot1q_vlan](## "ethernet_interfaces.[].encapsulation_dot1q_vlan") | Integer | | | | VLAN tag to configure on sub-interface. | | [    encapsulation_vlan](## "ethernet_interfaces.[].encapsulation_vlan") | Dictionary | | | | | | [      client](## "ethernet_interfaces.[].encapsulation_vlan.client") | Dictionary | | | | | | [        dot1q](## "ethernet_interfaces.[].encapsulation_vlan.client.dot1q") | Dictionary | | | | | - | [          vlan](## "ethernet_interfaces.[].encapsulation_vlan.client.dot1q.vlan") | Integer | | | | Client VLAN ID | - | [          outer](## "ethernet_interfaces.[].encapsulation_vlan.client.dot1q.outer") | Integer | | | | Client Outer VLAN ID | - | [          inner](## "ethernet_interfaces.[].encapsulation_vlan.client.dot1q.inner") | Integer | | | | Client Inner VLAN ID | + | [          vlan](## "ethernet_interfaces.[].encapsulation_vlan.client.dot1q.vlan") | Integer | | | | Client VLAN ID. | + | [          outer](## "ethernet_interfaces.[].encapsulation_vlan.client.dot1q.outer") | Integer | | | | Client Outer VLAN ID. | + | [          inner](## "ethernet_interfaces.[].encapsulation_vlan.client.dot1q.inner") | Integer | | | | Client Inner VLAN ID. | | [        unmatched](## "ethernet_interfaces.[].encapsulation_vlan.client.unmatched") | Boolean | | | | | - | [      network](## "ethernet_interfaces.[].encapsulation_vlan.network") | Dictionary | | | | Network encapsulations are all optional and skipped if using client unmatched | + | [      network](## "ethernet_interfaces.[].encapsulation_vlan.network") | Dictionary | | | | Network encapsulations are all optional and skipped if using client unmatched. | | [        dot1q](## "ethernet_interfaces.[].encapsulation_vlan.network.dot1q") | Dictionary | | | | | - | [          vlan](## "ethernet_interfaces.[].encapsulation_vlan.network.dot1q.vlan") | Integer | | | | Network VLAN ID | - | [          outer](## "ethernet_interfaces.[].encapsulation_vlan.network.dot1q.outer") | Integer | | | | Network outer VLAN ID | - | [          inner](## "ethernet_interfaces.[].encapsulation_vlan.network.dot1q.inner") | Integer | | | | Network inner VLAN ID | + | [          vlan](## "ethernet_interfaces.[].encapsulation_vlan.network.dot1q.vlan") | Integer | | | | Network VLAN ID. | + | [          outer](## "ethernet_interfaces.[].encapsulation_vlan.network.dot1q.outer") | Integer | | | | Network outer VLAN ID. | + | [          inner](## "ethernet_interfaces.[].encapsulation_vlan.network.dot1q.inner") | Integer | | | | Network inner VLAN ID. | | [        client](## "ethernet_interfaces.[].encapsulation_vlan.network.client") | Boolean | | | | | | [    vlan_id](## "ethernet_interfaces.[].vlan_id") | Integer | | | Min: 1
Max: 4094 | | - | [    ip_address](## "ethernet_interfaces.[].ip_address") | String | | | | IPv4 address/mask or "dhcp" | + | [    ip_address](## "ethernet_interfaces.[].ip_address") | String | | | | IPv4 address/mask or "dhcp". | | [    ip_address_secondaries](## "ethernet_interfaces.[].ip_address_secondaries") | List, items: String | | | | | | [      - <str>](## "ethernet_interfaces.[].ip_address_secondaries.[]") | String | | | | | | [    ip_verify_unicast_source_reachable_via](## "ethernet_interfaces.[].ip_verify_unicast_source_reachable_via") | String | | | Valid Values:
- any
- rx | | - | [    dhcp_client_accept_default_route](## "ethernet_interfaces.[].dhcp_client_accept_default_route") | Boolean | | | | Install default-route obtained via DHCP | + | [    dhcp_client_accept_default_route](## "ethernet_interfaces.[].dhcp_client_accept_default_route") | Boolean | | | | Install default-route obtained via DHCP. | | [    dhcp_server_ipv4](## "ethernet_interfaces.[].dhcp_server_ipv4") | Boolean | | | | Enable IPv4 DHCP server. | | [    dhcp_server_ipv6](## "ethernet_interfaces.[].dhcp_server_ipv6") | Boolean | | | | Enable IPv6 DHCP server. | | [    ip_helpers](## "ethernet_interfaces.[].ip_helpers") | List, items: Dictionary | | | | | | [      - ip_helper](## "ethernet_interfaces.[].ip_helpers.[].ip_helper") | String | Required, Unique | | | | - | [        source_interface](## "ethernet_interfaces.[].ip_helpers.[].source_interface") | String | | | | Source interface name | - | [        vrf](## "ethernet_interfaces.[].ip_helpers.[].vrf") | String | | | | VRF name | + | [        source_interface](## "ethernet_interfaces.[].ip_helpers.[].source_interface") | String | | | | Source interface name. | + | [        vrf](## "ethernet_interfaces.[].ip_helpers.[].vrf") | String | | | | VRF name. | | [    ip_nat](## "ethernet_interfaces.[].ip_nat") | Dictionary | | | | | | [      service_profile](## "ethernet_interfaces.[].ip_nat.service_profile") | String | | | | NAT interface profile. | | [      destination](## "ethernet_interfaces.[].ip_nat.destination") | Dictionary | | | | | @@ -95,75 +95,75 @@ | [            pool_name](## "ethernet_interfaces.[].ip_nat.destination.dynamic.[].pool_name") | String | Required | | | | | [            priority](## "ethernet_interfaces.[].ip_nat.destination.dynamic.[].priority") | Integer | | | Min: 0
Max: 4294967295 | | | [        static](## "ethernet_interfaces.[].ip_nat.destination.static") | List, items: Dictionary | | | | | - | [          - access_list](## "ethernet_interfaces.[].ip_nat.destination.static.[].access_list") | String | | | | 'access_list' and 'group' are mutual exclusive | + | [          - access_list](## "ethernet_interfaces.[].ip_nat.destination.static.[].access_list") | String | | | | 'access_list' and 'group' are mutual exclusive. | | [            comment](## "ethernet_interfaces.[].ip_nat.destination.static.[].comment") | String | | | | | | [            direction](## "ethernet_interfaces.[].ip_nat.destination.static.[].direction") | String | | | Valid Values:
- egress
- ingress | Egress or ingress can be the default. This depends on source/destination, EOS version, and hardware platform.
EOS might remove this keyword in the configuration. So, check the configuration on targeted HW/SW.
| - | [            group](## "ethernet_interfaces.[].ip_nat.destination.static.[].group") | Integer | | | Min: 1
Max: 65535 | 'access_list' and 'group' are mutual exclusive | - | [            original_ip](## "ethernet_interfaces.[].ip_nat.destination.static.[].original_ip") | String | Required, Unique | | | IPv4 address | - | [            original_port](## "ethernet_interfaces.[].ip_nat.destination.static.[].original_port") | Integer | | | Min: 1
Max: 65535 | | + | [            group](## "ethernet_interfaces.[].ip_nat.destination.static.[].group") | Integer | | | Min: 1
Max: 65535 | 'access_list' and 'group' are mutual exclusive. | + | [            original_ip](## "ethernet_interfaces.[].ip_nat.destination.static.[].original_ip") | String | | | | IPv4 address. The combination of `original_ip` and `original_port` must be unique. | + | [            original_port](## "ethernet_interfaces.[].ip_nat.destination.static.[].original_port") | Integer | | | Min: 1
Max: 65535 | TCP/UDP port. The combination of `original_ip` and `original_port` must be unique. | | [            priority](## "ethernet_interfaces.[].ip_nat.destination.static.[].priority") | Integer | | | Min: 0
Max: 4294967295 | | | [            protocol](## "ethernet_interfaces.[].ip_nat.destination.static.[].protocol") | String | | | Valid Values:
- udp
- tcp | | - | [            translated_ip](## "ethernet_interfaces.[].ip_nat.destination.static.[].translated_ip") | String | Required | | | IPv4 address | - | [            translated_port](## "ethernet_interfaces.[].ip_nat.destination.static.[].translated_port") | Integer | | | Min: 1
Max: 65535 | requires 'original_port' | + | [            translated_ip](## "ethernet_interfaces.[].ip_nat.destination.static.[].translated_ip") | String | Required | | | IPv4 address. | + | [            translated_port](## "ethernet_interfaces.[].ip_nat.destination.static.[].translated_port") | Integer | | | Min: 1
Max: 65535 | requires 'original_port'. | | [      source](## "ethernet_interfaces.[].ip_nat.source") | Dictionary | | | | | | [        dynamic](## "ethernet_interfaces.[].ip_nat.source.dynamic") | List, items: Dictionary | | | | | | [          - access_list](## "ethernet_interfaces.[].ip_nat.source.dynamic.[].access_list") | String | Required, Unique | | | | | [            comment](## "ethernet_interfaces.[].ip_nat.source.dynamic.[].comment") | String | | | | | | [            nat_type](## "ethernet_interfaces.[].ip_nat.source.dynamic.[].nat_type") | String | Required | | Valid Values:
- overload
- pool
- pool-address-only
- pool-full-cone | | - | [            pool_name](## "ethernet_interfaces.[].ip_nat.source.dynamic.[].pool_name") | String | | | | required if 'nat_type' is pool, pool-address-only or pool-full-cone
ignored if 'nat_type' is overload
| + | [            pool_name](## "ethernet_interfaces.[].ip_nat.source.dynamic.[].pool_name") | String | | | | required if 'nat_type' is pool, pool-address-only or pool-full-cone.
ignored if 'nat_type' is overload.
| | [            priority](## "ethernet_interfaces.[].ip_nat.source.dynamic.[].priority") | Integer | | | Min: 0
Max: 4294967295 | | | [        static](## "ethernet_interfaces.[].ip_nat.source.static") | List, items: Dictionary | | | | | - | [          - access_list](## "ethernet_interfaces.[].ip_nat.source.static.[].access_list") | String | | | | 'access_list' and 'group' are mutual exclusive | + | [          - access_list](## "ethernet_interfaces.[].ip_nat.source.static.[].access_list") | String | | | | 'access_list' and 'group' are mutual exclusive. | | [            comment](## "ethernet_interfaces.[].ip_nat.source.static.[].comment") | String | | | | | | [            direction](## "ethernet_interfaces.[].ip_nat.source.static.[].direction") | String | | | Valid Values:
- egress
- ingress | Egress or ingress can be the default. This depends on source/destination, EOS version, and hardware platform.
EOS might remove this keyword in the configuration. So, check the configuration on targeted HW/SW.
| - | [            group](## "ethernet_interfaces.[].ip_nat.source.static.[].group") | Integer | | | Min: 1
Max: 65535 | 'access_list' and 'group' are mutual exclusive | - | [            original_ip](## "ethernet_interfaces.[].ip_nat.source.static.[].original_ip") | String | Required, Unique | | | IPv4 address | - | [            original_port](## "ethernet_interfaces.[].ip_nat.source.static.[].original_port") | Integer | | | Min: 1
Max: 65535 | | + | [            group](## "ethernet_interfaces.[].ip_nat.source.static.[].group") | Integer | | | Min: 1
Max: 65535 | 'access_list' and 'group' are mutual exclusive. | + | [            original_ip](## "ethernet_interfaces.[].ip_nat.source.static.[].original_ip") | String | | | | IPv4 address. The combination of `original_ip` and `original_port` must be unique. | + | [            original_port](## "ethernet_interfaces.[].ip_nat.source.static.[].original_port") | Integer | | | Min: 1
Max: 65535 | TCP/UDP port. The combination of `original_ip` and `original_port` must be unique. | | [            priority](## "ethernet_interfaces.[].ip_nat.source.static.[].priority") | Integer | | | Min: 0
Max: 4294967295 | | | [            protocol](## "ethernet_interfaces.[].ip_nat.source.static.[].protocol") | String | | | Valid Values:
- udp
- tcp | | - | [            translated_ip](## "ethernet_interfaces.[].ip_nat.source.static.[].translated_ip") | String | Required | | | IPv4 address | - | [            translated_port](## "ethernet_interfaces.[].ip_nat.source.static.[].translated_port") | Integer | | | Min: 1
Max: 65535 | requires 'original_port' | + | [            translated_ip](## "ethernet_interfaces.[].ip_nat.source.static.[].translated_ip") | String | Required | | | IPv4 address. | + | [            translated_port](## "ethernet_interfaces.[].ip_nat.source.static.[].translated_port") | Integer | | | Min: 1
Max: 65535 | requires 'original_port'. | | [    ipv6_enable](## "ethernet_interfaces.[].ipv6_enable") | Boolean | | | | | | [    ipv6_address](## "ethernet_interfaces.[].ipv6_address") | String | | | | | - | [    ipv6_address_link_local](## "ethernet_interfaces.[].ipv6_address_link_local") | String | | | | Link local IPv6 address/mask | + | [    ipv6_address_link_local](## "ethernet_interfaces.[].ipv6_address_link_local") | String | | | | Link local IPv6 address/mask. | | [    ipv6_nd_ra_disabled](## "ethernet_interfaces.[].ipv6_nd_ra_disabled") | Boolean | | | | | | [    ipv6_nd_managed_config_flag](## "ethernet_interfaces.[].ipv6_nd_managed_config_flag") | Boolean | | | | | | [    ipv6_nd_prefixes](## "ethernet_interfaces.[].ipv6_nd_prefixes") | List, items: Dictionary | | | | | | [      - ipv6_prefix](## "ethernet_interfaces.[].ipv6_nd_prefixes.[].ipv6_prefix") | String | Required, Unique | | | | - | [        valid_lifetime](## "ethernet_interfaces.[].ipv6_nd_prefixes.[].valid_lifetime") | String | | | | Infinite or lifetime in seconds | - | [        preferred_lifetime](## "ethernet_interfaces.[].ipv6_nd_prefixes.[].preferred_lifetime") | String | | | | Infinite or lifetime in seconds | + | [        valid_lifetime](## "ethernet_interfaces.[].ipv6_nd_prefixes.[].valid_lifetime") | String | | | | Infinite or lifetime in seconds. | + | [        preferred_lifetime](## "ethernet_interfaces.[].ipv6_nd_prefixes.[].preferred_lifetime") | String | | | | Infinite or lifetime in seconds. | | [        no_autoconfig_flag](## "ethernet_interfaces.[].ipv6_nd_prefixes.[].no_autoconfig_flag") | Boolean | | | | | | [    ipv6_dhcp_relay_destinations](## "ethernet_interfaces.[].ipv6_dhcp_relay_destinations") | List, items: Dictionary | | | | | - | [      - address](## "ethernet_interfaces.[].ipv6_dhcp_relay_destinations.[].address") | String | Required, Unique | | | DHCP server's IPv6 address | + | [      - address](## "ethernet_interfaces.[].ipv6_dhcp_relay_destinations.[].address") | String | Required, Unique | | | DHCP server's IPv6 address. | | [        vrf](## "ethernet_interfaces.[].ipv6_dhcp_relay_destinations.[].vrf") | String | | | | | - | [        local_interface](## "ethernet_interfaces.[].ipv6_dhcp_relay_destinations.[].local_interface") | String | | | | Local interface to communicate with DHCP server - mutually exclusive to source_address | - | [        source_address](## "ethernet_interfaces.[].ipv6_dhcp_relay_destinations.[].source_address") | String | | | | Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface | - | [        link_address](## "ethernet_interfaces.[].ipv6_dhcp_relay_destinations.[].link_address") | String | | | | Override the default link address specified in the relayed DHCP packet | - | [    access_group_in](## "ethernet_interfaces.[].access_group_in") | String | | | | Access list name | - | [    access_group_out](## "ethernet_interfaces.[].access_group_out") | String | | | | Access list name | - | [    ipv6_access_group_in](## "ethernet_interfaces.[].ipv6_access_group_in") | String | | | | IPv6 access list name | - | [    ipv6_access_group_out](## "ethernet_interfaces.[].ipv6_access_group_out") | String | | | | IPv6 access list name | - | [    mac_access_group_in](## "ethernet_interfaces.[].mac_access_group_in") | String | | | | MAC access list name | - | [    mac_access_group_out](## "ethernet_interfaces.[].mac_access_group_out") | String | | | | MAC access list name | - | [    multicast](## "ethernet_interfaces.[].multicast") | Dictionary | | | | Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both | + | [        local_interface](## "ethernet_interfaces.[].ipv6_dhcp_relay_destinations.[].local_interface") | String | | | | Local interface to communicate with DHCP server - mutually exclusive to source_address. | + | [        source_address](## "ethernet_interfaces.[].ipv6_dhcp_relay_destinations.[].source_address") | String | | | | Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface. | + | [        link_address](## "ethernet_interfaces.[].ipv6_dhcp_relay_destinations.[].link_address") | String | | | | Override the default link address specified in the relayed DHCP packet. | + | [    access_group_in](## "ethernet_interfaces.[].access_group_in") | String | | | | Access list name. | + | [    access_group_out](## "ethernet_interfaces.[].access_group_out") | String | | | | Access list name. | + | [    ipv6_access_group_in](## "ethernet_interfaces.[].ipv6_access_group_in") | String | | | | IPv6 access list name. | + | [    ipv6_access_group_out](## "ethernet_interfaces.[].ipv6_access_group_out") | String | | | | IPv6 access list name. | + | [    mac_access_group_in](## "ethernet_interfaces.[].mac_access_group_in") | String | | | | MAC access list name. | + | [    mac_access_group_out](## "ethernet_interfaces.[].mac_access_group_out") | String | | | | MAC access list name. | + | [    multicast](## "ethernet_interfaces.[].multicast") | Dictionary | | | | Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both. | | [      ipv4](## "ethernet_interfaces.[].multicast.ipv4") | Dictionary | | | | | | [        boundaries](## "ethernet_interfaces.[].multicast.ipv4.boundaries") | List, items: Dictionary | | | | | - | [          - boundary](## "ethernet_interfaces.[].multicast.ipv4.boundaries.[].boundary") | String | | | | ACL name or multicast IP subnet | + | [          - boundary](## "ethernet_interfaces.[].multicast.ipv4.boundaries.[].boundary") | String | | | | ACL name or multicast IP subnet. | | [            out](## "ethernet_interfaces.[].multicast.ipv4.boundaries.[].out") | Boolean | | | | | | [        static](## "ethernet_interfaces.[].multicast.ipv4.static") | Boolean | | | | | | [      ipv6](## "ethernet_interfaces.[].multicast.ipv6") | Dictionary | | | | | | [        boundaries](## "ethernet_interfaces.[].multicast.ipv6.boundaries") | List, items: Dictionary | | | | | - | [          - boundary](## "ethernet_interfaces.[].multicast.ipv6.boundaries.[].boundary") | String | | | | ACL name or multicast IP subnet | + | [          - boundary](## "ethernet_interfaces.[].multicast.ipv6.boundaries.[].boundary") | String | | | | ACL name or multicast IP subnet. | | [        static](## "ethernet_interfaces.[].multicast.ipv6.static") | Boolean | | | | | | [    ospf_network_point_to_point](## "ethernet_interfaces.[].ospf_network_point_to_point") | Boolean | | | | | | [    ospf_area](## "ethernet_interfaces.[].ospf_area") | String | | | | | | [    ospf_cost](## "ethernet_interfaces.[].ospf_cost") | Integer | | | | | | [    ospf_authentication](## "ethernet_interfaces.[].ospf_authentication") | String | | | Valid Values:
- none
- simple
- message-digest | | - | [    ospf_authentication_key](## "ethernet_interfaces.[].ospf_authentication_key") | String | | | | Encrypted password - only type 7 supported | + | [    ospf_authentication_key](## "ethernet_interfaces.[].ospf_authentication_key") | String | | | | Encrypted password - only type 7 supported. | | [    ospf_message_digest_keys](## "ethernet_interfaces.[].ospf_message_digest_keys") | List, items: Dictionary | | | | | | [      - id](## "ethernet_interfaces.[].ospf_message_digest_keys.[].id") | Integer | Required, Unique | | | | | [        hash_algorithm](## "ethernet_interfaces.[].ospf_message_digest_keys.[].hash_algorithm") | String | | | Valid Values:
- md5
- sha1
- sha256
- sha384
- sha512 | | - | [        key](## "ethernet_interfaces.[].ospf_message_digest_keys.[].key") | String | | | | Encrypted password - only type 7 supported | + | [        key](## "ethernet_interfaces.[].ospf_message_digest_keys.[].key") | String | | | | Encrypted password - only type 7 supported. | | [    pim](## "ethernet_interfaces.[].pim") | Dictionary | | | | | | [      ipv4](## "ethernet_interfaces.[].pim.ipv4") | Dictionary | | | | | | [        border_router](## "ethernet_interfaces.[].pim.ipv4.border_router") | Boolean | | | | Configure PIM border router. EOS default is false. | @@ -176,31 +176,36 @@ | [          interval](## "ethernet_interfaces.[].pim.ipv4.hello.interval") | Integer | | | Min: 1
Max: 65535 | PIM hello interval in seconds. | | [    mac_security](## "ethernet_interfaces.[].mac_security") | Dictionary | | | | | | [      profile](## "ethernet_interfaces.[].mac_security.profile") | String | | | | | + | [    tcp_mss_ceiling](## "ethernet_interfaces.[].tcp_mss_ceiling") | Dictionary | | | | The TCP MSS clamping feature involves clamping the maximum segment size (MSS) in the TCP header
of TCP SYN packets if it exceeds the configured MSS ceiling limit for the interface. | + | [      ipv4_segment_size](## "ethernet_interfaces.[].tcp_mss_ceiling.ipv4_segment_size") | Integer | | | Min: 64
Max: 65475 | | + | [      ipv6_segment_size](## "ethernet_interfaces.[].tcp_mss_ceiling.ipv6_segment_size") | Integer | | | Min: 64
Max: 65475 | | + | [      direction](## "ethernet_interfaces.[].tcp_mss_ceiling.direction") | String | | | Valid Values:
- egress
- ingress | | | [    channel_group](## "ethernet_interfaces.[].channel_group") | Dictionary | | | | | | [      id](## "ethernet_interfaces.[].channel_group.id") | Integer | | | | | | [      mode](## "ethernet_interfaces.[].channel_group.mode") | String | | | Valid Values:
- on
- active
- passive | | - | [    isis_enable](## "ethernet_interfaces.[].isis_enable") | String | | | | ISIS instance | + | [    isis_enable](## "ethernet_interfaces.[].isis_enable") | String | | | | ISIS instance. | + | [    isis_bfd](## "ethernet_interfaces.[].isis_bfd") | Boolean | | | | Enable BFD for ISIS. | | [    isis_passive](## "ethernet_interfaces.[].isis_passive") | Boolean | | | | | | [    isis_metric](## "ethernet_interfaces.[].isis_metric") | Integer | | | | | | [    isis_network_point_to_point](## "ethernet_interfaces.[].isis_network_point_to_point") | Boolean | | | | | | [    isis_circuit_type](## "ethernet_interfaces.[].isis_circuit_type") | String | | | Valid Values:
- level-1-2
- level-1
- level-2 | | | [    isis_hello_padding](## "ethernet_interfaces.[].isis_hello_padding") | Boolean | | | | | | [    isis_authentication_mode](## "ethernet_interfaces.[].isis_authentication_mode") | String | | | Valid Values:
- text
- md5 | | - | [    isis_authentication_key](## "ethernet_interfaces.[].isis_authentication_key") | String | | | | Type-7 encrypted password | + | [    isis_authentication_key](## "ethernet_interfaces.[].isis_authentication_key") | String | | | | Type-7 encrypted password. | | [    poe](## "ethernet_interfaces.[].poe") | Dictionary | | | | | | [      disabled](## "ethernet_interfaces.[].poe.disabled") | Boolean | | `False` | | Disable PoE on a POE capable port. PoE is enabled on all ports that support it by default in EOS. | - | [      priority](## "ethernet_interfaces.[].poe.priority") | String | | | Valid Values:
- critical
- high
- medium
- low | Prioritize a port's power in the event that one of the switch's power supplies loses power | - | [      reboot](## "ethernet_interfaces.[].poe.reboot") | Dictionary | | | | Set the PoE power behavior for a PoE port when the system is rebooted | - | [        action](## "ethernet_interfaces.[].poe.reboot.action") | String | | | Valid Values:
- maintain
- power-off | PoE action for interface | - | [      link_down](## "ethernet_interfaces.[].poe.link_down") | Dictionary | | | | Set the PoE power behavior for a PoE port when the port goes down | - | [        action](## "ethernet_interfaces.[].poe.link_down.action") | String | | | Valid Values:
- maintain
- power-off | PoE action for interface | + | [      priority](## "ethernet_interfaces.[].poe.priority") | String | | | Valid Values:
- critical
- high
- medium
- low | Prioritize a port's power in the event that one of the switch's power supplies loses power. | + | [      reboot](## "ethernet_interfaces.[].poe.reboot") | Dictionary | | | | Set the PoE power behavior for a PoE port when the system is rebooted. | + | [        action](## "ethernet_interfaces.[].poe.reboot.action") | String | | | Valid Values:
- maintain
- power-off | PoE action for interface. | + | [      link_down](## "ethernet_interfaces.[].poe.link_down") | Dictionary | | | | Set the PoE power behavior for a PoE port when the port goes down. | + | [        action](## "ethernet_interfaces.[].poe.link_down.action") | String | | | Valid Values:
- maintain
- power-off | PoE action for interface. | | [        power_off_delay](## "ethernet_interfaces.[].poe.link_down.power_off_delay") | Integer | | | Min: 1
Max: 86400 | Number of seconds to delay shutting the power off after a link down event occurs. Default value is 5 seconds in EOS. | - | [      shutdown](## "ethernet_interfaces.[].poe.shutdown") | Dictionary | | | | Set the PoE power behavior for a PoE port when the port is admin down | - | [        action](## "ethernet_interfaces.[].poe.shutdown.action") | String | | | Valid Values:
- maintain
- power-off | PoE action for interface | + | [      shutdown](## "ethernet_interfaces.[].poe.shutdown") | Dictionary | | | | Set the PoE power behavior for a PoE port when the port is admin down. | + | [        action](## "ethernet_interfaces.[].poe.shutdown.action") | String | | | Valid Values:
- maintain
- power-off | PoE action for interface. | | [      limit](## "ethernet_interfaces.[].poe.limit") | Dictionary | | | | Override the hardware-negotiated power limit using either wattage or a power class. Note that if using a power class, AVD will automatically convert the class value to the wattage value corresponding to that power class. | | [        class](## "ethernet_interfaces.[].poe.limit.class") | Integer | | | Min: 0
Max: 8 | | | [        watts](## "ethernet_interfaces.[].poe.limit.watts") | String | | | | | - | [        fixed](## "ethernet_interfaces.[].poe.limit.fixed") | Boolean | | | | Set to ignore hardware classification | + | [        fixed](## "ethernet_interfaces.[].poe.limit.fixed") | Boolean | | | | Set to ignore hardware classification. | | [      negotiation_lldp](## "ethernet_interfaces.[].poe.negotiation_lldp") | Boolean | | | | Disable to prevent port from negotiating power with powered devices over LLDP. Enabled by default in EOS. | | [      legacy_detect](## "ethernet_interfaces.[].poe.legacy_detect") | Boolean | | | | Allow a subset of legacy devices to work with the PoE switch. Disabled by default in EOS because it can cause false positive detections. | | [    ptp](## "ethernet_interfaces.[].ptp") | Dictionary | | | | | @@ -213,22 +218,22 @@ | [      sync_message](## "ethernet_interfaces.[].ptp.sync_message") | Dictionary | | | | | | [        interval](## "ethernet_interfaces.[].ptp.sync_message.interval") | Integer | | | | | | [      role](## "ethernet_interfaces.[].ptp.role") | String | | | Valid Values:
- master
- dynamic | | - | [      vlan](## "ethernet_interfaces.[].ptp.vlan") | String | | | | VLAN can be 'all' or list of vlans as string | + | [      vlan](## "ethernet_interfaces.[].ptp.vlan") | String | | | | VLAN can be 'all' or list of vlans as string. | | [      transport](## "ethernet_interfaces.[].ptp.transport") | String | | | Valid Values:
- ipv4
- ipv6
- layer2 | | - | [    profile](## "ethernet_interfaces.[].profile") | String | | | | Interface profile | + | [    profile](## "ethernet_interfaces.[].profile") | String | | | | Interface profile. | | [    storm_control](## "ethernet_interfaces.[].storm_control") | Dictionary | | | | | | [      all](## "ethernet_interfaces.[].storm_control.all") | Dictionary | | | | | - | [        level](## "ethernet_interfaces.[].storm_control.all.level") | String | | | | Configure maximum storm-control level | - | [        unit](## "ethernet_interfaces.[].storm_control.all.unit") | String | | `percent` | Valid Values:
- percent
- pps | Optional field and is hardware dependent | + | [        level](## "ethernet_interfaces.[].storm_control.all.level") | String | | | | Configure maximum storm-control level. | + | [        unit](## "ethernet_interfaces.[].storm_control.all.unit") | String | | `percent` | Valid Values:
- percent
- pps | Optional field and is hardware dependent. | | [      broadcast](## "ethernet_interfaces.[].storm_control.broadcast") | Dictionary | | | | | - | [        level](## "ethernet_interfaces.[].storm_control.broadcast.level") | String | | | | Configure maximum storm-control level | - | [        unit](## "ethernet_interfaces.[].storm_control.broadcast.unit") | String | | `percent` | Valid Values:
- percent
- pps | Optional field and is hardware dependent | + | [        level](## "ethernet_interfaces.[].storm_control.broadcast.level") | String | | | | Configure maximum storm-control level. | + | [        unit](## "ethernet_interfaces.[].storm_control.broadcast.unit") | String | | `percent` | Valid Values:
- percent
- pps | Optional field and is hardware dependent. | | [      multicast](## "ethernet_interfaces.[].storm_control.multicast") | Dictionary | | | | | - | [        level](## "ethernet_interfaces.[].storm_control.multicast.level") | String | | | | Configure maximum storm-control level | - | [        unit](## "ethernet_interfaces.[].storm_control.multicast.unit") | String | | `percent` | Valid Values:
- percent
- pps | Optional field and is hardware dependent | + | [        level](## "ethernet_interfaces.[].storm_control.multicast.level") | String | | | | Configure maximum storm-control level. | + | [        unit](## "ethernet_interfaces.[].storm_control.multicast.unit") | String | | `percent` | Valid Values:
- percent
- pps | Optional field and is hardware dependent. | | [      unknown_unicast](## "ethernet_interfaces.[].storm_control.unknown_unicast") | Dictionary | | | | | - | [        level](## "ethernet_interfaces.[].storm_control.unknown_unicast.level") | String | | | | Configure maximum storm-control level | - | [        unit](## "ethernet_interfaces.[].storm_control.unknown_unicast.unit") | String | | `percent` | Valid Values:
- percent
- pps | Optional field and is hardware dependent | + | [        level](## "ethernet_interfaces.[].storm_control.unknown_unicast.level") | String | | | | Configure maximum storm-control level. | + | [        unit](## "ethernet_interfaces.[].storm_control.unknown_unicast.unit") | String | | `percent` | Valid Values:
- percent
- pps | Optional field and is hardware dependent. | | [    logging](## "ethernet_interfaces.[].logging") | Dictionary | | | | | | [      event](## "ethernet_interfaces.[].logging.event") | Dictionary | | | | | | [        link_status](## "ethernet_interfaces.[].logging.event.link_status") | Boolean | | | | | @@ -238,12 +243,12 @@ | [    lldp](## "ethernet_interfaces.[].lldp") | Dictionary | | | | | | [      transmit](## "ethernet_interfaces.[].lldp.transmit") | Boolean | | | | | | [      receive](## "ethernet_interfaces.[].lldp.receive") | Boolean | | | | | - | [      ztp_vlan](## "ethernet_interfaces.[].lldp.ztp_vlan") | Integer | | | | ZTP vlan number | + | [      ztp_vlan](## "ethernet_interfaces.[].lldp.ztp_vlan") | Integer | | | | ZTP vlan number. | | [    trunk_private_vlan_secondary](## "ethernet_interfaces.[].trunk_private_vlan_secondary") | Boolean | | | | | - | [    pvlan_mapping](## "ethernet_interfaces.[].pvlan_mapping") | String | | | | List of vlans as string | + | [    pvlan_mapping](## "ethernet_interfaces.[].pvlan_mapping") | String | | | | List of vlans as string. | | [    vlan_translations](## "ethernet_interfaces.[].vlan_translations") | List, items: Dictionary | | | | | - | [      - from](## "ethernet_interfaces.[].vlan_translations.[].from") | String | | | | List of vlans as string (only one vlan if direction is "both") | - | [        to](## "ethernet_interfaces.[].vlan_translations.[].to") | Integer | | | | VLAN ID | + | [      - from](## "ethernet_interfaces.[].vlan_translations.[].from") | String | | | | List of vlans as string (only one vlan if direction is "both"). | + | [        to](## "ethernet_interfaces.[].vlan_translations.[].to") | Integer | | | | VLAN ID. | | [        direction](## "ethernet_interfaces.[].vlan_translations.[].direction") | String | | `both` | Valid Values:
- in
- out
- both | | | [    dot1x](## "ethernet_interfaces.[].dot1x") | Dictionary | | | | | | [      port_control](## "ethernet_interfaces.[].dot1x.port_control") | String | | | Valid Values:
- auto
- force-authorized
- force-unauthorized | | @@ -264,7 +269,7 @@ | [      timeout](## "ethernet_interfaces.[].dot1x.timeout") | Dictionary | | | | | | [        idle_host](## "ethernet_interfaces.[].dot1x.timeout.idle_host") | Integer | | | Min: 10
Max: 65535 | | | [        quiet_period](## "ethernet_interfaces.[].dot1x.timeout.quiet_period") | Integer | | | Min: 1
Max: 65535 | | - | [        reauth_period](## "ethernet_interfaces.[].dot1x.timeout.reauth_period") | String | | | | Value can be 60-4294967295 or 'server' | + | [        reauth_period](## "ethernet_interfaces.[].dot1x.timeout.reauth_period") | String | | | | Value can be 60-4294967295 or 'server'. | | [        reauth_timeout_ignore](## "ethernet_interfaces.[].dot1x.timeout.reauth_timeout_ignore") | Boolean | | | | | | [        tx_period](## "ethernet_interfaces.[].dot1x.timeout.tx_period") | Integer | | | Min: 1
Max: 65535 | | | [      reauthorization_request_limit](## "ethernet_interfaces.[].dot1x.reauthorization_request_limit") | Integer | | | Min: 1
Max: 10 | | @@ -276,13 +281,13 @@ | [        authentication_failure_fallback_mba](## "ethernet_interfaces.[].dot1x.eapol.authentication_failure_fallback_mba") | Dictionary | | | | | | [          enabled](## "ethernet_interfaces.[].dot1x.eapol.authentication_failure_fallback_mba.enabled") | Boolean | | | | | | [          timeout](## "ethernet_interfaces.[].dot1x.eapol.authentication_failure_fallback_mba.timeout") | Integer | | | Min: 0
Max: 65535 | | - | [    service_profile](## "ethernet_interfaces.[].service_profile") | String | | | | QOS profile | + | [    service_profile](## "ethernet_interfaces.[].service_profile") | String | | | | QOS profile. | | [    shape](## "ethernet_interfaces.[].shape") | Dictionary | | | | | - | [      rate](## "ethernet_interfaces.[].shape.rate") | String | | | | Rate in kbps, pps or percent
Supported options are platform dependent
Examples:
- "5000 kbps"
- "1000 pps"
- "20 percent"
| + | [      rate](## "ethernet_interfaces.[].shape.rate") | String | | | | Rate in kbps, pps or percent.
Supported options are platform dependent.
Examples:
- "5000 kbps"
- "1000 pps"
- "20 percent"
| | [    qos](## "ethernet_interfaces.[].qos") | Dictionary | | | | | | [      trust](## "ethernet_interfaces.[].qos.trust") | String | | | Valid Values:
- dscp
- cos
- disabled | | - | [      dscp](## "ethernet_interfaces.[].qos.dscp") | Integer | | | | DSCP value | - | [      cos](## "ethernet_interfaces.[].qos.cos") | Integer | | | | COS value | + | [      dscp](## "ethernet_interfaces.[].qos.dscp") | Integer | | | | DSCP value. | + | [      cos](## "ethernet_interfaces.[].qos.cos") | Integer | | | | COS value. | | [    spanning_tree_bpdufilter](## "ethernet_interfaces.[].spanning_tree_bpdufilter") | String | | | Valid Values:
- enabled
- disabled
- True
- False
- true
- false | | | [    spanning_tree_bpduguard](## "ethernet_interfaces.[].spanning_tree_bpduguard") | String | | | Valid Values:
- enabled
- disabled
- True
- False
- true
- false | | | [    spanning_tree_guard](## "ethernet_interfaces.[].spanning_tree_guard") | String | | | Valid Values:
- loop
- root
- disabled | | @@ -295,14 +300,14 @@ | [          no_drop](## "ethernet_interfaces.[].priority_flow_control.priorities.[].no_drop") | Boolean | | | | | | [    bfd](## "ethernet_interfaces.[].bfd") | Dictionary | | | | | | [      echo](## "ethernet_interfaces.[].bfd.echo") | Boolean | | | | | - | [      interval](## "ethernet_interfaces.[].bfd.interval") | Integer | | | | Interval in milliseconds | - | [      min_rx](## "ethernet_interfaces.[].bfd.min_rx") | Integer | | | | Rate in milliseconds | + | [      interval](## "ethernet_interfaces.[].bfd.interval") | Integer | | | | Interval in milliseconds. | + | [      min_rx](## "ethernet_interfaces.[].bfd.min_rx") | Integer | | | | Rate in milliseconds. | | [      multiplier](## "ethernet_interfaces.[].bfd.multiplier") | Integer | | | Min: 3
Max: 50 | | | [    service_policy](## "ethernet_interfaces.[].service_policy") | Dictionary | | | | | | [      pbr](## "ethernet_interfaces.[].service_policy.pbr") | Dictionary | | | | | - | [        input](## "ethernet_interfaces.[].service_policy.pbr.input") | String | | | | Policy Based Routing Policy-map name | + | [        input](## "ethernet_interfaces.[].service_policy.pbr.input") | String | | | | Policy Based Routing Policy-map name. | | [      qos](## "ethernet_interfaces.[].service_policy.qos") | Dictionary | | | | | - | [        input](## "ethernet_interfaces.[].service_policy.qos.input") | String | Required | | | Quality of Service Policy-map name | + | [        input](## "ethernet_interfaces.[].service_policy.qos.input") | String | Required | | | Quality of Service Policy-map name. | | [    mpls](## "ethernet_interfaces.[].mpls") | Dictionary | | | | | | [      ip](## "ethernet_interfaces.[].mpls.ip") | Boolean | | | | | | [      ldp](## "ethernet_interfaces.[].mpls.ldp") | Dictionary | | | | | @@ -313,14 +318,16 @@ | [      multiplier](## "ethernet_interfaces.[].lacp_timer.multiplier") | Integer | | | Min: 3
Max: 3000 | | | [    lacp_port_priority](## "ethernet_interfaces.[].lacp_port_priority") | Integer | | | Min: 0
Max: 65535 | | | [    transceiver](## "ethernet_interfaces.[].transceiver") | Dictionary | | | | | + | [      frequency](## "ethernet_interfaces.[].transceiver.frequency") | String | | | | Transceiver Laser Frequency in GHz (min 190000, max 200000). | + | [      frequency_unit](## "ethernet_interfaces.[].transceiver.frequency_unit") | String | | | Valid Values:
- ghz | Unit of Transceiver Laser Frequency. | | [      media](## "ethernet_interfaces.[].transceiver.media") | Dictionary | | | | | - | [        override](## "ethernet_interfaces.[].transceiver.media.override") | String | | | | Transceiver type | + | [        override](## "ethernet_interfaces.[].transceiver.media.override") | String | | | | Transceiver type. | | [    ip_proxy_arp](## "ethernet_interfaces.[].ip_proxy_arp") | Boolean | | | | | | [    traffic_policy](## "ethernet_interfaces.[].traffic_policy") | Dictionary | | | | | - | [      input](## "ethernet_interfaces.[].traffic_policy.input") | String | | | | Ingress traffic policy | - | [      output](## "ethernet_interfaces.[].traffic_policy.output") | String | | | | Egress traffic policy | + | [      input](## "ethernet_interfaces.[].traffic_policy.input") | String | | | | Ingress traffic policy. | + | [      output](## "ethernet_interfaces.[].traffic_policy.output") | String | | | | Egress traffic policy. | | [    bgp](## "ethernet_interfaces.[].bgp") | Dictionary | | | | | - | [      session_tracker](## "ethernet_interfaces.[].bgp.session_tracker") | String | | | | Name of session tracker | + | [      session_tracker](## "ethernet_interfaces.[].bgp.session_tracker") | String | | | | Name of session tracker. | | [    ip_igmp_host_proxy](## "ethernet_interfaces.[].ip_igmp_host_proxy") | Dictionary | | | | | | [      enabled](## "ethernet_interfaces.[].ip_igmp_host_proxy.enabled") | Boolean | | | | | | [      groups](## "ethernet_interfaces.[].ip_igmp_host_proxy.groups") | List, items: Dictionary | | | | | @@ -333,60 +340,60 @@ | [      access_lists](## "ethernet_interfaces.[].ip_igmp_host_proxy.access_lists") | List, items: Dictionary | | | | Non-standard Access List name. | | [        - name](## "ethernet_interfaces.[].ip_igmp_host_proxy.access_lists.[].name") | String | Required, Unique | | | | | [      version](## "ethernet_interfaces.[].ip_igmp_host_proxy.version") | Integer | | | Min: 1
Max: 3 | IGMP version on IGMP host-proxy interface. | - | [    peer](## "ethernet_interfaces.[].peer") | String | | | | Key only used for documentation or validation purposes | - | [    peer_interface](## "ethernet_interfaces.[].peer_interface") | String | | | | Key only used for documentation or validation purposes | - | [    peer_type](## "ethernet_interfaces.[].peer_type") | String | | | | Key only used for documentation or validation purposes | + | [    peer](## "ethernet_interfaces.[].peer") | String | | | | Key only used for documentation or validation purposes. | + | [    peer_interface](## "ethernet_interfaces.[].peer_interface") | String | | | | Key only used for documentation or validation purposes. | + | [    peer_type](## "ethernet_interfaces.[].peer_type") | String | | | | Key only used for documentation or validation purposes. | | [    sflow](## "ethernet_interfaces.[].sflow") | Dictionary | | | | | | [      enable](## "ethernet_interfaces.[].sflow.enable") | Boolean | | | | | | [      egress](## "ethernet_interfaces.[].sflow.egress") | Dictionary | | | | | | [        enable](## "ethernet_interfaces.[].sflow.egress.enable") | Boolean | | | | | | [        unmodified_enable](## "ethernet_interfaces.[].sflow.egress.unmodified_enable") | Boolean | | | | | - | [    port_profile](## "ethernet_interfaces.[].port_profile") | String | | | | Key only used for documentation or validation purposes | + | [    port_profile](## "ethernet_interfaces.[].port_profile") | String | | | | Key only used for documentation or validation purposes. | | [    uc_tx_queues](## "ethernet_interfaces.[].uc_tx_queues") | List, items: Dictionary | | | | | - | [      - id](## "ethernet_interfaces.[].uc_tx_queues.[].id") | Integer | Required, Unique | | | TX-Queue ID | + | [      - id](## "ethernet_interfaces.[].uc_tx_queues.[].id") | Integer | Required, Unique | | | TX-Queue ID. | | [        random_detect](## "ethernet_interfaces.[].uc_tx_queues.[].random_detect") | Dictionary | | | | | - | [          ecn](## "ethernet_interfaces.[].uc_tx_queues.[].random_detect.ecn") | Dictionary | | | | Explicit Congestion Notification | - | [            count](## "ethernet_interfaces.[].uc_tx_queues.[].random_detect.ecn.count") | Boolean | | | | Enable counter for random-detect ECNs | + | [          ecn](## "ethernet_interfaces.[].uc_tx_queues.[].random_detect.ecn") | Dictionary | | | | Explicit Congestion Notification. | + | [            count](## "ethernet_interfaces.[].uc_tx_queues.[].random_detect.ecn.count") | Boolean | | | | Enable counter for random-detect ECNs. | | [            threshold](## "ethernet_interfaces.[].uc_tx_queues.[].random_detect.ecn.threshold") | Dictionary | | | | | - | [              units](## "ethernet_interfaces.[].uc_tx_queues.[].random_detect.ecn.threshold.units") | String | Required | | Valid Values:
- segments
- bytes
- kbytes
- mbytes
- milliseconds | Indicate the units to be used for the threshold values | - | [              min](## "ethernet_interfaces.[].uc_tx_queues.[].random_detect.ecn.threshold.min") | Integer | Required | | Min: 1
Max: 256000000 | Set the random-detect ECN minimum-threshold | - | [              max](## "ethernet_interfaces.[].uc_tx_queues.[].random_detect.ecn.threshold.max") | Integer | Required | | Min: 1
Max: 256000000 | Set the random-detect ECN maximum-threshold | - | [              max_probability](## "ethernet_interfaces.[].uc_tx_queues.[].random_detect.ecn.threshold.max_probability") | Integer | | | Min: 1
Max: 100 | Set the random-detect ECN max-mark-probability | - | [              weight](## "ethernet_interfaces.[].uc_tx_queues.[].random_detect.ecn.threshold.weight") | Integer | | | Min: 0
Max: 15 | Set the random-detect ECN weight | + | [              units](## "ethernet_interfaces.[].uc_tx_queues.[].random_detect.ecn.threshold.units") | String | Required | | Valid Values:
- segments
- bytes
- kbytes
- mbytes
- milliseconds | Indicate the units to be used for the threshold values. | + | [              min](## "ethernet_interfaces.[].uc_tx_queues.[].random_detect.ecn.threshold.min") | Integer | Required | | Min: 1
Max: 256000000 | Set the random-detect ECN minimum-threshold. | + | [              max](## "ethernet_interfaces.[].uc_tx_queues.[].random_detect.ecn.threshold.max") | Integer | Required | | Min: 1
Max: 256000000 | Set the random-detect ECN maximum-threshold. | + | [              max_probability](## "ethernet_interfaces.[].uc_tx_queues.[].random_detect.ecn.threshold.max_probability") | Integer | | | Min: 1
Max: 100 | Set the random-detect ECN max-mark-probability. | + | [              weight](## "ethernet_interfaces.[].uc_tx_queues.[].random_detect.ecn.threshold.weight") | Integer | | | Min: 0
Max: 15 | Set the random-detect ECN weight. | | [    tx_queues](## "ethernet_interfaces.[].tx_queues") | List, items: Dictionary | | | | | - | [      - id](## "ethernet_interfaces.[].tx_queues.[].id") | Integer | Required, Unique | | | TX-Queue ID | + | [      - id](## "ethernet_interfaces.[].tx_queues.[].id") | Integer | Required, Unique | | | TX-Queue ID. | | [        random_detect](## "ethernet_interfaces.[].tx_queues.[].random_detect") | Dictionary | | | | | - | [          ecn](## "ethernet_interfaces.[].tx_queues.[].random_detect.ecn") | Dictionary | | | | Explicit Congestion Notification | - | [            count](## "ethernet_interfaces.[].tx_queues.[].random_detect.ecn.count") | Boolean | | | | Enable counter for random-detect ECNs | + | [          ecn](## "ethernet_interfaces.[].tx_queues.[].random_detect.ecn") | Dictionary | | | | Explicit Congestion Notification. | + | [            count](## "ethernet_interfaces.[].tx_queues.[].random_detect.ecn.count") | Boolean | | | | Enable counter for random-detect ECNs. | | [            threshold](## "ethernet_interfaces.[].tx_queues.[].random_detect.ecn.threshold") | Dictionary | | | | | - | [              units](## "ethernet_interfaces.[].tx_queues.[].random_detect.ecn.threshold.units") | String | Required | | Valid Values:
- segments
- bytes
- kbytes
- mbytes
- milliseconds | Indicate the units to be used for the threshold values | - | [              min](## "ethernet_interfaces.[].tx_queues.[].random_detect.ecn.threshold.min") | Integer | | | Min: 1
Max: 256000000 | Set the random-detect ECN minimum-threshold | - | [              max](## "ethernet_interfaces.[].tx_queues.[].random_detect.ecn.threshold.max") | Integer | Required | | Min: 1
Max: 256000000 | Set the random-detect ECN maximum-threshold | - | [              max_probability](## "ethernet_interfaces.[].tx_queues.[].random_detect.ecn.threshold.max_probability") | Integer | Required | | Min: 1
Max: 100 | Set the random-detect ECN max-mark-probability | - | [              weight](## "ethernet_interfaces.[].tx_queues.[].random_detect.ecn.threshold.weight") | Integer | | | Min: 0
Max: 15 | Set the random-detect ECN weight | + | [              units](## "ethernet_interfaces.[].tx_queues.[].random_detect.ecn.threshold.units") | String | Required | | Valid Values:
- segments
- bytes
- kbytes
- mbytes
- milliseconds | Indicate the units to be used for the threshold values. | + | [              min](## "ethernet_interfaces.[].tx_queues.[].random_detect.ecn.threshold.min") | Integer | | | Min: 1
Max: 256000000 | Set the random-detect ECN minimum-threshold. | + | [              max](## "ethernet_interfaces.[].tx_queues.[].random_detect.ecn.threshold.max") | Integer | Required | | Min: 1
Max: 256000000 | Set the random-detect ECN maximum-threshold. | + | [              max_probability](## "ethernet_interfaces.[].tx_queues.[].random_detect.ecn.threshold.max_probability") | Integer | Required | | Min: 1
Max: 100 | Set the random-detect ECN max-mark-probability. | + | [              weight](## "ethernet_interfaces.[].tx_queues.[].random_detect.ecn.threshold.weight") | Integer | | | Min: 0
Max: 15 | Set the random-detect ECN weight. | | [    vrrp_ids](## "ethernet_interfaces.[].vrrp_ids") | List, items: Dictionary | | | | VRRP model. | - | [      - id](## "ethernet_interfaces.[].vrrp_ids.[].id") | Integer | Required, Unique | | | VRID | - | [        priority_level](## "ethernet_interfaces.[].vrrp_ids.[].priority_level") | Integer | | | Min: 1
Max: 254 | Instance priority | + | [      - id](## "ethernet_interfaces.[].vrrp_ids.[].id") | Integer | Required, Unique | | | VRID. | + | [        priority_level](## "ethernet_interfaces.[].vrrp_ids.[].priority_level") | Integer | | | Min: 1
Max: 254 | Instance priority. | | [        advertisement](## "ethernet_interfaces.[].vrrp_ids.[].advertisement") | Dictionary | | | | | - | [          interval](## "ethernet_interfaces.[].vrrp_ids.[].advertisement.interval") | Integer | | | Min: 1
Max: 255 | Interval in seconds | + | [          interval](## "ethernet_interfaces.[].vrrp_ids.[].advertisement.interval") | Integer | | | Min: 1
Max: 255 | Interval in seconds. | | [        preempt](## "ethernet_interfaces.[].vrrp_ids.[].preempt") | Dictionary | | | | | | [          enabled](## "ethernet_interfaces.[].vrrp_ids.[].preempt.enabled") | Boolean | Required | | | | | [          delay](## "ethernet_interfaces.[].vrrp_ids.[].preempt.delay") | Dictionary | | | | | - | [            minimum](## "ethernet_interfaces.[].vrrp_ids.[].preempt.delay.minimum") | Integer | | | Min: 0
Max: 3600 | Minimum preempt delay in seconds | - | [            reload](## "ethernet_interfaces.[].vrrp_ids.[].preempt.delay.reload") | Integer | | | Min: 0
Max: 3600 | Reload preempt delay in seconds | + | [            minimum](## "ethernet_interfaces.[].vrrp_ids.[].preempt.delay.minimum") | Integer | | | Min: 0
Max: 3600 | Minimum preempt delay in seconds. | + | [            reload](## "ethernet_interfaces.[].vrrp_ids.[].preempt.delay.reload") | Integer | | | Min: 0
Max: 3600 | Reload preempt delay in seconds. | | [        timers](## "ethernet_interfaces.[].vrrp_ids.[].timers") | Dictionary | | | | | | [          delay](## "ethernet_interfaces.[].vrrp_ids.[].timers.delay") | Dictionary | | | | | | [            reload](## "ethernet_interfaces.[].vrrp_ids.[].timers.delay.reload") | Integer | | | Min: 0
Max: 3600 | Delay after reload in seconds. | | [        tracked_object](## "ethernet_interfaces.[].vrrp_ids.[].tracked_object") | List, items: Dictionary | | | | | - | [          - name](## "ethernet_interfaces.[].vrrp_ids.[].tracked_object.[].name") | String | Required, Unique | | | Tracked object name | - | [            decrement](## "ethernet_interfaces.[].vrrp_ids.[].tracked_object.[].decrement") | Integer | | | Min: 1
Max: 254 | Decrement VRRP priority by 1-254 | + | [          - name](## "ethernet_interfaces.[].vrrp_ids.[].tracked_object.[].name") | String | Required, Unique | | | Tracked object name. | + | [            decrement](## "ethernet_interfaces.[].vrrp_ids.[].tracked_object.[].decrement") | Integer | | | Min: 1
Max: 254 | Decrement VRRP priority by 1-254. | | [            shutdown](## "ethernet_interfaces.[].vrrp_ids.[].tracked_object.[].shutdown") | Boolean | | | | | | [        ipv4](## "ethernet_interfaces.[].vrrp_ids.[].ipv4") | Dictionary | | | | | - | [          address](## "ethernet_interfaces.[].vrrp_ids.[].ipv4.address") | String | Required | | | Virtual IPv4 address | + | [          address](## "ethernet_interfaces.[].vrrp_ids.[].ipv4.address") | String | Required | | | Virtual IPv4 address. | | [          version](## "ethernet_interfaces.[].vrrp_ids.[].ipv4.version") | Integer | | | Valid Values:
- 2
- 3 | | | [        ipv6](## "ethernet_interfaces.[].vrrp_ids.[].ipv6") | Dictionary | | | | | - | [          address](## "ethernet_interfaces.[].vrrp_ids.[].ipv6.address") | String | Required | | | Virtual IPv6 address | - | [    validate_state](## "ethernet_interfaces.[].validate_state") | Boolean | | | | Set to false to disable interface validation by the `eos_validate_state` role | + | [          address](## "ethernet_interfaces.[].vrrp_ids.[].ipv6.address") | String | Required | | | Virtual IPv6 address. | + | [    validate_state](## "ethernet_interfaces.[].validate_state") | Boolean | | | | Set to false to disable interface validation by the `eos_validate_state` role. | | [    switchport](## "ethernet_interfaces.[].switchport") | Dictionary | | | | | | [      port_security](## "ethernet_interfaces.[].switchport.port_security") | Dictionary | | | | | | [        enabled](## "ethernet_interfaces.[].switchport.port_security.enabled") | Boolean | | | | | @@ -400,7 +407,7 @@ | [        vlans](## "ethernet_interfaces.[].switchport.port_security.vlans") | List, items: Dictionary | | | | | | [          - range](## "ethernet_interfaces.[].switchport.port_security.vlans.[].range") | String | Required, Unique | | | VLAN ID or range(s) of VLAN IDs, <1-4094>.
Example:
- 3
- 1,3
- 1-10
| | [            mac_address_maximum](## "ethernet_interfaces.[].switchport.port_security.vlans.[].mac_address_maximum") | Integer | | | | | - | [    eos_cli](## "ethernet_interfaces.[].eos_cli") | String | | | | Multiline EOS CLI rendered directly on the ethernet interface in the final EOS configuration | + | [    eos_cli](## "ethernet_interfaces.[].eos_cli") | String | | | | Multiline EOS CLI rendered directly on the ethernet interface in the final EOS configuration. | === "YAML" @@ -410,26 +417,26 @@ description: shutdown: - # Interval in seconds for updating interface counters" + # Interval in seconds for updating interface counters. load_interval: # Speed should be set in the format `` or `forced ` or `auto `. speed: mtu: - # "l2_mtu" should only be defined for platforms supporting the "l2 mtu" CLI + # "l2_mtu" should only be defined for platforms supporting the "l2 mtu" CLI. l2_mtu: - # "l2_mru" should only be defined for platforms supporting the "l2 mru" CLI + # "l2_mru" should only be defined for platforms supporting the "l2 mru" CLI. l2_mru: - # List of switchport vlans as string - # For a trunk port this would be a range like "1-200,300" - # For an access port this would be a single vlan "123" + # List of switchport vlans as string. + # For a trunk port this would be a range like "1-200,300". + # For an access port this would be a single vlan "123". vlans: native_vlan: - # If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence + # If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence. native_vlan_tag: mode: phone: @@ -437,10 +444,10 @@ vlan: l2_protocol: - # Vlan tag to configure on sub-interface + # Vlan tag to configure on sub-interface. encapsulation_dot1q_vlan: - # L2 protocol forwarding profile + # L2 protocol forwarding profile. forwarding_profile: trunk_groups: - @@ -451,15 +458,15 @@ snmp_trap_link_change: address_locking: - # Enable address locking for IPv4 + # Enable address locking for IPv4. ipv4: - # Enable address locking for IPv6 + # Enable address locking for IPv6. ipv6: flowcontrol: received: - # VRF name + # VRF name. vrf: flow_tracker: @@ -474,21 +481,21 @@ reed_solomon: link_tracking_groups: - # Group name + # Group name. - name: direction: evpn_ethernet_segment: - # EVPN Ethernet Segment Identifier (Type 1 format) + # EVPN Ethernet Segment Identifier (Type 1 format). identifier: redundancy: designated_forwarder_election: algorithm: - # Preference_value is only used when "algorithm" is "preference" + # Preference_value is only used when "algorithm" is "preference". preference_value: - # Dont_preempt is only used when "algorithm" is "preference" + # Dont_preempt is only used when "algorithm" is "preference". dont_preempt: hold_time: subsequent_hold_time: @@ -497,47 +504,47 @@ shared_index: tunnel_flood_filter_time: - # EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx + # EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx. route_target: - # VLAN tag to configure on sub-interface + # VLAN tag to configure on sub-interface. encapsulation_dot1q_vlan: encapsulation_vlan: client: dot1q: - # Client VLAN ID + # Client VLAN ID. vlan: - # Client Outer VLAN ID + # Client Outer VLAN ID. outer: - # Client Inner VLAN ID + # Client Inner VLAN ID. inner: unmatched: - # Network encapsulations are all optional and skipped if using client unmatched + # Network encapsulations are all optional and skipped if using client unmatched. network: dot1q: - # Network VLAN ID + # Network VLAN ID. vlan: - # Network outer VLAN ID + # Network outer VLAN ID. outer: - # Network inner VLAN ID + # Network inner VLAN ID. inner: client: vlan_id: - # IPv4 address/mask or "dhcp" + # IPv4 address/mask or "dhcp". ip_address: ip_address_secondaries: - ip_verify_unicast_source_reachable_via: - # Install default-route obtained via DHCP + # Install default-route obtained via DHCP. dhcp_client_accept_default_route: # Enable IPv4 DHCP server. @@ -548,10 +555,10 @@ ip_helpers: - ip_helper: - # Source interface name + # Source interface name. source_interface: - # VRF name + # VRF name. vrf: ip_nat: @@ -565,7 +572,7 @@ priority: static: - # 'access_list' and 'group' are mutual exclusive + # 'access_list' and 'group' are mutual exclusive. - access_list: comment: @@ -573,19 +580,21 @@ # EOS might remove this keyword in the configuration. So, check the configuration on targeted HW/SW. direction: - # 'access_list' and 'group' are mutual exclusive + # 'access_list' and 'group' are mutual exclusive. group: - # IPv4 address - original_ip: + # IPv4 address. The combination of `original_ip` and `original_port` must be unique. + original_ip: + + # TCP/UDP port. The combination of `original_ip` and `original_port` must be unique. original_port: priority: protocol: - # IPv4 address + # IPv4 address. translated_ip: - # requires 'original_port' + # requires 'original_port'. translated_port: source: dynamic: @@ -593,13 +602,13 @@ comment: nat_type: - # required if 'nat_type' is pool, pool-address-only or pool-full-cone - # ignored if 'nat_type' is overload + # required if 'nat_type' is pool, pool-address-only or pool-full-cone. + # ignored if 'nat_type' is overload. pool_name: priority: static: - # 'access_list' and 'group' are mutual exclusive + # 'access_list' and 'group' are mutual exclusive. - access_list: comment: @@ -607,82 +616,84 @@ # EOS might remove this keyword in the configuration. So, check the configuration on targeted HW/SW. direction: - # 'access_list' and 'group' are mutual exclusive + # 'access_list' and 'group' are mutual exclusive. group: - # IPv4 address - original_ip: + # IPv4 address. The combination of `original_ip` and `original_port` must be unique. + original_ip: + + # TCP/UDP port. The combination of `original_ip` and `original_port` must be unique. original_port: priority: protocol: - # IPv4 address + # IPv4 address. translated_ip: - # requires 'original_port' + # requires 'original_port'. translated_port: ipv6_enable: ipv6_address: - # Link local IPv6 address/mask + # Link local IPv6 address/mask. ipv6_address_link_local: ipv6_nd_ra_disabled: ipv6_nd_managed_config_flag: ipv6_nd_prefixes: - ipv6_prefix: - # Infinite or lifetime in seconds + # Infinite or lifetime in seconds. valid_lifetime: - # Infinite or lifetime in seconds + # Infinite or lifetime in seconds. preferred_lifetime: no_autoconfig_flag: ipv6_dhcp_relay_destinations: - # DHCP server's IPv6 address + # DHCP server's IPv6 address. - address: vrf: - # Local interface to communicate with DHCP server - mutually exclusive to source_address + # Local interface to communicate with DHCP server - mutually exclusive to source_address. local_interface: - # Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface + # Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface. source_address: - # Override the default link address specified in the relayed DHCP packet + # Override the default link address specified in the relayed DHCP packet. link_address: - # Access list name + # Access list name. access_group_in: - # Access list name + # Access list name. access_group_out: - # IPv6 access list name + # IPv6 access list name. ipv6_access_group_in: - # IPv6 access list name + # IPv6 access list name. ipv6_access_group_out: - # MAC access list name + # MAC access list name. mac_access_group_in: - # MAC access list name + # MAC access list name. mac_access_group_out: - # Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both + # Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both. multicast: ipv4: boundaries: - # ACL name or multicast IP subnet + # ACL name or multicast IP subnet. - boundary: out: static: ipv6: boundaries: - # ACL name or multicast IP subnet + # ACL name or multicast IP subnet. - boundary: static: ospf_network_point_to_point: @@ -690,13 +701,13 @@ ospf_cost: ospf_authentication: - # Encrypted password - only type 7 supported + # Encrypted password - only type 7 supported. ospf_authentication_key: ospf_message_digest_keys: - id: hash_algorithm: - # Encrypted password - only type 7 supported + # Encrypted password - only type 7 supported. key: pim: ipv4: @@ -718,12 +729,22 @@ interval: mac_security: profile: + + # The TCP MSS clamping feature involves clamping the maximum segment size (MSS) in the TCP header + # of TCP SYN packets if it exceeds the configured MSS ceiling limit for the interface. + tcp_mss_ceiling: + ipv4_segment_size: + ipv6_segment_size: + direction: channel_group: id: mode: - # ISIS instance + # ISIS instance. isis_enable: + + # Enable BFD for ISIS. + isis_bfd: isis_passive: isis_metric: isis_network_point_to_point: @@ -731,35 +752,35 @@ isis_hello_padding: isis_authentication_mode: - # Type-7 encrypted password + # Type-7 encrypted password. isis_authentication_key: poe: # Disable PoE on a POE capable port. PoE is enabled on all ports that support it by default in EOS. disabled: - # Prioritize a port's power in the event that one of the switch's power supplies loses power + # Prioritize a port's power in the event that one of the switch's power supplies loses power. priority: - # Set the PoE power behavior for a PoE port when the system is rebooted + # Set the PoE power behavior for a PoE port when the system is rebooted. reboot: - # PoE action for interface + # PoE action for interface. action: - # Set the PoE power behavior for a PoE port when the port goes down + # Set the PoE power behavior for a PoE port when the port goes down. link_down: - # PoE action for interface + # PoE action for interface. action: # Number of seconds to delay shutting the power off after a link down event occurs. Default value is 5 seconds in EOS. power_off_delay: - # Set the PoE power behavior for a PoE port when the port is admin down + # Set the PoE power behavior for a PoE port when the port is admin down. shutdown: - # PoE action for interface + # PoE action for interface. action: # Override the hardware-negotiated power limit using either wattage or a power class. Note that if using a power class, AVD will automatically convert the class value to the wattage value corresponding to that power class. @@ -767,7 +788,7 @@ class: watts: - # Set to ignore hardware classification + # Set to ignore hardware classification. fixed: # Disable to prevent port from negotiating power with powered devices over LLDP. Enabled by default in EOS. @@ -786,40 +807,40 @@ interval: role: - # VLAN can be 'all' or list of vlans as string + # VLAN can be 'all' or list of vlans as string. vlan: transport: - # Interface profile + # Interface profile. profile: storm_control: all: - # Configure maximum storm-control level + # Configure maximum storm-control level. level: - # Optional field and is hardware dependent + # Optional field and is hardware dependent. unit: broadcast: - # Configure maximum storm-control level + # Configure maximum storm-control level. level: - # Optional field and is hardware dependent + # Optional field and is hardware dependent. unit: multicast: - # Configure maximum storm-control level + # Configure maximum storm-control level. level: - # Optional field and is hardware dependent + # Optional field and is hardware dependent. unit: unknown_unicast: - # Configure maximum storm-control level + # Configure maximum storm-control level. level: - # Optional field and is hardware dependent + # Optional field and is hardware dependent. unit: logging: event: @@ -833,18 +854,18 @@ transmit: receive: - # ZTP vlan number + # ZTP vlan number. ztp_vlan: trunk_private_vlan_secondary: - # List of vlans as string + # List of vlans as string. pvlan_mapping: vlan_translations: - # List of vlans as string (only one vlan if direction is "both") + # List of vlans as string (only one vlan if direction is "both"). - from: - # VLAN ID + # VLAN ID. to: direction: dot1x: @@ -867,7 +888,7 @@ idle_host: quiet_period: - # Value can be 60-4294967295 or 'server' + # Value can be 60-4294967295 or 'server'. reauth_period: reauth_timeout_ignore: tx_period: @@ -881,12 +902,12 @@ enabled: timeout: - # QOS profile + # QOS profile. service_profile: shape: - # Rate in kbps, pps or percent - # Supported options are platform dependent + # Rate in kbps, pps or percent. + # Supported options are platform dependent. # Examples: # - "5000 kbps" # - "1000 pps" @@ -895,10 +916,10 @@ qos: trust: - # DSCP value + # DSCP value. dscp: - # COS value + # COS value. cos: spanning_tree_bpdufilter: spanning_tree_bpduguard: @@ -913,20 +934,20 @@ bfd: echo: - # Interval in milliseconds + # Interval in milliseconds. interval: - # Rate in milliseconds + # Rate in milliseconds. min_rx: multiplier: service_policy: pbr: - # Policy Based Routing Policy-map name + # Policy Based Routing Policy-map name. input: qos: - # Quality of Service Policy-map name + # Quality of Service Policy-map name. input: mpls: ip: @@ -938,21 +959,27 @@ multiplier: lacp_port_priority: transceiver: + + # Transceiver Laser Frequency in GHz (min 190000, max 200000). + frequency: + + # Unit of Transceiver Laser Frequency. + frequency_unit: media: - # Transceiver type + # Transceiver type. override: ip_proxy_arp: traffic_policy: - # Ingress traffic policy + # Ingress traffic policy. input: - # Egress traffic policy + # Egress traffic policy. output: bgp: - # Name of session tracker + # Name of session tracker. session_tracker: ip_igmp_host_proxy: enabled: @@ -979,13 +1006,13 @@ # IGMP version on IGMP host-proxy interface. version: - # Key only used for documentation or validation purposes + # Key only used for documentation or validation purposes. peer: - # Key only used for documentation or validation purposes + # Key only used for documentation or validation purposes. peer_interface: - # Key only used for documentation or validation purposes + # Key only used for documentation or validation purposes. peer_type: sflow: enable: @@ -993,83 +1020,83 @@ enable: unmodified_enable: - # Key only used for documentation or validation purposes + # Key only used for documentation or validation purposes. port_profile: uc_tx_queues: - # TX-Queue ID + # TX-Queue ID. - id: random_detect: - # Explicit Congestion Notification + # Explicit Congestion Notification. ecn: - # Enable counter for random-detect ECNs + # Enable counter for random-detect ECNs. count: threshold: - # Indicate the units to be used for the threshold values + # Indicate the units to be used for the threshold values. units: - # Set the random-detect ECN minimum-threshold + # Set the random-detect ECN minimum-threshold. min: - # Set the random-detect ECN maximum-threshold + # Set the random-detect ECN maximum-threshold. max: - # Set the random-detect ECN max-mark-probability + # Set the random-detect ECN max-mark-probability. max_probability: - # Set the random-detect ECN weight + # Set the random-detect ECN weight. weight: tx_queues: - # TX-Queue ID + # TX-Queue ID. - id: random_detect: - # Explicit Congestion Notification + # Explicit Congestion Notification. ecn: - # Enable counter for random-detect ECNs + # Enable counter for random-detect ECNs. count: threshold: - # Indicate the units to be used for the threshold values + # Indicate the units to be used for the threshold values. units: - # Set the random-detect ECN minimum-threshold + # Set the random-detect ECN minimum-threshold. min: - # Set the random-detect ECN maximum-threshold + # Set the random-detect ECN maximum-threshold. max: - # Set the random-detect ECN max-mark-probability + # Set the random-detect ECN max-mark-probability. max_probability: - # Set the random-detect ECN weight + # Set the random-detect ECN weight. weight: # VRRP model. vrrp_ids: - # VRID + # VRID. - id: - # Instance priority + # Instance priority. priority_level: advertisement: - # Interval in seconds + # Interval in seconds. interval: preempt: enabled: delay: - # Minimum preempt delay in seconds + # Minimum preempt delay in seconds. minimum: - # Reload preempt delay in seconds + # Reload preempt delay in seconds. reload: timers: delay: @@ -1078,23 +1105,23 @@ reload: tracked_object: - # Tracked object name + # Tracked object name. - name: - # Decrement VRRP priority by 1-254 + # Decrement VRRP priority by 1-254. decrement: shutdown: ipv4: - # Virtual IPv4 address + # Virtual IPv4 address. address: version: ipv6: - # Virtual IPv6 address + # Virtual IPv6 address. address: - # Set to false to disable interface validation by the `eos_validate_state` role + # Set to false to disable interface validation by the `eos_validate_state` role. validate_state: switchport: port_security: @@ -1130,6 +1157,6 @@ - range: mac_address_maximum: - # Multiline EOS CLI rendered directly on the ethernet interface in the final EOS configuration + # Multiline EOS CLI rendered directly on the ethernet interface in the final EOS configuration. eos_cli: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/event-handlers.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/event-handlers.md index 11b67e05c24..08d4405823c 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/event-handlers.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/event-handlers.md @@ -8,11 +8,27 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [event_handlers](## "event_handlers") | List, items: Dictionary | | | | Gives the ability to monitor and react to Syslog messages.
Event Handlers provide a powerful and flexible tool that can be used to apply self-healing actions,
customize the system behavior, and implement workarounds to problems discovered in the field.
| - | [  - name](## "event_handlers.[].name") | String | Required, Unique | | | Event Handler Name | - | [    action_type](## "event_handlers.[].action_type") | String | | | Valid Values:
- bash
- increment
- log | | - | [    action](## "event_handlers.[].action") | String | | | | Command to execute
| - | [    delay](## "event_handlers.[].delay") | Integer | | | | Event-handler delay in seconds
| - | [    trigger](## "event_handlers.[].trigger") | String | | | Valid Values:
- on-boot
- on-logging
- on-startup-config
- on-maintenance | Configure event trigger condition.
| + | [  - name](## "event_handlers.[].name") | String | Required, Unique | | | Event Handler Name. | + | [    action_type](## "event_handlers.[].action_type") deprecated | String | | | Valid Values:
- bash
- increment
- log | This key is deprecated. Support will be removed in AVD version 5.0.0. Use event_handlers.actions instead. | + | [    action](## "event_handlers.[].action") deprecated | String | | | | Command to execute.
This key is deprecated. Support will be removed in AVD version 5.0.0. Use event_handlers.actions instead. | + | [    actions](## "event_handlers.[].actions") | Dictionary | | | | Note: `bash_command` and `log` are mutually exclusive. `bash_command` takes precedence over `log`. | + | [      bash_command](## "event_handlers.[].actions.bash_command") | String | | | | Define BASH command action. Command could be multiline also. | + | [      log](## "event_handlers.[].actions.log") | Boolean | | | | Log a message when the event is triggered. | + | [      increment_device_health_metric](## "event_handlers.[].actions.increment_device_health_metric") | String | | | | Name of device-health metric. | + | [    delay](## "event_handlers.[].delay") | Integer | | | | Event-handler delay in seconds.
| + | [    trigger](## "event_handlers.[].trigger") | String | | | Valid Values:
- on-boot
- on-counters
- on-intf
- on-logging
- on-maintenance
- on-startup-config
- vm-tracer vm | Configure event trigger condition.
| + | [    trigger_on_counters](## "event_handlers.[].trigger_on_counters") | Dictionary | | | | | + | [      condition](## "event_handlers.[].trigger_on_counters.condition") | String | | | | Set the logical expression to evaluate. | + | [      granularity_per_source](## "event_handlers.[].trigger_on_counters.granularity_per_source") | Boolean | | | | Set the granularity of event counting for a wildcarded condition.
Example -
condition ( Arad*.IptCrcErrCnt.delta > 100 ) and ( Arad*.UcFifoFullDrop.delta > 100 )
[* wildcard is used here] | + | [      poll_interval](## "event_handlers.[].trigger_on_counters.poll_interval") | Integer | | | Min: 1
Max: 1000000 | Set the polling interval in seconds. | + | [    trigger_on_logging](## "event_handlers.[].trigger_on_logging") | Dictionary | | | | | + | [      poll_interval](## "event_handlers.[].trigger_on_logging.poll_interval") | Integer | | | Min: 1
Max: 1000000 | Set the polling interval in seconds. | + | [      regex](## "event_handlers.[].trigger_on_logging.regex") | String | | | | Regular expression to use for searching log messages. | + | [    trigger_on_intf](## "event_handlers.[].trigger_on_intf") | Dictionary | | | | Trigger condition occurs on specified interface changes.
Note: Any one of the `ip`, `ipv6` and `operstatus` key needs to be defined along with the `interface`. | + | [      interface](## "event_handlers.[].trigger_on_intf.interface") | String | Required | | | Interface name.
Example - Ethernet4
Loopback4-6
Port-channel4,7 | + | [      ip](## "event_handlers.[].trigger_on_intf.ip") | Boolean | | | | Action is triggered upon changes to interface IP address assignment. | + | [      ipv6](## "event_handlers.[].trigger_on_intf.ipv6") | Boolean | | | | Action is triggered upon changes to interface ipv6 address assignment. | + | [      operstatus](## "event_handlers.[].trigger_on_intf.operstatus") | Boolean | | | | Action is triggered upon changes to interface operStatus. | | [    trigger_on_maintenance](## "event_handlers.[].trigger_on_maintenance") | Dictionary | | | | Settings required for trigger 'on-maintenance'. | | [      operation](## "event_handlers.[].trigger_on_maintenance.operation") | String | Required | | Valid Values:
- enter
- exit | | | [      bgp_peer](## "event_handlers.[].trigger_on_maintenance.bgp_peer") | String | | | | Ipv4/Ipv6 address or peer group name.
Trigger condition occurs on maintenance operation of specified BGP peer. | @@ -21,7 +37,7 @@ | [      vrf](## "event_handlers.[].trigger_on_maintenance.vrf") | String | | | | VRF name. VRF can be defined for "bgp_peer" only. | | [      interface](## "event_handlers.[].trigger_on_maintenance.interface") | String | | | | Trigger condition occurs on maintenance operation of specified interface. | | [      unit](## "event_handlers.[].trigger_on_maintenance.unit") | String | | | | Name of unit. Trigger condition occurs on maintenance operation of specified unit | - | [    regex](## "event_handlers.[].regex") | String | | | | Regular expression to use for searching log messages. Required for on-logging trigger
| + | [    regex](## "event_handlers.[].regex") deprecated | String | | | | Regular expression to use for searching log messages. Required for on-logging trigger.
This key is deprecated. Support will be removed in AVD version 5.0.0. Use event_handlers.trigger_on_logging.regex instead. | | [    asynchronous](## "event_handlers.[].asynchronous") | Boolean | | `False` | | Set the action to be non-blocking.
| === "YAML" @@ -32,18 +48,75 @@ # customize the system behavior, and implement workarounds to problems discovered in the field. event_handlers: - # Event Handler Name + # Event Handler Name. - name: + # This key is deprecated. + # Support will be removed in AVD version 5.0.0. + # Use event_handlers.actions instead. action_type: - # Command to execute + # Command to execute. + # This key is deprecated. + # Support will be removed in AVD version 5.0.0. + # Use event_handlers.actions instead. action: - # Event-handler delay in seconds + # Note: `bash_command` and `log` are mutually exclusive. `bash_command` takes precedence over `log`. + actions: + + # Define BASH command action. Command could be multiline also. + bash_command: + + # Log a message when the event is triggered. + log: + + # Name of device-health metric. + increment_device_health_metric: + + # Event-handler delay in seconds. delay: # Configure event trigger condition. - trigger: + trigger: + trigger_on_counters: + + # Set the logical expression to evaluate. + condition: + + # Set the granularity of event counting for a wildcarded condition. + # Example - + # condition ( Arad*.IptCrcErrCnt.delta > 100 ) and ( Arad*.UcFifoFullDrop.delta > 100 ) + # [* wildcard is used here] + granularity_per_source: + + # Set the polling interval in seconds. + poll_interval: + trigger_on_logging: + + # Set the polling interval in seconds. + poll_interval: + + # Regular expression to use for searching log messages. + regex: + + # Trigger condition occurs on specified interface changes. + # Note: Any one of the `ip`, `ipv6` and `operstatus` key needs to be defined along with the `interface`. + trigger_on_intf: + + # Interface name. + # Example - Ethernet4 + # Loopback4-6 + # Port-channel4,7 + interface: + + # Action is triggered upon changes to interface IP address assignment. + ip: + + # Action is triggered upon changes to interface ipv6 address assignment. + ipv6: + + # Action is triggered upon changes to interface operStatus. + operstatus: # Settings required for trigger 'on-maintenance'. trigger_on_maintenance: @@ -68,7 +141,10 @@ # Name of unit. Trigger condition occurs on maintenance operation of specified unit unit: - # Regular expression to use for searching log messages. Required for on-logging trigger + # Regular expression to use for searching log messages. Required for on-logging trigger. + # This key is deprecated. + # Support will be removed in AVD version 5.0.0. + # Use event_handlers.trigger_on_logging.regex instead. regex: # Set the action to be non-blocking. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/flow-tracking.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/flow-tracking.md index bb4d6d9efd3..49aa7731774 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/flow-tracking.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/flow-tracking.md @@ -21,55 +21,55 @@ | [      - table_size](## "flow_tracking.sampled.trackers.[].table_size") | Integer | | | Min: 1
Max: 614400 | Maximum number of entries in flow table.
| | [        record_export](## "flow_tracking.sampled.trackers.[].record_export") | Dictionary | | | | | | [          mpls](## "flow_tracking.sampled.trackers.[].record_export.mpls") | Boolean | | | | Export MPLS forwarding information. | - | [          on_inactive_timeout](## "flow_tracking.sampled.trackers.[].record_export.on_inactive_timeout") | Integer | | | Min: 3000
Max: 900000 | Flow record inactive export timeout in milliseconds | - | [          on_interval](## "flow_tracking.sampled.trackers.[].record_export.on_interval") | Integer | | | Min: 1000
Max: 36000000 | Flow record export interval in milliseconds | - | [        name](## "flow_tracking.sampled.trackers.[].name") | String | Required, Unique | | | Tracker Name | + | [          on_inactive_timeout](## "flow_tracking.sampled.trackers.[].record_export.on_inactive_timeout") | Integer | | | Min: 3000
Max: 900000 | Flow record inactive export timeout in milliseconds. | + | [          on_interval](## "flow_tracking.sampled.trackers.[].record_export.on_interval") | Integer | | | Min: 1000
Max: 36000000 | Flow record export interval in milliseconds. | + | [        name](## "flow_tracking.sampled.trackers.[].name") | String | Required, Unique | | | Tracker Name. | | [        exporters](## "flow_tracking.sampled.trackers.[].exporters") | List, items: Dictionary | | | | | - | [          - name](## "flow_tracking.sampled.trackers.[].exporters.[].name") | String | Required, Unique | | | Exporter Name | + | [          - name](## "flow_tracking.sampled.trackers.[].exporters.[].name") | String | Required, Unique | | | Exporter Name. | | [            collector](## "flow_tracking.sampled.trackers.[].exporters.[].collector") | Dictionary | | | | | - | [              host](## "flow_tracking.sampled.trackers.[].exporters.[].collector.host") | String | | | | Collector IPv4 address or IPv6 address or fully qualified domain name | - | [              port](## "flow_tracking.sampled.trackers.[].exporters.[].collector.port") | Integer | | | Min: 1
Max: 65535 | Collector Port Number | + | [              host](## "flow_tracking.sampled.trackers.[].exporters.[].collector.host") | String | | | | Collector IPv4 address or IPv6 address or fully qualified domain name. | + | [              port](## "flow_tracking.sampled.trackers.[].exporters.[].collector.port") | Integer | | | Min: 1
Max: 65535 | Collector Port Number. | | [            format](## "flow_tracking.sampled.trackers.[].exporters.[].format") | Dictionary | | | | | | [              ipfix_version](## "flow_tracking.sampled.trackers.[].exporters.[].format.ipfix_version") | Integer | | | | | - | [            local_interface](## "flow_tracking.sampled.trackers.[].exporters.[].local_interface") | String | | | | Local Source Interface | - | [            template_interval](## "flow_tracking.sampled.trackers.[].exporters.[].template_interval") | Integer | | | Min: 5000
Max: 3600000 | Template interval in milliseconds | + | [            local_interface](## "flow_tracking.sampled.trackers.[].exporters.[].local_interface") | String | | | | Local Source Interface. | + | [            template_interval](## "flow_tracking.sampled.trackers.[].exporters.[].template_interval") | Integer | | | Min: 5000
Max: 3600000 | Template interval in milliseconds. | | [    shutdown](## "flow_tracking.sampled.shutdown") | Boolean | | `False` | | | | [  hardware](## "flow_tracking.hardware") | Dictionary | | | | | | [    record](## "flow_tracking.hardware.record") | Dictionary | | | | | | [      format_ipfix_standard_timestamps_counters](## "flow_tracking.hardware.record.format_ipfix_standard_timestamps_counters") | Boolean | | | | Enable software export of IPFIX data records. | | [    trackers](## "flow_tracking.hardware.trackers") | List, items: Dictionary | | | | | - | [      - name](## "flow_tracking.hardware.trackers.[].name") | String | Required, Unique | | | Tracker Name | + | [      - name](## "flow_tracking.hardware.trackers.[].name") | String | Required, Unique | | | Tracker Name. | | [        record_export](## "flow_tracking.hardware.trackers.[].record_export") | Dictionary | | | | | - | [          on_inactive_timeout](## "flow_tracking.hardware.trackers.[].record_export.on_inactive_timeout") | Integer | | | Min: 3000
Max: 900000 | Flow record inactive export timeout in milliseconds | - | [          on_interval](## "flow_tracking.hardware.trackers.[].record_export.on_interval") | Integer | | | Min: 1000
Max: 36000000 | Flow record export interval in milliseconds | + | [          on_inactive_timeout](## "flow_tracking.hardware.trackers.[].record_export.on_inactive_timeout") | Integer | | | Min: 3000
Max: 900000 | Flow record inactive export timeout in milliseconds. | + | [          on_interval](## "flow_tracking.hardware.trackers.[].record_export.on_interval") | Integer | | | Min: 1000
Max: 36000000 | Flow record export interval in milliseconds. | | [        exporters](## "flow_tracking.hardware.trackers.[].exporters") | List, items: Dictionary | | | | | - | [          - name](## "flow_tracking.hardware.trackers.[].exporters.[].name") | String | Required, Unique | | | Exporter Name | + | [          - name](## "flow_tracking.hardware.trackers.[].exporters.[].name") | String | Required, Unique | | | Exporter Name. | | [            collector](## "flow_tracking.hardware.trackers.[].exporters.[].collector") | Dictionary | | | | | - | [              host](## "flow_tracking.hardware.trackers.[].exporters.[].collector.host") | String | | | | Collector IPv4 address or IPv6 address or fully qualified domain name | - | [              port](## "flow_tracking.hardware.trackers.[].exporters.[].collector.port") | Integer | | | Min: 1
Max: 65535 | Collector Port Number | + | [              host](## "flow_tracking.hardware.trackers.[].exporters.[].collector.host") | String | | | | Collector IPv4 address or IPv6 address or fully qualified domain name. | + | [              port](## "flow_tracking.hardware.trackers.[].exporters.[].collector.port") | Integer | | | Min: 1
Max: 65535 | Collector Port Number. | | [            format](## "flow_tracking.hardware.trackers.[].exporters.[].format") | Dictionary | | | | | | [              ipfix_version](## "flow_tracking.hardware.trackers.[].exporters.[].format.ipfix_version") | Integer | | | | | - | [            local_interface](## "flow_tracking.hardware.trackers.[].exporters.[].local_interface") | String | | | | Local Source Interface | - | [            template_interval](## "flow_tracking.hardware.trackers.[].exporters.[].template_interval") | Integer | | | Min: 5000
Max: 3600000 | Template interval in milliseconds | + | [            local_interface](## "flow_tracking.hardware.trackers.[].exporters.[].local_interface") | String | | | | Local Source Interface. | + | [            template_interval](## "flow_tracking.hardware.trackers.[].exporters.[].template_interval") | Integer | | | Min: 5000
Max: 3600000 | Template interval in milliseconds. | | [    shutdown](## "flow_tracking.hardware.shutdown") | Boolean | | `False` | | | | [flow_trackings](## "flow_trackings") deprecated | List, items: Dictionary | | | | This key is deprecated. Support will be removed in AVD version v5.0.0. Use flow_tracking instead. | - | [  - type](## "flow_trackings.[].type") | String | Required, Unique | | Valid Values:
- sampled | Flow Tracking Type - only 'sampled' supported for now | + | [  - type](## "flow_trackings.[].type") | String | Required, Unique | | Valid Values:
- sampled | Flow Tracking Type - only 'sampled' supported for now. | | [    sample](## "flow_trackings.[].sample") | Integer | | | Min: 1
Max: 4294967295 | | | [    trackers](## "flow_trackings.[].trackers") | List, items: Dictionary | | | | | - | [      - name](## "flow_trackings.[].trackers.[].name") | String | Required, Unique | | | Tracker Name | + | [      - name](## "flow_trackings.[].trackers.[].name") | String | Required, Unique | | | Tracker Name. | | [        record_export](## "flow_trackings.[].trackers.[].record_export") | Dictionary | | | | | - | [          on_inactive_timeout](## "flow_trackings.[].trackers.[].record_export.on_inactive_timeout") | Integer | | | Min: 3000
Max: 900000 | Flow record inactive export timeout in milliseconds | - | [          on_interval](## "flow_trackings.[].trackers.[].record_export.on_interval") | Integer | | | Min: 1000
Max: 36000000 | Flow record export interval in milliseconds | - | [          mpls](## "flow_trackings.[].trackers.[].record_export.mpls") | Boolean | | | | Export MPLS forwarding information | + | [          on_inactive_timeout](## "flow_trackings.[].trackers.[].record_export.on_inactive_timeout") | Integer | | | Min: 3000
Max: 900000 | Flow record inactive export timeout in milliseconds. | + | [          on_interval](## "flow_trackings.[].trackers.[].record_export.on_interval") | Integer | | | Min: 1000
Max: 36000000 | Flow record export interval in milliseconds. | + | [          mpls](## "flow_trackings.[].trackers.[].record_export.mpls") | Boolean | | | | Export MPLS forwarding information. | | [        exporters](## "flow_trackings.[].trackers.[].exporters") | List, items: Dictionary | | | | | - | [          - name](## "flow_trackings.[].trackers.[].exporters.[].name") | String | Required, Unique | | | Exporter Name | + | [          - name](## "flow_trackings.[].trackers.[].exporters.[].name") | String | Required, Unique | | | Exporter Name. | | [            collector](## "flow_trackings.[].trackers.[].exporters.[].collector") | Dictionary | | | | | - | [              host](## "flow_trackings.[].trackers.[].exporters.[].collector.host") | String | | | | Collector IPv4 address or IPv6 address or fully qualified domain name | - | [              port](## "flow_trackings.[].trackers.[].exporters.[].collector.port") | Integer | | | Min: 1
Max: 65535 | Collector Port Number | + | [              host](## "flow_trackings.[].trackers.[].exporters.[].collector.host") | String | | | | Collector IPv4 address or IPv6 address or fully qualified domain name. | + | [              port](## "flow_trackings.[].trackers.[].exporters.[].collector.port") | Integer | | | Min: 1
Max: 65535 | Collector Port Number. | | [            format](## "flow_trackings.[].trackers.[].exporters.[].format") | Dictionary | | | | | | [              ipfix_version](## "flow_trackings.[].trackers.[].exporters.[].format.ipfix_version") | Integer | | | | | - | [            local_interface](## "flow_trackings.[].trackers.[].exporters.[].local_interface") | String | | | | Local Source Interface | - | [            template_interval](## "flow_trackings.[].trackers.[].exporters.[].template_interval") | Integer | | | Min: 5000
Max: 3600000 | Template interval in milliseconds | + | [            local_interface](## "flow_trackings.[].trackers.[].exporters.[].local_interface") | String | | | | Local Source Interface. | + | [            template_interval](## "flow_trackings.[].trackers.[].exporters.[].template_interval") | Integer | | | Min: 5000
Max: 3600000 | Template interval in milliseconds. | | [        table_size](## "flow_trackings.[].trackers.[].table_size") | Integer | | | Min: 1
Max: 614400 | Maximum number of entries in flow table.
| | [    shutdown](## "flow_trackings.[].shutdown") | Boolean | | `False` | | | @@ -101,32 +101,32 @@ # Export MPLS forwarding information. mpls: - # Flow record inactive export timeout in milliseconds + # Flow record inactive export timeout in milliseconds. on_inactive_timeout: - # Flow record export interval in milliseconds + # Flow record export interval in milliseconds. on_interval: - # Tracker Name + # Tracker Name. name: exporters: - # Exporter Name + # Exporter Name. - name: collector: - # Collector IPv4 address or IPv6 address or fully qualified domain name + # Collector IPv4 address or IPv6 address or fully qualified domain name. host: - # Collector Port Number + # Collector Port Number. port: format: ipfix_version: - # Local Source Interface + # Local Source Interface. local_interface: - # Template interval in milliseconds + # Template interval in milliseconds. template_interval: shutdown: hardware: @@ -136,33 +136,33 @@ format_ipfix_standard_timestamps_counters: trackers: - # Tracker Name + # Tracker Name. - name: record_export: - # Flow record inactive export timeout in milliseconds + # Flow record inactive export timeout in milliseconds. on_inactive_timeout: - # Flow record export interval in milliseconds + # Flow record export interval in milliseconds. on_interval: exporters: - # Exporter Name + # Exporter Name. - name: collector: - # Collector IPv4 address or IPv6 address or fully qualified domain name + # Collector IPv4 address or IPv6 address or fully qualified domain name. host: - # Collector Port Number + # Collector Port Number. port: format: ipfix_version: - # Local Source Interface + # Local Source Interface. local_interface: - # Template interval in milliseconds + # Template interval in milliseconds. template_interval: shutdown: # This key is deprecated. @@ -170,41 +170,41 @@ # Use flow_tracking instead. flow_trackings: - # Flow Tracking Type - only 'sampled' supported for now + # Flow Tracking Type - only 'sampled' supported for now. - type: sample: trackers: - # Tracker Name + # Tracker Name. - name: record_export: - # Flow record inactive export timeout in milliseconds + # Flow record inactive export timeout in milliseconds. on_inactive_timeout: - # Flow record export interval in milliseconds + # Flow record export interval in milliseconds. on_interval: - # Export MPLS forwarding information + # Export MPLS forwarding information. mpls: exporters: - # Exporter Name + # Exporter Name. - name: collector: - # Collector IPv4 address or IPv6 address or fully qualified domain name + # Collector IPv4 address or IPv6 address or fully qualified domain name. host: - # Collector Port Number + # Collector Port Number. port: format: ipfix_version: - # Local Source Interface + # Local Source Interface. local_interface: - # Template interval in milliseconds + # Template interval in milliseconds. template_interval: # Maximum number of entries in flow table. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/hardware-counters.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/hardware-counters.md index f9edfa30024..f7953251690 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/hardware-counters.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/hardware-counters.md @@ -8,11 +8,11 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [hardware_counters](## "hardware_counters") | Dictionary | | | | | - | [  features](## "hardware_counters.features") | List, items: Dictionary | | | | This data model allows to configure the list of hardware counters feature
available on Arista platforms.

The `name` key accepts a list of valid_values which MUST be updated to support
new feature as they are released in EOS.

The available values of the different keys like 'direction' or 'address_type'
are feature and hardware dependent and this model DOES NOT validate that the
combinations are valid. It is the responsability of the user of this data model
to make sure that the rendered CLI is accepted by the targeted device.

Examples:

* Use:
```yaml
hardware_counters:
features:
- name: ip
direction: out
layer3: true
units_packets: true
```

to render:
```eos
hardware counter feature ip out layer3 units packets
```
* Use:
```yaml
hardware_counters:
features:
- name: route
address_type: ipv4
vrf: test
prefix: 192.168.0.0/24
```

to render:
```eos
hardware counter feature route ipv4 vrf test 192.168.0.0/24
```
| - | [    - name](## "hardware_counters.features.[].name") | String | | | Valid Values:
- acl
- decap-group
- directflow
- ecn
- flow-spec
- gre tunnel interface
- ip
- mpls interface
- mpls lfib
- mpls tunnel
- multicast
- nexthop
- pbr
- pdp
- policing interface
- qos
- qos dual-rate-policer
- route
- routed-port
- subinterface
- tapagg
- traffic-class
- traffic-policy
- vlan
- vlan-interface
- vni decap
- vni encap
- vtep decap
- vtep encap | | + | [  features](## "hardware_counters.features") | List, items: Dictionary | | | | This data model allows to configure the list of hardware counters feature
available on Arista platforms.

The `name` key accepts a list of valid_values which MUST be updated to support
new feature as they are released in EOS.

The available values of the different keys like 'direction' or 'address_type'
are feature and hardware dependent and this model DOES NOT validate that the
combinations are valid. It is the responsibility of the user of this data model
to make sure that the rendered CLI is accepted by the targeted device.

Examples:

* Use:
```yaml
hardware_counters:
features:
- name: ip
direction: out
layer3: true
units_packets: true
```

to render:
```eos
hardware counter feature ip out layer3 units packets
```
* Use:
```yaml
hardware_counters:
features:
- name: route
address_type: ipv4
vrf: test
prefix: 192.168.0.0/24
```

to render:
```eos
hardware counter feature route ipv4 vrf test 192.168.0.0/24
```
| + | [    - name](## "hardware_counters.features.[].name") | String | | | Valid Values:
- acl
- decap-group
- directflow
- ecn
- flow-spec
- gre tunnel interface
- ip
- mpls interface
- mpls lfib
- mpls tunnel
- multicast
- nexthop
- pbr
- pdp
- policing interface
- qos
- qos dual-rate-policer
- route
- routed-port
- segment-security
- subinterface
- tapagg
- traffic-class
- traffic-policy
- vlan
- vlan-interface
- vni decap
- vni encap
- vtep decap
- vtep encap | | | [      direction](## "hardware_counters.features.[].direction") | String | | | Valid Values:
- in
- out
- cpu | Most features support only 'in' and 'out'. Some like traffic-policy support 'cpu'.
Some features DO NOT have any direction.
This validation IS NOT made by the schemas.
| | [      address_type](## "hardware_counters.features.[].address_type") | String | | | Valid Values:
- ipv4
- ipv6
- mac | Supported only for the following features:
- acl: [ipv4, ipv6, mac] if direction is 'out'
- multicast: [ipv4, ipv6]
- route: [ipv4, ipv6]
This validation IS NOT made by the schemas.
| - | [      layer3](## "hardware_counters.features.[].layer3") | Boolean | | | | Supported only for the 'ip' feature
| + | [      layer3](## "hardware_counters.features.[].layer3") | Boolean | | | | Supported only for the 'ip' feature.
| | [      vrf](## "hardware_counters.features.[].vrf") | String | | | | Supported only for the 'route' feature.
This validation IS NOT made by the schemas.
| | [      prefix](## "hardware_counters.features.[].prefix") | String | | | | Supported only for the 'route' feature.
Mandatory for the 'route' feature.
This validation IS NOT made by the schemas.
| | [      units_packets](## "hardware_counters.features.[].units_packets") | Boolean | | | | | @@ -30,7 +30,7 @@ # # The available values of the different keys like 'direction' or 'address_type' # are feature and hardware dependent and this model DOES NOT validate that the - # combinations are valid. It is the responsability of the user of this data model + # combinations are valid. It is the responsibility of the user of this data model # to make sure that the rendered CLI is accepted by the targeted device. # # Examples: @@ -64,7 +64,7 @@ # hardware counter feature route ipv4 vrf test 192.168.0.0/24 # ``` features: - - name: + - name: # Most features support only 'in' and 'out'. Some like traffic-policy support 'cpu'. # Some features DO NOT have any direction. @@ -78,7 +78,7 @@ # This validation IS NOT made by the schemas. address_type: - # Supported only for the 'ip' feature + # Supported only for the 'ip' feature. layer3: # Supported only for the 'route' feature. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/hardware.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/hardware.md index a66f2dd4c27..e1e088af92e 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/hardware.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/hardware.md @@ -12,7 +12,7 @@ | [    mechanism](## "hardware.access_list.mechanism") | String | | | Valid Values:
- algomatch
- none
- tcam | | | [  speed_groups](## "hardware.speed_groups") | List, items: Dictionary | | | | | | [    - speed_group](## "hardware.speed_groups.[].speed_group") | String | Required, Unique | | | | - | [      serdes](## "hardware.speed_groups.[].serdes") | String | | | | Serdes speed like "10g" or "25g" | + | [      serdes](## "hardware.speed_groups.[].serdes") | String | | | | Serdes speed like "10g" or "25g". | === "YAML" @@ -23,6 +23,6 @@ speed_groups: - speed_group: - # Serdes speed like "10g" or "25g" + # Serdes speed like "10g" or "25g". serdes: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/interface-groups.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/interface-groups.md index 1e360dc1bf6..377e7f3383f 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/interface-groups.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/interface-groups.md @@ -8,31 +8,31 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [interface_groups](## "interface_groups") | List, items: Dictionary | | | | | - | [  - name](## "interface_groups.[].name") | String | Required, Unique | | | Interface-Group name | + | [  - name](## "interface_groups.[].name") | String | Required, Unique | | | Interface-Group name. | | [    interfaces](## "interface_groups.[].interfaces") | List, items: String | | | | | - | [      - <str>](## "interface_groups.[].interfaces.[]") | String | | | | Interface Name | + | [      - <str>](## "interface_groups.[].interfaces.[]") | String | | | | Interface Name. | | [    bgp_maintenance_profiles](## "interface_groups.[].bgp_maintenance_profiles") | List, items: String | | | | | - | [      - <str>](## "interface_groups.[].bgp_maintenance_profiles.[]") | String | | | | Name of BGP Maintenance Profile | + | [      - <str>](## "interface_groups.[].bgp_maintenance_profiles.[]") | String | | | | Name of BGP Maintenance Profile. | | [    interface_maintenance_profiles](## "interface_groups.[].interface_maintenance_profiles") | List, items: String | | | | | - | [      - <str>](## "interface_groups.[].interface_maintenance_profiles.[]") | String | | | | Name of Interface Maintenance Profile | + | [      - <str>](## "interface_groups.[].interface_maintenance_profiles.[]") | String | | | | Name of Interface Maintenance Profile. | === "YAML" ```yaml interface_groups: - # Interface-Group name + # Interface-Group name. - name: interfaces: - # Interface Name + # Interface Name. - bgp_maintenance_profiles: - # Name of BGP Maintenance Profile + # Name of BGP Maintenance Profile. - interface_maintenance_profiles: - # Name of Interface Maintenance Profile + # Name of Interface Maintenance Profile. - ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/interface-profiles.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/interface-profiles.md index 40d5913a05f..dd5d453a8c2 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/interface-profiles.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/interface-profiles.md @@ -8,20 +8,20 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [interface_profiles](## "interface_profiles") | List, items: Dictionary | | | | | - | [  - name](## "interface_profiles.[].name") | String | Required, Unique | | | Interface-Profile Name | + | [  - name](## "interface_profiles.[].name") | String | Required, Unique | | | Interface-Profile Name. | | [    commands](## "interface_profiles.[].commands") | List, items: String | Required | | | | - | [      - <str>](## "interface_profiles.[].commands.[]") | String | | | | EOS CLI interface command
Example: "switchport mode access"
| + | [      - <str>](## "interface_profiles.[].commands.[]") | String | | | | EOS CLI interface command.
Example: "switchport mode access"
| === "YAML" ```yaml interface_profiles: - # Interface-Profile Name + # Interface-Profile Name. - name: commands: # required - # EOS CLI interface command + # EOS CLI interface command. # Example: "switchport mode access" - ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-access-lists.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-access-lists.md index 45368ecb00e..34871a35b99 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-access-lists.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-access-lists.md @@ -27,7 +27,7 @@ | [          - <str>](## "ip_access_lists.[].entries.[].tcp_flags.[]") | String | | | | TCP Flag Name. | | [        fragments](## "ip_access_lists.[].entries.[].fragments") | Boolean | | | | Match non-head fragment packets. | | [        log](## "ip_access_lists.[].entries.[].log") | Boolean | | | | Log matches against this rule. | - | [        ttl](## "ip_access_lists.[].entries.[].ttl") | Integer | | | Min: 0
Max: 255 | TTL value | + | [        ttl](## "ip_access_lists.[].entries.[].ttl") | Integer | | | Min: 0
Max: 255 | TTL value. | | [        ttl_match](## "ip_access_lists.[].entries.[].ttl_match") | String | | `eq` | Valid Values:
- eq
- gt
- lt
- neq | | | [        icmp_type](## "ip_access_lists.[].entries.[].icmp_type") | String | | | | Message type name/number for ICMP packets. | | [        icmp_code](## "ip_access_lists.[].entries.[].icmp_code") | String | | | | Message code for ICMP packets. | @@ -95,7 +95,7 @@ # Log matches against this rule. log: - # TTL value + # TTL value. ttl: ttl_match: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-community-lists.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-community-lists.md index 917c7f81ab2..c6d2ccc49b1 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-community-lists.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-community-lists.md @@ -7,21 +7,21 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | - | [ip_community_lists](## "ip_community_lists") | List, items: Dictionary | | | | Communities and regexp entries MUST not be configured in the same community-list
| - | [  - name](## "ip_community_lists.[].name") | String | Required, Unique | | | IP Community-list Name | + | [ip_community_lists](## "ip_community_lists") | List, items: Dictionary | | | | Communities and regexp entries MUST not be configured in the same community-list.
| + | [  - name](## "ip_community_lists.[].name") | String | Required, Unique | | | IP Community-list Name. | | [    entries](## "ip_community_lists.[].entries") | List, items: Dictionary | Required | | | | | [      - action](## "ip_community_lists.[].entries.[].action") | String | Required | | Valid Values:
- permit
- deny | | | [        communities](## "ip_community_lists.[].entries.[].communities") | List, items: String | | | | If defined, a standard community-list will be configured.
Supported community strings (case insensitive):
- GSHUT
- internet
- local-as
- no-advertise
- no-export
- <1-4294967040>
- aa:nn
| | [          - <str>](## "ip_community_lists.[].entries.[].communities.[]") | String | | | | | - | [        regexp](## "ip_community_lists.[].entries.[].regexp") | String | | | | Regular Expression
If defined, a regex community-list will be configured
| + | [        regexp](## "ip_community_lists.[].entries.[].regexp") | String | | | | Regular Expression.
If defined, a regex community-list will be configured.
| === "YAML" ```yaml - # Communities and regexp entries MUST not be configured in the same community-list + # Communities and regexp entries MUST not be configured in the same community-list. ip_community_lists: - # IP Community-list Name + # IP Community-list Name. - name: entries: # required - action: @@ -38,7 +38,7 @@ communities: - - # Regular Expression - # If defined, a regex community-list will be configured + # Regular Expression. + # If defined, a regex community-list will be configured. regexp: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-dhcp-relay.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-dhcp-relay.md index 2a1c5b281b9..e6f97bd5fa2 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-dhcp-relay.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-dhcp-relay.md @@ -8,13 +8,21 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [ip_dhcp_relay](## "ip_dhcp_relay") | Dictionary | | | | | - | [  information_option](## "ip_dhcp_relay.information_option") | Boolean | | | | Insert Option-82 information | + | [  always_on](## "ip_dhcp_relay.always_on") | Boolean | | | | DhcpRelay Agent will be in always-on mode. | + | [  all_subnets](## "ip_dhcp_relay.all_subnets") | Boolean | | | | Allow forwarding requests with secondary IP addresses in the gateway address "giaddr" field. | + | [  information_option](## "ip_dhcp_relay.information_option") | Boolean | | | | Insert Option-82 information. | === "YAML" ```yaml ip_dhcp_relay: - # Insert Option-82 information + # DhcpRelay Agent will be in always-on mode. + always_on: + + # Allow forwarding requests with secondary IP addresses in the gateway address "giaddr" field. + all_subnets: + + # Insert Option-82 information. information_option: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-dhcp-snooping.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-dhcp-snooping.md index 17647d38df6..c4c0cc6090b 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-dhcp-snooping.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-dhcp-snooping.md @@ -11,8 +11,8 @@ | [  enabled](## "ip_dhcp_snooping.enabled") | Boolean | | | | | | [  bridging](## "ip_dhcp_snooping.bridging") | Boolean | | | | | | [  information_option](## "ip_dhcp_snooping.information_option") | Dictionary | | | | | - | [    enabled](## "ip_dhcp_snooping.information_option.enabled") | Boolean | | | | Enable insertion of option-82 in DHCP request packets | - | [    circuit_id_type](## "ip_dhcp_snooping.information_option.circuit_id_type") | String | | | | "none" or <0 - 255> | + | [    enabled](## "ip_dhcp_snooping.information_option.enabled") | Boolean | | | | Enable insertion of option-82 in DHCP request packets. | + | [    circuit_id_type](## "ip_dhcp_snooping.information_option.circuit_id_type") | String | | | | "none" or <0 - 255>. | | [    circuit_id_format](## "ip_dhcp_snooping.information_option.circuit_id_format") | String | | | Valid Values:
- %h:%p
- %p:%v | Required if `circuit_id_type` is set.
- "%h:%p" Hostname and interface name
- "%p:%v" Interface name and VLAN ID | | [  vlan](## "ip_dhcp_snooping.vlan") | String | | | | VLAN range as string.
"< vlan_id >, < vlan_id >-< vlan_id >"
Example: 15,16,17,18 | @@ -24,10 +24,10 @@ bridging: information_option: - # Enable insertion of option-82 in DHCP request packets + # Enable insertion of option-82 in DHCP request packets. enabled: - # "none" or <0 - 255> + # "none" or <0 - 255>. circuit_id_type: # Required if `circuit_id_type` is set. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-domain-lookup.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-domain-lookup.md index 1e984eebb79..2a07bbe85a8 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-domain-lookup.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-domain-lookup.md @@ -9,7 +9,7 @@ | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [ip_domain_lookup](## "ip_domain_lookup") | Dictionary | | | | | | [  source_interfaces](## "ip_domain_lookup.source_interfaces") | List, items: Dictionary | | | | | - | [    - name](## "ip_domain_lookup.source_interfaces.[].name") | String | Required, Unique | | | Source Interface
| + | [    - name](## "ip_domain_lookup.source_interfaces.[].name") | String | Required, Unique | | | Source Interface.
| | [      vrf](## "ip_domain_lookup.source_interfaces.[].vrf") | String | | | | | === "YAML" @@ -18,7 +18,7 @@ ip_domain_lookup: source_interfaces: - # Source Interface + # Source Interface. - name: vrf: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-extcommunity-lists-regexp.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-extcommunity-lists-regexp.md index dfb0219cd84..1250d67eeeb 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-extcommunity-lists-regexp.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-extcommunity-lists-regexp.md @@ -8,21 +8,21 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [ip_extcommunity_lists_regexp](## "ip_extcommunity_lists_regexp") | List, items: Dictionary | | | | | - | [  - name](## "ip_extcommunity_lists_regexp.[].name") | String | Required, Unique | | | Community-list Name | + | [  - name](## "ip_extcommunity_lists_regexp.[].name") | String | Required, Unique | | | Community-list Name. | | [    entries](## "ip_extcommunity_lists_regexp.[].entries") | List, items: Dictionary | Required | | | | | [      - type](## "ip_extcommunity_lists_regexp.[].entries.[].type") | String | Required | | Valid Values:
- permit
- deny | | - | [        regexp](## "ip_extcommunity_lists_regexp.[].entries.[].regexp") | String | Required | | | Regular Expression | + | [        regexp](## "ip_extcommunity_lists_regexp.[].entries.[].regexp") | String | Required | | | Regular Expression. | === "YAML" ```yaml ip_extcommunity_lists_regexp: - # Community-list Name + # Community-list Name. - name: entries: # required - type: - # Regular Expression + # Regular Expression. regexp: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-extcommunity-lists.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-extcommunity-lists.md index e77521d1d42..34b390e5206 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-extcommunity-lists.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-extcommunity-lists.md @@ -8,22 +8,22 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [ip_extcommunity_lists](## "ip_extcommunity_lists") | List, items: Dictionary | | | | | - | [  - name](## "ip_extcommunity_lists.[].name") | String | Required, Unique | | | Community-list Name | + | [  - name](## "ip_extcommunity_lists.[].name") | String | Required, Unique | | | Community-list Name. | | [    entries](## "ip_extcommunity_lists.[].entries") | List, items: Dictionary | Required | | | | | [      - type](## "ip_extcommunity_lists.[].entries.[].type") | String | Required | | Valid Values:
- permit
- deny | | - | [        extcommunities](## "ip_extcommunity_lists.[].entries.[].extcommunities") | String | Required | | | Communities as string
Example: "65000:65000"
| + | [        extcommunities](## "ip_extcommunity_lists.[].entries.[].extcommunities") | String | Required | | | Communities as string.
Example: "65000:65000"
| === "YAML" ```yaml ip_extcommunity_lists: - # Community-list Name + # Community-list Name. - name: entries: # required - type: - # Communities as string + # Communities as string. # Example: "65000:65000" extcommunities: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-ftp-client-source-interfaces.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-ftp-client-source-interfaces.md index c9bc00eff45..48c584ab9e4 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-ftp-client-source-interfaces.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-ftp-client-source-interfaces.md @@ -8,17 +8,17 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [ip_ftp_client_source_interfaces](## "ip_ftp_client_source_interfaces") | List, items: Dictionary | | | | | - | [  - name](## "ip_ftp_client_source_interfaces.[].name") | String | Required | | | Interface Name | - | [    vrf](## "ip_ftp_client_source_interfaces.[].vrf") | String | | | | VRF Name | + | [  - name](## "ip_ftp_client_source_interfaces.[].name") | String | Required | | | Interface Name. | + | [    vrf](## "ip_ftp_client_source_interfaces.[].vrf") | String | | | | VRF Name. | === "YAML" ```yaml ip_ftp_client_source_interfaces: - # Interface Name + # Interface Name. - name: - # VRF Name + # VRF Name. vrf: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-http-client-source-interfaces.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-http-client-source-interfaces.md index 84e00257393..3479e7b720f 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-http-client-source-interfaces.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-http-client-source-interfaces.md @@ -8,7 +8,7 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [ip_http_client_source_interfaces](## "ip_http_client_source_interfaces") | List, items: Dictionary | | | | | - | [  - name](## "ip_http_client_source_interfaces.[].name") | String | | | | Interface Name | + | [  - name](## "ip_http_client_source_interfaces.[].name") | String | | | | Interface Name. | | [    vrf](## "ip_http_client_source_interfaces.[].vrf") | String | | | | | === "YAML" @@ -16,7 +16,7 @@ ```yaml ip_http_client_source_interfaces: - # Interface Name + # Interface Name. - name: vrf: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-igmp-snooping.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-igmp-snooping.md index 77d67182892..ea23c9d5792 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-igmp-snooping.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-igmp-snooping.md @@ -15,7 +15,7 @@ | [  fast_leave](## "ip_igmp_snooping.fast_leave") | Boolean | | | | | | [  querier](## "ip_igmp_snooping.querier") | Dictionary | | | | | | [    enabled](## "ip_igmp_snooping.querier.enabled") | Boolean | | | | | - | [    address](## "ip_igmp_snooping.querier.address") | String | | | | IP Address | + | [    address](## "ip_igmp_snooping.querier.address") | String | | | | IP Address. | | [    query_interval](## "ip_igmp_snooping.querier.query_interval") | Integer | | | | | | [    max_response_time](## "ip_igmp_snooping.querier.max_response_time") | Integer | | | | | | [    last_member_query_interval](## "ip_igmp_snooping.querier.last_member_query_interval") | Integer | | | | | @@ -25,11 +25,11 @@ | [    version](## "ip_igmp_snooping.querier.version") | Integer | | | | | | [  proxy](## "ip_igmp_snooping.proxy") | Boolean | | | | | | [  vlans](## "ip_igmp_snooping.vlans") | List, items: Dictionary | | | | | - | [    - id](## "ip_igmp_snooping.vlans.[].id") | Integer | Required, Unique | | | VLAN ID | + | [    - id](## "ip_igmp_snooping.vlans.[].id") | Integer | Required, Unique | | | VLAN ID. | | [      enabled](## "ip_igmp_snooping.vlans.[].enabled") | Boolean | | | | | | [      querier](## "ip_igmp_snooping.vlans.[].querier") | Dictionary | | | | | | [        enabled](## "ip_igmp_snooping.vlans.[].querier.enabled") | Boolean | | | | | - | [        address](## "ip_igmp_snooping.vlans.[].querier.address") | String | | | | IP Address | + | [        address](## "ip_igmp_snooping.vlans.[].querier.address") | String | | | | IP Address. | | [        query_interval](## "ip_igmp_snooping.vlans.[].querier.query_interval") | Integer | | | | | | [        max_response_time](## "ip_igmp_snooping.vlans.[].querier.max_response_time") | Integer | | | | | | [        last_member_query_interval](## "ip_igmp_snooping.vlans.[].querier.last_member_query_interval") | Integer | | | | | @@ -39,7 +39,7 @@ | [        version](## "ip_igmp_snooping.vlans.[].querier.version") | Integer | | | | | | [      max_groups](## "ip_igmp_snooping.vlans.[].max_groups") | Integer | | | | | | [      fast_leave](## "ip_igmp_snooping.vlans.[].fast_leave") | Boolean | | | | | - | [      proxy](## "ip_igmp_snooping.vlans.[].proxy") | Boolean | | | | Global proxy settings should be enabled before enabling per-vlan
| + | [      proxy](## "ip_igmp_snooping.vlans.[].proxy") | Boolean | | | | Global proxy settings should be enabled before enabling per-vlan.
| === "YAML" @@ -55,7 +55,7 @@ querier: enabled: - # IP Address + # IP Address. address: query_interval: max_response_time: @@ -67,13 +67,13 @@ proxy: vlans: - # VLAN ID + # VLAN ID. - id: enabled: querier: enabled: - # IP Address + # IP Address. address: query_interval: max_response_time: @@ -85,6 +85,6 @@ max_groups: fast_leave: - # Global proxy settings should be enabled before enabling per-vlan + # Global proxy settings should be enabled before enabling per-vlan. proxy: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-name-servers.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-name-servers.md index 4b342df2dab..9989f3fed86 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-name-servers.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-name-servers.md @@ -8,21 +8,21 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [ip_name_servers](## "ip_name_servers") | List, items: Dictionary | | | | | - | [  - ip_address](## "ip_name_servers.[].ip_address") | String | | | | IPv4 or IPv6 address for DNS server | - | [    vrf](## "ip_name_servers.[].vrf") | String | | | | VRF Name | - | [    priority](## "ip_name_servers.[].priority") | Integer | | | Min: 0
Max: 4 | Priority value (lower is first) | + | [  - ip_address](## "ip_name_servers.[].ip_address") | String | | | | IPv4 or IPv6 address for DNS server. | + | [    vrf](## "ip_name_servers.[].vrf") | String | | | | VRF Name. | + | [    priority](## "ip_name_servers.[].priority") | Integer | | | Min: 0
Max: 4 | Priority value (lower is first). | === "YAML" ```yaml ip_name_servers: - # IPv4 or IPv6 address for DNS server + # IPv4 or IPv6 address for DNS server. - ip_address: - # VRF Name + # VRF Name. vrf: - # Priority value (lower is first) + # Priority value (lower is first). priority: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-nat.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-nat.md index b35e90f5417..9f823a5c3e9 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-nat.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-nat.md @@ -8,7 +8,7 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [ip_nat](## "ip_nat") | Dictionary | | | | | - | [  kernel_buffer_size](## "ip_nat.kernel_buffer_size") | Integer | | | Min: 1
Max: 64 | Buffer size in MB | + | [  kernel_buffer_size](## "ip_nat.kernel_buffer_size") | Integer | | | Min: 1
Max: 64 | Buffer size in MB. | | [  profiles](## "ip_nat.profiles") | List, items: Dictionary | | | | | | [    - name](## "ip_nat.profiles.[].name") | String | Required, Unique | | | | | [      vrf](## "ip_nat.profiles.[].vrf") | String | | | | Specify VRF for NAT profile. | @@ -19,51 +19,52 @@ | [            pool_name](## "ip_nat.profiles.[].destination.dynamic.[].pool_name") | String | Required | | | | | [            priority](## "ip_nat.profiles.[].destination.dynamic.[].priority") | Integer | | | Min: 0
Max: 4294967295 | | | [        static](## "ip_nat.profiles.[].destination.static") | List, items: Dictionary | | | | | - | [          - access_list](## "ip_nat.profiles.[].destination.static.[].access_list") | String | | | | 'access_list' and 'group' are mutual exclusive | + | [          - access_list](## "ip_nat.profiles.[].destination.static.[].access_list") | String | | | | 'access_list' and 'group' are mutual exclusive. | | [            comment](## "ip_nat.profiles.[].destination.static.[].comment") | String | | | | | | [            direction](## "ip_nat.profiles.[].destination.static.[].direction") | String | | | Valid Values:
- egress
- ingress | Egress or ingress can be the default. This depends on source/destination, EOS version, and hardware platform.
EOS might remove this keyword in the configuration. So, check the configuration on targeted HW/SW.
| - | [            group](## "ip_nat.profiles.[].destination.static.[].group") | Integer | | | Min: 1
Max: 65535 | 'access_list' and 'group' are mutual exclusive | - | [            original_ip](## "ip_nat.profiles.[].destination.static.[].original_ip") | String | Required, Unique | | | IPv4 address | - | [            original_port](## "ip_nat.profiles.[].destination.static.[].original_port") | Integer | | | Min: 1
Max: 65535 | | + | [            group](## "ip_nat.profiles.[].destination.static.[].group") | Integer | | | Min: 1
Max: 65535 | 'access_list' and 'group' are mutual exclusive. | + | [            original_ip](## "ip_nat.profiles.[].destination.static.[].original_ip") | String | | | | IPv4 address. The combination of `original_ip` and `original_port` must be unique. | + | [            original_port](## "ip_nat.profiles.[].destination.static.[].original_port") | Integer | | | Min: 1
Max: 65535 | TCP/UDP port. The combination of `original_ip` and `original_port` must be unique. | | [            priority](## "ip_nat.profiles.[].destination.static.[].priority") | Integer | | | Min: 0
Max: 4294967295 | | | [            protocol](## "ip_nat.profiles.[].destination.static.[].protocol") | String | | | Valid Values:
- udp
- tcp | | - | [            translated_ip](## "ip_nat.profiles.[].destination.static.[].translated_ip") | String | Required | | | IPv4 address | - | [            translated_port](## "ip_nat.profiles.[].destination.static.[].translated_port") | Integer | | | Min: 1
Max: 65535 | requires 'original_port' | + | [            translated_ip](## "ip_nat.profiles.[].destination.static.[].translated_ip") | String | Required | | | IPv4 address. | + | [            translated_port](## "ip_nat.profiles.[].destination.static.[].translated_port") | Integer | | | Min: 1
Max: 65535 | requires 'original_port'. | | [      source](## "ip_nat.profiles.[].source") | Dictionary | | | | | | [        dynamic](## "ip_nat.profiles.[].source.dynamic") | List, items: Dictionary | | | | | | [          - access_list](## "ip_nat.profiles.[].source.dynamic.[].access_list") | String | Required, Unique | | | | | [            comment](## "ip_nat.profiles.[].source.dynamic.[].comment") | String | | | | | | [            nat_type](## "ip_nat.profiles.[].source.dynamic.[].nat_type") | String | Required | | Valid Values:
- overload
- pool
- pool-address-only
- pool-full-cone | | - | [            pool_name](## "ip_nat.profiles.[].source.dynamic.[].pool_name") | String | | | | required if 'nat_type' is pool, pool-address-only or pool-full-cone
ignored if 'nat_type' is overload
| + | [            pool_name](## "ip_nat.profiles.[].source.dynamic.[].pool_name") | String | | | | required if 'nat_type' is pool, pool-address-only or pool-full-cone.
ignored if 'nat_type' is overload.
| | [            priority](## "ip_nat.profiles.[].source.dynamic.[].priority") | Integer | | | Min: 0
Max: 4294967295 | | | [        static](## "ip_nat.profiles.[].source.static") | List, items: Dictionary | | | | | - | [          - access_list](## "ip_nat.profiles.[].source.static.[].access_list") | String | | | | 'access_list' and 'group' are mutual exclusive | + | [          - access_list](## "ip_nat.profiles.[].source.static.[].access_list") | String | | | | 'access_list' and 'group' are mutual exclusive. | | [            comment](## "ip_nat.profiles.[].source.static.[].comment") | String | | | | | | [            direction](## "ip_nat.profiles.[].source.static.[].direction") | String | | | Valid Values:
- egress
- ingress | Egress or ingress can be the default. This depends on source/destination, EOS version, and hardware platform.
EOS might remove this keyword in the configuration. So, check the configuration on targeted HW/SW.
| - | [            group](## "ip_nat.profiles.[].source.static.[].group") | Integer | | | Min: 1
Max: 65535 | 'access_list' and 'group' are mutual exclusive | - | [            original_ip](## "ip_nat.profiles.[].source.static.[].original_ip") | String | Required, Unique | | | IPv4 address | - | [            original_port](## "ip_nat.profiles.[].source.static.[].original_port") | Integer | | | Min: 1
Max: 65535 | | + | [            group](## "ip_nat.profiles.[].source.static.[].group") | Integer | | | Min: 1
Max: 65535 | 'access_list' and 'group' are mutual exclusive. | + | [            original_ip](## "ip_nat.profiles.[].source.static.[].original_ip") | String | | | | IPv4 address. The combination of `original_ip` and `original_port` must be unique. | + | [            original_port](## "ip_nat.profiles.[].source.static.[].original_port") | Integer | | | Min: 1
Max: 65535 | TCP/UDP port. The combination of `original_ip` and `original_port` must be unique. | | [            priority](## "ip_nat.profiles.[].source.static.[].priority") | Integer | | | Min: 0
Max: 4294967295 | | | [            protocol](## "ip_nat.profiles.[].source.static.[].protocol") | String | | | Valid Values:
- udp
- tcp | | - | [            translated_ip](## "ip_nat.profiles.[].source.static.[].translated_ip") | String | Required | | | IPv4 address | - | [            translated_port](## "ip_nat.profiles.[].source.static.[].translated_port") | Integer | | | Min: 1
Max: 65535 | requires 'original_port' | + | [            translated_ip](## "ip_nat.profiles.[].source.static.[].translated_ip") | String | Required | | | IPv4 address. | + | [            translated_port](## "ip_nat.profiles.[].source.static.[].translated_port") | Integer | | | Min: 1
Max: 65535 | requires 'original_port'. | | [  pools](## "ip_nat.pools") | List, items: Dictionary | | | | | | [    - name](## "ip_nat.pools.[].name") | String | Required, Unique | | | | - | [      prefix_length](## "ip_nat.pools.[].prefix_length") | Integer | Required | | Min: 16
Max: 32 | | + | [      type](## "ip_nat.pools.[].type") | String | | `ip-port` | Valid Values:
- ip-port
- port-only | | + | [      prefix_length](## "ip_nat.pools.[].prefix_length") | Integer | | | Min: 16
Max: 32 | It is only used and required when `type` is `ip-port`. | | [      ranges](## "ip_nat.pools.[].ranges") | List, items: Dictionary | | | | | - | [        - first_ip](## "ip_nat.pools.[].ranges.[].first_ip") | String | Required | | | IPv4 address | - | [          last_ip](## "ip_nat.pools.[].ranges.[].last_ip") | String | Required | | | IPv4 address | + | [        - first_ip](## "ip_nat.pools.[].ranges.[].first_ip") | String | | | | IPv4 address.
Required when `type` is `ip-port` and ignored otherwise. | + | [          last_ip](## "ip_nat.pools.[].ranges.[].last_ip") | String | | | | IPv4 address.
Required when `type` is `ip-port` and ignored otherwise.
`first_ip` and `last_ip` ip addresses should lie in same subnet. | | [          first_port](## "ip_nat.pools.[].ranges.[].first_port") | Integer | | | Min: 1
Max: 65535 | | - | [          last_port](## "ip_nat.pools.[].ranges.[].last_port") | Integer | | | Min: 1
Max: 65535 | | + | [          last_port](## "ip_nat.pools.[].ranges.[].last_port") | Integer | | | Min: 1
Max: 65535 | Required when `first_port` is set.
`last_port` must be greater than or equal to `first_port`. | | [      utilization_log_threshold](## "ip_nat.pools.[].utilization_log_threshold") | Integer | | | Min: 1
Max: 100 | | | [  synchronization](## "ip_nat.synchronization") | Dictionary | | | | | | [    description](## "ip_nat.synchronization.description") | String | | | | | - | [    expiry_interval](## "ip_nat.synchronization.expiry_interval") | Integer | | | Min: 60
Max: 3600 | in seconds | - | [    local_interface](## "ip_nat.synchronization.local_interface") | String | | | | EOS interface name | - | [    peer_address](## "ip_nat.synchronization.peer_address") | String | | | | IPv4 address | + | [    expiry_interval](## "ip_nat.synchronization.expiry_interval") | Integer | | | Min: 60
Max: 3600 | In seconds. | + | [    local_interface](## "ip_nat.synchronization.local_interface") | String | | | | EOS interface name. | + | [    peer_address](## "ip_nat.synchronization.peer_address") | String | | | | IPv4 address. | | [    port_range](## "ip_nat.synchronization.port_range") | Dictionary | | | | | | [      first_port](## "ip_nat.synchronization.port_range.first_port") | Integer | | | Min: 1024
Max: 65535 | | - | [      last_port](## "ip_nat.synchronization.port_range.last_port") | Integer | | | Min: 1024
Max: 65535 | >= first_port | + | [      last_port](## "ip_nat.synchronization.port_range.last_port") | Integer | | | Min: 1024
Max: 65535 | >= first_port. | | [      split_disabled](## "ip_nat.synchronization.port_range.split_disabled") | Boolean | | | | | | [    shutdown](## "ip_nat.synchronization.shutdown") | Boolean | | | | | | [  translation](## "ip_nat.translation") | Dictionary | | | | | @@ -72,24 +73,24 @@ | [      hash_field_source_ip](## "ip_nat.translation.address_selection.hash_field_source_ip") | Boolean | | | | | | [    counters](## "ip_nat.translation.counters") | Boolean | | | | | | [    low_mark](## "ip_nat.translation.low_mark") | Dictionary | | | | | - | [      percentage](## "ip_nat.translation.low_mark.percentage") | Integer | | | Min: 1
Max: 99 | Used to render 'ip nat translation low-mark ' | - | [      host_percentage](## "ip_nat.translation.low_mark.host_percentage") | Integer | | | Min: 1
Max: 99 | Used to render 'ip nat translation low-mark host' | + | [      percentage](## "ip_nat.translation.low_mark.percentage") | Integer | | | Min: 1
Max: 99 | Used to render 'ip nat translation low-mark '. | + | [      host_percentage](## "ip_nat.translation.low_mark.host_percentage") | Integer | | | Min: 1
Max: 99 | Used to render 'ip nat translation low-mark host'. | | [    max_entries](## "ip_nat.translation.max_entries") | Dictionary | | | | | | [      limit](## "ip_nat.translation.max_entries.limit") | Integer | | | Min: 0
Max: 4294967295 | | | [      host_limit](## "ip_nat.translation.max_entries.host_limit") | Integer | | | Min: 0
Max: 4294967295 | | | [      ip_limits](## "ip_nat.translation.max_entries.ip_limits") | List, items: Dictionary | | | | | - | [        - ip](## "ip_nat.translation.max_entries.ip_limits.[].ip") | String | Required, Unique | | | IPv4 address | + | [        - ip](## "ip_nat.translation.max_entries.ip_limits.[].ip") | String | Required, Unique | | | IPv4 address. | | [          limit](## "ip_nat.translation.max_entries.ip_limits.[].limit") | Integer | Required | | Min: 0
Max: 4294967295 | | | [    timeouts](## "ip_nat.translation.timeouts") | List, items: Dictionary | | | | | | [      - protocol](## "ip_nat.translation.timeouts.[].protocol") | String | Required, Unique | | Valid Values:
- tcp
- udp | | - | [        timeout](## "ip_nat.translation.timeouts.[].timeout") | Integer | Required | | Min: 0
Max: 4294967295 | in seconds | + | [        timeout](## "ip_nat.translation.timeouts.[].timeout") | Integer | Required | | Min: 0
Max: 4294967295 | In seconds. | === "YAML" ```yaml ip_nat: - # Buffer size in MB + # Buffer size in MB. kernel_buffer_size: profiles: - name: @@ -104,7 +105,7 @@ priority: static: - # 'access_list' and 'group' are mutual exclusive + # 'access_list' and 'group' are mutual exclusive. - access_list: comment: @@ -112,19 +113,21 @@ # EOS might remove this keyword in the configuration. So, check the configuration on targeted HW/SW. direction: - # 'access_list' and 'group' are mutual exclusive + # 'access_list' and 'group' are mutual exclusive. group: - # IPv4 address - original_ip: + # IPv4 address. The combination of `original_ip` and `original_port` must be unique. + original_ip: + + # TCP/UDP port. The combination of `original_ip` and `original_port` must be unique. original_port: priority: protocol: - # IPv4 address + # IPv4 address. translated_ip: - # requires 'original_port' + # requires 'original_port'. translated_port: source: dynamic: @@ -132,13 +135,13 @@ comment: nat_type: - # required if 'nat_type' is pool, pool-address-only or pool-full-cone - # ignored if 'nat_type' is overload + # required if 'nat_type' is pool, pool-address-only or pool-full-cone. + # ignored if 'nat_type' is overload. pool_name: priority: static: - # 'access_list' and 'group' are mutual exclusive + # 'access_list' and 'group' are mutual exclusive. - access_list: comment: @@ -146,48 +149,59 @@ # EOS might remove this keyword in the configuration. So, check the configuration on targeted HW/SW. direction: - # 'access_list' and 'group' are mutual exclusive + # 'access_list' and 'group' are mutual exclusive. group: - # IPv4 address - original_ip: + # IPv4 address. The combination of `original_ip` and `original_port` must be unique. + original_ip: + + # TCP/UDP port. The combination of `original_ip` and `original_port` must be unique. original_port: priority: protocol: - # IPv4 address + # IPv4 address. translated_ip: - # requires 'original_port' + # requires 'original_port'. translated_port: pools: - name: - prefix_length: + type: + + # It is only used and required when `type` is `ip-port`. + prefix_length: ranges: - # IPv4 address - - first_ip: + # IPv4 address. + # Required when `type` is `ip-port` and ignored otherwise. + - first_ip: - # IPv4 address - last_ip: + # IPv4 address. + # Required when `type` is `ip-port` and ignored otherwise. + # `first_ip` and `last_ip` ip addresses should lie in same subnet. + last_ip: first_port: + + # Required when `first_port` is set. + # `last_port` must be greater than or equal to `first_port`. last_port: utilization_log_threshold: synchronization: description: - # in seconds + # In seconds. expiry_interval: - # EOS interface name + # EOS interface name. local_interface: - # IPv4 address + # IPv4 address. peer_address: port_range: first_port: - # >= first_port + # >= first_port. last_port: split_disabled: shutdown: @@ -198,22 +212,22 @@ counters: low_mark: - # Used to render 'ip nat translation low-mark ' + # Used to render 'ip nat translation low-mark '. percentage: - # Used to render 'ip nat translation low-mark host' + # Used to render 'ip nat translation low-mark host'. host_percentage: max_entries: limit: host_limit: ip_limits: - # IPv4 address + # IPv4 address. - ip: limit: timeouts: - protocol: - # in seconds + # In seconds. timeout: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-radius-source-interfaces.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-radius-source-interfaces.md index 543d246539b..fa6f45136e2 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-radius-source-interfaces.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-radius-source-interfaces.md @@ -8,17 +8,17 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [ip_radius_source_interfaces](## "ip_radius_source_interfaces") | List, items: Dictionary | | | | | - | [  - name](## "ip_radius_source_interfaces.[].name") | String | | | | Interface Name | - | [    vrf](## "ip_radius_source_interfaces.[].vrf") | String | | | | VRF Name | + | [  - name](## "ip_radius_source_interfaces.[].name") | String | | | | Interface Name. | + | [    vrf](## "ip_radius_source_interfaces.[].vrf") | String | | | | VRF Name. | === "YAML" ```yaml ip_radius_source_interfaces: - # Interface Name + # Interface Name. - name: - # VRF Name + # VRF Name. vrf: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-security.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-security.md index 8fa17c79786..4ad75fadc1f 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-security.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-security.md @@ -16,7 +16,10 @@ | [      encryption](## "ip_security.ike_policies.[].encryption") | String | | | Valid Values:
- 3des
- aes128
- aes256 | IKE encryption algorithm. | | [      dh_group](## "ip_security.ike_policies.[].dh_group") | Integer | | | Valid Values:
- 1
- 2
- 5
- 14
- 15
- 16
- 17
- 20
- 21
- 24 | Diffie-Hellman group for the key exchange. | | [  sa_policies](## "ip_security.sa_policies") | List, items: Dictionary | | | | Security Association policies. | - | [    - name](## "ip_security.sa_policies.[].name") | String | Required, Unique | | | Name of the SA policy. The "null" value is deprecated and will be removed in AVD 5.0.0 | + | [    - name](## "ip_security.sa_policies.[].name") | String | Required, Unique | | | Name of the SA policy. The "null" value is deprecated and will be removed in AVD 5.0.0. | + | [      sa_lifetime](## "ip_security.sa_policies.[].sa_lifetime") | Dictionary | | | | | + | [        value](## "ip_security.sa_policies.[].sa_lifetime.value") | Integer | | | | Lifetime value for this SA.
Valid range depends on the unit.
<1-24> Lifetime in hours ( default )
<1-4000000> Packet limit in thousands
<1-6000> Byte limit in GB ( 1024 MB )
<1-6144000> Byte limit in MB ( 1024 KB ) | + | [        unit](## "ip_security.sa_policies.[].sa_lifetime.unit") | String | | `hours` | Valid Values:
- gigabytes
- hours
- megabytes
- thousand-packets | | | [      esp](## "ip_security.sa_policies.[].esp") | Dictionary | | | | | | [        integrity](## "ip_security.sa_policies.[].esp.integrity") | String | | | Valid Values:
- disabled
- sha1
- sha256
- null | | | [        encryption](## "ip_security.sa_policies.[].esp.encryption") | String | | | Valid Values:
- disabled
- aes128
- aes128gcm128
- aes128gcm64
- aes256
- aes256gcm128
- null | | @@ -30,7 +33,7 @@ | [      dpd](## "ip_security.profiles.[].dpd") | Dictionary | | | | Dead Peer Detection. | | [        interval](## "ip_security.profiles.[].dpd.interval") | Integer | Required | | Min: 2
Max: 3600 | Interval (in seconds) between keep-alive messages. | | [        time](## "ip_security.profiles.[].dpd.time") | Integer | Required | | Min: 10
Max: 3600 | Time (in seconds) after which the action is applied. | - | [        action](## "ip_security.profiles.[].dpd.action") | String | Required | | Valid Values:
- clear
- hold
- restart | Action to apply

* 'clear': Delete all connections
* 'hold': Re-negotiate connection on demand
* 'restart': Restart connection immediately
| + | [        action](## "ip_security.profiles.[].dpd.action") | String | Required | | Valid Values:
- clear
- hold
- restart | Action to apply.

* 'clear': Delete all connections
* 'hold': Re-negotiate connection on demand
* 'restart': Restart connection immediately
| | [      mode](## "ip_security.profiles.[].mode") | String | | | Valid Values:
- transport
- tunnel | Ipsec mode type. | | [      flow_parallelization_encapsulation_udp](## "ip_security.profiles.[].flow_parallelization_encapsulation_udp") | Boolean | | | | Enable flow parallelization.
When enabled, multiple cores are used to parallelize the IPsec encryption and decryption processing. | | [  key_controller](## "ip_security.key_controller") | Dictionary | | | | | @@ -69,8 +72,18 @@ # Security Association policies. sa_policies: - # Name of the SA policy. The "null" value is deprecated and will be removed in AVD 5.0.0 + # Name of the SA policy. The "null" value is deprecated and will be removed in AVD 5.0.0. - name: + sa_lifetime: + + # Lifetime value for this SA. + # Valid range depends on the unit. + # <1-24> Lifetime in hours ( default ) + # <1-4000000> Packet limit in thousands + # <1-6000> Byte limit in GB ( 1024 MB ) + # <1-6144000> Byte limit in MB ( 1024 KB ) + value: + unit: esp: integrity: encryption: @@ -103,7 +116,7 @@ # Time (in seconds) after which the action is applied. time: - # Action to apply + # Action to apply. # # * 'clear': Delete all connections # * 'hold': Re-negotiate connection on demand diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-ssh-client-source-interfaces.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-ssh-client-source-interfaces.md index 3520b310eac..e967bf02ddc 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-ssh-client-source-interfaces.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-ssh-client-source-interfaces.md @@ -8,7 +8,7 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [ip_ssh_client_source_interfaces](## "ip_ssh_client_source_interfaces") | List, items: Dictionary | | | | | - | [  - name](## "ip_ssh_client_source_interfaces.[].name") | String | | | | Interface Name | + | [  - name](## "ip_ssh_client_source_interfaces.[].name") | String | | | | Interface Name. | | [    vrf](## "ip_ssh_client_source_interfaces.[].vrf") | String | | `default` | | | === "YAML" @@ -16,7 +16,7 @@ ```yaml ip_ssh_client_source_interfaces: - # Interface Name + # Interface Name. - name: vrf: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-tacacs-source-interfaces.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-tacacs-source-interfaces.md index 4f59824d300..f95cda77767 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-tacacs-source-interfaces.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-tacacs-source-interfaces.md @@ -8,7 +8,7 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [ip_tacacs_source_interfaces](## "ip_tacacs_source_interfaces") | List, items: Dictionary | | | | | - | [  - name](## "ip_tacacs_source_interfaces.[].name") | String | | | | Interface name | + | [  - name](## "ip_tacacs_source_interfaces.[].name") | String | | | | Interface name. | | [    vrf](## "ip_tacacs_source_interfaces.[].vrf") | String | | | | | === "YAML" @@ -16,7 +16,7 @@ ```yaml ip_tacacs_source_interfaces: - # Interface name + # Interface name. - name: vrf: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-telnet-client-source-interfaces.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-telnet-client-source-interfaces.md index ef7fc6d4ab3..a1d60a2d326 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-telnet-client-source-interfaces.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-telnet-client-source-interfaces.md @@ -8,17 +8,17 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [ip_telnet_client_source_interfaces](## "ip_telnet_client_source_interfaces") | List, items: Dictionary | | | | | - | [  - name](## "ip_telnet_client_source_interfaces.[].name") | String | Required | | | Interface Name | - | [    vrf](## "ip_telnet_client_source_interfaces.[].vrf") | String | | | | VRF Name | + | [  - name](## "ip_telnet_client_source_interfaces.[].name") | String | Required | | | Interface Name. | + | [    vrf](## "ip_telnet_client_source_interfaces.[].vrf") | String | | | | VRF Name. | === "YAML" ```yaml ip_telnet_client_source_interfaces: - # Interface Name + # Interface Name. - name: - # VRF Name + # VRF Name. vrf: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-tftp-client-source-interfaces.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-tftp-client-source-interfaces.md index a9e61168caf..6aeb3a8492d 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-tftp-client-source-interfaces.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-tftp-client-source-interfaces.md @@ -8,17 +8,17 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [ip_tftp_client_source_interfaces](## "ip_tftp_client_source_interfaces") | List, items: Dictionary | | | | | - | [  - name](## "ip_tftp_client_source_interfaces.[].name") | String | Required | | | Interface Name | - | [    vrf](## "ip_tftp_client_source_interfaces.[].vrf") | String | | | | VRF Name | + | [  - name](## "ip_tftp_client_source_interfaces.[].name") | String | Required | | | Interface Name. | + | [    vrf](## "ip_tftp_client_source_interfaces.[].vrf") | String | | | | VRF Name. | === "YAML" ```yaml ip_tftp_client_source_interfaces: - # Interface Name + # Interface Name. - name: - # VRF Name + # VRF Name. vrf: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-virtual-router-mac-address.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-virtual-router-mac-address.md index 37da800ac90..fe60dbf5d39 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-virtual-router-mac-address.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ip-virtual-router-mac-address.md @@ -7,11 +7,11 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | - | [ip_virtual_router_mac_address](## "ip_virtual_router_mac_address") | String | | | | MAC address (hh:hh:hh:hh:hh:hh) | + | [ip_virtual_router_mac_address](## "ip_virtual_router_mac_address") | String | | | | MAC address (hh:hh:hh:hh:hh:hh). | === "YAML" ```yaml - # MAC address (hh:hh:hh:hh:hh:hh) + # MAC address (hh:hh:hh:hh:hh:hh). ip_virtual_router_mac_address: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ipv6-access-lists.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ipv6-access-lists.md index 0730b218c90..a79811f6d06 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ipv6-access-lists.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ipv6-access-lists.md @@ -8,26 +8,26 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [ipv6_access_lists](## "ipv6_access_lists") | List, items: Dictionary | | | | | - | [  - name](## "ipv6_access_lists.[].name") | String | Required, Unique | | | IPv6 Access-list Name | + | [  - name](## "ipv6_access_lists.[].name") | String | Required, Unique | | | IPv6 Access-list Name. | | [    counters_per_entry](## "ipv6_access_lists.[].counters_per_entry") | Boolean | | | | | | [    sequence_numbers](## "ipv6_access_lists.[].sequence_numbers") | List, items: Dictionary | Required | | | | - | [      - sequence](## "ipv6_access_lists.[].sequence_numbers.[].sequence") | Integer | Required, Unique | | | Sequence ID | - | [        action](## "ipv6_access_lists.[].sequence_numbers.[].action") | String | Required | | | Action as string
Example: "deny ipv6 any any"
| + | [      - sequence](## "ipv6_access_lists.[].sequence_numbers.[].sequence") | Integer | Required, Unique | | | Sequence ID. | + | [        action](## "ipv6_access_lists.[].sequence_numbers.[].action") | String | Required | | | Action as string.
Example: "deny ipv6 any any"
| === "YAML" ```yaml ipv6_access_lists: - # IPv6 Access-list Name + # IPv6 Access-list Name. - name: counters_per_entry: sequence_numbers: # required - # Sequence ID + # Sequence ID. - sequence: - # Action as string + # Action as string. # Example: "deny ipv6 any any" action: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ipv6-dhcp-relay.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ipv6-dhcp-relay.md new file mode 100644 index 00000000000..773067cf373 --- /dev/null +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ipv6-dhcp-relay.md @@ -0,0 +1,36 @@ + +=== "Table" + + | Variable | Type | Required | Default | Value Restrictions | Description | + | -------- | ---- | -------- | ------- | ------------------ | ----------- | + | [ipv6_dhcp_relay](## "ipv6_dhcp_relay") | Dictionary | | | | | + | [  always_on](## "ipv6_dhcp_relay.always_on") | Boolean | | | | DhcpRelay Agent will be in always-on mode, off by default. | + | [  all_subnets](## "ipv6_dhcp_relay.all_subnets") | Boolean | | | | Allow forwarding requests with additional IPv6 addresses in the gateway address "giaddr" field. | + | [  option](## "ipv6_dhcp_relay.option") | Dictionary | | | | Insert DHCP Option. | + | [    link_layer_address](## "ipv6_dhcp_relay.option.link_layer_address") | Boolean | | | | Add Option 79 (Link Layer Address Option). | + | [    remote_id_format](## "ipv6_dhcp_relay.option.remote_id_format") | String | | | Valid Values:
- %m:%i
- %m:%p | Add RemoteID option 37 in format MAC address and interface ID (`%m:%i`) or MAC address and interface name (`%m:%p`). | + +=== "YAML" + + ```yaml + ipv6_dhcp_relay: + + # DhcpRelay Agent will be in always-on mode, off by default. + always_on: + + # Allow forwarding requests with additional IPv6 addresses in the gateway address "giaddr" field. + all_subnets: + + # Insert DHCP Option. + option: + + # Add Option 79 (Link Layer Address Option). + link_layer_address: + + # Add RemoteID option 37 in format MAC address and interface ID (`%m:%i`) or MAC address and interface name (`%m:%p`). + remote_id_format: + ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ipv6-hardware.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ipv6-hardware.md index eb748f7674e..82d75ece088 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ipv6-hardware.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ipv6-hardware.md @@ -11,7 +11,7 @@ | [  fib](## "ipv6_hardware.fib") | Dictionary | | | | | | [    optimize](## "ipv6_hardware.fib.optimize") | Dictionary | | | | | | [      prefixes](## "ipv6_hardware.fib.optimize.prefixes") | Dictionary | | | | | - | [        profile](## "ipv6_hardware.fib.optimize.prefixes.profile") | String | | | | Pre-defined profile 'internet' or user-defined profile name | + | [        profile](## "ipv6_hardware.fib.optimize.prefixes.profile") | String | | | | Pre-defined profile 'internet' or user-defined profile name. | === "YAML" @@ -21,6 +21,6 @@ optimize: prefixes: - # Pre-defined profile 'internet' or user-defined profile name + # Pre-defined profile 'internet' or user-defined profile name. profile: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ipv6-neighbor.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ipv6-neighbor.md new file mode 100644 index 00000000000..ee9219dbc8c --- /dev/null +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ipv6-neighbor.md @@ -0,0 +1,45 @@ + +=== "Table" + + | Variable | Type | Required | Default | Value Restrictions | Description | + | -------- | ---- | -------- | ------- | ------------------ | ----------- | + | [ipv6_neighbor](## "ipv6_neighbor") | Dictionary | | | | | + | [  static_entries](## "ipv6_neighbor.static_entries") | List, items: Dictionary | | | | Static IPv6 neighbor entries. | + | [    - ipv6_address](## "ipv6_neighbor.static_entries.[].ipv6_address") | String | Required | | | IPv6 address of neighbor. | + | [      vrf](## "ipv6_neighbor.static_entries.[].vrf") | String | | | | | + | [      interface](## "ipv6_neighbor.static_entries.[].interface") | String | Required | | | Interface name. | + | [      mac_address](## "ipv6_neighbor.static_entries.[].mac_address") | String | Required | | Pattern: ^([0-9a-f]{2}:){5}[0-9a-f]{2}$ | MAC address of neighbor like 'aa:af:12:34:bc:bf' | + | [  persistent](## "ipv6_neighbor.persistent") | Dictionary | | | | | + | [    enabled](## "ipv6_neighbor.persistent.enabled") | Boolean | Required | | | Restore the IPv6 neighbor cache after reboot. | + | [    refresh_delay](## "ipv6_neighbor.persistent.refresh_delay") | Integer | | | Min: 600
Max: 3600 | Time to wait in seconds before refreshing the IPv6 neighbor cache after reboot (EOS default 600).
It will require setting the `enabled` key to true.
| + +=== "YAML" + + ```yaml + ipv6_neighbor: + + # Static IPv6 neighbor entries. + static_entries: + + # IPv6 address of neighbor. + - ipv6_address: + vrf: + + # Interface name. + interface: + + # MAC address of neighbor like 'aa:af:12:34:bc:bf' + mac_address: + persistent: + + # Restore the IPv6 neighbor cache after reboot. + enabled: + + # Time to wait in seconds before refreshing the IPv6 neighbor cache after reboot (EOS default 600). + # It will require setting the `enabled` key to true. + refresh_delay: + ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ipv6-prefix-lists.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ipv6-prefix-lists.md index 83259b25989..44934626598 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ipv6-prefix-lists.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ipv6-prefix-lists.md @@ -8,24 +8,24 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [ipv6_prefix_lists](## "ipv6_prefix_lists") | List, items: Dictionary | | | | | - | [  - name](## "ipv6_prefix_lists.[].name") | String | Required, Unique | | | Prefix-list Name | + | [  - name](## "ipv6_prefix_lists.[].name") | String | Required, Unique | | | Prefix-list Name. | | [    sequence_numbers](## "ipv6_prefix_lists.[].sequence_numbers") | List, items: Dictionary | Required | | | | - | [      - sequence](## "ipv6_prefix_lists.[].sequence_numbers.[].sequence") | Integer | Required, Unique | | | Sequence ID | - | [        action](## "ipv6_prefix_lists.[].sequence_numbers.[].action") | String | Required | | | Action as string
Example: "permit 1b11:3a00:22b0:0082::/64 eq 128"
| + | [      - sequence](## "ipv6_prefix_lists.[].sequence_numbers.[].sequence") | Integer | Required, Unique | | | Sequence ID. | + | [        action](## "ipv6_prefix_lists.[].sequence_numbers.[].action") | String | Required | | | Action as string.
Example: "permit 1b11:3a00:22b0:0082::/64 eq 128"
| === "YAML" ```yaml ipv6_prefix_lists: - # Prefix-list Name + # Prefix-list Name. - name: sequence_numbers: # required - # Sequence ID + # Sequence ID. - sequence: - # Action as string + # Action as string. # Example: "permit 1b11:3a00:22b0:0082::/64 eq 128" action: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ipv6-standard-access-lists.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ipv6-standard-access-lists.md index 15761fdf847..44c2943bfbe 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ipv6-standard-access-lists.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ipv6-standard-access-lists.md @@ -8,26 +8,26 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [ipv6_standard_access_lists](## "ipv6_standard_access_lists") | List, items: Dictionary | | | | | - | [  - name](## "ipv6_standard_access_lists.[].name") | String | Required, Unique | | | Access-list Name | + | [  - name](## "ipv6_standard_access_lists.[].name") | String | Required, Unique | | | Access-list Name. | | [    counters_per_entry](## "ipv6_standard_access_lists.[].counters_per_entry") | Boolean | | | | | | [    sequence_numbers](## "ipv6_standard_access_lists.[].sequence_numbers") | List, items: Dictionary | Required | | | | - | [      - sequence](## "ipv6_standard_access_lists.[].sequence_numbers.[].sequence") | Integer | Required, Unique | | | Sequence ID | - | [        action](## "ipv6_standard_access_lists.[].sequence_numbers.[].action") | String | Required | | | Action as string
Example: "deny ipv6 any any"
| + | [      - sequence](## "ipv6_standard_access_lists.[].sequence_numbers.[].sequence") | Integer | Required, Unique | | | Sequence ID. | + | [        action](## "ipv6_standard_access_lists.[].sequence_numbers.[].action") | String | Required | | | Action as string.
Example: "deny ipv6 any any"
| === "YAML" ```yaml ipv6_standard_access_lists: - # Access-list Name + # Access-list Name. - name: counters_per_entry: sequence_numbers: # required - # Sequence ID + # Sequence ID. - sequence: - # Action as string + # Action as string. # Example: "deny ipv6 any any" action: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ipv6-static-routes.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ipv6-static-routes.md index e9b13e0c0e0..bc00a53bd98 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ipv6-static-routes.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ipv6-static-routes.md @@ -9,13 +9,13 @@ | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [ipv6_static_routes](## "ipv6_static_routes") | List, items: Dictionary | | | | | | [  - vrf](## "ipv6_static_routes.[].vrf") | String | | | | | - | [    destination_address_prefix](## "ipv6_static_routes.[].destination_address_prefix") | String | | | | IPv6 Network/Mask | + | [    destination_address_prefix](## "ipv6_static_routes.[].destination_address_prefix") | String | | | | IPv6 Network/Mask. | | [    interface](## "ipv6_static_routes.[].interface") | String | | | | | - | [    gateway](## "ipv6_static_routes.[].gateway") | String | | | | IPv6 Address | - | [    track_bfd](## "ipv6_static_routes.[].track_bfd") | Boolean | | | | Track next-hop using BFD | + | [    gateway](## "ipv6_static_routes.[].gateway") | String | | | | IPv6 Address. | + | [    track_bfd](## "ipv6_static_routes.[].track_bfd") | Boolean | | | | Track next-hop using BFD. | | [    distance](## "ipv6_static_routes.[].distance") | Integer | | | Min: 1
Max: 255 | | | [    tag](## "ipv6_static_routes.[].tag") | Integer | | | Min: 0
Max: 4294967295 | | - | [    name](## "ipv6_static_routes.[].name") | String | | | | Description | + | [    name](## "ipv6_static_routes.[].name") | String | | | | Description. | | [    metric](## "ipv6_static_routes.[].metric") | Integer | | | Min: 0
Max: 4294967295 | | === "YAML" @@ -24,19 +24,19 @@ ipv6_static_routes: - vrf: - # IPv6 Network/Mask + # IPv6 Network/Mask. destination_address_prefix: interface: - # IPv6 Address + # IPv6 Address. gateway: - # Track next-hop using BFD + # Track next-hop using BFD. track_bfd: distance: tag: - # Description + # Description. name: metric: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/is-deployed.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/is-deployed.md index 2e5e32a2f1f..29587308e82 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/is-deployed.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/is-deployed.md @@ -7,11 +7,11 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | - | [is_deployed](## "is_deployed") | Boolean | | `True` | | Key only used for documentation or validation purposes | + | [is_deployed](## "is_deployed") | Boolean | | `True` | | Key only used for documentation or validation purposes. | === "YAML" ```yaml - # Key only used for documentation or validation purposes + # Key only used for documentation or validation purposes. is_deployed: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/load-interval.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/load-interval.md index 6ac33313436..e92a59a4ab8 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/load-interval.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/load-interval.md @@ -8,13 +8,13 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [load_interval](## "load_interval") | Dictionary | | | | | - | [  default](## "load_interval.default") | Integer | | | | Default load interval in seconds | + | [  default](## "load_interval.default") | Integer | | | | Default load interval in seconds. | === "YAML" ```yaml load_interval: - # Default load interval in seconds + # Default load interval in seconds. default: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/local-users.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/local-users.md index b953bd6149e..569c34a554e 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/local-users.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/local-users.md @@ -8,22 +8,22 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [local_users](## "local_users") | List, items: Dictionary | | | | | - | [  - name](## "local_users.[].name") | String | Required, Unique | | | Username | + | [  - name](## "local_users.[].name") | String | Required, Unique | | | Username. | | [    disabled](## "local_users.[].disabled") | Boolean | | | | If true, the user will be removed and all other settings are ignored.
Useful for removing the default "admin" user.
| | [    privilege](## "local_users.[].privilege") | Integer | | | Min: 0
Max: 15 | Initial privilege level with local EXEC authorization.
| - | [    role](## "local_users.[].role") | String | | | | EOS RBAC Role to be assigned to the user such as "network-admin" or "network-operator"
| - | [    sha512_password](## "local_users.[].sha512_password") | String | | | | SHA512 Hash of Password
Must be the hash of the password. By default EOS salts the password with the username, so the simplest is to generate the hash on an EOS device using the same username.
| + | [    role](## "local_users.[].role") | String | | | | EOS RBAC Role to be assigned to the user such as "network-admin" or "network-operator".
| + | [    sha512_password](## "local_users.[].sha512_password") | String | | | | SHA512 Hash of Password.
Must be the hash of the password. By default EOS salts the password with the username, so the simplest is to generate the hash on an EOS device using the same username.
| | [    no_password](## "local_users.[].no_password") | Boolean | | | | If set a password will not be configured for this user. "sha512_password" MUST not be defined for this user.
| | [    ssh_key](## "local_users.[].ssh_key") | String | | | | | | [    secondary_ssh_key](## "local_users.[].secondary_ssh_key") | String | | | | | - | [    shell](## "local_users.[].shell") | String | | | Valid Values:
- /bin/bash
- /bin/sh
- /sbin/nologin | Specify shell for the user
| + | [    shell](## "local_users.[].shell") | String | | | Valid Values:
- /bin/bash
- /bin/sh
- /sbin/nologin | Specify shell for the user.
| === "YAML" ```yaml local_users: - # Username + # Username. - name: # If true, the user will be removed and all other settings are ignored. @@ -33,10 +33,10 @@ # Initial privilege level with local EXEC authorization. privilege: - # EOS RBAC Role to be assigned to the user such as "network-admin" or "network-operator" + # EOS RBAC Role to be assigned to the user such as "network-admin" or "network-operator". role: - # SHA512 Hash of Password + # SHA512 Hash of Password. # Must be the hash of the password. By default EOS salts the password with the username, so the simplest is to generate the hash on an EOS device using the same username. sha512_password: @@ -45,6 +45,6 @@ ssh_key: secondary_ssh_key: - # Specify shell for the user + # Specify shell for the user. shell: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/logging.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/logging.md index c3563dd9d50..e99a59c92b7 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/logging.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/logging.md @@ -8,89 +8,92 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [logging](## "logging") | Dictionary | | | | | - | [  console](## "logging.console") | String | | | Valid Values:
- debugging
- informational
- notifications
- warnings
- errors
- critical
- alerts
- emergencies
- disabled | Console logging severity level
| - | [  monitor](## "logging.monitor") | String | | | Valid Values:
- debugging
- informational
- notifications
- warnings
- errors
- critical
- alerts
- emergencies
- disabled | Monitor logging severity level
| + | [  console](## "logging.console") | String | | | Valid Values:
- debugging
- informational
- notifications
- warnings
- errors
- critical
- alerts
- emergencies
- disabled | Console logging severity level.
| + | [  monitor](## "logging.monitor") | String | | | Valid Values:
- debugging
- informational
- notifications
- warnings
- errors
- critical
- alerts
- emergencies
- disabled | Monitor logging severity level.
| | [  buffered](## "logging.buffered") | Dictionary | | | | | | [    size](## "logging.buffered.size") | Integer | | | Min: 10
Max: 2147483647 | | - | [    level](## "logging.buffered.level") | String | | | Valid Values:
- alerts
- critical
- debugging
- emergencies
- errors
- informational
- notifications
- warnings
- disabled | Buffer logging severity level
| - | [  trap](## "logging.trap") | String | | | Valid Values:
- alerts
- critical
- debugging
- emergencies
- errors
- informational
- notifications
- system
- warnings
- disabled | Trap logging severity level
| + | [    level](## "logging.buffered.level") | String | | | Valid Values:
- alerts
- critical
- debugging
- emergencies
- errors
- informational
- notifications
- warnings
- disabled | Buffer logging severity level.
| + | [  trap](## "logging.trap") | String | | | Valid Values:
- alerts
- critical
- debugging
- emergencies
- errors
- informational
- notifications
- system
- warnings
- disabled | Trap logging severity level.
| | [  synchronous](## "logging.synchronous") | Dictionary | | | | | - | [    level](## "logging.synchronous.level") | String | | `critical` | Valid Values:
- alerts
- all
- critical
- debugging
- emergencies
- errors
- informational
- notifications
- warnings
- disabled | Synchronous logging severity level
| + | [    level](## "logging.synchronous.level") | String | | `critical` | Valid Values:
- alerts
- all
- critical
- debugging
- emergencies
- errors
- informational
- notifications
- warnings
- disabled | Synchronous logging severity level.
| | [  format](## "logging.format") | Dictionary | | | | | - | [    timestamp](## "logging.format.timestamp") | String | | | Valid Values:
- high-resolution
- traditional
- traditional timezone
- traditional year
- traditional timezone year
- traditional year timezone | Timestamp format | + | [    timestamp](## "logging.format.timestamp") | String | | | Valid Values:
- high-resolution
- traditional
- traditional timezone
- traditional year
- traditional timezone year
- traditional year timezone | Timestamp format. | | [    hostname](## "logging.format.hostname") | String | | | Valid Values:
- fqdn
- ipv4 | Hostname format in syslogs. For hostname _only_, remove the line. (default EOS CLI behaviour). | - | [    sequence_numbers](## "logging.format.sequence_numbers") | Boolean | | | | Add sequence numbers to log messages
| - | [    rfc5424](## "logging.format.rfc5424") | Boolean | | | | Forward logs in RFC5424 format
| + | [    sequence_numbers](## "logging.format.sequence_numbers") | Boolean | | | | Add sequence numbers to log messages.
| + | [    rfc5424](## "logging.format.rfc5424") | Boolean | | | | Forward logs in RFC5424 format.
| | [  facility](## "logging.facility") | String | | | Valid Values:
- auth
- cron
- daemon
- kern
- local0
- local1
- local2
- local3
- local4
- local5
- local6
- local7
- lpr
- mail
- news
- sys9
- sys10
- sys11
- sys12
- sys13
- sys14
- syslog
- user
- uucp | | - | [  source_interface](## "logging.source_interface") | String | | | | Source Interface Name | + | [  source_interface](## "logging.source_interface") | String | | | | Source Interface Name. | | [  vrfs](## "logging.vrfs") | List, items: Dictionary | | | | | - | [    - name](## "logging.vrfs.[].name") | String | Required, Unique | | | VRF name | - | [      source_interface](## "logging.vrfs.[].source_interface") | String | | | | Source interface name | + | [    - name](## "logging.vrfs.[].name") | String | Required, Unique | | | VRF name. | + | [      source_interface](## "logging.vrfs.[].source_interface") | String | | | | Source interface name. | | [      hosts](## "logging.vrfs.[].hosts") | List, items: Dictionary | | | | | - | [        - name](## "logging.vrfs.[].hosts.[].name") | String | Required, Unique | | | Syslog server name | + | [        - name](## "logging.vrfs.[].hosts.[].name") | String | Required, Unique | | | Syslog server name. | | [          protocol](## "logging.vrfs.[].hosts.[].protocol") | String | | `udp` | Valid Values:
- tcp
- udp | | | [          ports](## "logging.vrfs.[].hosts.[].ports") | List, items: Integer | | | | | | [            - <int>](## "logging.vrfs.[].hosts.[].ports.[]") | Integer | | | | | | [  policy](## "logging.policy") | Dictionary | | | | | | [    match](## "logging.policy.match") | Dictionary | | | | | | [      match_lists](## "logging.policy.match.match_lists") | List, items: Dictionary | | | | | - | [        - name](## "logging.policy.match.match_lists.[].name") | String | Required, Unique | | | Match list | + | [        - name](## "logging.policy.match.match_lists.[].name") | String | Required, Unique | | | Match list. | | [          action](## "logging.policy.match.match_lists.[].action") | String | | | Valid Values:
- discard | | | [  event](## "logging.event") | Dictionary | | | | | | [    storm_control](## "logging.event.storm_control") | Dictionary | | | | | | [      discards](## "logging.event.storm_control.discards") | Dictionary | | | | | | [        global](## "logging.event.storm_control.discards.global") | Boolean | | | | | - | [        interval](## "logging.event.storm_control.discards.interval") | Integer | | | Min: 10
Max: 65535 | Logging interval in seconds | + | [        interval](## "logging.event.storm_control.discards.interval") | Integer | | | Min: 10
Max: 65535 | Logging interval in seconds. | + | [  level](## "logging.level") | List, items: Dictionary | | | | Configure logging severity. | + | [    - facility](## "logging.level.[].facility") | String | Required, Unique | | | | + | [      severity](## "logging.level.[].severity") | String | | | Valid Values:
- alerts
- critical
- debugging
- emergencies
- errors
- informational
- notifications
- warnings
- 0
- 1
- 2
- 3
- 4
- 5
- 6
- 7 | Severity of facility. Below are the supported severites.
emergencies System is unusable (severity=0)
alerts Immediate action needed (severity=1)
critical Critical conditions (severity=2)
errors Error conditions (severity=3)
warnings Warning conditions (severity=4)
notifications Normal but significant conditions (severity=5)
informational Informational messages (severity=6)
debugging Debugging messages (severity=7)
<0-7> Severity level value | === "YAML" ```yaml logging: - # Console logging severity level + # Console logging severity level. console: - # Monitor logging severity level + # Monitor logging severity level. monitor: buffered: size: - # Buffer logging severity level + # Buffer logging severity level. level: - # Trap logging severity level + # Trap logging severity level. trap: synchronous: - # Synchronous logging severity level + # Synchronous logging severity level. level: format: - # Timestamp format + # Timestamp format. timestamp: # Hostname format in syslogs. For hostname _only_, remove the line. (default EOS CLI behaviour). hostname: - # Add sequence numbers to log messages + # Add sequence numbers to log messages. sequence_numbers: - # Forward logs in RFC5424 format + # Forward logs in RFC5424 format. rfc5424: facility: - # Source Interface Name + # Source Interface Name. source_interface: vrfs: - # VRF name + # VRF name. - name: - # Source interface name + # Source interface name. source_interface: hosts: - # Syslog server name + # Syslog server name. - name: protocol: ports: @@ -99,7 +102,7 @@ match: match_lists: - # Match list + # Match list. - name: action: event: @@ -107,6 +110,22 @@ discards: global: - # Logging interval in seconds + # Logging interval in seconds. interval: + + # Configure logging severity. + level: + - facility: + + # Severity of facility. Below are the supported severites. + # emergencies System is unusable (severity=0) + # alerts Immediate action needed (severity=1) + # critical Critical conditions (severity=2) + # errors Error conditions (severity=3) + # warnings Warning conditions (severity=4) + # notifications Normal but significant conditions (severity=5) + # informational Informational messages (severity=6) + # debugging Debugging messages (severity=7) + # <0-7> Severity level value + severity: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/loopback-interfaces.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/loopback-interfaces.md index 077bcab18ff..e4a6bacb16d 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/loopback-interfaces.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/loopback-interfaces.md @@ -8,51 +8,52 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [loopback_interfaces](## "loopback_interfaces") | List, items: Dictionary | | | | | - | [  - name](## "loopback_interfaces.[].name") | String | Required, Unique | | | Loopback interface name e.g. "Loopback0" | + | [  - name](## "loopback_interfaces.[].name") | String | Required, Unique | | | Loopback interface name e.g. "Loopback0". | | [    description](## "loopback_interfaces.[].description") | String | | | | | | [    shutdown](## "loopback_interfaces.[].shutdown") | Boolean | | | | | - | [    vrf](## "loopback_interfaces.[].vrf") | String | | | | VRF name | - | [    ip_address](## "loopback_interfaces.[].ip_address") | String | | | | IPv4_address/Mask | + | [    vrf](## "loopback_interfaces.[].vrf") | String | | | | VRF name. | + | [    ip_address](## "loopback_interfaces.[].ip_address") | String | | | | IPv4_address/Mask. | | [    ip_address_secondaries](## "loopback_interfaces.[].ip_address_secondaries") | List, items: String | | | | | - | [      - <str>](## "loopback_interfaces.[].ip_address_secondaries.[]") | String | | | | IPv4_address/Mask | + | [      - <str>](## "loopback_interfaces.[].ip_address_secondaries.[]") | String | | | | IPv4_address/Mask. | | [    ipv6_enable](## "loopback_interfaces.[].ipv6_enable") | Boolean | | | | | - | [    ipv6_address](## "loopback_interfaces.[].ipv6_address") | String | | | | IPv6_address/Mask | + | [    ipv6_address](## "loopback_interfaces.[].ipv6_address") | String | | | | IPv6_address/Mask. | | [    ip_proxy_arp](## "loopback_interfaces.[].ip_proxy_arp") | Boolean | | | | | | [    ospf_area](## "loopback_interfaces.[].ospf_area") | String | | | | | | [    mpls](## "loopback_interfaces.[].mpls") | Dictionary | | | | | | [      ldp](## "loopback_interfaces.[].mpls.ldp") | Dictionary | | | | | | [        interface](## "loopback_interfaces.[].mpls.ldp.interface") | Boolean | | | | | - | [    isis_enable](## "loopback_interfaces.[].isis_enable") | String | | | | ISIS instance name | + | [    isis_enable](## "loopback_interfaces.[].isis_enable") | String | | | | ISIS instance name. | + | [    isis_bfd](## "loopback_interfaces.[].isis_bfd") | Boolean | | | | Enable BFD for ISIS. | | [    isis_passive](## "loopback_interfaces.[].isis_passive") | Boolean | | | | | | [    isis_metric](## "loopback_interfaces.[].isis_metric") | Integer | | | | | | [    isis_network_point_to_point](## "loopback_interfaces.[].isis_network_point_to_point") | Boolean | | | | | | [    node_segment](## "loopback_interfaces.[].node_segment") | Dictionary | | | | | | [      ipv4_index](## "loopback_interfaces.[].node_segment.ipv4_index") | Integer | | | | | | [      ipv6_index](## "loopback_interfaces.[].node_segment.ipv6_index") | Integer | | | | | - | [    eos_cli](## "loopback_interfaces.[].eos_cli") | String | | | | EOS CLI rendered directly on the loopback interface in the final EOS configuration | + | [    eos_cli](## "loopback_interfaces.[].eos_cli") | String | | | | EOS CLI rendered directly on the loopback interface in the final EOS configuration. | === "YAML" ```yaml loopback_interfaces: - # Loopback interface name e.g. "Loopback0" + # Loopback interface name e.g. "Loopback0". - name: description: shutdown: - # VRF name + # VRF name. vrf: - # IPv4_address/Mask + # IPv4_address/Mask. ip_address: ip_address_secondaries: - # IPv4_address/Mask + # IPv4_address/Mask. - ipv6_enable: - # IPv6_address/Mask + # IPv6_address/Mask. ipv6_address: ip_proxy_arp: ospf_area: @@ -60,8 +61,11 @@ ldp: interface: - # ISIS instance name + # ISIS instance name. isis_enable: + + # Enable BFD for ISIS. + isis_bfd: isis_passive: isis_metric: isis_network_point_to_point: @@ -69,6 +73,6 @@ ipv4_index: ipv6_index: - # EOS CLI rendered directly on the loopback interface in the final EOS configuration + # EOS CLI rendered directly on the loopback interface in the final EOS configuration. eos_cli: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/mac-access-lists.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/mac-access-lists.md index 2aae889a242..e40b6b05ad5 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/mac-access-lists.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/mac-access-lists.md @@ -8,7 +8,7 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [mac_access_lists](## "mac_access_lists") | List, items: Dictionary | | | | | - | [  - name](## "mac_access_lists.[].name") | String | Required, Unique | | | MAC Access-list Name | + | [  - name](## "mac_access_lists.[].name") | String | Required, Unique | | | MAC Access-list Name. | | [    counters_per_entry](## "mac_access_lists.[].counters_per_entry") | Boolean | | | | | | [    entries](## "mac_access_lists.[].entries") | List, items: Dictionary | | | | | | [      - sequence](## "mac_access_lists.[].entries.[].sequence") | Integer | | | | | @@ -19,7 +19,7 @@ ```yaml mac_access_lists: - # MAC Access-list Name + # MAC Access-list Name. - name: counters_per_entry: entries: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/mac-address-table.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/mac-address-table.md index 0a29d462aec..bd8cee6a9af 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/mac-address-table.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/mac-address-table.md @@ -8,7 +8,7 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [mac_address_table](## "mac_address_table") | Dictionary | | | | | - | [  aging_time](## "mac_address_table.aging_time") | Integer | | | | Aging time in seconds | + | [  aging_time](## "mac_address_table.aging_time") | Integer | | | | Aging time in seconds. | | [  notification_host_flap](## "mac_address_table.notification_host_flap") | Dictionary | | | | | | [    logging](## "mac_address_table.notification_host_flap.logging") | Boolean | | | | | | [    detection](## "mac_address_table.notification_host_flap.detection") | Dictionary | | | | | @@ -20,7 +20,7 @@ ```yaml mac_address_table: - # Aging time in seconds + # Aging time in seconds. aging_time: notification_host_flap: logging: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/mac-security.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/mac-security.md index 851983cb566..cf6450abcc5 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/mac-security.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/mac-security.md @@ -13,7 +13,7 @@ | [    license_key](## "mac_security.license.license_key") | String | Required | | | | | [  fips_restrictions](## "mac_security.fips_restrictions") | Boolean | | | | | | [  profiles](## "mac_security.profiles") | List, items: Dictionary | | | | | - | [    - name](## "mac_security.profiles.[].name") | String | Required, Unique | | | Profile-Name | + | [    - name](## "mac_security.profiles.[].name") | String | Required, Unique | | | Profile-Name. | | [      cipher](## "mac_security.profiles.[].cipher") | String | | | Valid Values:
- aes128-gcm
- aes128-gcm-xpn
- aes256-gcm
- aes256-gcm-xpn | | | [      connection_keys](## "mac_security.profiles.[].connection_keys") | List, items: Dictionary | | | | | | [        - id](## "mac_security.profiles.[].connection_keys.[].id") | String | Required, Unique | | | | @@ -22,13 +22,16 @@ | [      mka](## "mac_security.profiles.[].mka") | Dictionary | | | | | | [        key_server_priority](## "mac_security.profiles.[].mka.key_server_priority") | Integer | | | Min: 0
Max: 255 | | | [        session](## "mac_security.profiles.[].mka.session") | Dictionary | | | | | - | [          rekey_period](## "mac_security.profiles.[].mka.session.rekey_period") | Integer | | | Min: 30
Max: 100000 | Rekey period in seconds | + | [          rekey_period](## "mac_security.profiles.[].mka.session.rekey_period") | Integer | | | Min: 30
Max: 100000 | Rekey period in seconds. | | [      sci](## "mac_security.profiles.[].sci") | Boolean | | | | | | [      l2_protocols](## "mac_security.profiles.[].l2_protocols") | Dictionary | | | | | | [        ethernet_flow_control](## "mac_security.profiles.[].l2_protocols.ethernet_flow_control") | Dictionary | | | | | | [          mode](## "mac_security.profiles.[].l2_protocols.ethernet_flow_control.mode") | String | Required | | Valid Values:
- encrypt
- bypass | | | [        lldp](## "mac_security.profiles.[].l2_protocols.lldp") | Dictionary | | | | | | [          mode](## "mac_security.profiles.[].l2_protocols.lldp.mode") | String | Required | | Valid Values:
- bypass
- bypass unauthorized | | + | [      traffic_unprotected](## "mac_security.profiles.[].traffic_unprotected") | Dictionary | | | | | + | [        action](## "mac_security.profiles.[].traffic_unprotected.action") | String | Required | | Valid Values:
- allow
- drop | Allow/drop the transmit/receive of unprotected traffic. | + | [        allow_active_sak](## "mac_security.profiles.[].traffic_unprotected.allow_active_sak") | Boolean | | | | Allow transmit/receive of encrypted traffic using operational SAK and block otherwise. | === "YAML" @@ -40,7 +43,7 @@ fips_restrictions: profiles: - # Profile-Name + # Profile-Name. - name: cipher: connection_keys: @@ -51,7 +54,7 @@ key_server_priority: session: - # Rekey period in seconds + # Rekey period in seconds. rekey_period: sci: l2_protocols: @@ -59,4 +62,11 @@ mode: lldp: mode: + traffic_unprotected: + + # Allow/drop the transmit/receive of unprotected traffic. + action: + + # Allow transmit/receive of encrypted traffic using operational SAK and block otherwise. + allow_active_sak: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/maintenance.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/maintenance.md index 740b27da4bc..f8405a4de83 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/maintenance.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/maintenance.md @@ -8,91 +8,91 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [maintenance](## "maintenance") | Dictionary | | | | | - | [  default_interface_profile](## "maintenance.default_interface_profile") | String | | | | Name of default Interface Profile
| - | [  default_bgp_profile](## "maintenance.default_bgp_profile") | String | | | | Name of default BGP Profile
| - | [  default_unit_profile](## "maintenance.default_unit_profile") | String | | | | Name of default Unit Profile
| + | [  default_interface_profile](## "maintenance.default_interface_profile") | String | | | | Name of default Interface Profile.
| + | [  default_bgp_profile](## "maintenance.default_bgp_profile") | String | | | | Name of default BGP Profile.
| + | [  default_unit_profile](## "maintenance.default_unit_profile") | String | | | | Name of default Unit Profile.
| | [  interface_profiles](## "maintenance.interface_profiles") | List, items: Dictionary | | | | | | [    - name](## "maintenance.interface_profiles.[].name") | String | Required, Unique | | | | | [      rate_monitoring](## "maintenance.interface_profiles.[].rate_monitoring") | Dictionary | | | | | - | [        load_interval](## "maintenance.interface_profiles.[].rate_monitoring.load_interval") | Integer | | | | Load Interval in Seconds
| - | [        threshold](## "maintenance.interface_profiles.[].rate_monitoring.threshold") | Integer | | | | Threshold in kbps
| + | [        load_interval](## "maintenance.interface_profiles.[].rate_monitoring.load_interval") | Integer | | | | Load Interval in Seconds.
| + | [        threshold](## "maintenance.interface_profiles.[].rate_monitoring.threshold") | Integer | | | | Threshold in kbps.
| | [      shutdown](## "maintenance.interface_profiles.[].shutdown") | Dictionary | | | | | - | [        max_delay](## "maintenance.interface_profiles.[].shutdown.max_delay") | Integer | | | | Max delay in seconds
| + | [        max_delay](## "maintenance.interface_profiles.[].shutdown.max_delay") | Integer | | | | Max delay in seconds.
| | [  bgp_profiles](## "maintenance.bgp_profiles") | List, items: Dictionary | | | | | - | [    - name](## "maintenance.bgp_profiles.[].name") | String | Required, Unique | | | BGP Profile Name | + | [    - name](## "maintenance.bgp_profiles.[].name") | String | Required, Unique | | | BGP Profile Name. | | [      initiator](## "maintenance.bgp_profiles.[].initiator") | Dictionary | | | | | - | [        route_map_inout](## "maintenance.bgp_profiles.[].initiator.route_map_inout") | String | | | | Route Map | + | [        route_map_inout](## "maintenance.bgp_profiles.[].initiator.route_map_inout") | String | | | | Route Map. | | [  unit_profiles](## "maintenance.unit_profiles") | List, items: Dictionary | | | | | - | [    - name](## "maintenance.unit_profiles.[].name") | String | Required, Unique | | | Unit Profile Name | + | [    - name](## "maintenance.unit_profiles.[].name") | String | Required, Unique | | | Unit Profile Name. | | [      on_boot](## "maintenance.unit_profiles.[].on_boot") | Dictionary | | | | | - | [        duration](## "maintenance.unit_profiles.[].on_boot.duration") | Integer | | | Min: 300
Max: 3600 | On-boot in seconds
| + | [        duration](## "maintenance.unit_profiles.[].on_boot.duration") | Integer | | | Min: 300
Max: 3600 | On-boot in seconds.
| | [  units](## "maintenance.units") | List, items: Dictionary | | | | | - | [    - name](## "maintenance.units.[].name") | String | Required, Unique | | | Unit Name | + | [    - name](## "maintenance.units.[].name") | String | Required, Unique | | | Unit Name. | | [      quiesce](## "maintenance.units.[].quiesce") | Boolean | | | | | - | [      profile](## "maintenance.units.[].profile") | String | | | | Name of Unit Profile
| + | [      profile](## "maintenance.units.[].profile") | String | | | | Name of Unit Profile.
| | [      groups](## "maintenance.units.[].groups") | Dictionary | | | | | | [        bgp_groups](## "maintenance.units.[].groups.bgp_groups") | List, items: String | | | | | - | [          - <str>](## "maintenance.units.[].groups.bgp_groups.[]") | String | | | | Name of BGP Group
| + | [          - <str>](## "maintenance.units.[].groups.bgp_groups.[]") | String | | | | Name of BGP Group.
| | [        interface_groups](## "maintenance.units.[].groups.interface_groups") | List, items: String | | | | | - | [          - <str>](## "maintenance.units.[].groups.interface_groups.[]") | String | | | | Name of Interface Group
| + | [          - <str>](## "maintenance.units.[].groups.interface_groups.[]") | String | | | | Name of Interface Group.
| === "YAML" ```yaml maintenance: - # Name of default Interface Profile + # Name of default Interface Profile. default_interface_profile: - # Name of default BGP Profile + # Name of default BGP Profile. default_bgp_profile: - # Name of default Unit Profile + # Name of default Unit Profile. default_unit_profile: interface_profiles: - name: rate_monitoring: - # Load Interval in Seconds + # Load Interval in Seconds. load_interval: - # Threshold in kbps + # Threshold in kbps. threshold: shutdown: - # Max delay in seconds + # Max delay in seconds. max_delay: bgp_profiles: - # BGP Profile Name + # BGP Profile Name. - name: initiator: - # Route Map + # Route Map. route_map_inout: unit_profiles: - # Unit Profile Name + # Unit Profile Name. - name: on_boot: - # On-boot in seconds + # On-boot in seconds. duration: units: - # Unit Name + # Unit Name. - name: quiesce: - # Name of Unit Profile + # Name of Unit Profile. profile: groups: bgp_groups: - # Name of BGP Group + # Name of BGP Group. - interface_groups: - # Name of Interface Group + # Name of Interface Group. - ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/management-api-gnmi.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/management-api-gnmi.md index e1e7514b22e..6ff47c717cc 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/management-api-gnmi.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/management-api-gnmi.md @@ -11,31 +11,31 @@ | [  provider](## "management_api_gnmi.provider") | String | | `eos-native` | | | | [  transport](## "management_api_gnmi.transport") | Dictionary | | | | | | [    grpc](## "management_api_gnmi.transport.grpc") | List, items: Dictionary | | | | | - | [      - name](## "management_api_gnmi.transport.grpc.[].name") | String | | | | Transport name | - | [        ssl_profile](## "management_api_gnmi.transport.grpc.[].ssl_profile") | String | | | | SSL profile name | - | [        vrf](## "management_api_gnmi.transport.grpc.[].vrf") | String | | | | VRF name is optional | + | [      - name](## "management_api_gnmi.transport.grpc.[].name") | String | | | | Transport name. | + | [        ssl_profile](## "management_api_gnmi.transport.grpc.[].ssl_profile") | String | | | | SSL profile name. | + | [        vrf](## "management_api_gnmi.transport.grpc.[].vrf") | String | | | | VRF name is optional. | | [        notification_timestamp](## "management_api_gnmi.transport.grpc.[].notification_timestamp") | String | | | Valid Values:
- send-time
- last-change-time | Per the gNMI specification, the default timestamp field of a notification message is set to be
the time at which the value of the underlying data source changes or when the reported event takes place.
In order to facilitate integration in legacy environments oriented around polling style operations,
an option to support overriding the timestamp field to the send-time is available from EOS 4.27.0F.
| - | [        ip_access_group](## "management_api_gnmi.transport.grpc.[].ip_access_group") | String | | | | ACL name | + | [        ip_access_group](## "management_api_gnmi.transport.grpc.[].ip_access_group") | String | | | | ACL name. | | [        port](## "management_api_gnmi.transport.grpc.[].port") | Integer | | | | GNMI port.
Make sure to update the control-plane ACL accordingly in order for the service to be reachable by external applications.
| | [    grpc_tunnels](## "management_api_gnmi.transport.grpc_tunnels") | List, items: Dictionary | | | | | - | [      - name](## "management_api_gnmi.transport.grpc_tunnels.[].name") | String | Required, Unique | | | Transport name | - | [        shutdown](## "management_api_gnmi.transport.grpc_tunnels.[].shutdown") | Boolean | | | | Operational status of the gRPC tunnel | - | [        tunnel_ssl_profile](## "management_api_gnmi.transport.grpc_tunnels.[].tunnel_ssl_profile") | String | | | | Tunnel SSL profile name | - | [        gnmi_ssl_profile](## "management_api_gnmi.transport.grpc_tunnels.[].gnmi_ssl_profile") | String | | | | gNMI SSL profile name | - | [        vrf](## "management_api_gnmi.transport.grpc_tunnels.[].vrf") | String | | | | VRF name | + | [      - name](## "management_api_gnmi.transport.grpc_tunnels.[].name") | String | Required, Unique | | | Transport name. | + | [        shutdown](## "management_api_gnmi.transport.grpc_tunnels.[].shutdown") | Boolean | | | | Operational status of the gRPC tunnel. | + | [        tunnel_ssl_profile](## "management_api_gnmi.transport.grpc_tunnels.[].tunnel_ssl_profile") | String | | | | Tunnel SSL profile name. | + | [        gnmi_ssl_profile](## "management_api_gnmi.transport.grpc_tunnels.[].gnmi_ssl_profile") | String | | | | gNMI SSL profile name. | + | [        vrf](## "management_api_gnmi.transport.grpc_tunnels.[].vrf") | String | | | | VRF name. | | [        destination](## "management_api_gnmi.transport.grpc_tunnels.[].destination") | Dictionary | | | | | - | [          address](## "management_api_gnmi.transport.grpc_tunnels.[].destination.address") | String | Required | | | IP address or hostname | - | [          port](## "management_api_gnmi.transport.grpc_tunnels.[].destination.port") | Integer | Required | | Min: 1
Max: 65535 | TCP Port | + | [          address](## "management_api_gnmi.transport.grpc_tunnels.[].destination.address") | String | Required | | | IP address or hostname. | + | [          port](## "management_api_gnmi.transport.grpc_tunnels.[].destination.port") | Integer | Required | | Min: 1
Max: 65535 | TCP Port. | | [        local_interface](## "management_api_gnmi.transport.grpc_tunnels.[].local_interface") | Dictionary | | | | | - | [          name](## "management_api_gnmi.transport.grpc_tunnels.[].local_interface.name") | String | Required | | | Interface name | - | [          port](## "management_api_gnmi.transport.grpc_tunnels.[].local_interface.port") | Integer | Required | | Min: 1
Max: 65535 | TCP Port | + | [          name](## "management_api_gnmi.transport.grpc_tunnels.[].local_interface.name") | String | Required | | | Interface name. | + | [          port](## "management_api_gnmi.transport.grpc_tunnels.[].local_interface.port") | Integer | Required | | Min: 1
Max: 65535 | TCP Port. | | [        target](## "management_api_gnmi.transport.grpc_tunnels.[].target") | Dictionary | | | | | - | [          use_serial_number](## "management_api_gnmi.transport.grpc_tunnels.[].target.use_serial_number") | Boolean | | | | Use serial number as the Target ID | + | [          use_serial_number](## "management_api_gnmi.transport.grpc_tunnels.[].target.use_serial_number") | Boolean | | | | Use serial number as the Target ID. | | [          target_ids](## "management_api_gnmi.transport.grpc_tunnels.[].target.target_ids") | List, items: String | | | | Target IDs as a list.
| | [            - <str>](## "management_api_gnmi.transport.grpc_tunnels.[].target.target_ids.[]") | String | | | | | | [  enable_vrfs](## "management_api_gnmi.enable_vrfs") deprecated | List, items: Dictionary | | | | These should not be mixed with the new keys above.
This key is deprecated. Support will be removed in AVD version 5.0.0. Use transport.grpc instead. | - | [    - name](## "management_api_gnmi.enable_vrfs.[].name") | String | Required, Unique | | | VRF name | - | [      access_group](## "management_api_gnmi.enable_vrfs.[].access_group") | String | | | | Standard IPv4 ACL name | + | [    - name](## "management_api_gnmi.enable_vrfs.[].name") | String | Required, Unique | | | VRF name. | + | [      access_group](## "management_api_gnmi.enable_vrfs.[].access_group") | String | | | | Standard IPv4 ACL name. | | [  octa](## "management_api_gnmi.octa") deprecated | Dictionary | | | | These should not be mixed with the new keys above.
Octa activates `eos-native` provider and it is the only provider currently supported by EOS.
This key is deprecated. Support will be removed in AVD version 5.0.0. Use provider instead. | === "YAML" @@ -46,13 +46,13 @@ transport: grpc: - # Transport name + # Transport name. - name: - # SSL profile name + # SSL profile name. ssl_profile: - # VRF name is optional + # VRF name is optional. vrf: # Per the gNMI specification, the default timestamp field of a notification message is set to be @@ -61,7 +61,7 @@ # an option to support overriding the timestamp field to the send-time is available from EOS 4.27.0F. notification_timestamp: - # ACL name + # ACL name. ip_access_group: # GNMI port. @@ -69,37 +69,37 @@ port: grpc_tunnels: - # Transport name + # Transport name. - name: - # Operational status of the gRPC tunnel + # Operational status of the gRPC tunnel. shutdown: - # Tunnel SSL profile name + # Tunnel SSL profile name. tunnel_ssl_profile: - # gNMI SSL profile name + # gNMI SSL profile name. gnmi_ssl_profile: - # VRF name + # VRF name. vrf: destination: - # IP address or hostname + # IP address or hostname. address: - # TCP Port + # TCP Port. port: local_interface: - # Interface name + # Interface name. name: - # TCP Port + # TCP Port. port: target: - # Use serial number as the Target ID + # Use serial number as the Target ID. use_serial_number: # Target IDs as a list. @@ -112,10 +112,10 @@ # Use transport.grpc instead. enable_vrfs: - # VRF name + # VRF name. - name: - # Standard IPv4 ACL name + # Standard IPv4 ACL name. access_group: # These should not be mixed with the new keys above. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/management-api-http.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/management-api-http.md index a3815a6530f..c6273831a96 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/management-api-http.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/management-api-http.md @@ -10,15 +10,15 @@ | [management_api_http](## "management_api_http") | Dictionary | | | | | | [  enable_http](## "management_api_http.enable_http") | Boolean | | | | | | [  enable_https](## "management_api_http.enable_https") | Boolean | | | | | - | [  https_ssl_profile](## "management_api_http.https_ssl_profile") | String | | | | SSL Profile Name | - | [  default_services](## "management_api_http.default_services") | Boolean | | | | Enable default services: capi-doc and tapagg | + | [  https_ssl_profile](## "management_api_http.https_ssl_profile") | String | | | | SSL Profile Name. | + | [  default_services](## "management_api_http.default_services") | Boolean | | | | Enable default services: capi-doc and tapagg. | | [  enable_vrfs](## "management_api_http.enable_vrfs") | List, items: Dictionary | | | | | - | [    - name](## "management_api_http.enable_vrfs.[].name") | String | Required, Unique | | | VRF Name | - | [      access_group](## "management_api_http.enable_vrfs.[].access_group") | String | | | | Standard IPv4 ACL name | - | [      ipv6_access_group](## "management_api_http.enable_vrfs.[].ipv6_access_group") | String | | | | Standard IPv6 ACL name | + | [    - name](## "management_api_http.enable_vrfs.[].name") | String | Required, Unique | | | VRF Name. | + | [      access_group](## "management_api_http.enable_vrfs.[].access_group") | String | | | | Standard IPv4 ACL name. | + | [      ipv6_access_group](## "management_api_http.enable_vrfs.[].ipv6_access_group") | String | | | | Standard IPv6 ACL name. | | [  protocol_https_certificate](## "management_api_http.protocol_https_certificate") | Dictionary | | | | | - | [    certificate](## "management_api_http.protocol_https_certificate.certificate") | String | | | | Name of certificate; private key must also be specified | - | [    private_key](## "management_api_http.protocol_https_certificate.private_key") | String | | | | Name of private key; certificate must also be specified | + | [    certificate](## "management_api_http.protocol_https_certificate.certificate") | String | | | | Name of certificate; private key must also be specified. | + | [    private_key](## "management_api_http.protocol_https_certificate.private_key") | String | | | | Name of private key; certificate must also be specified. | === "YAML" @@ -27,26 +27,26 @@ enable_http: enable_https: - # SSL Profile Name + # SSL Profile Name. https_ssl_profile: - # Enable default services: capi-doc and tapagg + # Enable default services: capi-doc and tapagg. default_services: enable_vrfs: - # VRF Name + # VRF Name. - name: - # Standard IPv4 ACL name + # Standard IPv4 ACL name. access_group: - # Standard IPv6 ACL name + # Standard IPv6 ACL name. ipv6_access_group: protocol_https_certificate: - # Name of certificate; private key must also be specified + # Name of certificate; private key must also be specified. certificate: - # Name of private key; certificate must also be specified + # Name of private key; certificate must also be specified. private_key: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/management-cvx.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/management-cvx.md index 890328c6527..7fcba7ee464 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/management-cvx.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/management-cvx.md @@ -10,9 +10,9 @@ | [management_cvx](## "management_cvx") | Dictionary | | | | | | [  shutdown](## "management_cvx.shutdown") | Boolean | | | | | | [  server_hosts](## "management_cvx.server_hosts") | List, items: String | | | | | - | [    - <str>](## "management_cvx.server_hosts.[]") | String | | | | IP or hostname | - | [  source_interface](## "management_cvx.source_interface") | String | | | | Interface name | - | [  vrf](## "management_cvx.vrf") | String | | | | VRF Name | + | [    - <str>](## "management_cvx.server_hosts.[]") | String | | | | IP or hostname. | + | [  source_interface](## "management_cvx.source_interface") | String | | | | Interface name. | + | [  vrf](## "management_cvx.vrf") | String | | | | VRF Name. | === "YAML" @@ -21,12 +21,12 @@ shutdown: server_hosts: - # IP or hostname + # IP or hostname. - - # Interface name + # Interface name. source_interface: - # VRF Name + # VRF Name. vrf: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/management-interfaces.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/management-interfaces.md index df8cf2c2686..234664b676f 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/management-interfaces.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/management-interfaces.md @@ -8,31 +8,31 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [management_interfaces](## "management_interfaces") | List, items: Dictionary | | | | | - | [  - name](## "management_interfaces.[].name") | String | Required, Unique | | | Management Interface Name | + | [  - name](## "management_interfaces.[].name") | String | Required, Unique | | | Management Interface Name. | | [    description](## "management_interfaces.[].description") | String | | | | | | [    shutdown](## "management_interfaces.[].shutdown") | Boolean | | | | | | [    speed](## "management_interfaces.[].speed") | String | | | | Speed should be set in the format `` or `forced ` or `auto `. | | [    mtu](## "management_interfaces.[].mtu") | Integer | | | | | - | [    vrf](## "management_interfaces.[].vrf") | String | | | | VRF Name | - | [    ip_address](## "management_interfaces.[].ip_address") | String | | | | IPv4_address/Mask | + | [    vrf](## "management_interfaces.[].vrf") | String | | | | VRF Name. | + | [    ip_address](## "management_interfaces.[].ip_address") | String | | | | IPv4_address/Mask. | | [    ipv6_enable](## "management_interfaces.[].ipv6_enable") | Boolean | | | | | - | [    ipv6_address](## "management_interfaces.[].ipv6_address") | String | | | | IPv6_address/Mask | - | [    type](## "management_interfaces.[].type") | String | | `oob` | Valid Values:
- oob
- inband | For documentation purposes only | - | [    gateway](## "management_interfaces.[].gateway") | String | | | | IPv4 address of default gateway in management VRF | - | [    ipv6_gateway](## "management_interfaces.[].ipv6_gateway") | String | | | | IPv6 address of default gateway in management VRF | - | [    mac_address](## "management_interfaces.[].mac_address") | String | | | | MAC address | + | [    ipv6_address](## "management_interfaces.[].ipv6_address") | String | | | | IPv6_address/Mask. | + | [    type](## "management_interfaces.[].type") | String | | `oob` | Valid Values:
- oob
- inband | For documentation purposes only. | + | [    gateway](## "management_interfaces.[].gateway") | String | | | | IPv4 address of default gateway in management VRF. | + | [    ipv6_gateway](## "management_interfaces.[].ipv6_gateway") | String | | | | IPv6 address of default gateway in management VRF. | + | [    mac_address](## "management_interfaces.[].mac_address") | String | | | | MAC address. | | [    lldp](## "management_interfaces.[].lldp") | Dictionary | | | | | | [      transmit](## "management_interfaces.[].lldp.transmit") | Boolean | | | | | | [      receive](## "management_interfaces.[].lldp.receive") | Boolean | | | | | - | [      ztp_vlan](## "management_interfaces.[].lldp.ztp_vlan") | Integer | | | | ZTP vlan number | - | [    eos_cli](## "management_interfaces.[].eos_cli") | String | | | | Multiline EOS CLI rendered directly on the management interface in the final EOS configuration | + | [      ztp_vlan](## "management_interfaces.[].lldp.ztp_vlan") | Integer | | | | ZTP vlan number. | + | [    eos_cli](## "management_interfaces.[].eos_cli") | String | | | | Multiline EOS CLI rendered directly on the management interface in the final EOS configuration. | === "YAML" ```yaml management_interfaces: - # Management Interface Name + # Management Interface Name. - name: description: shutdown: @@ -41,34 +41,34 @@ speed: mtu: - # VRF Name + # VRF Name. vrf: - # IPv4_address/Mask + # IPv4_address/Mask. ip_address: ipv6_enable: - # IPv6_address/Mask + # IPv6_address/Mask. ipv6_address: - # For documentation purposes only + # For documentation purposes only. type: - # IPv4 address of default gateway in management VRF + # IPv4 address of default gateway in management VRF. gateway: - # IPv6 address of default gateway in management VRF + # IPv6 address of default gateway in management VRF. ipv6_gateway: - # MAC address + # MAC address. mac_address: lldp: transmit: receive: - # ZTP vlan number + # ZTP vlan number. ztp_vlan: - # Multiline EOS CLI rendered directly on the management interface in the final EOS configuration + # Multiline EOS CLI rendered directly on the management interface in the final EOS configuration. eos_cli: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/management-security.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/management-security.md index 69cb90898a1..e5114e3a8d2 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/management-security.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/management-security.md @@ -8,7 +8,12 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [management_security](## "management_security") | Dictionary | | | | | - | [  entropy_source](## "management_security.entropy_source") | String | | | | | + | [  entropy_source](## "management_security.entropy_source") deprecated | String | | | | This key is deprecated. Support will be removed in AVD version v5.0.0. Use entropy_sources instead. | + | [  entropy_sources](## "management_security.entropy_sources") | Dictionary | | | | Source of entropy. | + | [    hardware](## "management_security.entropy_sources.hardware") | Boolean | | | | Use a hardware based source. | + | [    haveged](## "management_security.entropy_sources.haveged") | Boolean | | | | Use the HAVEGE algorithm. | + | [    cpu_jitter](## "management_security.entropy_sources.cpu_jitter") | Boolean | | | | Use the Jitter RNG algorithm of a CPU based source. | + | [    hardware_exclusive](## "management_security.entropy_sources.hardware_exclusive") | Boolean | | | | Only use entropy from the hardware source. | | [  password](## "management_security.password") | Dictionary | | | | | | [    minimum_length](## "management_security.password.minimum_length") | Integer | | | Min: 1
Max: 32 | | | [    encryption_key_common](## "management_security.password.encryption_key_common") | Boolean | | | | | @@ -26,10 +31,10 @@ | [          sequential](## "management_security.password.policies.[].maximum.sequential") | Integer | | | Min: 1
Max: 65535 | | | [  ssl_profiles](## "management_security.ssl_profiles") | List, items: Dictionary | | | | | | [    - name](## "management_security.ssl_profiles.[].name") | String | | | | | - | [      tls_versions](## "management_security.ssl_profiles.[].tls_versions") | String | | | | List of allowed TLS versions as string
Examples:
- "1.0"
- "1.0 1.1"
| - | [      cipher_list](## "management_security.ssl_profiles.[].cipher_list") | String | | | | cipher_list syntax follows the openssl cipher strings format.
Colon (:) separated list of allowed ciphers as a string
| + | [      tls_versions](## "management_security.ssl_profiles.[].tls_versions") | String | | | | List of allowed TLS versions as string.
Examples:
- "1.0"
- "1.0 1.1"
| + | [      cipher_list](## "management_security.ssl_profiles.[].cipher_list") | String | | | | cipher_list syntax follows the openssl cipher strings format.
Colon (:) separated list of allowed ciphers as a string.
| | [      trust_certificate](## "management_security.ssl_profiles.[].trust_certificate") | Dictionary | | | | | - | [        certificates](## "management_security.ssl_profiles.[].trust_certificate.certificates") | List, items: String | | | | List of trust certificate names
Examples:
- test1.crt
- test2.crt
| + | [        certificates](## "management_security.ssl_profiles.[].trust_certificate.certificates") | List, items: String | | | | List of trust certificate names.
Examples:
- test1.crt
- test2.crt
| | [          - <str>](## "management_security.ssl_profiles.[].trust_certificate.certificates.[]") | String | | | | | | [        requirement](## "management_security.ssl_profiles.[].trust_certificate.requirement") | Dictionary | | | | | | [          basic_constraint_ca](## "management_security.ssl_profiles.[].trust_certificate.requirement.basic_constraint_ca") | Boolean | | | | | @@ -37,7 +42,7 @@ | [        policy_expiry_date_ignore](## "management_security.ssl_profiles.[].trust_certificate.policy_expiry_date_ignore") | Boolean | | | | | | [        system](## "management_security.ssl_profiles.[].trust_certificate.system") | Boolean | | | | Use system-supplied trust certificates.
| | [      chain_certificate](## "management_security.ssl_profiles.[].chain_certificate") | Dictionary | | | | | - | [        certificates](## "management_security.ssl_profiles.[].chain_certificate.certificates") | List, items: String | | | | List of chain certificate names
Examples:
- chain1.crt
- chain2.crt
| + | [        certificates](## "management_security.ssl_profiles.[].chain_certificate.certificates") | List, items: String | | | | List of chain certificate names.
Examples:
- chain1.crt
- chain2.crt
| | [          - <str>](## "management_security.ssl_profiles.[].chain_certificate.certificates.[]") | String | | | | | | [        requirement](## "management_security.ssl_profiles.[].chain_certificate.requirement") | Dictionary | | | | | | [          basic_constraint_ca](## "management_security.ssl_profiles.[].chain_certificate.requirement.basic_constraint_ca") | Boolean | | | | | @@ -47,12 +52,45 @@ | [        key](## "management_security.ssl_profiles.[].certificate.key") | String | | | | | | [      certificate_revocation_lists](## "management_security.ssl_profiles.[].certificate_revocation_lists") | List, items: String | | | | List of CRLs (Certificate Revocation List).
If specified, one CRL needs to be provided for every certificate in the chain, even if the revocation list in the CRL is empty.
| | [        - <str>](## "management_security.ssl_profiles.[].certificate_revocation_lists.[]") | String | | | | | + | [  shared_secret_profiles](## "management_security.shared_secret_profiles") | List, items: Dictionary | | | | | + | [    - profile](## "management_security.shared_secret_profiles.[].profile") | String | Required, Unique | | | | + | [      secrets](## "management_security.shared_secret_profiles.[].secrets") | List, items: Dictionary | | | | | + | [        - name](## "management_security.shared_secret_profiles.[].secrets.[].name") | String | Required, Unique | | | | + | [          secret](## "management_security.shared_secret_profiles.[].secrets.[].secret") | String | Required | | | | + | [          secret_type](## "management_security.shared_secret_profiles.[].secrets.[].secret_type") | String | | `7` | Valid Values:
- 0
- 7
- 8a | | + | [          receive_lifetime](## "management_security.shared_secret_profiles.[].secrets.[].receive_lifetime") | Dictionary | Required | | | | + | [            infinite](## "management_security.shared_secret_profiles.[].secrets.[].receive_lifetime.infinite") | Boolean | | | | | + | [            start_date_time](## "management_security.shared_secret_profiles.[].secrets.[].receive_lifetime.start_date_time") | String | | | | Start date and time of lifetime of the secret. End date should be greater than start date.
Formats supported:
1. mm/dd/yyyy hh:mm:ss
2. yyyy-mm-dd hh:mm:ss
e.g 2024-12-20 10:00:00 | + | [            end_date_time](## "management_security.shared_secret_profiles.[].secrets.[].receive_lifetime.end_date_time") | String | | | | End date and time of lifetime of the secret. End date should be greater than start date.
Formats supported:
1. mm/dd/yyyy hh:mm:ss
2. yyyy-mm-dd hh:mm:ss
e.g 2024-12-20 10:00:00 | + | [          transmit_lifetime](## "management_security.shared_secret_profiles.[].secrets.[].transmit_lifetime") | Dictionary | Required | | | | + | [            infinite](## "management_security.shared_secret_profiles.[].secrets.[].transmit_lifetime.infinite") | Boolean | | | | | + | [            start_date_time](## "management_security.shared_secret_profiles.[].secrets.[].transmit_lifetime.start_date_time") | String | | | | Start date and time of lifetime of the secret. End date should be greater than start date.
Formats supported:
1. mm/dd/yyyy hh:mm:ss
2. yyyy-mm-dd hh:mm:ss
e.g 2024-12-20 10:00:00 | + | [            end_date_time](## "management_security.shared_secret_profiles.[].secrets.[].transmit_lifetime.end_date_time") | String | | | | End date and time of lifetime of the secret. End date should be greater than start date.
Formats supported:
1. mm/dd/yyyy hh:mm:ss
2. yyyy-mm-dd hh:mm:ss
e.g 2024-12-20 10:00:00 | + | [          local_time](## "management_security.shared_secret_profiles.[].secrets.[].local_time") | Boolean | | | | Configuring secret using the local timezone from system clock. Default is UTC. | === "YAML" ```yaml management_security: + # This key is deprecated. + # Support will be removed in AVD version v5.0.0. + # Use entropy_sources instead. entropy_source: + + # Source of entropy. + entropy_sources: + + # Use a hardware based source. + hardware: + + # Use the HAVEGE algorithm. + haveged: + + # Use the Jitter RNG algorithm of a CPU based source. + cpu_jitter: + + # Only use entropy from the hardware source. + hardware_exclusive: password: minimum_length: encryption_key_common: @@ -71,18 +109,18 @@ ssl_profiles: - name: - # List of allowed TLS versions as string + # List of allowed TLS versions as string. # Examples: # - "1.0" # - "1.0 1.1" tls_versions: # cipher_list syntax follows the openssl cipher strings format. - # Colon (:) separated list of allowed ciphers as a string + # Colon (:) separated list of allowed ciphers as a string. cipher_list: trust_certificate: - # List of trust certificate names + # List of trust certificate names. # Examples: # - test1.crt # - test2.crt @@ -99,7 +137,7 @@ system: chain_certificate: - # List of chain certificate names + # List of chain certificate names. # Examples: # - chain1.crt # - chain2.crt @@ -116,4 +154,45 @@ # If specified, one CRL needs to be provided for every certificate in the chain, even if the revocation list in the CRL is empty. certificate_revocation_lists: - + shared_secret_profiles: + - profile: + secrets: + - name: + secret: + secret_type: + receive_lifetime: # required + infinite: + + # Start date and time of lifetime of the secret. End date should be greater than start date. + # Formats supported: + # 1. mm/dd/yyyy hh:mm:ss + # 2. yyyy-mm-dd hh:mm:ss + # e.g 2024-12-20 10:00:00 + start_date_time: + + # End date and time of lifetime of the secret. End date should be greater than start date. + # Formats supported: + # 1. mm/dd/yyyy hh:mm:ss + # 2. yyyy-mm-dd hh:mm:ss + # e.g 2024-12-20 10:00:00 + end_date_time: + transmit_lifetime: # required + infinite: + + # Start date and time of lifetime of the secret. End date should be greater than start date. + # Formats supported: + # 1. mm/dd/yyyy hh:mm:ss + # 2. yyyy-mm-dd hh:mm:ss + # e.g 2024-12-20 10:00:00 + start_date_time: + + # End date and time of lifetime of the secret. End date should be greater than start date. + # Formats supported: + # 1. mm/dd/yyyy hh:mm:ss + # 2. yyyy-mm-dd hh:mm:ss + # e.g 2024-12-20 10:00:00 + end_date_time: + + # Configuring secret using the local timezone from system clock. Default is UTC. + local_time: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/management-ssh.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/management-ssh.md index ae1daf36662..1b612e87e6f 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/management-ssh.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/management-ssh.md @@ -9,17 +9,17 @@ | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [management_ssh](## "management_ssh") | Dictionary | | | | | | [  access_groups](## "management_ssh.access_groups") | List, items: Dictionary | | | | | - | [    - name](## "management_ssh.access_groups.[].name") | String | | | | Standard ACL Name | - | [      vrf](## "management_ssh.access_groups.[].vrf") | String | | | | VRF Name | + | [    - name](## "management_ssh.access_groups.[].name") | String | | | | Standard ACL Name. | + | [      vrf](## "management_ssh.access_groups.[].vrf") | String | | | | VRF Name. | | [  ipv6_access_groups](## "management_ssh.ipv6_access_groups") | List, items: Dictionary | | | | | - | [    - name](## "management_ssh.ipv6_access_groups.[].name") | String | | | | Standard ACL Name | - | [      vrf](## "management_ssh.ipv6_access_groups.[].vrf") | String | | | | VRF Name | - | [  idle_timeout](## "management_ssh.idle_timeout") | Integer | | | Min: 0
Max: 86400 | Idle timeout in minutes | - | [  cipher](## "management_ssh.cipher") | List, items: String | | | | Cryptographic ciphers for SSH to use | + | [    - name](## "management_ssh.ipv6_access_groups.[].name") | String | | | | Standard ACL Name. | + | [      vrf](## "management_ssh.ipv6_access_groups.[].vrf") | String | | | | VRF Name. | + | [  idle_timeout](## "management_ssh.idle_timeout") | Integer | | | Min: 0
Max: 86400 | Idle timeout in minutes. | + | [  cipher](## "management_ssh.cipher") | List, items: String | | | | Cryptographic ciphers for SSH to use. | | [    - <str>](## "management_ssh.cipher.[]") | String | | | | | - | [  key_exchange](## "management_ssh.key_exchange") | List, items: String | | | | Cryptographic key exchange methods for SSH to use | + | [  key_exchange](## "management_ssh.key_exchange") | List, items: String | | | | Cryptographic key exchange methods for SSH to use. | | [    - <str>](## "management_ssh.key_exchange.[]") | String | | | | | - | [  mac](## "management_ssh.mac") | List, items: String | | | | Cryptographic MAC algorithms for SSH to use | + | [  mac](## "management_ssh.mac") | List, items: String | | | | Cryptographic MAC algorithms for SSH to use. | | [    - <str>](## "management_ssh.mac.[]") | String | | | | | | [  fips_restrictions](## "management_ssh.fips_restrictions") | Boolean | | | | Use FIPS compliant algorithms. | | [  hostkey](## "management_ssh.hostkey") | Dictionary | | | | | @@ -27,14 +27,14 @@ | [      - <str>](## "management_ssh.hostkey.server.[]") | String | | | | | | [    server_cert](## "management_ssh.hostkey.server_cert") | String | | | | Configure switch's hostkey cert file. | | [    client_strict_checking](## "management_ssh.hostkey.client_strict_checking") | Boolean | | | | Enforce strict host key checking. | - | [  enable](## "management_ssh.enable") | Boolean | | | | Enable SSH daemon | + | [  enable](## "management_ssh.enable") | Boolean | | | | Enable SSH daemon. | | [  connection](## "management_ssh.connection") | Dictionary | | | | | - | [    limit](## "management_ssh.connection.limit") | Integer | | | Min: 1
Max: 100 | Maximum total number of SSH sessions to device | - | [    per_host](## "management_ssh.connection.per_host") | Integer | | | Min: 1
Max: 20 | Maximum number of SSH sessions to device from a single host | + | [    limit](## "management_ssh.connection.limit") | Integer | | | Min: 1
Max: 100 | Maximum total number of SSH sessions to device. | + | [    per_host](## "management_ssh.connection.per_host") | Integer | | | Min: 1
Max: 20 | Maximum number of SSH sessions to device from a single host. | | [  vrfs](## "management_ssh.vrfs") | List, items: Dictionary | | | | | - | [    - name](## "management_ssh.vrfs.[].name") | String | Required, Unique | | | VRF Name | - | [      enable](## "management_ssh.vrfs.[].enable") | Boolean | | | | Enable SSH in VRF | - | [  log_level](## "management_ssh.log_level") | String | | | | SSH daemon log level | + | [    - name](## "management_ssh.vrfs.[].name") | String | Required, Unique | | | VRF Name. | + | [      enable](## "management_ssh.vrfs.[].enable") | Boolean | | | | Enable SSH in VRF. | + | [  log_level](## "management_ssh.log_level") | String | | | | SSH daemon log level. | | [  client_alive](## "management_ssh.client_alive") | Dictionary | | | | | | [    count_max](## "management_ssh.client_alive.count_max") | Integer | | | Min: 1
Max: 1000 | Number of keep-alive packets that can be sent without a response before the connection is assumed dead. | | [    interval](## "management_ssh.client_alive.interval") | Integer | | | Min: 1
Max: 1000 | Time period (in seconds) to send SSH keep-alive packets. | @@ -45,31 +45,31 @@ management_ssh: access_groups: - # Standard ACL Name + # Standard ACL Name. - name: - # VRF Name + # VRF Name. vrf: ipv6_access_groups: - # Standard ACL Name + # Standard ACL Name. - name: - # VRF Name + # VRF Name. vrf: - # Idle timeout in minutes + # Idle timeout in minutes. idle_timeout: - # Cryptographic ciphers for SSH to use + # Cryptographic ciphers for SSH to use. cipher: - - # Cryptographic key exchange methods for SSH to use + # Cryptographic key exchange methods for SSH to use. key_exchange: - - # Cryptographic MAC algorithms for SSH to use + # Cryptographic MAC algorithms for SSH to use. mac: - @@ -87,24 +87,24 @@ # Enforce strict host key checking. client_strict_checking: - # Enable SSH daemon + # Enable SSH daemon. enable: connection: - # Maximum total number of SSH sessions to device + # Maximum total number of SSH sessions to device. limit: - # Maximum number of SSH sessions to device from a single host + # Maximum number of SSH sessions to device from a single host. per_host: vrfs: - # VRF Name + # VRF Name. - name: - # Enable SSH in VRF + # Enable SSH in VRF. enable: - # SSH daemon log level + # SSH daemon log level. log_level: client_alive: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/management-tech-support.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/management-tech-support.md index 08e3769d149..bfc2a77a508 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/management-tech-support.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/management-tech-support.md @@ -10,10 +10,10 @@ | [management_tech_support](## "management_tech_support") | Dictionary | | | | | | [  policy_show_tech_support](## "management_tech_support.policy_show_tech_support") | Dictionary | | | | | | [    exclude_commands](## "management_tech_support.policy_show_tech_support.exclude_commands") | List, items: Dictionary | | | | | - | [      - command](## "management_tech_support.policy_show_tech_support.exclude_commands.[].command") | String | | | | Command to exclude from tech-support | + | [      - command](## "management_tech_support.policy_show_tech_support.exclude_commands.[].command") | String | | | | Command to exclude from tech-support. | | [        type](## "management_tech_support.policy_show_tech_support.exclude_commands.[].type") | String | | `text` | Valid Values:
- text
- json | The supported values for type are platform dependent. | | [    include_commands](## "management_tech_support.policy_show_tech_support.include_commands") | List, items: Dictionary | | | | | - | [      - command](## "management_tech_support.policy_show_tech_support.include_commands.[].command") | String | | | | Command to include in tech-support | + | [      - command](## "management_tech_support.policy_show_tech_support.include_commands.[].command") | String | | | | Command to include in tech-support. | === "YAML" @@ -22,13 +22,13 @@ policy_show_tech_support: exclude_commands: - # Command to exclude from tech-support + # Command to exclude from tech-support. - command: # The supported values for type are platform dependent. type: include_commands: - # Command to include in tech-support + # Command to include in tech-support. - command: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/match-list-input.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/match-list-input.md index ba53b9aa847..dfba89390fb 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/match-list-input.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/match-list-input.md @@ -17,10 +17,10 @@ | [      prefixes](## "match_list_input.prefix_ipv6.[].prefixes") | List, items: String | Required | | Min Length: 1 | List of IPv6 prefixes (with the subnet mask e.g. 2001:db8:abcd:0013::/64). | | [        - <str>](## "match_list_input.prefix_ipv6.[].prefixes.[]") | String | | | | | | [  string](## "match_list_input.string") | List, items: Dictionary | | | | | - | [    - name](## "match_list_input.string.[].name") | String | Required, Unique | | | Match-list Name | + | [    - name](## "match_list_input.string.[].name") | String | Required, Unique | | | Match-list Name. | | [      sequence_numbers](## "match_list_input.string.[].sequence_numbers") | List, items: Dictionary | Required | | | | - | [        - sequence](## "match_list_input.string.[].sequence_numbers.[].sequence") | Integer | Required, Unique | | | Sequence ID | - | [          match_regex](## "match_list_input.string.[].sequence_numbers.[].match_regex") | String | Required | | | Regular Expression | + | [        - sequence](## "match_list_input.string.[].sequence_numbers.[].sequence") | Integer | Required, Unique | | | Sequence ID. | + | [          match_regex](## "match_list_input.string.[].sequence_numbers.[].match_regex") | String | Required | | | Regular Expression. | === "YAML" @@ -44,13 +44,13 @@ - string: - # Match-list Name + # Match-list Name. - name: sequence_numbers: # required - # Sequence ID + # Sequence ID. - sequence: - # Regular Expression + # Regular Expression. match_regex: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/mcs-client.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/mcs-client.md index 6b3483f14b4..b15ae03e69d 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/mcs-client.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/mcs-client.md @@ -13,7 +13,7 @@ | [    name](## "mcs_client.cvx_secondary.name") | String | | | | | | [    shutdown](## "mcs_client.cvx_secondary.shutdown") | Boolean | | | | | | [    server_hosts](## "mcs_client.cvx_secondary.server_hosts") | List, items: String | | | | | - | [      - <str>](## "mcs_client.cvx_secondary.server_hosts.[]") | String | | | | IP or hostname | + | [      - <str>](## "mcs_client.cvx_secondary.server_hosts.[]") | String | | | | IP or hostname. | === "YAML" @@ -25,6 +25,6 @@ shutdown: server_hosts: - # IP or hostname + # IP or hostname. - ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/metadata.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/metadata.md index 85296e54980..c97504314ab 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/metadata.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/metadata.md @@ -19,15 +19,16 @@ | [        tags](## "metadata.cv_tags.interface_tags.[].tags") | List, items: Dictionary | | | | | | [          - name](## "metadata.cv_tags.interface_tags.[].tags.[].name") | String | Required | | | | | [            value](## "metadata.cv_tags.interface_tags.[].tags.[].value") | String | Required | | | | - | [  cv_pathfinder](## "metadata.cv_pathfinder") | Dictionary | | | | Metadata used for CV Pathfinder visualization on CloudVision | + | [  cv_pathfinder](## "metadata.cv_pathfinder") | Dictionary | | | | Metadata used for CV Pathfinder visualization on CloudVision. | | [    role](## "metadata.cv_pathfinder.role") | String | | | | | | [    region](## "metadata.cv_pathfinder.region") | String | | | | | | [    zone](## "metadata.cv_pathfinder.zone") | String | | | | | | [    site](## "metadata.cv_pathfinder.site") | String | | | | | | [    vtep_ip](## "metadata.cv_pathfinder.vtep_ip") | String | | | | | | [    ssl_profile](## "metadata.cv_pathfinder.ssl_profile") | String | | | | | + | [    address](## "metadata.cv_pathfinder.address") | String | | | | | | [    pathfinders](## "metadata.cv_pathfinder.pathfinders") | List, items: Dictionary | | | | | - | [      - vtep_ip](## "metadata.cv_pathfinder.pathfinders.[].vtep_ip") | String | | | | | + | [      - vtep_ip](## "metadata.cv_pathfinder.pathfinders.[].vtep_ip") | String | Required | | | | | [    interfaces](## "metadata.cv_pathfinder.interfaces") | List, items: Dictionary | | | | | | [      - name](## "metadata.cv_pathfinder.interfaces.[].name") | String | | | | | | [        carrier](## "metadata.cv_pathfinder.interfaces.[].carrier") | String | | | | | @@ -35,7 +36,7 @@ | [        pathgroup](## "metadata.cv_pathfinder.interfaces.[].pathgroup") | String | | | | | | [        public_ip](## "metadata.cv_pathfinder.interfaces.[].public_ip") | String | | | | | | [    pathgroups](## "metadata.cv_pathfinder.pathgroups") | List, items: Dictionary | | | | | - | [      - name](## "metadata.cv_pathfinder.pathgroups.[].name") | String | | | | | + | [      - name](## "metadata.cv_pathfinder.pathgroups.[].name") | String | Required | | | | | [        carriers](## "metadata.cv_pathfinder.pathgroups.[].carriers") | List, items: Dictionary | | | | | | [          - name](## "metadata.cv_pathfinder.pathgroups.[].carriers.[].name") | String | | | | | | [        imported_carriers](## "metadata.cv_pathfinder.pathgroups.[].imported_carriers") | List, items: Dictionary | | | | | @@ -65,6 +66,23 @@ | [            pathgroups](## "metadata.cv_pathfinder.vrfs.[].avts.[].pathgroups") | List, items: Dictionary | | | | | | [              - name](## "metadata.cv_pathfinder.vrfs.[].avts.[].pathgroups.[].name") | String | | | | | | [                preference](## "metadata.cv_pathfinder.vrfs.[].avts.[].pathgroups.[].preference") | String | | | | | + | [    internet_exit_policies](## "metadata.cv_pathfinder.internet_exit_policies") | List, items: Dictionary | | | | | + | [      - name](## "metadata.cv_pathfinder.internet_exit_policies.[].name") | String | Required | | | | + | [        type](## "metadata.cv_pathfinder.internet_exit_policies.[].type") | String | Required | | | | + | [        city](## "metadata.cv_pathfinder.internet_exit_policies.[].city") | String | Required | | | | + | [        country](## "metadata.cv_pathfinder.internet_exit_policies.[].country") | String | Required | | | | + | [        upload_bandwidth](## "metadata.cv_pathfinder.internet_exit_policies.[].upload_bandwidth") | Integer | | | | | + | [        download_bandwidth](## "metadata.cv_pathfinder.internet_exit_policies.[].download_bandwidth") | Integer | | | | | + | [        firewall](## "metadata.cv_pathfinder.internet_exit_policies.[].firewall") | Boolean | Required | | | | + | [        ips_control](## "metadata.cv_pathfinder.internet_exit_policies.[].ips_control") | Boolean | Required | | | | + | [        acceptable_use_policy](## "metadata.cv_pathfinder.internet_exit_policies.[].acceptable_use_policy") | Boolean | Required | | | | + | [        vpn_credentials](## "metadata.cv_pathfinder.internet_exit_policies.[].vpn_credentials") | List, items: Dictionary | Required | | | | + | [          - fqdn](## "metadata.cv_pathfinder.internet_exit_policies.[].vpn_credentials.[].fqdn") | String | Required | | | | + | [            vpn_type](## "metadata.cv_pathfinder.internet_exit_policies.[].vpn_credentials.[].vpn_type") | String | Required | | | | + | [            pre_shared_key](## "metadata.cv_pathfinder.internet_exit_policies.[].vpn_credentials.[].pre_shared_key") | String | Required | | | | + | [        tunnels](## "metadata.cv_pathfinder.internet_exit_policies.[].tunnels") | List, items: Dictionary | Required | | | | + | [          - name](## "metadata.cv_pathfinder.internet_exit_policies.[].tunnels.[].name") | String | Required | | | | + | [            preference](## "metadata.cv_pathfinder.internet_exit_policies.[].tunnels.[].preference") | String | Required | | | | === "YAML" @@ -84,7 +102,7 @@ - name: value: - # Metadata used for CV Pathfinder visualization on CloudVision + # Metadata used for CV Pathfinder visualization on CloudVision. cv_pathfinder: role: region: @@ -92,8 +110,9 @@ site: vtep_ip: ssl_profile: + address: pathfinders: - - vtep_ip: + - vtep_ip: interfaces: - name: carrier: @@ -101,7 +120,7 @@ pathgroup: public_ip: pathgroups: - - name: + - name: carriers: - name: imported_carriers: @@ -131,4 +150,21 @@ pathgroups: - name: preference: + internet_exit_policies: + - name: + type: + city: + country: + upload_bandwidth: + download_bandwidth: + firewall: + ips_control: + acceptable_use_policy: + vpn_credentials: # required + - fqdn: + vpn_type: + pre_shared_key: + tunnels: # required + - name: + preference: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/mlag-configuration.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/mlag-configuration.md index 0a69f5d07c9..327551db035 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/mlag-configuration.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/mlag-configuration.md @@ -9,18 +9,18 @@ | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [mlag_configuration](## "mlag_configuration") | Dictionary | | | | | | [  domain_id](## "mlag_configuration.domain_id") | String | | | | | - | [  heartbeat_interval](## "mlag_configuration.heartbeat_interval") | Integer | | | | Heartbeat interval in milliseconds | - | [  local_interface](## "mlag_configuration.local_interface") | String | | | | Local Interface Name | - | [  peer_address](## "mlag_configuration.peer_address") | String | | | | IPv4 Address | + | [  heartbeat_interval](## "mlag_configuration.heartbeat_interval") | Integer | | | | Heartbeat interval in milliseconds. | + | [  local_interface](## "mlag_configuration.local_interface") | String | | | | Local Interface Name. | + | [  peer_address](## "mlag_configuration.peer_address") | String | | | | IPv4 or IPv6 Address. | | [  peer_address_heartbeat](## "mlag_configuration.peer_address_heartbeat") | Dictionary | | | | | - | [    peer_ip](## "mlag_configuration.peer_address_heartbeat.peer_ip") | String | | | | IPv4 Address | - | [    vrf](## "mlag_configuration.peer_address_heartbeat.vrf") | String | | | | VRF Name | - | [  dual_primary_detection_delay](## "mlag_configuration.dual_primary_detection_delay") | Integer | | | Min: 0
Max: 86400 | Delay in seconds | - | [  dual_primary_recovery_delay_mlag](## "mlag_configuration.dual_primary_recovery_delay_mlag") | Integer | | | Min: 0
Max: 86400 | Delay in seconds | - | [  dual_primary_recovery_delay_non_mlag](## "mlag_configuration.dual_primary_recovery_delay_non_mlag") | Integer | | | Min: 0
Max: 86400 | Delay in seconds | - | [  peer_link](## "mlag_configuration.peer_link") | String | | | | Port-Channel interface name | - | [  reload_delay_mlag](## "mlag_configuration.reload_delay_mlag") | String | | | | Delay in seconds <0-86400> or 'infinity' | - | [  reload_delay_non_mlag](## "mlag_configuration.reload_delay_non_mlag") | String | | | | Delay in seconds <0-86400> or 'infinity' | + | [    peer_ip](## "mlag_configuration.peer_address_heartbeat.peer_ip") | String | | | | IPv4 or IPv6 Address. | + | [    vrf](## "mlag_configuration.peer_address_heartbeat.vrf") | String | | | | VRF Name. | + | [  dual_primary_detection_delay](## "mlag_configuration.dual_primary_detection_delay") | Integer | | | Min: 0
Max: 86400 | Delay in seconds. | + | [  dual_primary_recovery_delay_mlag](## "mlag_configuration.dual_primary_recovery_delay_mlag") | Integer | | | Min: 0
Max: 86400 | Delay in seconds. | + | [  dual_primary_recovery_delay_non_mlag](## "mlag_configuration.dual_primary_recovery_delay_non_mlag") | Integer | | | Min: 0
Max: 86400 | Delay in seconds. | + | [  peer_link](## "mlag_configuration.peer_link") | String | | | | Port-Channel interface name. | + | [  reload_delay_mlag](## "mlag_configuration.reload_delay_mlag") | String | | | | Delay in seconds <0-86400> or 'infinity'. | + | [  reload_delay_non_mlag](## "mlag_configuration.reload_delay_non_mlag") | String | | | | Delay in seconds <0-86400> or 'infinity'. | === "YAML" @@ -28,37 +28,37 @@ mlag_configuration: domain_id: - # Heartbeat interval in milliseconds + # Heartbeat interval in milliseconds. heartbeat_interval: - # Local Interface Name + # Local Interface Name. local_interface: - # IPv4 Address + # IPv4 or IPv6 Address. peer_address: peer_address_heartbeat: - # IPv4 Address + # IPv4 or IPv6 Address. peer_ip: - # VRF Name + # VRF Name. vrf: - # Delay in seconds + # Delay in seconds. dual_primary_detection_delay: - # Delay in seconds + # Delay in seconds. dual_primary_recovery_delay_mlag: - # Delay in seconds + # Delay in seconds. dual_primary_recovery_delay_non_mlag: - # Port-Channel interface name + # Port-Channel interface name. peer_link: - # Delay in seconds <0-86400> or 'infinity' + # Delay in seconds <0-86400> or 'infinity'. reload_delay_mlag: - # Delay in seconds <0-86400> or 'infinity' + # Delay in seconds <0-86400> or 'infinity'. reload_delay_non_mlag: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/monitor-connectivity.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/monitor-connectivity.md index 792088a0664..b0071a7652d 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/monitor-connectivity.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/monitor-connectivity.md @@ -12,26 +12,30 @@ | [  interval](## "monitor_connectivity.interval") | Integer | | | | | | [  interface_sets](## "monitor_connectivity.interface_sets") | List, items: Dictionary | | | | | | [    - name](## "monitor_connectivity.interface_sets.[].name") | String | | | | | - | [      interfaces](## "monitor_connectivity.interface_sets.[].interfaces") | String | | | | Interface range(s) should be of same type, Ethernet, Loopback, Management etc.
Multiple interface ranges can be specified separated by ","
| + | [      interfaces](## "monitor_connectivity.interface_sets.[].interfaces") | String | | | | Interface range(s) should be of same type, Ethernet, Loopback, Management etc.
Multiple interface ranges can be specified separated by ",".
| | [  local_interfaces](## "monitor_connectivity.local_interfaces") | String | | | | | + | [  address_only](## "monitor_connectivity.address_only") | Boolean | | `True` | | PREVIEW: This key is in preview.
When address-only is configured, the source IP of the packet is set to the interface
IP but the packet may exit the device via a different interface.
When set to `false`, the probe uses the interface to exit the device.
Not supported yet in EOS. | | [  hosts](## "monitor_connectivity.hosts") | List, items: Dictionary | | | | | - | [    - name](## "monitor_connectivity.hosts.[].name") | String | | | | Host Name | + | [    - name](## "monitor_connectivity.hosts.[].name") | String | | | | Host Name. | | [      description](## "monitor_connectivity.hosts.[].description") | String | | | | | | [      ip](## "monitor_connectivity.hosts.[].ip") | String | | | | | | [      local_interfaces](## "monitor_connectivity.hosts.[].local_interfaces") | String | | | | | + | [      address_only](## "monitor_connectivity.hosts.[].address_only") | Boolean | | `True` | | PREVIEW: This key is in preview.
When address-only is configured, the source IP of the packet is set to the interface
IP but the packet may exit the device via a different interface.
When set to `false`, the probe uses the interface to exit the device.
Not supported yet in EOS. | | [      url](## "monitor_connectivity.hosts.[].url") | String | | | | | | [  vrfs](## "monitor_connectivity.vrfs") | List, items: Dictionary | | | | | - | [    - name](## "monitor_connectivity.vrfs.[].name") | String | Required, Unique | | | VRF Name | + | [    - name](## "monitor_connectivity.vrfs.[].name") | String | Required, Unique | | | VRF Name. | | [      description](## "monitor_connectivity.vrfs.[].description") | String | | | | | | [      interface_sets](## "monitor_connectivity.vrfs.[].interface_sets") | List, items: Dictionary | | | | | | [        - name](## "monitor_connectivity.vrfs.[].interface_sets.[].name") | String | | | | | | [          interfaces](## "monitor_connectivity.vrfs.[].interface_sets.[].interfaces") | String | | | | | | [      local_interfaces](## "monitor_connectivity.vrfs.[].local_interfaces") | String | | | | | + | [      address_only](## "monitor_connectivity.vrfs.[].address_only") | Boolean | | `True` | | PREVIEW: This key is in preview.
When address-only is configured, the source IP of the packet is set to the interface
IP but the packet may exit the device via a different interface.
When set to `false`, the probe uses the interface to exit the device.
Not supported yet in EOS. | | [      hosts](## "monitor_connectivity.vrfs.[].hosts") | List, items: Dictionary | | | | | - | [        - name](## "monitor_connectivity.vrfs.[].hosts.[].name") | String | | | | Host name | + | [        - name](## "monitor_connectivity.vrfs.[].hosts.[].name") | String | | | | Host name. | | [          description](## "monitor_connectivity.vrfs.[].hosts.[].description") | String | | | | | | [          ip](## "monitor_connectivity.vrfs.[].hosts.[].ip") | String | | | | | | [          local_interfaces](## "monitor_connectivity.vrfs.[].hosts.[].local_interfaces") | String | | | | | + | [          address_only](## "monitor_connectivity.vrfs.[].hosts.[].address_only") | Boolean | | `True` | | PREVIEW: This key is in preview.
When address-only is configured, the source IP of the packet is set to the interface
IP but the packet may exit the device via a different interface.
When set to `false`, the probe uses the interface to exit the device.
Not supported yet in EOS. | | [          url](## "monitor_connectivity.vrfs.[].hosts.[].url") | String | | | | | === "YAML" @@ -44,32 +48,60 @@ - name: # Interface range(s) should be of same type, Ethernet, Loopback, Management etc. - # Multiple interface ranges can be specified separated by "," + # Multiple interface ranges can be specified separated by ",". interfaces: local_interfaces: + + # PREVIEW: This key is in preview. + # When address-only is configured, the source IP of the packet is set to the interface + # IP but the packet may exit the device via a different interface. + # When set to `false`, the probe uses the interface to exit the device. + # Not supported yet in EOS. + address_only: hosts: - # Host Name + # Host Name. - name: description: ip: local_interfaces: + + # PREVIEW: This key is in preview. + # When address-only is configured, the source IP of the packet is set to the interface + # IP but the packet may exit the device via a different interface. + # When set to `false`, the probe uses the interface to exit the device. + # Not supported yet in EOS. + address_only: url: vrfs: - # VRF Name + # VRF Name. - name: description: interface_sets: - name: interfaces: local_interfaces: + + # PREVIEW: This key is in preview. + # When address-only is configured, the source IP of the packet is set to the interface + # IP but the packet may exit the device via a different interface. + # When set to `false`, the probe uses the interface to exit the device. + # Not supported yet in EOS. + address_only: hosts: - # Host name + # Host name. - name: description: ip: local_interfaces: + + # PREVIEW: This key is in preview. + # When address-only is configured, the source IP of the packet is set to the interface + # IP but the packet may exit the device via a different interface. + # When set to `false`, the probe uses the interface to exit the device. + # Not supported yet in EOS. + address_only: url: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/monitor-layer1.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/monitor-layer1.md index 7d4278b0a08..6383ae880bf 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/monitor-layer1.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/monitor-layer1.md @@ -8,11 +8,12 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [monitor_layer1](## "monitor_layer1") | Dictionary | | | | Enable SYSLOG messages on transceiver SMBus communication failures. | - | [  enabled](## "monitor_layer1.enabled") | Boolean | Required | | | Enable monitor layer1 | + | [  enabled](## "monitor_layer1.enabled") | Boolean | Required | | | Enable monitor layer1. | | [  logging_mac_fault](## "monitor_layer1.logging_mac_fault") | Boolean | | | | Enable MAC fault logging. | | [  logging_transceiver](## "monitor_layer1.logging_transceiver") | Dictionary | | | | Configure transceiver monitoring logging. | | [    dom](## "monitor_layer1.logging_transceiver.dom") | Boolean | | | | Enable transceiver Digital Optical Monitoring (DOM) logging. | | [    communication](## "monitor_layer1.logging_transceiver.communication") | Boolean | | | | Enable transceiver SMBus fail and reset logging. | + | [    enabled](## "monitor_layer1.logging_transceiver.enabled") | Boolean | | | | Some platforms support only the `logging transceiver` command. `enabled` key configures this command. | === "YAML" @@ -20,7 +21,7 @@ # Enable SYSLOG messages on transceiver SMBus communication failures. monitor_layer1: - # Enable monitor layer1 + # Enable monitor layer1. enabled: # Enable MAC fault logging. @@ -34,4 +35,7 @@ # Enable transceiver SMBus fail and reset logging. communication: + + # Some platforms support only the `logging transceiver` command. `enabled` key configures this command. + enabled: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/monitor-sessions.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/monitor-sessions.md index e3801496fdb..01ed2b31bec 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/monitor-sessions.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/monitor-sessions.md @@ -8,58 +8,58 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [monitor_sessions](## "monitor_sessions") | List, items: Dictionary | | | | | - | [  - name](## "monitor_sessions.[].name") | String | Required | | | Session Name | + | [  - name](## "monitor_sessions.[].name") | String | Required | | | Session Name. | | [    sources](## "monitor_sessions.[].sources") | List, items: Dictionary | | | | | - | [      - name](## "monitor_sessions.[].sources.[].name") | String | | | | Interface name, range or comma separated list | + | [      - name](## "monitor_sessions.[].sources.[].name") | String | | | | Interface name, range or comma separated list. | | [        direction](## "monitor_sessions.[].sources.[].direction") | String | | | Valid Values:
- rx
- tx
- both | | | [        access_group](## "monitor_sessions.[].sources.[].access_group") | Dictionary | | | | | | [          type](## "monitor_sessions.[].sources.[].access_group.type") | String | | | Valid Values:
- ip
- ipv6
- mac | | - | [          name](## "monitor_sessions.[].sources.[].access_group.name") | String | | | | ACL Name | + | [          name](## "monitor_sessions.[].sources.[].access_group.name") | String | | | | ACL Name. | | [          priority](## "monitor_sessions.[].sources.[].access_group.priority") | Integer | | | | | | [    destinations](## "monitor_sessions.[].destinations") | List, items: String | | | | | - | [      - <str>](## "monitor_sessions.[].destinations.[]") | String | | | | 'cpu' or interface name, range or comma separated list | + | [      - <str>](## "monitor_sessions.[].destinations.[]") | String | | | | 'cpu' or interface name, range or comma separated list. | | [    encapsulation_gre_metadata_tx](## "monitor_sessions.[].encapsulation_gre_metadata_tx") | Boolean | | | | | - | [    header_remove_size](## "monitor_sessions.[].header_remove_size") | Integer | | | | Number of bytes to remove from header | + | [    header_remove_size](## "monitor_sessions.[].header_remove_size") | Integer | | | | Number of bytes to remove from header. | | [    access_group](## "monitor_sessions.[].access_group") | Dictionary | | | | | | [      type](## "monitor_sessions.[].access_group.type") | String | | | Valid Values:
- ip
- ipv6
- mac | | - | [      name](## "monitor_sessions.[].access_group.name") | String | | | | ACL Name | + | [      name](## "monitor_sessions.[].access_group.name") | String | | | | ACL Name. | | [    rate_limit_per_ingress_chip](## "monitor_sessions.[].rate_limit_per_ingress_chip") | String | | | | Ratelimit and unit as string.
Examples:
"100000 bps"
"100 kbps"
"10 mbps"
| | [    rate_limit_per_egress_chip](## "monitor_sessions.[].rate_limit_per_egress_chip") | String | | | | Ratelimit and unit as string.
Examples:
"100000 bps"
"100 kbps"
"10 mbps"
| | [    sample](## "monitor_sessions.[].sample") | Integer | | | | | | [    truncate](## "monitor_sessions.[].truncate") | Dictionary | | | | | | [      enabled](## "monitor_sessions.[].truncate.enabled") | Boolean | | | | | - | [      size](## "monitor_sessions.[].truncate.size") | Integer | | | | Size in bytes | + | [      size](## "monitor_sessions.[].truncate.size") | Integer | | | | Size in bytes. | === "YAML" ```yaml monitor_sessions: - # Session Name + # Session Name. - name: sources: - # Interface name, range or comma separated list + # Interface name, range or comma separated list. - name: direction: access_group: type: - # ACL Name + # ACL Name. name: priority: destinations: - # 'cpu' or interface name, range or comma separated list + # 'cpu' or interface name, range or comma separated list. - encapsulation_gre_metadata_tx: - # Number of bytes to remove from header + # Number of bytes to remove from header. header_remove_size: access_group: type: - # ACL Name + # ACL Name. name: # Ratelimit and unit as string. @@ -79,6 +79,6 @@ truncate: enabled: - # Size in bytes + # Size in bytes. size: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/monitor-telemetry-influx.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/monitor-telemetry-influx.md new file mode 100644 index 00000000000..674ac4f3628 --- /dev/null +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/monitor-telemetry-influx.md @@ -0,0 +1,70 @@ + +=== "Table" + + | Variable | Type | Required | Default | Value Restrictions | Description | + | -------- | ---- | -------- | ------- | ------------------ | ----------- | + | [monitor_telemetry_influx](## "monitor_telemetry_influx") | Dictionary | | | | | + | [  vrf](## "monitor_telemetry_influx.vrf") | String | | | | | + | [  destinations](## "monitor_telemetry_influx.destinations") | List, items: Dictionary | | | | Configure telemetry output destinations. | + | [    - name](## "monitor_telemetry_influx.destinations.[].name") | String | Required, Unique | | | InfluxDB connection name. | + | [      database](## "monitor_telemetry_influx.destinations.[].database") | String | | | | Set name of the database. | + | [      data_retention_policy](## "monitor_telemetry_influx.destinations.[].data_retention_policy") | String | | | | | + | [      url](## "monitor_telemetry_influx.destinations.[].url") | String | | | Pattern: (http(s)?|udp|unix)://.+ | It only accepts http(s), udp and unix domain destination URL. | + | [      username](## "monitor_telemetry_influx.destinations.[].username") | String | | | | | + | [      password](## "monitor_telemetry_influx.destinations.[].password") | String | | | | | + | [      password_type](## "monitor_telemetry_influx.destinations.[].password_type") | String | | `7` | Valid Values:
- 0
- 7
- 8a | | + | [  source_group_standard_disabled](## "monitor_telemetry_influx.source_group_standard_disabled") | Boolean | | | | Disable standard set of telemetry. | + | [  source_sockets](## "monitor_telemetry_influx.source_sockets") | List, items: Dictionary | | | | | + | [    - name](## "monitor_telemetry_influx.source_sockets.[].name") | String | Required, Unique | | | Label of the socket connection. | + | [      connection_limit](## "monitor_telemetry_influx.source_sockets.[].connection_limit") | Integer | | | Min: 0
Max: 4294967295 | | + | [      url](## "monitor_telemetry_influx.source_sockets.[].url") | String | | | Pattern: (http(s)?|udp|unix)://.+ | It only accepts http(s), udp and unix domain socket URL. | + | [  tags](## "monitor_telemetry_influx.tags") | List, items: Dictionary | | | | Extra tags added to the telemetry output. | + | [    - name](## "monitor_telemetry_influx.tags.[].name") | String | Required, Unique | | | Key of the global tag pair. | + | [      value](## "monitor_telemetry_influx.tags.[].value") | String | Required | | | Value of the global tag pair. | + +=== "YAML" + + ```yaml + monitor_telemetry_influx: + vrf: + + # Configure telemetry output destinations. + destinations: + + # InfluxDB connection name. + - name: + + # Set name of the database. + database: + data_retention_policy: + + # It only accepts http(s), udp and unix domain destination URL. + url: + username: + password: + password_type: + + # Disable standard set of telemetry. + source_group_standard_disabled: + source_sockets: + + # Label of the socket connection. + - name: + connection_limit: + + # It only accepts http(s), udp and unix domain socket URL. + url: + + # Extra tags added to the telemetry output. + tags: + + # Key of the global tag pair. + - name: + + # Value of the global tag pair. + value: + ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/monitor-telemetry-postcard-policy.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/monitor-telemetry-postcard-policy.md new file mode 100644 index 00000000000..6bb11e58c98 --- /dev/null +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/monitor-telemetry-postcard-policy.md @@ -0,0 +1,120 @@ + +=== "Table" + + | Variable | Type | Required | Default | Value Restrictions | Description | + | -------- | ---- | -------- | ------- | ------------------ | ----------- | + | [monitor_telemetry_postcard_policy](## "monitor_telemetry_postcard_policy") | Dictionary | | | | | + | [  disabled](## "monitor_telemetry_postcard_policy.disabled") | Boolean | | `True` | | Enable or disable the postcard telemetry feature. | + | [  ingress](## "monitor_telemetry_postcard_policy.ingress") | Dictionary | | | | | + | [    collection](## "monitor_telemetry_postcard_policy.ingress.collection") | Dictionary | | | | Collector configuration. | + | [      source](## "monitor_telemetry_postcard_policy.ingress.collection.source") | String | | | | Source IP address of GRE tunnel. | + | [      destination](## "monitor_telemetry_postcard_policy.ingress.collection.destination") | String | | | | Destination IP address of GRE tunnel. | + | [      version](## "monitor_telemetry_postcard_policy.ingress.collection.version") | Integer | | | Valid Values:
- 1
- 2 | Postcard version. | + | [    sample](## "monitor_telemetry_postcard_policy.ingress.sample") | Dictionary | | | | Sampling parameters. | + | [      rate](## "monitor_telemetry_postcard_policy.ingress.sample.rate") | Integer | | | Valid Values:
- 16384
- 32768
- 65536 | Sampling rate. `rate` is preferred when both `rate` and `tcp_udp_checksum` are defined. | + | [      tcp_udp_checksum](## "monitor_telemetry_postcard_policy.ingress.sample.tcp_udp_checksum") | Dictionary | | | | TCP/UDP parameters. | + | [        value](## "monitor_telemetry_postcard_policy.ingress.sample.tcp_udp_checksum.value") | Integer | | | Min: 0
Max: 65535 | TCP/UDP checksum or IP ID value. | + | [        mask](## "monitor_telemetry_postcard_policy.ingress.sample.tcp_udp_checksum.mask") | String | | | | 16 bit hexadecimal mask for TCP/UDP or IP ID with atmost 2 unset bits. | + | [  marker_vxlan](## "monitor_telemetry_postcard_policy.marker_vxlan") | Dictionary | | | | | + | [    enabled](## "monitor_telemetry_postcard_policy.marker_vxlan.enabled") | Boolean | | | | Enable vxlan marking using default bit 0. | + | [    header_word_zero_bit](## "monitor_telemetry_postcard_policy.marker_vxlan.header_word_zero_bit") | Integer | | | Min: 1
Max: 31 | | + | [  profiles](## "monitor_telemetry_postcard_policy.profiles") | List, items: Dictionary | | | | Postcard telemetry profiles. | + | [    - name](## "monitor_telemetry_postcard_policy.profiles.[].name") | String | Required, Unique | | | Profile name. | + | [      ingress_sample_policy](## "monitor_telemetry_postcard_policy.profiles.[].ingress_sample_policy") | String | | | | | + | [  sample_policies](## "monitor_telemetry_postcard_policy.sample_policies") | List, items: Dictionary | | | | | + | [    - name](## "monitor_telemetry_postcard_policy.sample_policies.[].name") | String | Required, Unique | | | | + | [      match_rules](## "monitor_telemetry_postcard_policy.sample_policies.[].match_rules") | List, items: Dictionary | | | | | + | [        - name](## "monitor_telemetry_postcard_policy.sample_policies.[].match_rules.[].name") | String | Required, Unique | | | | + | [          type](## "monitor_telemetry_postcard_policy.sample_policies.[].match_rules.[].type") | String | Required | | Valid Values:
- ipv4
- ipv6 | IP address version. | + | [          destination_prefix](## "monitor_telemetry_postcard_policy.sample_policies.[].match_rules.[].destination_prefix") | String | | | | IPv4 Network/Mask or IPv6 Network/Mask. Host part of prefix must be zero.
eg. 10.3.3.0/24 | + | [          source_prefix](## "monitor_telemetry_postcard_policy.sample_policies.[].match_rules.[].source_prefix") | String | | | | IPv4 Network/Mask or IPv6 Network/Mask. Host part of prefix must be zero.
eg. 10.3.3.0/24 | + | [          protocols](## "monitor_telemetry_postcard_policy.sample_policies.[].match_rules.[].protocols") | List, items: Dictionary | | | | | + | [            - protocol](## "monitor_telemetry_postcard_policy.sample_policies.[].match_rules.[].protocols.[].protocol") | String | Required, Unique | | Valid Values:
- tcp
- udp | | + | [              source_ports](## "monitor_telemetry_postcard_policy.sample_policies.[].match_rules.[].protocols.[].source_ports") | List, items: String | | | | A list of port numbers or port range or port name. Combination of port numbers or range and port name is not supported on EOS. The port numbers should be in range of 0-65535.
e.g.
[ "12", "14-20" ]
[ "www" ] | + | [                - <str>](## "monitor_telemetry_postcard_policy.sample_policies.[].match_rules.[].protocols.[].source_ports.[]") | String | | | | | + | [              destination_ports](## "monitor_telemetry_postcard_policy.sample_policies.[].match_rules.[].protocols.[].destination_ports") | List, items: String | | | | A list of port numbers or port range or port name. Combination of port numbers or range and port name is not supported on EOS. The port numbers should be in range of 0-65535.
e.g.
[ "12", "14-20", "80" ]
[ "https" ] | + | [                - <str>](## "monitor_telemetry_postcard_policy.sample_policies.[].match_rules.[].protocols.[].destination_ports.[]") | String | | | | | + +=== "YAML" + + ```yaml + monitor_telemetry_postcard_policy: + + # Enable or disable the postcard telemetry feature. + disabled: + ingress: + + # Collector configuration. + collection: + + # Source IP address of GRE tunnel. + source: + + # Destination IP address of GRE tunnel. + destination: + + # Postcard version. + version: + + # Sampling parameters. + sample: + + # Sampling rate. `rate` is preferred when both `rate` and `tcp_udp_checksum` are defined. + rate: + + # TCP/UDP parameters. + tcp_udp_checksum: + + # TCP/UDP checksum or IP ID value. + value: + + # 16 bit hexadecimal mask for TCP/UDP or IP ID with atmost 2 unset bits. + mask: + marker_vxlan: + + # Enable vxlan marking using default bit 0. + enabled: + header_word_zero_bit: + + # Postcard telemetry profiles. + profiles: + + # Profile name. + - name: + ingress_sample_policy: + sample_policies: + - name: + match_rules: + - name: + + # IP address version. + type: + + # IPv4 Network/Mask or IPv6 Network/Mask. Host part of prefix must be zero. + # eg. 10.3.3.0/24 + destination_prefix: + + # IPv4 Network/Mask or IPv6 Network/Mask. Host part of prefix must be zero. + # eg. 10.3.3.0/24 + source_prefix: + protocols: + - protocol: + + # A list of port numbers or port range or port name. Combination of port numbers or range and port name is not supported on EOS. The port numbers should be in range of 0-65535. + # e.g. + # [ "12", "14-20" ] + # [ "www" ] + source_ports: + - + + # A list of port numbers or port range or port name. Combination of port numbers or range and port name is not supported on EOS. The port numbers should be in range of 0-65535. + # e.g. + # [ "12", "14-20", "80" ] + # [ "https" ] + destination_ports: + - + ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/mpls.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/mpls.md index 29fc796c6a5..5464ab26540 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/mpls.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/mpls.md @@ -13,7 +13,7 @@ | [    interface_disabled_default](## "mpls.ldp.interface_disabled_default") | Boolean | | | | | | [    router_id](## "mpls.ldp.router_id") | String | | | | | | [    shutdown](## "mpls.ldp.shutdown") | Boolean | | | | | - | [    transport_address_interface](## "mpls.ldp.transport_address_interface") | String | | | | Interface Name | + | [    transport_address_interface](## "mpls.ldp.transport_address_interface") | String | | | | Interface Name. | === "YAML" @@ -25,6 +25,6 @@ router_id: shutdown: - # Interface Name + # Interface Name. transport_address_interface: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/name-server.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/name-server.md index 6419d3120ac..9dabeab0c53 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/name-server.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/name-server.md @@ -9,7 +9,7 @@ | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [name_server](## "name_server") deprecated | Dictionary | | | | This key is deprecated. Support will be removed in AVD version v5.0.0. Use ip_name_servers instead. | | [  source](## "name_server.source") | Dictionary | | | | | - | [    vrf](## "name_server.source.vrf") | String | | | | VRF Name | + | [    vrf](## "name_server.source.vrf") | String | | | | VRF Name. | | [  nodes](## "name_server.nodes") | List, items: String | | | | | | [    - <str>](## "name_server.nodes.[]") | String | | | | | @@ -22,7 +22,7 @@ name_server: source: - # VRF Name + # VRF Name. vrf: nodes: - diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ntp.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ntp.md index b2a354ce242..fe7b7e563d9 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ntp.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ntp.md @@ -9,27 +9,27 @@ | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [ntp](## "ntp") | Dictionary | | | | | | [  local_interface](## "ntp.local_interface") | Dictionary | | | | | - | [    name](## "ntp.local_interface.name") | String | | | | Source interface | - | [    vrf](## "ntp.local_interface.vrf") | String | | | | VRF name | + | [    name](## "ntp.local_interface.name") | String | | | | Source interface. | + | [    vrf](## "ntp.local_interface.vrf") | String | | | | VRF name. | | [  servers](## "ntp.servers") | List, items: Dictionary | | | | | - | [    - name](## "ntp.servers.[].name") | String | | | | IP or hostname e.g., 2.2.2.55, ie.pool.ntp.org | + | [    - name](## "ntp.servers.[].name") | String | | | | IP or hostname e.g., 2.2.2.55, 2001:db8::55, ie.pool.ntp.org. | | [      burst](## "ntp.servers.[].burst") | Boolean | | | | | | [      iburst](## "ntp.servers.[].iburst") | Boolean | | | | | | [      key](## "ntp.servers.[].key") | Integer | | | Min: 1
Max: 65535 | | - | [      local_interface](## "ntp.servers.[].local_interface") | String | | | | Source interface | - | [      maxpoll](## "ntp.servers.[].maxpoll") | Integer | | | Min: 3
Max: 17 | Value of maxpoll between 3 - 17 (Logarithmic) | - | [      minpoll](## "ntp.servers.[].minpoll") | Integer | | | Min: 3
Max: 17 | Value of minpoll between 3 - 17 (Logarithmic) | + | [      local_interface](## "ntp.servers.[].local_interface") | String | | | | Source interface. | + | [      maxpoll](## "ntp.servers.[].maxpoll") | Integer | | | Min: 3
Max: 17 | Value of maxpoll between 3 - 17 (Logarithmic). | + | [      minpoll](## "ntp.servers.[].minpoll") | Integer | | | Min: 3
Max: 17 | Value of minpoll between 3 - 17 (Logarithmic). | | [      preferred](## "ntp.servers.[].preferred") | Boolean | | | | | | [      version](## "ntp.servers.[].version") | Integer | | | Min: 1
Max: 4 | | - | [      vrf](## "ntp.servers.[].vrf") | String | | | | VRF name | + | [      vrf](## "ntp.servers.[].vrf") | String | | | | VRF name. | | [  authenticate](## "ntp.authenticate") | Boolean | | | | | | [  authenticate_servers_only](## "ntp.authenticate_servers_only") | Boolean | | | | | | [  authentication_keys](## "ntp.authentication_keys") | List, items: Dictionary | | | | | - | [    - id](## "ntp.authentication_keys.[].id") | Integer | Required, Unique | | Min: 1
Max: 65534 | Key identifier | + | [    - id](## "ntp.authentication_keys.[].id") | Integer | Required, Unique | | Min: 1
Max: 65534 | Key identifier. | | [      hash_algorithm](## "ntp.authentication_keys.[].hash_algorithm") | String | | | Valid Values:
- md5
- sha1 | | - | [      key](## "ntp.authentication_keys.[].key") | String | | | | Obfuscated key | + | [      key](## "ntp.authentication_keys.[].key") | String | | | | Obfuscated key. | | [      key_type](## "ntp.authentication_keys.[].key_type") | String | | | Valid Values:
- 0
- 7
- 8a | | - | [  trusted_keys](## "ntp.trusted_keys") | String | | | | List of trusted-keys as string ex. 10-12,15 | + | [  trusted_keys](## "ntp.trusted_keys") | String | | | | List of trusted-keys as string ex. 10-12,15. | === "YAML" @@ -37,44 +37,44 @@ ntp: local_interface: - # Source interface + # Source interface. name: - # VRF name + # VRF name. vrf: servers: - # IP or hostname e.g., 2.2.2.55, ie.pool.ntp.org + # IP or hostname e.g., 2.2.2.55, 2001:db8::55, ie.pool.ntp.org. - name: burst: iburst: key: - # Source interface + # Source interface. local_interface: - # Value of maxpoll between 3 - 17 (Logarithmic) + # Value of maxpoll between 3 - 17 (Logarithmic). maxpoll: - # Value of minpoll between 3 - 17 (Logarithmic) + # Value of minpoll between 3 - 17 (Logarithmic). minpoll: preferred: version: - # VRF name + # VRF name. vrf: authenticate: authenticate_servers_only: authentication_keys: - # Key identifier + # Key identifier. - id: hash_algorithm: - # Obfuscated key + # Obfuscated key. key: key_type: - # List of trusted-keys as string ex. 10-12,15 + # List of trusted-keys as string ex. 10-12,15. trusted_keys: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/patch-panel.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/patch-panel.md index 2dc7060e134..bb00be034de 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/patch-panel.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/patch-panel.md @@ -8,10 +8,18 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [patch_panel](## "patch_panel") | Dictionary | | | | | + | [  connector](## "patch_panel.connector") | Dictionary | | | | | + | [    interface](## "patch_panel.connector.interface") | Dictionary | | | | | + | [      patch](## "patch_panel.connector.interface.patch") | Dictionary | | | | | + | [        bgp_vpws_remote_failure_errdisable](## "patch_panel.connector.interface.patch.bgp_vpws_remote_failure_errdisable") | Boolean | | | | | + | [      recovery](## "patch_panel.connector.interface.recovery") | Dictionary | | | | | + | [        review_delay](## "patch_panel.connector.interface.recovery.review_delay") | Dictionary | | | | | + | [          min](## "patch_panel.connector.interface.recovery.review_delay.min") | Integer | Required | | Min: 10
Max: 600 | Minimum delay. | + | [          max](## "patch_panel.connector.interface.recovery.review_delay.max") | Integer | Required | | Min: 15
Max: 900 | Maximum delay. | | [  patches](## "patch_panel.patches") | List, items: Dictionary | | | | | | [    - name](## "patch_panel.patches.[].name") | String | Required, Unique | | | | | [      enabled](## "patch_panel.patches.[].enabled") | Boolean | | | | | - | [      connectors](## "patch_panel.patches.[].connectors") | List, items: Dictionary | | | Min Length: 2
Max Length: 2 | Must have exactly two connectors to a patch of which at least one must be of type "interface" | + | [      connectors](## "patch_panel.patches.[].connectors") | List, items: Dictionary | | | Min Length: 2
Max Length: 2 | Must have exactly two connectors to a patch of which at least one must be of type "interface". | | [        - id](## "patch_panel.patches.[].connectors.[].id") | String | Required, Unique | | | | | [          type](## "patch_panel.patches.[].connectors.[].type") | String | Required | | Valid Values:
- interface
- pseudowire | | | [          endpoint](## "patch_panel.patches.[].connectors.[].endpoint") | String | Required | | | String with relevant endpoint depending on type.
Examples:
- "Ethernet1"
- "Ethernet1 dot1q vlan 123"
- "bgp vpws TENANT_A pseudowire VPWS_PW_1"
- "ldp LDP_PW_1"
| @@ -20,11 +28,23 @@ ```yaml patch_panel: + connector: + interface: + patch: + bgp_vpws_remote_failure_errdisable: + recovery: + review_delay: + + # Minimum delay. + min: + + # Maximum delay. + max: patches: - name: enabled: - # Must have exactly two connectors to a patch of which at least one must be of type "interface" + # Must have exactly two connectors to a patch of which at least one must be of type "interface". connectors: # 2-2 items - id: type: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/peer-filters.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/peer-filters.md index 15689593c83..4fd36cabc25 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/peer-filters.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/peer-filters.md @@ -8,24 +8,24 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [peer_filters](## "peer_filters") | List, items: Dictionary | | | | | - | [  - name](## "peer_filters.[].name") | String | Required, Unique | | | Peer-filter Name | + | [  - name](## "peer_filters.[].name") | String | Required, Unique | | | Peer-filter Name. | | [    sequence_numbers](## "peer_filters.[].sequence_numbers") | List, items: Dictionary | Required | | | | - | [      - sequence](## "peer_filters.[].sequence_numbers.[].sequence") | Integer | Required, Unique | | | Sequence ID | - | [        match](## "peer_filters.[].sequence_numbers.[].match") | String | Required | | | Match as string
Example: "as-range 1-100 result accept"
| + | [      - sequence](## "peer_filters.[].sequence_numbers.[].sequence") | Integer | Required, Unique | | | Sequence ID. | + | [        match](## "peer_filters.[].sequence_numbers.[].match") | String | Required | | | Match as string.
Example: "as-range 1-100 result accept"
| === "YAML" ```yaml peer_filters: - # Peer-filter Name + # Peer-filter Name. - name: sequence_numbers: # required - # Sequence ID + # Sequence ID. - sequence: - # Match as string + # Match as string. # Example: "as-range 1-100 result accept" match: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/platform.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/platform.md index e1553632143..d9f4cb6a639 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/platform.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/platform.md @@ -21,7 +21,7 @@ | [              threshold](## "platform.trident.mmu.queue_profiles.[].multicast_queues.[].threshold") | String | | | | Dynamic Shared Memory threshold.
| | [              drop](## "platform.trident.mmu.queue_profiles.[].multicast_queues.[].drop") | Dictionary | | | | | | [                precedence](## "platform.trident.mmu.queue_profiles.[].multicast_queues.[].drop.precedence") | Integer | Required | | Valid Values:
- 1
- 2 | | - | [                threshold](## "platform.trident.mmu.queue_profiles.[].multicast_queues.[].drop.threshold") | String | Required | | | Drop Treshold. This value may also be fractions.
Example: 7/8 or 3/4 or 1/2
| + | [                threshold](## "platform.trident.mmu.queue_profiles.[].multicast_queues.[].drop.threshold") | String | Required | | | Drop Threshold. This value may also be fractions.
Example: 7/8 or 3/4 or 1/2
| | [          unicast_queues](## "platform.trident.mmu.queue_profiles.[].unicast_queues") | List, items: Dictionary | | | | | | [            - id](## "platform.trident.mmu.queue_profiles.[].unicast_queues.[].id") | Integer | Required, Unique | | Min: 0
Max: 7 | | | [              unit](## "platform.trident.mmu.queue_profiles.[].unicast_queues.[].unit") | String | | | Valid Values:
- bytes
- cells | Unit to be used for the reservation value. If not specified, default is bytes.
| @@ -29,8 +29,8 @@ | [              threshold](## "platform.trident.mmu.queue_profiles.[].unicast_queues.[].threshold") | String | | | | Dynamic Shared Memory threshold.
| | [              drop](## "platform.trident.mmu.queue_profiles.[].unicast_queues.[].drop") | Dictionary | | | | | | [                precedence](## "platform.trident.mmu.queue_profiles.[].unicast_queues.[].drop.precedence") | Integer | Required | | Valid Values:
- 1
- 2 | | - | [                threshold](## "platform.trident.mmu.queue_profiles.[].unicast_queues.[].drop.threshold") | String | Required | | | Drop Treshold. This value may also be fractions.
Example: 7/8 or 3/4 or 1/2
| - | [  sand](## "platform.sand") | Dictionary | | | | Most of the platform sand options are hardware dependent and optional | + | [                threshold](## "platform.trident.mmu.queue_profiles.[].unicast_queues.[].drop.threshold") | String | Required | | | Drop Threshold. This value may also be fractions.
Example: 7/8 or 3/4 or 1/2
| + | [  sand](## "platform.sand") | Dictionary | | | | Most of the platform sand options are hardware dependent and optional. | | [    qos_maps](## "platform.sand.qos_maps") | List, items: Dictionary | | | | | | [      - traffic_class](## "platform.sand.qos_maps.[].traffic_class") | Integer | | | Min: 0
Max: 7 | | | [        to_network_qos](## "platform.sand.qos_maps.[].to_network_qos") | Integer | | | Min: 0
Max: 63 | | @@ -74,7 +74,7 @@ drop: precedence: - # Drop Treshold. This value may also be fractions. + # Drop Threshold. This value may also be fractions. # Example: 7/8 or 3/4 or 1/2 threshold: unicast_queues: @@ -92,11 +92,11 @@ drop: precedence: - # Drop Treshold. This value may also be fractions. + # Drop Threshold. This value may also be fractions. # Example: 7/8 or 3/4 or 1/2 threshold: - # Most of the platform sand options are hardware dependent and optional + # Most of the platform sand options are hardware dependent and optional. sand: qos_maps: - traffic_class: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/poe.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/poe.md index e5c90705e1e..000a71c57ca 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/poe.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/poe.md @@ -10,7 +10,7 @@ | [poe](## "poe") | Dictionary | | | | | | [  reboot](## "poe.reboot") | Dictionary | | | | Set the global PoE power behavior for PoE ports when the system is rebooted. | | [    action](## "poe.reboot.action") | String | | | Valid Values:
- power-off
- maintain | PoE action for interface. By default in EOS, reboot action is set to power-off. | - | [  interface_shutdown](## "poe.interface_shutdown") | Dictionary | | | | Set the global PoE power behavior for PoE ports when ports are admin down | + | [  interface_shutdown](## "poe.interface_shutdown") | Dictionary | | | | Set the global PoE power behavior for PoE ports when ports are admin down. | | [    action](## "poe.interface_shutdown.action") | String | | | Valid Values:
- power-off
- maintain | PoE action for interface. By default in EOS, interface shutdown action is set to maintain. | === "YAML" @@ -24,7 +24,7 @@ # PoE action for interface. By default in EOS, reboot action is set to power-off. action: - # Set the global PoE power behavior for PoE ports when ports are admin down + # Set the global PoE power behavior for PoE ports when ports are admin down. interface_shutdown: # PoE action for interface. By default in EOS, interface shutdown action is set to maintain. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/policy-maps.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/policy-maps.md index 11bf73e3bc0..5c53db2f85c 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/policy-maps.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/policy-maps.md @@ -8,20 +8,20 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [policy_maps](## "policy_maps") | Dictionary | | | | | - | [  pbr](## "policy_maps.pbr") | List, items: Dictionary | | | | PBR Policy-Maps | - | [    - name](## "policy_maps.pbr.[].name") | String | Required, Unique | | | Policy-Map Name | + | [  pbr](## "policy_maps.pbr") | List, items: Dictionary | | | | PBR Policy-Maps. | + | [    - name](## "policy_maps.pbr.[].name") | String | Required, Unique | | | Policy-Map Name. | | [      classes](## "policy_maps.pbr.[].classes") | List, items: Dictionary | | | | | - | [        - name](## "policy_maps.pbr.[].classes.[].name") | String | Required, Unique | | | Class Name | + | [        - name](## "policy_maps.pbr.[].classes.[].name") | String | Required, Unique | | | Class Name. | | [          index](## "policy_maps.pbr.[].classes.[].index") | Integer | | | | | - | [          drop](## "policy_maps.pbr.[].classes.[].drop") | Boolean | | | | 'drop' and 'set' are mutually exclusive | - | [          set](## "policy_maps.pbr.[].classes.[].set") | Dictionary | | | | Set Nexthop
'drop' and 'set' are mutually exclusive
| + | [          drop](## "policy_maps.pbr.[].classes.[].drop") | Boolean | | | | 'drop' and 'set' are mutually exclusive. | + | [          set](## "policy_maps.pbr.[].classes.[].set") | Dictionary | | | | Set Nexthop
'drop' and 'set' are mutually exclusive.
| | [            nexthop](## "policy_maps.pbr.[].classes.[].set.nexthop") | Dictionary | | | | | - | [              ip_address](## "policy_maps.pbr.[].classes.[].set.nexthop.ip_address") | String | | | | IPv4 or IPv6 Address | + | [              ip_address](## "policy_maps.pbr.[].classes.[].set.nexthop.ip_address") | String | | | | IPv4 or IPv6 Address. | | [              recursive](## "policy_maps.pbr.[].classes.[].set.nexthop.recursive") | Boolean | | | | | - | [  qos](## "policy_maps.qos") | List, items: Dictionary | | | | QOS Policy-Maps | - | [    - name](## "policy_maps.qos.[].name") | String | Required, Unique | | | Policy-Map Name | + | [  qos](## "policy_maps.qos") | List, items: Dictionary | | | | QOS Policy-Maps. | + | [    - name](## "policy_maps.qos.[].name") | String | Required, Unique | | | Policy-Map Name. | | [      classes](## "policy_maps.qos.[].classes") | List, items: Dictionary | | | | | - | [        - name](## "policy_maps.qos.[].classes.[].name") | String | Required, Unique | | | Class Name | + | [        - name](## "policy_maps.qos.[].classes.[].name") | String | Required, Unique | | | Class Name. | | [          set](## "policy_maps.qos.[].classes.[].set") | Dictionary | | | | | | [            cos](## "policy_maps.qos.[].classes.[].set.cos") | Integer | | | | | | [            dscp](## "policy_maps.qos.[].classes.[].set.dscp") | String | | | | | @@ -39,43 +39,49 @@ | [            higher_rate_unit](## "policy_maps.qos.[].classes.[].police.higher_rate_unit") | String | | `bps` | Valid Values:
- bps
- kbps
- mbps
- pps | | | [            higher_rate_burst_size](## "policy_maps.qos.[].classes.[].police.higher_rate_burst_size") | Integer | | | | Range in bytes <256-128000000>. | | [            higher_rate_burst_size_unit](## "policy_maps.qos.[].classes.[].police.higher_rate_burst_size_unit") | String | | `bytes` | Valid Values:
- bytes
- kbytes
- mbytes
- packets | | + | [  copp_system_policy](## "policy_maps.copp_system_policy") | Dictionary | | | | Control-plane policy configuration. | + | [    classes](## "policy_maps.copp_system_policy.classes") | List, items: Dictionary | | | | | + | [      - name](## "policy_maps.copp_system_policy.classes.[].name") | String | Required, Unique | | | | + | [        shape](## "policy_maps.copp_system_policy.classes.[].shape") | Integer | | | Min: 0
Max: 10000000 | Maximum rate limit. | + | [        bandwidth](## "policy_maps.copp_system_policy.classes.[].bandwidth") | Integer | | | Min: 0
Max: 10000000 | Minimum bandwidth. | + | [        rate_unit](## "policy_maps.copp_system_policy.classes.[].rate_unit") | String | | | Valid Values:
- pps
- kbps | The `rate_unit` must be defined for `shape` and `bandwidth`. | === "YAML" ```yaml policy_maps: - # PBR Policy-Maps + # PBR Policy-Maps. pbr: - # Policy-Map Name + # Policy-Map Name. - name: classes: - # Class Name + # Class Name. - name: index: - # 'drop' and 'set' are mutually exclusive + # 'drop' and 'set' are mutually exclusive. drop: # Set Nexthop - # 'drop' and 'set' are mutually exclusive + # 'drop' and 'set' are mutually exclusive. set: nexthop: - # IPv4 or IPv6 Address + # IPv4 or IPv6 Address. ip_address: recursive: - # QOS Policy-Maps + # QOS Policy-Maps. qos: - # Policy-Map Name + # Policy-Map Name. - name: classes: - # Class Name + # Class Name. - name: set: cos: @@ -108,4 +114,18 @@ # Range in bytes <256-128000000>. higher_rate_burst_size: higher_rate_burst_size_unit: + + # Control-plane policy configuration. + copp_system_policy: + classes: + - name: + + # Maximum rate limit. + shape: + + # Minimum bandwidth. + bandwidth: + + # The `rate_unit` must be defined for `shape` and `bandwidth`. + rate_unit: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/port-channel-interfaces.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/port-channel-interfaces.md index 833f5b00c7e..cf5c246483b 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/port-channel-interfaces.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/port-channel-interfaces.md @@ -15,53 +15,53 @@ | [        link_status](## "port_channel_interfaces.[].logging.event.link_status") | Boolean | | | | | | [        storm_control_discards](## "port_channel_interfaces.[].logging.event.storm_control_discards") | Boolean | | | | Discards due to storm-control.
| | [    shutdown](## "port_channel_interfaces.[].shutdown") | Boolean | | | | | - | [    l2_mtu](## "port_channel_interfaces.[].l2_mtu") | Integer | | | Min: 68
Max: 65535 | "l2_mtu" should only be defined for platforms supporting the "l2 mtu" CLI
| - | [    l2_mru](## "port_channel_interfaces.[].l2_mru") | Integer | | | Min: 68
Max: 65535 | "l2_mru" should only be defined for platforms supporting the "l2 mru" CLI
| - | [    vlans](## "port_channel_interfaces.[].vlans") | String | | | | List of switchport vlans as string
For a trunk port this would be a range like "1-200,300"
For an access port this would be a single vlan "123"
| + | [    l2_mtu](## "port_channel_interfaces.[].l2_mtu") | Integer | | | Min: 68
Max: 65535 | "l2_mtu" should only be defined for platforms supporting the "l2 mtu" CLI.
| + | [    l2_mru](## "port_channel_interfaces.[].l2_mru") | Integer | | | Min: 68
Max: 65535 | "l2_mru" should only be defined for platforms supporting the "l2 mru" CLI.
| + | [    vlans](## "port_channel_interfaces.[].vlans") | String | | | | List of switchport vlans as string.
For a trunk port this would be a range like "1-200,300".
For an access port this would be a single vlan "123".
| | [    snmp_trap_link_change](## "port_channel_interfaces.[].snmp_trap_link_change") | Boolean | | | | | | [    type](## "port_channel_interfaces.[].type") | String | | | Valid Values:
- routed
- switched
- l3dot1q
- l2dot1q | l3dot1q and l2dot1q are used for sub-interfaces. The parent interface should be defined as routed.
Interface will not be listed in device documentation, unless "type" is set.
| - | [    encapsulation_dot1q_vlan](## "port_channel_interfaces.[].encapsulation_dot1q_vlan") | Integer | | | | VLAN tag to configure on sub-interface | - | [    vrf](## "port_channel_interfaces.[].vrf") | String | | | | VRF name | + | [    encapsulation_dot1q_vlan](## "port_channel_interfaces.[].encapsulation_dot1q_vlan") | Integer | | | | VLAN tag to configure on sub-interface. | + | [    vrf](## "port_channel_interfaces.[].vrf") | String | | | | VRF name. | | [    encapsulation_vlan](## "port_channel_interfaces.[].encapsulation_vlan") | Dictionary | | | | | | [      client](## "port_channel_interfaces.[].encapsulation_vlan.client") | Dictionary | | | | | | [        dot1q](## "port_channel_interfaces.[].encapsulation_vlan.client.dot1q") | Dictionary | | | | | - | [          vlan](## "port_channel_interfaces.[].encapsulation_vlan.client.dot1q.vlan") | Integer | | | | Client VLAN ID | - | [          outer](## "port_channel_interfaces.[].encapsulation_vlan.client.dot1q.outer") | Integer | | | | Client Outer VLAN ID | - | [          inner](## "port_channel_interfaces.[].encapsulation_vlan.client.dot1q.inner") | Integer | | | | Client Inner VLAN ID | + | [          vlan](## "port_channel_interfaces.[].encapsulation_vlan.client.dot1q.vlan") | Integer | | | | Client VLAN ID. | + | [          outer](## "port_channel_interfaces.[].encapsulation_vlan.client.dot1q.outer") | Integer | | | | Client Outer VLAN ID. | + | [          inner](## "port_channel_interfaces.[].encapsulation_vlan.client.dot1q.inner") | Integer | | | | Client Inner VLAN ID. | | [        unmatched](## "port_channel_interfaces.[].encapsulation_vlan.client.unmatched") | Boolean | | | | | - | [      network](## "port_channel_interfaces.[].encapsulation_vlan.network") | Dictionary | | | | Network encapsulation are all optional, and skipped if using client unmatched | + | [      network](## "port_channel_interfaces.[].encapsulation_vlan.network") | Dictionary | | | | Network encapsulation are all optional, and skipped if using client unmatched. | | [        dot1q](## "port_channel_interfaces.[].encapsulation_vlan.network.dot1q") | Dictionary | | | | | - | [          vlan](## "port_channel_interfaces.[].encapsulation_vlan.network.dot1q.vlan") | Integer | | | | Network VLAN ID | - | [          outer](## "port_channel_interfaces.[].encapsulation_vlan.network.dot1q.outer") | Integer | | | | Network Outer VLAN ID | - | [          inner](## "port_channel_interfaces.[].encapsulation_vlan.network.dot1q.inner") | Integer | | | | Network Inner VLAN ID | + | [          vlan](## "port_channel_interfaces.[].encapsulation_vlan.network.dot1q.vlan") | Integer | | | | Network VLAN ID. | + | [          outer](## "port_channel_interfaces.[].encapsulation_vlan.network.dot1q.outer") | Integer | | | | Network Outer VLAN ID. | + | [          inner](## "port_channel_interfaces.[].encapsulation_vlan.network.dot1q.inner") | Integer | | | | Network Inner VLAN ID. | | [        client](## "port_channel_interfaces.[].encapsulation_vlan.network.client") | Boolean | | | | | | [    vlan_id](## "port_channel_interfaces.[].vlan_id") | Integer | | | Min: 1
Max: 4094 | | | [    mode](## "port_channel_interfaces.[].mode") | String | | | Valid Values:
- access
- dot1q-tunnel
- trunk
- trunk phone | | - | [    native_vlan](## "port_channel_interfaces.[].native_vlan") | Integer | | | | If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence | - | [    native_vlan_tag](## "port_channel_interfaces.[].native_vlan_tag") | Boolean | | `False` | | If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence | + | [    native_vlan](## "port_channel_interfaces.[].native_vlan") | Integer | | | | If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence. | + | [    native_vlan_tag](## "port_channel_interfaces.[].native_vlan_tag") | Boolean | | `False` | | If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence. | | [    link_tracking_groups](## "port_channel_interfaces.[].link_tracking_groups") | List, items: Dictionary | | | | | - | [      - name](## "port_channel_interfaces.[].link_tracking_groups.[].name") | String | Required, Unique | | | Group name | + | [      - name](## "port_channel_interfaces.[].link_tracking_groups.[].name") | String | Required, Unique | | | Group name. | | [        direction](## "port_channel_interfaces.[].link_tracking_groups.[].direction") | String | | | Valid Values:
- upstream
- downstream | | | [    phone](## "port_channel_interfaces.[].phone") | Dictionary | | | | | | [      trunk](## "port_channel_interfaces.[].phone.trunk") | String | | | Valid Values:
- tagged
- untagged | | | [      vlan](## "port_channel_interfaces.[].phone.vlan") | Integer | | | Min: 1
Max: 4094 | | | [    l2_protocol](## "port_channel_interfaces.[].l2_protocol") | Dictionary | | | | | - | [      encapsulation_dot1q_vlan](## "port_channel_interfaces.[].l2_protocol.encapsulation_dot1q_vlan") | Integer | | | | Vlan tag to configure on sub-interface | - | [      forwarding_profile](## "port_channel_interfaces.[].l2_protocol.forwarding_profile") | String | | | | L2 protocol forwarding profile | + | [      encapsulation_dot1q_vlan](## "port_channel_interfaces.[].l2_protocol.encapsulation_dot1q_vlan") | Integer | | | | Vlan tag to configure on sub-interface. | + | [      forwarding_profile](## "port_channel_interfaces.[].l2_protocol.forwarding_profile") | String | | | | L2 protocol forwarding profile. | | [    mtu](## "port_channel_interfaces.[].mtu") | Integer | | | Min: 68
Max: 65535 | | - | [    mlag](## "port_channel_interfaces.[].mlag") | Integer | | | Min: 1
Max: 2000 | MLAG ID | + | [    mlag](## "port_channel_interfaces.[].mlag") | Integer | | | Min: 1
Max: 2000 | MLAG ID. | | [    trunk_groups](## "port_channel_interfaces.[].trunk_groups") | List, items: String | | | | | | [      - <str>](## "port_channel_interfaces.[].trunk_groups.[]") | String | | | | | - | [    lacp_fallback_timeout](## "port_channel_interfaces.[].lacp_fallback_timeout") | Integer | | `90` | Min: 0
Max: 300 | Timeout in seconds | + | [    lacp_fallback_timeout](## "port_channel_interfaces.[].lacp_fallback_timeout") | Integer | | `90` | Min: 0
Max: 300 | Timeout in seconds. | | [    lacp_fallback_mode](## "port_channel_interfaces.[].lacp_fallback_mode") | String | | | Valid Values:
- individual
- static | | | [    qos](## "port_channel_interfaces.[].qos") | Dictionary | | | | | | [      trust](## "port_channel_interfaces.[].qos.trust") | String | | | Valid Values:
- dscp
- cos
- disabled | | - | [      dscp](## "port_channel_interfaces.[].qos.dscp") | Integer | | | | DSCP value | - | [      cos](## "port_channel_interfaces.[].qos.cos") | Integer | | | | COS value | + | [      dscp](## "port_channel_interfaces.[].qos.dscp") | Integer | | | | DSCP value. | + | [      cos](## "port_channel_interfaces.[].qos.cos") | Integer | | | | COS value. | | [    bfd](## "port_channel_interfaces.[].bfd") | Dictionary | | | | | | [      echo](## "port_channel_interfaces.[].bfd.echo") | Boolean | | | | | - | [      interval](## "port_channel_interfaces.[].bfd.interval") | Integer | | | | Interval in milliseconds | - | [      min_rx](## "port_channel_interfaces.[].bfd.min_rx") | Integer | | | | Rate in milliseconds | + | [      interval](## "port_channel_interfaces.[].bfd.interval") | Integer | | | | Interval in milliseconds. | + | [      min_rx](## "port_channel_interfaces.[].bfd.min_rx") | Integer | | | | Rate in milliseconds. | | [      multiplier](## "port_channel_interfaces.[].bfd.multiplier") | Integer | | | Min: 3
Max: 50 | | | [      neighbor](## "port_channel_interfaces.[].bfd.neighbor") | String | | | | IPv4 or IPv6 address. When the Port-channel is a L2 interface, a local L3 BFD address (router_bfd.local_address) has to be defined globally on the switch. | | [      per_link](## "port_channel_interfaces.[].bfd.per_link") | Dictionary | | | | | @@ -69,64 +69,65 @@ | [        rfc_7130](## "port_channel_interfaces.[].bfd.per_link.rfc_7130") | Boolean | | | | | | [    service_policy](## "port_channel_interfaces.[].service_policy") | Dictionary | | | | | | [      pbr](## "port_channel_interfaces.[].service_policy.pbr") | Dictionary | | | | | - | [        input](## "port_channel_interfaces.[].service_policy.pbr.input") | String | | | | Policy Based Routing Policy-map name | + | [        input](## "port_channel_interfaces.[].service_policy.pbr.input") | String | | | | Policy Based Routing Policy-map name. | | [      qos](## "port_channel_interfaces.[].service_policy.qos") | Dictionary | | | | | - | [        input](## "port_channel_interfaces.[].service_policy.qos.input") | String | Required | | | Quality of Service Policy-map name | + | [        input](## "port_channel_interfaces.[].service_policy.qos.input") | String | Required | | | Quality of Service Policy-map name. | | [    mpls](## "port_channel_interfaces.[].mpls") | Dictionary | | | | | | [      ip](## "port_channel_interfaces.[].mpls.ip") | Boolean | | | | | | [      ldp](## "port_channel_interfaces.[].mpls.ldp") | Dictionary | | | | | | [        interface](## "port_channel_interfaces.[].mpls.ldp.interface") | Boolean | | | | | | [        igp_sync](## "port_channel_interfaces.[].mpls.ldp.igp_sync") | Boolean | | | | | | [    trunk_private_vlan_secondary](## "port_channel_interfaces.[].trunk_private_vlan_secondary") | Boolean | | | | | - | [    pvlan_mapping](## "port_channel_interfaces.[].pvlan_mapping") | String | | | | List of vlans as string | + | [    pvlan_mapping](## "port_channel_interfaces.[].pvlan_mapping") | String | | | | List of vlans as string. | | [    vlan_translations](## "port_channel_interfaces.[].vlan_translations") | List, items: Dictionary | | | | | - | [      - from](## "port_channel_interfaces.[].vlan_translations.[].from") | String | | | | List of vlans as string (only one vlan if direction is "both") | - | [        to](## "port_channel_interfaces.[].vlan_translations.[].to") | Integer | | | | VLAN ID | + | [      - from](## "port_channel_interfaces.[].vlan_translations.[].from") | String | | | | List of vlans as string (only one vlan if direction is "both"). | + | [        to](## "port_channel_interfaces.[].vlan_translations.[].to") | Integer | | | | VLAN ID. | | [        direction](## "port_channel_interfaces.[].vlan_translations.[].direction") | String | | `both` | Valid Values:
- in
- out
- both | | | [    shape](## "port_channel_interfaces.[].shape") | Dictionary | | | | | - | [      rate](## "port_channel_interfaces.[].shape.rate") | String | | | | Rate in kbps, pps or percent
Supported options are platform dependent
Examples:
- "5000 kbps"
- "1000 pps"
- "20 percent"
| + | [      rate](## "port_channel_interfaces.[].shape.rate") | String | | | | Rate in kbps, pps or percent.
Supported options are platform dependent.
Examples:
- "5000 kbps"
- "1000 pps"
- "20 percent"
| | [    storm_control](## "port_channel_interfaces.[].storm_control") | Dictionary | | | | | | [      all](## "port_channel_interfaces.[].storm_control.all") | Dictionary | | | | | - | [        level](## "port_channel_interfaces.[].storm_control.all.level") | String | | | | Configure maximum storm-control level | - | [        unit](## "port_channel_interfaces.[].storm_control.all.unit") | String | | `percent` | Valid Values:
- percent
- pps | Optional field and is hardware dependent | + | [        level](## "port_channel_interfaces.[].storm_control.all.level") | String | | | | Configure maximum storm-control level. | + | [        unit](## "port_channel_interfaces.[].storm_control.all.unit") | String | | `percent` | Valid Values:
- percent
- pps | Optional field and is hardware dependent. | | [      broadcast](## "port_channel_interfaces.[].storm_control.broadcast") | Dictionary | | | | | - | [        level](## "port_channel_interfaces.[].storm_control.broadcast.level") | String | | | | Configure maximum storm-control level | - | [        unit](## "port_channel_interfaces.[].storm_control.broadcast.unit") | String | | `percent` | Valid Values:
- percent
- pps | Optional field and is hardware dependent | + | [        level](## "port_channel_interfaces.[].storm_control.broadcast.level") | String | | | | Configure maximum storm-control level. | + | [        unit](## "port_channel_interfaces.[].storm_control.broadcast.unit") | String | | `percent` | Valid Values:
- percent
- pps | Optional field and is hardware dependent. | | [      multicast](## "port_channel_interfaces.[].storm_control.multicast") | Dictionary | | | | | - | [        level](## "port_channel_interfaces.[].storm_control.multicast.level") | String | | | | Configure maximum storm-control level | - | [        unit](## "port_channel_interfaces.[].storm_control.multicast.unit") | String | | `percent` | Valid Values:
- percent
- pps | Optional field and is hardware dependent | + | [        level](## "port_channel_interfaces.[].storm_control.multicast.level") | String | | | | Configure maximum storm-control level. | + | [        unit](## "port_channel_interfaces.[].storm_control.multicast.unit") | String | | `percent` | Valid Values:
- percent
- pps | Optional field and is hardware dependent. | | [      unknown_unicast](## "port_channel_interfaces.[].storm_control.unknown_unicast") | Dictionary | | | | | - | [        level](## "port_channel_interfaces.[].storm_control.unknown_unicast.level") | String | | | | Configure maximum storm-control level | - | [        unit](## "port_channel_interfaces.[].storm_control.unknown_unicast.unit") | String | | `percent` | Valid Values:
- percent
- pps | Optional field and is hardware dependent | + | [        level](## "port_channel_interfaces.[].storm_control.unknown_unicast.level") | String | | | | Configure maximum storm-control level. | + | [        unit](## "port_channel_interfaces.[].storm_control.unknown_unicast.unit") | String | | `percent` | Valid Values:
- percent
- pps | Optional field and is hardware dependent. | | [    ip_proxy_arp](## "port_channel_interfaces.[].ip_proxy_arp") | Boolean | | | | | - | [    isis_enable](## "port_channel_interfaces.[].isis_enable") | String | | | | ISIS instance | + | [    isis_enable](## "port_channel_interfaces.[].isis_enable") | String | | | | ISIS instance. | + | [    isis_bfd](## "port_channel_interfaces.[].isis_bfd") | Boolean | | | | Enable BFD for ISIS. | | [    isis_passive](## "port_channel_interfaces.[].isis_passive") | Boolean | | | | | | [    isis_metric](## "port_channel_interfaces.[].isis_metric") | Integer | | | | | | [    isis_network_point_to_point](## "port_channel_interfaces.[].isis_network_point_to_point") | Boolean | | | | | | [    isis_circuit_type](## "port_channel_interfaces.[].isis_circuit_type") | String | | | Valid Values:
- level-1-2
- level-1
- level-2 | | | [    isis_hello_padding](## "port_channel_interfaces.[].isis_hello_padding") | Boolean | | | | | | [    isis_authentication_mode](## "port_channel_interfaces.[].isis_authentication_mode") | String | | | Valid Values:
- text
- md5 | | - | [    isis_authentication_key](## "port_channel_interfaces.[].isis_authentication_key") | String | | | | Type-7 encrypted password | + | [    isis_authentication_key](## "port_channel_interfaces.[].isis_authentication_key") | String | | | | Type-7 encrypted password. | | [    traffic_policy](## "port_channel_interfaces.[].traffic_policy") | Dictionary | | | | | - | [      input](## "port_channel_interfaces.[].traffic_policy.input") | String | | | | Ingress traffic policy | - | [      output](## "port_channel_interfaces.[].traffic_policy.output") | String | | | | Egress traffic policy | + | [      input](## "port_channel_interfaces.[].traffic_policy.input") | String | | | | Ingress traffic policy. | + | [      output](## "port_channel_interfaces.[].traffic_policy.output") | String | | | | Egress traffic policy. | | [    evpn_ethernet_segment](## "port_channel_interfaces.[].evpn_ethernet_segment") | Dictionary | | | | | - | [      identifier](## "port_channel_interfaces.[].evpn_ethernet_segment.identifier") | String | | | | EVPN Ethernet Segment Identifier (Type 1 format) | + | [      identifier](## "port_channel_interfaces.[].evpn_ethernet_segment.identifier") | String | | | | EVPN Ethernet Segment Identifier (Type 1 format). | | [      redundancy](## "port_channel_interfaces.[].evpn_ethernet_segment.redundancy") | String | | | Valid Values:
- all-active
- single-active | | | [      designated_forwarder_election](## "port_channel_interfaces.[].evpn_ethernet_segment.designated_forwarder_election") | Dictionary | | | | | | [        algorithm](## "port_channel_interfaces.[].evpn_ethernet_segment.designated_forwarder_election.algorithm") | String | | | Valid Values:
- modulus
- preference | | - | [        preference_value](## "port_channel_interfaces.[].evpn_ethernet_segment.designated_forwarder_election.preference_value") | Integer | | | Min: 0
Max: 65535 | Preference_value is only used when "algorithm" is "preference" | - | [        dont_preempt](## "port_channel_interfaces.[].evpn_ethernet_segment.designated_forwarder_election.dont_preempt") | Boolean | | `False` | | Dont_preempt is only used when "algorithm" is "preference" | + | [        preference_value](## "port_channel_interfaces.[].evpn_ethernet_segment.designated_forwarder_election.preference_value") | Integer | | | Min: 0
Max: 65535 | Preference_value is only used when "algorithm" is "preference". | + | [        dont_preempt](## "port_channel_interfaces.[].evpn_ethernet_segment.designated_forwarder_election.dont_preempt") | Boolean | | `False` | | Dont_preempt is only used when "algorithm" is "preference". | | [        hold_time](## "port_channel_interfaces.[].evpn_ethernet_segment.designated_forwarder_election.hold_time") | Integer | | | | | | [        subsequent_hold_time](## "port_channel_interfaces.[].evpn_ethernet_segment.designated_forwarder_election.subsequent_hold_time") | Integer | | | | | | [        candidate_reachability_required](## "port_channel_interfaces.[].evpn_ethernet_segment.designated_forwarder_election.candidate_reachability_required") | Boolean | | | | | | [      mpls](## "port_channel_interfaces.[].evpn_ethernet_segment.mpls") | Dictionary | | | | | | [        shared_index](## "port_channel_interfaces.[].evpn_ethernet_segment.mpls.shared_index") | Integer | | | Min: 1
Max: 1024 | | | [        tunnel_flood_filter_time](## "port_channel_interfaces.[].evpn_ethernet_segment.mpls.tunnel_flood_filter_time") | Integer | | | | | - | [      route_target](## "port_channel_interfaces.[].evpn_ethernet_segment.route_target") | String | | | | EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx | - | [    esi](## "port_channel_interfaces.[].esi") deprecated | String | | | | EVPN Ethernet Segment Identifier (Type 1 format)
If both "esi" and "evpn_ethernet_segment.identifier" are defined, the new variable takes precedence
This key is deprecated. Support will be removed in AVD version 5.0.0. Use evpn_ethernet_segment.identifier instead. | - | [    rt](## "port_channel_interfaces.[].rt") deprecated | String | | | | EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx
If both "rt" and "evpn_ethernet_segment.route_target" are defined, the new variable takes precedence
This key is deprecated. Support will be removed in AVD version 5.0.0. Use evpn_ethernet_segment.route_target instead. | - | [    lacp_id](## "port_channel_interfaces.[].lacp_id") | String | | | | LACP ID with format xxxx.xxxx.xxxx | + | [      route_target](## "port_channel_interfaces.[].evpn_ethernet_segment.route_target") | String | | | | EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx. | + | [    esi](## "port_channel_interfaces.[].esi") deprecated | String | | | | EVPN Ethernet Segment Identifier (Type 1 format).
If both "esi" and "evpn_ethernet_segment.identifier" are defined, the new variable takes precedence.
This key is deprecated. Support will be removed in AVD version 5.0.0. Use evpn_ethernet_segment.identifier instead. | + | [    rt](## "port_channel_interfaces.[].rt") deprecated | String | | | | EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx.
If both "rt" and "evpn_ethernet_segment.route_target" are defined, the new variable takes precedence.
This key is deprecated. Support will be removed in AVD version 5.0.0. Use evpn_ethernet_segment.route_target instead. | + | [    lacp_id](## "port_channel_interfaces.[].lacp_id") | String | | | | LACP ID with format xxxx.xxxx.xxxx. | | [    spanning_tree_bpdufilter](## "port_channel_interfaces.[].spanning_tree_bpdufilter") | String | | | Valid Values:
- enabled
- disabled
- True
- False
- true
- false | | | [    spanning_tree_bpduguard](## "port_channel_interfaces.[].spanning_tree_bpduguard") | String | | | Valid Values:
- enabled
- disabled
- True
- False
- true
- false | | | [    spanning_tree_guard](## "port_channel_interfaces.[].spanning_tree_guard") | String | | | Valid Values:
- loop
- root
- disabled | | @@ -142,9 +143,10 @@ | [      sync_message](## "port_channel_interfaces.[].ptp.sync_message") | Dictionary | | | | | | [        interval](## "port_channel_interfaces.[].ptp.sync_message.interval") | Integer | | | | | | [      role](## "port_channel_interfaces.[].ptp.role") | String | | | Valid Values:
- master
- dynamic | | - | [      vlan](## "port_channel_interfaces.[].ptp.vlan") | String | | | | VLAN can be 'all' or list of vlans as string | + | [      vlan](## "port_channel_interfaces.[].ptp.vlan") | String | | | | VLAN can be 'all' or list of vlans as string. | | [      transport](## "port_channel_interfaces.[].ptp.transport") | String | | | Valid Values:
- ipv4
- ipv6
- layer2 | | - | [    ip_address](## "port_channel_interfaces.[].ip_address") | String | | | | IPv4 address/mask | + | [      mpass](## "port_channel_interfaces.[].ptp.mpass") | Boolean | | | | When MPASS is enabled on an MLAG port-channel, MLAG peers coordinate to function as a single PTP logical device.
Arista PTP enabled devices always place PTP messages on the same physical link within the port-channel.
Hence, MPASS is needed only on MLAG port-channels connected to non-Arista devices. | + | [    ip_address](## "port_channel_interfaces.[].ip_address") | String | | | | IPv4 address/mask. | | [    ip_verify_unicast_source_reachable_via](## "port_channel_interfaces.[].ip_verify_unicast_source_reachable_via") | String | | | Valid Values:
- any
- rx | | | [    ip_nat](## "port_channel_interfaces.[].ip_nat") | Dictionary | | | | | | [      destination](## "port_channel_interfaces.[].ip_nat.destination") | Dictionary | | | | | @@ -154,50 +156,50 @@ | [            pool_name](## "port_channel_interfaces.[].ip_nat.destination.dynamic.[].pool_name") | String | Required | | | | | [            priority](## "port_channel_interfaces.[].ip_nat.destination.dynamic.[].priority") | Integer | | | Min: 0
Max: 4294967295 | | | [        static](## "port_channel_interfaces.[].ip_nat.destination.static") | List, items: Dictionary | | | | | - | [          - access_list](## "port_channel_interfaces.[].ip_nat.destination.static.[].access_list") | String | | | | 'access_list' and 'group' are mutual exclusive | + | [          - access_list](## "port_channel_interfaces.[].ip_nat.destination.static.[].access_list") | String | | | | 'access_list' and 'group' are mutual exclusive. | | [            comment](## "port_channel_interfaces.[].ip_nat.destination.static.[].comment") | String | | | | | | [            direction](## "port_channel_interfaces.[].ip_nat.destination.static.[].direction") | String | | | Valid Values:
- egress
- ingress | Egress or ingress can be the default. This depends on source/destination, EOS version, and hardware platform.
EOS might remove this keyword in the configuration. So, check the configuration on targeted HW/SW.
| - | [            group](## "port_channel_interfaces.[].ip_nat.destination.static.[].group") | Integer | | | Min: 1
Max: 65535 | 'access_list' and 'group' are mutual exclusive | - | [            original_ip](## "port_channel_interfaces.[].ip_nat.destination.static.[].original_ip") | String | Required, Unique | | | IPv4 address | - | [            original_port](## "port_channel_interfaces.[].ip_nat.destination.static.[].original_port") | Integer | | | Min: 1
Max: 65535 | | + | [            group](## "port_channel_interfaces.[].ip_nat.destination.static.[].group") | Integer | | | Min: 1
Max: 65535 | 'access_list' and 'group' are mutual exclusive. | + | [            original_ip](## "port_channel_interfaces.[].ip_nat.destination.static.[].original_ip") | String | | | | IPv4 address. The combination of `original_ip` and `original_port` must be unique. | + | [            original_port](## "port_channel_interfaces.[].ip_nat.destination.static.[].original_port") | Integer | | | Min: 1
Max: 65535 | TCP/UDP port. The combination of `original_ip` and `original_port` must be unique. | | [            priority](## "port_channel_interfaces.[].ip_nat.destination.static.[].priority") | Integer | | | Min: 0
Max: 4294967295 | | | [            protocol](## "port_channel_interfaces.[].ip_nat.destination.static.[].protocol") | String | | | Valid Values:
- udp
- tcp | | - | [            translated_ip](## "port_channel_interfaces.[].ip_nat.destination.static.[].translated_ip") | String | Required | | | IPv4 address | - | [            translated_port](## "port_channel_interfaces.[].ip_nat.destination.static.[].translated_port") | Integer | | | Min: 1
Max: 65535 | requires 'original_port' | + | [            translated_ip](## "port_channel_interfaces.[].ip_nat.destination.static.[].translated_ip") | String | Required | | | IPv4 address. | + | [            translated_port](## "port_channel_interfaces.[].ip_nat.destination.static.[].translated_port") | Integer | | | Min: 1
Max: 65535 | requires 'original_port'. | | [      source](## "port_channel_interfaces.[].ip_nat.source") | Dictionary | | | | | | [        dynamic](## "port_channel_interfaces.[].ip_nat.source.dynamic") | List, items: Dictionary | | | | | | [          - access_list](## "port_channel_interfaces.[].ip_nat.source.dynamic.[].access_list") | String | Required, Unique | | | | | [            comment](## "port_channel_interfaces.[].ip_nat.source.dynamic.[].comment") | String | | | | | | [            nat_type](## "port_channel_interfaces.[].ip_nat.source.dynamic.[].nat_type") | String | Required | | Valid Values:
- overload
- pool
- pool-address-only
- pool-full-cone | | - | [            pool_name](## "port_channel_interfaces.[].ip_nat.source.dynamic.[].pool_name") | String | | | | required if 'nat_type' is pool, pool-address-only or pool-full-cone
ignored if 'nat_type' is overload
| + | [            pool_name](## "port_channel_interfaces.[].ip_nat.source.dynamic.[].pool_name") | String | | | | required if 'nat_type' is pool, pool-address-only or pool-full-cone.
ignored if 'nat_type' is overload.
| | [            priority](## "port_channel_interfaces.[].ip_nat.source.dynamic.[].priority") | Integer | | | Min: 0
Max: 4294967295 | | | [        static](## "port_channel_interfaces.[].ip_nat.source.static") | List, items: Dictionary | | | | | - | [          - access_list](## "port_channel_interfaces.[].ip_nat.source.static.[].access_list") | String | | | | 'access_list' and 'group' are mutual exclusive | + | [          - access_list](## "port_channel_interfaces.[].ip_nat.source.static.[].access_list") | String | | | | 'access_list' and 'group' are mutual exclusive. | | [            comment](## "port_channel_interfaces.[].ip_nat.source.static.[].comment") | String | | | | | | [            direction](## "port_channel_interfaces.[].ip_nat.source.static.[].direction") | String | | | Valid Values:
- egress
- ingress | Egress or ingress can be the default. This depends on source/destination, EOS version, and hardware platform.
EOS might remove this keyword in the configuration. So, check the configuration on targeted HW/SW.
| - | [            group](## "port_channel_interfaces.[].ip_nat.source.static.[].group") | Integer | | | Min: 1
Max: 65535 | 'access_list' and 'group' are mutual exclusive | - | [            original_ip](## "port_channel_interfaces.[].ip_nat.source.static.[].original_ip") | String | Required, Unique | | | IPv4 address | - | [            original_port](## "port_channel_interfaces.[].ip_nat.source.static.[].original_port") | Integer | | | Min: 1
Max: 65535 | | + | [            group](## "port_channel_interfaces.[].ip_nat.source.static.[].group") | Integer | | | Min: 1
Max: 65535 | 'access_list' and 'group' are mutual exclusive. | + | [            original_ip](## "port_channel_interfaces.[].ip_nat.source.static.[].original_ip") | String | | | | IPv4 address. The combination of `original_ip` and `original_port` must be unique. | + | [            original_port](## "port_channel_interfaces.[].ip_nat.source.static.[].original_port") | Integer | | | Min: 1
Max: 65535 | TCP/UDP port. The combination of `original_ip` and `original_port` must be unique. | | [            priority](## "port_channel_interfaces.[].ip_nat.source.static.[].priority") | Integer | | | Min: 0
Max: 4294967295 | | | [            protocol](## "port_channel_interfaces.[].ip_nat.source.static.[].protocol") | String | | | Valid Values:
- udp
- tcp | | - | [            translated_ip](## "port_channel_interfaces.[].ip_nat.source.static.[].translated_ip") | String | Required | | | IPv4 address | - | [            translated_port](## "port_channel_interfaces.[].ip_nat.source.static.[].translated_port") | Integer | | | Min: 1
Max: 65535 | requires 'original_port' | + | [            translated_ip](## "port_channel_interfaces.[].ip_nat.source.static.[].translated_ip") | String | Required | | | IPv4 address. | + | [            translated_port](## "port_channel_interfaces.[].ip_nat.source.static.[].translated_port") | Integer | | | Min: 1
Max: 65535 | requires 'original_port'. | | [    ipv6_enable](## "port_channel_interfaces.[].ipv6_enable") | Boolean | | | | | - | [    ipv6_address](## "port_channel_interfaces.[].ipv6_address") | String | | | | IPv6 address/mask | - | [    ipv6_address_link_local](## "port_channel_interfaces.[].ipv6_address_link_local") | String | | | | Link local IPv6 address/mask | + | [    ipv6_address](## "port_channel_interfaces.[].ipv6_address") | String | | | | IPv6 address/mask. | + | [    ipv6_address_link_local](## "port_channel_interfaces.[].ipv6_address_link_local") | String | | | | Link local IPv6 address/mask. | | [    ipv6_nd_ra_disabled](## "port_channel_interfaces.[].ipv6_nd_ra_disabled") | Boolean | | | | | | [    ipv6_nd_managed_config_flag](## "port_channel_interfaces.[].ipv6_nd_managed_config_flag") | Boolean | | | | | | [    ipv6_nd_prefixes](## "port_channel_interfaces.[].ipv6_nd_prefixes") | List, items: Dictionary | | | | | | [      - ipv6_prefix](## "port_channel_interfaces.[].ipv6_nd_prefixes.[].ipv6_prefix") | String | Required, Unique | | | | - | [        valid_lifetime](## "port_channel_interfaces.[].ipv6_nd_prefixes.[].valid_lifetime") | String | | | | Infinite or lifetime in seconds | - | [        preferred_lifetime](## "port_channel_interfaces.[].ipv6_nd_prefixes.[].preferred_lifetime") | String | | | | Infinite or lifetime in seconds | + | [        valid_lifetime](## "port_channel_interfaces.[].ipv6_nd_prefixes.[].valid_lifetime") | String | | | | Infinite or lifetime in seconds. | + | [        preferred_lifetime](## "port_channel_interfaces.[].ipv6_nd_prefixes.[].preferred_lifetime") | String | | | | Infinite or lifetime in seconds. | | [        no_autoconfig_flag](## "port_channel_interfaces.[].ipv6_nd_prefixes.[].no_autoconfig_flag") | Boolean | | | | | - | [    access_group_in](## "port_channel_interfaces.[].access_group_in") | String | | | | Access list name | - | [    access_group_out](## "port_channel_interfaces.[].access_group_out") | String | | | | Access list name | - | [    ipv6_access_group_in](## "port_channel_interfaces.[].ipv6_access_group_in") | String | | | | IPv6 access list name | - | [    ipv6_access_group_out](## "port_channel_interfaces.[].ipv6_access_group_out") | String | | | | IPv6 access list name | - | [    mac_access_group_in](## "port_channel_interfaces.[].mac_access_group_in") | String | | | | MAC access list name | - | [    mac_access_group_out](## "port_channel_interfaces.[].mac_access_group_out") | String | | | | MAC access list name | + | [    access_group_in](## "port_channel_interfaces.[].access_group_in") | String | | | | Access list name. | + | [    access_group_out](## "port_channel_interfaces.[].access_group_out") | String | | | | Access list name. | + | [    ipv6_access_group_in](## "port_channel_interfaces.[].ipv6_access_group_in") | String | | | | IPv6 access list name. | + | [    ipv6_access_group_out](## "port_channel_interfaces.[].ipv6_access_group_out") | String | | | | IPv6 access list name. | + | [    mac_access_group_in](## "port_channel_interfaces.[].mac_access_group_in") | String | | | | MAC access list name. | + | [    mac_access_group_out](## "port_channel_interfaces.[].mac_access_group_out") | String | | | | MAC access list name. | | [    pim](## "port_channel_interfaces.[].pim") | Dictionary | | | | | | [      ipv4](## "port_channel_interfaces.[].pim.ipv4") | Dictionary | | | | | | [        border_router](## "port_channel_interfaces.[].pim.ipv4.border_router") | Boolean | | | | Configure PIM border router. EOS default is false. | @@ -208,21 +210,21 @@ | [        hello](## "port_channel_interfaces.[].pim.ipv4.hello") | Dictionary | | | | | | [          count](## "port_channel_interfaces.[].pim.ipv4.hello.count") | String | | | | Number of missed hellos after which the neighbor expires. Range <1.5-65535>. | | [          interval](## "port_channel_interfaces.[].pim.ipv4.hello.interval") | Integer | | | Min: 1
Max: 65535 | PIM hello interval in seconds. | - | [    service_profile](## "port_channel_interfaces.[].service_profile") | String | | | | QOS profile | + | [    service_profile](## "port_channel_interfaces.[].service_profile") | String | | | | QOS profile. | | [    ospf_network_point_to_point](## "port_channel_interfaces.[].ospf_network_point_to_point") | Boolean | | | | | | [    ospf_area](## "port_channel_interfaces.[].ospf_area") | String | | | | | | [    ospf_cost](## "port_channel_interfaces.[].ospf_cost") | Integer | | | | | | [    ospf_authentication](## "port_channel_interfaces.[].ospf_authentication") | String | | | Valid Values:
- none
- simple
- message-digest | | - | [    ospf_authentication_key](## "port_channel_interfaces.[].ospf_authentication_key") | String | | | | Encrypted password | + | [    ospf_authentication_key](## "port_channel_interfaces.[].ospf_authentication_key") | String | | | | Encrypted password. | | [    ospf_message_digest_keys](## "port_channel_interfaces.[].ospf_message_digest_keys") | List, items: Dictionary | | | | | | [      - id](## "port_channel_interfaces.[].ospf_message_digest_keys.[].id") | Integer | Required, Unique | | | | | [        hash_algorithm](## "port_channel_interfaces.[].ospf_message_digest_keys.[].hash_algorithm") | String | | | Valid Values:
- md5
- sha1
- sha256
- sha384
- sha512 | | - | [        key](## "port_channel_interfaces.[].ospf_message_digest_keys.[].key") | String | | | | Encrypted password | + | [        key](## "port_channel_interfaces.[].ospf_message_digest_keys.[].key") | String | | | | Encrypted password. | | [    flow_tracker](## "port_channel_interfaces.[].flow_tracker") | Dictionary | | | | | | [      sampled](## "port_channel_interfaces.[].flow_tracker.sampled") | String | | | | Sampled flow tracker name. | | [      hardware](## "port_channel_interfaces.[].flow_tracker.hardware") | String | | | | Hardware flow tracker name. | | [    bgp](## "port_channel_interfaces.[].bgp") | Dictionary | | | | | - | [      session_tracker](## "port_channel_interfaces.[].bgp.session_tracker") | String | | | | Name of session tracker | + | [      session_tracker](## "port_channel_interfaces.[].bgp.session_tracker") | String | | | | Name of session tracker. | | [    ip_igmp_host_proxy](## "port_channel_interfaces.[].ip_igmp_host_proxy") | Dictionary | | | | | | [      enabled](## "port_channel_interfaces.[].ip_igmp_host_proxy.enabled") | Boolean | | | | | | [      groups](## "port_channel_interfaces.[].ip_igmp_host_proxy.groups") | List, items: Dictionary | | | | | @@ -235,16 +237,16 @@ | [      access_lists](## "port_channel_interfaces.[].ip_igmp_host_proxy.access_lists") | List, items: Dictionary | | | | Non-standard Access List name. | | [        - name](## "port_channel_interfaces.[].ip_igmp_host_proxy.access_lists.[].name") | String | Required, Unique | | | | | [      version](## "port_channel_interfaces.[].ip_igmp_host_proxy.version") | Integer | | | Min: 1
Max: 3 | IGMP version on IGMP host-proxy interface. | - | [    peer](## "port_channel_interfaces.[].peer") | String | | | | Key only used for documentation or validation purposes | - | [    peer_interface](## "port_channel_interfaces.[].peer_interface") | String | | | | Key only used for documentation or validation purposes | - | [    peer_type](## "port_channel_interfaces.[].peer_type") | String | | | | Key only used for documentation or validation purposes | + | [    peer](## "port_channel_interfaces.[].peer") | String | | | | Key only used for documentation or validation purposes. | + | [    peer_interface](## "port_channel_interfaces.[].peer_interface") | String | | | | Key only used for documentation or validation purposes. | + | [    peer_type](## "port_channel_interfaces.[].peer_type") | String | | | | Key only used for documentation or validation purposes. | | [    sflow](## "port_channel_interfaces.[].sflow") | Dictionary | | | | | | [      enable](## "port_channel_interfaces.[].sflow.enable") | Boolean | | | | | | [      egress](## "port_channel_interfaces.[].sflow.egress") | Dictionary | | | | | | [        enable](## "port_channel_interfaces.[].sflow.egress.enable") | Boolean | | | | | | [        unmodified_enable](## "port_channel_interfaces.[].sflow.egress.unmodified_enable") | Boolean | | | | | - | [    validate_state](## "port_channel_interfaces.[].validate_state") | Boolean | | | | Set to false to disable interface validation by the `eos_validate_state` role | - | [    eos_cli](## "port_channel_interfaces.[].eos_cli") | String | | | | Multiline EOS CLI rendered directly on the port-channel interface in the final EOS configuration | + | [    validate_state](## "port_channel_interfaces.[].validate_state") | Boolean | | | | Set to false to disable interface validation by the `eos_validate_state` role. | + | [    eos_cli](## "port_channel_interfaces.[].eos_cli") | String | | | | Multiline EOS CLI rendered directly on the port-channel interface in the final EOS configuration. | === "YAML" @@ -260,15 +262,15 @@ storm_control_discards: shutdown: - # "l2_mtu" should only be defined for platforms supporting the "l2 mtu" CLI + # "l2_mtu" should only be defined for platforms supporting the "l2 mtu" CLI. l2_mtu: - # "l2_mru" should only be defined for platforms supporting the "l2 mru" CLI + # "l2_mru" should only be defined for platforms supporting the "l2 mru" CLI. l2_mru: - # List of switchport vlans as string - # For a trunk port this would be a range like "1-200,300" - # For an access port this would be a single vlan "123" + # List of switchport vlans as string. + # For a trunk port this would be a range like "1-200,300". + # For an access port this would be a single vlan "123". vlans: snmp_trap_link_change: @@ -276,49 +278,49 @@ # Interface will not be listed in device documentation, unless "type" is set. type: - # VLAN tag to configure on sub-interface + # VLAN tag to configure on sub-interface. encapsulation_dot1q_vlan: - # VRF name + # VRF name. vrf: encapsulation_vlan: client: dot1q: - # Client VLAN ID + # Client VLAN ID. vlan: - # Client Outer VLAN ID + # Client Outer VLAN ID. outer: - # Client Inner VLAN ID + # Client Inner VLAN ID. inner: unmatched: - # Network encapsulation are all optional, and skipped if using client unmatched + # Network encapsulation are all optional, and skipped if using client unmatched. network: dot1q: - # Network VLAN ID + # Network VLAN ID. vlan: - # Network Outer VLAN ID + # Network Outer VLAN ID. outer: - # Network Inner VLAN ID + # Network Inner VLAN ID. inner: client: vlan_id: mode: - # If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence + # If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence. native_vlan: - # If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence + # If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence. native_vlan_tag: link_tracking_groups: - # Group name + # Group name. - name: direction: phone: @@ -326,36 +328,36 @@ vlan: l2_protocol: - # Vlan tag to configure on sub-interface + # Vlan tag to configure on sub-interface. encapsulation_dot1q_vlan: - # L2 protocol forwarding profile + # L2 protocol forwarding profile. forwarding_profile: mtu: - # MLAG ID + # MLAG ID. mlag: trunk_groups: - - # Timeout in seconds + # Timeout in seconds. lacp_fallback_timeout: lacp_fallback_mode: qos: trust: - # DSCP value + # DSCP value. dscp: - # COS value + # COS value. cos: bfd: echo: - # Interval in milliseconds + # Interval in milliseconds. interval: - # Rate in milliseconds + # Rate in milliseconds. min_rx: multiplier: @@ -367,11 +369,11 @@ service_policy: pbr: - # Policy Based Routing Policy-map name + # Policy Based Routing Policy-map name. input: qos: - # Quality of Service Policy-map name + # Quality of Service Policy-map name. input: mpls: ip: @@ -380,20 +382,20 @@ igp_sync: trunk_private_vlan_secondary: - # List of vlans as string + # List of vlans as string. pvlan_mapping: vlan_translations: - # List of vlans as string (only one vlan if direction is "both") + # List of vlans as string (only one vlan if direction is "both"). - from: - # VLAN ID + # VLAN ID. to: direction: shape: - # Rate in kbps, pps or percent - # Supported options are platform dependent + # Rate in kbps, pps or percent. + # Supported options are platform dependent. # Examples: # - "5000 kbps" # - "1000 pps" @@ -402,36 +404,39 @@ storm_control: all: - # Configure maximum storm-control level + # Configure maximum storm-control level. level: - # Optional field and is hardware dependent + # Optional field and is hardware dependent. unit: broadcast: - # Configure maximum storm-control level + # Configure maximum storm-control level. level: - # Optional field and is hardware dependent + # Optional field and is hardware dependent. unit: multicast: - # Configure maximum storm-control level + # Configure maximum storm-control level. level: - # Optional field and is hardware dependent + # Optional field and is hardware dependent. unit: unknown_unicast: - # Configure maximum storm-control level + # Configure maximum storm-control level. level: - # Optional field and is hardware dependent + # Optional field and is hardware dependent. unit: ip_proxy_arp: - # ISIS instance + # ISIS instance. isis_enable: + + # Enable BFD for ISIS. + isis_bfd: isis_passive: isis_metric: isis_network_point_to_point: @@ -439,27 +444,27 @@ isis_hello_padding: isis_authentication_mode: - # Type-7 encrypted password + # Type-7 encrypted password. isis_authentication_key: traffic_policy: - # Ingress traffic policy + # Ingress traffic policy. input: - # Egress traffic policy + # Egress traffic policy. output: evpn_ethernet_segment: - # EVPN Ethernet Segment Identifier (Type 1 format) + # EVPN Ethernet Segment Identifier (Type 1 format). identifier: redundancy: designated_forwarder_election: algorithm: - # Preference_value is only used when "algorithm" is "preference" + # Preference_value is only used when "algorithm" is "preference". preference_value: - # Dont_preempt is only used when "algorithm" is "preference" + # Dont_preempt is only used when "algorithm" is "preference". dont_preempt: hold_time: subsequent_hold_time: @@ -468,24 +473,24 @@ shared_index: tunnel_flood_filter_time: - # EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx + # EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx. route_target: - # EVPN Ethernet Segment Identifier (Type 1 format) - # If both "esi" and "evpn_ethernet_segment.identifier" are defined, the new variable takes precedence + # EVPN Ethernet Segment Identifier (Type 1 format). + # If both "esi" and "evpn_ethernet_segment.identifier" are defined, the new variable takes precedence. # This key is deprecated. # Support will be removed in AVD version 5.0.0. # Use evpn_ethernet_segment.identifier instead. esi: - # EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx - # If both "rt" and "evpn_ethernet_segment.route_target" are defined, the new variable takes precedence + # EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx. + # If both "rt" and "evpn_ethernet_segment.route_target" are defined, the new variable takes precedence. # This key is deprecated. # Support will be removed in AVD version 5.0.0. # Use evpn_ethernet_segment.route_target instead. rt: - # LACP ID with format xxxx.xxxx.xxxx + # LACP ID with format xxxx.xxxx.xxxx. lacp_id: spanning_tree_bpdufilter: spanning_tree_bpduguard: @@ -503,11 +508,16 @@ interval: role: - # VLAN can be 'all' or list of vlans as string + # VLAN can be 'all' or list of vlans as string. vlan: transport: - # IPv4 address/mask + # When MPASS is enabled on an MLAG port-channel, MLAG peers coordinate to function as a single PTP logical device. + # Arista PTP enabled devices always place PTP messages on the same physical link within the port-channel. + # Hence, MPASS is needed only on MLAG port-channels connected to non-Arista devices. + mpass: + + # IPv4 address/mask. ip_address: ip_verify_unicast_source_reachable_via: ip_nat: @@ -519,7 +529,7 @@ priority: static: - # 'access_list' and 'group' are mutual exclusive + # 'access_list' and 'group' are mutual exclusive. - access_list: comment: @@ -527,19 +537,21 @@ # EOS might remove this keyword in the configuration. So, check the configuration on targeted HW/SW. direction: - # 'access_list' and 'group' are mutual exclusive + # 'access_list' and 'group' are mutual exclusive. group: - # IPv4 address - original_ip: + # IPv4 address. The combination of `original_ip` and `original_port` must be unique. + original_ip: + + # TCP/UDP port. The combination of `original_ip` and `original_port` must be unique. original_port: priority: protocol: - # IPv4 address + # IPv4 address. translated_ip: - # requires 'original_port' + # requires 'original_port'. translated_port: source: dynamic: @@ -547,13 +559,13 @@ comment: nat_type: - # required if 'nat_type' is pool, pool-address-only or pool-full-cone - # ignored if 'nat_type' is overload + # required if 'nat_type' is pool, pool-address-only or pool-full-cone. + # ignored if 'nat_type' is overload. pool_name: priority: static: - # 'access_list' and 'group' are mutual exclusive + # 'access_list' and 'group' are mutual exclusive. - access_list: comment: @@ -561,55 +573,57 @@ # EOS might remove this keyword in the configuration. So, check the configuration on targeted HW/SW. direction: - # 'access_list' and 'group' are mutual exclusive + # 'access_list' and 'group' are mutual exclusive. group: - # IPv4 address - original_ip: + # IPv4 address. The combination of `original_ip` and `original_port` must be unique. + original_ip: + + # TCP/UDP port. The combination of `original_ip` and `original_port` must be unique. original_port: priority: protocol: - # IPv4 address + # IPv4 address. translated_ip: - # requires 'original_port' + # requires 'original_port'. translated_port: ipv6_enable: - # IPv6 address/mask + # IPv6 address/mask. ipv6_address: - # Link local IPv6 address/mask + # Link local IPv6 address/mask. ipv6_address_link_local: ipv6_nd_ra_disabled: ipv6_nd_managed_config_flag: ipv6_nd_prefixes: - ipv6_prefix: - # Infinite or lifetime in seconds + # Infinite or lifetime in seconds. valid_lifetime: - # Infinite or lifetime in seconds + # Infinite or lifetime in seconds. preferred_lifetime: no_autoconfig_flag: - # Access list name + # Access list name. access_group_in: - # Access list name + # Access list name. access_group_out: - # IPv6 access list name + # IPv6 access list name. ipv6_access_group_in: - # IPv6 access list name + # IPv6 access list name. ipv6_access_group_out: - # MAC access list name + # MAC access list name. mac_access_group_in: - # MAC access list name + # MAC access list name. mac_access_group_out: pim: ipv4: @@ -630,20 +644,20 @@ # PIM hello interval in seconds. interval: - # QOS profile + # QOS profile. service_profile: ospf_network_point_to_point: ospf_area: ospf_cost: ospf_authentication: - # Encrypted password + # Encrypted password. ospf_authentication_key: ospf_message_digest_keys: - id: hash_algorithm: - # Encrypted password + # Encrypted password. key: flow_tracker: @@ -654,7 +668,7 @@ hardware: bgp: - # Name of session tracker + # Name of session tracker. session_tracker: ip_igmp_host_proxy: enabled: @@ -681,13 +695,13 @@ # IGMP version on IGMP host-proxy interface. version: - # Key only used for documentation or validation purposes + # Key only used for documentation or validation purposes. peer: - # Key only used for documentation or validation purposes + # Key only used for documentation or validation purposes. peer_interface: - # Key only used for documentation or validation purposes + # Key only used for documentation or validation purposes. peer_type: sflow: enable: @@ -695,9 +709,9 @@ enable: unmodified_enable: - # Set to false to disable interface validation by the `eos_validate_state` role + # Set to false to disable interface validation by the `eos_validate_state` role. validate_state: - # Multiline EOS CLI rendered directly on the port-channel interface in the final EOS configuration + # Multiline EOS CLI rendered directly on the port-channel interface in the final EOS configuration. eos_cli: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/prefix-lists.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/prefix-lists.md index 36564186605..399af30fe0c 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/prefix-lists.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/prefix-lists.md @@ -8,24 +8,24 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [prefix_lists](## "prefix_lists") | List, items: Dictionary | | | | | - | [  - name](## "prefix_lists.[].name") | String | Required, Unique | | | Prefix-list Name | + | [  - name](## "prefix_lists.[].name") | String | Required, Unique | | | Prefix-list Name. | | [    sequence_numbers](## "prefix_lists.[].sequence_numbers") | List, items: Dictionary | | | | | - | [      - sequence](## "prefix_lists.[].sequence_numbers.[].sequence") | Integer | Required, Unique | | | Sequence ID | - | [        action](## "prefix_lists.[].sequence_numbers.[].action") | String | Required | | | Action as string
Example: "permit 10.255.0.0/27 eq 32"
| + | [      - sequence](## "prefix_lists.[].sequence_numbers.[].sequence") | Integer | Required, Unique | | | Sequence ID. | + | [        action](## "prefix_lists.[].sequence_numbers.[].action") | String | Required | | | Action as string.
Example: "permit 10.255.0.0/27 eq 32"
| === "YAML" ```yaml prefix_lists: - # Prefix-list Name + # Prefix-list Name. - name: sequence_numbers: - # Sequence ID + # Sequence ID. - sequence: - # Action as string + # Action as string. # Example: "permit 10.255.0.0/27 eq 32" action: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ptp.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ptp.md index fc1b5a97477..089309e0b2f 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ptp.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/ptp.md @@ -11,9 +11,9 @@ | [  mode](## "ptp.mode") | String | | | Valid Values:
- boundary
- disabled
- e2etransparent
- gptp
- ordinarymaster
- p2ptransparent | | | [  mode_one_step](## "ptp.mode_one_step") | Boolean | | | | | | [  forward_unicast](## "ptp.forward_unicast") | Boolean | | | | | - | [  clock_identity](## "ptp.clock_identity") | String | | | | The clock-id in xx:xx:xx:xx:xx:xx format | + | [  clock_identity](## "ptp.clock_identity") | String | | | | The clock-id in xx:xx:xx:xx:xx:xx format. | | [  source](## "ptp.source") | Dictionary | | | | | - | [    ip](## "ptp.source.ip") | String | | | | Source IP | + | [    ip](## "ptp.source.ip") | String | | | | Source IP. | | [  priority1](## "ptp.priority1") | Integer | | | Min: 0
Max: 255 | | | [  priority2](## "ptp.priority2") | Integer | | | Min: 0
Max: 255 | | | [  ttl](## "ptp.ttl") | Integer | | | Min: 1
Max: 255 | | @@ -51,11 +51,11 @@ mode_one_step: forward_unicast: - # The clock-id in xx:xx:xx:xx:xx:xx format + # The clock-id in xx:xx:xx:xx:xx:xx format. clock_identity: source: - # Source IP + # Source IP. ip: priority1: priority2: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/qos-profiles.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/qos-profiles.md index efe2e264ab8..0afc95aff13 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/qos-profiles.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/qos-profiles.md @@ -8,128 +8,128 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [qos_profiles](## "qos_profiles") | List, items: Dictionary | | | | | - | [  - name](## "qos_profiles.[].name") | String | Required, Unique | | | Profile-Name | + | [  - name](## "qos_profiles.[].name") | String | Required, Unique | | | Profile-Name. | | [    trust](## "qos_profiles.[].trust") | String | | | Valid Values:
- cos
- dscp
- disabled | | | [    cos](## "qos_profiles.[].cos") | Integer | | | | | | [    dscp](## "qos_profiles.[].dscp") | Integer | | | | | | [    shape](## "qos_profiles.[].shape") | Dictionary | | | | | - | [      rate](## "qos_profiles.[].shape.rate") | String | | | | Supported options are platform dependent
Example: "< rate > kbps", "1-100 percent", "< rate > pps"
| + | [      rate](## "qos_profiles.[].shape.rate") | String | | | | Supported options are platform dependent.
Example: "< rate > kbps", "1-100 percent", "< rate > pps"
| | [    service_policy](## "qos_profiles.[].service_policy") | Dictionary | | | | | | [      type](## "qos_profiles.[].service_policy.type") | Dictionary | | | | | - | [        qos_input](## "qos_profiles.[].service_policy.type.qos_input") | String | | | | Policy-map name | + | [        qos_input](## "qos_profiles.[].service_policy.type.qos_input") | String | | | | Policy-map name. | | [    tx_queues](## "qos_profiles.[].tx_queues") | List, items: Dictionary | | | | | - | [      - id](## "qos_profiles.[].tx_queues.[].id") | Integer | Required, Unique | | | TX-Queue ID | + | [      - id](## "qos_profiles.[].tx_queues.[].id") | Integer | Required, Unique | | | TX-Queue ID. | | [        bandwidth_percent](## "qos_profiles.[].tx_queues.[].bandwidth_percent") | Integer | | | | | | [        bandwidth_guaranteed_percent](## "qos_profiles.[].tx_queues.[].bandwidth_guaranteed_percent") | Integer | | | | | | [        priority](## "qos_profiles.[].tx_queues.[].priority") | String | | | Valid Values:
- priority strict
- no priority | | | [        shape](## "qos_profiles.[].tx_queues.[].shape") | Dictionary | | | | | - | [          rate](## "qos_profiles.[].tx_queues.[].shape.rate") | String | | | | Supported options are platform dependent
Example: "< rate > kbps", "1-100 percent", "< rate > pps"
| - | [        comment](## "qos_profiles.[].tx_queues.[].comment") | String | | | | Text comment added to queue | + | [          rate](## "qos_profiles.[].tx_queues.[].shape.rate") | String | | | | Supported options are platform dependent.
Example: "< rate > kbps", "1-100 percent", "< rate > pps"
| + | [        comment](## "qos_profiles.[].tx_queues.[].comment") | String | | | | Text comment added to queue. | | [        random_detect](## "qos_profiles.[].tx_queues.[].random_detect") | Dictionary | | | | | - | [          ecn](## "qos_profiles.[].tx_queues.[].random_detect.ecn") | Dictionary | | | | Explicit Congestion Notification | - | [            count](## "qos_profiles.[].tx_queues.[].random_detect.ecn.count") | Boolean | | | | Enable counter for random-detect ECNs | + | [          ecn](## "qos_profiles.[].tx_queues.[].random_detect.ecn") | Dictionary | | | | Explicit Congestion Notification. | + | [            count](## "qos_profiles.[].tx_queues.[].random_detect.ecn.count") | Boolean | | | | Enable counter for random-detect ECNs. | | [            threshold](## "qos_profiles.[].tx_queues.[].random_detect.ecn.threshold") | Dictionary | | | | | | [              units](## "qos_profiles.[].tx_queues.[].random_detect.ecn.threshold.units") | String | Required | | Valid Values:
- segments
- bytes
- kbytes
- mbytes
- milliseconds | Units to be used for the threshold values.
This should be one of segments, byte, kbytes, mbytes. | - | [              min](## "qos_profiles.[].tx_queues.[].random_detect.ecn.threshold.min") | Integer | Required | | Min: 1 | Random-detect ECN minimum-threshold | - | [              max](## "qos_profiles.[].tx_queues.[].random_detect.ecn.threshold.max") | Integer | Required | | Min: 1 | Random-detect ECN maximum-threshold | - | [              max_probability](## "qos_profiles.[].tx_queues.[].random_detect.ecn.threshold.max_probability") | Integer | | | Min: 1
Max: 100 | Random-detect ECN maximum mark probability | - | [              weight](## "qos_profiles.[].tx_queues.[].random_detect.ecn.threshold.weight") | Integer | | | Min: 0
Max: 15 | Random-detect ECN weight | - | [          drop](## "qos_profiles.[].tx_queues.[].random_detect.drop") | Dictionary | | | | Set WRED parameters | + | [              min](## "qos_profiles.[].tx_queues.[].random_detect.ecn.threshold.min") | Integer | Required | | Min: 1 | Random-detect ECN minimum-threshold. | + | [              max](## "qos_profiles.[].tx_queues.[].random_detect.ecn.threshold.max") | Integer | Required | | Min: 1 | Random-detect ECN maximum-threshold. | + | [              max_probability](## "qos_profiles.[].tx_queues.[].random_detect.ecn.threshold.max_probability") | Integer | | | Min: 1
Max: 100 | Random-detect ECN maximum mark probability. | + | [              weight](## "qos_profiles.[].tx_queues.[].random_detect.ecn.threshold.weight") | Integer | | | Min: 0
Max: 15 | Random-detect ECN weight. | + | [          drop](## "qos_profiles.[].tx_queues.[].random_detect.drop") | Dictionary | | | | Set WRED parameters. | | [            threshold](## "qos_profiles.[].tx_queues.[].random_detect.drop.threshold") | Dictionary | | | | | | [              units](## "qos_profiles.[].tx_queues.[].random_detect.drop.threshold.units") | String | Required | | Valid Values:
- segments
- bytes
- kbytes
- mbytes
- microseconds
- milliseconds | Units to be used for the threshold values. | - | [              drop_precedence](## "qos_profiles.[].tx_queues.[].random_detect.drop.threshold.drop_precedence") | Integer | | | Min: 0
Max: 2 | Specify Drop Precendence value | - | [              min](## "qos_profiles.[].tx_queues.[].random_detect.drop.threshold.min") | Integer | Required | | Min: 1 | WRED minimum-threshold | - | [              max](## "qos_profiles.[].tx_queues.[].random_detect.drop.threshold.max") | Integer | Required | | Min: 1 | WRED maximum-threshold | + | [              drop_precedence](## "qos_profiles.[].tx_queues.[].random_detect.drop.threshold.drop_precedence") | Integer | | | Min: 0
Max: 2 | Specify Drop Precedence value. | + | [              min](## "qos_profiles.[].tx_queues.[].random_detect.drop.threshold.min") | Integer | Required | | Min: 1 | WRED minimum-threshold. | + | [              max](## "qos_profiles.[].tx_queues.[].random_detect.drop.threshold.max") | Integer | Required | | Min: 1 | WRED maximum-threshold. | | [              drop_probability](## "qos_profiles.[].tx_queues.[].random_detect.drop.threshold.drop_probability") | Integer | Required | | Min: 1
Max: 100 | WRED drop probability. | - | [              weight](## "qos_profiles.[].tx_queues.[].random_detect.drop.threshold.weight") | Integer | | | Min: 0
Max: 15 | WRED weight | + | [              weight](## "qos_profiles.[].tx_queues.[].random_detect.drop.threshold.weight") | Integer | | | Min: 0
Max: 15 | WRED weight. | | [    uc_tx_queues](## "qos_profiles.[].uc_tx_queues") | List, items: Dictionary | | | | | - | [      - id](## "qos_profiles.[].uc_tx_queues.[].id") | Integer | Required, Unique | | | UC TX queue ID | + | [      - id](## "qos_profiles.[].uc_tx_queues.[].id") | Integer | Required, Unique | | | UC TX queue ID. | | [        bandwidth_percent](## "qos_profiles.[].uc_tx_queues.[].bandwidth_percent") | Integer | | | | | | [        bandwidth_guaranteed_percent](## "qos_profiles.[].uc_tx_queues.[].bandwidth_guaranteed_percent") | Integer | | | | | | [        priority](## "qos_profiles.[].uc_tx_queues.[].priority") | String | | | Valid Values:
- priority strict
- no priority | | | [        shape](## "qos_profiles.[].uc_tx_queues.[].shape") | Dictionary | | | | | - | [          rate](## "qos_profiles.[].uc_tx_queues.[].shape.rate") | String | | | | Supported options are platform dependent
Example: "< rate > kbps", "1-100 percent", "< rate > pps"
| - | [        comment](## "qos_profiles.[].uc_tx_queues.[].comment") | String | | | | Text comment added to queue | + | [          rate](## "qos_profiles.[].uc_tx_queues.[].shape.rate") | String | | | | Supported options are platform dependent.
Example: "< rate > kbps", "1-100 percent", "< rate > pps"
| + | [        comment](## "qos_profiles.[].uc_tx_queues.[].comment") | String | | | | Text comment added to queue. | | [        random_detect](## "qos_profiles.[].uc_tx_queues.[].random_detect") | Dictionary | | | | | - | [          ecn](## "qos_profiles.[].uc_tx_queues.[].random_detect.ecn") | Dictionary | | | | Explicit Congestion Notification | - | [            count](## "qos_profiles.[].uc_tx_queues.[].random_detect.ecn.count") | Boolean | | | | Enable counter for random-detect ECNs | + | [          ecn](## "qos_profiles.[].uc_tx_queues.[].random_detect.ecn") | Dictionary | | | | Explicit Congestion Notification. | + | [            count](## "qos_profiles.[].uc_tx_queues.[].random_detect.ecn.count") | Boolean | | | | Enable counter for random-detect ECNs. | | [            threshold](## "qos_profiles.[].uc_tx_queues.[].random_detect.ecn.threshold") | Dictionary | | | | | - | [              units](## "qos_profiles.[].uc_tx_queues.[].random_detect.ecn.threshold.units") | String | Required | | Valid Values:
- segments
- bytes
- kbytes
- mbytes
- milliseconds | Unit to be used for the threshold values | - | [              min](## "qos_profiles.[].uc_tx_queues.[].random_detect.ecn.threshold.min") | Integer | Required | | Min: 1 | Random-detect ECN minimum-threshold | - | [              max](## "qos_profiles.[].uc_tx_queues.[].random_detect.ecn.threshold.max") | Integer | Required | | Min: 1 | Random-detect ECN maximum-threshold | - | [              max_probability](## "qos_profiles.[].uc_tx_queues.[].random_detect.ecn.threshold.max_probability") | Integer | | | Min: 1
Max: 100 | Random-detect ECN maximum mark probability | - | [              weight](## "qos_profiles.[].uc_tx_queues.[].random_detect.ecn.threshold.weight") | Integer | | | Min: 0
Max: 15 | Random-detect ECN weight | - | [          drop](## "qos_profiles.[].uc_tx_queues.[].random_detect.drop") | Dictionary | | | | Set WRED parameters | + | [              units](## "qos_profiles.[].uc_tx_queues.[].random_detect.ecn.threshold.units") | String | Required | | Valid Values:
- segments
- bytes
- kbytes
- mbytes
- milliseconds | Unit to be used for the threshold values. | + | [              min](## "qos_profiles.[].uc_tx_queues.[].random_detect.ecn.threshold.min") | Integer | Required | | Min: 1 | Random-detect ECN minimum-threshold. | + | [              max](## "qos_profiles.[].uc_tx_queues.[].random_detect.ecn.threshold.max") | Integer | Required | | Min: 1 | Random-detect ECN maximum-threshold. | + | [              max_probability](## "qos_profiles.[].uc_tx_queues.[].random_detect.ecn.threshold.max_probability") | Integer | | | Min: 1
Max: 100 | Random-detect ECN maximum mark probability. | + | [              weight](## "qos_profiles.[].uc_tx_queues.[].random_detect.ecn.threshold.weight") | Integer | | | Min: 0
Max: 15 | Random-detect ECN weight. | + | [          drop](## "qos_profiles.[].uc_tx_queues.[].random_detect.drop") | Dictionary | | | | Set WRED parameters. | | [            threshold](## "qos_profiles.[].uc_tx_queues.[].random_detect.drop.threshold") | Dictionary | | | | | | [              units](## "qos_profiles.[].uc_tx_queues.[].random_detect.drop.threshold.units") | String | Required | | Valid Values:
- segments
- bytes
- kbytes
- mbytes
- microseconds
- milliseconds | Units to be used for the threshold values. | - | [              drop_precedence](## "qos_profiles.[].uc_tx_queues.[].random_detect.drop.threshold.drop_precedence") | Integer | | | Min: 0
Max: 2 | Specify Drop Precendence value | - | [              min](## "qos_profiles.[].uc_tx_queues.[].random_detect.drop.threshold.min") | Integer | Required | | Min: 1 | WRED minimum-threshold | - | [              max](## "qos_profiles.[].uc_tx_queues.[].random_detect.drop.threshold.max") | Integer | Required | | Min: 1 | WRED maximum-threshold | + | [              drop_precedence](## "qos_profiles.[].uc_tx_queues.[].random_detect.drop.threshold.drop_precedence") | Integer | | | Min: 0
Max: 2 | Specify Drop Precedence value. | + | [              min](## "qos_profiles.[].uc_tx_queues.[].random_detect.drop.threshold.min") | Integer | Required | | Min: 1 | WRED minimum-threshold. | + | [              max](## "qos_profiles.[].uc_tx_queues.[].random_detect.drop.threshold.max") | Integer | Required | | Min: 1 | WRED maximum-threshold. | | [              drop_probability](## "qos_profiles.[].uc_tx_queues.[].random_detect.drop.threshold.drop_probability") | Integer | Required | | Min: 1
Max: 100 | WRED drop probability. | - | [              weight](## "qos_profiles.[].uc_tx_queues.[].random_detect.drop.threshold.weight") | Integer | | | Min: 0
Max: 15 | WRED weight | + | [              weight](## "qos_profiles.[].uc_tx_queues.[].random_detect.drop.threshold.weight") | Integer | | | Min: 0
Max: 15 | WRED weight. | | [    mc_tx_queues](## "qos_profiles.[].mc_tx_queues") | List, items: Dictionary | | | | | - | [      - id](## "qos_profiles.[].mc_tx_queues.[].id") | Integer | Required, Unique | | | MC TX queue ID | + | [      - id](## "qos_profiles.[].mc_tx_queues.[].id") | Integer | Required, Unique | | | MC TX queue ID. | | [        bandwidth_percent](## "qos_profiles.[].mc_tx_queues.[].bandwidth_percent") | Integer | | | | | | [        bandwidth_guaranteed_percent](## "qos_profiles.[].mc_tx_queues.[].bandwidth_guaranteed_percent") | Integer | | | | | | [        priority](## "qos_profiles.[].mc_tx_queues.[].priority") | String | | | Valid Values:
- priority strict
- no priority | | | [        shape](## "qos_profiles.[].mc_tx_queues.[].shape") | Dictionary | | | | | - | [          rate](## "qos_profiles.[].mc_tx_queues.[].shape.rate") | String | | | | Supported options are platform dependent
Example: "< rate > kbps", "1-100 percent", "< rate > pps"
| + | [          rate](## "qos_profiles.[].mc_tx_queues.[].shape.rate") | String | | | | Supported options are platform dependent.
Example: "< rate > kbps", "1-100 percent", "< rate > pps"
| | [        comment](## "qos_profiles.[].mc_tx_queues.[].comment") | String | | | | Text comment added to queue.
| - | [    priority_flow_control](## "qos_profiles.[].priority_flow_control") | Dictionary | | | | Priority Flow Control settings
| + | [    priority_flow_control](## "qos_profiles.[].priority_flow_control") | Dictionary | | | | Priority Flow Control settings.
| | [      enabled](## "qos_profiles.[].priority_flow_control.enabled") | Boolean | | | | Enable Priority Flow control.
| | [      watchdog](## "qos_profiles.[].priority_flow_control.watchdog") | Dictionary | | | | Watchdog can detect stuck transmit queues.
| | [        enabled](## "qos_profiles.[].priority_flow_control.watchdog.enabled") | Boolean | Required | | | Enable the watchdog on stuck transmit queues.
| | [        action](## "qos_profiles.[].priority_flow_control.watchdog.action") | String | | | Valid Values:
- drop
- notify-only | Override the default error-disable action to either drop
traffic on the stuck queue or notify-only
without making any actions on the stuck queue.
| | [        timer](## "qos_profiles.[].priority_flow_control.watchdog.timer") | Dictionary | | | | Timer thresholds whilst monitoring queues.
| - | [          timeout](## "qos_profiles.[].priority_flow_control.watchdog.timer.timeout") | String | Required | | Pattern: ^\d+(\.\d{1,2})?$ | Timeout in seconds after which port should be errdisabled or
should start dropping on congested priorities.
This should be decimal with up to 2 decimal point
Example: 0.01 or 60
| + | [          timeout](## "qos_profiles.[].priority_flow_control.watchdog.timer.timeout") | String | Required | | Pattern: ^\d+(\.\d{1,2})?$ | Timeout in seconds after which port should be errdisabled or
should start dropping on congested priorities.
This should be decimal with up to 2 decimal point.
Example: 0.01 or 60
| | [          polling_interval](## "qos_profiles.[].priority_flow_control.watchdog.timer.polling_interval") | String | Required | | Pattern: ^auto|\d+(\.\d{1,3})?$ | Time interval in seconds at which the watchdog should poll the queues.
This should be decimal with up to 3 decimal point or set
to 'auto' based on recovery_time and timeout values.
Example: 0.005 or 60
| | [          recovery_time](## "qos_profiles.[].priority_flow_control.watchdog.timer.recovery_time") | String | Required | | Pattern: ^\d+(\.\d{1,2})?$ | Recovery-time in seconds after which stuck queue should
recover and start forwarding again.
This should be decimal with up to 2 decimal point.
Example: 0.01 or 60
| | [          forced](## "qos_profiles.[].priority_flow_control.watchdog.timer.forced") | Boolean | | | | Force recover any stuck queue(s) after the duration,
irrespective of whether PFC frames are being
received or not.
| - | [      priorities](## "qos_profiles.[].priority_flow_control.priorities") | List, items: Dictionary | | | | Set the drop/no_drop on each queue
| - | [        - priority](## "qos_profiles.[].priority_flow_control.priorities.[].priority") | Integer | Required, Unique | | Min: 0
Max: 7 | Priority queue number (COS value)
| - | [          no_drop](## "qos_profiles.[].priority_flow_control.priorities.[].no_drop") | Boolean | Required | | | Enable Priority Flow Control frames on this queue
| + | [      priorities](## "qos_profiles.[].priority_flow_control.priorities") | List, items: Dictionary | | | | Set the drop/no_drop on each queue.
| + | [        - priority](## "qos_profiles.[].priority_flow_control.priorities.[].priority") | Integer | Required, Unique | | Min: 0
Max: 7 | Priority queue number (COS value).
| + | [          no_drop](## "qos_profiles.[].priority_flow_control.priorities.[].no_drop") | Boolean | Required | | | Enable Priority Flow Control frames on this queue.
| === "YAML" ```yaml qos_profiles: - # Profile-Name + # Profile-Name. - name: trust: cos: dscp: shape: - # Supported options are platform dependent + # Supported options are platform dependent. # Example: "< rate > kbps", "1-100 percent", "< rate > pps" rate: service_policy: type: - # Policy-map name + # Policy-map name. qos_input: tx_queues: - # TX-Queue ID + # TX-Queue ID. - id: bandwidth_percent: bandwidth_guaranteed_percent: priority: shape: - # Supported options are platform dependent + # Supported options are platform dependent. # Example: "< rate > kbps", "1-100 percent", "< rate > pps" rate: - # Text comment added to queue + # Text comment added to queue. comment: random_detect: - # Explicit Congestion Notification + # Explicit Congestion Notification. ecn: - # Enable counter for random-detect ECNs + # Enable counter for random-detect ECNs. count: threshold: @@ -137,116 +137,116 @@ # This should be one of segments, byte, kbytes, mbytes. units: - # Random-detect ECN minimum-threshold + # Random-detect ECN minimum-threshold. min: =1; required> - # Random-detect ECN maximum-threshold + # Random-detect ECN maximum-threshold. max: =1; required> - # Random-detect ECN maximum mark probability + # Random-detect ECN maximum mark probability. max_probability: - # Random-detect ECN weight + # Random-detect ECN weight. weight: - # Set WRED parameters + # Set WRED parameters. drop: threshold: # Units to be used for the threshold values. units: - # Specify Drop Precendence value + # Specify Drop Precedence value. drop_precedence: - # WRED minimum-threshold + # WRED minimum-threshold. min: =1; required> - # WRED maximum-threshold + # WRED maximum-threshold. max: =1; required> # WRED drop probability. drop_probability: - # WRED weight + # WRED weight. weight: uc_tx_queues: - # UC TX queue ID + # UC TX queue ID. - id: bandwidth_percent: bandwidth_guaranteed_percent: priority: shape: - # Supported options are platform dependent + # Supported options are platform dependent. # Example: "< rate > kbps", "1-100 percent", "< rate > pps" rate: - # Text comment added to queue + # Text comment added to queue. comment: random_detect: - # Explicit Congestion Notification + # Explicit Congestion Notification. ecn: - # Enable counter for random-detect ECNs + # Enable counter for random-detect ECNs. count: threshold: - # Unit to be used for the threshold values + # Unit to be used for the threshold values. units: - # Random-detect ECN minimum-threshold + # Random-detect ECN minimum-threshold. min: =1; required> - # Random-detect ECN maximum-threshold + # Random-detect ECN maximum-threshold. max: =1; required> - # Random-detect ECN maximum mark probability + # Random-detect ECN maximum mark probability. max_probability: - # Random-detect ECN weight + # Random-detect ECN weight. weight: - # Set WRED parameters + # Set WRED parameters. drop: threshold: # Units to be used for the threshold values. units: - # Specify Drop Precendence value + # Specify Drop Precedence value. drop_precedence: - # WRED minimum-threshold + # WRED minimum-threshold. min: =1; required> - # WRED maximum-threshold + # WRED maximum-threshold. max: =1; required> # WRED drop probability. drop_probability: - # WRED weight + # WRED weight. weight: mc_tx_queues: - # MC TX queue ID + # MC TX queue ID. - id: bandwidth_percent: bandwidth_guaranteed_percent: priority: shape: - # Supported options are platform dependent + # Supported options are platform dependent. # Example: "< rate > kbps", "1-100 percent", "< rate > pps" rate: # Text comment added to queue. comment: - # Priority Flow Control settings + # Priority Flow Control settings. priority_flow_control: # Enable Priority Flow control. @@ -268,7 +268,7 @@ # Timeout in seconds after which port should be errdisabled or # should start dropping on congested priorities. - # This should be decimal with up to 2 decimal point + # This should be decimal with up to 2 decimal point. # Example: 0.01 or 60 timeout: @@ -289,12 +289,12 @@ # received or not. forced: - # Set the drop/no_drop on each queue + # Set the drop/no_drop on each queue. priorities: - # Priority queue number (COS value) + # Priority queue number (COS value). - priority: - # Enable Priority Flow Control frames on this queue + # Enable Priority Flow Control frames on this queue. no_drop: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/qos.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/qos.md index 542cb22e846..f6842b2be8c 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/qos.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/qos.md @@ -18,11 +18,11 @@ | [    traffic_class](## "qos.map.traffic_class") | List, items: String | | | | | | [      - <str>](## "qos.map.traffic_class.[]") | String | | | | Example: "1 to dscp 32"
| | [  rewrite_dscp](## "qos.rewrite_dscp") | Boolean | | | | | - | [  random_detect](## "qos.random_detect") | Dictionary | | | | Global random-detect settings | - | [    ecn](## "qos.random_detect.ecn") | Dictionary | | | | Global ECN Configuration | + | [  random_detect](## "qos.random_detect") | Dictionary | | | | Global random-detect settings. | + | [    ecn](## "qos.random_detect.ecn") | Dictionary | | | | Global ECN Configuration. | | [      allow_non_ect](## "qos.random_detect.ecn.allow_non_ect") | Dictionary | | | | | | [        enabled](## "qos.random_detect.ecn.allow_non_ect.enabled") | Boolean | | | | Allow non-ect and set drop-precedence 1 in a policy map simultaneously.
Check which command is required for your platform. | - | [        chip_based](## "qos.random_detect.ecn.allow_non_ect.chip_based") | Boolean | | | | Allow non-ect chip-based | + | [        chip_based](## "qos.random_detect.ecn.allow_non_ect.chip_based") | Boolean | | | | Allow non-ect chip-based. | === "YAML" @@ -47,10 +47,10 @@ - rewrite_dscp: - # Global random-detect settings + # Global random-detect settings. random_detect: - # Global ECN Configuration + # Global ECN Configuration. ecn: allow_non_ect: @@ -58,6 +58,6 @@ # Check which command is required for your platform. enabled: - # Allow non-ect chip-based + # Allow non-ect chip-based. chip_based: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/queue-monitor-length.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/queue-monitor-length.md index 35b81dde0e5..c5cf1a64890 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/queue-monitor-length.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/queue-monitor-length.md @@ -12,13 +12,13 @@ | [  default_thresholds](## "queue_monitor_length.default_thresholds") | Dictionary | | | | | | [    high](## "queue_monitor_length.default_thresholds.high") | Integer | Required | | | Default high threshold for Ethernet Interfaces.
| | [    low](## "queue_monitor_length.default_thresholds.low") | Integer | | | | Default low threshold for Ethernet Interfaces.
Low threshold support is platform dependent.
| - | [  log](## "queue_monitor_length.log") | Integer | | | | Logging interval in seconds | - | [  notifying](## "queue_monitor_length.notifying") | Boolean | | | | Should only be used for platforms supporting the "queue-monitor length notifying" CLI | + | [  log](## "queue_monitor_length.log") | Integer | | | | Logging interval in seconds. | + | [  notifying](## "queue_monitor_length.notifying") | Boolean | | | | Should only be used for platforms supporting the "queue-monitor length notifying" CLI. | | [  cpu](## "queue_monitor_length.cpu") | Dictionary | | | | | | [    thresholds](## "queue_monitor_length.cpu.thresholds") | Dictionary | | | | | | [      high](## "queue_monitor_length.cpu.thresholds.high") | Integer | Required | | | | | [      low](## "queue_monitor_length.cpu.thresholds.low") | Integer | | | | | - | [  tx_latency](## "queue_monitor_length.tx_latency") | Boolean | | | | Enable tx-latency mode | + | [  tx_latency](## "queue_monitor_length.tx_latency") | Boolean | | | | Enable tx-latency mode. | === "YAML" @@ -34,16 +34,16 @@ # Low threshold support is platform dependent. low: - # Logging interval in seconds + # Logging interval in seconds. log: - # Should only be used for platforms supporting the "queue-monitor length notifying" CLI + # Should only be used for platforms supporting the "queue-monitor length notifying" CLI. notifying: cpu: thresholds: high: low: - # Enable tx-latency mode + # Enable tx-latency mode. tx_latency: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/queue-monitor-streaming.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/queue-monitor-streaming.md index bc92e415ee1..d0346c46c47 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/queue-monitor-streaming.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/queue-monitor-streaming.md @@ -9,8 +9,8 @@ | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [queue_monitor_streaming](## "queue_monitor_streaming") | Dictionary | | | | | | [  enable](## "queue_monitor_streaming.enable") | Boolean | | | | | - | [  ip_access_group](## "queue_monitor_streaming.ip_access_group") | String | | | | Name of IP ACL | - | [  ipv6_access_group](## "queue_monitor_streaming.ipv6_access_group") | String | | | | Name of IPv6 ACL | + | [  ip_access_group](## "queue_monitor_streaming.ip_access_group") | String | | | | Name of IP ACL. | + | [  ipv6_access_group](## "queue_monitor_streaming.ipv6_access_group") | String | | | | Name of IPv6 ACL. | | [  max_connections](## "queue_monitor_streaming.max_connections") | Integer | | | Min: 1
Max: 100 | | | [  vrf](## "queue_monitor_streaming.vrf") | String | | | | | @@ -20,10 +20,10 @@ queue_monitor_streaming: enable: - # Name of IP ACL + # Name of IP ACL. ip_access_group: - # Name of IPv6 ACL + # Name of IPv6 ACL. ipv6_access_group: max_connections: vrf: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/radius-server.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/radius-server.md index aae430d7fb7..66e36ee613d 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/radius-server.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/radius-server.md @@ -12,14 +12,14 @@ | [    hostname](## "radius_server.attribute_32_include_in_access_req.hostname") | Boolean | | | | | | [    format](## "radius_server.attribute_32_include_in_access_req.format") | String | | | | Specify the format of the NAS-Identifier. If 'hostname' is set, this is ignored. | | [  dynamic_authorization](## "radius_server.dynamic_authorization") | Dictionary | | | | | - | [    port](## "radius_server.dynamic_authorization.port") | Integer | | | Min: 0
Max: 65535 | TCP Port | - | [    tls_ssl_profile](## "radius_server.dynamic_authorization.tls_ssl_profile") | String | | | | Name of TLS profile | + | [    port](## "radius_server.dynamic_authorization.port") | Integer | | | Min: 0
Max: 65535 | TCP Port. | + | [    tls_ssl_profile](## "radius_server.dynamic_authorization.tls_ssl_profile") | String | | | | Name of TLS profile. | | [  hosts](## "radius_server.hosts") | List, items: Dictionary | | | | | - | [    - host](## "radius_server.hosts.[].host") | String | Required, Unique | | | Host IP address or name | + | [    - host](## "radius_server.hosts.[].host") | String | Required, Unique | | | Host IP address or name. | | [      vrf](## "radius_server.hosts.[].vrf") | String | | | | | | [      timeout](## "radius_server.hosts.[].timeout") | Integer | | | Min: 1
Max: 1000 | | | [      retransmit](## "radius_server.hosts.[].retransmit") | Integer | | | Min: 0
Max: 100 | | - | [      key](## "radius_server.hosts.[].key") | String | | | | Encrypted key | + | [      key](## "radius_server.hosts.[].key") | String | | | | Encrypted key. | === "YAML" @@ -32,19 +32,19 @@ format: dynamic_authorization: - # TCP Port + # TCP Port. port: - # Name of TLS profile + # Name of TLS profile. tls_ssl_profile: hosts: - # Host IP address or name + # Host IP address or name. - host: vrf: timeout: retransmit: - # Encrypted key + # Encrypted key. key: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/radius-servers.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/radius-servers.md index 0c816a77b72..a9ccf627436 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/radius-servers.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/radius-servers.md @@ -8,9 +8,9 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [radius_servers](## "radius_servers") deprecated | List, items: Dictionary | | | | This key is deprecated. Support will be removed in AVD version v5.0.0. Use radius_server.hosts instead. | - | [  - host](## "radius_servers.[].host") | String | | | | Host IP address or name | + | [  - host](## "radius_servers.[].host") | String | | | | Host IP address or name. | | [    vrf](## "radius_servers.[].vrf") | String | | | | | - | [    key](## "radius_servers.[].key") | String | | | | Encrypted key | + | [    key](## "radius_servers.[].key") | String | | | | Encrypted key. | === "YAML" @@ -20,10 +20,10 @@ # Use radius_server.hosts instead. radius_servers: - # Host IP address or name + # Host IP address or name. - host: vrf: - # Encrypted key + # Encrypted key. key: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/redundancy.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/redundancy.md index 24cb6e514d0..08d443c8280 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/redundancy.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/redundancy.md @@ -8,13 +8,13 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [redundancy](## "redundancy") | Dictionary | | | | | - | [  protocol](## "redundancy.protocol") | String | | | | Redundancy Protocol | + | [  protocol](## "redundancy.protocol") | String | | | | Redundancy Protocol. | === "YAML" ```yaml redundancy: - # Redundancy Protocol + # Redundancy Protocol. protocol: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/role-input-validation.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/role-input-validation.md index be15e16d7a9..9cf132d557b 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/role-input-validation.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/role-input-validation.md @@ -7,7 +7,7 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | - | [avd_data_conversion_mode](## "avd_data_conversion_mode") | String | | `debug` | Valid Values:
- disabled
- error
- warning
- info
- debug
- quiet | Conversion Mode for AVD input data conversion.
Input data conversion will perform type conversion of input variables as defined in the schema.
The type conversion is intended to help the user to identify minor issues with the input data, while still allowing the data to be validated.
During conversion, messages will generated with information about the host(s) and key(s) which required conversion.
"disabled" means that conversion will not run - avoid this since conversion is also handling data deprecation and upgrade.
"error" will produce error messages and fail the task.
"warning" will produce warning messages.
"info" will produce regular log messages.
"debug" will produce hidden debug messages viewable with -v.
"quiet" will not produce any messages
| + | [avd_data_conversion_mode](## "avd_data_conversion_mode") | String | | `debug` | Valid Values:
- disabled
- error
- warning
- info
- debug
- quiet | Conversion Mode for AVD input data conversion.
Input data conversion will perform type conversion of input variables as defined in the schema.
The type conversion is intended to help the user to identify minor issues with the input data, while still allowing the data to be validated.
During conversion, messages will generated with information about the host(s) and key(s) which required conversion.
"disabled" means that conversion will not run - avoid this since conversion is also handling data deprecation and upgrade.
"error" will produce error messages and fail the task.
"warning" will produce warning messages.
"info" will produce regular log messages.
"debug" will produce hidden debug messages viewable with -v.
"quiet" will not produce any messages.
| | [avd_data_validation_mode](## "avd_data_validation_mode") | String | | `warning` | Valid Values:
- disabled
- error
- warning
- info
- debug | Validation Mode for AVD input data validation.
Input data validation will validate the input variables according to the schema.
During validation, messages will generated with information about the host(s) and key(s) which failed validation.
"disabled" means that validation will not run.
"error" will produce error messages and fail the task.
"warning" will produce warning messages.
"info" will produce regular log messages.
"debug" will produce hidden debug messages viewable with -v.
| === "YAML" @@ -22,7 +22,7 @@ # "warning" will produce warning messages. # "info" will produce regular log messages. # "debug" will produce hidden debug messages viewable with -v. - # "quiet" will not produce any messages + # "quiet" will not produce any messages. avd_data_conversion_mode: # Validation Mode for AVD input data validation. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/roles.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/roles.md index 6184dc23c30..0fffa47b314 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/roles.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/roles.md @@ -8,29 +8,29 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [roles](## "roles") | List, items: Dictionary | | | | | - | [  - name](## "roles.[].name") | String | | | | Role name | + | [  - name](## "roles.[].name") | String | | | | Role name. | | [    sequence_numbers](## "roles.[].sequence_numbers") | List, items: Dictionary | | | | | - | [      - sequence](## "roles.[].sequence_numbers.[].sequence") | Integer | | | | Sequence number | + | [      - sequence](## "roles.[].sequence_numbers.[].sequence") | Integer | | | | Sequence number. | | [        action](## "roles.[].sequence_numbers.[].action") | String | | | Valid Values:
- permit
- deny | | - | [        mode](## "roles.[].sequence_numbers.[].mode") | String | | | | "config", "config-all", "exec" or mode key as string
| - | [        command](## "roles.[].sequence_numbers.[].command") | String | | | | Command as string | + | [        mode](## "roles.[].sequence_numbers.[].mode") | String | | | | "config", "config-all", "exec" or mode key as string.
| + | [        command](## "roles.[].sequence_numbers.[].command") | String | | | | Command as string. | === "YAML" ```yaml roles: - # Role name + # Role name. - name: sequence_numbers: - # Sequence number + # Sequence number. - sequence: action: - # "config", "config-all", "exec" or mode key as string + # "config", "config-all", "exec" or mode key as string. mode: - # Command as string + # Command as string. command: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/route-maps.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/route-maps.md index c1f848a19e5..9634d65ff43 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/route-maps.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/route-maps.md @@ -8,16 +8,16 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [route_maps](## "route_maps") | List, items: Dictionary | | | | | - | [  - name](## "route_maps.[].name") | String | Required, Unique | | | Route-map Name | + | [  - name](## "route_maps.[].name") | String | Required, Unique | | | Route-map Name. | | [    sequence_numbers](## "route_maps.[].sequence_numbers") | List, items: Dictionary | Required | | | | - | [      - sequence](## "route_maps.[].sequence_numbers.[].sequence") | Integer | Required, Unique | | | Sequence ID | + | [      - sequence](## "route_maps.[].sequence_numbers.[].sequence") | Integer | Required, Unique | | | Sequence ID. | | [        type](## "route_maps.[].sequence_numbers.[].type") | String | Required | | Valid Values:
- permit
- deny | | | [        description](## "route_maps.[].sequence_numbers.[].description") | String | | | | | - | [        match](## "route_maps.[].sequence_numbers.[].match") | List, items: String | | | | List of "match" statements | - | [          - <str>](## "route_maps.[].sequence_numbers.[].match.[]") | String | | | | Match as string
Example: "ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY"
| - | [        set](## "route_maps.[].sequence_numbers.[].set") | List, items: String | | | | List of "set" statements | - | [          - <str>](## "route_maps.[].sequence_numbers.[].set.[]") | String | | | | Set as string
Example: "origin incomplete"
| - | [        sub_route_map](## "route_maps.[].sequence_numbers.[].sub_route_map") | String | | | | Name of Sub-Route-map | + | [        match](## "route_maps.[].sequence_numbers.[].match") | List, items: String | | | | List of "match" statements. | + | [          - <str>](## "route_maps.[].sequence_numbers.[].match.[]") | String | | | | Match as string.
Example: "ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY"
| + | [        set](## "route_maps.[].sequence_numbers.[].set") | List, items: String | | | | List of "set" statements. | + | [          - <str>](## "route_maps.[].sequence_numbers.[].set.[]") | String | | | | Set as string.
Example: "origin incomplete"
| + | [        sub_route_map](## "route_maps.[].sequence_numbers.[].sub_route_map") | String | | | | Name of Sub-Route-map. | | [        continue](## "route_maps.[].sequence_numbers.[].continue") | Dictionary | | | | | | [          enabled](## "route_maps.[].sequence_numbers.[].continue.enabled") | Boolean | | | | | | [          sequence_number](## "route_maps.[].sequence_numbers.[].continue.sequence_number") | Integer | | | | | @@ -27,30 +27,30 @@ ```yaml route_maps: - # Route-map Name + # Route-map Name. - name: sequence_numbers: # required - # Sequence ID + # Sequence ID. - sequence: type: description: - # List of "match" statements + # List of "match" statements. match: - # Match as string + # Match as string. # Example: "ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY" - - # List of "set" statements + # List of "set" statements. set: - # Set as string + # Set as string. # Example: "origin incomplete" - - # Name of Sub-Route-map + # Name of Sub-Route-map. sub_route_map: continue: enabled: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-adaptive-virtual-topology.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-adaptive-virtual-topology.md index 79cffb9793c..047556a3258 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-adaptive-virtual-topology.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-adaptive-virtual-topology.md @@ -10,13 +10,13 @@ | [router_adaptive_virtual_topology](## "router_adaptive_virtual_topology") | Dictionary | | | | | | [  topology_role](## "router_adaptive_virtual_topology.topology_role") | String | | | Valid Values:
- edge
- pathfinder
- transit region
- transit zone | Role name. | | [  region](## "router_adaptive_virtual_topology.region") | Dictionary | | | | Region name and ID. | - | [    name](## "router_adaptive_virtual_topology.region.name") | String | Required | | | | + | [    name](## "router_adaptive_virtual_topology.region.name") | String | Required | | Pattern: ^[A-Za-z0-9_.:{}\[\]-]+$ | | | [    id](## "router_adaptive_virtual_topology.region.id") | Integer | Required | | Min: 1
Max: 255 | | | [  zone](## "router_adaptive_virtual_topology.zone") | Dictionary | | | | Zone name and ID. | - | [    name](## "router_adaptive_virtual_topology.zone.name") | String | Required | | | | + | [    name](## "router_adaptive_virtual_topology.zone.name") | String | Required | | Pattern: ^[A-Za-z0-9_.:{}\[\]-]+$ | | | [    id](## "router_adaptive_virtual_topology.zone.id") | Integer | Required | | Min: 1
Max: 10000 | | | [  site](## "router_adaptive_virtual_topology.site") | Dictionary | | | | Site name and ID. | - | [    name](## "router_adaptive_virtual_topology.site.name") | String | Required | | | | + | [    name](## "router_adaptive_virtual_topology.site.name") | String | Required | | Pattern: ^[A-Za-z0-9_.:{}\[\]-]+$ | | | [    id](## "router_adaptive_virtual_topology.site.id") | Integer | Required | | Min: 1
Max: 10000 | | | [  profiles](## "router_adaptive_virtual_topology.profiles") | List, items: Dictionary | | | | | | [    - name](## "router_adaptive_virtual_topology.profiles.[].name") | String | Required, Unique | | | AVT Name. | diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-bfd.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-bfd.md index ad977f31e94..afa35d99ad5 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-bfd.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-bfd.md @@ -8,49 +8,49 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [router_bfd](## "router_bfd") | Dictionary | | | | | - | [  interval](## "router_bfd.interval") | Integer | | | | Rate in milliseconds | - | [  local_address](## "router_bfd.local_address") | String | | | | Configure BFD local IP/IPv6 address | - | [  min_rx](## "router_bfd.min_rx") | Integer | | | | Rate in milliseconds | + | [  interval](## "router_bfd.interval") | Integer | | | | Rate in milliseconds. | + | [  local_address](## "router_bfd.local_address") | String | | | | Configure BFD local IP/IPv6 address. | + | [  min_rx](## "router_bfd.min_rx") | Integer | | | | Rate in milliseconds. | | [  multiplier](## "router_bfd.multiplier") | Integer | | | Min: 3
Max: 50 | | | [  multihop](## "router_bfd.multihop") | Dictionary | | | | | - | [    interval](## "router_bfd.multihop.interval") | Integer | | | | Rate in milliseconds | - | [    min_rx](## "router_bfd.multihop.min_rx") | Integer | | | | Rate in milliseconds | + | [    interval](## "router_bfd.multihop.interval") | Integer | | | | Rate in milliseconds. | + | [    min_rx](## "router_bfd.multihop.min_rx") | Integer | | | | Rate in milliseconds. | | [    multiplier](## "router_bfd.multihop.multiplier") | Integer | | | Min: 3
Max: 50 | | | [  session_snapshot_interval](## "router_bfd.session_snapshot_interval") | Integer | | | Min: 1
Max: 3600 | Interval in seconds.
Intervals below 10 are considered "dangerous" on EOS and must have `session_snapshot_interval_dangerous` set to `true`. | | [  session_snapshot_interval_dangerous](## "router_bfd.session_snapshot_interval_dangerous") | Boolean | | | | | | [  sbfd](## "router_bfd.sbfd") | Dictionary | | | | | | [    local_interface](## "router_bfd.sbfd.local_interface") | Dictionary | | | | | - | [      name](## "router_bfd.sbfd.local_interface.name") | String | | | | Interface Name | + | [      name](## "router_bfd.sbfd.local_interface.name") | String | | | | Interface Name. | | [      protocols](## "router_bfd.sbfd.local_interface.protocols") | Dictionary | | | | | | [        ipv4](## "router_bfd.sbfd.local_interface.protocols.ipv4") | Boolean | | | | | | [        ipv6](## "router_bfd.sbfd.local_interface.protocols.ipv6") | Boolean | | | | | - | [    initiator_interval](## "router_bfd.sbfd.initiator_interval") | Integer | | | | Rate in milliseconds | + | [    initiator_interval](## "router_bfd.sbfd.initiator_interval") | Integer | | | | Rate in milliseconds. | | [    initiator_multiplier](## "router_bfd.sbfd.initiator_multiplier") | Integer | | | Min: 3
Max: 50 | | - | [    initiator_measurement_round_trip](## "router_bfd.sbfd.initiator_measurement_round_trip") | Boolean | | | | Enable round-trip delay measurement | + | [    initiator_measurement_round_trip](## "router_bfd.sbfd.initiator_measurement_round_trip") | Boolean | | | | Enable round-trip delay measurement. | | [    reflector](## "router_bfd.sbfd.reflector") | Dictionary | | | | | - | [      min_rx](## "router_bfd.sbfd.reflector.min_rx") | Integer | | | | Rate in milliseconds | - | [      local_discriminator](## "router_bfd.sbfd.reflector.local_discriminator") | String | | | | IPv4 address or 32 bit integer | + | [      min_rx](## "router_bfd.sbfd.reflector.min_rx") | Integer | | | | Rate in milliseconds. | + | [      local_discriminator](## "router_bfd.sbfd.reflector.local_discriminator") | String | | | | IPv4 address or 32 bit integer. | === "YAML" ```yaml router_bfd: - # Rate in milliseconds + # Rate in milliseconds. interval: - # Configure BFD local IP/IPv6 address + # Configure BFD local IP/IPv6 address. local_address: - # Rate in milliseconds + # Rate in milliseconds. min_rx: multiplier: multihop: - # Rate in milliseconds + # Rate in milliseconds. interval: - # Rate in milliseconds + # Rate in milliseconds. min_rx: multiplier: @@ -61,23 +61,23 @@ sbfd: local_interface: - # Interface Name + # Interface Name. name: protocols: ipv4: ipv6: - # Rate in milliseconds + # Rate in milliseconds. initiator_interval: initiator_multiplier: - # Enable round-trip delay measurement + # Enable round-trip delay measurement. initiator_measurement_round_trip: reflector: - # Rate in milliseconds + # Rate in milliseconds. min_rx: - # IPv4 address or 32 bit integer + # IPv4 address or 32 bit integer. local_discriminator: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-bgp.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-bgp.md index c456793f6b7..172a82695b5 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-bgp.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-bgp.md @@ -10,15 +10,15 @@ | [router_bgp](## "router_bgp") | Dictionary | | | | | | [  as](## "router_bgp.as") | String | | | | BGP AS <1-4294967295> or AS number in asdot notation "<1-65535>.<0-65535>".
For asdot notation in YAML inputs, the value must be put in quotes, to prevent it from being interpreted as a float number. | | [  as_notation](## "router_bgp.as_notation") | String | | | Valid Values:
- asdot
- asplain | BGP AS can be deplayed in the asplain <1-4294967295> or asdot notation "<1-65535>.<0-65535>". This flag indicates which mode is preferred - asplain is the default. | - | [  router_id](## "router_bgp.router_id") | String | | | | In IP address format A.B.C.D | + | [  router_id](## "router_bgp.router_id") | String | | | | In IP address format A.B.C.D. | | [  distance](## "router_bgp.distance") | Dictionary | | | | | | [    external_routes](## "router_bgp.distance.external_routes") | Integer | Required | | Min: 1
Max: 255 | | | [    internal_routes](## "router_bgp.distance.internal_routes") | Integer | Required | | Min: 1
Max: 255 | | | [    local_routes](## "router_bgp.distance.local_routes") | Integer | Required | | Min: 1
Max: 255 | | | [  graceful_restart](## "router_bgp.graceful_restart") | Dictionary | | | | | | [    enabled](## "router_bgp.graceful_restart.enabled") | Boolean | | | | | - | [    restart_time](## "router_bgp.graceful_restart.restart_time") | Integer | | | Min: 1
Max: 3600 | Number of seconds | - | [    stalepath_time](## "router_bgp.graceful_restart.stalepath_time") | Integer | | | Min: 1
Max: 3600 | Number of seconds | + | [    restart_time](## "router_bgp.graceful_restart.restart_time") | Integer | | | Min: 1
Max: 3600 | Number of seconds. | + | [    stalepath_time](## "router_bgp.graceful_restart.stalepath_time") | Integer | | | Min: 1
Max: 3600 | Number of seconds. | | [  graceful_restart_helper](## "router_bgp.graceful_restart_helper") | Dictionary | | | | | | [    enabled](## "router_bgp.graceful_restart_helper.enabled") | Boolean | | | | | | [    restart_time](## "router_bgp.graceful_restart_helper.restart_time") | Integer | | | Min: 1
Max: 100000000 | Number of seconds
graceful-restart-help long-lived and restart-time are mutually exclusive in CLI.
restart-time will take precedence if both are configured.
| @@ -29,8 +29,8 @@ | [  updates](## "router_bgp.updates") | Dictionary | | | | | | [    wait_for_convergence](## "router_bgp.updates.wait_for_convergence") | Boolean | | | | Disables FIB updates and route advertisement when the BGP instance is initiated until the BGP convergence state is reached.
| | [    wait_install](## "router_bgp.updates.wait_install") | Boolean | | | | Do not advertise reachability to a prefix until that prefix has been installed in hardware.
This will eliminate any temporary black holes due to a BGP speaker advertising reachability to a prefix that may not yet be installed into the forwarding plane.
| - | [  bgp_cluster_id](## "router_bgp.bgp_cluster_id") | String | | | | IP Address A.B.C.D | - | [  bgp_defaults](## "router_bgp.bgp_defaults") | List, items: String | | | | BGP command as string | + | [  bgp_cluster_id](## "router_bgp.bgp_cluster_id") | String | | | | IP Address A.B.C.D. | + | [  bgp_defaults](## "router_bgp.bgp_defaults") | List, items: String | | | | BGP command as string. | | [    - <str>](## "router_bgp.bgp_defaults.[]") | String | | | | | | [  bgp](## "router_bgp.bgp") | Dictionary | | | | | | [    default](## "router_bgp.bgp.default") | Dictionary | | | | | @@ -41,110 +41,136 @@ | [      always](## "router_bgp.bgp.route_reflector_preserve_attributes.always") | Boolean | | | | | | [    bestpath](## "router_bgp.bgp.bestpath") | Dictionary | | | | | | [      d_path](## "router_bgp.bgp.bestpath.d_path") | Boolean | | | | | - | [  listen_ranges](## "router_bgp.listen_ranges") | List, items: Dictionary | | | | Improved "listen_ranges" data model to support multiple listen ranges and additional filter capabilities
| - | [    - prefix](## "router_bgp.listen_ranges.[].prefix") | String | | | | IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I" | - | [      peer_id_include_router_id](## "router_bgp.listen_ranges.[].peer_id_include_router_id") | Boolean | | | | Include router ID as part of peer filter | - | [      peer_group](## "router_bgp.listen_ranges.[].peer_group") | String | | | | Peer group name | - | [      peer_filter](## "router_bgp.listen_ranges.[].peer_filter") | String | | | | Peer-filter name
note: `peer_filter` or `remote_as` is required but mutually exclusive.
If both are defined, `peer_filter` takes precedence
| + | [    redistribute_internal](## "router_bgp.bgp.redistribute_internal") | Boolean | | | | Allow redistribution of iBGP routes into an Interior Gateway Protocol (IGP). EOS default is true. | + | [  listen_ranges](## "router_bgp.listen_ranges") | List, items: Dictionary | | | | Improved "listen_ranges" data model to support multiple listen ranges and additional filter capabilities.
| + | [    - prefix](## "router_bgp.listen_ranges.[].prefix") | String | | | | IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I". | + | [      peer_id_include_router_id](## "router_bgp.listen_ranges.[].peer_id_include_router_id") | Boolean | | | | Include router ID as part of peer filter. | + | [      peer_group](## "router_bgp.listen_ranges.[].peer_group") | String | | | | Peer group name. | + | [      peer_filter](## "router_bgp.listen_ranges.[].peer_filter") | String | | | | Peer-filter name.
note: `peer_filter` or `remote_as` is required but mutually exclusive.
If both are defined, `peer_filter` takes precedence
| | [      remote_as](## "router_bgp.listen_ranges.[].remote_as") | String | | | | BGP AS <1-4294967295> or AS number in asdot notation "<1-65535>.<0-65535>".
For asdot notation in YAML inputs, the value must be put in quotes, to prevent it from being interpreted as a float number. | | [  peer_groups](## "router_bgp.peer_groups") | List, items: Dictionary | | | | | - | [    - name](## "router_bgp.peer_groups.[].name") | String | Required, Unique | | | Peer-group name | - | [      type](## "router_bgp.peer_groups.[].type") | String | | | | Key only used for documentation or validation purposes | + | [    - name](## "router_bgp.peer_groups.[].name") | String | Required, Unique | | | Peer-group name. | + | [      type](## "router_bgp.peer_groups.[].type") | String | | | | Key only used for documentation or validation purposes. | | [      remote_as](## "router_bgp.peer_groups.[].remote_as") | String | | | | BGP AS <1-4294967295> or AS number in asdot notation "<1-65535>.<0-65535>".
For asdot notation in YAML inputs, the value must be put in quotes, to prevent it from being interpreted as a float number. | | [      local_as](## "router_bgp.peer_groups.[].local_as") | String | | | | BGP AS <1-4294967295> or AS number in asdot notation "<1-65535>.<0-65535>".
For asdot notation in YAML inputs, the value must be put in quotes, to prevent it from being interpreted as a float number. | | [      description](## "router_bgp.peer_groups.[].description") | String | | | | | | [      shutdown](## "router_bgp.peer_groups.[].shutdown") | Boolean | | | | | - | [      as_path](## "router_bgp.peer_groups.[].as_path") | Dictionary | | | | BGP AS-PATH options | - | [        remote_as_replace_out](## "router_bgp.peer_groups.[].as_path.remote_as_replace_out") | Boolean | | | | Replace AS number with local AS number | - | [        prepend_own_disabled](## "router_bgp.peer_groups.[].as_path.prepend_own_disabled") | Boolean | | | | Disable prepending own AS number to AS path | - | [      remove_private_as](## "router_bgp.peer_groups.[].remove_private_as") | Dictionary | | | | Remove private AS numbers in outbound AS path | + | [      as_path](## "router_bgp.peer_groups.[].as_path") | Dictionary | | | | BGP AS-PATH options. | + | [        remote_as_replace_out](## "router_bgp.peer_groups.[].as_path.remote_as_replace_out") | Boolean | | | | Replace AS number with local AS number. | + | [        prepend_own_disabled](## "router_bgp.peer_groups.[].as_path.prepend_own_disabled") | Boolean | | | | Disable prepending own AS number to AS path. | + | [      remove_private_as](## "router_bgp.peer_groups.[].remove_private_as") | Dictionary | | | | Remove private AS numbers in outbound AS path. | | [        enabled](## "router_bgp.peer_groups.[].remove_private_as.enabled") | Boolean | | | | | | [        all](## "router_bgp.peer_groups.[].remove_private_as.all") | Boolean | | | | | | [        replace_as](## "router_bgp.peer_groups.[].remove_private_as.replace_as") | Boolean | | | | | | [      remove_private_as_ingress](## "router_bgp.peer_groups.[].remove_private_as_ingress") | Dictionary | | | | | | [        enabled](## "router_bgp.peer_groups.[].remove_private_as_ingress.enabled") | Boolean | | | | | | [        replace_as](## "router_bgp.peer_groups.[].remove_private_as_ingress.replace_as") | Boolean | | | | | - | [      peer_filter](## "router_bgp.peer_groups.[].peer_filter") deprecated | String | | | | Peer-filter name
note: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with
the new `listen_ranges` key above to avoid conflicts.
This key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead. | + | [      peer_filter](## "router_bgp.peer_groups.[].peer_filter") deprecated | String | | | | Peer-filter name.
note: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with
the new `listen_ranges` key above to avoid conflicts.
This key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead. | | [      next_hop_unchanged](## "router_bgp.peer_groups.[].next_hop_unchanged") | Boolean | | | | | - | [      update_source](## "router_bgp.peer_groups.[].update_source") | String | | | | IP address or interface name | + | [      update_source](## "router_bgp.peer_groups.[].update_source") | String | | | | IP address or interface name. | | [      route_reflector_client](## "router_bgp.peer_groups.[].route_reflector_client") | Boolean | | | | | | [      bfd](## "router_bgp.peer_groups.[].bfd") | Boolean | | | | Enable BFD. | | [      bfd_timers](## "router_bgp.peer_groups.[].bfd_timers") | Dictionary | | | | Override default BFD timers. BFD must be enabled with `bfd: true`. | | [        interval](## "router_bgp.peer_groups.[].bfd_timers.interval") | Integer | Required | | Min: 50
Max: 60000 | Interval in milliseconds. | | [        min_rx](## "router_bgp.peer_groups.[].bfd_timers.min_rx") | Integer | Required | | Min: 50
Max: 60000 | Rate in milliseconds. | | [        multiplier](## "router_bgp.peer_groups.[].bfd_timers.multiplier") | Integer | Required | | Min: 3
Max: 50 | | - | [      ebgp_multihop](## "router_bgp.peer_groups.[].ebgp_multihop") | Integer | | | Min: 1
Max: 255 | Time-to-live in range of hops | + | [      ebgp_multihop](## "router_bgp.peer_groups.[].ebgp_multihop") | Integer | | | Min: 1
Max: 255 | Time-to-live in range of hops. | | [      next_hop_self](## "router_bgp.peer_groups.[].next_hop_self") | Boolean | | | | | | [      password](## "router_bgp.peer_groups.[].password") | String | | | | | | [      passive](## "router_bgp.peer_groups.[].passive") | Boolean | | | | | | [      default_originate](## "router_bgp.peer_groups.[].default_originate") | Dictionary | | | | | | [        enabled](## "router_bgp.peer_groups.[].default_originate.enabled") | Boolean | | | | | | [        always](## "router_bgp.peer_groups.[].default_originate.always") | Boolean | | | | | - | [        route_map](## "router_bgp.peer_groups.[].default_originate.route_map") | String | | | | Route-map name | - | [      send_community](## "router_bgp.peer_groups.[].send_community") | String | | | | 'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)' | - | [      maximum_routes](## "router_bgp.peer_groups.[].maximum_routes") | Integer | | | Min: 0
Max: 4294967294 | Maximum number of routes (0 means unlimited) | - | [      maximum_routes_warning_limit](## "router_bgp.peer_groups.[].maximum_routes_warning_limit") | String | | | | Maximum number of routes after which a warning is issued (0 means never warn) or
Percentage of maximum number of routes at which to warn ("<1-100> percent")
| + | [        route_map](## "router_bgp.peer_groups.[].default_originate.route_map") | String | | | | Route-map name. | + | [      send_community](## "router_bgp.peer_groups.[].send_community") | String | | | | 'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'. | + | [      maximum_routes](## "router_bgp.peer_groups.[].maximum_routes") | Integer | | | Min: 0
Max: 4294967294 | Maximum number of routes (0 means unlimited). | + | [      maximum_routes_warning_limit](## "router_bgp.peer_groups.[].maximum_routes_warning_limit") | String | | | | Maximum number of routes after which a warning is issued (0 means never warn) or
Percentage of maximum number of routes at which to warn ("<1-100> percent").
| | [      maximum_routes_warning_only](## "router_bgp.peer_groups.[].maximum_routes_warning_only") | Boolean | | | | | + | [      missing_policy](## "router_bgp.peer_groups.[].missing_policy") | Dictionary | | | | Missing policy configuration for all address-families. | + | [        direction_in](## "router_bgp.peer_groups.[].missing_policy.direction_in") | Dictionary | | | | Missing policy inbound direction. | + | [          action](## "router_bgp.peer_groups.[].missing_policy.direction_in.action") | String | Required | | Valid Values:
- deny
- permit
- deny-in-out | Missing policy action. | + | [          include_community_list](## "router_bgp.peer_groups.[].missing_policy.direction_in.include_community_list") | Boolean | | | | Include community-list references in missing policy decision. | + | [          include_prefix_list](## "router_bgp.peer_groups.[].missing_policy.direction_in.include_prefix_list") | Boolean | | | | Include prefix-list references in missing policy decision. | + | [          include_sub_route_map](## "router_bgp.peer_groups.[].missing_policy.direction_in.include_sub_route_map") | Boolean | | | | Include sub-route-map references in missing policy decision. | + | [        direction_out](## "router_bgp.peer_groups.[].missing_policy.direction_out") | Dictionary | | | | Missing policy outbound direction. | + | [          action](## "router_bgp.peer_groups.[].missing_policy.direction_out.action") | String | Required | | Valid Values:
- deny
- permit
- deny-in-out | Missing policy action. | + | [          include_community_list](## "router_bgp.peer_groups.[].missing_policy.direction_out.include_community_list") | Boolean | | | | Include community-list references in missing policy decision. | + | [          include_prefix_list](## "router_bgp.peer_groups.[].missing_policy.direction_out.include_prefix_list") | Boolean | | | | Include prefix-list references in missing policy decision. | + | [          include_sub_route_map](## "router_bgp.peer_groups.[].missing_policy.direction_out.include_sub_route_map") | Boolean | | | | Include sub-route-map references in missing policy decision. | | [      link_bandwidth](## "router_bgp.peer_groups.[].link_bandwidth") | Dictionary | | | | | | [        enabled](## "router_bgp.peer_groups.[].link_bandwidth.enabled") | Boolean | | | | | - | [        default](## "router_bgp.peer_groups.[].link_bandwidth.default") | String | | | | nn.nn(K|M|G) link speed in bits/second | + | [        default](## "router_bgp.peer_groups.[].link_bandwidth.default") | String | | | | nn.nn(K|M|G) link speed in bits/second. | | [      allowas_in](## "router_bgp.peer_groups.[].allowas_in") | Dictionary | | | | | | [        enabled](## "router_bgp.peer_groups.[].allowas_in.enabled") | Boolean | | | | | - | [        times](## "router_bgp.peer_groups.[].allowas_in.times") | Integer | | | Min: 1
Max: 10 | Number of local ASNs allowed in a BGP update | + | [        times](## "router_bgp.peer_groups.[].allowas_in.times") | Integer | | | Min: 1
Max: 10 | Number of local ASNs allowed in a BGP update. | | [      weight](## "router_bgp.peer_groups.[].weight") | Integer | | | Min: 0
Max: 65535 | | - | [      timers](## "router_bgp.peer_groups.[].timers") | String | | | | BGP Keepalive and Hold Timer values in seconds as string "<0-3600> <0-3600>" | + | [      timers](## "router_bgp.peer_groups.[].timers") | String | | | | BGP Keepalive and Hold Timer values in seconds as string "<0-3600> <0-3600>". | | [      rib_in_pre_policy_retain](## "router_bgp.peer_groups.[].rib_in_pre_policy_retain") | Dictionary | | | | | | [        enabled](## "router_bgp.peer_groups.[].rib_in_pre_policy_retain.enabled") | Boolean | | | | | | [        all](## "router_bgp.peer_groups.[].rib_in_pre_policy_retain.all") | Boolean | | | | | - | [      route_map_in](## "router_bgp.peer_groups.[].route_map_in") | String | | | | Inbound route-map name | - | [      route_map_out](## "router_bgp.peer_groups.[].route_map_out") | String | | | | Outbound route-map name | - | [      bgp_listen_range_prefix](## "router_bgp.peer_groups.[].bgp_listen_range_prefix") deprecated | String | | | | IP prefix range
note: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with
the new `listen_ranges` key above to avoid conflicts.
This key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead. | + | [      route_map_in](## "router_bgp.peer_groups.[].route_map_in") | String | | | | Inbound route-map name. | + | [      route_map_out](## "router_bgp.peer_groups.[].route_map_out") | String | | | | Outbound route-map name. | + | [      bgp_listen_range_prefix](## "router_bgp.peer_groups.[].bgp_listen_range_prefix") deprecated | String | | | | IP prefix range.
note: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with
the new `listen_ranges` key above to avoid conflicts.
This key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead. | | [      session_tracker](## "router_bgp.peer_groups.[].session_tracker") | String | | | | | + | [      shared_secret](## "router_bgp.peer_groups.[].shared_secret") | Dictionary | | | | | + | [        profile](## "router_bgp.peer_groups.[].shared_secret.profile") | String | Required | | | Name of profile defined under `management_security`. | + | [        hash_algorithm](## "router_bgp.peer_groups.[].shared_secret.hash_algorithm") | String | Required | | Valid Values:
- aes-128-cmac-96
- hmac-sha-256
- hmac-sha1-96 | Note: Algorithm hmac-sha-256 requires EOS version 4.31.1F and above. | | [      ttl_maximum_hops](## "router_bgp.peer_groups.[].ttl_maximum_hops") | Integer | | | Min: 0
Max: 254 | Maximum number of hops. | | [  neighbors](## "router_bgp.neighbors") | List, items: Dictionary | | | | | | [    - ip_address](## "router_bgp.neighbors.[].ip_address") | String | Required, Unique | | | | | [      peer_group](## "router_bgp.neighbors.[].peer_group") | String | | | | | | [      remote_as](## "router_bgp.neighbors.[].remote_as") | String | | | | BGP AS <1-4294967295> or AS number in asdot notation "<1-65535>.<0-65535>".
For asdot notation in YAML inputs, the value must be put in quotes, to prevent it from being interpreted as a float number. | | [      local_as](## "router_bgp.neighbors.[].local_as") | String | | | | BGP AS <1-4294967295> or AS number in asdot notation "<1-65535>.<0-65535>".
For asdot notation in YAML inputs, the value must be put in quotes, to prevent it from being interpreted as a float number. | - | [      as_path](## "router_bgp.neighbors.[].as_path") | Dictionary | | | | BGP AS-PATH options | - | [        remote_as_replace_out](## "router_bgp.neighbors.[].as_path.remote_as_replace_out") | Boolean | | | | Replace AS number with local AS number | - | [        prepend_own_disabled](## "router_bgp.neighbors.[].as_path.prepend_own_disabled") | Boolean | | | | Disable prepending own AS number to AS path | - | [      peer](## "router_bgp.neighbors.[].peer") | String | | | | Key only used for documentation or validation purposes | + | [      as_path](## "router_bgp.neighbors.[].as_path") | Dictionary | | | | BGP AS-PATH options. | + | [        remote_as_replace_out](## "router_bgp.neighbors.[].as_path.remote_as_replace_out") | Boolean | | | | Replace AS number with local AS number. | + | [        prepend_own_disabled](## "router_bgp.neighbors.[].as_path.prepend_own_disabled") | Boolean | | | | Disable prepending own AS number to AS path. | + | [      peer](## "router_bgp.neighbors.[].peer") | String | | | | Key only used for documentation or validation purposes. | | [      description](## "router_bgp.neighbors.[].description") | String | | | | | | [      route_reflector_client](## "router_bgp.neighbors.[].route_reflector_client") | Boolean | | | | | | [      password](## "router_bgp.neighbors.[].password") | String | | | | | | [      passive](## "router_bgp.neighbors.[].passive") | Boolean | | | | | | [      shutdown](## "router_bgp.neighbors.[].shutdown") | Boolean | | | | | - | [      update_source](## "router_bgp.neighbors.[].update_source") | String | | | | Source Interface | + | [      update_source](## "router_bgp.neighbors.[].update_source") | String | | | | Source Interface. | | [      bfd](## "router_bgp.neighbors.[].bfd") | Boolean | | | | Enable BFD. | | [      bfd_timers](## "router_bgp.neighbors.[].bfd_timers") | Dictionary | | | | Override default BFD timers. BFD must be enabled with `bfd: true`. | | [        interval](## "router_bgp.neighbors.[].bfd_timers.interval") | Integer | Required | | Min: 50
Max: 60000 | Interval in milliseconds. | | [        min_rx](## "router_bgp.neighbors.[].bfd_timers.min_rx") | Integer | Required | | Min: 50
Max: 60000 | Rate in milliseconds. | | [        multiplier](## "router_bgp.neighbors.[].bfd_timers.multiplier") | Integer | Required | | Min: 3
Max: 50 | | | [      weight](## "router_bgp.neighbors.[].weight") | Integer | | | Min: 0
Max: 65535 | | - | [      timers](## "router_bgp.neighbors.[].timers") | String | | | | BGP Keepalive and Hold Timer values in seconds as string "<0-3600> <0-3600>" | - | [      route_map_in](## "router_bgp.neighbors.[].route_map_in") | String | | | | Inbound route-map name | - | [      route_map_out](## "router_bgp.neighbors.[].route_map_out") | String | | | | Outbound route-map name | + | [      timers](## "router_bgp.neighbors.[].timers") | String | | | | BGP Keepalive and Hold Timer values in seconds as string "<0-3600> <0-3600>". | + | [      route_map_in](## "router_bgp.neighbors.[].route_map_in") | String | | | | Inbound route-map name. | + | [      route_map_out](## "router_bgp.neighbors.[].route_map_out") | String | | | | Outbound route-map name. | | [      default_originate](## "router_bgp.neighbors.[].default_originate") | Dictionary | | | | | | [        enabled](## "router_bgp.neighbors.[].default_originate.enabled") | Boolean | | | | | | [        always](## "router_bgp.neighbors.[].default_originate.always") | Boolean | | | | | | [        route_map](## "router_bgp.neighbors.[].default_originate.route_map") | String | | | | | - | [      send_community](## "router_bgp.neighbors.[].send_community") | String | | | | 'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)' | - | [      maximum_routes](## "router_bgp.neighbors.[].maximum_routes") | Integer | | | Min: 0
Max: 4294967294 | Maximum number of routes (0 means unlimited) | - | [      maximum_routes_warning_limit](## "router_bgp.neighbors.[].maximum_routes_warning_limit") | String | | | | Maximum number of routes after which a warning is issued (0 means never warn) or
Percentage of maximum number of routes at which to warn ("<1-100> percent")
| + | [      send_community](## "router_bgp.neighbors.[].send_community") | String | | | | 'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'. | + | [      maximum_routes](## "router_bgp.neighbors.[].maximum_routes") | Integer | | | Min: 0
Max: 4294967294 | Maximum number of routes (0 means unlimited). | + | [      maximum_routes_warning_limit](## "router_bgp.neighbors.[].maximum_routes_warning_limit") | String | | | | Maximum number of routes after which a warning is issued (0 means never warn) or
Percentage of maximum number of routes at which to warn ("<1-100> percent").
| | [      maximum_routes_warning_only](## "router_bgp.neighbors.[].maximum_routes_warning_only") | Boolean | | | | | + | [      missing_policy](## "router_bgp.neighbors.[].missing_policy") | Dictionary | | | | Missing policy configuration for all address-families. | + | [        direction_in](## "router_bgp.neighbors.[].missing_policy.direction_in") | Dictionary | | | | Missing policy inbound direction. | + | [          action](## "router_bgp.neighbors.[].missing_policy.direction_in.action") | String | Required | | Valid Values:
- deny
- permit
- deny-in-out | Missing policy action. | + | [          include_community_list](## "router_bgp.neighbors.[].missing_policy.direction_in.include_community_list") | Boolean | | | | Include community-list references in missing policy decision. | + | [          include_prefix_list](## "router_bgp.neighbors.[].missing_policy.direction_in.include_prefix_list") | Boolean | | | | Include prefix-list references in missing policy decision. | + | [          include_sub_route_map](## "router_bgp.neighbors.[].missing_policy.direction_in.include_sub_route_map") | Boolean | | | | Include sub-route-map references in missing policy decision. | + | [        direction_out](## "router_bgp.neighbors.[].missing_policy.direction_out") | Dictionary | | | | Missing policy outbound direction. | + | [          action](## "router_bgp.neighbors.[].missing_policy.direction_out.action") | String | Required | | Valid Values:
- deny
- permit
- deny-in-out | Missing policy action. | + | [          include_community_list](## "router_bgp.neighbors.[].missing_policy.direction_out.include_community_list") | Boolean | | | | Include community-list references in missing policy decision. | + | [          include_prefix_list](## "router_bgp.neighbors.[].missing_policy.direction_out.include_prefix_list") | Boolean | | | | Include prefix-list references in missing policy decision. | + | [          include_sub_route_map](## "router_bgp.neighbors.[].missing_policy.direction_out.include_sub_route_map") | Boolean | | | | Include sub-route-map references in missing policy decision. | | [      allowas_in](## "router_bgp.neighbors.[].allowas_in") | Dictionary | | | | | | [        enabled](## "router_bgp.neighbors.[].allowas_in.enabled") | Boolean | | | | | - | [        times](## "router_bgp.neighbors.[].allowas_in.times") | Integer | | | Min: 1
Max: 10 | Number of local ASNs allowed in a BGP update | - | [      ebgp_multihop](## "router_bgp.neighbors.[].ebgp_multihop") | Integer | | | Min: 1
Max: 255 | Time-to-live in range of hops | + | [        times](## "router_bgp.neighbors.[].allowas_in.times") | Integer | | | Min: 1
Max: 10 | Number of local ASNs allowed in a BGP update. | + | [      ebgp_multihop](## "router_bgp.neighbors.[].ebgp_multihop") | Integer | | | Min: 1
Max: 255 | Time-to-live in range of hops. | | [      next_hop_self](## "router_bgp.neighbors.[].next_hop_self") | Boolean | | | | | | [      link_bandwidth](## "router_bgp.neighbors.[].link_bandwidth") | Dictionary | | | | | | [        enabled](## "router_bgp.neighbors.[].link_bandwidth.enabled") | Boolean | | | | | - | [        default](## "router_bgp.neighbors.[].link_bandwidth.default") | String | | | | nn.nn(K|M|G) link speed in bits/second | + | [        default](## "router_bgp.neighbors.[].link_bandwidth.default") | String | | | | nn.nn(K|M|G) link speed in bits/second. | | [      rib_in_pre_policy_retain](## "router_bgp.neighbors.[].rib_in_pre_policy_retain") | Dictionary | | | | | | [        enabled](## "router_bgp.neighbors.[].rib_in_pre_policy_retain.enabled") | Boolean | | | | | | [        all](## "router_bgp.neighbors.[].rib_in_pre_policy_retain.all") | Boolean | | | | | - | [      remove_private_as](## "router_bgp.neighbors.[].remove_private_as") | Dictionary | | | | Remove private AS numbers in outbound AS path | + | [      remove_private_as](## "router_bgp.neighbors.[].remove_private_as") | Dictionary | | | | Remove private AS numbers in outbound AS path. | | [        enabled](## "router_bgp.neighbors.[].remove_private_as.enabled") | Boolean | | | | | | [        all](## "router_bgp.neighbors.[].remove_private_as.all") | Boolean | | | | | | [        replace_as](## "router_bgp.neighbors.[].remove_private_as.replace_as") | Boolean | | | | | @@ -152,35 +178,40 @@ | [        enabled](## "router_bgp.neighbors.[].remove_private_as_ingress.enabled") | Boolean | | | | | | [        replace_as](## "router_bgp.neighbors.[].remove_private_as_ingress.replace_as") | Boolean | | | | | | [      session_tracker](## "router_bgp.neighbors.[].session_tracker") | String | | | | | + | [      shared_secret](## "router_bgp.neighbors.[].shared_secret") | Dictionary | | | | | + | [        profile](## "router_bgp.neighbors.[].shared_secret.profile") | String | Required | | | Name of profile defined under `management_security`. | + | [        hash_algorithm](## "router_bgp.neighbors.[].shared_secret.hash_algorithm") | String | Required | | Valid Values:
- aes-128-cmac-96
- hmac-sha-256
- hmac-sha1-96 | Note: Algorithm hmac-sha-256 requires EOS version 4.31.1F and above. | | [      ttl_maximum_hops](## "router_bgp.neighbors.[].ttl_maximum_hops") | Integer | | | Min: 0
Max: 254 | Maximum number of hops. | | [  neighbor_interfaces](## "router_bgp.neighbor_interfaces") | List, items: Dictionary | | | | | - | [    - name](## "router_bgp.neighbor_interfaces.[].name") | String | Required, Unique | | | Interface name | + | [    - name](## "router_bgp.neighbor_interfaces.[].name") | String | Required, Unique | | | Interface name. | | [      remote_as](## "router_bgp.neighbor_interfaces.[].remote_as") | String | | | | BGP AS <1-4294967295> or AS number in asdot notation "<1-65535>.<0-65535>".
For asdot notation in YAML inputs, the value must be put in quotes, to prevent it from being interpreted as a float number. | - | [      peer](## "router_bgp.neighbor_interfaces.[].peer") | String | | | | Key only used for documentation or validation purposes | + | [      peer](## "router_bgp.neighbor_interfaces.[].peer") | String | | | | Key only used for documentation or validation purposes. | | [      peer_group](## "router_bgp.neighbor_interfaces.[].peer_group") | String | | `Peer-group name` | | | | [      description](## "router_bgp.neighbor_interfaces.[].description") | String | | | | | - | [      peer_filter](## "router_bgp.neighbor_interfaces.[].peer_filter") | String | | | | Peer-filter name | + | [      peer_filter](## "router_bgp.neighbor_interfaces.[].peer_filter") | String | | | | Peer-filter name. | | [  aggregate_addresses](## "router_bgp.aggregate_addresses") | List, items: Dictionary | | | | | - | [    - prefix](## "router_bgp.aggregate_addresses.[].prefix") | String | Required, Unique | | | IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I" | + | [    - prefix](## "router_bgp.aggregate_addresses.[].prefix") | String | Required, Unique | | | IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I". | | [      advertise_only](## "router_bgp.aggregate_addresses.[].advertise_only") | Boolean | | | | | | [      as_set](## "router_bgp.aggregate_addresses.[].as_set") | Boolean | | | | | - | [      advertise_map](## "router_bgp.aggregate_addresses.[].advertise_map") | String | | | | Route-map name | - | [      supress_map](## "router_bgp.aggregate_addresses.[].supress_map") | String | | | | Route-map name | + | [      advertise_map](## "router_bgp.aggregate_addresses.[].advertise_map") removed | String | | | | Route-map name.This key was removed. Support was removed in AVD version v4.9.0. | + | [      supress_map](## "router_bgp.aggregate_addresses.[].supress_map") removed | String | | | | Route-map name.This key was removed. Support was removed in AVD version v4.9.0. | | [      summary_only](## "router_bgp.aggregate_addresses.[].summary_only") | Boolean | | | | | - | [      attribute_map](## "router_bgp.aggregate_addresses.[].attribute_map") | String | | | | Route-map name | - | [      match_map](## "router_bgp.aggregate_addresses.[].match_map") | String | | | | Route-map name | + | [      attribute_map](## "router_bgp.aggregate_addresses.[].attribute_map") | String | | | | Route-map name. | + | [      match_map](## "router_bgp.aggregate_addresses.[].match_map") | String | | | | Route-map name. | | [  redistribute_routes](## "router_bgp.redistribute_routes") | List, items: Dictionary | | | | | - | [    - source_protocol](## "router_bgp.redistribute_routes.[].source_protocol") | String | Required, Unique | | | | + | [    - source_protocol](## "router_bgp.redistribute_routes.[].source_protocol") | String | Required | | Valid Values:
- attached-host
- bgp
- connected
- dynamic
- isis
- ospf
- ospfv3
- rip
- static
- user | | | [      route_map](## "router_bgp.redistribute_routes.[].route_map") | String | | | | | + | [      rcf](## "router_bgp.redistribute_routes.[].rcf") | String | | | | RCF function name with parenthesis.
Example: MyFunction(myarg).
`route_map` and `rcf` are mutually exclusive. `route_map` takes precedence.
Only applicable if `source_protocol` is one of `connected`, `static`, `isis`, `user`, `dynamic`. | | [      include_leaked](## "router_bgp.redistribute_routes.[].include_leaked") | Boolean | | | | | + | [      ospf_route_type](## "router_bgp.redistribute_routes.[].ospf_route_type") | String | | | Valid Values:
- external
- internal
- nssa-external
- nssa-external 1
- nssa-external 2 | Routes learned by the OSPF protocol.
The `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'.
| | [  vlan_aware_bundles](## "router_bgp.vlan_aware_bundles") | List, items: Dictionary | | | | | - | [    - name](## "router_bgp.vlan_aware_bundles.[].name") | String | Required, Unique | | | VLAN aware bundle name | - | [      tenant](## "router_bgp.vlan_aware_bundles.[].tenant") | String | | | | Key only used for documentation or validation purposes | - | [      description](## "router_bgp.vlan_aware_bundles.[].description") | String | | | | Key only used for documentation or validation purposes | - | [      rd](## "router_bgp.vlan_aware_bundles.[].rd") | String | | | | Route distinguisher | + | [    - name](## "router_bgp.vlan_aware_bundles.[].name") | String | Required, Unique | | | VLAN aware bundle name. | + | [      tenant](## "router_bgp.vlan_aware_bundles.[].tenant") | String | | | | Key only used for documentation or validation purposes. | + | [      description](## "router_bgp.vlan_aware_bundles.[].description") | String | | | | Key only used for documentation or validation purposes. | + | [      rd](## "router_bgp.vlan_aware_bundles.[].rd") | String | | | | Route distinguisher. | | [      rd_evpn_domain](## "router_bgp.vlan_aware_bundles.[].rd_evpn_domain") | Dictionary | | | | | | [        domain](## "router_bgp.vlan_aware_bundles.[].rd_evpn_domain.domain") | String | | | Valid Values:
- remote
- all | | - | [        rd](## "router_bgp.vlan_aware_bundles.[].rd_evpn_domain.rd") | String | | | | Route distinguisher | + | [        rd](## "router_bgp.vlan_aware_bundles.[].rd_evpn_domain.rd") | String | | | | Route distinguisher. | | [      route_targets](## "router_bgp.vlan_aware_bundles.[].route_targets") | Dictionary | | | | | | [        both](## "router_bgp.vlan_aware_bundles.[].route_targets.both") | List, items: String | | | | | | [          - <str>](## "router_bgp.vlan_aware_bundles.[].route_targets.both.[]") | String | | | | | @@ -201,16 +232,16 @@ | [        - <str>](## "router_bgp.vlan_aware_bundles.[].redistribute_routes.[]") | String | | | | | | [      no_redistribute_routes](## "router_bgp.vlan_aware_bundles.[].no_redistribute_routes") | List, items: String | | | | | | [        - <str>](## "router_bgp.vlan_aware_bundles.[].no_redistribute_routes.[]") | String | | | | | - | [      vlan](## "router_bgp.vlan_aware_bundles.[].vlan") | String | | | | VLAN range as string. Example "100-200,300" | - | [      eos_cli](## "router_bgp.vlan_aware_bundles.[].eos_cli") | String | | | | Multiline EOS CLI rendered directly on the Router BGP, VLAN-aware-bundle definition in the final EOS configuration | + | [      vlan](## "router_bgp.vlan_aware_bundles.[].vlan") | String | | | | VLAN range as string. Example "100-200,300". | + | [      eos_cli](## "router_bgp.vlan_aware_bundles.[].eos_cli") | String | | | | Multiline EOS CLI rendered directly on the Router BGP, VLAN-aware-bundle definition in the final EOS configuration. | | [  vlans](## "router_bgp.vlans") | List, items: Dictionary | | | | | | [    - id](## "router_bgp.vlans.[].id") | Integer | Required, Unique | | | | - | [      tenant](## "router_bgp.vlans.[].tenant") | String | | | | Key only used for documentation or validation purposes | - | [      rd](## "router_bgp.vlans.[].rd") | String | | | | Route distinguisher | + | [      tenant](## "router_bgp.vlans.[].tenant") | String | | | | Key only used for documentation or validation purposes. | + | [      rd](## "router_bgp.vlans.[].rd") | String | | | | Route distinguisher. | | [      rd_evpn_domain](## "router_bgp.vlans.[].rd_evpn_domain") | Dictionary | | | | | | [        domain](## "router_bgp.vlans.[].rd_evpn_domain.domain") | String | | | Valid Values:
- remote
- all | | - | [        rd](## "router_bgp.vlans.[].rd_evpn_domain.rd") | String | | | | Route distinguisher | - | [      eos_cli](## "router_bgp.vlans.[].eos_cli") | String | | | | Multiline EOS CLI rendered directly on the Router BGP, VLAN definition in the final EOS configuration | + | [        rd](## "router_bgp.vlans.[].rd_evpn_domain.rd") | String | | | | Route distinguisher. | + | [      eos_cli](## "router_bgp.vlans.[].eos_cli") | String | | | | Multiline EOS CLI rendered directly on the Router BGP, VLAN definition in the final EOS configuration. | | [      route_targets](## "router_bgp.vlans.[].route_targets") | Dictionary | | | | | | [        both](## "router_bgp.vlans.[].route_targets.both") | List, items: String | | | | | | [          - <str>](## "router_bgp.vlans.[].route_targets.both.[]") | String | | | | | @@ -232,22 +263,22 @@ | [      no_redistribute_routes](## "router_bgp.vlans.[].no_redistribute_routes") | List, items: String | | | | | | [        - <str>](## "router_bgp.vlans.[].no_redistribute_routes.[]") | String | | | | | | [  vpws](## "router_bgp.vpws") | List, items: Dictionary | | | | | - | [    - name](## "router_bgp.vpws.[].name") | String | Required, Unique | | | VPWS instance name | - | [      rd](## "router_bgp.vpws.[].rd") | String | | | | Route distinguisher | + | [    - name](## "router_bgp.vpws.[].name") | String | Required, Unique | | | VPWS instance name. | + | [      rd](## "router_bgp.vpws.[].rd") | String | | | | Route distinguisher. | | [      route_targets](## "router_bgp.vpws.[].route_targets") | Dictionary | | | | | - | [        import_export](## "router_bgp.vpws.[].route_targets.import_export") | String | | | | Route Target | + | [        import_export](## "router_bgp.vpws.[].route_targets.import_export") | String | | | | Route Target. | | [      mpls_control_word](## "router_bgp.vpws.[].mpls_control_word") | Boolean | | | | | | [      label_flow](## "router_bgp.vpws.[].label_flow") | Boolean | | | | | | [      mtu](## "router_bgp.vpws.[].mtu") | Integer | | | | | | [      pseudowires](## "router_bgp.vpws.[].pseudowires") | List, items: Dictionary | | | | | - | [        - name](## "router_bgp.vpws.[].pseudowires.[].name") | String | Required, Unique | | | Pseudowire name | - | [          id_local](## "router_bgp.vpws.[].pseudowires.[].id_local") | Integer | | | | Must match id_remote on other pe | - | [          id_remote](## "router_bgp.vpws.[].pseudowires.[].id_remote") | Integer | | | | Must match id_local on other pe | + | [        - name](## "router_bgp.vpws.[].pseudowires.[].name") | String | Required, Unique | | | Pseudowire name. | + | [          id_local](## "router_bgp.vpws.[].pseudowires.[].id_local") | Integer | | | | Must match id_remote on other pe. | + | [          id_remote](## "router_bgp.vpws.[].pseudowires.[].id_remote") | Integer | | | | Must match id_local on other pe. | | [  address_family_evpn](## "router_bgp.address_family_evpn") | Dictionary | | | | | | [    domain_identifier](## "router_bgp.address_family_evpn.domain_identifier") | String | | | | | | [    neighbor_default](## "router_bgp.address_family_evpn.neighbor_default") | Dictionary | | | | | | [      encapsulation](## "router_bgp.address_family_evpn.neighbor_default.encapsulation") | String | | | Valid Values:
- vxlan
- mpls | | - | [      next_hop_self_source_interface](## "router_bgp.address_family_evpn.neighbor_default.next_hop_self_source_interface") | String | | | | Source interface name | + | [      next_hop_self_source_interface](## "router_bgp.address_family_evpn.neighbor_default.next_hop_self_source_interface") | String | | | | Source interface name. | | [      next_hop_self_received_evpn_routes](## "router_bgp.address_family_evpn.neighbor_default.next_hop_self_received_evpn_routes") | Dictionary | | | | | | [        enable](## "router_bgp.address_family_evpn.neighbor_default.next_hop_self_received_evpn_routes.enable") | Boolean | | | | | | [        inter_domain](## "router_bgp.address_family_evpn.neighbor_default.next_hop_self_received_evpn_routes.inter_domain") | Boolean | | | | | @@ -257,11 +288,23 @@ | [    neighbors](## "router_bgp.address_family_evpn.neighbors") | List, items: Dictionary | | | | | | [      - ip_address](## "router_bgp.address_family_evpn.neighbors.[].ip_address") | String | Required, Unique | | | | | [        activate](## "router_bgp.address_family_evpn.neighbors.[].activate") | Boolean | | | | | + | [        rcf_in](## "router_bgp.address_family_evpn.neighbors.[].rcf_in") | String | | | | Inbound RCF function name with parenthesis.
Example: MyFunction(myarg). | + | [        rcf_out](## "router_bgp.address_family_evpn.neighbors.[].rcf_out") | String | | | | Outbound RCF function name with parenthesis.
Example: MyFunction(myarg). | + | [        default_route](## "router_bgp.address_family_evpn.neighbors.[].default_route") | Dictionary | | | | | + | [          enabled](## "router_bgp.address_family_evpn.neighbors.[].default_route.enabled") | Boolean | | | | | + | [          rcf](## "router_bgp.address_family_evpn.neighbors.[].default_route.rcf") | String | | | | RCF function name with parenthesis.
Example: MyFunction(myarg). | + | [          route_map](## "router_bgp.address_family_evpn.neighbors.[].default_route.route_map") | String | | | | | | [    peer_groups](## "router_bgp.address_family_evpn.peer_groups") | List, items: Dictionary | | | | | - | [      - name](## "router_bgp.address_family_evpn.peer_groups.[].name") | String | Required, Unique | | | Peer-group name | + | [      - name](## "router_bgp.address_family_evpn.peer_groups.[].name") | String | Required, Unique | | | Peer-group name. | | [        activate](## "router_bgp.address_family_evpn.peer_groups.[].activate") | Boolean | | | | | - | [        route_map_in](## "router_bgp.address_family_evpn.peer_groups.[].route_map_in") | String | | | | Inbound route-map name | - | [        route_map_out](## "router_bgp.address_family_evpn.peer_groups.[].route_map_out") | String | | | | Outbound route-map name | + | [        route_map_in](## "router_bgp.address_family_evpn.peer_groups.[].route_map_in") | String | | | | Inbound route-map name. | + | [        route_map_out](## "router_bgp.address_family_evpn.peer_groups.[].route_map_out") | String | | | | Outbound route-map name. | + | [        rcf_in](## "router_bgp.address_family_evpn.peer_groups.[].rcf_in") | String | | | | Inbound RCF function name with parenthesis.
Example: MyFunction(myarg). | + | [        rcf_out](## "router_bgp.address_family_evpn.peer_groups.[].rcf_out") | String | | | | Outbound RCF function name with parenthesis.
Example: MyFunction(myarg). | + | [        default_route](## "router_bgp.address_family_evpn.peer_groups.[].default_route") | Dictionary | | | | | + | [          enabled](## "router_bgp.address_family_evpn.peer_groups.[].default_route.enabled") | Boolean | | | | | + | [          rcf](## "router_bgp.address_family_evpn.peer_groups.[].default_route.rcf") | String | | | | RCF function name with parenthesis.
Example: MyFunction(myarg). | + | [          route_map](## "router_bgp.address_family_evpn.peer_groups.[].default_route.route_map") | String | | | | | | [        domain_remote](## "router_bgp.address_family_evpn.peer_groups.[].domain_remote") | Boolean | | | | | | [        encapsulation](## "router_bgp.address_family_evpn.peer_groups.[].encapsulation") | String | | | Valid Values:
- vxlan
- mpls | | | [        additional_paths](## "router_bgp.address_family_evpn.peer_groups.[].additional_paths") | Dictionary | | | | | @@ -270,103 +313,138 @@ | [            any](## "router_bgp.address_family_evpn.peer_groups.[].additional_paths.send.any") | Boolean | | | | | | [            backup](## "router_bgp.address_family_evpn.peer_groups.[].additional_paths.send.backup") | Boolean | | | | | | [            ecmp](## "router_bgp.address_family_evpn.peer_groups.[].additional_paths.send.ecmp") | Boolean | | | | | - | [            ecmp_limit](## "router_bgp.address_family_evpn.peer_groups.[].additional_paths.send.ecmp_limit") | Integer | | | Min: 2
Max: 64 | Amount of ECMP paths to send | - | [            limit](## "router_bgp.address_family_evpn.peer_groups.[].additional_paths.send.limit") | Integer | | | Min: 2
Max: 64 | Amount of paths to send | + | [            ecmp_limit](## "router_bgp.address_family_evpn.peer_groups.[].additional_paths.send.ecmp_limit") | Integer | | | Min: 2
Max: 64 | Amount of ECMP paths to send. | + | [            limit](## "router_bgp.address_family_evpn.peer_groups.[].additional_paths.send.limit") | Integer | | | Min: 2
Max: 64 | Amount of paths to send. | | [    evpn_hostflap_detection](## "router_bgp.address_family_evpn.evpn_hostflap_detection") | Dictionary | | | | | | [      enabled](## "router_bgp.address_family_evpn.evpn_hostflap_detection.enabled") | Boolean | | | | | - | [      window](## "router_bgp.address_family_evpn.evpn_hostflap_detection.window") | Integer | | | Min: 0
Max: 4294967295 | Time (in seconds) to detect a MAC duplication issue | - | [      threshold](## "router_bgp.address_family_evpn.evpn_hostflap_detection.threshold") | Integer | | | Min: 0
Max: 4294967295 | Minimum number of MAC moves that indicate a MAC Duplication issue | - | [      expiry_timeout](## "router_bgp.address_family_evpn.evpn_hostflap_detection.expiry_timeout") | Integer | | | Min: 0
Max: 4294967295 | Time (in seconds) to purge a MAC duplication issue | + | [      window](## "router_bgp.address_family_evpn.evpn_hostflap_detection.window") | Integer | | | Min: 0
Max: 4294967295 | Time (in seconds) to detect a MAC duplication issue. | + | [      threshold](## "router_bgp.address_family_evpn.evpn_hostflap_detection.threshold") | Integer | | | Min: 0
Max: 4294967295 | Minimum number of MAC moves that indicate a MAC Duplication issue. | + | [      expiry_timeout](## "router_bgp.address_family_evpn.evpn_hostflap_detection.expiry_timeout") | Integer | | | Min: 0
Max: 4294967295 | Time (in seconds) to purge a MAC duplication issue. | | [    next_hop](## "router_bgp.address_family_evpn.next_hop") | Dictionary | | | | | | [      resolution_disabled](## "router_bgp.address_family_evpn.next_hop.resolution_disabled") | Boolean | | | | | | [    route](## "router_bgp.address_family_evpn.route") | Dictionary | | | | | | [      import_match_failure_action](## "router_bgp.address_family_evpn.route.import_match_failure_action") | String | | | Valid Values:
- discard | | | [      import_ethernet_segment_ip_mass_withdraw](## "router_bgp.address_family_evpn.route.import_ethernet_segment_ip_mass_withdraw") | Boolean | | | | | + | [      import_overlay_index_gateway](## "router_bgp.address_family_evpn.route.import_overlay_index_gateway") | Boolean | | | | | | [      export_ethernet_segment_ip_mass_withdraw](## "router_bgp.address_family_evpn.route.export_ethernet_segment_ip_mass_withdraw") | Boolean | | | | | | [    next_hop_unchanged](## "router_bgp.address_family_evpn.next_hop_unchanged") | Boolean | | | | | + | [    bgp_additional_paths](## "router_bgp.address_family_evpn.bgp_additional_paths") | Dictionary | | | | BGP additional-paths commands. | + | [      receive](## "router_bgp.address_family_evpn.bgp_additional_paths.receive") | Boolean | | | | Receive multiple paths. | + | [      send](## "router_bgp.address_family_evpn.bgp_additional_paths.send") | Dictionary | | | | Send multiple paths. | + | [        any](## "router_bgp.address_family_evpn.bgp_additional_paths.send.any") | Boolean | | | | Any eligible path. | + | [        backup](## "router_bgp.address_family_evpn.bgp_additional_paths.send.backup") | Boolean | | | | Best path and installed backup path. | + | [        ecmp](## "router_bgp.address_family_evpn.bgp_additional_paths.send.ecmp") | Boolean | | | | All paths in best path ECMP group. | + | [        ecmp_limit](## "router_bgp.address_family_evpn.bgp_additional_paths.send.ecmp_limit") | Integer | | | Min: 2
Max: 64 | Amount of ECMP paths to send. | + | [        limit](## "router_bgp.address_family_evpn.bgp_additional_paths.send.limit") | Integer | | | Min: 2
Max: 64 | Amount of paths to send. | + | [    layer_2_fec_in_place_update](## "router_bgp.address_family_evpn.layer_2_fec_in_place_update") | Dictionary | | | | BGP layer-2 in-place FEC operation. | + | [      enabled](## "router_bgp.address_family_evpn.layer_2_fec_in_place_update.enabled") | Boolean | Required | | | | + | [      timeout](## "router_bgp.address_family_evpn.layer_2_fec_in_place_update.timeout") | Integer | | | Min: 0
Max: 300 | In-place FEC update tracking timeout in seconds. | | [  address_family_rtc](## "router_bgp.address_family_rtc") | Dictionary | | | | | | [    peer_groups](## "router_bgp.address_family_rtc.peer_groups") | List, items: Dictionary | | | | | - | [      - name](## "router_bgp.address_family_rtc.peer_groups.[].name") | String | Required, Unique | | | Peer-group name | + | [      - name](## "router_bgp.address_family_rtc.peer_groups.[].name") | String | Required, Unique | | | Peer-group name. | | [        activate](## "router_bgp.address_family_rtc.peer_groups.[].activate") | Boolean | | | | | | [        default_route_target](## "router_bgp.address_family_rtc.peer_groups.[].default_route_target") | Dictionary | | | | | | [          only](## "router_bgp.address_family_rtc.peer_groups.[].default_route_target.only") | Boolean | | | | | | [          encoding_origin_as_omit](## "router_bgp.address_family_rtc.peer_groups.[].default_route_target.encoding_origin_as_omit") | String | | | | | | [  address_family_ipv4](## "router_bgp.address_family_ipv4") | Dictionary | | | | | | [    networks](## "router_bgp.address_family_ipv4.networks") | List, items: Dictionary | | | | | - | [      - prefix](## "router_bgp.address_family_ipv4.networks.[].prefix") | String | Required, Unique | | | IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I" | - | [        route_map](## "router_bgp.address_family_ipv4.networks.[].route_map") | String | | | | Route-map name | + | [      - prefix](## "router_bgp.address_family_ipv4.networks.[].prefix") | String | Required, Unique | | | IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I". | + | [        route_map](## "router_bgp.address_family_ipv4.networks.[].route_map") | String | | | | Route-map name. | + | [    bgp](## "router_bgp.address_family_ipv4.bgp") | Dictionary | | | | | + | [      redistribute_internal](## "router_bgp.address_family_ipv4.bgp.redistribute_internal") | Boolean | | | | Allow redistribution of iBGP routes into an Interior Gateway Protocol (IGP). EOS default is true. | | [    peer_groups](## "router_bgp.address_family_ipv4.peer_groups") | List, items: Dictionary | | | | | - | [      - name](## "router_bgp.address_family_ipv4.peer_groups.[].name") | String | Required, Unique | | | Peer-group name | + | [      - name](## "router_bgp.address_family_ipv4.peer_groups.[].name") | String | Required, Unique | | | Peer-group name. | | [        activate](## "router_bgp.address_family_ipv4.peer_groups.[].activate") | Boolean | | | | | - | [        route_map_in](## "router_bgp.address_family_ipv4.peer_groups.[].route_map_in") | String | | | | Inbound route-map name | - | [        route_map_out](## "router_bgp.address_family_ipv4.peer_groups.[].route_map_out") | String | | | | Outbound route-map name | + | [        route_map_in](## "router_bgp.address_family_ipv4.peer_groups.[].route_map_in") | String | | | | Inbound route-map name. | + | [        route_map_out](## "router_bgp.address_family_ipv4.peer_groups.[].route_map_out") | String | | | | Outbound route-map name. | + | [        rcf_in](## "router_bgp.address_family_ipv4.peer_groups.[].rcf_in") | String | | | | Inbound RCF function name with parenthesis.
Example: MyFunction(myarg). | + | [        rcf_out](## "router_bgp.address_family_ipv4.peer_groups.[].rcf_out") | String | | | | Outbound RCF function name with parenthesis.
Example: MyFunction(myarg). | | [        default_originate](## "router_bgp.address_family_ipv4.peer_groups.[].default_originate") | Dictionary | | | | | | [          always](## "router_bgp.address_family_ipv4.peer_groups.[].default_originate.always") | Boolean | | | | | - | [          route_map](## "router_bgp.address_family_ipv4.peer_groups.[].default_originate.route_map") | String | | | | Route-map name | + | [          route_map](## "router_bgp.address_family_ipv4.peer_groups.[].default_originate.route_map") | String | | | | Route-map name. | | [        next_hop](## "router_bgp.address_family_ipv4.peer_groups.[].next_hop") | Dictionary | | | | | | [          address_family_ipv6](## "router_bgp.address_family_ipv4.peer_groups.[].next_hop.address_family_ipv6") | Dictionary | | | | | | [            enabled](## "router_bgp.address_family_ipv4.peer_groups.[].next_hop.address_family_ipv6.enabled") | Boolean | Required | | | | | [            originate](## "router_bgp.address_family_ipv4.peer_groups.[].next_hop.address_family_ipv6.originate") | Boolean | | | | | | [          address_family_ipv6_originate](## "router_bgp.address_family_ipv4.peer_groups.[].next_hop.address_family_ipv6_originate") deprecated | Boolean | | | | This key is deprecated. Support will be removed in AVD version 5.0.0. Use address_family_ipv6 instead. | - | [        prefix_list_in](## "router_bgp.address_family_ipv4.peer_groups.[].prefix_list_in") | String | | | | Inbound prefix-list name | - | [        prefix_list_out](## "router_bgp.address_family_ipv4.peer_groups.[].prefix_list_out") | String | | | | Outbound prefix-list name | + | [        prefix_list_in](## "router_bgp.address_family_ipv4.peer_groups.[].prefix_list_in") | String | | | | Inbound prefix-list name. | + | [        prefix_list_out](## "router_bgp.address_family_ipv4.peer_groups.[].prefix_list_out") | String | | | | Outbound prefix-list name. | | [    neighbors](## "router_bgp.address_family_ipv4.neighbors") | List, items: Dictionary | | | | | | [      - ip_address](## "router_bgp.address_family_ipv4.neighbors.[].ip_address") | String | Required, Unique | | | | | [        activate](## "router_bgp.address_family_ipv4.neighbors.[].activate") | Boolean | | | | | - | [        route_map_in](## "router_bgp.address_family_ipv4.neighbors.[].route_map_in") | String | | | | Inbound route-map name | - | [        route_map_out](## "router_bgp.address_family_ipv4.neighbors.[].route_map_out") | String | | | | Outbound route-map name | - | [        prefix_list_in](## "router_bgp.address_family_ipv4.neighbors.[].prefix_list_in") | String | | | | Inbound prefix-list name | - | [        prefix_list_out](## "router_bgp.address_family_ipv4.neighbors.[].prefix_list_out") | String | | | | Prefix-list name | + | [        route_map_in](## "router_bgp.address_family_ipv4.neighbors.[].route_map_in") | String | | | | Inbound route-map name. | + | [        route_map_out](## "router_bgp.address_family_ipv4.neighbors.[].route_map_out") | String | | | | Outbound route-map name. | + | [        rcf_in](## "router_bgp.address_family_ipv4.neighbors.[].rcf_in") | String | | | | Inbound RCF function name with parenthesis.
Example: MyFunction(myarg). | + | [        rcf_out](## "router_bgp.address_family_ipv4.neighbors.[].rcf_out") | String | | | | Outbound RCF function name with parenthesis.
Example: MyFunction(myarg). | + | [        prefix_list_in](## "router_bgp.address_family_ipv4.neighbors.[].prefix_list_in") | String | | | | Inbound prefix-list name. | + | [        prefix_list_out](## "router_bgp.address_family_ipv4.neighbors.[].prefix_list_out") | String | | | | Prefix-list name. | | [        default_originate](## "router_bgp.address_family_ipv4.neighbors.[].default_originate") | Dictionary | | | | | | [          always](## "router_bgp.address_family_ipv4.neighbors.[].default_originate.always") | Boolean | | | | | | [          route_map](## "router_bgp.address_family_ipv4.neighbors.[].default_originate.route_map") | String | | | | | + | [    redistribute_routes](## "router_bgp.address_family_ipv4.redistribute_routes") | List, items: Dictionary | | | | | + | [      - source_protocol](## "router_bgp.address_family_ipv4.redistribute_routes.[].source_protocol") | String | Required | | Valid Values:
- attached-host
- bgp
- connected
- dynamic
- isis
- ospf
- ospfv3
- rip
- static
- user | | + | [        route_map](## "router_bgp.address_family_ipv4.redistribute_routes.[].route_map") | String | | | | | + | [        include_leaked](## "router_bgp.address_family_ipv4.redistribute_routes.[].include_leaked") | Boolean | | | | Only applicable if `source_protocol` is one of `connected`, `static`, `isis`, `ospf`, `ospfv3`. | + | [        rcf](## "router_bgp.address_family_ipv4.redistribute_routes.[].rcf") | String | | | | RCF function name with parenthesis.
Example: MyFunction(myarg).
`route_map` and `rcf` are mutually exclusive. `route_map` takes precedence.
Only applicable if `source_protocol` is one of `connected`, `static`, `isis`, `user`, `dynamic`. | + | [        ospf_route_type](## "router_bgp.address_family_ipv4.redistribute_routes.[].ospf_route_type") | String | | | Valid Values:
- external
- internal
- nssa-external
- nssa-external 1
- nssa-external 2 | Routes learned by the OSPF protocol.
The `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'.
| | [  address_family_ipv4_multicast](## "router_bgp.address_family_ipv4_multicast") | Dictionary | | | | | | [    peer_groups](## "router_bgp.address_family_ipv4_multicast.peer_groups") | List, items: Dictionary | | | | | - | [      - name](## "router_bgp.address_family_ipv4_multicast.peer_groups.[].name") | String | Required, Unique | | | Peer-group name | + | [      - name](## "router_bgp.address_family_ipv4_multicast.peer_groups.[].name") | String | Required, Unique | | | Peer-group name. | | [        activate](## "router_bgp.address_family_ipv4_multicast.peer_groups.[].activate") | Boolean | | | | | - | [        route_map_in](## "router_bgp.address_family_ipv4_multicast.peer_groups.[].route_map_in") | String | | | | Inbound route-map name | - | [        route_map_out](## "router_bgp.address_family_ipv4_multicast.peer_groups.[].route_map_out") | String | | | | Outbound route-map name | + | [        route_map_in](## "router_bgp.address_family_ipv4_multicast.peer_groups.[].route_map_in") | String | | | | Inbound route-map name. | + | [        route_map_out](## "router_bgp.address_family_ipv4_multicast.peer_groups.[].route_map_out") | String | | | | Outbound route-map name. | | [    neighbors](## "router_bgp.address_family_ipv4_multicast.neighbors") | List, items: Dictionary | | | | | | [      - ip_address](## "router_bgp.address_family_ipv4_multicast.neighbors.[].ip_address") | String | Required, Unique | | | | | [        activate](## "router_bgp.address_family_ipv4_multicast.neighbors.[].activate") | Boolean | | | | | - | [        route_map_in](## "router_bgp.address_family_ipv4_multicast.neighbors.[].route_map_in") | String | | | | Inbound route-map name | - | [        route_map_out](## "router_bgp.address_family_ipv4_multicast.neighbors.[].route_map_out") | String | | | | Outbound route-map name | + | [        route_map_in](## "router_bgp.address_family_ipv4_multicast.neighbors.[].route_map_in") | String | | | | Inbound route-map name. | + | [        route_map_out](## "router_bgp.address_family_ipv4_multicast.neighbors.[].route_map_out") | String | | | | Outbound route-map name. | | [    redistribute_routes](## "router_bgp.address_family_ipv4_multicast.redistribute_routes") | List, items: Dictionary | | | | | - | [      - source_protocol](## "router_bgp.address_family_ipv4_multicast.redistribute_routes.[].source_protocol") | String | Required, Unique | | | | + | [      - source_protocol](## "router_bgp.address_family_ipv4_multicast.redistribute_routes.[].source_protocol") | String | Required | | | | | [        route_map](## "router_bgp.address_family_ipv4_multicast.redistribute_routes.[].route_map") | String | | | | | + | [        include_leaked](## "router_bgp.address_family_ipv4_multicast.redistribute_routes.[].include_leaked") | Boolean | | | | Only applicable if `source_protocol` is `isis`. | + | [        rcf](## "router_bgp.address_family_ipv4_multicast.redistribute_routes.[].rcf") | String | | | | RCF function name with parenthesis.
Example: MyFunction(myarg).
`route_map` and `rcf` are mutually exclusive. `route_map` takes precedence.
Only applicable if `source_protocol` is `isis`. | + | [        ospf_route_type](## "router_bgp.address_family_ipv4_multicast.redistribute_routes.[].ospf_route_type") | String | | | Valid Values:
- external
- internal
- nssa-external
- nssa-external 1
- nssa-external 2 | Routes learned by the OSPF protocol.
The `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'.
| | [  address_family_ipv4_sr_te](## "router_bgp.address_family_ipv4_sr_te") | Dictionary | | | | | | [    neighbors](## "router_bgp.address_family_ipv4_sr_te.neighbors") | List, items: Dictionary | | | | | | [      - ip_address](## "router_bgp.address_family_ipv4_sr_te.neighbors.[].ip_address") | String | Required, Unique | | | | | [        activate](## "router_bgp.address_family_ipv4_sr_te.neighbors.[].activate") | Boolean | | | | | - | [        route_map_in](## "router_bgp.address_family_ipv4_sr_te.neighbors.[].route_map_in") | String | | | | Inbound route-map name | - | [        route_map_out](## "router_bgp.address_family_ipv4_sr_te.neighbors.[].route_map_out") | String | | | | Outbound route-map name | + | [        route_map_in](## "router_bgp.address_family_ipv4_sr_te.neighbors.[].route_map_in") | String | | | | Inbound route-map name. | + | [        route_map_out](## "router_bgp.address_family_ipv4_sr_te.neighbors.[].route_map_out") | String | | | | Outbound route-map name. | | [    peer_groups](## "router_bgp.address_family_ipv4_sr_te.peer_groups") | List, items: Dictionary | | | | | - | [      - name](## "router_bgp.address_family_ipv4_sr_te.peer_groups.[].name") | String | Required, Unique | | | Peer-group name | + | [      - name](## "router_bgp.address_family_ipv4_sr_te.peer_groups.[].name") | String | Required, Unique | | | Peer-group name. | | [        activate](## "router_bgp.address_family_ipv4_sr_te.peer_groups.[].activate") | Boolean | | | | | - | [        route_map_in](## "router_bgp.address_family_ipv4_sr_te.peer_groups.[].route_map_in") | String | | | | Inbound route-map name | - | [        route_map_out](## "router_bgp.address_family_ipv4_sr_te.peer_groups.[].route_map_out") | String | | | | Outbound route-map name | + | [        route_map_in](## "router_bgp.address_family_ipv4_sr_te.peer_groups.[].route_map_in") | String | | | | Inbound route-map name. | + | [        route_map_out](## "router_bgp.address_family_ipv4_sr_te.peer_groups.[].route_map_out") | String | | | | Outbound route-map name. | | [  address_family_ipv6](## "router_bgp.address_family_ipv6") | Dictionary | | | | | | [    networks](## "router_bgp.address_family_ipv6.networks") | List, items: Dictionary | | | | | - | [      - prefix](## "router_bgp.address_family_ipv6.networks.[].prefix") | String | Required, Unique | | | IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I" | - | [        route_map](## "router_bgp.address_family_ipv6.networks.[].route_map") | String | | | | Route-map name | + | [      - prefix](## "router_bgp.address_family_ipv6.networks.[].prefix") | String | Required, Unique | | | IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I". | + | [        route_map](## "router_bgp.address_family_ipv6.networks.[].route_map") | String | | | | Route-map name. | + | [    bgp](## "router_bgp.address_family_ipv6.bgp") | Dictionary | | | | | + | [      redistribute_internal](## "router_bgp.address_family_ipv6.bgp.redistribute_internal") | Boolean | | | | Allow redistribution of iBGP routes into an Interior Gateway Protocol (IGP). EOS default is true. | | [    peer_groups](## "router_bgp.address_family_ipv6.peer_groups") | List, items: Dictionary | | | | | - | [      - name](## "router_bgp.address_family_ipv6.peer_groups.[].name") | String | Required, Unique | | | Peer-group name | + | [      - name](## "router_bgp.address_family_ipv6.peer_groups.[].name") | String | Required, Unique | | | Peer-group name. | | [        activate](## "router_bgp.address_family_ipv6.peer_groups.[].activate") | Boolean | | | | | - | [        route_map_in](## "router_bgp.address_family_ipv6.peer_groups.[].route_map_in") | String | | | | Inbound route-map name | - | [        route_map_out](## "router_bgp.address_family_ipv6.peer_groups.[].route_map_out") | String | | | | Outbound route-map name | - | [        prefix_list_in](## "router_bgp.address_family_ipv6.peer_groups.[].prefix_list_in") | String | | | | Inbound prefix-list name | - | [        prefix_list_out](## "router_bgp.address_family_ipv6.peer_groups.[].prefix_list_out") | String | | | | Outbound prefix-list name | + | [        route_map_in](## "router_bgp.address_family_ipv6.peer_groups.[].route_map_in") | String | | | | Inbound route-map name. | + | [        route_map_out](## "router_bgp.address_family_ipv6.peer_groups.[].route_map_out") | String | | | | Outbound route-map name. | + | [        rcf_in](## "router_bgp.address_family_ipv6.peer_groups.[].rcf_in") | String | | | | Inbound RCF function name with parenthesis.
Example: MyFunction(myarg). | + | [        rcf_out](## "router_bgp.address_family_ipv6.peer_groups.[].rcf_out") | String | | | | Outbound RCF function name with parenthesis.
Example: MyFunction(myarg). | + | [        prefix_list_in](## "router_bgp.address_family_ipv6.peer_groups.[].prefix_list_in") | String | | | | Inbound prefix-list name. | + | [        prefix_list_out](## "router_bgp.address_family_ipv6.peer_groups.[].prefix_list_out") | String | | | | Outbound prefix-list name. | | [    neighbors](## "router_bgp.address_family_ipv6.neighbors") | List, items: Dictionary | | | | | | [      - ip_address](## "router_bgp.address_family_ipv6.neighbors.[].ip_address") | String | Required, Unique | | | | | [        activate](## "router_bgp.address_family_ipv6.neighbors.[].activate") | Boolean | | | | | - | [        route_map_in](## "router_bgp.address_family_ipv6.neighbors.[].route_map_in") | String | | | | Inbound route-map name | - | [        route_map_out](## "router_bgp.address_family_ipv6.neighbors.[].route_map_out") | String | | | | Outbound route-map name | - | [        prefix_list_in](## "router_bgp.address_family_ipv6.neighbors.[].prefix_list_in") | String | | | | Inbound prefix-list name | - | [        prefix_list_out](## "router_bgp.address_family_ipv6.neighbors.[].prefix_list_out") | String | | | | Outbound prefix-list name | + | [        route_map_in](## "router_bgp.address_family_ipv6.neighbors.[].route_map_in") | String | | | | Inbound route-map name. | + | [        route_map_out](## "router_bgp.address_family_ipv6.neighbors.[].route_map_out") | String | | | | Outbound route-map name. | + | [        rcf_in](## "router_bgp.address_family_ipv6.neighbors.[].rcf_in") | String | | | | Inbound RCF function name with parenthesis.
Example: MyFunction(myarg). | + | [        rcf_out](## "router_bgp.address_family_ipv6.neighbors.[].rcf_out") | String | | | | Outbound RCF function name with parenthesis.
Example: MyFunction(myarg). | + | [        prefix_list_in](## "router_bgp.address_family_ipv6.neighbors.[].prefix_list_in") | String | | | | Inbound prefix-list name. | + | [        prefix_list_out](## "router_bgp.address_family_ipv6.neighbors.[].prefix_list_out") | String | | | | Outbound prefix-list name. | | [    redistribute_routes](## "router_bgp.address_family_ipv6.redistribute_routes") | List, items: Dictionary | | | | | - | [      - source_protocol](## "router_bgp.address_family_ipv6.redistribute_routes.[].source_protocol") | String | Required, Unique | | | | + | [      - source_protocol](## "router_bgp.address_family_ipv6.redistribute_routes.[].source_protocol") | String | Required | | | | | [        route_map](## "router_bgp.address_family_ipv6.redistribute_routes.[].route_map") | String | | | | | | [        include_leaked](## "router_bgp.address_family_ipv6.redistribute_routes.[].include_leaked") | Boolean | | | | | + | [        rcf](## "router_bgp.address_family_ipv6.redistribute_routes.[].rcf") | String | | | | RCF function name with parenthesis.
Example: MyFunction(myarg).
`route_map` and `rcf` are mutually exclusive. `route_map` takes precedence.
Only used if `source_protocol` is one of `connected`, `static`, `isis`, `user`, `dynamic`. | + | [        ospf_route_type](## "router_bgp.address_family_ipv6.redistribute_routes.[].ospf_route_type") | String | | | Valid Values:
- external
- internal
- nssa-external
- nssa-external 1
- nssa-external 2 | Routes learned by the OSPF protocol.
The `ospf_route_type` is valid for source_protocols 'ospfv3'.
| | [  address_family_ipv6_multicast](## "router_bgp.address_family_ipv6_multicast") | Dictionary | | | | | | [    bgp](## "router_bgp.address_family_ipv6_multicast.bgp") | Dictionary | | | | | | [      missing_policy](## "router_bgp.address_family_ipv6_multicast.bgp.missing_policy") | Dictionary | | | | | @@ -377,32 +455,38 @@ | [    neighbors](## "router_bgp.address_family_ipv6_multicast.neighbors") | List, items: Dictionary | | | | | | [      - ip_address](## "router_bgp.address_family_ipv6_multicast.neighbors.[].ip_address") | String | Required, Unique | | | | | [        activate](## "router_bgp.address_family_ipv6_multicast.neighbors.[].activate") | Boolean | | | | | - | [        route_map_in](## "router_bgp.address_family_ipv6_multicast.neighbors.[].route_map_in") | String | | | | Inbound route-map name | - | [        route_map_out](## "router_bgp.address_family_ipv6_multicast.neighbors.[].route_map_out") | String | | | | Outbound route-map name | + | [        route_map_in](## "router_bgp.address_family_ipv6_multicast.neighbors.[].route_map_in") | String | | | | Inbound route-map name. | + | [        route_map_out](## "router_bgp.address_family_ipv6_multicast.neighbors.[].route_map_out") | String | | | | Outbound route-map name. | | [    peer_groups](## "router_bgp.address_family_ipv6_multicast.peer_groups") | List, items: Dictionary | | | | | - | [      - name](## "router_bgp.address_family_ipv6_multicast.peer_groups.[].name") | String | Required, Unique | | | Peer-group name | + | [      - name](## "router_bgp.address_family_ipv6_multicast.peer_groups.[].name") | String | Required, Unique | | | Peer-group name. | | [        activate](## "router_bgp.address_family_ipv6_multicast.peer_groups.[].activate") | Boolean | | | | | | [    networks](## "router_bgp.address_family_ipv6_multicast.networks") | List, items: Dictionary | | | | | - | [      - prefix](## "router_bgp.address_family_ipv6_multicast.networks.[].prefix") | String | Required, Unique | | | IPv6 prefix "A:B:C:D:E:F:G:H/I" | + | [      - prefix](## "router_bgp.address_family_ipv6_multicast.networks.[].prefix") | String | Required, Unique | | | IPv6 prefix "A:B:C:D:E:F:G:H/I". | | [        route_map](## "router_bgp.address_family_ipv6_multicast.networks.[].route_map") | String | | | | | + | [    redistribute_routes](## "router_bgp.address_family_ipv6_multicast.redistribute_routes") | List, items: Dictionary | | | | | + | [      - source_protocol](## "router_bgp.address_family_ipv6_multicast.redistribute_routes.[].source_protocol") | String | Required | | Valid Values:
- connected
- isis
- ospf
- ospfv3
- static | | + | [        include_leaked](## "router_bgp.address_family_ipv6_multicast.redistribute_routes.[].include_leaked") | Boolean | | | | Only applicable if `source_protocol` is `isis`. | + | [        route_map](## "router_bgp.address_family_ipv6_multicast.redistribute_routes.[].route_map") | String | | | | | + | [        rcf](## "router_bgp.address_family_ipv6_multicast.redistribute_routes.[].rcf") | String | | | | RCF function name with parenthesis.
Example: MyFunction(myarg).
`route_map` and `rcf` are mutually exclusive. `route_map` takes precedence.
Only applicable if `source_protocol` is `isis`. | + | [        ospf_route_type](## "router_bgp.address_family_ipv6_multicast.redistribute_routes.[].ospf_route_type") | String | | | Valid Values:
- external
- internal
- nssa-external
- nssa-external 1
- nssa-external 2 | Routes learned by the OSPF protocol.
The `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'.
| | [  address_family_ipv6_sr_te](## "router_bgp.address_family_ipv6_sr_te") | Dictionary | | | | | | [    neighbors](## "router_bgp.address_family_ipv6_sr_te.neighbors") | List, items: Dictionary | | | | | | [      - ip_address](## "router_bgp.address_family_ipv6_sr_te.neighbors.[].ip_address") | String | Required, Unique | | | | | [        activate](## "router_bgp.address_family_ipv6_sr_te.neighbors.[].activate") | Boolean | | | | | - | [        route_map_in](## "router_bgp.address_family_ipv6_sr_te.neighbors.[].route_map_in") | String | | | | Inbound route-map name | - | [        route_map_out](## "router_bgp.address_family_ipv6_sr_te.neighbors.[].route_map_out") | String | | | | Outbound route-map name | + | [        route_map_in](## "router_bgp.address_family_ipv6_sr_te.neighbors.[].route_map_in") | String | | | | Inbound route-map name. | + | [        route_map_out](## "router_bgp.address_family_ipv6_sr_te.neighbors.[].route_map_out") | String | | | | Outbound route-map name. | | [    peer_groups](## "router_bgp.address_family_ipv6_sr_te.peer_groups") | List, items: Dictionary | | | | | - | [      - name](## "router_bgp.address_family_ipv6_sr_te.peer_groups.[].name") | String | Required, Unique | | | Peer-group name | + | [      - name](## "router_bgp.address_family_ipv6_sr_te.peer_groups.[].name") | String | Required, Unique | | | Peer-group name. | | [        activate](## "router_bgp.address_family_ipv6_sr_te.peer_groups.[].activate") | Boolean | | | | | - | [        route_map_in](## "router_bgp.address_family_ipv6_sr_te.peer_groups.[].route_map_in") | String | | | | Inbound route-map name | - | [        route_map_out](## "router_bgp.address_family_ipv6_sr_te.peer_groups.[].route_map_out") | String | | | | Outbound route-map name | + | [        route_map_in](## "router_bgp.address_family_ipv6_sr_te.peer_groups.[].route_map_in") | String | | | | Inbound route-map name. | + | [        route_map_out](## "router_bgp.address_family_ipv6_sr_te.peer_groups.[].route_map_out") | String | | | | Outbound route-map name. | | [  address_family_link_state](## "router_bgp.address_family_link_state") | Dictionary | | | | | | [    bgp](## "router_bgp.address_family_link_state.bgp") | Dictionary | | | | | | [      missing_policy](## "router_bgp.address_family_link_state.bgp.missing_policy") | Dictionary | | | | | | [        direction_in_action](## "router_bgp.address_family_link_state.bgp.missing_policy.direction_in_action") | String | | | Valid Values:
- deny
- deny-in-out
- permit | | | [        direction_out_action](## "router_bgp.address_family_link_state.bgp.missing_policy.direction_out_action") | String | | | Valid Values:
- deny
- deny-in-out
- permit | | | [    peer_groups](## "router_bgp.address_family_link_state.peer_groups") | List, items: Dictionary | | | | | - | [      - name](## "router_bgp.address_family_link_state.peer_groups.[].name") | String | Required, Unique | | | Peer-group name | + | [      - name](## "router_bgp.address_family_link_state.peer_groups.[].name") | String | Required, Unique | | | Peer-group name. | | [        activate](## "router_bgp.address_family_link_state.peer_groups.[].activate") | Boolean | | | | | | [        missing_policy](## "router_bgp.address_family_link_state.peer_groups.[].missing_policy") | Dictionary | | | | | | [          direction_in_action](## "router_bgp.address_family_link_state.peer_groups.[].missing_policy.direction_in_action") | String | | | Valid Values:
- deny
- deny-in-out
- permit | | @@ -427,7 +511,7 @@ | [      - ip_address](## "router_bgp.address_family_flow_spec_ipv4.neighbors.[].ip_address") | String | Required, Unique | | | | | [        activate](## "router_bgp.address_family_flow_spec_ipv4.neighbors.[].activate") | Boolean | | | | | | [    peer_groups](## "router_bgp.address_family_flow_spec_ipv4.peer_groups") | List, items: Dictionary | | | | | - | [      - name](## "router_bgp.address_family_flow_spec_ipv4.peer_groups.[].name") | String | Required, Unique | | | Peer-group name | + | [      - name](## "router_bgp.address_family_flow_spec_ipv4.peer_groups.[].name") | String | Required, Unique | | | Peer-group name. | | [        activate](## "router_bgp.address_family_flow_spec_ipv4.peer_groups.[].activate") | Boolean | | | | | | [  address_family_flow_spec_ipv6](## "router_bgp.address_family_flow_spec_ipv6") | Dictionary | | | | | | [    bgp](## "router_bgp.address_family_flow_spec_ipv6.bgp") | Dictionary | | | | | @@ -438,7 +522,7 @@ | [      - ip_address](## "router_bgp.address_family_flow_spec_ipv6.neighbors.[].ip_address") | String | Required, Unique | | | | | [        activate](## "router_bgp.address_family_flow_spec_ipv6.neighbors.[].activate") | Boolean | | | | | | [    peer_groups](## "router_bgp.address_family_flow_spec_ipv6.peer_groups") | List, items: Dictionary | | | | | - | [      - name](## "router_bgp.address_family_flow_spec_ipv6.peer_groups.[].name") | String | Required, Unique | | | Peer-group name | + | [      - name](## "router_bgp.address_family_flow_spec_ipv6.peer_groups.[].name") | String | Required, Unique | | | Peer-group name. | | [        activate](## "router_bgp.address_family_flow_spec_ipv6.peer_groups.[].activate") | Boolean | | | | | | [  address_family_path_selection](## "router_bgp.address_family_path_selection") | Dictionary | | | | | | [    bgp](## "router_bgp.address_family_path_selection.bgp") | Dictionary | | | | | @@ -448,8 +532,8 @@ | [          any](## "router_bgp.address_family_path_selection.bgp.additional_paths.send.any") | Boolean | | | | | | [          backup](## "router_bgp.address_family_path_selection.bgp.additional_paths.send.backup") | Boolean | | | | | | [          ecmp](## "router_bgp.address_family_path_selection.bgp.additional_paths.send.ecmp") | Boolean | | | | | - | [          ecmp_limit](## "router_bgp.address_family_path_selection.bgp.additional_paths.send.ecmp_limit") | Integer | | | Min: 2
Max: 64 | Amount of ECMP paths to send | - | [          limit](## "router_bgp.address_family_path_selection.bgp.additional_paths.send.limit") | Integer | | | Min: 2
Max: 64 | Amount of paths to send | + | [          ecmp_limit](## "router_bgp.address_family_path_selection.bgp.additional_paths.send.ecmp_limit") | Integer | | | Min: 2
Max: 64 | Amount of ECMP paths to send. | + | [          limit](## "router_bgp.address_family_path_selection.bgp.additional_paths.send.limit") | Integer | | | Min: 2
Max: 64 | Amount of paths to send. | | [    neighbors](## "router_bgp.address_family_path_selection.neighbors") | List, items: Dictionary | | | | | | [      - ip_address](## "router_bgp.address_family_path_selection.neighbors.[].ip_address") | String | Required, Unique | | | | | [        activate](## "router_bgp.address_family_path_selection.neighbors.[].activate") | Boolean | | | | | @@ -461,10 +545,10 @@ | [            any](## "router_bgp.address_family_path_selection.neighbors.[].additional_paths.send.any") | Boolean | | | | | | [            backup](## "router_bgp.address_family_path_selection.neighbors.[].additional_paths.send.backup") | Boolean | | | | | | [            ecmp](## "router_bgp.address_family_path_selection.neighbors.[].additional_paths.send.ecmp") | Boolean | | | | | - | [            ecmp_limit](## "router_bgp.address_family_path_selection.neighbors.[].additional_paths.send.ecmp_limit") | Integer | | | Min: 2
Max: 64 | Amount of ECMP paths to send | - | [            limit](## "router_bgp.address_family_path_selection.neighbors.[].additional_paths.send.limit") | Integer | | | Min: 2
Max: 64 | Amount of paths to send | + | [            ecmp_limit](## "router_bgp.address_family_path_selection.neighbors.[].additional_paths.send.ecmp_limit") | Integer | | | Min: 2
Max: 64 | Amount of ECMP paths to send. | + | [            limit](## "router_bgp.address_family_path_selection.neighbors.[].additional_paths.send.limit") | Integer | | | Min: 2
Max: 64 | Amount of paths to send. | | [    peer_groups](## "router_bgp.address_family_path_selection.peer_groups") | List, items: Dictionary | | | | | - | [      - name](## "router_bgp.address_family_path_selection.peer_groups.[].name") | String | Required, Unique | | | Peer-group name | + | [      - name](## "router_bgp.address_family_path_selection.peer_groups.[].name") | String | Required, Unique | | | Peer-group name. | | [        activate](## "router_bgp.address_family_path_selection.peer_groups.[].activate") | Boolean | | | | | | [        additional_paths](## "router_bgp.address_family_path_selection.peer_groups.[].additional_paths") | Dictionary | | | | | | [          install](## "router_bgp.address_family_path_selection.peer_groups.[].additional_paths.install") | Boolean | | | | | @@ -474,79 +558,114 @@ | [            any](## "router_bgp.address_family_path_selection.peer_groups.[].additional_paths.send.any") | Boolean | | | | | | [            backup](## "router_bgp.address_family_path_selection.peer_groups.[].additional_paths.send.backup") | Boolean | | | | | | [            ecmp](## "router_bgp.address_family_path_selection.peer_groups.[].additional_paths.send.ecmp") | Boolean | | | | | - | [            ecmp_limit](## "router_bgp.address_family_path_selection.peer_groups.[].additional_paths.send.ecmp_limit") | Integer | | | Min: 2
Max: 64 | Amount of ECMP paths to send | - | [            limit](## "router_bgp.address_family_path_selection.peer_groups.[].additional_paths.send.limit") | Integer | | | Min: 2
Max: 64 | Amount of paths to send | + | [            ecmp_limit](## "router_bgp.address_family_path_selection.peer_groups.[].additional_paths.send.ecmp_limit") | Integer | | | Min: 2
Max: 64 | Amount of ECMP paths to send. | + | [            limit](## "router_bgp.address_family_path_selection.peer_groups.[].additional_paths.send.limit") | Integer | | | Min: 2
Max: 64 | Amount of paths to send. | | [  address_family_vpn_ipv4](## "router_bgp.address_family_vpn_ipv4") | Dictionary | | | | | | [    domain_identifier](## "router_bgp.address_family_vpn_ipv4.domain_identifier") | String | | | | | | [    peer_groups](## "router_bgp.address_family_vpn_ipv4.peer_groups") | List, items: Dictionary | | | | | - | [      - name](## "router_bgp.address_family_vpn_ipv4.peer_groups.[].name") | String | Required, Unique | | | Peer-group name | + | [      - name](## "router_bgp.address_family_vpn_ipv4.peer_groups.[].name") | String | Required, Unique | | | Peer-group name. | | [        activate](## "router_bgp.address_family_vpn_ipv4.peer_groups.[].activate") | Boolean | | | | | - | [        route_map_in](## "router_bgp.address_family_vpn_ipv4.peer_groups.[].route_map_in") | String | | | | Inbound route-map name | - | [        route_map_out](## "router_bgp.address_family_vpn_ipv4.peer_groups.[].route_map_out") | String | | | | Outbound route-map name | + | [        route_map_in](## "router_bgp.address_family_vpn_ipv4.peer_groups.[].route_map_in") | String | | | | Inbound route-map name. | + | [        route_map_out](## "router_bgp.address_family_vpn_ipv4.peer_groups.[].route_map_out") | String | | | | Outbound route-map name. | + | [        rcf_in](## "router_bgp.address_family_vpn_ipv4.peer_groups.[].rcf_in") | String | | | | Inbound RCF function name with parenthesis.
Example: MyFunction(myarg). | + | [        rcf_out](## "router_bgp.address_family_vpn_ipv4.peer_groups.[].rcf_out") | String | | | | Outbound RCF function name with parenthesis.
Example: MyFunction(myarg). | + | [        default_route](## "router_bgp.address_family_vpn_ipv4.peer_groups.[].default_route") | Dictionary | | | | | + | [          enabled](## "router_bgp.address_family_vpn_ipv4.peer_groups.[].default_route.enabled") | Boolean | | | | | + | [          rcf](## "router_bgp.address_family_vpn_ipv4.peer_groups.[].default_route.rcf") | String | | | | RCF function name with parenthesis.
Example: MyFunction(myarg). | + | [          route_map](## "router_bgp.address_family_vpn_ipv4.peer_groups.[].default_route.route_map") | String | | | | | | [    route](## "router_bgp.address_family_vpn_ipv4.route") | Dictionary | | | | | | [      import_match_failure_action](## "router_bgp.address_family_vpn_ipv4.route.import_match_failure_action") | String | | | Valid Values:
- discard | | | [    neighbors](## "router_bgp.address_family_vpn_ipv4.neighbors") | List, items: Dictionary | | | | | | [      - ip_address](## "router_bgp.address_family_vpn_ipv4.neighbors.[].ip_address") | String | Required, Unique | | | | | [        activate](## "router_bgp.address_family_vpn_ipv4.neighbors.[].activate") | Boolean | | | | | - | [        route_map_in](## "router_bgp.address_family_vpn_ipv4.neighbors.[].route_map_in") | String | | | | Inbound route-map name | - | [        route_map_out](## "router_bgp.address_family_vpn_ipv4.neighbors.[].route_map_out") | String | | | | Outbound route-map name | + | [        route_map_in](## "router_bgp.address_family_vpn_ipv4.neighbors.[].route_map_in") | String | | | | Inbound route-map name. | + | [        route_map_out](## "router_bgp.address_family_vpn_ipv4.neighbors.[].route_map_out") | String | | | | Outbound route-map name. | + | [        rcf_in](## "router_bgp.address_family_vpn_ipv4.neighbors.[].rcf_in") | String | | | | Inbound RCF function name with parenthesis.
Example: MyFunction(myarg). | + | [        rcf_out](## "router_bgp.address_family_vpn_ipv4.neighbors.[].rcf_out") | String | | | | Outbound RCF function name with parenthesis.
Example: MyFunction(myarg). | + | [        default_route](## "router_bgp.address_family_vpn_ipv4.neighbors.[].default_route") | Dictionary | | | | | + | [          enabled](## "router_bgp.address_family_vpn_ipv4.neighbors.[].default_route.enabled") | Boolean | | | | | + | [          rcf](## "router_bgp.address_family_vpn_ipv4.neighbors.[].default_route.rcf") | String | | | | RCF function name with parenthesis.
Example: MyFunction(myarg). | + | [          route_map](## "router_bgp.address_family_vpn_ipv4.neighbors.[].default_route.route_map") | String | | | | | | [    neighbor_default_encapsulation_mpls_next_hop_self](## "router_bgp.address_family_vpn_ipv4.neighbor_default_encapsulation_mpls_next_hop_self") | Dictionary | | | | | | [      source_interface](## "router_bgp.address_family_vpn_ipv4.neighbor_default_encapsulation_mpls_next_hop_self.source_interface") | String | | | | | | [  address_family_vpn_ipv6](## "router_bgp.address_family_vpn_ipv6") | Dictionary | | | | | | [    domain_identifier](## "router_bgp.address_family_vpn_ipv6.domain_identifier") | String | | | | | | [    peer_groups](## "router_bgp.address_family_vpn_ipv6.peer_groups") | List, items: Dictionary | | | | | - | [      - name](## "router_bgp.address_family_vpn_ipv6.peer_groups.[].name") | String | Required, Unique | | | Peer-group name | + | [      - name](## "router_bgp.address_family_vpn_ipv6.peer_groups.[].name") | String | Required, Unique | | | Peer-group name. | | [        activate](## "router_bgp.address_family_vpn_ipv6.peer_groups.[].activate") | Boolean | | | | | - | [        route_map_in](## "router_bgp.address_family_vpn_ipv6.peer_groups.[].route_map_in") | String | | | | Inbound route-map name | - | [        route_map_out](## "router_bgp.address_family_vpn_ipv6.peer_groups.[].route_map_out") | String | | | | Outbound route-map name | + | [        route_map_in](## "router_bgp.address_family_vpn_ipv6.peer_groups.[].route_map_in") | String | | | | Inbound route-map name. | + | [        route_map_out](## "router_bgp.address_family_vpn_ipv6.peer_groups.[].route_map_out") | String | | | | Outbound route-map name. | + | [        rcf_in](## "router_bgp.address_family_vpn_ipv6.peer_groups.[].rcf_in") | String | | | | Inbound RCF function name with parenthesis.
Example: MyFunction(myarg). | + | [        rcf_out](## "router_bgp.address_family_vpn_ipv6.peer_groups.[].rcf_out") | String | | | | Outbound RCF function name with parenthesis.
Example: MyFunction(myarg). | + | [        default_route](## "router_bgp.address_family_vpn_ipv6.peer_groups.[].default_route") | Dictionary | | | | | + | [          enabled](## "router_bgp.address_family_vpn_ipv6.peer_groups.[].default_route.enabled") | Boolean | | | | | + | [          rcf](## "router_bgp.address_family_vpn_ipv6.peer_groups.[].default_route.rcf") | String | | | | RCF function name with parenthesis.
Example: MyFunction(myarg). | + | [          route_map](## "router_bgp.address_family_vpn_ipv6.peer_groups.[].default_route.route_map") | String | | | | | | [    route](## "router_bgp.address_family_vpn_ipv6.route") | Dictionary | | | | | | [      import_match_failure_action](## "router_bgp.address_family_vpn_ipv6.route.import_match_failure_action") | String | | | Valid Values:
- discard | | | [    neighbors](## "router_bgp.address_family_vpn_ipv6.neighbors") | List, items: Dictionary | | | | | | [      - ip_address](## "router_bgp.address_family_vpn_ipv6.neighbors.[].ip_address") | String | Required, Unique | | | | | [        activate](## "router_bgp.address_family_vpn_ipv6.neighbors.[].activate") | Boolean | | | | | - | [        route_map_in](## "router_bgp.address_family_vpn_ipv6.neighbors.[].route_map_in") | String | | | | Inbound route-map name | - | [        route_map_out](## "router_bgp.address_family_vpn_ipv6.neighbors.[].route_map_out") | String | | | | Outbound route-map name | + | [        route_map_in](## "router_bgp.address_family_vpn_ipv6.neighbors.[].route_map_in") | String | | | | Inbound route-map name. | + | [        route_map_out](## "router_bgp.address_family_vpn_ipv6.neighbors.[].route_map_out") | String | | | | Outbound route-map name. | + | [        rcf_in](## "router_bgp.address_family_vpn_ipv6.neighbors.[].rcf_in") | String | | | | Inbound RCF function name with parenthesis.
Example: MyFunction(myarg). | + | [        rcf_out](## "router_bgp.address_family_vpn_ipv6.neighbors.[].rcf_out") | String | | | | Outbound RCF function name with parenthesis.
Example: MyFunction(myarg). | + | [        default_route](## "router_bgp.address_family_vpn_ipv6.neighbors.[].default_route") | Dictionary | | | | | + | [          enabled](## "router_bgp.address_family_vpn_ipv6.neighbors.[].default_route.enabled") | Boolean | | | | | + | [          rcf](## "router_bgp.address_family_vpn_ipv6.neighbors.[].default_route.rcf") | String | | | | RCF function name with parenthesis.
Example: MyFunction(myarg). | + | [          route_map](## "router_bgp.address_family_vpn_ipv6.neighbors.[].default_route.route_map") | String | | | | | | [    neighbor_default_encapsulation_mpls_next_hop_self](## "router_bgp.address_family_vpn_ipv6.neighbor_default_encapsulation_mpls_next_hop_self") | Dictionary | | | | | | [      source_interface](## "router_bgp.address_family_vpn_ipv6.neighbor_default_encapsulation_mpls_next_hop_self.source_interface") | String | | | | | | [  vrfs](## "router_bgp.vrfs") | List, items: Dictionary | | | | | - | [    - name](## "router_bgp.vrfs.[].name") | String | Required, Unique | | | VRF name | - | [      rd](## "router_bgp.vrfs.[].rd") | String | | | | Route distinguisher | + | [    - name](## "router_bgp.vrfs.[].name") | String | Required, Unique | | | VRF name. | + | [      bgp](## "router_bgp.vrfs.[].bgp") | Dictionary | | | | | + | [        redistribute_internal](## "router_bgp.vrfs.[].bgp.redistribute_internal") | Boolean | | | | Allow redistribution of iBGP routes into an Interior Gateway Protocol (IGP). EOS default is true. | + | [      rd](## "router_bgp.vrfs.[].rd") | String | | | | Route distinguisher. | | [      evpn_multicast](## "router_bgp.vrfs.[].evpn_multicast") | Boolean | | | | | - | [      evpn_multicast_address_family](## "router_bgp.vrfs.[].evpn_multicast_address_family") | Dictionary | | | | Enable per-AF EVPN multicast settings | + | [      evpn_multicast_address_family](## "router_bgp.vrfs.[].evpn_multicast_address_family") | Dictionary | | | | Enable per-AF EVPN multicast settings. | | [        ipv4](## "router_bgp.vrfs.[].evpn_multicast_address_family.ipv4") | Dictionary | | | | | - | [          transit](## "router_bgp.vrfs.[].evpn_multicast_address_family.ipv4.transit") | Boolean | | | | Enable EVPN multicast transit mode | + | [          transit](## "router_bgp.vrfs.[].evpn_multicast_address_family.ipv4.transit") | Boolean | | | | Enable EVPN multicast transit mode. | + | [      default_route_exports](## "router_bgp.vrfs.[].default_route_exports") | List, items: Dictionary | | | | Enable default-originate per VRF/address-family. | + | [        - address_family](## "router_bgp.vrfs.[].default_route_exports.[].address_family") | String | Required, Unique | | Valid Values:
- evpn
- vpn-ipv4
- vpn-ipv6 | | + | [          always](## "router_bgp.vrfs.[].default_route_exports.[].always") | Boolean | | | | | + | [          route_map](## "router_bgp.vrfs.[].default_route_exports.[].route_map") | String | | | | | + | [          rcf](## "router_bgp.vrfs.[].default_route_exports.[].rcf") | String | | | | RCF function name with parenthesis.
Example: MyFunction(myarg). | | [      route_targets](## "router_bgp.vrfs.[].route_targets") | Dictionary | | | | | | [        import](## "router_bgp.vrfs.[].route_targets.import") | List, items: Dictionary | | | | | | [          - address_family](## "router_bgp.vrfs.[].route_targets.import.[].address_family") | String | Required, Unique | | | | | [            route_targets](## "router_bgp.vrfs.[].route_targets.import.[].route_targets") | List, items: String | | | | | | [              - <str>](## "router_bgp.vrfs.[].route_targets.import.[].route_targets.[]") | String | | | | | - | [            route_map](## "router_bgp.vrfs.[].route_targets.import.[].route_map") | String | | | | | + | [            route_map](## "router_bgp.vrfs.[].route_targets.import.[].route_map") | String | | | | Only applicable if `address_family` is one of `evpn`, `vpn-ipv4` or `vpn-ipv6`. | + | [            rcf](## "router_bgp.vrfs.[].route_targets.import.[].rcf") | String | | | | RCF function name with parenthesis.
Example: MyFunction(myarg).
Only applicable if `address_family` is one of `evpn`, `vpn-ipv4` or `vpn-ipv6`. | + | [            vpn_route_filter_rcf](## "router_bgp.vrfs.[].route_targets.import.[].vpn_route_filter_rcf") | String | | | | RCF function name with parenthesis for filtering VPN routes. Also requires `rcf` to be set.
Example: MyFunction(myarg).
Only applicable if `address_family` is one of `vpn-ipv4` or `vpn-ipv6`. | | [        export](## "router_bgp.vrfs.[].route_targets.export") | List, items: Dictionary | | | | | | [          - address_family](## "router_bgp.vrfs.[].route_targets.export.[].address_family") | String | Required, Unique | | | | | [            route_targets](## "router_bgp.vrfs.[].route_targets.export.[].route_targets") | List, items: String | | | | | | [              - <str>](## "router_bgp.vrfs.[].route_targets.export.[].route_targets.[]") | String | | | | | - | [            route_map](## "router_bgp.vrfs.[].route_targets.export.[].route_map") | String | | | | | - | [      router_id](## "router_bgp.vrfs.[].router_id") | String | | | | in IP address format A.B.C.D | - | [      timers](## "router_bgp.vrfs.[].timers") | String | | | | BGP Keepalive and Hold Timer values in seconds as string "<0-3600> <0-3600>" | + | [            route_map](## "router_bgp.vrfs.[].route_targets.export.[].route_map") | String | | | | Only applicable if `address_family` is one of `evpn`, `vpn-ipv4` or `vpn-ipv6`. | + | [            rcf](## "router_bgp.vrfs.[].route_targets.export.[].rcf") | String | | | | RCF function name with parenthesis.
Example: MyFunction(myarg).
Only applicable if `address_family` is one of `evpn`, `vpn-ipv4` or `vpn-ipv6`. | + | [            vpn_route_filter_rcf](## "router_bgp.vrfs.[].route_targets.export.[].vpn_route_filter_rcf") | String | | | | RCF function name with parenthesis for filtering VPN routes. Also requires `rcf` to be set.
Example: MyFunction(myarg).
Only applicable if `address_family` is one of `vpn-ipv4` or `vpn-ipv6`. | + | [      router_id](## "router_bgp.vrfs.[].router_id") | String | | | | in IP address format A.B.C.D. | + | [      timers](## "router_bgp.vrfs.[].timers") | String | | | | BGP Keepalive and Hold Timer values in seconds as string "<0-3600> <0-3600>". | | [      networks](## "router_bgp.vrfs.[].networks") | List, items: Dictionary | | | | | - | [        - prefix](## "router_bgp.vrfs.[].networks.[].prefix") | String | Required, Unique | | | IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I" | + | [        - prefix](## "router_bgp.vrfs.[].networks.[].prefix") | String | Required, Unique | | | IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I". | | [          route_map](## "router_bgp.vrfs.[].networks.[].route_map") | String | | | | | | [      updates](## "router_bgp.vrfs.[].updates") | Dictionary | | | | | | [        wait_for_convergence](## "router_bgp.vrfs.[].updates.wait_for_convergence") | Boolean | | | | Disables FIB updates and route advertisement when the BGP instance is initiated until the BGP convergence state is reached.
| | [        wait_install](## "router_bgp.vrfs.[].updates.wait_install") | Boolean | | | | Do not advertise reachability to a prefix until that prefix has been installed in hardware.
This will eliminate any temporary black holes due to a BGP speaker advertising reachability to a prefix that may not yet be installed into the forwarding plane.
| - | [      listen_ranges](## "router_bgp.vrfs.[].listen_ranges") | List, items: Dictionary | | | | Improved "listen_ranges" data model to support multiple listen ranges and additional filter capabilities
| - | [        - prefix](## "router_bgp.vrfs.[].listen_ranges.[].prefix") | String | | | | IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I" | - | [          peer_id_include_router_id](## "router_bgp.vrfs.[].listen_ranges.[].peer_id_include_router_id") | Boolean | | | | Include router ID as part of peer filter | - | [          peer_group](## "router_bgp.vrfs.[].listen_ranges.[].peer_group") | String | | | | Peer-group name | - | [          peer_filter](## "router_bgp.vrfs.[].listen_ranges.[].peer_filter") | String | | | | Peer-filter name
note: `peer_filter`` or `remote_as` is required but mutually exclusive.
If both are defined, peer_filter takes precedence
| + | [      listen_ranges](## "router_bgp.vrfs.[].listen_ranges") | List, items: Dictionary | | | | Improved "listen_ranges" data model to support multiple listen ranges and additional filter capabilities.
| + | [        - prefix](## "router_bgp.vrfs.[].listen_ranges.[].prefix") | String | | | | IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I". | + | [          peer_id_include_router_id](## "router_bgp.vrfs.[].listen_ranges.[].peer_id_include_router_id") | Boolean | | | | Include router ID as part of peer filter. | + | [          peer_group](## "router_bgp.vrfs.[].listen_ranges.[].peer_group") | String | | | | Peer-group name. | + | [          peer_filter](## "router_bgp.vrfs.[].listen_ranges.[].peer_filter") | String | | | | Peer-filter name.
note: `peer_filter`` or `remote_as` is required but mutually exclusive.
If both are defined, peer_filter takes precedence.
| | [          remote_as](## "router_bgp.vrfs.[].listen_ranges.[].remote_as") | String | | | | BGP AS <1-4294967295> or AS number in asdot notation "<1-65535>.<0-65535>".
For asdot notation in YAML inputs, the value must be put in quotes, to prevent it from being interpreted as a float number. | | [      neighbors](## "router_bgp.vrfs.[].neighbors") | List, items: Dictionary | | | | | | [        - ip_address](## "router_bgp.vrfs.[].neighbors.[].ip_address") | String | Required, Unique | | | | - | [          peer_group](## "router_bgp.vrfs.[].neighbors.[].peer_group") | String | | | | Peer-group name | + | [          peer_group](## "router_bgp.vrfs.[].neighbors.[].peer_group") | String | | | | Peer-group name. | | [          remote_as](## "router_bgp.vrfs.[].neighbors.[].remote_as") | String | | | | BGP AS <1-4294967295> or AS number in asdot notation "<1-65535>.<0-65535>".
For asdot notation in YAML inputs, the value must be put in quotes, to prevent it from being interpreted as a float number. | | [          password](## "router_bgp.vrfs.[].neighbors.[].password") | String | | | | | | [          passive](## "router_bgp.vrfs.[].neighbors.[].passive") | Boolean | | | | | - | [          remove_private_as](## "router_bgp.vrfs.[].neighbors.[].remove_private_as") | Dictionary | | | | Remove private AS numbers in outbound AS path | + | [          remove_private_as](## "router_bgp.vrfs.[].neighbors.[].remove_private_as") | Dictionary | | | | Remove private AS numbers in outbound AS path. | | [            enabled](## "router_bgp.vrfs.[].neighbors.[].remove_private_as.enabled") | Boolean | | | | | | [            all](## "router_bgp.vrfs.[].neighbors.[].remove_private_as.all") | Boolean | | | | | | [            replace_as](## "router_bgp.vrfs.[].neighbors.[].remove_private_as.replace_as") | Boolean | | | | | @@ -555,12 +674,12 @@ | [            replace_as](## "router_bgp.vrfs.[].neighbors.[].remove_private_as_ingress.replace_as") | Boolean | | | | | | [          weight](## "router_bgp.vrfs.[].neighbors.[].weight") | Integer | | | Min: 0
Max: 65535 | | | [          local_as](## "router_bgp.vrfs.[].neighbors.[].local_as") | String | | | | BGP AS <1-4294967295> or AS number in asdot notation "<1-65535>.<0-65535>".
For asdot notation in YAML inputs, the value must be put in quotes, to prevent it from being interpreted as a float number. | - | [          as_path](## "router_bgp.vrfs.[].neighbors.[].as_path") | Dictionary | | | | BGP AS-PATH options | - | [            remote_as_replace_out](## "router_bgp.vrfs.[].neighbors.[].as_path.remote_as_replace_out") | Boolean | | | | Replace AS number with local AS number | - | [            prepend_own_disabled](## "router_bgp.vrfs.[].neighbors.[].as_path.prepend_own_disabled") | Boolean | | | | Disable prepending own AS number to AS path | + | [          as_path](## "router_bgp.vrfs.[].neighbors.[].as_path") | Dictionary | | | | BGP AS-PATH options. | + | [            remote_as_replace_out](## "router_bgp.vrfs.[].neighbors.[].as_path.remote_as_replace_out") | Boolean | | | | Replace AS number with local AS number. | + | [            prepend_own_disabled](## "router_bgp.vrfs.[].neighbors.[].as_path.prepend_own_disabled") | Boolean | | | | Disable prepending own AS number to AS path. | | [          description](## "router_bgp.vrfs.[].neighbors.[].description") | String | | | | | | [          route_reflector_client](## "router_bgp.vrfs.[].neighbors.[].route_reflector_client") | Boolean | | | | | - | [          ebgp_multihop](## "router_bgp.vrfs.[].neighbors.[].ebgp_multihop") | Integer | | | Min: 1
Max: 255 | Time-to-live in range of hops | + | [          ebgp_multihop](## "router_bgp.vrfs.[].neighbors.[].ebgp_multihop") | Integer | | | Min: 1
Max: 255 | Time-to-live in range of hops. | | [          next_hop_self](## "router_bgp.vrfs.[].neighbors.[].next_hop_self") | Boolean | | | | | | [          shutdown](## "router_bgp.vrfs.[].neighbors.[].shutdown") | Boolean | | | | | | [          bfd](## "router_bgp.vrfs.[].neighbors.[].bfd") | Boolean | | | | Enable BFD. | @@ -568,42 +687,44 @@ | [            interval](## "router_bgp.vrfs.[].neighbors.[].bfd_timers.interval") | Integer | Required | | Min: 50
Max: 60000 | Interval in milliseconds. | | [            min_rx](## "router_bgp.vrfs.[].neighbors.[].bfd_timers.min_rx") | Integer | Required | | Min: 50
Max: 60000 | Rate in milliseconds. | | [            multiplier](## "router_bgp.vrfs.[].neighbors.[].bfd_timers.multiplier") | Integer | Required | | Min: 3
Max: 50 | | - | [          timers](## "router_bgp.vrfs.[].neighbors.[].timers") | String | | | | BGP Keepalive and Hold Timer values in seconds as string "<0-3600> <0-3600>" | + | [          timers](## "router_bgp.vrfs.[].neighbors.[].timers") | String | | | | BGP Keepalive and Hold Timer values in seconds as string "<0-3600> <0-3600>". | | [          rib_in_pre_policy_retain](## "router_bgp.vrfs.[].neighbors.[].rib_in_pre_policy_retain") | Dictionary | | | | | | [            enabled](## "router_bgp.vrfs.[].neighbors.[].rib_in_pre_policy_retain.enabled") | Boolean | | | | | | [            all](## "router_bgp.vrfs.[].neighbors.[].rib_in_pre_policy_retain.all") | Boolean | | | | | - | [          send_community](## "router_bgp.vrfs.[].neighbors.[].send_community") | String | | | | 'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)' | + | [          send_community](## "router_bgp.vrfs.[].neighbors.[].send_community") | String | | | | 'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'. | | [          maximum_routes](## "router_bgp.vrfs.[].neighbors.[].maximum_routes") | Integer | | | | | - | [          maximum_routes_warning_limit](## "router_bgp.vrfs.[].neighbors.[].maximum_routes_warning_limit") | String | | | | Maximum number of routes after which a warning is issued (0 means never warn) or
Percentage of maximum number of routes at which to warn ("<1-100> percent")
| + | [          maximum_routes_warning_limit](## "router_bgp.vrfs.[].neighbors.[].maximum_routes_warning_limit") | String | | | | Maximum number of routes after which a warning is issued (0 means never warn) or
Percentage of maximum number of routes at which to warn ("<1-100> percent").
| | [          maximum_routes_warning_only](## "router_bgp.vrfs.[].neighbors.[].maximum_routes_warning_only") | Boolean | | | | | | [          allowas_in](## "router_bgp.vrfs.[].neighbors.[].allowas_in") | Dictionary | | | | | | [            enabled](## "router_bgp.vrfs.[].neighbors.[].allowas_in.enabled") | Boolean | | | | | - | [            times](## "router_bgp.vrfs.[].neighbors.[].allowas_in.times") | Integer | | | Min: 1
Max: 10 | Number of local ASNs allowed in a BGP update | + | [            times](## "router_bgp.vrfs.[].neighbors.[].allowas_in.times") | Integer | | | Min: 1
Max: 10 | Number of local ASNs allowed in a BGP update. | | [          default_originate](## "router_bgp.vrfs.[].neighbors.[].default_originate") | Dictionary | | | | | | [            enabled](## "router_bgp.vrfs.[].neighbors.[].default_originate.enabled") | Boolean | | | | | | [            always](## "router_bgp.vrfs.[].neighbors.[].default_originate.always") | Boolean | | | | | | [            route_map](## "router_bgp.vrfs.[].neighbors.[].default_originate.route_map") | String | | | | | | [          update_source](## "router_bgp.vrfs.[].neighbors.[].update_source") | String | | | | | - | [          route_map_in](## "router_bgp.vrfs.[].neighbors.[].route_map_in") | String | | | | Inbound route-map name | - | [          route_map_out](## "router_bgp.vrfs.[].neighbors.[].route_map_out") | String | | | | Outbound route-map name | - | [          prefix_list_in](## "router_bgp.vrfs.[].neighbors.[].prefix_list_in") deprecated | String | | | | Inbound prefix-list nameThis key is deprecated. Support will be removed in AVD version 5.0.0. Use router_bgp.vrfs[].address_family_ipv4.neighbors[].prefix_list_in or router_bgp.vrfs[].address_family_ipv6.neighbors[].prefix_list_in instead. | - | [          prefix_list_out](## "router_bgp.vrfs.[].neighbors.[].prefix_list_out") deprecated | String | | | | Outbound prefix-list nameThis key is deprecated. Support will be removed in AVD version 5.0.0. Use router_bgp.vrfs[].address_family_ipv4.neighbors[].prefix_list_out or router_bgp.vrfs[].address_family_ipv6.neighbors[].prefix_list_out instead. | + | [          route_map_in](## "router_bgp.vrfs.[].neighbors.[].route_map_in") | String | | | | Inbound route-map name. | + | [          route_map_out](## "router_bgp.vrfs.[].neighbors.[].route_map_out") | String | | | | Outbound route-map name. | + | [          prefix_list_in](## "router_bgp.vrfs.[].neighbors.[].prefix_list_in") deprecated | String | | | | Inbound prefix-list name.This key is deprecated. Support will be removed in AVD version 5.0.0. Use router_bgp.vrfs[].address_family_ipv4.neighbors[].prefix_list_in or router_bgp.vrfs[].address_family_ipv6.neighbors[].prefix_list_in instead. | + | [          prefix_list_out](## "router_bgp.vrfs.[].neighbors.[].prefix_list_out") deprecated | String | | | | Outbound prefix-list name.This key is deprecated. Support will be removed in AVD version 5.0.0. Use router_bgp.vrfs[].address_family_ipv4.neighbors[].prefix_list_out or router_bgp.vrfs[].address_family_ipv6.neighbors[].prefix_list_out instead. | | [      neighbor_interfaces](## "router_bgp.vrfs.[].neighbor_interfaces") | List, items: Dictionary | | | | | - | [        - name](## "router_bgp.vrfs.[].neighbor_interfaces.[].name") | String | Required, Unique | | | Interface name | + | [        - name](## "router_bgp.vrfs.[].neighbor_interfaces.[].name") | String | Required, Unique | | | Interface name. | | [          remote_as](## "router_bgp.vrfs.[].neighbor_interfaces.[].remote_as") | String | | | | BGP AS <1-4294967295> or AS number in asdot notation "<1-65535>.<0-65535>".
For asdot notation in YAML inputs, the value must be put in quotes, to prevent it from being interpreted as a float number. | - | [          peer_group](## "router_bgp.vrfs.[].neighbor_interfaces.[].peer_group") | String | | | | Peer-group name | - | [          peer_filter](## "router_bgp.vrfs.[].neighbor_interfaces.[].peer_filter") | String | | | | Peer-filter name | + | [          peer_group](## "router_bgp.vrfs.[].neighbor_interfaces.[].peer_group") | String | | | | Peer-group name. | + | [          peer_filter](## "router_bgp.vrfs.[].neighbor_interfaces.[].peer_filter") | String | | | | Peer-filter name. | | [          description](## "router_bgp.vrfs.[].neighbor_interfaces.[].description") | String | | | | | | [      redistribute_routes](## "router_bgp.vrfs.[].redistribute_routes") | List, items: Dictionary | | | | | - | [        - source_protocol](## "router_bgp.vrfs.[].redistribute_routes.[].source_protocol") | String | Required, Unique | | | | + | [        - source_protocol](## "router_bgp.vrfs.[].redistribute_routes.[].source_protocol") | String | Required | | | | | [          route_map](## "router_bgp.vrfs.[].redistribute_routes.[].route_map") | String | | | | | | [          include_leaked](## "router_bgp.vrfs.[].redistribute_routes.[].include_leaked") | Boolean | | | | | + | [          rcf](## "router_bgp.vrfs.[].redistribute_routes.[].rcf") | String | | | | RCF function name with parenthesis.
Example: MyFunction(myarg).
`route_map` and `rcf` are mutually exclusive. `route_map` takes precedence.
Only applicable if `source_protocol` is one of `connected`, `dynamic`, `isis`, `static` and `user`. | + | [          ospf_route_type](## "router_bgp.vrfs.[].redistribute_routes.[].ospf_route_type") | String | | | Valid Values:
- external
- internal
- nssa-external
- nssa-external 1
- nssa-external 2 | Routes learned by the OSPF protocol.
The `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'.
| | [      aggregate_addresses](## "router_bgp.vrfs.[].aggregate_addresses") | List, items: Dictionary | | | | | - | [        - prefix](## "router_bgp.vrfs.[].aggregate_addresses.[].prefix") | String | Required, Unique | | | IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I" | + | [        - prefix](## "router_bgp.vrfs.[].aggregate_addresses.[].prefix") | String | Required, Unique | | | IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I". | | [          advertise_only](## "router_bgp.vrfs.[].aggregate_addresses.[].advertise_only") | Boolean | | | | | | [          as_set](## "router_bgp.vrfs.[].aggregate_addresses.[].as_set") | Boolean | | | | | - | [          advertise_map](## "router_bgp.vrfs.[].aggregate_addresses.[].advertise_map") | String | | | | Route-map name | - | [          supress_map](## "router_bgp.vrfs.[].aggregate_addresses.[].supress_map") | String | | | | Route-map name | + | [          advertise_map](## "router_bgp.vrfs.[].aggregate_addresses.[].advertise_map") removed | String | | | | Route-map name.This key was removed. Support was removed in AVD version v4.9.0. | + | [          supress_map](## "router_bgp.vrfs.[].aggregate_addresses.[].supress_map") removed | String | | | | Route-map name.This key was removed. Support was removed in AVD version v4.9.0. | | [          summary_only](## "router_bgp.vrfs.[].aggregate_addresses.[].summary_only") | Boolean | | | | | | [          attribute_map](## "router_bgp.vrfs.[].aggregate_addresses.[].attribute_map") | String | | | | | | [          match_map](## "router_bgp.vrfs.[].aggregate_addresses.[].match_map") | String | | | | | @@ -620,22 +741,31 @@ | [              any](## "router_bgp.vrfs.[].address_family_ipv4.bgp.additional_paths.send.any") | Boolean | | | | | | [              backup](## "router_bgp.vrfs.[].address_family_ipv4.bgp.additional_paths.send.backup") | Boolean | | | | | | [              ecmp](## "router_bgp.vrfs.[].address_family_ipv4.bgp.additional_paths.send.ecmp") | Boolean | | | | | - | [              ecmp_limit](## "router_bgp.vrfs.[].address_family_ipv4.bgp.additional_paths.send.ecmp_limit") | Integer | | | Min: 2
Max: 64 | Amount of ECMP paths to send | - | [              limit](## "router_bgp.vrfs.[].address_family_ipv4.bgp.additional_paths.send.limit") | Integer | | | Min: 2
Max: 64 | Amount of paths to send | + | [              ecmp_limit](## "router_bgp.vrfs.[].address_family_ipv4.bgp.additional_paths.send.ecmp_limit") | Integer | | | Min: 2
Max: 64 | Amount of ECMP paths to send. | + | [              limit](## "router_bgp.vrfs.[].address_family_ipv4.bgp.additional_paths.send.limit") | Integer | | | Min: 2
Max: 64 | Amount of paths to send. | + | [          redistribute_internal](## "router_bgp.vrfs.[].address_family_ipv4.bgp.redistribute_internal") | Boolean | | | | Allow redistribution of iBGP routes into an Interior Gateway Protocol (IGP). EOS default is true. | | [        neighbors](## "router_bgp.vrfs.[].address_family_ipv4.neighbors") | List, items: Dictionary | | | | | | [          - ip_address](## "router_bgp.vrfs.[].address_family_ipv4.neighbors.[].ip_address") | String | Required, Unique | | | | | [            activate](## "router_bgp.vrfs.[].address_family_ipv4.neighbors.[].activate") | Boolean | | | | | - | [            route_map_in](## "router_bgp.vrfs.[].address_family_ipv4.neighbors.[].route_map_in") | String | | | | Inbound route-map name | - | [            route_map_out](## "router_bgp.vrfs.[].address_family_ipv4.neighbors.[].route_map_out") | String | | | | Outbound route-map name | - | [            prefix_list_in](## "router_bgp.vrfs.[].address_family_ipv4.neighbors.[].prefix_list_in") | String | | | | Inbound prefix-list name | - | [            prefix_list_out](## "router_bgp.vrfs.[].address_family_ipv4.neighbors.[].prefix_list_out") | String | | | | Outbound prefix-list name | + | [            route_map_in](## "router_bgp.vrfs.[].address_family_ipv4.neighbors.[].route_map_in") | String | | | | Inbound route-map name. | + | [            route_map_out](## "router_bgp.vrfs.[].address_family_ipv4.neighbors.[].route_map_out") | String | | | | Outbound route-map name. | + | [            rcf_in](## "router_bgp.vrfs.[].address_family_ipv4.neighbors.[].rcf_in") | String | | | | Inbound RCF function name with parenthesis.
Example: MyFunction(myarg). | + | [            rcf_out](## "router_bgp.vrfs.[].address_family_ipv4.neighbors.[].rcf_out") | String | | | | Outbound RCF function name with parenthesis.
Example: MyFunction(myarg). | + | [            prefix_list_in](## "router_bgp.vrfs.[].address_family_ipv4.neighbors.[].prefix_list_in") | String | | | | Inbound prefix-list name. | + | [            prefix_list_out](## "router_bgp.vrfs.[].address_family_ipv4.neighbors.[].prefix_list_out") | String | | | | Outbound prefix-list name. | | [            next_hop](## "router_bgp.vrfs.[].address_family_ipv4.neighbors.[].next_hop") | Dictionary | | | | | | [              address_family_ipv6](## "router_bgp.vrfs.[].address_family_ipv4.neighbors.[].next_hop.address_family_ipv6") | Dictionary | | | | | | [                enabled](## "router_bgp.vrfs.[].address_family_ipv4.neighbors.[].next_hop.address_family_ipv6.enabled") | Boolean | Required | | | | | [                originate](## "router_bgp.vrfs.[].address_family_ipv4.neighbors.[].next_hop.address_family_ipv6.originate") | Boolean | | | | | | [        networks](## "router_bgp.vrfs.[].address_family_ipv4.networks") | List, items: Dictionary | | | | | - | [          - prefix](## "router_bgp.vrfs.[].address_family_ipv4.networks.[].prefix") | String | Required, Unique | | | IPv4 prefix "A.B.C.D/E" | + | [          - prefix](## "router_bgp.vrfs.[].address_family_ipv4.networks.[].prefix") | String | Required, Unique | | | IPv4 prefix "A.B.C.D/E". | | [            route_map](## "router_bgp.vrfs.[].address_family_ipv4.networks.[].route_map") | String | | | | | + | [        redistribute_routes](## "router_bgp.vrfs.[].address_family_ipv4.redistribute_routes") | List, items: Dictionary | | | | | + | [          - source_protocol](## "router_bgp.vrfs.[].address_family_ipv4.redistribute_routes.[].source_protocol") | String | Required | | Valid Values:
- attached-host
- bgp
- connected
- dynamic
- isis
- ospf
- ospfv3
- rip
- static
- user | | + | [            route_map](## "router_bgp.vrfs.[].address_family_ipv4.redistribute_routes.[].route_map") | String | | | | | + | [            include_leaked](## "router_bgp.vrfs.[].address_family_ipv4.redistribute_routes.[].include_leaked") | Boolean | | | | | + | [            rcf](## "router_bgp.vrfs.[].address_family_ipv4.redistribute_routes.[].rcf") | String | | | | RCF function name with parenthesis.
Example: MyFunction(myarg).
`route_map` and `rcf` are mutually exclusive. `route_map` takes precedence.
Only applicable if `source_protocol` is one of `connected`, `dynamic`, `isis`, `static` and `user`. | + | [            ospf_route_type](## "router_bgp.vrfs.[].address_family_ipv4.redistribute_routes.[].ospf_route_type") | String | | | Valid Values:
- external
- internal
- nssa-external
- nssa-external 1
- nssa-external 2 | Routes learned by the OSPF protocol.
The `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'.
| | [      address_family_ipv6](## "router_bgp.vrfs.[].address_family_ipv6") | Dictionary | | | | | | [        bgp](## "router_bgp.vrfs.[].address_family_ipv6.bgp") | Dictionary | | | | | | [          missing_policy](## "router_bgp.vrfs.[].address_family_ipv6.bgp.missing_policy") | Dictionary | | | | | @@ -649,18 +779,27 @@ | [              any](## "router_bgp.vrfs.[].address_family_ipv6.bgp.additional_paths.send.any") | Boolean | | | | | | [              backup](## "router_bgp.vrfs.[].address_family_ipv6.bgp.additional_paths.send.backup") | Boolean | | | | | | [              ecmp](## "router_bgp.vrfs.[].address_family_ipv6.bgp.additional_paths.send.ecmp") | Boolean | | | | | - | [              ecmp_limit](## "router_bgp.vrfs.[].address_family_ipv6.bgp.additional_paths.send.ecmp_limit") | Integer | | | Min: 2
Max: 64 | Amount of ECMP paths to send | - | [              limit](## "router_bgp.vrfs.[].address_family_ipv6.bgp.additional_paths.send.limit") | Integer | | | Min: 2
Max: 64 | Amount of paths to send | + | [              ecmp_limit](## "router_bgp.vrfs.[].address_family_ipv6.bgp.additional_paths.send.ecmp_limit") | Integer | | | Min: 2
Max: 64 | Amount of ECMP paths to send. | + | [              limit](## "router_bgp.vrfs.[].address_family_ipv6.bgp.additional_paths.send.limit") | Integer | | | Min: 2
Max: 64 | Amount of paths to send. | + | [          redistribute_internal](## "router_bgp.vrfs.[].address_family_ipv6.bgp.redistribute_internal") | Boolean | | | | Allow redistribution of iBGP routes into an Interior Gateway Protocol (IGP). EOS default is true. | | [        neighbors](## "router_bgp.vrfs.[].address_family_ipv6.neighbors") | List, items: Dictionary | | | | | | [          - ip_address](## "router_bgp.vrfs.[].address_family_ipv6.neighbors.[].ip_address") | String | Required, Unique | | | | | [            activate](## "router_bgp.vrfs.[].address_family_ipv6.neighbors.[].activate") | Boolean | | | | | - | [            route_map_in](## "router_bgp.vrfs.[].address_family_ipv6.neighbors.[].route_map_in") | String | | | | Inbound route-map name | - | [            route_map_out](## "router_bgp.vrfs.[].address_family_ipv6.neighbors.[].route_map_out") | String | | | | Outbound route-map name | - | [            prefix_list_in](## "router_bgp.vrfs.[].address_family_ipv6.neighbors.[].prefix_list_in") | String | | | | Inbound prefix-list name | - | [            prefix_list_out](## "router_bgp.vrfs.[].address_family_ipv6.neighbors.[].prefix_list_out") | String | | | | Outbound prefix-list name | + | [            route_map_in](## "router_bgp.vrfs.[].address_family_ipv6.neighbors.[].route_map_in") | String | | | | Inbound route-map name. | + | [            route_map_out](## "router_bgp.vrfs.[].address_family_ipv6.neighbors.[].route_map_out") | String | | | | Outbound route-map name. | + | [            rcf_in](## "router_bgp.vrfs.[].address_family_ipv6.neighbors.[].rcf_in") | String | | | | Inbound RCF function name with parenthesis.
Example: MyFunction(myarg). | + | [            rcf_out](## "router_bgp.vrfs.[].address_family_ipv6.neighbors.[].rcf_out") | String | | | | Outbound RCF function name with parenthesis.
Example: MyFunction(myarg). | + | [            prefix_list_in](## "router_bgp.vrfs.[].address_family_ipv6.neighbors.[].prefix_list_in") | String | | | | Inbound prefix-list name. | + | [            prefix_list_out](## "router_bgp.vrfs.[].address_family_ipv6.neighbors.[].prefix_list_out") | String | | | | Outbound prefix-list name. | | [        networks](## "router_bgp.vrfs.[].address_family_ipv6.networks") | List, items: Dictionary | | | | | - | [          - prefix](## "router_bgp.vrfs.[].address_family_ipv6.networks.[].prefix") | String | Required, Unique | | | IPv6 prefix "A:B:C:D:E:F:G:H/I" | + | [          - prefix](## "router_bgp.vrfs.[].address_family_ipv6.networks.[].prefix") | String | Required, Unique | | | IPv6 prefix "A:B:C:D:E:F:G:H/I". | | [            route_map](## "router_bgp.vrfs.[].address_family_ipv6.networks.[].route_map") | String | | | | | + | [        redistribute_routes](## "router_bgp.vrfs.[].address_family_ipv6.redistribute_routes") | List, items: Dictionary | | | | | + | [          - source_protocol](## "router_bgp.vrfs.[].address_family_ipv6.redistribute_routes.[].source_protocol") | String | Required | | Valid Values:
- attached-host
- bgp
- connected
- dhcp
- dynamic
- isis
- ospfv3
- static
- user | | + | [            route_map](## "router_bgp.vrfs.[].address_family_ipv6.redistribute_routes.[].route_map") | String | | | | | + | [            include_leaked](## "router_bgp.vrfs.[].address_family_ipv6.redistribute_routes.[].include_leaked") | Boolean | | | | | + | [            rcf](## "router_bgp.vrfs.[].address_family_ipv6.redistribute_routes.[].rcf") | String | | | | RCF function name with parenthesis.
Example: MyFunction(myarg).
`route_map` and `rcf` are mutually exclusive. `route_map` takes precedence.
Only applicable if `source_protocol` is one of `connected`, `dynamic`, `isis`, `static` and `user`. | + | [            ospf_route_type](## "router_bgp.vrfs.[].address_family_ipv6.redistribute_routes.[].ospf_route_type") | String | | | Valid Values:
- external
- internal
- nssa-external
- nssa-external 1
- nssa-external 2 | Routes learned by the OSPF protocol.
The `ospf_route_type` is valid for source_protocols 'ospfv3'.
| | [      address_family_ipv4_multicast](## "router_bgp.vrfs.[].address_family_ipv4_multicast") | Dictionary | | | | | | [        bgp](## "router_bgp.vrfs.[].address_family_ipv4_multicast.bgp") | Dictionary | | | | | | [          missing_policy](## "router_bgp.vrfs.[].address_family_ipv4_multicast.bgp.missing_policy") | Dictionary | | | | | @@ -671,11 +810,17 @@ | [        neighbors](## "router_bgp.vrfs.[].address_family_ipv4_multicast.neighbors") | List, items: Dictionary | | | | | | [          - ip_address](## "router_bgp.vrfs.[].address_family_ipv4_multicast.neighbors.[].ip_address") | String | Required, Unique | | | | | [            activate](## "router_bgp.vrfs.[].address_family_ipv4_multicast.neighbors.[].activate") | Boolean | | | | | - | [            route_map_in](## "router_bgp.vrfs.[].address_family_ipv4_multicast.neighbors.[].route_map_in") | String | | | | Inbound route-map name | - | [            route_map_out](## "router_bgp.vrfs.[].address_family_ipv4_multicast.neighbors.[].route_map_out") | String | | | | Outbound route-map name | + | [            route_map_in](## "router_bgp.vrfs.[].address_family_ipv4_multicast.neighbors.[].route_map_in") | String | | | | Inbound route-map name. | + | [            route_map_out](## "router_bgp.vrfs.[].address_family_ipv4_multicast.neighbors.[].route_map_out") | String | | | | Outbound route-map name. | | [        networks](## "router_bgp.vrfs.[].address_family_ipv4_multicast.networks") | List, items: Dictionary | | | | | - | [          - prefix](## "router_bgp.vrfs.[].address_family_ipv4_multicast.networks.[].prefix") | String | Required, Unique | | | IPv6 prefix "A.B.C.D/E" | + | [          - prefix](## "router_bgp.vrfs.[].address_family_ipv4_multicast.networks.[].prefix") | String | Required, Unique | | | IPv6 prefix "A.B.C.D/E". | | [            route_map](## "router_bgp.vrfs.[].address_family_ipv4_multicast.networks.[].route_map") | String | | | | | + | [        redistribute_routes](## "router_bgp.vrfs.[].address_family_ipv4_multicast.redistribute_routes") | List, items: Dictionary | | | | | + | [          - source_protocol](## "router_bgp.vrfs.[].address_family_ipv4_multicast.redistribute_routes.[].source_protocol") | String | Required | | Valid Values:
- attached-host
- connected
- isis
- ospf
- ospfv3
- static | | + | [            route_map](## "router_bgp.vrfs.[].address_family_ipv4_multicast.redistribute_routes.[].route_map") | String | | | | | + | [            include_leaked](## "router_bgp.vrfs.[].address_family_ipv4_multicast.redistribute_routes.[].include_leaked") | Boolean | | | | Only applicable if `source_protocol` is `isis`. | + | [            rcf](## "router_bgp.vrfs.[].address_family_ipv4_multicast.redistribute_routes.[].rcf") | String | | | | RCF function name with parenthesis.
Example: MyFunction(myarg).
`route_map` and `rcf` are mutually exclusive. `route_map` takes precedence.
Only applicable if `source_protocol` is `isis`. | + | [            ospf_route_type](## "router_bgp.vrfs.[].address_family_ipv4_multicast.redistribute_routes.[].ospf_route_type") | String | | | Valid Values:
- external
- internal
- nssa-external
- nssa-external 1
- nssa-external 2 | Routes learned by the OSPF protocol.
The `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'.
| | [      address_family_ipv6_multicast](## "router_bgp.vrfs.[].address_family_ipv6_multicast") | Dictionary | | | | | | [        bgp](## "router_bgp.vrfs.[].address_family_ipv6_multicast.bgp") | Dictionary | | | | | | [          missing_policy](## "router_bgp.vrfs.[].address_family_ipv6_multicast.bgp.missing_policy") | Dictionary | | | | | @@ -686,11 +831,17 @@ | [        neighbors](## "router_bgp.vrfs.[].address_family_ipv6_multicast.neighbors") | List, items: Dictionary | | | | | | [          - ip_address](## "router_bgp.vrfs.[].address_family_ipv6_multicast.neighbors.[].ip_address") | String | Required, Unique | | | | | [            activate](## "router_bgp.vrfs.[].address_family_ipv6_multicast.neighbors.[].activate") | Boolean | | | | | - | [            route_map_in](## "router_bgp.vrfs.[].address_family_ipv6_multicast.neighbors.[].route_map_in") | String | | | | Inbound route-map name | - | [            route_map_out](## "router_bgp.vrfs.[].address_family_ipv6_multicast.neighbors.[].route_map_out") | String | | | | Outbound route-map name | + | [            route_map_in](## "router_bgp.vrfs.[].address_family_ipv6_multicast.neighbors.[].route_map_in") | String | | | | Inbound route-map name. | + | [            route_map_out](## "router_bgp.vrfs.[].address_family_ipv6_multicast.neighbors.[].route_map_out") | String | | | | Outbound route-map name. | | [        networks](## "router_bgp.vrfs.[].address_family_ipv6_multicast.networks") | List, items: Dictionary | | | | | - | [          - prefix](## "router_bgp.vrfs.[].address_family_ipv6_multicast.networks.[].prefix") | String | Required, Unique | | | IPv6 prefix "A:B:C:D:E:F:G:H/I" | + | [          - prefix](## "router_bgp.vrfs.[].address_family_ipv6_multicast.networks.[].prefix") | String | Required, Unique | | | IPv6 prefix "A:B:C:D:E:F:G:H/I". | | [            route_map](## "router_bgp.vrfs.[].address_family_ipv6_multicast.networks.[].route_map") | String | | | | | + | [        redistribute_routes](## "router_bgp.vrfs.[].address_family_ipv6_multicast.redistribute_routes") | List, items: Dictionary | | | | | + | [          - source_protocol](## "router_bgp.vrfs.[].address_family_ipv6_multicast.redistribute_routes.[].source_protocol") | String | Required | | Valid Values:
- connected
- isis
- ospf
- ospfv3
- static | | + | [            route_map](## "router_bgp.vrfs.[].address_family_ipv6_multicast.redistribute_routes.[].route_map") | String | | | | | + | [            include_leaked](## "router_bgp.vrfs.[].address_family_ipv6_multicast.redistribute_routes.[].include_leaked") | Boolean | | | | Only applicable if `source_protocol` is `isis`. | + | [            rcf](## "router_bgp.vrfs.[].address_family_ipv6_multicast.redistribute_routes.[].rcf") | String | | | | RCF function name with parenthesis.
Example: MyFunction(myarg).
`route_map` and `rcf` are mutually exclusive. `route_map` takes precedence.
Only applicable if `source_protocol` is `isis`. | + | [            ospf_route_type](## "router_bgp.vrfs.[].address_family_ipv6_multicast.redistribute_routes.[].ospf_route_type") | String | | | Valid Values:
- external
- internal
- nssa-external
- nssa-external 1
- nssa-external 2 | Routes learned by the OSPF protocol.
The `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'.
| | [      address_family_flow_spec_ipv4](## "router_bgp.vrfs.[].address_family_flow_spec_ipv4") | Dictionary | | | | | | [        bgp](## "router_bgp.vrfs.[].address_family_flow_spec_ipv4.bgp") | Dictionary | | | | | | [          missing_policy](## "router_bgp.vrfs.[].address_family_flow_spec_ipv4.bgp.missing_policy") | Dictionary | | | | | @@ -718,20 +869,20 @@ | [          neighbors](## "router_bgp.vrfs.[].address_families.[].neighbors") | List, items: Dictionary | | | | | | [            - ip_address](## "router_bgp.vrfs.[].address_families.[].neighbors.[].ip_address") | String | Required, Unique | | | | | [              activate](## "router_bgp.vrfs.[].address_families.[].neighbors.[].activate") | Boolean | | | | | - | [              route_map_in](## "router_bgp.vrfs.[].address_families.[].neighbors.[].route_map_in") | String | | | | Inbound route-map name | - | [              route_map_out](## "router_bgp.vrfs.[].address_families.[].neighbors.[].route_map_out") | String | | | | Outbound route-map name | + | [              route_map_in](## "router_bgp.vrfs.[].address_families.[].neighbors.[].route_map_in") | String | | | | Inbound route-map name. | + | [              route_map_out](## "router_bgp.vrfs.[].address_families.[].neighbors.[].route_map_out") | String | | | | Outbound route-map name. | | [          peer_groups](## "router_bgp.vrfs.[].address_families.[].peer_groups") | List, items: Dictionary | | | | | - | [            - name](## "router_bgp.vrfs.[].address_families.[].peer_groups.[].name") | String | Required, Unique | | | Peer-group name | + | [            - name](## "router_bgp.vrfs.[].address_families.[].peer_groups.[].name") | String | Required, Unique | | | Peer-group name. | | [              activate](## "router_bgp.vrfs.[].address_families.[].peer_groups.[].activate") | Boolean | | | | | | [              next_hop](## "router_bgp.vrfs.[].address_families.[].peer_groups.[].next_hop") | Dictionary | | | | | | [                address_family_ipv6_originate](## "router_bgp.vrfs.[].address_families.[].peer_groups.[].next_hop.address_family_ipv6_originate") | Boolean | | | | | | [          networks](## "router_bgp.vrfs.[].address_families.[].networks") | List, items: Dictionary | | | | | - | [            - prefix](## "router_bgp.vrfs.[].address_families.[].networks.[].prefix") | String | Required, Unique | | | IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I" | + | [            - prefix](## "router_bgp.vrfs.[].address_families.[].networks.[].prefix") | String | Required, Unique | | | IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I". | | [              route_map](## "router_bgp.vrfs.[].address_families.[].networks.[].route_map") | String | | | | | - | [      eos_cli](## "router_bgp.vrfs.[].eos_cli") | String | | | | Multiline EOS CLI rendered directly on the Router BGP, VRF definition in the final EOS configuration
| + | [      eos_cli](## "router_bgp.vrfs.[].eos_cli") | String | | | | Multiline EOS CLI rendered directly on the Router BGP, VRF definition in the final EOS configuration.
| | [  session_trackers](## "router_bgp.session_trackers") | List, items: Dictionary | | | | | - | [    - name](## "router_bgp.session_trackers.[].name") | String | Required, Unique | | | Name of session tracker | - | [      recovery_delay](## "router_bgp.session_trackers.[].recovery_delay") | Integer | | | Min: 1
Max: 3600 | Recovery delay in seconds | + | [    - name](## "router_bgp.session_trackers.[].name") | String | Required, Unique | | | Name of session tracker. | + | [      recovery_delay](## "router_bgp.session_trackers.[].recovery_delay") | Integer | | | Min: 1
Max: 3600 | Recovery delay in seconds. | | [  eos_cli](## "router_bgp.eos_cli") | String | | | | Multiline EOS CLI rendered directly on the Router BGP in the final EOS configuration. | === "YAML" @@ -746,7 +897,7 @@ # BGP AS can be deplayed in the asplain <1-4294967295> or asdot notation "<1-65535>.<0-65535>". This flag indicates which mode is preferred - asplain is the default. as_notation: - # In IP address format A.B.C.D + # In IP address format A.B.C.D. router_id: distance: external_routes: @@ -755,10 +906,10 @@ graceful_restart: enabled: - # Number of seconds + # Number of seconds. restart_time: - # Number of seconds + # Number of seconds. stalepath_time: graceful_restart_helper: enabled: @@ -783,10 +934,10 @@ # This will eliminate any temporary black holes due to a BGP speaker advertising reachability to a prefix that may not yet be installed into the forwarding plane. wait_install: - # IP Address A.B.C.D + # IP Address A.B.C.D. bgp_cluster_id: - # BGP command as string + # BGP command as string. bgp_defaults: - bgp: @@ -803,19 +954,22 @@ bestpath: d_path: - # Improved "listen_ranges" data model to support multiple listen ranges and additional filter capabilities + # Allow redistribution of iBGP routes into an Interior Gateway Protocol (IGP). EOS default is true. + redistribute_internal: + + # Improved "listen_ranges" data model to support multiple listen ranges and additional filter capabilities. listen_ranges: - # IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I" + # IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I". - prefix: - # Include router ID as part of peer filter + # Include router ID as part of peer filter. peer_id_include_router_id: - # Peer group name + # Peer group name. peer_group: - # Peer-filter name + # Peer-filter name. # note: `peer_filter` or `remote_as` is required but mutually exclusive. # If both are defined, `peer_filter` takes precedence peer_filter: @@ -825,10 +979,10 @@ remote_as: peer_groups: - # Peer-group name + # Peer-group name. - name: - # Key only used for documentation or validation purposes + # Key only used for documentation or validation purposes. type: # BGP AS <1-4294967295> or AS number in asdot notation "<1-65535>.<0-65535>". @@ -841,16 +995,16 @@ description: shutdown: - # BGP AS-PATH options + # BGP AS-PATH options. as_path: - # Replace AS number with local AS number + # Replace AS number with local AS number. remote_as_replace_out: - # Disable prepending own AS number to AS path + # Disable prepending own AS number to AS path. prepend_own_disabled: - # Remove private AS numbers in outbound AS path + # Remove private AS numbers in outbound AS path. remove_private_as: enabled: all: @@ -859,7 +1013,7 @@ enabled: replace_as: - # Peer-filter name + # Peer-filter name. # note: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with # the new `listen_ranges` key above to avoid conflicts. # This key is deprecated. @@ -868,7 +1022,7 @@ peer_filter: next_hop_unchanged: - # IP address or interface name + # IP address or interface name. update_source: route_reflector_client: @@ -885,7 +1039,7 @@ min_rx: multiplier: - # Time-to-live in range of hops + # Time-to-live in range of hops. ebgp_multihop: next_hop_self: password: @@ -894,44 +1048,77 @@ enabled: always: - # Route-map name + # Route-map name. route_map: - # 'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)' + # 'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'. send_community: - # Maximum number of routes (0 means unlimited) + # Maximum number of routes (0 means unlimited). maximum_routes: # Maximum number of routes after which a warning is issued (0 means never warn) or - # Percentage of maximum number of routes at which to warn ("<1-100> percent") + # Percentage of maximum number of routes at which to warn ("<1-100> percent"). maximum_routes_warning_limit: maximum_routes_warning_only: + + # Missing policy configuration for all address-families. + missing_policy: + + # Missing policy inbound direction. + direction_in: + + # Missing policy action. + action: + + # Include community-list references in missing policy decision. + include_community_list: + + # Include prefix-list references in missing policy decision. + include_prefix_list: + + # Include sub-route-map references in missing policy decision. + include_sub_route_map: + + # Missing policy outbound direction. + direction_out: + + # Missing policy action. + action: + + # Include community-list references in missing policy decision. + include_community_list: + + # Include prefix-list references in missing policy decision. + include_prefix_list: + + # Include sub-route-map references in missing policy decision. + include_sub_route_map: link_bandwidth: enabled: - # nn.nn(K|M|G) link speed in bits/second + # nn.nn(K|M|G) link speed in bits/second. default: allowas_in: enabled: - # Number of local ASNs allowed in a BGP update + # Number of local ASNs allowed in a BGP update. times: weight: - # BGP Keepalive and Hold Timer values in seconds as string "<0-3600> <0-3600>" + # BGP Keepalive and Hold Timer values in seconds as string "<0-3600> <0-3600>". timers: rib_in_pre_policy_retain: enabled: all: - # Inbound route-map name + # Inbound route-map name. route_map_in: - # Outbound route-map name + # Outbound route-map name. route_map_out: - # IP prefix range + # IP prefix range. # note: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with # the new `listen_ranges` key above to avoid conflicts. # This key is deprecated. @@ -939,6 +1126,13 @@ # Use listen_ranges instead. bgp_listen_range_prefix: session_tracker: + shared_secret: + + # Name of profile defined under `management_security`. + profile: + + # Note: Algorithm hmac-sha-256 requires EOS version 4.31.1F and above. + hash_algorithm: # Maximum number of hops. ttl_maximum_hops: @@ -954,16 +1148,16 @@ # For asdot notation in YAML inputs, the value must be put in quotes, to prevent it from being interpreted as a float number. local_as: - # BGP AS-PATH options + # BGP AS-PATH options. as_path: - # Replace AS number with local AS number + # Replace AS number with local AS number. remote_as_replace_out: - # Disable prepending own AS number to AS path + # Disable prepending own AS number to AS path. prepend_own_disabled: - # Key only used for documentation or validation purposes + # Key only used for documentation or validation purposes. peer: description: route_reflector_client: @@ -971,7 +1165,7 @@ passive: shutdown: - # Source Interface + # Source Interface. update_source: # Enable BFD. @@ -988,48 +1182,81 @@ multiplier: weight: - # BGP Keepalive and Hold Timer values in seconds as string "<0-3600> <0-3600>" + # BGP Keepalive and Hold Timer values in seconds as string "<0-3600> <0-3600>". timers: - # Inbound route-map name + # Inbound route-map name. route_map_in: - # Outbound route-map name + # Outbound route-map name. route_map_out: default_originate: enabled: always: route_map: - # 'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)' + # 'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'. send_community: - # Maximum number of routes (0 means unlimited) + # Maximum number of routes (0 means unlimited). maximum_routes: # Maximum number of routes after which a warning is issued (0 means never warn) or - # Percentage of maximum number of routes at which to warn ("<1-100> percent") + # Percentage of maximum number of routes at which to warn ("<1-100> percent"). maximum_routes_warning_limit: maximum_routes_warning_only: + + # Missing policy configuration for all address-families. + missing_policy: + + # Missing policy inbound direction. + direction_in: + + # Missing policy action. + action: + + # Include community-list references in missing policy decision. + include_community_list: + + # Include prefix-list references in missing policy decision. + include_prefix_list: + + # Include sub-route-map references in missing policy decision. + include_sub_route_map: + + # Missing policy outbound direction. + direction_out: + + # Missing policy action. + action: + + # Include community-list references in missing policy decision. + include_community_list: + + # Include prefix-list references in missing policy decision. + include_prefix_list: + + # Include sub-route-map references in missing policy decision. + include_sub_route_map: allowas_in: enabled: - # Number of local ASNs allowed in a BGP update + # Number of local ASNs allowed in a BGP update. times: - # Time-to-live in range of hops + # Time-to-live in range of hops. ebgp_multihop: next_hop_self: link_bandwidth: enabled: - # nn.nn(K|M|G) link speed in bits/second + # nn.nn(K|M|G) link speed in bits/second. default: rib_in_pre_policy_retain: enabled: all: - # Remove private AS numbers in outbound AS path + # Remove private AS numbers in outbound AS path. remove_private_as: enabled: all: @@ -1038,65 +1265,76 @@ enabled: replace_as: session_tracker: + shared_secret: + + # Name of profile defined under `management_security`. + profile: + + # Note: Algorithm hmac-sha-256 requires EOS version 4.31.1F and above. + hash_algorithm: # Maximum number of hops. ttl_maximum_hops: neighbor_interfaces: - # Interface name + # Interface name. - name: # BGP AS <1-4294967295> or AS number in asdot notation "<1-65535>.<0-65535>". # For asdot notation in YAML inputs, the value must be put in quotes, to prevent it from being interpreted as a float number. remote_as: - # Key only used for documentation or validation purposes + # Key only used for documentation or validation purposes. peer: peer_group: description: - # Peer-filter name + # Peer-filter name. peer_filter: aggregate_addresses: - # IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I" + # IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I". - prefix: advertise_only: as_set: - - # Route-map name - advertise_map: - - # Route-map name - supress_map: summary_only: - # Route-map name + # Route-map name. attribute_map: - # Route-map name + # Route-map name. match_map: redistribute_routes: - - source_protocol: + - source_protocol: route_map: + + # RCF function name with parenthesis. + # Example: MyFunction(myarg). + # `route_map` and `rcf` are mutually exclusive. `route_map` takes precedence. + # Only applicable if `source_protocol` is one of `connected`, `static`, `isis`, `user`, `dynamic`. + rcf: include_leaked: + + # Routes learned by the OSPF protocol. + # The `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'. + ospf_route_type: vlan_aware_bundles: - # VLAN aware bundle name + # VLAN aware bundle name. - name: - # Key only used for documentation or validation purposes + # Key only used for documentation or validation purposes. tenant: - # Key only used for documentation or validation purposes + # Key only used for documentation or validation purposes. description: - # Route distinguisher + # Route distinguisher. rd: rd_evpn_domain: domain: - # Route distinguisher + # Route distinguisher. rd: route_targets: both: @@ -1119,26 +1357,26 @@ no_redistribute_routes: - - # VLAN range as string. Example "100-200,300" + # VLAN range as string. Example "100-200,300". vlan: - # Multiline EOS CLI rendered directly on the Router BGP, VLAN-aware-bundle definition in the final EOS configuration + # Multiline EOS CLI rendered directly on the Router BGP, VLAN-aware-bundle definition in the final EOS configuration. eos_cli: vlans: - id: - # Key only used for documentation or validation purposes + # Key only used for documentation or validation purposes. tenant: - # Route distinguisher + # Route distinguisher. rd: rd_evpn_domain: domain: - # Route distinguisher + # Route distinguisher. rd: - # Multiline EOS CLI rendered directly on the Router BGP, VLAN definition in the final EOS configuration + # Multiline EOS CLI rendered directly on the Router BGP, VLAN definition in the final EOS configuration. eos_cli: route_targets: both: @@ -1162,34 +1400,34 @@ - vpws: - # VPWS instance name + # VPWS instance name. - name: - # Route distinguisher + # Route distinguisher. rd: route_targets: - # Route Target + # Route Target. import_export: mpls_control_word: label_flow: mtu: pseudowires: - # Pseudowire name + # Pseudowire name. - name: - # Must match id_remote on other pe + # Must match id_remote on other pe. id_local: - # Must match id_local on other pe + # Must match id_local on other pe. id_remote: address_family_evpn: domain_identifier: neighbor_default: encapsulation: - # Source interface name + # Source interface name. next_hop_self_source_interface: next_hop_self_received_evpn_routes: enable: @@ -1206,17 +1444,47 @@ neighbors: - ip_address: activate: + + # Inbound RCF function name with parenthesis. + # Example: MyFunction(myarg). + rcf_in: + + # Outbound RCF function name with parenthesis. + # Example: MyFunction(myarg). + rcf_out: + default_route: + enabled: + + # RCF function name with parenthesis. + # Example: MyFunction(myarg). + rcf: + route_map: peer_groups: - # Peer-group name + # Peer-group name. - name: activate: - # Inbound route-map name + # Inbound route-map name. route_map_in: - # Outbound route-map name + # Outbound route-map name. route_map_out: + + # Inbound RCF function name with parenthesis. + # Example: MyFunction(myarg). + rcf_in: + + # Outbound RCF function name with parenthesis. + # Example: MyFunction(myarg). + rcf_out: + default_route: + enabled: + + # RCF function name with parenthesis. + # Example: MyFunction(myarg). + rcf: + route_map: domain_remote: encapsulation: additional_paths: @@ -1226,33 +1494,65 @@ backup: ecmp: - # Amount of ECMP paths to send + # Amount of ECMP paths to send. ecmp_limit: - # Amount of paths to send + # Amount of paths to send. limit: evpn_hostflap_detection: enabled: - # Time (in seconds) to detect a MAC duplication issue + # Time (in seconds) to detect a MAC duplication issue. window: - # Minimum number of MAC moves that indicate a MAC Duplication issue + # Minimum number of MAC moves that indicate a MAC Duplication issue. threshold: - # Time (in seconds) to purge a MAC duplication issue + # Time (in seconds) to purge a MAC duplication issue. expiry_timeout: next_hop: resolution_disabled: route: import_match_failure_action: import_ethernet_segment_ip_mass_withdraw: + import_overlay_index_gateway: export_ethernet_segment_ip_mass_withdraw: next_hop_unchanged: + + # BGP additional-paths commands. + bgp_additional_paths: + + # Receive multiple paths. + receive: + + # Send multiple paths. + send: + + # Any eligible path. + any: + + # Best path and installed backup path. + backup: + + # All paths in best path ECMP group. + ecmp: + + # Amount of ECMP paths to send. + ecmp_limit: + + # Amount of paths to send. + limit: + + # BGP layer-2 in-place FEC operation. + layer_2_fec_in_place_update: + enabled: + + # In-place FEC update tracking timeout in seconds. + timeout: address_family_rtc: peer_groups: - # Peer-group name + # Peer-group name. - name: activate: default_route_target: @@ -1261,26 +1561,38 @@ address_family_ipv4: networks: - # IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I" + # IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I". - prefix: - # Route-map name + # Route-map name. route_map: + bgp: + + # Allow redistribution of iBGP routes into an Interior Gateway Protocol (IGP). EOS default is true. + redistribute_internal: peer_groups: - # Peer-group name + # Peer-group name. - name: activate: - # Inbound route-map name + # Inbound route-map name. route_map_in: - # Outbound route-map name + # Outbound route-map name. route_map_out: + + # Inbound RCF function name with parenthesis. + # Example: MyFunction(myarg). + rcf_in: + + # Outbound RCF function name with parenthesis. + # Example: MyFunction(myarg). + rcf_out: default_originate: always: - # Route-map name + # Route-map name. route_map: next_hop: address_family_ipv6: @@ -1291,118 +1603,185 @@ # Use address_family_ipv6 instead. address_family_ipv6_originate: - # Inbound prefix-list name + # Inbound prefix-list name. prefix_list_in: - # Outbound prefix-list name + # Outbound prefix-list name. prefix_list_out: neighbors: - ip_address: activate: - # Inbound route-map name + # Inbound route-map name. route_map_in: - # Outbound route-map name + # Outbound route-map name. route_map_out: - # Inbound prefix-list name + # Inbound RCF function name with parenthesis. + # Example: MyFunction(myarg). + rcf_in: + + # Outbound RCF function name with parenthesis. + # Example: MyFunction(myarg). + rcf_out: + + # Inbound prefix-list name. prefix_list_in: - # Prefix-list name + # Prefix-list name. prefix_list_out: default_originate: always: route_map: + redistribute_routes: + - source_protocol: + route_map: + + # Only applicable if `source_protocol` is one of `connected`, `static`, `isis`, `ospf`, `ospfv3`. + include_leaked: + + # RCF function name with parenthesis. + # Example: MyFunction(myarg). + # `route_map` and `rcf` are mutually exclusive. `route_map` takes precedence. + # Only applicable if `source_protocol` is one of `connected`, `static`, `isis`, `user`, `dynamic`. + rcf: + + # Routes learned by the OSPF protocol. + # The `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'. + ospf_route_type: address_family_ipv4_multicast: peer_groups: - # Peer-group name + # Peer-group name. - name: activate: - # Inbound route-map name + # Inbound route-map name. route_map_in: - # Outbound route-map name + # Outbound route-map name. route_map_out: neighbors: - ip_address: activate: - # Inbound route-map name + # Inbound route-map name. route_map_in: - # Outbound route-map name + # Outbound route-map name. route_map_out: redistribute_routes: - source_protocol: route_map: + + # Only applicable if `source_protocol` is `isis`. + include_leaked: + + # RCF function name with parenthesis. + # Example: MyFunction(myarg). + # `route_map` and `rcf` are mutually exclusive. `route_map` takes precedence. + # Only applicable if `source_protocol` is `isis`. + rcf: + + # Routes learned by the OSPF protocol. + # The `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'. + ospf_route_type: address_family_ipv4_sr_te: neighbors: - ip_address: activate: - # Inbound route-map name + # Inbound route-map name. route_map_in: - # Outbound route-map name + # Outbound route-map name. route_map_out: peer_groups: - # Peer-group name + # Peer-group name. - name: activate: - # Inbound route-map name + # Inbound route-map name. route_map_in: - # Outbound route-map name + # Outbound route-map name. route_map_out: address_family_ipv6: networks: - # IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I" + # IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I". - prefix: - # Route-map name + # Route-map name. route_map: + bgp: + + # Allow redistribution of iBGP routes into an Interior Gateway Protocol (IGP). EOS default is true. + redistribute_internal: peer_groups: - # Peer-group name + # Peer-group name. - name: activate: - # Inbound route-map name + # Inbound route-map name. route_map_in: - # Outbound route-map name + # Outbound route-map name. route_map_out: - # Inbound prefix-list name + # Inbound RCF function name with parenthesis. + # Example: MyFunction(myarg). + rcf_in: + + # Outbound RCF function name with parenthesis. + # Example: MyFunction(myarg). + rcf_out: + + # Inbound prefix-list name. prefix_list_in: - # Outbound prefix-list name + # Outbound prefix-list name. prefix_list_out: neighbors: - ip_address: activate: - # Inbound route-map name + # Inbound route-map name. route_map_in: - # Outbound route-map name + # Outbound route-map name. route_map_out: - # Inbound prefix-list name + # Inbound RCF function name with parenthesis. + # Example: MyFunction(myarg). + rcf_in: + + # Outbound RCF function name with parenthesis. + # Example: MyFunction(myarg). + rcf_out: + + # Inbound prefix-list name. prefix_list_in: - # Outbound prefix-list name + # Outbound prefix-list name. prefix_list_out: redistribute_routes: - source_protocol: route_map: include_leaked: + + # RCF function name with parenthesis. + # Example: MyFunction(myarg). + # `route_map` and `rcf` are mutually exclusive. `route_map` takes precedence. + # Only used if `source_protocol` is one of `connected`, `static`, `isis`, `user`, `dynamic`. + rcf: + + # Routes learned by the OSPF protocol. + # The `ospf_route_type` is valid for source_protocols 'ospfv3'. + ospf_route_type: address_family_ipv6_multicast: bgp: missing_policy: @@ -1414,41 +1793,57 @@ - ip_address: activate: - # Inbound route-map name + # Inbound route-map name. route_map_in: - # Outbound route-map name + # Outbound route-map name. route_map_out: peer_groups: - # Peer-group name + # Peer-group name. - name: activate: networks: - # IPv6 prefix "A:B:C:D:E:F:G:H/I" + # IPv6 prefix "A:B:C:D:E:F:G:H/I". - prefix: route_map: + redistribute_routes: + - source_protocol: + + # Only applicable if `source_protocol` is `isis`. + include_leaked: + route_map: + + # RCF function name with parenthesis. + # Example: MyFunction(myarg). + # `route_map` and `rcf` are mutually exclusive. `route_map` takes precedence. + # Only applicable if `source_protocol` is `isis`. + rcf: + + # Routes learned by the OSPF protocol. + # The `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'. + ospf_route_type: address_family_ipv6_sr_te: neighbors: - ip_address: activate: - # Inbound route-map name + # Inbound route-map name. route_map_in: - # Outbound route-map name + # Outbound route-map name. route_map_out: peer_groups: - # Peer-group name + # Peer-group name. - name: activate: - # Inbound route-map name + # Inbound route-map name. route_map_in: - # Outbound route-map name + # Outbound route-map name. route_map_out: address_family_link_state: bgp: @@ -1457,7 +1852,7 @@ direction_out_action: peer_groups: - # Peer-group name + # Peer-group name. - name: activate: missing_policy: @@ -1484,7 +1879,7 @@ activate: peer_groups: - # Peer-group name + # Peer-group name. - name: activate: address_family_flow_spec_ipv6: @@ -1497,7 +1892,7 @@ activate: peer_groups: - # Peer-group name + # Peer-group name. - name: activate: address_family_path_selection: @@ -1509,10 +1904,10 @@ backup: ecmp: - # Amount of ECMP paths to send + # Amount of ECMP paths to send. ecmp_limit: - # Amount of paths to send + # Amount of paths to send. limit: neighbors: - ip_address: @@ -1526,14 +1921,14 @@ backup: ecmp: - # Amount of ECMP paths to send + # Amount of ECMP paths to send. ecmp_limit: - # Amount of paths to send + # Amount of paths to send. limit: peer_groups: - # Peer-group name + # Peer-group name. - name: activate: additional_paths: @@ -1545,98 +1940,196 @@ backup: ecmp: - # Amount of ECMP paths to send + # Amount of ECMP paths to send. ecmp_limit: - # Amount of paths to send + # Amount of paths to send. limit: address_family_vpn_ipv4: domain_identifier: peer_groups: - # Peer-group name + # Peer-group name. - name: activate: - # Inbound route-map name + # Inbound route-map name. route_map_in: - # Outbound route-map name + # Outbound route-map name. route_map_out: + + # Inbound RCF function name with parenthesis. + # Example: MyFunction(myarg). + rcf_in: + + # Outbound RCF function name with parenthesis. + # Example: MyFunction(myarg). + rcf_out: + default_route: + enabled: + + # RCF function name with parenthesis. + # Example: MyFunction(myarg). + rcf: + route_map: route: import_match_failure_action: neighbors: - ip_address: activate: - # Inbound route-map name + # Inbound route-map name. route_map_in: - # Outbound route-map name + # Outbound route-map name. route_map_out: + + # Inbound RCF function name with parenthesis. + # Example: MyFunction(myarg). + rcf_in: + + # Outbound RCF function name with parenthesis. + # Example: MyFunction(myarg). + rcf_out: + default_route: + enabled: + + # RCF function name with parenthesis. + # Example: MyFunction(myarg). + rcf: + route_map: neighbor_default_encapsulation_mpls_next_hop_self: source_interface: address_family_vpn_ipv6: domain_identifier: peer_groups: - # Peer-group name + # Peer-group name. - name: activate: - # Inbound route-map name + # Inbound route-map name. route_map_in: - # Outbound route-map name + # Outbound route-map name. route_map_out: + + # Inbound RCF function name with parenthesis. + # Example: MyFunction(myarg). + rcf_in: + + # Outbound RCF function name with parenthesis. + # Example: MyFunction(myarg). + rcf_out: + default_route: + enabled: + + # RCF function name with parenthesis. + # Example: MyFunction(myarg). + rcf: + route_map: route: import_match_failure_action: neighbors: - ip_address: activate: - # Inbound route-map name + # Inbound route-map name. route_map_in: - # Outbound route-map name + # Outbound route-map name. route_map_out: + + # Inbound RCF function name with parenthesis. + # Example: MyFunction(myarg). + rcf_in: + + # Outbound RCF function name with parenthesis. + # Example: MyFunction(myarg). + rcf_out: + default_route: + enabled: + + # RCF function name with parenthesis. + # Example: MyFunction(myarg). + rcf: + route_map: neighbor_default_encapsulation_mpls_next_hop_self: source_interface: vrfs: - # VRF name + # VRF name. - name: + bgp: - # Route distinguisher + # Allow redistribution of iBGP routes into an Interior Gateway Protocol (IGP). EOS default is true. + redistribute_internal: + + # Route distinguisher. rd: evpn_multicast: - # Enable per-AF EVPN multicast settings + # Enable per-AF EVPN multicast settings. evpn_multicast_address_family: ipv4: - # Enable EVPN multicast transit mode + # Enable EVPN multicast transit mode. transit: + + # Enable default-originate per VRF/address-family. + default_route_exports: + - address_family: + always: + route_map: + + # RCF function name with parenthesis. + # Example: MyFunction(myarg). + rcf: route_targets: import: - address_family: route_targets: - + + # Only applicable if `address_family` is one of `evpn`, `vpn-ipv4` or `vpn-ipv6`. route_map: + + # RCF function name with parenthesis. + # Example: MyFunction(myarg). + # Only applicable if `address_family` is one of `evpn`, `vpn-ipv4` or `vpn-ipv6`. + rcf: + + # RCF function name with parenthesis for filtering VPN routes. Also requires `rcf` to be set. + # Example: MyFunction(myarg). + # Only applicable if `address_family` is one of `vpn-ipv4` or `vpn-ipv6`. + vpn_route_filter_rcf: export: - address_family: route_targets: - + + # Only applicable if `address_family` is one of `evpn`, `vpn-ipv4` or `vpn-ipv6`. route_map: - # in IP address format A.B.C.D + # RCF function name with parenthesis. + # Example: MyFunction(myarg). + # Only applicable if `address_family` is one of `evpn`, `vpn-ipv4` or `vpn-ipv6`. + rcf: + + # RCF function name with parenthesis for filtering VPN routes. Also requires `rcf` to be set. + # Example: MyFunction(myarg). + # Only applicable if `address_family` is one of `vpn-ipv4` or `vpn-ipv6`. + vpn_route_filter_rcf: + + # in IP address format A.B.C.D. router_id: - # BGP Keepalive and Hold Timer values in seconds as string "<0-3600> <0-3600>" + # BGP Keepalive and Hold Timer values in seconds as string "<0-3600> <0-3600>". timers: networks: - # IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I" + # IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I". - prefix: route_map: updates: @@ -1648,21 +2141,21 @@ # This will eliminate any temporary black holes due to a BGP speaker advertising reachability to a prefix that may not yet be installed into the forwarding plane. wait_install: - # Improved "listen_ranges" data model to support multiple listen ranges and additional filter capabilities + # Improved "listen_ranges" data model to support multiple listen ranges and additional filter capabilities. listen_ranges: - # IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I" + # IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I". - prefix: - # Include router ID as part of peer filter + # Include router ID as part of peer filter. peer_id_include_router_id: - # Peer-group name + # Peer-group name. peer_group: - # Peer-filter name + # Peer-filter name. # note: `peer_filter`` or `remote_as` is required but mutually exclusive. - # If both are defined, peer_filter takes precedence + # If both are defined, peer_filter takes precedence. peer_filter: # BGP AS <1-4294967295> or AS number in asdot notation "<1-65535>.<0-65535>". @@ -1671,7 +2164,7 @@ neighbors: - ip_address: - # Peer-group name + # Peer-group name. peer_group: # BGP AS <1-4294967295> or AS number in asdot notation "<1-65535>.<0-65535>". @@ -1680,7 +2173,7 @@ password: passive: - # Remove private AS numbers in outbound AS path + # Remove private AS numbers in outbound AS path. remove_private_as: enabled: all: @@ -1694,18 +2187,18 @@ # For asdot notation in YAML inputs, the value must be put in quotes, to prevent it from being interpreted as a float number. local_as: - # BGP AS-PATH options + # BGP AS-PATH options. as_path: - # Replace AS number with local AS number + # Replace AS number with local AS number. remote_as_replace_out: - # Disable prepending own AS number to AS path + # Disable prepending own AS number to AS path. prepend_own_disabled: description: route_reflector_client: - # Time-to-live in range of hops + # Time-to-live in range of hops. ebgp_multihop: next_hop_self: shutdown: @@ -1723,24 +2216,24 @@ min_rx: multiplier: - # BGP Keepalive and Hold Timer values in seconds as string "<0-3600> <0-3600>" + # BGP Keepalive and Hold Timer values in seconds as string "<0-3600> <0-3600>". timers: rib_in_pre_policy_retain: enabled: all: - # 'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)' + # 'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'. send_community: maximum_routes: # Maximum number of routes after which a warning is issued (0 means never warn) or - # Percentage of maximum number of routes at which to warn ("<1-100> percent") + # Percentage of maximum number of routes at which to warn ("<1-100> percent"). maximum_routes_warning_limit: maximum_routes_warning_only: allowas_in: enabled: - # Number of local ASNs allowed in a BGP update + # Number of local ASNs allowed in a BGP update. times: default_originate: enabled: @@ -1748,54 +2241,58 @@ route_map: update_source: - # Inbound route-map name + # Inbound route-map name. route_map_in: - # Outbound route-map name + # Outbound route-map name. route_map_out: - # Inbound prefix-list name + # Inbound prefix-list name. # This key is deprecated. # Support will be removed in AVD version 5.0.0. # Use router_bgp.vrfs[].address_family_ipv4.neighbors[].prefix_list_in or router_bgp.vrfs[].address_family_ipv6.neighbors[].prefix_list_in instead. prefix_list_in: - # Outbound prefix-list name + # Outbound prefix-list name. # This key is deprecated. # Support will be removed in AVD version 5.0.0. # Use router_bgp.vrfs[].address_family_ipv4.neighbors[].prefix_list_out or router_bgp.vrfs[].address_family_ipv6.neighbors[].prefix_list_out instead. prefix_list_out: neighbor_interfaces: - # Interface name + # Interface name. - name: # BGP AS <1-4294967295> or AS number in asdot notation "<1-65535>.<0-65535>". # For asdot notation in YAML inputs, the value must be put in quotes, to prevent it from being interpreted as a float number. remote_as: - # Peer-group name + # Peer-group name. peer_group: - # Peer-filter name + # Peer-filter name. peer_filter: description: redistribute_routes: - source_protocol: route_map: include_leaked: + + # RCF function name with parenthesis. + # Example: MyFunction(myarg). + # `route_map` and `rcf` are mutually exclusive. `route_map` takes precedence. + # Only applicable if `source_protocol` is one of `connected`, `dynamic`, `isis`, `static` and `user`. + rcf: + + # Routes learned by the OSPF protocol. + # The `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'. + ospf_route_type: aggregate_addresses: - # IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I" + # IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I". - prefix: advertise_only: as_set: - - # Route-map name - advertise_map: - - # Route-map name - supress_map: summary_only: attribute_map: match_map: @@ -1813,25 +2310,36 @@ backup: ecmp: - # Amount of ECMP paths to send + # Amount of ECMP paths to send. ecmp_limit: - # Amount of paths to send + # Amount of paths to send. limit: + + # Allow redistribution of iBGP routes into an Interior Gateway Protocol (IGP). EOS default is true. + redistribute_internal: neighbors: - ip_address: activate: - # Inbound route-map name + # Inbound route-map name. route_map_in: - # Outbound route-map name + # Outbound route-map name. route_map_out: - # Inbound prefix-list name + # Inbound RCF function name with parenthesis. + # Example: MyFunction(myarg). + rcf_in: + + # Outbound RCF function name with parenthesis. + # Example: MyFunction(myarg). + rcf_out: + + # Inbound prefix-list name. prefix_list_in: - # Outbound prefix-list name + # Outbound prefix-list name. prefix_list_out: next_hop: address_family_ipv6: @@ -1839,9 +2347,23 @@ originate: networks: - # IPv4 prefix "A.B.C.D/E" + # IPv4 prefix "A.B.C.D/E". - prefix: route_map: + redistribute_routes: + - source_protocol: + route_map: + include_leaked: + + # RCF function name with parenthesis. + # Example: MyFunction(myarg). + # `route_map` and `rcf` are mutually exclusive. `route_map` takes precedence. + # Only applicable if `source_protocol` is one of `connected`, `dynamic`, `isis`, `static` and `user`. + rcf: + + # Routes learned by the OSPF protocol. + # The `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'. + ospf_route_type: address_family_ipv6: bgp: missing_policy: @@ -1856,31 +2378,56 @@ backup: ecmp: - # Amount of ECMP paths to send + # Amount of ECMP paths to send. ecmp_limit: - # Amount of paths to send + # Amount of paths to send. limit: + + # Allow redistribution of iBGP routes into an Interior Gateway Protocol (IGP). EOS default is true. + redistribute_internal: neighbors: - ip_address: activate: - # Inbound route-map name + # Inbound route-map name. route_map_in: - # Outbound route-map name + # Outbound route-map name. route_map_out: - # Inbound prefix-list name + # Inbound RCF function name with parenthesis. + # Example: MyFunction(myarg). + rcf_in: + + # Outbound RCF function name with parenthesis. + # Example: MyFunction(myarg). + rcf_out: + + # Inbound prefix-list name. prefix_list_in: - # Outbound prefix-list name + # Outbound prefix-list name. prefix_list_out: networks: - # IPv6 prefix "A:B:C:D:E:F:G:H/I" + # IPv6 prefix "A:B:C:D:E:F:G:H/I". - prefix: route_map: + redistribute_routes: + - source_protocol: + route_map: + include_leaked: + + # RCF function name with parenthesis. + # Example: MyFunction(myarg). + # `route_map` and `rcf` are mutually exclusive. `route_map` takes precedence. + # Only applicable if `source_protocol` is one of `connected`, `dynamic`, `isis`, `static` and `user`. + rcf: + + # Routes learned by the OSPF protocol. + # The `ospf_route_type` is valid for source_protocols 'ospfv3'. + ospf_route_type: address_family_ipv4_multicast: bgp: missing_policy: @@ -1892,16 +2439,32 @@ - ip_address: activate: - # Inbound route-map name + # Inbound route-map name. route_map_in: - # Outbound route-map name + # Outbound route-map name. route_map_out: networks: - # IPv6 prefix "A.B.C.D/E" + # IPv6 prefix "A.B.C.D/E". - prefix: route_map: + redistribute_routes: + - source_protocol: + route_map: + + # Only applicable if `source_protocol` is `isis`. + include_leaked: + + # RCF function name with parenthesis. + # Example: MyFunction(myarg). + # `route_map` and `rcf` are mutually exclusive. `route_map` takes precedence. + # Only applicable if `source_protocol` is `isis`. + rcf: + + # Routes learned by the OSPF protocol. + # The `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'. + ospf_route_type: address_family_ipv6_multicast: bgp: missing_policy: @@ -1913,16 +2476,32 @@ - ip_address: activate: - # Inbound route-map name + # Inbound route-map name. route_map_in: - # Outbound route-map name + # Outbound route-map name. route_map_out: networks: - # IPv6 prefix "A:B:C:D:E:F:G:H/I" + # IPv6 prefix "A:B:C:D:E:F:G:H/I". - prefix: route_map: + redistribute_routes: + - source_protocol: + route_map: + + # Only applicable if `source_protocol` is `isis`. + include_leaked: + + # RCF function name with parenthesis. + # Example: MyFunction(myarg). + # `route_map` and `rcf` are mutually exclusive. `route_map` takes precedence. + # Only applicable if `source_protocol` is `isis`. + rcf: + + # Routes learned by the OSPF protocol. + # The `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'. + ospf_route_type: address_family_flow_spec_ipv4: bgp: missing_policy: @@ -1954,32 +2533,32 @@ - ip_address: activate: - # Inbound route-map name + # Inbound route-map name. route_map_in: - # Outbound route-map name + # Outbound route-map name. route_map_out: peer_groups: - # Peer-group name + # Peer-group name. - name: activate: next_hop: address_family_ipv6_originate: networks: - # IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I" + # IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I". - prefix: route_map: - # Multiline EOS CLI rendered directly on the Router BGP, VRF definition in the final EOS configuration + # Multiline EOS CLI rendered directly on the Router BGP, VRF definition in the final EOS configuration. eos_cli: session_trackers: - # Name of session tracker + # Name of session tracker. - name: - # Recovery delay in seconds + # Recovery delay in seconds. recovery_delay: # Multiline EOS CLI rendered directly on the Router BGP in the final EOS configuration. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-general.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-general.md index e44d0aa1924..a35fe45f743 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-general.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-general.md @@ -9,17 +9,21 @@ | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [router_general](## "router_general") | Dictionary | | | | | | [  router_id](## "router_general.router_id") | Dictionary | | | | | - | [    ipv4](## "router_general.router_id.ipv4") | String | | | | IPv4 Address | - | [    ipv6](## "router_general.router_id.ipv6") | String | | | | IPv6 Address | + | [    ipv4](## "router_general.router_id.ipv4") | String | | | | IPv4 Address. | + | [    ipv6](## "router_general.router_id.ipv6") | String | | | | IPv6 Address. | | [  nexthop_fast_failover](## "router_general.nexthop_fast_failover") | Boolean | | `False` | | | | [  vrfs](## "router_general.vrfs") | List, items: Dictionary | | | | | - | [    - name](## "router_general.vrfs.[].name") | String | Required, Unique | | | Destination-VRF | + | [    - name](## "router_general.vrfs.[].name") | String | Required, Unique | | | Destination-VRF. | | [      leak_routes](## "router_general.vrfs.[].leak_routes") | List, items: Dictionary | | | | | | [        - source_vrf](## "router_general.vrfs.[].leak_routes.[].source_vrf") | String | | | | | - | [          subscribe_policy](## "router_general.vrfs.[].leak_routes.[].subscribe_policy") | String | | | | Route-Map Policy | + | [          subscribe_policy](## "router_general.vrfs.[].leak_routes.[].subscribe_policy") | String | | | | Route-Map Policy. | | [      routes](## "router_general.vrfs.[].routes") | Dictionary | | | | | | [        dynamic_prefix_lists](## "router_general.vrfs.[].routes.dynamic_prefix_lists") | List, items: Dictionary | | | | | - | [          - name](## "router_general.vrfs.[].routes.dynamic_prefix_lists.[].name") | String | | | | Dynamic Prefix List Name | + | [          - name](## "router_general.vrfs.[].routes.dynamic_prefix_lists.[].name") | String | | | | Dynamic Prefix List Name. | + | [  control_functions](## "router_general.control_functions") | Dictionary | | | | Routing control functions (RCF) used to filter and update routes from a peer or during redistributions.
Warning:
This configuration cannot be pushed with `eos_config_deploy_eapi`, because of limitations in `arista.eos` and `ansible.netcommon` plugins.
The configuration can be pushed via CloudVision with `eos_config_deploy_cvp` or `cv_deploy`. | + | [    code_units](## "router_general.control_functions.code_units") | List, items: Dictionary | | | | | + | [      - name](## "router_general.control_functions.code_units.[].name") | String | Required, Unique | | | Name of the code unit. | + | [        content](## "router_general.control_functions.code_units.[].content") | String | Required | | | Content of route control function.
e.g.
function ACCEPT_ALL() {
return true;
}
EOF | === "YAML" @@ -27,24 +31,42 @@ router_general: router_id: - # IPv4 Address + # IPv4 Address. ipv4: - # IPv6 Address + # IPv6 Address. ipv6: nexthop_fast_failover: vrfs: - # Destination-VRF + # Destination-VRF. - name: leak_routes: - source_vrf: - # Route-Map Policy + # Route-Map Policy. subscribe_policy: routes: dynamic_prefix_lists: - # Dynamic Prefix List Name + # Dynamic Prefix List Name. - name: + + # Routing control functions (RCF) used to filter and update routes from a peer or during redistributions. + # Warning: + # This configuration cannot be pushed with `eos_config_deploy_eapi`, because of limitations in `arista.eos` and `ansible.netcommon` plugins. + # The configuration can be pushed via CloudVision with `eos_config_deploy_cvp` or `cv_deploy`. + control_functions: + code_units: + + # Name of the code unit. + - name: + + # Content of route control function. + # e.g. + # function ACCEPT_ALL() { + # return true; + # } + # EOF + content: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-igmp.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-igmp.md index 88f5fea1207..d79c06d2cbb 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-igmp.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-igmp.md @@ -8,20 +8,20 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [router_igmp](## "router_igmp") | Dictionary | | | | | - | [  host_proxy_match_mroute](## "router_igmp.host_proxy_match_mroute") | String | | | Valid Values:
- all
- iif | Specify conditions for sending IGMP joins for host-proxy
'iif' will enable igmp host-proxy to work in iif aware
'all' will enable igmp host-proxy to work in iif unaware mode (EOS default)
| + | [  host_proxy_match_mroute](## "router_igmp.host_proxy_match_mroute") | String | | | Valid Values:
- all
- iif | Specify conditions for sending IGMP joins for host-proxy.
'iif' will enable igmp host-proxy to work in iif aware.
'all' will enable igmp host-proxy to work in iif unaware mode (EOS default).
| | [  ssm_aware](## "router_igmp.ssm_aware") | Boolean | | | | | | [  vrfs](## "router_igmp.vrfs") | List, items: Dictionary | | | | Configure IGMP in a VRF.
VRF 'default' is not supported in EOS, please see keys directly under 'router_igmp'. | - | [    - name](## "router_igmp.vrfs.[].name") | String | Required, Unique | | | VRF name | - | [      host_proxy_match_mroute](## "router_igmp.vrfs.[].host_proxy_match_mroute") | String | | | Valid Values:
- all
- iif | Specify conditions for sending IGMP joins for host-proxy
'iif' will enable igmp host-proxy to work in iif aware
'all' will enable igmp host-proxy to work in iif unaware mode (EOS default)
| + | [    - name](## "router_igmp.vrfs.[].name") | String | Required, Unique | | | VRF name. | + | [      host_proxy_match_mroute](## "router_igmp.vrfs.[].host_proxy_match_mroute") | String | | | Valid Values:
- all
- iif | Specify conditions for sending IGMP joins for host-proxy.
'iif' will enable igmp host-proxy to work in iif aware.
'all' will enable igmp host-proxy to work in iif unaware mode (EOS default).
| === "YAML" ```yaml router_igmp: - # Specify conditions for sending IGMP joins for host-proxy - # 'iif' will enable igmp host-proxy to work in iif aware - # 'all' will enable igmp host-proxy to work in iif unaware mode (EOS default) + # Specify conditions for sending IGMP joins for host-proxy. + # 'iif' will enable igmp host-proxy to work in iif aware. + # 'all' will enable igmp host-proxy to work in iif unaware mode (EOS default). host_proxy_match_mroute: ssm_aware: @@ -29,11 +29,11 @@ # VRF 'default' is not supported in EOS, please see keys directly under 'router_igmp'. vrfs: - # VRF name + # VRF name. - name: - # Specify conditions for sending IGMP joins for host-proxy - # 'iif' will enable igmp host-proxy to work in iif aware - # 'all' will enable igmp host-proxy to work in iif unaware mode (EOS default) + # Specify conditions for sending IGMP joins for host-proxy. + # 'iif' will enable igmp host-proxy to work in iif aware. + # 'all' will enable igmp host-proxy to work in iif unaware mode (EOS default). host_proxy_match_mroute: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-isis.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-isis.md index b850904c484..7a37065b25b 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-isis.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-isis.md @@ -8,9 +8,9 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [router_isis](## "router_isis") | Dictionary | | | | | - | [  instance](## "router_isis.instance") | String | Required | | | ISIS Instance Name | - | [  net](## "router_isis.net") | String | | | | CLNS Address like "49.0001.0001.0000.0001.00" | - | [  router_id](## "router_isis.router_id") | String | | | | IPv4 Address | + | [  instance](## "router_isis.instance") | String | Required | | | ISIS Instance Name. | + | [  net](## "router_isis.net") | String | | | | CLNS Address like "49.0001.0001.0000.0001.00". | + | [  router_id](## "router_isis.router_id") | String | | | | IPv4 Address. | | [  is_type](## "router_isis.is_type") | String | | | Valid Values:
- level-1
- level-1-2
- level-2 | | | [  log_adjacency_changes](## "router_isis.log_adjacency_changes") | Boolean | | | | | | [  mpls_ldp_sync_default](## "router_isis.mpls_ldp_sync_default") | Boolean | | | | | @@ -77,14 +77,14 @@ | [  advertise](## "router_isis.advertise") | Dictionary | | | | | | [    passive_only](## "router_isis.advertise.passive_only") | Boolean | | | | | | [  address_family](## "router_isis.address_family") | List, items: String | | | | | - | [    - <str>](## "router_isis.address_family.[]") deprecated | String | | | Valid Values:
- ipv4
- ipv6
- ipv4 unicast
- ipv6 unicast | Address FamilyThis key is deprecated. Support will be removed in AVD version 5.0.0. Use address_family_ipv4.enabled or address_family_ipv6.enabled instead. | + | [    - <str>](## "router_isis.address_family.[]") deprecated | String | | | Valid Values:
- ipv4
- ipv6
- ipv4 unicast
- ipv6 unicast | Address Family.This key is deprecated. Support will be removed in AVD version 5.0.0. Use address_family_ipv4.enabled or address_family_ipv6.enabled instead. | | [  isis_af_defaults](## "router_isis.isis_af_defaults") | List, items: String | | | | | - | [    - <str>](## "router_isis.isis_af_defaults.[]") deprecated | String | | | | EOS CLI rendered under the address families
Example "maximum-paths 64"
This key is deprecated. Support will be removed in AVD version 5.0.0. Use address_family_ipv4/address_family_ipv6 instead. | + | [    - <str>](## "router_isis.isis_af_defaults.[]") deprecated | String | | | | EOS CLI rendered under the address families.
Example "maximum-paths 64"
This key is deprecated. Support will be removed in AVD version 5.0.0. Use address_family_ipv4/address_family_ipv6 instead. | | [  redistribute_routes](## "router_isis.redistribute_routes") | List, items: Dictionary | | | | | | [    - source_protocol](## "router_isis.redistribute_routes.[].source_protocol") | String | Required | | Valid Values:
- bgp
- connected
- isis
- ospf
- ospfv3
- static | | - | [      route_map](## "router_isis.redistribute_routes.[].route_map") | String | | | | Route-map name | + | [      route_map](## "router_isis.redistribute_routes.[].route_map") | String | | | | Route-map name. | | [      include_leaked](## "router_isis.redistribute_routes.[].include_leaked") | Boolean | | | | | - | [      ospf_route_type](## "router_isis.redistribute_routes.[].ospf_route_type") | String | | | Valid Values:
- external
- internal
- nssa-external | ospf_route_type is required with source_protocols 'ospf' and 'ospfv3' | + | [      ospf_route_type](## "router_isis.redistribute_routes.[].ospf_route_type") | String | | | Valid Values:
- external
- internal
- nssa-external | ospf_route_type is required with source_protocols 'ospf' and 'ospfv3'. | | [  address_family_ipv4](## "router_isis.address_family_ipv4") | Dictionary | | | | | | [    enabled](## "router_isis.address_family_ipv4.enabled") | Boolean | | | | | | [    maximum_paths](## "router_isis.address_family_ipv4.maximum_paths") | Integer | | | Min: 1
Max: 128 | | @@ -92,12 +92,12 @@ | [    fast_reroute_ti_lfa](## "router_isis.address_family_ipv4.fast_reroute_ti_lfa") | Dictionary | | | | | | [      mode](## "router_isis.address_family_ipv4.fast_reroute_ti_lfa.mode") | String | | | Valid Values:
- link-protection
- node-protection | | | [      level](## "router_isis.address_family_ipv4.fast_reroute_ti_lfa.level") | String | | | Valid Values:
- level-1
- level-2 | | - | [      srlg](## "router_isis.address_family_ipv4.fast_reroute_ti_lfa.srlg") | Dictionary | | | | Shared Risk Link Group | + | [      srlg](## "router_isis.address_family_ipv4.fast_reroute_ti_lfa.srlg") | Dictionary | | | | Shared Risk Link Group. | | [        enable](## "router_isis.address_family_ipv4.fast_reroute_ti_lfa.srlg.enable") | Boolean | | | | | | [        strict](## "router_isis.address_family_ipv4.fast_reroute_ti_lfa.srlg.strict") | Boolean | | | | | | [    tunnel_source_labeled_unicast](## "router_isis.address_family_ipv4.tunnel_source_labeled_unicast") | Dictionary | | | | | | [      enabled](## "router_isis.address_family_ipv4.tunnel_source_labeled_unicast.enabled") | Boolean | | | | | - | [      rcf](## "router_isis.address_family_ipv4.tunnel_source_labeled_unicast.rcf") | String | | | | Route Control Function | + | [      rcf](## "router_isis.address_family_ipv4.tunnel_source_labeled_unicast.rcf") | String | | | | Route Control Function. | | [  address_family_ipv6](## "router_isis.address_family_ipv6") | Dictionary | | | | | | [    enabled](## "router_isis.address_family_ipv6.enabled") | Boolean | | | | | | [    maximum_paths](## "router_isis.address_family_ipv6.maximum_paths") | Integer | | | Min: 1
Max: 128 | | @@ -105,7 +105,7 @@ | [    fast_reroute_ti_lfa](## "router_isis.address_family_ipv6.fast_reroute_ti_lfa") | Dictionary | | | | | | [      mode](## "router_isis.address_family_ipv6.fast_reroute_ti_lfa.mode") | String | | | Valid Values:
- link-protection
- node-protection | | | [      level](## "router_isis.address_family_ipv6.fast_reroute_ti_lfa.level") | String | | | Valid Values:
- level-1
- level-2 | Optional, default is to protect all levels. | - | [      srlg](## "router_isis.address_family_ipv6.fast_reroute_ti_lfa.srlg") | Dictionary | | | | Shared Risk Link Group | + | [      srlg](## "router_isis.address_family_ipv6.fast_reroute_ti_lfa.srlg") | Dictionary | | | | Shared Risk Link Group. | | [        enable](## "router_isis.address_family_ipv6.fast_reroute_ti_lfa.srlg.enable") | Boolean | | | | | | [        strict](## "router_isis.address_family_ipv6.fast_reroute_ti_lfa.srlg.strict") | Boolean | | | | | | [  segment_routing_mpls](## "router_isis.segment_routing_mpls") | Dictionary | | | | | @@ -115,8 +115,10 @@ | [      - prefix](## "router_isis.segment_routing_mpls.prefix_segments.[].prefix") | String | | | | | | [        index](## "router_isis.segment_routing_mpls.prefix_segments.[].index") | Integer | | | | | | [  spf_interval](## "router_isis.spf_interval") | Dictionary | | | | | - | [    interval](## "router_isis.spf_interval.interval") | Integer | | | Min: 1
Max: 300 | Maximum interval between two SPFs in seconds. | + | [    interval](## "router_isis.spf_interval.interval") | Integer | | | | Maximum interval between two SPFs in seconds or milliseconds.
Range in seconds: <1-300>
Range in milliseconds: <1-300000> | + | [    interval_unit](## "router_isis.spf_interval.interval_unit") | String | | | Valid Values:
- seconds
- milliseconds | If interval unit is not defined EOS takes `seconds` by default. | | [    wait_interval](## "router_isis.spf_interval.wait_interval") | Integer | | | Min: 1
Max: 300000 | Initial wait interval for SPF in milliseconds. | + | [    hold_interval](## "router_isis.spf_interval.hold_interval") | Integer | | | Min: 1
Max: 300000 | Hold interval between the first and second SPF runs in milliseconds. | | [  graceful_restart](## "router_isis.graceful_restart") | Dictionary | | | | | | [    enabled](## "router_isis.graceful_restart.enabled") | Boolean | | | | | | [    restart_hold_time](## "router_isis.graceful_restart.restart_hold_time") | Integer | | | Min: 5
Max: 300 | Number of seconds. | @@ -130,13 +132,13 @@ ```yaml router_isis: - # ISIS Instance Name + # ISIS Instance Name. instance: - # CLNS Address like "49.0001.0001.0000.0001.00" + # CLNS Address like "49.0001.0001.0000.0001.00". net: - # IPv4 Address + # IPv4 Address. router_id: is_type: log_adjacency_changes: @@ -271,14 +273,14 @@ passive_only: address_family: - # Address Family + # Address Family. # This key is deprecated. # Support will be removed in AVD version 5.0.0. # Use address_family_ipv4.enabled or address_family_ipv6.enabled instead. - isis_af_defaults: - # EOS CLI rendered under the address families + # EOS CLI rendered under the address families. # Example "maximum-paths 64" # This key is deprecated. # Support will be removed in AVD version 5.0.0. @@ -287,11 +289,11 @@ redistribute_routes: - source_protocol: - # Route-map name + # Route-map name. route_map: include_leaked: - # ospf_route_type is required with source_protocols 'ospf' and 'ospfv3' + # ospf_route_type is required with source_protocols 'ospf' and 'ospfv3'. ospf_route_type: address_family_ipv4: enabled: @@ -303,14 +305,14 @@ mode: level: - # Shared Risk Link Group + # Shared Risk Link Group. srlg: enable: strict: tunnel_source_labeled_unicast: enabled: - # Route Control Function + # Route Control Function. rcf: address_family_ipv6: enabled: @@ -324,7 +326,7 @@ # Optional, default is to protect all levels. level: - # Shared Risk Link Group + # Shared Risk Link Group. srlg: enable: strict: @@ -336,11 +338,19 @@ index: spf_interval: - # Maximum interval between two SPFs in seconds. - interval: + # Maximum interval between two SPFs in seconds or milliseconds. + # Range in seconds: <1-300> + # Range in milliseconds: <1-300000> + interval: + + # If interval unit is not defined EOS takes `seconds` by default. + interval_unit: # Initial wait interval for SPF in milliseconds. wait_interval: + + # Hold interval between the first and second SPF runs in milliseconds. + hold_interval: graceful_restart: enabled: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-l2-vpn.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-l2-vpn.md index ad6c6dd9dff..b06cd931421 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-l2-vpn.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-l2-vpn.md @@ -14,7 +14,7 @@ | [  arp_selective_install](## "router_l2_vpn.arp_selective_install") | Boolean | | | | | | [  nd_learning_bridged](## "router_l2_vpn.nd_learning_bridged") | Boolean | | | | | | [  nd_proxy](## "router_l2_vpn.nd_proxy") | Dictionary | | | | | - | [    prefix_list](## "router_l2_vpn.nd_proxy.prefix_list") | String | | | | Prefix-list name. ND Proxying is disabled for IPv6 addresses defined in the prefix-list. | + | [    prefix_list](## "router_l2_vpn.nd_proxy.prefix_list") | String | | | | Prefix-list name. Neighbor Discovery Proxying is disabled for IPv6 addresses defined in the prefix-list. | | [  nd_rs_flooding_disabled](## "router_l2_vpn.nd_rs_flooding_disabled") | Boolean | | | | | | [  virtual_router_nd_ra_flooding_disabled](## "router_l2_vpn.virtual_router_nd_ra_flooding_disabled") | Boolean | | | | | @@ -31,7 +31,7 @@ nd_learning_bridged: nd_proxy: - # Prefix-list name. ND Proxying is disabled for IPv6 addresses defined in the prefix-list. + # Prefix-list name. Neighbor Discovery Proxying is disabled for IPv6 addresses defined in the prefix-list. prefix_list: nd_rs_flooding_disabled: virtual_router_nd_ra_flooding_disabled: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-msdp.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-msdp.md index 5fccb713dd5..a8940c3d533 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-msdp.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-msdp.md @@ -8,159 +8,159 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [router_msdp](## "router_msdp") | Dictionary | | | | | - | [  originator_id_local_interface](## "router_msdp.originator_id_local_interface") | String | | | | Interface to use for originator ID | - | [  rejected_limit](## "router_msdp.rejected_limit") | Integer | | | Min: 0
Max: 40000 | Maximum number of rejected SA messages allowed in cache | + | [  originator_id_local_interface](## "router_msdp.originator_id_local_interface") | String | | | | Interface to use for originator ID. | + | [  rejected_limit](## "router_msdp.rejected_limit") | Integer | | | Min: 0
Max: 40000 | Maximum number of rejected SA messages allowed in cache. | | [  forward_register_packets](## "router_msdp.forward_register_packets") | Boolean | | | | | | [  connection_retry_interval](## "router_msdp.connection_retry_interval") | Integer | | | Min: 1
Max: 65535 | | | [  group_limits](## "router_msdp.group_limits") | List, items: Dictionary | | | | | - | [    - source_prefix](## "router_msdp.group_limits.[].source_prefix") | String | Required, Unique | | | Source address prefix | - | [      limit](## "router_msdp.group_limits.[].limit") | Integer | Required | | Min: 0
Max: 40000 | Limit for SAs matching the source address prefix | + | [    - source_prefix](## "router_msdp.group_limits.[].source_prefix") | String | Required, Unique | | | Source address prefix. | + | [      limit](## "router_msdp.group_limits.[].limit") | Integer | Required | | Min: 0
Max: 40000 | Limit for SAs matching the source address prefix. | | [  peers](## "router_msdp.peers") | List, items: Dictionary | | | | | - | [    - ipv4_address](## "router_msdp.peers.[].ipv4_address") | String | Required, Unique | | | Peer IP Address | + | [    - ipv4_address](## "router_msdp.peers.[].ipv4_address") | String | Required, Unique | | | Peer IP Address. | | [      default_peer](## "router_msdp.peers.[].default_peer") | Dictionary | | | | | | [        enabled](## "router_msdp.peers.[].default_peer.enabled") | Boolean | | | | | - | [        prefix_list](## "router_msdp.peers.[].default_peer.prefix_list") | String | | | | Prefix list to filter source of SA messages | + | [        prefix_list](## "router_msdp.peers.[].default_peer.prefix_list") | String | | | | Prefix list to filter source of SA messages. | | [      local_interface](## "router_msdp.peers.[].local_interface") | String | | | | | | [      description](## "router_msdp.peers.[].description") | String | | | | | - | [      disabled](## "router_msdp.peers.[].disabled") | Boolean | | | | Disable the MSDP peer | - | [      sa_limit](## "router_msdp.peers.[].sa_limit") | Integer | | | Min: 0
Max: 40000 | Maximum number of SA messages allowed in cache | + | [      disabled](## "router_msdp.peers.[].disabled") | Boolean | | | | Disable the MSDP peer. | + | [      sa_limit](## "router_msdp.peers.[].sa_limit") | Integer | | | Min: 0
Max: 40000 | Maximum number of SA messages allowed in cache. | | [      mesh_groups](## "router_msdp.peers.[].mesh_groups") | List, items: Dictionary | | | | | - | [        - name](## "router_msdp.peers.[].mesh_groups.[].name") | String | Required, Unique | | | Mesh group name | + | [        - name](## "router_msdp.peers.[].mesh_groups.[].name") | String | Required, Unique | | | Mesh group name. | | [      keepalive](## "router_msdp.peers.[].keepalive") | Dictionary | | | | | | [        keepalive_timer](## "router_msdp.peers.[].keepalive.keepalive_timer") | Integer | Required | | Min: 1
Max: 65535 | | - | [        hold_timer](## "router_msdp.peers.[].keepalive.hold_timer") | Integer | Required | | Min: 1
Max: 65535 | Must be greater than keepalive timer | + | [        hold_timer](## "router_msdp.peers.[].keepalive.hold_timer") | Integer | Required | | Min: 1
Max: 65535 | Must be greater than keepalive timer. | | [      sa_filter](## "router_msdp.peers.[].sa_filter") | Dictionary | | | | | - | [        in_list](## "router_msdp.peers.[].sa_filter.in_list") | String | | | | ACL to filter inbound SA messages | - | [        out_list](## "router_msdp.peers.[].sa_filter.out_list") | String | | | | ACL to filter outbound SA messages | + | [        in_list](## "router_msdp.peers.[].sa_filter.in_list") | String | | | | ACL to filter inbound SA messages. | + | [        out_list](## "router_msdp.peers.[].sa_filter.out_list") | String | | | | ACL to filter outbound SA messages. | | [  vrfs](## "router_msdp.vrfs") | List, items: Dictionary | | | | | - | [    - name](## "router_msdp.vrfs.[].name") | String | Required, Unique | | | VRF name | - | [      originator_id_local_interface](## "router_msdp.vrfs.[].originator_id_local_interface") | String | | | | Interface to use for originator ID | - | [      rejected_limit](## "router_msdp.vrfs.[].rejected_limit") | Integer | | | Min: 0
Max: 40000 | Maximum number of rejected SA messages allowed in cache | + | [    - name](## "router_msdp.vrfs.[].name") | String | Required, Unique | | | VRF name. | + | [      originator_id_local_interface](## "router_msdp.vrfs.[].originator_id_local_interface") | String | | | | Interface to use for originator ID. | + | [      rejected_limit](## "router_msdp.vrfs.[].rejected_limit") | Integer | | | Min: 0
Max: 40000 | Maximum number of rejected SA messages allowed in cache. | | [      forward_register_packets](## "router_msdp.vrfs.[].forward_register_packets") | Boolean | | | | | | [      connection_retry_interval](## "router_msdp.vrfs.[].connection_retry_interval") | Integer | | | Min: 1
Max: 65535 | | | [      group_limits](## "router_msdp.vrfs.[].group_limits") | List, items: Dictionary | | | | | - | [        - source_prefix](## "router_msdp.vrfs.[].group_limits.[].source_prefix") | String | Required, Unique | | | Source address prefix | - | [          limit](## "router_msdp.vrfs.[].group_limits.[].limit") | Integer | Required | | Min: 0
Max: 40000 | Limit for SAs matching the source address prefix | + | [        - source_prefix](## "router_msdp.vrfs.[].group_limits.[].source_prefix") | String | Required, Unique | | | Source address prefix. | + | [          limit](## "router_msdp.vrfs.[].group_limits.[].limit") | Integer | Required | | Min: 0
Max: 40000 | Limit for SAs matching the source address prefix. | | [      peers](## "router_msdp.vrfs.[].peers") | List, items: Dictionary | | | | | - | [        - ipv4_address](## "router_msdp.vrfs.[].peers.[].ipv4_address") | String | Required, Unique | | | Peer IP Address | + | [        - ipv4_address](## "router_msdp.vrfs.[].peers.[].ipv4_address") | String | Required, Unique | | | Peer IP Address. | | [          default_peer](## "router_msdp.vrfs.[].peers.[].default_peer") | Dictionary | | | | | | [            enabled](## "router_msdp.vrfs.[].peers.[].default_peer.enabled") | Boolean | | | | | - | [            prefix_list](## "router_msdp.vrfs.[].peers.[].default_peer.prefix_list") | String | | | | Prefix list to filter source of SA messages | + | [            prefix_list](## "router_msdp.vrfs.[].peers.[].default_peer.prefix_list") | String | | | | Prefix list to filter source of SA messages. | | [          local_interface](## "router_msdp.vrfs.[].peers.[].local_interface") | String | | | | | | [          description](## "router_msdp.vrfs.[].peers.[].description") | String | | | | | - | [          disabled](## "router_msdp.vrfs.[].peers.[].disabled") | Boolean | | | | Disable the MSDP peer | - | [          sa_limit](## "router_msdp.vrfs.[].peers.[].sa_limit") | Integer | | | Min: 0
Max: 40000 | Maximum number of SA messages allowed in cache | + | [          disabled](## "router_msdp.vrfs.[].peers.[].disabled") | Boolean | | | | Disable the MSDP peer. | + | [          sa_limit](## "router_msdp.vrfs.[].peers.[].sa_limit") | Integer | | | Min: 0
Max: 40000 | Maximum number of SA messages allowed in cache. | | [          mesh_groups](## "router_msdp.vrfs.[].peers.[].mesh_groups") | List, items: Dictionary | | | | | - | [            - name](## "router_msdp.vrfs.[].peers.[].mesh_groups.[].name") | String | Required, Unique | | | Mesh group name | + | [            - name](## "router_msdp.vrfs.[].peers.[].mesh_groups.[].name") | String | Required, Unique | | | Mesh group name. | | [          keepalive](## "router_msdp.vrfs.[].peers.[].keepalive") | Dictionary | | | | | | [            keepalive_timer](## "router_msdp.vrfs.[].peers.[].keepalive.keepalive_timer") | Integer | Required | | Min: 1
Max: 65535 | | - | [            hold_timer](## "router_msdp.vrfs.[].peers.[].keepalive.hold_timer") | Integer | Required | | Min: 1
Max: 65535 | Must be greater than keepalive timer | + | [            hold_timer](## "router_msdp.vrfs.[].peers.[].keepalive.hold_timer") | Integer | Required | | Min: 1
Max: 65535 | Must be greater than keepalive timer. | | [          sa_filter](## "router_msdp.vrfs.[].peers.[].sa_filter") | Dictionary | | | | | - | [            in_list](## "router_msdp.vrfs.[].peers.[].sa_filter.in_list") | String | | | | ACL to filter inbound SA messages | - | [            out_list](## "router_msdp.vrfs.[].peers.[].sa_filter.out_list") | String | | | | ACL to filter outbound SA messages | + | [            in_list](## "router_msdp.vrfs.[].peers.[].sa_filter.in_list") | String | | | | ACL to filter inbound SA messages. | + | [            out_list](## "router_msdp.vrfs.[].peers.[].sa_filter.out_list") | String | | | | ACL to filter outbound SA messages. | === "YAML" ```yaml router_msdp: - # Interface to use for originator ID + # Interface to use for originator ID. originator_id_local_interface: - # Maximum number of rejected SA messages allowed in cache + # Maximum number of rejected SA messages allowed in cache. rejected_limit: forward_register_packets: connection_retry_interval: group_limits: - # Source address prefix + # Source address prefix. - source_prefix: - # Limit for SAs matching the source address prefix + # Limit for SAs matching the source address prefix. limit: peers: - # Peer IP Address + # Peer IP Address. - ipv4_address: default_peer: enabled: - # Prefix list to filter source of SA messages + # Prefix list to filter source of SA messages. prefix_list: local_interface: description: - # Disable the MSDP peer + # Disable the MSDP peer. disabled: - # Maximum number of SA messages allowed in cache + # Maximum number of SA messages allowed in cache. sa_limit: mesh_groups: - # Mesh group name + # Mesh group name. - name: keepalive: keepalive_timer: - # Must be greater than keepalive timer + # Must be greater than keepalive timer. hold_timer: sa_filter: - # ACL to filter inbound SA messages + # ACL to filter inbound SA messages. in_list: - # ACL to filter outbound SA messages + # ACL to filter outbound SA messages. out_list: vrfs: - # VRF name + # VRF name. - name: - # Interface to use for originator ID + # Interface to use for originator ID. originator_id_local_interface: - # Maximum number of rejected SA messages allowed in cache + # Maximum number of rejected SA messages allowed in cache. rejected_limit: forward_register_packets: connection_retry_interval: group_limits: - # Source address prefix + # Source address prefix. - source_prefix: - # Limit for SAs matching the source address prefix + # Limit for SAs matching the source address prefix. limit: peers: - # Peer IP Address + # Peer IP Address. - ipv4_address: default_peer: enabled: - # Prefix list to filter source of SA messages + # Prefix list to filter source of SA messages. prefix_list: local_interface: description: - # Disable the MSDP peer + # Disable the MSDP peer. disabled: - # Maximum number of SA messages allowed in cache + # Maximum number of SA messages allowed in cache. sa_limit: mesh_groups: - # Mesh group name + # Mesh group name. - name: keepalive: keepalive_timer: - # Must be greater than keepalive timer + # Must be greater than keepalive timer. hold_timer: sa_filter: - # ACL to filter inbound SA messages + # ACL to filter inbound SA messages. in_list: - # ACL to filter outbound SA messages + # ACL to filter outbound SA messages. out_list: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-multicast.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-multicast.md index 24cce56d844..6232ca5f11e 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-multicast.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-multicast.md @@ -9,17 +9,20 @@ | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [router_multicast](## "router_multicast") | Dictionary | | | | | | [  ipv4](## "router_multicast.ipv4") | Dictionary | | | | | + | [    activity_polling_interval](## "router_multicast.ipv4.activity_polling_interval") | Integer | | | Min: 1
Max: 60 | MFIB entry activity polling interval. | | [    counters](## "router_multicast.ipv4.counters") | Dictionary | | | | | - | [      rate_period_decay](## "router_multicast.ipv4.counters.rate_period_decay") | Integer | | | Min: 0
Max: 600 | Rate in seconds | + | [      rate_period_decay](## "router_multicast.ipv4.counters.rate_period_decay") | Integer | | | Min: 0
Max: 600 | Rate in seconds. | | [    routing](## "router_multicast.ipv4.routing") | Boolean | | | | | | [    multipath](## "router_multicast.ipv4.multipath") | String | | | Valid Values:
- none
- deterministic
- deterministic color
- deterministic router-id | | | [    software_forwarding](## "router_multicast.ipv4.software_forwarding") | String | | | Valid Values:
- kernel
- sfe | | | [    rpf](## "router_multicast.ipv4.rpf") | Dictionary | | | | | | [      routes](## "router_multicast.ipv4.rpf.routes") | List, items: Dictionary | | | | | - | [        - source_prefix](## "router_multicast.ipv4.rpf.routes.[].source_prefix") | String | Required | | | Source address A.B.C.D or Source prefix A.B.C.D/E | + | [        - source_prefix](## "router_multicast.ipv4.rpf.routes.[].source_prefix") | String | Required | | | Source address A.B.C.D or Source prefix A.B.C.D/E. | | [          destinations](## "router_multicast.ipv4.rpf.routes.[].destinations") | List, items: Dictionary | Required | | | | - | [            - nexthop](## "router_multicast.ipv4.rpf.routes.[].destinations.[].nexthop") | String | Required | | | Next-hop IP address or interface name | - | [              distance](## "router_multicast.ipv4.rpf.routes.[].destinations.[].distance") | Integer | | | Min: 1
Max: 255 | Administrative distance for this route | + | [            - nexthop](## "router_multicast.ipv4.rpf.routes.[].destinations.[].nexthop") | String | Required | | | Next-hop IP address or interface name. | + | [              distance](## "router_multicast.ipv4.rpf.routes.[].destinations.[].distance") | Integer | | | Min: 1
Max: 255 | Administrative distance for this route. | + | [  ipv6](## "router_multicast.ipv6") | Dictionary | | | | | + | [    activity_polling_interval](## "router_multicast.ipv6.activity_polling_interval") | Integer | | | Min: 1
Max: 60 | MFIB entry activity polling interval. | | [  vrfs](## "router_multicast.vrfs") | List, items: Dictionary | | | | | | [    - name](## "router_multicast.vrfs.[].name") | String | Required, Unique | | | | | [      ipv4](## "router_multicast.vrfs.[].ipv4") | Dictionary | | | | | @@ -30,9 +33,12 @@ ```yaml router_multicast: ipv4: + + # MFIB entry activity polling interval. + activity_polling_interval: counters: - # Rate in seconds + # Rate in seconds. rate_period_decay: routing: multipath: @@ -40,15 +46,19 @@ rpf: routes: - # Source address A.B.C.D or Source prefix A.B.C.D/E + # Source address A.B.C.D or Source prefix A.B.C.D/E. - source_prefix: destinations: # required - # Next-hop IP address or interface name + # Next-hop IP address or interface name. - nexthop: - # Administrative distance for this route + # Administrative distance for this route. distance: + ipv6: + + # MFIB entry activity polling interval. + activity_polling_interval: vrfs: - name: ipv4: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-ospf.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-ospf.md index 4856d358e10..c94dfb5f770 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-ospf.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-ospf.md @@ -9,10 +9,10 @@ | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [router_ospf](## "router_ospf") | Dictionary | | | | | | [  process_ids](## "router_ospf.process_ids") | List, items: Dictionary | | | | | - | [    - id](## "router_ospf.process_ids.[].id") | Integer | Required, Unique | | | OSPF Process ID | - | [      vrf](## "router_ospf.process_ids.[].vrf") | String | | | | VRF Name for OSPF Process | + | [    - id](## "router_ospf.process_ids.[].id") | Integer | Required, Unique | | | OSPF Process ID. | + | [      vrf](## "router_ospf.process_ids.[].vrf") | String | | | | VRF Name for OSPF Process. | | [      passive_interface_default](## "router_ospf.process_ids.[].passive_interface_default") | Boolean | | | | | - | [      router_id](## "router_ospf.process_ids.[].router_id") | String | | | | IPv4 Address | + | [      router_id](## "router_ospf.process_ids.[].router_id") | String | | | | IPv4 Address. | | [      distance](## "router_ospf.process_ids.[].distance") | Dictionary | | | | | | [        external](## "router_ospf.process_ids.[].distance.external") | Integer | | | Min: 1
Max: 255 | | | [        inter_area](## "router_ospf.process_ids.[].distance.inter_area") | Integer | | | Min: 1
Max: 255 | | @@ -24,64 +24,64 @@ | [      bfd_enable](## "router_ospf.process_ids.[].bfd_enable") | Boolean | | | | | | [      bfd_adjacency_state_any](## "router_ospf.process_ids.[].bfd_adjacency_state_any") | Boolean | | | | | | [      no_passive_interfaces](## "router_ospf.process_ids.[].no_passive_interfaces") | List, items: String | | | | | - | [        - <str>](## "router_ospf.process_ids.[].no_passive_interfaces.[]") | String | | | | Interface Name | + | [        - <str>](## "router_ospf.process_ids.[].no_passive_interfaces.[]") | String | | | | Interface Name. | | [      distribute_list_in](## "router_ospf.process_ids.[].distribute_list_in") | Dictionary | | | | | | [        route_map](## "router_ospf.process_ids.[].distribute_list_in.route_map") | String | | | | | | [      max_lsa](## "router_ospf.process_ids.[].max_lsa") | Integer | | | | | | [      timers](## "router_ospf.process_ids.[].timers") | Dictionary | | | | | | [        lsa](## "router_ospf.process_ids.[].timers.lsa") | Dictionary | | | | | - | [          rx_min_interval](## "router_ospf.process_ids.[].timers.lsa.rx_min_interval") | Integer | | | Min: 0
Max: 600000 | Min interval in msecs between accepting the same LSA | + | [          rx_min_interval](## "router_ospf.process_ids.[].timers.lsa.rx_min_interval") | Integer | | | Min: 0
Max: 600000 | Min interval in msecs between accepting the same LSA. | | [          tx_delay](## "router_ospf.process_ids.[].timers.lsa.tx_delay") | Dictionary | | | | | - | [            initial](## "router_ospf.process_ids.[].timers.lsa.tx_delay.initial") | Integer | | | Min: 0
Max: 600000 | Delay to generate first occurrence of LSA in msecs | - | [            min](## "router_ospf.process_ids.[].timers.lsa.tx_delay.min") | Integer | | | Min: 1
Max: 600000 | Min delay between originating the same LSA in msecs | - | [            max](## "router_ospf.process_ids.[].timers.lsa.tx_delay.max") | Integer | | | Min: 1
Max: 600000 | 1-600000 Maximum delay between originating the same LSA in msec | + | [            initial](## "router_ospf.process_ids.[].timers.lsa.tx_delay.initial") | Integer | | | Min: 0
Max: 600000 | Delay to generate first occurrence of LSA in msecs. | + | [            min](## "router_ospf.process_ids.[].timers.lsa.tx_delay.min") | Integer | | | Min: 1
Max: 600000 | Min delay between originating the same LSA in msecs. | + | [            max](## "router_ospf.process_ids.[].timers.lsa.tx_delay.max") | Integer | | | Min: 1
Max: 600000 | 1-600000 Maximum delay between originating the same LSA in msec. | | [        spf_delay](## "router_ospf.process_ids.[].timers.spf_delay") | Dictionary | | | | | - | [          initial](## "router_ospf.process_ids.[].timers.spf_delay.initial") | Integer | | | Min: 0
Max: 600000 | Initial SPF schedule delay in msecs | - | [          min](## "router_ospf.process_ids.[].timers.spf_delay.min") | Integer | | | Min: 0
Max: 65535000 | Min Hold time between two SPFs in msecs | - | [          max](## "router_ospf.process_ids.[].timers.spf_delay.max") | Integer | | | Min: 0
Max: 65535000 | Max wait time between two SPFs in msecs | + | [          initial](## "router_ospf.process_ids.[].timers.spf_delay.initial") | Integer | | | Min: 0
Max: 600000 | Initial SPF schedule delay in msecs. | + | [          min](## "router_ospf.process_ids.[].timers.spf_delay.min") | Integer | | | Min: 0
Max: 65535000 | Min Hold time between two SPFs in msecs. | + | [          max](## "router_ospf.process_ids.[].timers.spf_delay.max") | Integer | | | Min: 0
Max: 65535000 | Max wait time between two SPFs in msecs. | | [      default_information_originate](## "router_ospf.process_ids.[].default_information_originate") | Dictionary | | | | | | [        always](## "router_ospf.process_ids.[].default_information_originate.always") | Boolean | | | | | - | [        metric](## "router_ospf.process_ids.[].default_information_originate.metric") | Integer | | | Min: 1
Max: 65535 | Metric for default route | - | [        metric_type](## "router_ospf.process_ids.[].default_information_originate.metric_type") | Integer | | | Valid Values:
- 1
- 2 | OSPF metric type for default route | + | [        metric](## "router_ospf.process_ids.[].default_information_originate.metric") | Integer | | | Min: 1
Max: 65535 | Metric for default route. | + | [        metric_type](## "router_ospf.process_ids.[].default_information_originate.metric_type") | Integer | | | Valid Values:
- 1
- 2 | OSPF metric type for default route. | | [      summary_addresses](## "router_ospf.process_ids.[].summary_addresses") | List, items: Dictionary | | | | | - | [        - prefix](## "router_ospf.process_ids.[].summary_addresses.[].prefix") | String | Required, Unique | | | Summary Prefix Address | + | [        - prefix](## "router_ospf.process_ids.[].summary_addresses.[].prefix") | String | Required, Unique | | | Summary Prefix Address. | | [          tag](## "router_ospf.process_ids.[].summary_addresses.[].tag") | Integer | | | | | | [          attribute_map](## "router_ospf.process_ids.[].summary_addresses.[].attribute_map") | String | | | | | | [          not_advertise](## "router_ospf.process_ids.[].summary_addresses.[].not_advertise") | Boolean | | | | | | [      redistribute](## "router_ospf.process_ids.[].redistribute") | Dictionary | | | | | | [        static](## "router_ospf.process_ids.[].redistribute.static") | Dictionary | | | | | - | [          route_map](## "router_ospf.process_ids.[].redistribute.static.route_map") | String | | | | Route Map Name | + | [          route_map](## "router_ospf.process_ids.[].redistribute.static.route_map") | String | | | | Route Map Name. | | [          include_leaked](## "router_ospf.process_ids.[].redistribute.static.include_leaked") | Boolean | | | | | | [        connected](## "router_ospf.process_ids.[].redistribute.connected") | Dictionary | | | | | - | [          route_map](## "router_ospf.process_ids.[].redistribute.connected.route_map") | String | | | | Route Map Name | + | [          route_map](## "router_ospf.process_ids.[].redistribute.connected.route_map") | String | | | | Route Map Name. | | [          include_leaked](## "router_ospf.process_ids.[].redistribute.connected.include_leaked") | Boolean | | | | | | [        bgp](## "router_ospf.process_ids.[].redistribute.bgp") | Dictionary | | | | | - | [          route_map](## "router_ospf.process_ids.[].redistribute.bgp.route_map") | String | | | | Route Map Name | + | [          route_map](## "router_ospf.process_ids.[].redistribute.bgp.route_map") | String | | | | Route Map Name. | | [          include_leaked](## "router_ospf.process_ids.[].redistribute.bgp.include_leaked") | Boolean | | | | | - | [      auto_cost_reference_bandwidth](## "router_ospf.process_ids.[].auto_cost_reference_bandwidth") | Integer | | | | Bandwidth in mbps | + | [      auto_cost_reference_bandwidth](## "router_ospf.process_ids.[].auto_cost_reference_bandwidth") | Integer | | | | Bandwidth in mbps. | | [      areas](## "router_ospf.process_ids.[].areas") | List, items: Dictionary | | | | | | [        - id](## "router_ospf.process_ids.[].areas.[].id") | String | Required, Unique | | | | | [          filter](## "router_ospf.process_ids.[].areas.[].filter") | Dictionary | | | | | | [            networks](## "router_ospf.process_ids.[].areas.[].filter.networks") | List, items: String | | | | | - | [              - <str>](## "router_ospf.process_ids.[].areas.[].filter.networks.[]") | String | | | | IPv4 Prefix | - | [            prefix_list](## "router_ospf.process_ids.[].areas.[].filter.prefix_list") | String | | | | Prefix-List Name | + | [              - <str>](## "router_ospf.process_ids.[].areas.[].filter.networks.[]") | String | | | | IPv4 Prefix. | + | [            prefix_list](## "router_ospf.process_ids.[].areas.[].filter.prefix_list") | String | | | | Prefix-List Name. | | [          type](## "router_ospf.process_ids.[].areas.[].type") | String | | `normal` | Valid Values:
- normal
- stub
- nssa | | | [          no_summary](## "router_ospf.process_ids.[].areas.[].no_summary") | Boolean | | | | | | [          nssa_only](## "router_ospf.process_ids.[].areas.[].nssa_only") | Boolean | | | | | | [          default_information_originate](## "router_ospf.process_ids.[].areas.[].default_information_originate") | Dictionary | | | | | - | [            metric](## "router_ospf.process_ids.[].areas.[].default_information_originate.metric") | Integer | | | Min: 1
Max: 65535 | Metric for default route | - | [            metric_type](## "router_ospf.process_ids.[].areas.[].default_information_originate.metric_type") | Integer | | | Valid Values:
- 1
- 2 | OSPF metric type for default route | + | [            metric](## "router_ospf.process_ids.[].areas.[].default_information_originate.metric") | Integer | | | Min: 1
Max: 65535 | Metric for default route. | + | [            metric_type](## "router_ospf.process_ids.[].areas.[].default_information_originate.metric_type") | Integer | | | Valid Values:
- 1
- 2 | OSPF metric type for default route. | | [      maximum_paths](## "router_ospf.process_ids.[].maximum_paths") | Integer | | | Min: 1
Max: 128 | | | [      max_metric](## "router_ospf.process_ids.[].max_metric") | Dictionary | | | | | | [        router_lsa](## "router_ospf.process_ids.[].max_metric.router_lsa") | Dictionary | | | | | | [          external_lsa](## "router_ospf.process_ids.[].max_metric.router_lsa.external_lsa") | Dictionary | | | | | | [            override_metric](## "router_ospf.process_ids.[].max_metric.router_lsa.external_lsa.override_metric") | Integer | | | Min: 1
Max: 16777215 | | | [          include_stub](## "router_ospf.process_ids.[].max_metric.router_lsa.include_stub") | Boolean | | | | | - | [          on_startup](## "router_ospf.process_ids.[].max_metric.router_lsa.on_startup") | String | | | | "wait-for-bgp" or Integer 5-86400
Example: "wait-for-bgp" Or "222"
| + | [          on_startup](## "router_ospf.process_ids.[].max_metric.router_lsa.on_startup") | String | | | | "wait-for-bgp" or Integer 5-86400.
Example: "wait-for-bgp" Or "222"
| | [          summary_lsa](## "router_ospf.process_ids.[].max_metric.router_lsa.summary_lsa") | Dictionary | | | | | | [            override_metric](## "router_ospf.process_ids.[].max_metric.router_lsa.summary_lsa.override_metric") | Integer | | | Min: 1
Max: 16777215 | | | [      mpls_ldp_sync_default](## "router_ospf.process_ids.[].mpls_ldp_sync_default") | Boolean | | | | | - | [      eos_cli](## "router_ospf.process_ids.[].eos_cli") | String | | | | Multiline EOS CLI rendered directly on the Router OSPF process ID in the final EOS configuration | + | [      eos_cli](## "router_ospf.process_ids.[].eos_cli") | String | | | | Multiline EOS CLI rendered directly on the Router OSPF process ID in the final EOS configuration. | === "YAML" @@ -89,14 +89,14 @@ router_ospf: process_ids: - # OSPF Process ID + # OSPF Process ID. - id: - # VRF Name for OSPF Process + # VRF Name for OSPF Process. vrf: passive_interface_default: - # IPv4 Address + # IPv4 Address. router_id: distance: external: @@ -110,7 +110,7 @@ bfd_adjacency_state_any: no_passive_interfaces: - # Interface Name + # Interface Name. - distribute_list_in: route_map: @@ -118,39 +118,39 @@ timers: lsa: - # Min interval in msecs between accepting the same LSA + # Min interval in msecs between accepting the same LSA. rx_min_interval: tx_delay: - # Delay to generate first occurrence of LSA in msecs + # Delay to generate first occurrence of LSA in msecs. initial: - # Min delay between originating the same LSA in msecs + # Min delay between originating the same LSA in msecs. min: - # 1-600000 Maximum delay between originating the same LSA in msec + # 1-600000 Maximum delay between originating the same LSA in msec. max: spf_delay: - # Initial SPF schedule delay in msecs + # Initial SPF schedule delay in msecs. initial: - # Min Hold time between two SPFs in msecs + # Min Hold time between two SPFs in msecs. min: - # Max wait time between two SPFs in msecs + # Max wait time between two SPFs in msecs. max: default_information_originate: always: - # Metric for default route + # Metric for default route. metric: - # OSPF metric type for default route + # OSPF metric type for default route. metric_type: summary_addresses: - # Summary Prefix Address + # Summary Prefix Address. - prefix: tag: attribute_map: @@ -158,41 +158,41 @@ redistribute: static: - # Route Map Name + # Route Map Name. route_map: include_leaked: connected: - # Route Map Name + # Route Map Name. route_map: include_leaked: bgp: - # Route Map Name + # Route Map Name. route_map: include_leaked: - # Bandwidth in mbps + # Bandwidth in mbps. auto_cost_reference_bandwidth: areas: - id: filter: networks: - # IPv4 Prefix + # IPv4 Prefix. - - # Prefix-List Name + # Prefix-List Name. prefix_list: type: no_summary: nssa_only: default_information_originate: - # Metric for default route + # Metric for default route. metric: - # OSPF metric type for default route + # OSPF metric type for default route. metric_type: maximum_paths: max_metric: @@ -201,13 +201,13 @@ override_metric: include_stub: - # "wait-for-bgp" or Integer 5-86400 + # "wait-for-bgp" or Integer 5-86400. # Example: "wait-for-bgp" Or "222" on_startup: summary_lsa: override_metric: mpls_ldp_sync_default: - # Multiline EOS CLI rendered directly on the Router OSPF process ID in the final EOS configuration + # Multiline EOS CLI rendered directly on the Router OSPF process ID in the final EOS configuration. eos_cli: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-path-selection.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-path-selection.md index b3c8c51e47a..1b73659a082 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-path-selection.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-path-selection.md @@ -13,7 +13,7 @@ | [    - name](## "router_path_selection.path_groups.[].name") | String | Required, Unique | | | Path group name. | | [      id](## "router_path_selection.path_groups.[].id") | Integer | | | Min: 1
Max: 65535 | Path group ID. | | [      ipsec_profile](## "router_path_selection.path_groups.[].ipsec_profile") | String | | | | IPSec profile for the path group. | - | [      flow_assignment](## "router_path_selection.path_groups.[].flow_assignment") | String | | | Valid Values:
- lan | Flow assignement `lan` can not be configured in a path group with dynamic peers. | + | [      flow_assignment](## "router_path_selection.path_groups.[].flow_assignment") | String | | | Valid Values:
- lan | Flow assignment `lan` can not be configured in a path group with dynamic peers. | | [      local_interfaces](## "router_path_selection.path_groups.[].local_interfaces") | List, items: Dictionary | | | | | | [        - name](## "router_path_selection.path_groups.[].local_interfaces.[].name") | String | Required, Unique | | Pattern: ^Ethernet\d+(/\d+)*(\.\d+)?$ | Local interface name. | | [          public_address](## "router_path_selection.path_groups.[].local_interfaces.[].public_address") | String | | | | Public IP assigned by NAT. | @@ -26,7 +26,7 @@ | [          stun](## "router_path_selection.path_groups.[].local_ips.[].stun") | Dictionary | | | | | | [            server_profiles](## "router_path_selection.path_groups.[].local_ips.[].stun.server_profiles") | List, items: String | Required | | Min Length: 1
Max Length: 12 | STUN server-profile names. | | [              - <str>](## "router_path_selection.path_groups.[].local_ips.[].stun.server_profiles.[]") | String | | | | | - | [      dynamic_peers](## "router_path_selection.path_groups.[].dynamic_peers") | Dictionary | | | | Flow assignement `lan` can not be configured in a path group with dynamic peers. | + | [      dynamic_peers](## "router_path_selection.path_groups.[].dynamic_peers") | Dictionary | | | | Flow assignment `lan` can not be configured in a path group with dynamic peers. | | [        enabled](## "router_path_selection.path_groups.[].dynamic_peers.enabled") | Boolean | | | | Enable `peer dynamic`. | | [        ip_local](## "router_path_selection.path_groups.[].dynamic_peers.ip_local") | Boolean | | | | Prefer local IP address. | | [        ipsec](## "router_path_selection.path_groups.[].dynamic_peers.ipsec") | Boolean | | | | IPsec configuration for dynamic peers. | @@ -46,7 +46,7 @@ | [      latency](## "router_path_selection.load_balance_policies.[].latency") | Integer | | | Min: 0
Max: 10000 | One way delay requirement for this load balance policy in milliseconds. | | [      loss_rate](## "router_path_selection.load_balance_policies.[].loss_rate") | String | | | Pattern: ^\d+(\.\d{1,2})?$ | Loss Rate requirement in percentage for this load balance policy.
Value between 0.00 and 100.00. | | [      path_groups](## "router_path_selection.load_balance_policies.[].path_groups") | List, items: Dictionary | | | | List of path-groups to use for this load balance policy. | - | [        - name](## "router_path_selection.load_balance_policies.[].path_groups.[].name") | String | Required, Unique | | | Path-group name | + | [        - name](## "router_path_selection.load_balance_policies.[].path_groups.[].name") | String | Required, Unique | | | Path-group name. | | [          priority](## "router_path_selection.load_balance_policies.[].path_groups.[].priority") | Integer | | | Min: 1
Max: 65535 | Priority for this path-group.
The EOS default value is 1. | | [  policies](## "router_path_selection.policies") | List, items: Dictionary | | | | | | [    - name](## "router_path_selection.policies.[].name") | String | Required, Unique | | | DPS policy name. | @@ -82,7 +82,7 @@ # IPSec profile for the path group. ipsec_profile: - # Flow assignement `lan` can not be configured in a path group with dynamic peers. + # Flow assignment `lan` can not be configured in a path group with dynamic peers. flow_assignment: local_interfaces: @@ -107,7 +107,7 @@ server_profiles: # 1-12 items; required - - # Flow assignement `lan` can not be configured in a path group with dynamic peers. + # Flow assignment `lan` can not be configured in a path group with dynamic peers. dynamic_peers: # Enable `peer dynamic`. @@ -160,7 +160,7 @@ # List of path-groups to use for this load balance policy. path_groups: - # Path-group name + # Path-group name. - name: # Priority for this path-group. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-pim-sparse-mode.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-pim-sparse-mode.md index b8b0e96bf0f..54c82d2c972 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-pim-sparse-mode.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-pim-sparse-mode.md @@ -9,10 +9,10 @@ | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [router_pim_sparse_mode](## "router_pim_sparse_mode") | Dictionary | | | | | | [  ipv4](## "router_pim_sparse_mode.ipv4") | Dictionary | | | | | - | [    bfd](## "router_pim_sparse_mode.ipv4.bfd") | Boolean | | | | Enable/Disable BFD | - | [    ssm_range](## "router_pim_sparse_mode.ipv4.ssm_range") | String | | | | IPv4 Prefix associated with SSM | + | [    bfd](## "router_pim_sparse_mode.ipv4.bfd") | Boolean | | | | Enable/Disable BFD. | + | [    ssm_range](## "router_pim_sparse_mode.ipv4.ssm_range") | String | | | | IPv4 Prefix associated with SSM. | | [    rp_addresses](## "router_pim_sparse_mode.ipv4.rp_addresses") | List, items: Dictionary | | | | | - | [      - address](## "router_pim_sparse_mode.ipv4.rp_addresses.[].address") | String | Required, Unique | | | RP Address | + | [      - address](## "router_pim_sparse_mode.ipv4.rp_addresses.[].address") | String | Required, Unique | | | RP Address. | | [        groups](## "router_pim_sparse_mode.ipv4.rp_addresses.[].groups") | List, items: String | | | | | | [          - <str>](## "router_pim_sparse_mode.ipv4.rp_addresses.[].groups.[]") | String | | | | | | [        access_lists](## "router_pim_sparse_mode.ipv4.rp_addresses.[].access_lists") | List, items: String | | | | | @@ -21,16 +21,16 @@ | [        hashmask](## "router_pim_sparse_mode.ipv4.rp_addresses.[].hashmask") | Integer | | | Min: 0
Max: 32 | | | [        override](## "router_pim_sparse_mode.ipv4.rp_addresses.[].override") | Boolean | | | | | | [    anycast_rps](## "router_pim_sparse_mode.ipv4.anycast_rps") | List, items: Dictionary | | | | | - | [      - address](## "router_pim_sparse_mode.ipv4.anycast_rps.[].address") | String | Required, Unique | | | Anycast RP Address | + | [      - address](## "router_pim_sparse_mode.ipv4.anycast_rps.[].address") | String | Required, Unique | | | Anycast RP Address. | | [        other_anycast_rp_addresses](## "router_pim_sparse_mode.ipv4.anycast_rps.[].other_anycast_rp_addresses") | List, items: Dictionary | | | | | - | [          - address](## "router_pim_sparse_mode.ipv4.anycast_rps.[].other_anycast_rp_addresses.[].address") | String | Required, Unique | | | Other Anycast RP Address | + | [          - address](## "router_pim_sparse_mode.ipv4.anycast_rps.[].other_anycast_rp_addresses.[].address") | String | Required, Unique | | | Other Anycast RP Address. | | [            register_count](## "router_pim_sparse_mode.ipv4.anycast_rps.[].other_anycast_rp_addresses.[].register_count") | Integer | | | | | | [  vrfs](## "router_pim_sparse_mode.vrfs") | List, items: Dictionary | | | | | - | [    - name](## "router_pim_sparse_mode.vrfs.[].name") | String | Required, Unique | | | VRF Name | + | [    - name](## "router_pim_sparse_mode.vrfs.[].name") | String | Required, Unique | | | VRF Name. | | [      ipv4](## "router_pim_sparse_mode.vrfs.[].ipv4") | Dictionary | | | | | - | [        bfd](## "router_pim_sparse_mode.vrfs.[].ipv4.bfd") | Boolean | | | | Enable/Disable BFD | + | [        bfd](## "router_pim_sparse_mode.vrfs.[].ipv4.bfd") | Boolean | | | | Enable/Disable BFD. | | [        rp_addresses](## "router_pim_sparse_mode.vrfs.[].ipv4.rp_addresses") | List, items: Dictionary | | | | | - | [          - address](## "router_pim_sparse_mode.vrfs.[].ipv4.rp_addresses.[].address") | String | Required | | | RP Address | + | [          - address](## "router_pim_sparse_mode.vrfs.[].ipv4.rp_addresses.[].address") | String | Required | | | RP Address. | | [            groups](## "router_pim_sparse_mode.vrfs.[].ipv4.rp_addresses.[].groups") | List, items: String | | | | | | [              - <str>](## "router_pim_sparse_mode.vrfs.[].ipv4.rp_addresses.[].groups.[]") | String | | | | | | [            access_lists](## "router_pim_sparse_mode.vrfs.[].ipv4.rp_addresses.[].access_lists") | List, items: String | | | | | @@ -45,14 +45,14 @@ router_pim_sparse_mode: ipv4: - # Enable/Disable BFD + # Enable/Disable BFD. bfd: - # IPv4 Prefix associated with SSM + # IPv4 Prefix associated with SSM. ssm_range: rp_addresses: - # RP Address + # RP Address. - address: groups: - @@ -63,24 +63,24 @@ override: anycast_rps: - # Anycast RP Address + # Anycast RP Address. - address: other_anycast_rp_addresses: - # Other Anycast RP Address + # Other Anycast RP Address. - address: register_count: vrfs: - # VRF Name + # VRF Name. - name: ipv4: - # Enable/Disable BFD + # Enable/Disable BFD. bfd: rp_addresses: - # RP Address + # RP Address. - address: groups: - diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-segment-security.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-segment-security.md new file mode 100644 index 00000000000..c35b8e23a94 --- /dev/null +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-segment-security.md @@ -0,0 +1,106 @@ + +=== "Table" + + | Variable | Type | Required | Default | Value Restrictions | Description | + | -------- | ---- | -------- | ------- | ------------------ | ----------- | + | [router_segment_security](## "router_segment_security") | Dictionary | | | | | + | [  enabled](## "router_segment_security.enabled") | Boolean | | | | | + | [  policies](## "router_segment_security.policies") | List, items: Dictionary | | | | Customised application policies.
Using the Application Traffic Recognition L4 profiles, custom policies can be defined. The built-in application 'app-match-all' can be used to match any packets.
Note that this is stateless, so both the source and destination flows need to be considered. | + | [    - name](## "router_segment_security.policies.[].name") | String | Required, Unique | | | Policy name. | + | [      sequence_numbers](## "router_segment_security.policies.[].sequence_numbers") | List, items: Dictionary | Required | | | | + | [        - sequence](## "router_segment_security.policies.[].sequence_numbers.[].sequence") | Integer | Required, Unique | | Min: 1
Max: 1023 | Sequence ID. | + | [          application](## "router_segment_security.policies.[].sequence_numbers.[].application") | String | Required | | | The name of the application. | + | [          action](## "router_segment_security.policies.[].sequence_numbers.[].action") | String | Required | | Valid Values:
- forward
- drop
- redirect | The action to take - note that platform support for the redirect action is limited. The "redirect" action also requires the 'next_hop' to be configured. | + | [          log](## "router_segment_security.policies.[].sequence_numbers.[].log") | Boolean | | | | Enable logging - note that platform support is limited. | + | [          stateless](## "router_segment_security.policies.[].sequence_numbers.[].stateless") | Boolean | | `True` | | Take action, regardless of state. Should be set to 'true' for MSS-G. | + | [          next_hop](## "router_segment_security.policies.[].sequence_numbers.[].next_hop") | String | | | | When the action is 'redirect', this indicates the IPv4 next hop to redirect to. | + | [  vrfs](## "router_segment_security.vrfs") | List, items: Dictionary | | | | The name of the VRF that the segments and policies are defined in. | + | [    - name](## "router_segment_security.vrfs.[].name") | String | Required, Unique | | | | + | [      segments](## "router_segment_security.vrfs.[].segments") | List, items: Dictionary | Required | | | | + | [        - name](## "router_segment_security.vrfs.[].segments.[].name") | String | Required, Unique | | | Segment name. | + | [          definition](## "router_segment_security.vrfs.[].segments.[].definition") | Dictionary | | | | | + | [            interfaces](## "router_segment_security.vrfs.[].segments.[].definition.interfaces") | List, items: String | | | Min Length: 1 | The names of the source interface e.g. Port-Channel1 - note that platform support is limited. | + | [              - <str>](## "router_segment_security.vrfs.[].segments.[].definition.interfaces.[]") | String | | | | | + | [            match_lists](## "router_segment_security.vrfs.[].segments.[].definition.match_lists") | List, items: Dictionary | | | Min Length: 1
Max Length: 2 | The set of lists that define the segment. These can be a mix of IPv4 and IPv6 prefix or match lists. | + | [              - address_family](## "router_segment_security.vrfs.[].segments.[].definition.match_lists.[].address_family") | String | Required, Unique | | Valid Values:
- ipv4
- ipv6 | Indicate which address-family the match list belongs to e.g. ipv4 or ipv6. | + | [                covered_prefix_list](## "router_segment_security.vrfs.[].segments.[].definition.match_lists.[].covered_prefix_list") | String | | | | The name of the prefix-list. You can have a maximum of one per address-family. Mutually exclusive to the use of match_list. If both are configured prefix takes precedence. | + | [                prefix](## "router_segment_security.vrfs.[].segments.[].definition.match_lists.[].prefix") | String | | | | The name of the match-list. You can have a maximum of one per address-family. Mutually exclusive to the use of covered_prefix_list. If both are configured prefix takes precedence. | + | [          policies](## "router_segment_security.vrfs.[].segments.[].policies") | List, items: Dictionary | | | | The policies controlling traffic into the segment. | + | [            - from](## "router_segment_security.vrfs.[].segments.[].policies.[].from") | String | Required, Unique | | | The name of the source segment or 'forwarding-segments' for all segments. | + | [              policy](## "router_segment_security.vrfs.[].segments.[].policies.[].policy") | String | | | | The name of the policy to apply. The built-in policies are 'policy-forward-all' and 'policy-drop-all'. | + | [          fallback_policy](## "router_segment_security.vrfs.[].segments.[].fallback_policy") | String | | | | Only supported on the R3 series platforms, this allows a per-segment default policy to be specified by name. | + +=== "YAML" + + ```yaml + router_segment_security: + enabled: + + # Customised application policies. + # Using the Application Traffic Recognition L4 profiles, custom policies can be defined. The built-in application 'app-match-all' can be used to match any packets. + # Note that this is stateless, so both the source and destination flows need to be considered. + policies: + + # Policy name. + - name: + sequence_numbers: # required + + # Sequence ID. + - sequence: + + # The name of the application. + application: + + # The action to take - note that platform support for the redirect action is limited. The "redirect" action also requires the 'next_hop' to be configured. + action: + + # Enable logging - note that platform support is limited. + log: + + # Take action, regardless of state. Should be set to 'true' for MSS-G. + stateless: + + # When the action is 'redirect', this indicates the IPv4 next hop to redirect to. + next_hop: + + # The name of the VRF that the segments and policies are defined in. + vrfs: + - name: + segments: # required + + # Segment name. + - name: + definition: + + # The names of the source interface e.g. Port-Channel1 - note that platform support is limited. + interfaces: # >=1 items + - + + # The set of lists that define the segment. These can be a mix of IPv4 and IPv6 prefix or match lists. + match_lists: # 1-2 items + + # Indicate which address-family the match list belongs to e.g. ipv4 or ipv6. + - address_family: + + # The name of the prefix-list. You can have a maximum of one per address-family. Mutually exclusive to the use of match_list. If both are configured prefix takes precedence. + covered_prefix_list: + + # The name of the match-list. You can have a maximum of one per address-family. Mutually exclusive to the use of covered_prefix_list. If both are configured prefix takes precedence. + prefix: + + # The policies controlling traffic into the segment. + policies: + + # The name of the source segment or 'forwarding-segments' for all segments. + - from: + + # The name of the policy to apply. The built-in policies are 'policy-forward-all' and 'policy-drop-all'. + policy: + + # Only supported on the R3 series platforms, this allows a per-segment default policy to be specified by name. + fallback_policy: + ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-traffic-engineering.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-traffic-engineering.md index 7383cad2e52..776cfcd828b 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-traffic-engineering.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/router-traffic-engineering.md @@ -15,13 +15,13 @@ | [  segment_routing](## "router_traffic_engineering.segment_routing") | Dictionary | | | | | | [    colored_tunnel_rib](## "router_traffic_engineering.segment_routing.colored_tunnel_rib") | Boolean | | | | | | [    policy_endpoints](## "router_traffic_engineering.segment_routing.policy_endpoints") | List, items: Dictionary | | | | | - | [      - address](## "router_traffic_engineering.segment_routing.policy_endpoints.[].address") | String | | | | IPv4 or IPv6 address | + | [      - address](## "router_traffic_engineering.segment_routing.policy_endpoints.[].address") | String | | | | IPv4 or IPv6 address. | | [        colors](## "router_traffic_engineering.segment_routing.policy_endpoints.[].colors") | List, items: Dictionary | | | | | | [          - value](## "router_traffic_engineering.segment_routing.policy_endpoints.[].colors.[].value") | Integer | Required, Unique | | | | | [            binding_sid](## "router_traffic_engineering.segment_routing.policy_endpoints.[].colors.[].binding_sid") | Integer | | | | | | [            description](## "router_traffic_engineering.segment_routing.policy_endpoints.[].colors.[].description") | String | | | | | | [            name](## "router_traffic_engineering.segment_routing.policy_endpoints.[].colors.[].name") | String | | | | | - | [            sbfd_remote_discriminator](## "router_traffic_engineering.segment_routing.policy_endpoints.[].colors.[].sbfd_remote_discriminator") | String | | | | IPv4 address or 32 bit integer | + | [            sbfd_remote_discriminator](## "router_traffic_engineering.segment_routing.policy_endpoints.[].colors.[].sbfd_remote_discriminator") | String | | | | IPv4 address or 32 bit integer. | | [            path_group](## "router_traffic_engineering.segment_routing.policy_endpoints.[].colors.[].path_group") | List, items: Dictionary | | | | | | [              - preference](## "router_traffic_engineering.segment_routing.policy_endpoints.[].colors.[].path_group.[].preference") | Integer | | | | | | [                explicit_null](## "router_traffic_engineering.segment_routing.policy_endpoints.[].colors.[].path_group.[].explicit_null") | String | | | Valid Values:
- ipv4
- ipv6
- ipv4 ipv6
- none | | @@ -42,7 +42,7 @@ colored_tunnel_rib: policy_endpoints: - # IPv4 or IPv6 address + # IPv4 or IPv6 address. - address: colors: - value: @@ -50,7 +50,7 @@ description: name: - # IPv4 address or 32 bit integer + # IPv4 address or 32 bit integer. sbfd_remote_discriminator: path_group: - preference: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/sflow.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/sflow.md index 728aab63e79..da254301d80 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/sflow.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/sflow.md @@ -12,22 +12,22 @@ | [  sample_input_subinterface](## "sflow.sample_input_subinterface") | Boolean | | | | | | [  sample_output_subinterface](## "sflow.sample_output_subinterface") | Boolean | | | | | | [  dangerous](## "sflow.dangerous") | Boolean | | | | | - | [  polling_interval](## "sflow.polling_interval") | Integer | | | | Polling interval in seconds | + | [  polling_interval](## "sflow.polling_interval") | Integer | | | | Polling interval in seconds. | | [  vrfs](## "sflow.vrfs") | List, items: Dictionary | | | | | | [    - name](## "sflow.vrfs.[].name") | String | Required, Unique | | | | | [      destinations](## "sflow.vrfs.[].destinations") | List, items: Dictionary | | | | | - | [        - destination](## "sflow.vrfs.[].destinations.[].destination") | String | Required, Unique | | | Sflow Destination IP Address | + | [        - destination](## "sflow.vrfs.[].destinations.[].destination") | String | Required, Unique | | | Sflow Destination IP Address. | | [          port](## "sflow.vrfs.[].destinations.[].port") | Integer | | | | Port Number | | [      source](## "sflow.vrfs.[].source") | String | | | | Source IP Address.
"source" and "source_interface" are mutually exclusive. If both are defined, "source_interface" takes precedence.
| - | [      source_interface](## "sflow.vrfs.[].source_interface") | String | | | | Source Interface | + | [      source_interface](## "sflow.vrfs.[].source_interface") | String | | | | Source Interface. | | [  destinations](## "sflow.destinations") | List, items: Dictionary | | | | | - | [    - destination](## "sflow.destinations.[].destination") | String | Required, Unique | | | Sflow Destination IP Address | - | [      port](## "sflow.destinations.[].port") | Integer | | | | Port Number | + | [    - destination](## "sflow.destinations.[].destination") | String | Required, Unique | | | Sflow Destination IP Address. | + | [      port](## "sflow.destinations.[].port") | Integer | | | | Port Number. | | [  source](## "sflow.source") | String | | | | Source IP Address.
"source" and "source_interface" are mutually exclusive. If both are defined, "source_interface" takes precedence.
| - | [  source_interface](## "sflow.source_interface") | String | | | | Source Interface | + | [  source_interface](## "sflow.source_interface") | String | | | | Source Interface. | | [  extensions](## "sflow.extensions") | List, items: Dictionary | | | | | - | [    - name](## "sflow.extensions.[].name") | String | Required, Unique | | | Extension Name | - | [      enabled](## "sflow.extensions.[].enabled") | Boolean | Required | | | Enable or Disable Extension | + | [    - name](## "sflow.extensions.[].name") | String | Required, Unique | | | Extension Name. | + | [      enabled](## "sflow.extensions.[].enabled") | Boolean | Required | | | Enable or Disable Extension. | | [  interface](## "sflow.interface") | Dictionary | | | | | | [    disable](## "sflow.interface.disable") | Dictionary | | | | | | [      default](## "sflow.interface.disable.default") | Boolean | | | | | @@ -51,13 +51,13 @@ sample_output_subinterface: dangerous: - # Polling interval in seconds + # Polling interval in seconds. polling_interval: vrfs: - name: destinations: - # Sflow Destination IP Address + # Sflow Destination IP Address. - destination: # Port Number @@ -67,28 +67,28 @@ # "source" and "source_interface" are mutually exclusive. If both are defined, "source_interface" takes precedence. source: - # Source Interface + # Source Interface. source_interface: destinations: - # Sflow Destination IP Address + # Sflow Destination IP Address. - destination: - # Port Number + # Port Number. port: # Source IP Address. # "source" and "source_interface" are mutually exclusive. If both are defined, "source_interface" takes precedence. source: - # Source Interface + # Source Interface. source_interface: extensions: - # Extension Name + # Extension Name. - name: - # Enable or Disable Extension + # Enable or Disable Extension. enabled: interface: disable: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/snmp-server.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/snmp-server.md index 9c798604a96..e52676691f2 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/snmp-server.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/snmp-server.md @@ -7,127 +7,127 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | - | [snmp_server](## "snmp_server") | Dictionary | | | | SNMP settings | + | [snmp_server](## "snmp_server") | Dictionary | | | | SNMP settings. | | [  engine_ids](## "snmp_server.engine_ids") | Dictionary | | | | | - | [    local](## "snmp_server.engine_ids.local") | String | | | | Engine ID in hexadecimal
| + | [    local](## "snmp_server.engine_ids.local") | String | | | | Engine ID in hexadecimal.
| | [    remotes](## "snmp_server.engine_ids.remotes") | List, items: Dictionary | | | | | - | [      - id](## "snmp_server.engine_ids.remotes.[].id") | String | | | | Remote engine ID in hexadecimal
| - | [        address](## "snmp_server.engine_ids.remotes.[].address") | String | | | | Hostname or IP of remote engine
| + | [      - id](## "snmp_server.engine_ids.remotes.[].id") | String | | | | Remote engine ID in hexadecimal.
| + | [        address](## "snmp_server.engine_ids.remotes.[].address") | String | | | | Hostname or IP of remote engine.
| | [        udp_port](## "snmp_server.engine_ids.remotes.[].udp_port") | Integer | | | | | - | [  contact](## "snmp_server.contact") | String | | | | SNMP contact | - | [  location](## "snmp_server.location") | String | | | | SNMP location | + | [  contact](## "snmp_server.contact") | String | | | | SNMP contact. | + | [  location](## "snmp_server.location") | String | | | | SNMP location. | | [  communities](## "snmp_server.communities") | List, items: Dictionary | | | | | - | [    - name](## "snmp_server.communities.[].name") | String | Required, Unique | | | Community name | + | [    - name](## "snmp_server.communities.[].name") | String | Required, Unique | | | Community name. | | [      access](## "snmp_server.communities.[].access") | String | | | Valid Values:
- ro
- rw | | | [      access_list_ipv4](## "snmp_server.communities.[].access_list_ipv4") | Dictionary | | | | | - | [        name](## "snmp_server.communities.[].access_list_ipv4.name") | String | | | | IPv4 access list name | + | [        name](## "snmp_server.communities.[].access_list_ipv4.name") | String | | | | IPv4 access list name. | | [      access_list_ipv6](## "snmp_server.communities.[].access_list_ipv6") | Dictionary | | | | | - | [        name](## "snmp_server.communities.[].access_list_ipv6.name") | String | | | | IPv6 access list name | + | [        name](## "snmp_server.communities.[].access_list_ipv6.name") | String | | | | IPv6 access list name. | | [      view](## "snmp_server.communities.[].view") | String | | | | | | [  ipv4_acls](## "snmp_server.ipv4_acls") | List, items: Dictionary | | | | | - | [    - name](## "snmp_server.ipv4_acls.[].name") | String | | | | IPv4 access list name | + | [    - name](## "snmp_server.ipv4_acls.[].name") | String | | | | IPv4 access list name. | | [      vrf](## "snmp_server.ipv4_acls.[].vrf") | String | | | | | | [  ipv6_acls](## "snmp_server.ipv6_acls") | List, items: Dictionary | | | | | - | [    - name](## "snmp_server.ipv6_acls.[].name") | String | | | | IPv6 access list name | + | [    - name](## "snmp_server.ipv6_acls.[].name") | String | | | | IPv6 access list name. | | [      vrf](## "snmp_server.ipv6_acls.[].vrf") | String | | | | | | [  local_interfaces](## "snmp_server.local_interfaces") | List, items: Dictionary | | | | | - | [    - name](## "snmp_server.local_interfaces.[].name") | String | Required, Unique | | | Interface name | + | [    - name](## "snmp_server.local_interfaces.[].name") | String | Required, Unique | | | Interface name. | | [      vrf](## "snmp_server.local_interfaces.[].vrf") | String | | | | | | [  views](## "snmp_server.views") | List, items: Dictionary | | | | | - | [    - name](## "snmp_server.views.[].name") | String | | | | SNMP view name | + | [    - name](## "snmp_server.views.[].name") | String | | | | SNMP view name. | | [      mib_family_name](## "snmp_server.views.[].mib_family_name") | String | | | | | | [      included](## "snmp_server.views.[].included") | Boolean | | | | | | [      MIB_family_name](## "snmp_server.views.[].MIB_family_name") deprecated | String | | | | This key is deprecated. Support will be removed in AVD version 5.0.0. Use mib_family_name instead. | | [  groups](## "snmp_server.groups") | List, items: Dictionary | | | | | - | [    - name](## "snmp_server.groups.[].name") | String | | | | Group name | + | [    - name](## "snmp_server.groups.[].name") | String | | | | Group name. | | [      version](## "snmp_server.groups.[].version") | String | | | Valid Values:
- v1
- v2c
- v3 | | | [      authentication](## "snmp_server.groups.[].authentication") | String | | | Valid Values:
- auth
- noauth
- priv | | - | [      read](## "snmp_server.groups.[].read") | String | | | | Read view | - | [      write](## "snmp_server.groups.[].write") | String | | | | Write view | - | [      notify](## "snmp_server.groups.[].notify") | String | | | | Notify view | + | [      read](## "snmp_server.groups.[].read") | String | | | | Read view. | + | [      write](## "snmp_server.groups.[].write") | String | | | | Write view. | + | [      notify](## "snmp_server.groups.[].notify") | String | | | | Notify view. | | [  users](## "snmp_server.users") | List, items: Dictionary | | | | | - | [    - name](## "snmp_server.users.[].name") | String | | | | Username | - | [      group](## "snmp_server.users.[].group") | String | | | | Group name | - | [      remote_address](## "snmp_server.users.[].remote_address") | String | | | | Hostname or ip of remote engine
The remote_address and udp_port are used for remote users
| - | [      udp_port](## "snmp_server.users.[].udp_port") | Integer | | | | udp_port will not be used if no remote_address is configured
| + | [    - name](## "snmp_server.users.[].name") | String | | | | Username. | + | [      group](## "snmp_server.users.[].group") | String | | | | Group name. | + | [      remote_address](## "snmp_server.users.[].remote_address") | String | | | | Hostname or ip of remote engine.
The remote_address and udp_port are used for remote users.
| + | [      udp_port](## "snmp_server.users.[].udp_port") | Integer | | | | udp_port will not be used if no remote_address is configured.
| | [      version](## "snmp_server.users.[].version") | String | | | Valid Values:
- v1
- v2c
- v3 | | - | [      localized](## "snmp_server.users.[].localized") | String | | | | Engine ID in hexadecimal for localizing auth and/or priv
| - | [      auth](## "snmp_server.users.[].auth") | String | | | | Hash algorithm
| - | [      auth_passphrase](## "snmp_server.users.[].auth_passphrase") | String | | | | Hashed authentication passphrase if localized is used else cleartext authentication passphrase
| - | [      priv](## "snmp_server.users.[].priv") | String | | | | Encryption algorithm
| - | [      priv_passphrase](## "snmp_server.users.[].priv_passphrase") | String | | | | Hashed privacy passphrase if localized is used else cleartext privacy passphrase
| + | [      localized](## "snmp_server.users.[].localized") | String | | | | Engine ID in hexadecimal for localizing auth and/or priv.
| + | [      auth](## "snmp_server.users.[].auth") | String | | | | Hash algorithm.
| + | [      auth_passphrase](## "snmp_server.users.[].auth_passphrase") | String | | | | Hashed authentication passphrase if localized is used else cleartext authentication passphrase.
| + | [      priv](## "snmp_server.users.[].priv") | String | | | | Encryption algorithm.
| + | [      priv_passphrase](## "snmp_server.users.[].priv_passphrase") | String | | | | Hashed privacy passphrase if localized is used else cleartext privacy passphrase.
| | [  hosts](## "snmp_server.hosts") | List, items: Dictionary | | | | | - | [    - host](## "snmp_server.hosts.[].host") | String | | | | Host IP address or name | + | [    - host](## "snmp_server.hosts.[].host") | String | | | | Host IP address or name. | | [      vrf](## "snmp_server.hosts.[].vrf") | String | | | | | | [      version](## "snmp_server.hosts.[].version") | String | | | Valid Values:
- 1
- 2c
- 3 | | - | [      community](## "snmp_server.hosts.[].community") | String | | | | Community name | + | [      community](## "snmp_server.hosts.[].community") | String | | | | Community name. | | [      users](## "snmp_server.hosts.[].users") | List, items: Dictionary | | | | | | [        - username](## "snmp_server.hosts.[].users.[].username") | String | | | | | | [          authentication_level](## "snmp_server.hosts.[].users.[].authentication_level") | String | | | Valid Values:
- auth
- noauth
- priv | | | [  traps](## "snmp_server.traps") | Dictionary | | | | | - | [    enable](## "snmp_server.traps.enable") | Boolean | | `False` | | Enable or disable all snmp-traps
| + | [    enable](## "snmp_server.traps.enable") | Boolean | | `False` | | Enable or disable all snmp-traps.
| | [    snmp_traps](## "snmp_server.traps.snmp_traps") | List, items: Dictionary | | | | | - | [      - name](## "snmp_server.traps.snmp_traps.[].name") | String | | | | Enable or disable specific snmp-traps and their sub_traps
Examples:
- "bgp"
- "bgp established"
| + | [      - name](## "snmp_server.traps.snmp_traps.[].name") | String | | | | Enable or disable specific snmp-traps and their sub_traps.
Examples:
- "bgp"
- "bgp established"
| | [        enabled](## "snmp_server.traps.snmp_traps.[].enabled") | Boolean | | `True` | | | | [  vrfs](## "snmp_server.vrfs") | List, items: Dictionary | | | | | - | [    - name](## "snmp_server.vrfs.[].name") | String | Required, Unique | | | VRF name | + | [    - name](## "snmp_server.vrfs.[].name") | String | Required, Unique | | | VRF name. | | [      enable](## "snmp_server.vrfs.[].enable") | Boolean | | | | | === "YAML" ```yaml - # SNMP settings + # SNMP settings. snmp_server: engine_ids: - # Engine ID in hexadecimal + # Engine ID in hexadecimal. local: remotes: - # Remote engine ID in hexadecimal + # Remote engine ID in hexadecimal. - id: - # Hostname or IP of remote engine + # Hostname or IP of remote engine. address: udp_port: - # SNMP contact + # SNMP contact. contact: - # SNMP location + # SNMP location. location: communities: - # Community name + # Community name. - name: access: access_list_ipv4: - # IPv4 access list name + # IPv4 access list name. name: access_list_ipv6: - # IPv6 access list name + # IPv6 access list name. name: view: ipv4_acls: - # IPv4 access list name + # IPv4 access list name. - name: vrf: ipv6_acls: - # IPv6 access list name + # IPv6 access list name. - name: vrf: local_interfaces: - # Interface name + # Interface name. - name: vrf: views: - # SNMP view name + # SNMP view name. - name: mib_family_name: included: @@ -137,68 +137,68 @@ MIB_family_name: groups: - # Group name + # Group name. - name: version: authentication: - # Read view + # Read view. read: - # Write view + # Write view. write: - # Notify view + # Notify view. notify: users: - # Username + # Username. - name: - # Group name + # Group name. group: - # Hostname or ip of remote engine - # The remote_address and udp_port are used for remote users + # Hostname or ip of remote engine. + # The remote_address and udp_port are used for remote users. remote_address: - # udp_port will not be used if no remote_address is configured + # udp_port will not be used if no remote_address is configured. udp_port: version: - # Engine ID in hexadecimal for localizing auth and/or priv + # Engine ID in hexadecimal for localizing auth and/or priv. localized: - # Hash algorithm + # Hash algorithm. auth: - # Hashed authentication passphrase if localized is used else cleartext authentication passphrase + # Hashed authentication passphrase if localized is used else cleartext authentication passphrase. auth_passphrase: - # Encryption algorithm + # Encryption algorithm. priv: - # Hashed privacy passphrase if localized is used else cleartext privacy passphrase + # Hashed privacy passphrase if localized is used else cleartext privacy passphrase. priv_passphrase: hosts: - # Host IP address or name + # Host IP address or name. - host: vrf: version: - # Community name + # Community name. community: users: - username: authentication_level: traps: - # Enable or disable all snmp-traps + # Enable or disable all snmp-traps. enable: snmp_traps: - # Enable or disable specific snmp-traps and their sub_traps + # Enable or disable specific snmp-traps and their sub_traps. # Examples: # - "bgp" # - "bgp established" @@ -206,7 +206,7 @@ enabled: vrfs: - # VRF name + # VRF name. - name: enable: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/spanning-tree.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/spanning-tree.md index e007bf13ea5..7491aa65781 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/spanning-tree.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/spanning-tree.md @@ -15,18 +15,18 @@ | [  mode](## "spanning_tree.mode") | String | | | Valid Values:
- mstp
- rstp
- rapid-pvst
- none | | | [  bpduguard_rate_limit](## "spanning_tree.bpduguard_rate_limit") | Dictionary | | | | | | [    default](## "spanning_tree.bpduguard_rate_limit.default") | Boolean | | | | | - | [    count](## "spanning_tree.bpduguard_rate_limit.count") | Integer | | | | Maximum number of BPDUs per timer interval | + | [    count](## "spanning_tree.bpduguard_rate_limit.count") | Integer | | | | Maximum number of BPDUs per timer interval. | | [  rstp_priority](## "spanning_tree.rstp_priority") | Integer | | | | | | [  mst](## "spanning_tree.mst") | Dictionary | | | | | | [    pvst_border](## "spanning_tree.mst.pvst_border") | Boolean | | | | | | [    configuration](## "spanning_tree.mst.configuration") | Dictionary | | | | | | [      name](## "spanning_tree.mst.configuration.name") | String | | | | | - | [      revision](## "spanning_tree.mst.configuration.revision") | Integer | | | | 0-65535 | + | [      revision](## "spanning_tree.mst.configuration.revision") | Integer | | | | 0-65535. | | [      instances](## "spanning_tree.mst.configuration.instances") | List, items: Dictionary | | | | | - | [        - id](## "spanning_tree.mst.configuration.instances.[].id") | Integer | Required, Unique | | | Instance ID | + | [        - id](## "spanning_tree.mst.configuration.instances.[].id") | Integer | Required, Unique | | | Instance ID. | | [          vlans](## "spanning_tree.mst.configuration.instances.[].vlans") | String | | | | "< vlan_id >, < vlan_id >-< vlan_id >"
Example: 15,16,17,18
| | [  mst_instances](## "spanning_tree.mst_instances") | List, items: Dictionary | | | | | - | [    - id](## "spanning_tree.mst_instances.[].id") | String | Required, Unique | | | Instance ID | + | [    - id](## "spanning_tree.mst_instances.[].id") | String | Required, Unique | | | Instance ID. | | [      priority](## "spanning_tree.mst_instances.[].priority") | Integer | | | | | | [  no_spanning_tree_vlan](## "spanning_tree.no_spanning_tree_vlan") | String | | | | "< vlan_id >, < vlan_id >-< vlan_id >"
Example: 105,202,505-506
| | [  rapid_pvst_instances](## "spanning_tree.rapid_pvst_instances") | List, items: Dictionary | | | | | @@ -45,7 +45,7 @@ bpduguard_rate_limit: default: - # Maximum number of BPDUs per timer interval + # Maximum number of BPDUs per timer interval. count: rstp_priority: mst: @@ -53,11 +53,11 @@ configuration: name: - # 0-65535 + # 0-65535. revision: instances: - # Instance ID + # Instance ID. - id: # "< vlan_id >, < vlan_id >-< vlan_id >" @@ -65,7 +65,7 @@ vlans: mst_instances: - # Instance ID + # Instance ID. - id: priority: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/standard-access-lists.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/standard-access-lists.md index 151ae31612f..5639eae4716 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/standard-access-lists.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/standard-access-lists.md @@ -8,26 +8,26 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [standard_access_lists](## "standard_access_lists") | List, items: Dictionary | | | | | - | [  - name](## "standard_access_lists.[].name") | String | Required, Unique | | | Access-list Name | + | [  - name](## "standard_access_lists.[].name") | String | Required, Unique | | | Access-list Name. | | [    counters_per_entry](## "standard_access_lists.[].counters_per_entry") | Boolean | | | | | | [    sequence_numbers](## "standard_access_lists.[].sequence_numbers") | List, items: Dictionary | Required | | | | - | [      - sequence](## "standard_access_lists.[].sequence_numbers.[].sequence") | Integer | Required, Unique | | | Sequence ID | - | [        action](## "standard_access_lists.[].sequence_numbers.[].action") | String | Required | | | Action as string
Example: "deny ip any any"
| + | [      - sequence](## "standard_access_lists.[].sequence_numbers.[].sequence") | Integer | Required, Unique | | | Sequence ID. | + | [        action](## "standard_access_lists.[].sequence_numbers.[].action") | String | Required | | | Action as string.
Example: "deny ip any any"
| === "YAML" ```yaml standard_access_lists: - # Access-list Name + # Access-list Name. - name: counters_per_entry: sequence_numbers: # required - # Sequence ID + # Sequence ID. - sequence: - # Action as string + # Action as string. # Example: "deny ip any any" action: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/static-routes.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/static-routes.md index 8a9d6c2e6c8..9b2d69f4915 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/static-routes.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/static-routes.md @@ -8,14 +8,14 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [static_routes](## "static_routes") | List, items: Dictionary | | | | | - | [  - vrf](## "static_routes.[].vrf") | String | | | | VRF Name | - | [    destination_address_prefix](## "static_routes.[].destination_address_prefix") | String | | | | IPv4_network/Mask | + | [  - vrf](## "static_routes.[].vrf") | String | | | | VRF Name. | + | [    destination_address_prefix](## "static_routes.[].destination_address_prefix") | String | | | | IPv4_network/Mask. | | [    interface](## "static_routes.[].interface") | String | | | | | - | [    gateway](## "static_routes.[].gateway") | String | | | | IPv4 Address | - | [    track_bfd](## "static_routes.[].track_bfd") | Boolean | | | | Track next-hop using BFD | + | [    gateway](## "static_routes.[].gateway") | String | | | | IPv4 Address. | + | [    track_bfd](## "static_routes.[].track_bfd") | Boolean | | | | Track next-hop using BFD. | | [    distance](## "static_routes.[].distance") | Integer | | | Min: 1
Max: 255 | | | [    tag](## "static_routes.[].tag") | Integer | | | Min: 0
Max: 4294967295 | | - | [    name](## "static_routes.[].name") | String | | | | Description | + | [    name](## "static_routes.[].name") | String | | | | Description. | | [    metric](## "static_routes.[].metric") | Integer | | | Min: 0
Max: 4294967295 | | === "YAML" @@ -23,22 +23,22 @@ ```yaml static_routes: - # VRF Name + # VRF Name. - vrf: - # IPv4_network/Mask + # IPv4_network/Mask. destination_address_prefix: interface: - # IPv4 Address + # IPv4 Address. gateway: - # Track next-hop using BFD + # Track next-hop using BFD. track_bfd: distance: tag: - # Description + # Description. name: metric: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/switchport-default.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/switchport-default.md index 2c94c791ef5..afbdb434361 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/switchport-default.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/switchport-default.md @@ -12,7 +12,7 @@ | [  phone](## "switchport_default.phone") | Dictionary | | | | | | [    cos](## "switchport_default.phone.cos") | Integer | | | Min: 0
Max: 7 | | | [    trunk](## "switchport_default.phone.trunk") | String | | | Valid Values:
- tagged
- untagged | | - | [    vlan](## "switchport_default.phone.vlan") | Integer | | | Min: 1
Max: 4094 | VLAN ID | + | [    vlan](## "switchport_default.phone.vlan") | Integer | | | Min: 1
Max: 4094 | VLAN ID. | === "YAML" @@ -23,6 +23,6 @@ cos: trunk: - # VLAN ID + # VLAN ID. vlan: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/system.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/system.md index 26f19e6305f..e8ba9fdb5f0 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/system.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/system.md @@ -10,8 +10,8 @@ | [system](## "system") | Dictionary | | | | | | [  control_plane](## "system.control_plane") | Dictionary | | | | | | [    tcp_mss](## "system.control_plane.tcp_mss") | Dictionary | | | | | - | [      ipv4](## "system.control_plane.tcp_mss.ipv4") | Integer | | | | Segment size | - | [      ipv6](## "system.control_plane.tcp_mss.ipv6") | Integer | | | | Segment size | + | [      ipv4](## "system.control_plane.tcp_mss.ipv4") | Integer | | | | Segment size. | + | [      ipv6](## "system.control_plane.tcp_mss.ipv6") | Integer | | | | Segment size. | | [    ipv4_access_groups](## "system.control_plane.ipv4_access_groups") | List, items: Dictionary | | | | | | [      - acl_name](## "system.control_plane.ipv4_access_groups.[].acl_name") | String | Required, Unique | | | | | [        vrf](## "system.control_plane.ipv4_access_groups.[].vrf") | String | | | | | @@ -29,10 +29,10 @@ control_plane: tcp_mss: - # Segment size + # Segment size. ipv4: - # Segment size + # Segment size. ipv6: ipv4_access_groups: - acl_name: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/tacacs-servers.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/tacacs-servers.md index 627dbffb05d..cd4ad9e634f 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/tacacs-servers.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/tacacs-servers.md @@ -8,14 +8,14 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [tacacs_servers](## "tacacs_servers") | Dictionary | | | | | - | [  timeout](## "tacacs_servers.timeout") | Integer | | | Min: 1
Max: 1000 | Timeout in seconds | + | [  timeout](## "tacacs_servers.timeout") | Integer | | | Min: 1
Max: 1000 | Timeout in seconds. | | [  hosts](## "tacacs_servers.hosts") | List, items: Dictionary | | | | | - | [    - host](## "tacacs_servers.hosts.[].host") | String | | | | Host IP address or name | + | [    - host](## "tacacs_servers.hosts.[].host") | String | | | | Host IP address or name. | | [      vrf](## "tacacs_servers.hosts.[].vrf") | String | | | | | - | [      key](## "tacacs_servers.hosts.[].key") | String | | | | Encrypted key | + | [      key](## "tacacs_servers.hosts.[].key") | String | | | | Encrypted key. | | [      key_type](## "tacacs_servers.hosts.[].key_type") | String | | `7` | Valid Values:
- 0
- 7
- 8a | | | [      single_connection](## "tacacs_servers.hosts.[].single_connection") | Boolean | | | | | - | [      timeout](## "tacacs_servers.hosts.[].timeout") | Integer | | | Min: 1
Max: 1000 | Timeout in seconds | + | [      timeout](## "tacacs_servers.hosts.[].timeout") | Integer | | | Min: 1
Max: 1000 | Timeout in seconds. | | [  policy_unknown_mandatory_attribute_ignore](## "tacacs_servers.policy_unknown_mandatory_attribute_ignore") | Boolean | | | | | === "YAML" @@ -23,20 +23,20 @@ ```yaml tacacs_servers: - # Timeout in seconds + # Timeout in seconds. timeout: hosts: - # Host IP address or name + # Host IP address or name. - host: vrf: - # Encrypted key + # Encrypted key. key: key_type: single_connection: - # Timeout in seconds + # Timeout in seconds. timeout: policy_unknown_mandatory_attribute_ignore: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/tap-aggregation.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/tap-aggregation.md index 595b8fb19ef..63fc7d789dc 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/tap-aggregation.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/tap-aggregation.md @@ -11,20 +11,20 @@ | [  mode](## "tap_aggregation.mode") | Dictionary | | | | | | [    exclusive](## "tap_aggregation.mode.exclusive") | Dictionary | | | | | | [      enabled](## "tap_aggregation.mode.exclusive.enabled") | Boolean | | | | | - | [      profile](## "tap_aggregation.mode.exclusive.profile") | String | | | | Profile Name | + | [      profile](## "tap_aggregation.mode.exclusive.profile") | String | | | | Profile Name. | | [      no_errdisable](## "tap_aggregation.mode.exclusive.no_errdisable") | List, items: String | | | | | - | [        - <str>](## "tap_aggregation.mode.exclusive.no_errdisable.[]") | String | | | | Interface name e.g Ethernet1, Port-Channel1 | + | [        - <str>](## "tap_aggregation.mode.exclusive.no_errdisable.[]") | String | | | | Interface name e.g Ethernet1, Port-Channel1. | | [  encapsulation_dot1br_strip](## "tap_aggregation.encapsulation_dot1br_strip") | Boolean | | | | | | [  encapsulation_vn_tag_strip](## "tap_aggregation.encapsulation_vn_tag_strip") | Boolean | | | | | | [  protocol_lldp_trap](## "tap_aggregation.protocol_lldp_trap") | Boolean | | | | | - | [  truncation_size](## "tap_aggregation.truncation_size") | Integer | | | | Allowed truncation_size values vary depending on the platform
| + | [  truncation_size](## "tap_aggregation.truncation_size") | Integer | | | | Allowed truncation_size values vary depending on the platform.
| | [  mac](## "tap_aggregation.mac") | Dictionary | | | | | - | [    timestamp](## "tap_aggregation.mac.timestamp") | Dictionary | | | | mac.timestamp.replace_source_mac and mac.timestamp.header.format are mutually exclsuive. If both are defined, replace_source_mac takes precedence
| + | [    timestamp](## "tap_aggregation.mac.timestamp") | Dictionary | | | | mac.timestamp.replace_source_mac and mac.timestamp.header.format are mutually exclsuive. If both are defined, replace_source_mac takes precedence.
| | [      replace_source_mac](## "tap_aggregation.mac.timestamp.replace_source_mac") | Boolean | | | | | | [      header](## "tap_aggregation.mac.timestamp.header") | Dictionary | | | | | | [        format](## "tap_aggregation.mac.timestamp.header.format") | String | | | Valid Values:
- 48-bit
- 64-bit | | - | [        eth_type](## "tap_aggregation.mac.timestamp.header.eth_type") | Integer | | | | EtherType | - | [    fcs_append](## "tap_aggregation.mac.fcs_append") | Boolean | | | | mac.fcs_append and mac.fcs_error are mutually exclusive. If both are defined, mac.fcs_append takes precedence
| + | [        eth_type](## "tap_aggregation.mac.timestamp.header.eth_type") | Integer | | | | EtherType. | + | [    fcs_append](## "tap_aggregation.mac.fcs_append") | Boolean | | | | mac.fcs_append and mac.fcs_error are mutually exclusive. If both are defined, mac.fcs_append takes precedence.
| | [    fcs_error](## "tap_aggregation.mac.fcs_error") | String | | | Valid Values:
- correct
- discard
- pass-through | | === "YAML" @@ -35,30 +35,30 @@ exclusive: enabled: - # Profile Name + # Profile Name. profile: no_errdisable: - # Interface name e.g Ethernet1, Port-Channel1 + # Interface name e.g Ethernet1, Port-Channel1. - encapsulation_dot1br_strip: encapsulation_vn_tag_strip: protocol_lldp_trap: - # Allowed truncation_size values vary depending on the platform + # Allowed truncation_size values vary depending on the platform. truncation_size: mac: - # mac.timestamp.replace_source_mac and mac.timestamp.header.format are mutually exclsuive. If both are defined, replace_source_mac takes precedence + # mac.timestamp.replace_source_mac and mac.timestamp.header.format are mutually exclsuive. If both are defined, replace_source_mac takes precedence. timestamp: replace_source_mac: header: format: - # EtherType + # EtherType. eth_type: - # mac.fcs_append and mac.fcs_error are mutually exclusive. If both are defined, mac.fcs_append takes precedence + # mac.fcs_append and mac.fcs_error are mutually exclusive. If both are defined, mac.fcs_append takes precedence. fcs_append: fcs_error: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/tcam-profile.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/tcam-profile.md index 21afe67b9c1..8f4d83dea72 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/tcam-profile.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/tcam-profile.md @@ -8,9 +8,9 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [tcam_profile](## "tcam_profile") | Dictionary | | | | | - | [  system](## "tcam_profile.system") | String | | | | TCAM profile name to activate
| + | [  system](## "tcam_profile.system") | String | | | | TCAM profile name to activate.
| | [  profiles](## "tcam_profile.profiles") | List, items: Dictionary | | | | | - | [    - name](## "tcam_profile.profiles.[].name") | String | Required, Unique | | | Tcam-Profile Name | + | [    - name](## "tcam_profile.profiles.[].name") | String | Required, Unique | | | Tcam-Profile Name. | | [      config](## "tcam_profile.profiles.[].config") | String | | | | TCAM Profile Config. Since these can be very long, it is often a good idea to import the config from a file.
Example: "{{ lookup('file', 'TCAM_TRAFFIC_POLICY.conf') }}"
| | [      source](## "tcam_profile.profiles.[].source") | String | | | | TCAM profile local source path. Used to read the TCAM profile from a local path existing on the device.
| @@ -19,11 +19,11 @@ ```yaml tcam_profile: - # TCAM profile name to activate + # TCAM profile name to activate. system: profiles: - # Tcam-Profile Name + # Tcam-Profile Name. - name: # TCAM Profile Config. Since these can be very long, it is often a good idea to import the config from a file. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/trackers.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/trackers.md index edc43f58332..9c3857e8abe 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/trackers.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/trackers.md @@ -8,21 +8,21 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [trackers](## "trackers") | List, items: Dictionary | | | | | - | [  - name](## "trackers.[].name") | String | Required, Unique | | | Name of tracker object | - | [    interface](## "trackers.[].interface") | String | Required | | | Name of tracked interface | - | [    tracked_property](## "trackers.[].tracked_property") | String | | `line-protocol` | | Property to track | + | [  - name](## "trackers.[].name") | String | Required, Unique | | | Name of tracker object. | + | [    interface](## "trackers.[].interface") | String | Required | | | Name of tracked interface. | + | [    tracked_property](## "trackers.[].tracked_property") | String | | `line-protocol` | | Property to track. | === "YAML" ```yaml trackers: - # Name of tracker object + # Name of tracker object. - name: - # Name of tracked interface + # Name of tracked interface. interface: - # Property to track + # Property to track. tracked_property: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/traffic-policies.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/traffic-policies.md index b01d01ecae1..a246914df61 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/traffic-policies.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/traffic-policies.md @@ -12,63 +12,63 @@ | [    counter_per_interface](## "traffic_policies.options.counter_per_interface") | Boolean | | | | | | [  field_sets](## "traffic_policies.field_sets") | Dictionary | | | | | | [    ipv4](## "traffic_policies.field_sets.ipv4") | List, items: Dictionary | | | | | - | [      - name](## "traffic_policies.field_sets.ipv4.[].name") | String | Required, Unique | | | IPv4 Prefix Field Set Name | + | [      - name](## "traffic_policies.field_sets.ipv4.[].name") | String | Required, Unique | | | IPv4 Prefix Field Set Name. | | [        prefixes](## "traffic_policies.field_sets.ipv4.[].prefixes") | List, items: String | | | | | - | [          - <str>](## "traffic_policies.field_sets.ipv4.[].prefixes.[]") | String | | | | IPv4 Prefix | + | [          - <str>](## "traffic_policies.field_sets.ipv4.[].prefixes.[]") | String | | | | IPv4 Prefix. | | [    ipv6](## "traffic_policies.field_sets.ipv6") | List, items: Dictionary | | | | | - | [      - name](## "traffic_policies.field_sets.ipv6.[].name") | String | Required, Unique | | | IPv6 Prefix Field Set Name | + | [      - name](## "traffic_policies.field_sets.ipv6.[].name") | String | Required, Unique | | | IPv6 Prefix Field Set Name. | | [        prefixes](## "traffic_policies.field_sets.ipv6.[].prefixes") | List, items: String | | | | | - | [          - <str>](## "traffic_policies.field_sets.ipv6.[].prefixes.[]") | String | | | | IPv6 Prefix | + | [          - <str>](## "traffic_policies.field_sets.ipv6.[].prefixes.[]") | String | | | | IPv6 Prefix. | | [    ports](## "traffic_policies.field_sets.ports") | List, items: Dictionary | | | | | - | [      - name](## "traffic_policies.field_sets.ports.[].name") | String | Required, Unique | | | L4 Port Field Set Name | + | [      - name](## "traffic_policies.field_sets.ports.[].name") | String | Required, Unique | | | L4 Port Field Set Name. | | [        port_range](## "traffic_policies.field_sets.ports.[].port_range") | String | | | | Example: '10,20,80,440-450' | | [  policies](## "traffic_policies.policies") | List, items: Dictionary | | | | | - | [    - name](## "traffic_policies.policies.[].name") | String | Required, Unique | | | Traffic Policy Name | + | [    - name](## "traffic_policies.policies.[].name") | String | Required, Unique | | | Traffic Policy Name. | | [      matches](## "traffic_policies.policies.[].matches") | List, items: Dictionary | | | | | - | [        - name](## "traffic_policies.policies.[].matches.[].name") | String | Required, Unique | | | Traffic Policy Item | + | [        - name](## "traffic_policies.policies.[].matches.[].name") | String | Required, Unique | | | Traffic Policy Item. | | [          type](## "traffic_policies.policies.[].matches.[].type") | String | | | Valid Values:
- ipv4
- ipv6 | | | [          source](## "traffic_policies.policies.[].matches.[].source") | Dictionary | | | | | | [            prefixes](## "traffic_policies.policies.[].matches.[].source.prefixes") | List, items: String | | | | | - | [              - <str>](## "traffic_policies.policies.[].matches.[].source.prefixes.[]") | String | | | | IP address or prefix | - | [            prefix_lists](## "traffic_policies.policies.[].matches.[].source.prefix_lists") | List, items: String | | | | Field-set prefix lists | + | [              - <str>](## "traffic_policies.policies.[].matches.[].source.prefixes.[]") | String | | | | IP address or prefix. | + | [            prefix_lists](## "traffic_policies.policies.[].matches.[].source.prefix_lists") | List, items: String | | | | Field-set prefix lists. | | [              - <str>](## "traffic_policies.policies.[].matches.[].source.prefix_lists.[]") | String | | | | | | [          destination](## "traffic_policies.policies.[].matches.[].destination") | Dictionary | | | | | | [            prefixes](## "traffic_policies.policies.[].matches.[].destination.prefixes") | List, items: String | | | | | - | [              - <str>](## "traffic_policies.policies.[].matches.[].destination.prefixes.[]") | String | | | | IP address or prefix | - | [            prefix_lists](## "traffic_policies.policies.[].matches.[].destination.prefix_lists") | List, items: String | | | | Field-set prefix lists | + | [              - <str>](## "traffic_policies.policies.[].matches.[].destination.prefixes.[]") | String | | | | IP address or prefix. | + | [            prefix_lists](## "traffic_policies.policies.[].matches.[].destination.prefix_lists") | List, items: String | | | | Field-set prefix lists. | | [              - <str>](## "traffic_policies.policies.[].matches.[].destination.prefix_lists.[]") | String | | | | | - | [          ttl](## "traffic_policies.policies.[].matches.[].ttl") | String | | | | TTL range | - | [          fragment](## "traffic_policies.policies.[].matches.[].fragment") | Dictionary | | | | The 'fragment' command is not supported when 'source port'
or 'destination port' command is configured
| - | [            offset](## "traffic_policies.policies.[].matches.[].fragment.offset") | String | | | | Fragment offset range | + | [          ttl](## "traffic_policies.policies.[].matches.[].ttl") | String | | | | TTL range. | + | [          fragment](## "traffic_policies.policies.[].matches.[].fragment") | Dictionary | | | | The 'fragment' command is not supported when 'source port'
or 'destination port' command is configured.
| + | [            offset](## "traffic_policies.policies.[].matches.[].fragment.offset") | String | | | | Fragment offset range. | | [          protocols](## "traffic_policies.policies.[].matches.[].protocols") | List, items: Dictionary | | | | | | [            - protocol](## "traffic_policies.policies.[].matches.[].protocols.[].protocol") | String | Required, Unique | | | | - | [              src_port](## "traffic_policies.policies.[].matches.[].protocols.[].src_port") | String | | | | Port range | - | [              dst_port](## "traffic_policies.policies.[].matches.[].protocols.[].dst_port") | String | | | | Port range | - | [              src_field](## "traffic_policies.policies.[].matches.[].protocols.[].src_field") | String | | | | L4 port range field set | - | [              dst_field](## "traffic_policies.policies.[].matches.[].protocols.[].dst_field") | String | | | | L4 port range field set | + | [              src_port](## "traffic_policies.policies.[].matches.[].protocols.[].src_port") | String | | | | Port range. | + | [              dst_port](## "traffic_policies.policies.[].matches.[].protocols.[].dst_port") | String | | | | Port range. | + | [              src_field](## "traffic_policies.policies.[].matches.[].protocols.[].src_field") | String | | | | L4 port range field set. | + | [              dst_field](## "traffic_policies.policies.[].matches.[].protocols.[].dst_field") | String | | | | L4 port range field set. | | [              flags](## "traffic_policies.policies.[].matches.[].protocols.[].flags") | List, items: String | | | | | | [                - <str>](## "traffic_policies.policies.[].matches.[].protocols.[].flags.[]") | String | | | Valid Values:
- established
- initial | | | [              icmp_type](## "traffic_policies.policies.[].matches.[].protocols.[].icmp_type") | List, items: String | | | | | | [                - <str>](## "traffic_policies.policies.[].matches.[].protocols.[].icmp_type.[]") | String | | | | | | [          actions](## "traffic_policies.policies.[].matches.[].actions") | Dictionary | | | | | | [            dscp](## "traffic_policies.policies.[].matches.[].actions.dscp") | Integer | | | | | - | [            traffic_class](## "traffic_policies.policies.[].matches.[].actions.traffic_class") | Integer | | | | Traffic class ID | - | [            count](## "traffic_policies.policies.[].matches.[].actions.count") | String | | | | Counter name | + | [            traffic_class](## "traffic_policies.policies.[].matches.[].actions.traffic_class") | Integer | | | | Traffic class ID. | + | [            count](## "traffic_policies.policies.[].matches.[].actions.count") | String | | | | Counter name. | | [            drop](## "traffic_policies.policies.[].matches.[].actions.drop") | Boolean | | | | | - | [            log](## "traffic_policies.policies.[].matches.[].actions.log") | Boolean | | | | Only supported when action is set to drop | + | [            log](## "traffic_policies.policies.[].matches.[].actions.log") | Boolean | | | | Only supported when action is set to drop. | | [      default_actions](## "traffic_policies.policies.[].default_actions") | Dictionary | | | | | | [        ipv4](## "traffic_policies.policies.[].default_actions.ipv4") | Dictionary | | | | | | [          dscp](## "traffic_policies.policies.[].default_actions.ipv4.dscp") | Integer | | | | | - | [          traffic_class](## "traffic_policies.policies.[].default_actions.ipv4.traffic_class") | Integer | | | | Traffic class ID | - | [          count](## "traffic_policies.policies.[].default_actions.ipv4.count") | String | | | | Counter name | + | [          traffic_class](## "traffic_policies.policies.[].default_actions.ipv4.traffic_class") | Integer | | | | Traffic class ID. | + | [          count](## "traffic_policies.policies.[].default_actions.ipv4.count") | String | | | | Counter name. | | [          drop](## "traffic_policies.policies.[].default_actions.ipv4.drop") | Boolean | | | | | - | [          log](## "traffic_policies.policies.[].default_actions.ipv4.log") | Boolean | | | | Only supported when action is set to drop | + | [          log](## "traffic_policies.policies.[].default_actions.ipv4.log") | Boolean | | | | Only supported when action is set to drop. | | [        ipv6](## "traffic_policies.policies.[].default_actions.ipv6") | Dictionary | | | | | | [          dscp](## "traffic_policies.policies.[].default_actions.ipv6.dscp") | Integer | | | | | - | [          traffic_class](## "traffic_policies.policies.[].default_actions.ipv6.traffic_class") | Integer | | | | Traffic class ID | - | [          count](## "traffic_policies.policies.[].default_actions.ipv6.count") | String | | | | Counter name | + | [          traffic_class](## "traffic_policies.policies.[].default_actions.ipv6.traffic_class") | Integer | | | | Traffic class ID. | + | [          count](## "traffic_policies.policies.[].default_actions.ipv6.count") | String | | | | Counter name. | | [          drop](## "traffic_policies.policies.[].default_actions.ipv6.drop") | Boolean | | | | | - | [          log](## "traffic_policies.policies.[].default_actions.ipv6.log") | Boolean | | | | Only supported when action is set to drop | + | [          log](## "traffic_policies.policies.[].default_actions.ipv6.log") | Boolean | | | | Only supported when action is set to drop. | === "YAML" @@ -79,77 +79,77 @@ field_sets: ipv4: - # IPv4 Prefix Field Set Name + # IPv4 Prefix Field Set Name. - name: prefixes: - # IPv4 Prefix + # IPv4 Prefix. - ipv6: - # IPv6 Prefix Field Set Name + # IPv6 Prefix Field Set Name. - name: prefixes: - # IPv6 Prefix + # IPv6 Prefix. - ports: - # L4 Port Field Set Name + # L4 Port Field Set Name. - name: # Example: '10,20,80,440-450' port_range: policies: - # Traffic Policy Name + # Traffic Policy Name. - name: matches: - # Traffic Policy Item + # Traffic Policy Item. - name: type: source: prefixes: - # IP address or prefix + # IP address or prefix. - - # Field-set prefix lists + # Field-set prefix lists. prefix_lists: - destination: prefixes: - # IP address or prefix + # IP address or prefix. - - # Field-set prefix lists + # Field-set prefix lists. prefix_lists: - - # TTL range + # TTL range. ttl: # The 'fragment' command is not supported when 'source port' - # or 'destination port' command is configured + # or 'destination port' command is configured. fragment: - # Fragment offset range + # Fragment offset range. offset: protocols: - protocol: - # Port range + # Port range. src_port: - # Port range + # Port range. dst_port: - # L4 port range field set + # L4 port range field set. src_field: - # L4 port range field set + # L4 port range field set. dst_field: flags: - @@ -158,38 +158,38 @@ actions: dscp: - # Traffic class ID + # Traffic class ID. traffic_class: - # Counter name + # Counter name. count: drop: - # Only supported when action is set to drop + # Only supported when action is set to drop. log: default_actions: ipv4: dscp: - # Traffic class ID + # Traffic class ID. traffic_class: - # Counter name + # Counter name. count: drop: - # Only supported when action is set to drop + # Only supported when action is set to drop. log: ipv6: dscp: - # Traffic class ID + # Traffic class ID. traffic_class: - # Counter name + # Counter name. count: drop: - # Only supported when action is set to drop + # Only supported when action is set to drop. log: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/tunnel-interfaces.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/tunnel-interfaces.md index ee28acf0321..7ddacee8fb2 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/tunnel-interfaces.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/tunnel-interfaces.md @@ -8,26 +8,26 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [tunnel_interfaces](## "tunnel_interfaces") | List, items: Dictionary | | | | | - | [  - name](## "tunnel_interfaces.[].name") | String | Required, Unique | | | Tunnel Interface Name | + | [  - name](## "tunnel_interfaces.[].name") | String | Required, Unique | | | Tunnel Interface Name. | | [    description](## "tunnel_interfaces.[].description") | String | | | | | | [    shutdown](## "tunnel_interfaces.[].shutdown") | Boolean | | | | | | [    mtu](## "tunnel_interfaces.[].mtu") | Integer | | | Min: 68
Max: 65535 | | - | [    vrf](## "tunnel_interfaces.[].vrf") | String | | | | VRF Name | - | [    ip_address](## "tunnel_interfaces.[].ip_address") | String | | | Format: ipv4_cidr | IPv4_address/Mask | + | [    vrf](## "tunnel_interfaces.[].vrf") | String | | | | VRF Name. | + | [    ip_address](## "tunnel_interfaces.[].ip_address") | String | | | Format: ipv4_cidr | IPv4_address/Mask. | | [    ipv6_enable](## "tunnel_interfaces.[].ipv6_enable") | Boolean | | | | | - | [    ipv6_address](## "tunnel_interfaces.[].ipv6_address") | String | | | Format: ipv6_cidr | IPv6_address/Mask | - | [    access_group_in](## "tunnel_interfaces.[].access_group_in") | String | | | | IPv4 ACL Name for ingress | - | [    access_group_out](## "tunnel_interfaces.[].access_group_out") | String | | | | IPv4 ACL Name for egress | - | [    ipv6_access_group_in](## "tunnel_interfaces.[].ipv6_access_group_in") | String | | | | IPv6 ACL Name for ingress | - | [    ipv6_access_group_out](## "tunnel_interfaces.[].ipv6_access_group_out") | String | | | | IPv6 ACL Name for egress | + | [    ipv6_address](## "tunnel_interfaces.[].ipv6_address") | String | | | Format: ipv6_cidr | IPv6_address/Mask. | + | [    access_group_in](## "tunnel_interfaces.[].access_group_in") | String | | | | IPv4 ACL Name for ingress. | + | [    access_group_out](## "tunnel_interfaces.[].access_group_out") | String | | | | IPv4 ACL Name for egress. | + | [    ipv6_access_group_in](## "tunnel_interfaces.[].ipv6_access_group_in") | String | | | | IPv6 ACL Name for ingress. | + | [    ipv6_access_group_out](## "tunnel_interfaces.[].ipv6_access_group_out") | String | | | | IPv6 ACL Name for egress. | | [    tcp_mss_ceiling](## "tunnel_interfaces.[].tcp_mss_ceiling") | Dictionary | | | | | - | [      ipv4](## "tunnel_interfaces.[].tcp_mss_ceiling.ipv4") | Integer | | | Min: 64
Max: 65495 | Segment Size for IPv4 | - | [      ipv6](## "tunnel_interfaces.[].tcp_mss_ceiling.ipv6") | Integer | | | Min: 64
Max: 65475 | Segment Size for IPv6 | - | [      direction](## "tunnel_interfaces.[].tcp_mss_ceiling.direction") | String | | | Valid Values:
- ingress
- egress | Optional direction ('ingress', 'egress') for tcp mss ceiling
| + | [      ipv4](## "tunnel_interfaces.[].tcp_mss_ceiling.ipv4") | Integer | | | Min: 64
Max: 65495 | Segment Size for IPv4. | + | [      ipv6](## "tunnel_interfaces.[].tcp_mss_ceiling.ipv6") | Integer | | | Min: 64
Max: 65475 | Segment Size for IPv6. | + | [      direction](## "tunnel_interfaces.[].tcp_mss_ceiling.direction") | String | | | Valid Values:
- ingress
- egress | Optional direction ('ingress', 'egress') for tcp mss ceiling.
| | [    tunnel_mode](## "tunnel_interfaces.[].tunnel_mode") | String | | | Valid Values:
- gre
- ipsec | Tunnel encapsulation method.
`gre`: Generic route encapsulation protocol,
`ipsec`: IPsec-over-IP encapsulation. | - | [    source_interface](## "tunnel_interfaces.[].source_interface") | String | | | | Tunnel Source Interface Name | - | [    destination](## "tunnel_interfaces.[].destination") | String | | | | IPv4 or IPv6 Address Tunnel Destination | - | [    path_mtu_discovery](## "tunnel_interfaces.[].path_mtu_discovery") | Boolean | | | | Enable Path MTU Discovery On Tunnel | + | [    source_interface](## "tunnel_interfaces.[].source_interface") | String | | | | Tunnel Source Interface Name. | + | [    destination](## "tunnel_interfaces.[].destination") | String | | | | IPv4 or IPv6 Address Tunnel Destination. | + | [    path_mtu_discovery](## "tunnel_interfaces.[].path_mtu_discovery") | Boolean | | | | Enable Path MTU Discovery On Tunnel. | | [    ipsec_profile](## "tunnel_interfaces.[].ipsec_profile") | String | | | | Used only when `tunnel_mode` is set to `ipsec`.
It must target a defined IPsec profile. | | [    nat_profile](## "tunnel_interfaces.[].nat_profile") | String | | | | NAT interface profile. | | [    eos_cli](## "tunnel_interfaces.[].eos_cli") | String | | | | Multiline String with EOS CLI rendered directly on the Tunnel interface in the final EOS configuration.
| @@ -37,42 +37,42 @@ ```yaml tunnel_interfaces: - # Tunnel Interface Name + # Tunnel Interface Name. - name: description: shutdown: mtu: - # VRF Name + # VRF Name. vrf: - # IPv4_address/Mask + # IPv4_address/Mask. ip_address: ipv6_enable: - # IPv6_address/Mask + # IPv6_address/Mask. ipv6_address: - # IPv4 ACL Name for ingress + # IPv4 ACL Name for ingress. access_group_in: - # IPv4 ACL Name for egress + # IPv4 ACL Name for egress. access_group_out: - # IPv6 ACL Name for ingress + # IPv6 ACL Name for ingress. ipv6_access_group_in: - # IPv6 ACL Name for egress + # IPv6 ACL Name for egress. ipv6_access_group_out: tcp_mss_ceiling: - # Segment Size for IPv4 + # Segment Size for IPv4. ipv4: - # Segment Size for IPv6 + # Segment Size for IPv6. ipv6: - # Optional direction ('ingress', 'egress') for tcp mss ceiling + # Optional direction ('ingress', 'egress') for tcp mss ceiling. direction: # Tunnel encapsulation method. @@ -80,13 +80,13 @@ # `ipsec`: IPsec-over-IP encapsulation. tunnel_mode: - # Tunnel Source Interface Name + # Tunnel Source Interface Name. source_interface: - # IPv4 or IPv6 Address Tunnel Destination + # IPv4 or IPv6 Address Tunnel Destination. destination: - # Enable Path MTU Discovery On Tunnel + # Enable Path MTU Discovery On Tunnel. path_mtu_discovery: # Used only when `tunnel_mode` is set to `ipsec`. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/virtual-source-nat-vrfs.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/virtual-source-nat-vrfs.md index 92541dceff3..c3783592c4c 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/virtual-source-nat-vrfs.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/virtual-source-nat-vrfs.md @@ -8,17 +8,17 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [virtual_source_nat_vrfs](## "virtual_source_nat_vrfs") | List, items: Dictionary | | | | | - | [  - name](## "virtual_source_nat_vrfs.[].name") | String | Required, Unique | | | VRF Name | - | [    ip_address](## "virtual_source_nat_vrfs.[].ip_address") | String | | | | IPv4 Address | + | [  - name](## "virtual_source_nat_vrfs.[].name") | String | Required, Unique | | | VRF Name. | + | [    ip_address](## "virtual_source_nat_vrfs.[].ip_address") | String | | | | IPv4 Address. | === "YAML" ```yaml virtual_source_nat_vrfs: - # VRF Name + # VRF Name. - name: - # IPv4 Address + # IPv4 Address. ip_address: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/vlan-interfaces.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/vlan-interfaces.md index 0dc0badc96f..9f48c02056f 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/vlan-interfaces.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/vlan-interfaces.md @@ -8,27 +8,27 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [vlan_interfaces](## "vlan_interfaces") | List, items: Dictionary | | | | | - | [  - name](## "vlan_interfaces.[].name") | String | Required, Unique | | | VLAN interface name like "Vlan123" | + | [  - name](## "vlan_interfaces.[].name") | String | Required, Unique | | | VLAN interface name like "Vlan123". | | [    description](## "vlan_interfaces.[].description") | String | | | | | | [    logging](## "vlan_interfaces.[].logging") | Dictionary | | | | | | [      event](## "vlan_interfaces.[].logging.event") | Dictionary | | | | | | [        link_status](## "vlan_interfaces.[].logging.event.link_status") | Boolean | | | | | | [    shutdown](## "vlan_interfaces.[].shutdown") | Boolean | | | | | - | [    vrf](## "vlan_interfaces.[].vrf") | String | | | | VRF name | - | [    arp_aging_timeout](## "vlan_interfaces.[].arp_aging_timeout") | Integer | | | Min: 1
Max: 65535 | In seconds | + | [    vrf](## "vlan_interfaces.[].vrf") | String | | | | VRF name. | + | [    arp_aging_timeout](## "vlan_interfaces.[].arp_aging_timeout") | Integer | | | Min: 1
Max: 65535 | In seconds. | | [    arp_cache_dynamic_capacity](## "vlan_interfaces.[].arp_cache_dynamic_capacity") | Integer | | | Min: 0
Max: 4294967295 | | | [    arp_gratuitous_accept](## "vlan_interfaces.[].arp_gratuitous_accept") | Boolean | | | | | | [    arp_monitor_mac_address](## "vlan_interfaces.[].arp_monitor_mac_address") | Boolean | | | | | | [    ip_proxy_arp](## "vlan_interfaces.[].ip_proxy_arp") | Boolean | | | | | | [    ip_directed_broadcast](## "vlan_interfaces.[].ip_directed_broadcast") | Boolean | | | | | - | [    ip_address](## "vlan_interfaces.[].ip_address") | String | | | | IPv4_address/Mask | + | [    ip_address](## "vlan_interfaces.[].ip_address") | String | | | | IPv4_address/Mask. | | [    ip_address_secondaries](## "vlan_interfaces.[].ip_address_secondaries") | List, items: String | | | | | - | [      - <str>](## "vlan_interfaces.[].ip_address_secondaries.[]") | String | | | | IPv4_address/Mask | + | [      - <str>](## "vlan_interfaces.[].ip_address_secondaries.[]") | String | | | | IPv4_address/Mask. | | [    ip_virtual_router_addresses](## "vlan_interfaces.[].ip_virtual_router_addresses") | List, items: String | | | | | - | [      - <str>](## "vlan_interfaces.[].ip_virtual_router_addresses.[]") | String | | | | IPv4 address or IPv4_address/Mask | - | [    ip_address_virtual](## "vlan_interfaces.[].ip_address_virtual") | String | | | | IPv4_address/Mask | + | [      - <str>](## "vlan_interfaces.[].ip_virtual_router_addresses.[]") | String | | | | IPv4 address or IPv4_address/Mask. | + | [    ip_address_virtual](## "vlan_interfaces.[].ip_address_virtual") | String | | | | IPv4_address/Mask. | | [    ip_address_virtual_secondaries](## "vlan_interfaces.[].ip_address_virtual_secondaries") | List, items: String | | | | | - | [      - <str>](## "vlan_interfaces.[].ip_address_virtual_secondaries.[]") | String | | | | IPv4_address/Mask | + | [      - <str>](## "vlan_interfaces.[].ip_address_virtual_secondaries.[]") | String | | | | IPv4_address/Mask. | | [    ip_verify_unicast_source_reachable_via](## "vlan_interfaces.[].ip_verify_unicast_source_reachable_via") | String | | | Valid Values:
- any
- rx | | | [    ip_igmp](## "vlan_interfaces.[].ip_igmp") | Boolean | | | | | | [    ip_igmp_version](## "vlan_interfaces.[].ip_igmp_version") | Integer | | | Min: 1
Max: 3 | | @@ -44,10 +44,11 @@ | [      access_lists](## "vlan_interfaces.[].ip_igmp_host_proxy.access_lists") | List, items: Dictionary | | | | Non-standard Access List name. | | [        - name](## "vlan_interfaces.[].ip_igmp_host_proxy.access_lists.[].name") | String | Required, Unique | | | | | [      version](## "vlan_interfaces.[].ip_igmp_host_proxy.version") | Integer | | | Min: 1
Max: 3 | IGMP version on IGMP host-proxy interface. | - | [    ip_helpers](## "vlan_interfaces.[].ip_helpers") | List, items: Dictionary | | | | List of DHCP servers | - | [      - ip_helper](## "vlan_interfaces.[].ip_helpers.[].ip_helper") | String | Required, Unique | | | IP address or hostname of DHCP server | - | [        source_interface](## "vlan_interfaces.[].ip_helpers.[].source_interface") | String | | | | Interface used as source for forwarded DHCP packets | - | [        vrf](## "vlan_interfaces.[].ip_helpers.[].vrf") | String | | | | VRF where DHCP server can be reached | + | [    ip_helpers](## "vlan_interfaces.[].ip_helpers") | List, items: Dictionary | | | | List of DHCP servers. | + | [      - ip_helper](## "vlan_interfaces.[].ip_helpers.[].ip_helper") | String | Required, Unique | | | IP address or hostname of DHCP server. | + | [        source_interface](## "vlan_interfaces.[].ip_helpers.[].source_interface") | String | | | | Interface used as source for forwarded DHCP packets. | + | [        vrf](## "vlan_interfaces.[].ip_helpers.[].vrf") | String | | | | VRF where DHCP server can be reached. | + | [    ip_dhcp_relay_all_subnets](## "vlan_interfaces.[].ip_dhcp_relay_all_subnets") | Boolean | | | | Allow forwarding requests with secondary IP addresses in the gateway address "giaddr" field. | | [    ip_nat](## "vlan_interfaces.[].ip_nat") | Dictionary | | | | | | [      destination](## "vlan_interfaces.[].ip_nat.destination") | Dictionary | | | | | | [        dynamic](## "vlan_interfaces.[].ip_nat.destination.dynamic") | List, items: Dictionary | | | | | @@ -56,72 +57,78 @@ | [            pool_name](## "vlan_interfaces.[].ip_nat.destination.dynamic.[].pool_name") | String | Required | | | | | [            priority](## "vlan_interfaces.[].ip_nat.destination.dynamic.[].priority") | Integer | | | Min: 0
Max: 4294967295 | | | [        static](## "vlan_interfaces.[].ip_nat.destination.static") | List, items: Dictionary | | | | | - | [          - access_list](## "vlan_interfaces.[].ip_nat.destination.static.[].access_list") | String | | | | 'access_list' and 'group' are mutual exclusive | + | [          - access_list](## "vlan_interfaces.[].ip_nat.destination.static.[].access_list") | String | | | | 'access_list' and 'group' are mutual exclusive. | | [            comment](## "vlan_interfaces.[].ip_nat.destination.static.[].comment") | String | | | | | | [            direction](## "vlan_interfaces.[].ip_nat.destination.static.[].direction") | String | | | Valid Values:
- egress
- ingress | Egress or ingress can be the default. This depends on source/destination, EOS version, and hardware platform.
EOS might remove this keyword in the configuration. So, check the configuration on targeted HW/SW.
| - | [            group](## "vlan_interfaces.[].ip_nat.destination.static.[].group") | Integer | | | Min: 1
Max: 65535 | 'access_list' and 'group' are mutual exclusive | - | [            original_ip](## "vlan_interfaces.[].ip_nat.destination.static.[].original_ip") | String | Required, Unique | | | IPv4 address | - | [            original_port](## "vlan_interfaces.[].ip_nat.destination.static.[].original_port") | Integer | | | Min: 1
Max: 65535 | | + | [            group](## "vlan_interfaces.[].ip_nat.destination.static.[].group") | Integer | | | Min: 1
Max: 65535 | 'access_list' and 'group' are mutual exclusive. | + | [            original_ip](## "vlan_interfaces.[].ip_nat.destination.static.[].original_ip") | String | | | | IPv4 address. The combination of `original_ip` and `original_port` must be unique. | + | [            original_port](## "vlan_interfaces.[].ip_nat.destination.static.[].original_port") | Integer | | | Min: 1
Max: 65535 | TCP/UDP port. The combination of `original_ip` and `original_port` must be unique. | | [            priority](## "vlan_interfaces.[].ip_nat.destination.static.[].priority") | Integer | | | Min: 0
Max: 4294967295 | | | [            protocol](## "vlan_interfaces.[].ip_nat.destination.static.[].protocol") | String | | | Valid Values:
- udp
- tcp | | - | [            translated_ip](## "vlan_interfaces.[].ip_nat.destination.static.[].translated_ip") | String | Required | | | IPv4 address | - | [            translated_port](## "vlan_interfaces.[].ip_nat.destination.static.[].translated_port") | Integer | | | Min: 1
Max: 65535 | requires 'original_port' | + | [            translated_ip](## "vlan_interfaces.[].ip_nat.destination.static.[].translated_ip") | String | Required | | | IPv4 address. | + | [            translated_port](## "vlan_interfaces.[].ip_nat.destination.static.[].translated_port") | Integer | | | Min: 1
Max: 65535 | requires 'original_port'. | | [      source](## "vlan_interfaces.[].ip_nat.source") | Dictionary | | | | | | [        dynamic](## "vlan_interfaces.[].ip_nat.source.dynamic") | List, items: Dictionary | | | | | | [          - access_list](## "vlan_interfaces.[].ip_nat.source.dynamic.[].access_list") | String | Required, Unique | | | | | [            comment](## "vlan_interfaces.[].ip_nat.source.dynamic.[].comment") | String | | | | | | [            nat_type](## "vlan_interfaces.[].ip_nat.source.dynamic.[].nat_type") | String | Required | | Valid Values:
- overload
- pool
- pool-address-only
- pool-full-cone | | - | [            pool_name](## "vlan_interfaces.[].ip_nat.source.dynamic.[].pool_name") | String | | | | required if 'nat_type' is pool, pool-address-only or pool-full-cone
ignored if 'nat_type' is overload
| + | [            pool_name](## "vlan_interfaces.[].ip_nat.source.dynamic.[].pool_name") | String | | | | required if 'nat_type' is pool, pool-address-only or pool-full-cone.
ignored if 'nat_type' is overload.
| | [            priority](## "vlan_interfaces.[].ip_nat.source.dynamic.[].priority") | Integer | | | Min: 0
Max: 4294967295 | | | [        static](## "vlan_interfaces.[].ip_nat.source.static") | List, items: Dictionary | | | | | - | [          - access_list](## "vlan_interfaces.[].ip_nat.source.static.[].access_list") | String | | | | 'access_list' and 'group' are mutual exclusive | + | [          - access_list](## "vlan_interfaces.[].ip_nat.source.static.[].access_list") | String | | | | 'access_list' and 'group' are mutual exclusive. | | [            comment](## "vlan_interfaces.[].ip_nat.source.static.[].comment") | String | | | | | | [            direction](## "vlan_interfaces.[].ip_nat.source.static.[].direction") | String | | | Valid Values:
- egress
- ingress | Egress or ingress can be the default. This depends on source/destination, EOS version, and hardware platform.
EOS might remove this keyword in the configuration. So, check the configuration on targeted HW/SW.
| - | [            group](## "vlan_interfaces.[].ip_nat.source.static.[].group") | Integer | | | Min: 1
Max: 65535 | 'access_list' and 'group' are mutual exclusive | - | [            original_ip](## "vlan_interfaces.[].ip_nat.source.static.[].original_ip") | String | Required, Unique | | | IPv4 address | - | [            original_port](## "vlan_interfaces.[].ip_nat.source.static.[].original_port") | Integer | | | Min: 1
Max: 65535 | | + | [            group](## "vlan_interfaces.[].ip_nat.source.static.[].group") | Integer | | | Min: 1
Max: 65535 | 'access_list' and 'group' are mutual exclusive. | + | [            original_ip](## "vlan_interfaces.[].ip_nat.source.static.[].original_ip") | String | | | | IPv4 address. The combination of `original_ip` and `original_port` must be unique. | + | [            original_port](## "vlan_interfaces.[].ip_nat.source.static.[].original_port") | Integer | | | Min: 1
Max: 65535 | TCP/UDP port. The combination of `original_ip` and `original_port` must be unique. | | [            priority](## "vlan_interfaces.[].ip_nat.source.static.[].priority") | Integer | | | Min: 0
Max: 4294967295 | | | [            protocol](## "vlan_interfaces.[].ip_nat.source.static.[].protocol") | String | | | Valid Values:
- udp
- tcp | | - | [            translated_ip](## "vlan_interfaces.[].ip_nat.source.static.[].translated_ip") | String | Required | | | IPv4 address | - | [            translated_port](## "vlan_interfaces.[].ip_nat.source.static.[].translated_port") | Integer | | | Min: 1
Max: 65535 | requires 'original_port' | + | [            translated_ip](## "vlan_interfaces.[].ip_nat.source.static.[].translated_ip") | String | Required | | | IPv4 address. | + | [            translated_port](## "vlan_interfaces.[].ip_nat.source.static.[].translated_port") | Integer | | | Min: 1
Max: 65535 | requires 'original_port'. | | [    ipv6_enable](## "vlan_interfaces.[].ipv6_enable") | Boolean | | | | | - | [    ipv6_address](## "vlan_interfaces.[].ipv6_address") | String | | | | IPv6_address/Mask | - | [    ipv6_address_virtual](## "vlan_interfaces.[].ipv6_address_virtual") deprecated | String | | | | IPv6_address/Mask
If both "ipv6_address_virtual" and "ipv6_address_virtuals" are set, all addresses will be configured
This key is deprecated. Support will be removed in AVD version 5.0.0. Use ipv6_address_virtuals instead. | + | [    ipv6_address](## "vlan_interfaces.[].ipv6_address") | String | | | | IPv6_address/Mask. | + | [    ipv6_address_virtual](## "vlan_interfaces.[].ipv6_address_virtual") deprecated | String | | | | IPv6_address/Mask.
If both "ipv6_address_virtual" and "ipv6_address_virtuals" are set, all addresses will be configured.
This key is deprecated. Support will be removed in AVD version 5.0.0. Use ipv6_address_virtuals instead. | | [    ipv6_address_virtuals](## "vlan_interfaces.[].ipv6_address_virtuals") | List, items: String | | | | The new "ipv6_address_virtuals" key support multiple virtual ipv6 addresses. | - | [      - <str>](## "vlan_interfaces.[].ipv6_address_virtuals.[]") | String | | | | IPv6_address/Mask | - | [    ipv6_address_link_local](## "vlan_interfaces.[].ipv6_address_link_local") | String | | | | IPv6_address/Mask | + | [      - <str>](## "vlan_interfaces.[].ipv6_address_virtuals.[]") | String | | | | IPv6_address/Mask. | + | [    ipv6_address_link_local](## "vlan_interfaces.[].ipv6_address_link_local") | String | | | | IPv6_address/Mask. | | [    ipv6_virtual_router_address](## "vlan_interfaces.[].ipv6_virtual_router_address") deprecated | String | | | | "ipv6_virtual_router_address" should not be mixed with
the new "ipv6_virtual_router_addresses" key below to avoid conflicts.
This key is deprecated. Support will be removed in AVD version 5.0.0. Use ipv6_virtual_router_addresses instead. | | [    ipv6_virtual_router_addresses](## "vlan_interfaces.[].ipv6_virtual_router_addresses") | List, items: String | | | | Improved "VARPv6" data model to support multiple VARPv6 addresses. | - | [      - <str>](## "vlan_interfaces.[].ipv6_virtual_router_addresses.[]") | String | | | | IPv6 address or IPv6_address/Mask | + | [      - <str>](## "vlan_interfaces.[].ipv6_virtual_router_addresses.[]") | String | | | | IPv6 address or IPv6_address/Mask. | | [    ipv6_nd_ra_disabled](## "vlan_interfaces.[].ipv6_nd_ra_disabled") | Boolean | | | | | | [    ipv6_nd_managed_config_flag](## "vlan_interfaces.[].ipv6_nd_managed_config_flag") | Boolean | | | | | + | [    ipv6_nd_other_config_flag](## "vlan_interfaces.[].ipv6_nd_other_config_flag") | Boolean | | | | Set the "other stateful configuration" flag in IPv6 router advertisements. | + | [    ipv6_nd_cache](## "vlan_interfaces.[].ipv6_nd_cache") | Dictionary | | | | IPv6 neighbor cache options. | + | [      dynamic_capacity](## "vlan_interfaces.[].ipv6_nd_cache.dynamic_capacity") | Integer | | | Min: 0
Max: 4294967295 | Capacity of dynamic cache entries. | + | [      expire](## "vlan_interfaces.[].ipv6_nd_cache.expire") | Integer | | | Min: 1
Max: 65535 | Cache entries expirery in seconds. | + | [      refresh_always](## "vlan_interfaces.[].ipv6_nd_cache.refresh_always") | Boolean | | | | Force refresh on cache expiry. | | [    ipv6_nd_prefixes](## "vlan_interfaces.[].ipv6_nd_prefixes") | List, items: Dictionary | | | | | - | [      - ipv6_prefix](## "vlan_interfaces.[].ipv6_nd_prefixes.[].ipv6_prefix") | String | Required, Unique | | | IPv6_address/Mask | - | [        valid_lifetime](## "vlan_interfaces.[].ipv6_nd_prefixes.[].valid_lifetime") | String | | | | In seconds <0-4294967295> or infinite | - | [        preferred_lifetime](## "vlan_interfaces.[].ipv6_nd_prefixes.[].preferred_lifetime") | String | | | | In seconds <0-4294967295> or infinite | + | [      - ipv6_prefix](## "vlan_interfaces.[].ipv6_nd_prefixes.[].ipv6_prefix") | String | Required, Unique | | | IPv6_address/Mask. | + | [        valid_lifetime](## "vlan_interfaces.[].ipv6_nd_prefixes.[].valid_lifetime") | String | | | | In seconds <0-4294967295> or infinite. | + | [        preferred_lifetime](## "vlan_interfaces.[].ipv6_nd_prefixes.[].preferred_lifetime") | String | | | | In seconds <0-4294967295> or infinite. | | [        no_autoconfig_flag](## "vlan_interfaces.[].ipv6_nd_prefixes.[].no_autoconfig_flag") | Boolean | | | | | | [    ipv6_dhcp_relay_destinations](## "vlan_interfaces.[].ipv6_dhcp_relay_destinations") | List, items: Dictionary | | | | | - | [      - address](## "vlan_interfaces.[].ipv6_dhcp_relay_destinations.[].address") | String | Required, Unique | | | DHCP server's IPv6 address | + | [      - address](## "vlan_interfaces.[].ipv6_dhcp_relay_destinations.[].address") | String | Required, Unique | | | DHCP server's IPv6 address. | | [        vrf](## "vlan_interfaces.[].ipv6_dhcp_relay_destinations.[].vrf") | String | | | | | - | [        local_interface](## "vlan_interfaces.[].ipv6_dhcp_relay_destinations.[].local_interface") | String | | | | Local interface to communicate with DHCP server - mutually exclusive to source_address | - | [        source_address](## "vlan_interfaces.[].ipv6_dhcp_relay_destinations.[].source_address") | String | | | | Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface | - | [        link_address](## "vlan_interfaces.[].ipv6_dhcp_relay_destinations.[].link_address") | String | | | | Override the default link address specified in the relayed DHCP packet | - | [    access_group_in](## "vlan_interfaces.[].access_group_in") | String | | | | IPv4 access-list name | - | [    access_group_out](## "vlan_interfaces.[].access_group_out") | String | | | | IPv4 access-list name | - | [    ipv6_access_group_in](## "vlan_interfaces.[].ipv6_access_group_in") | String | | | | IPv6 access-list name | - | [    ipv6_access_group_out](## "vlan_interfaces.[].ipv6_access_group_out") | String | | | | IPv6 access-list name | + | [        local_interface](## "vlan_interfaces.[].ipv6_dhcp_relay_destinations.[].local_interface") | String | | | | Local interface to communicate with DHCP server - mutually exclusive to source_address. | + | [        source_address](## "vlan_interfaces.[].ipv6_dhcp_relay_destinations.[].source_address") | String | | | | Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface. | + | [        link_address](## "vlan_interfaces.[].ipv6_dhcp_relay_destinations.[].link_address") | String | | | | Override the default link address specified in the relayed DHCP packet. | + | [    ipv6_dhcp_relay_all_subnets](## "vlan_interfaces.[].ipv6_dhcp_relay_all_subnets") | Boolean | | | | Allow forwarding requests with additional IPv6 addresses in the gateway address "giaddr" field. | + | [    access_group_in](## "vlan_interfaces.[].access_group_in") | String | | | | IPv4 access-list name. | + | [    access_group_out](## "vlan_interfaces.[].access_group_out") | String | | | | IPv4 access-list name. | + | [    ipv6_access_group_in](## "vlan_interfaces.[].ipv6_access_group_in") | String | | | | IPv6 access-list name. | + | [    ipv6_access_group_out](## "vlan_interfaces.[].ipv6_access_group_out") | String | | | | IPv6 access-list name. | | [    multicast](## "vlan_interfaces.[].multicast") | Dictionary | | | | | | [      ipv4](## "vlan_interfaces.[].multicast.ipv4") | Dictionary | | | | | - | [        boundaries](## "vlan_interfaces.[].multicast.ipv4.boundaries") | List, items: Dictionary | | | | Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both | - | [          - boundary](## "vlan_interfaces.[].multicast.ipv4.boundaries.[].boundary") | String | Required, Unique | | | IPv4 access-list name or IPv4 multicast group prefix with mask | + | [        boundaries](## "vlan_interfaces.[].multicast.ipv4.boundaries") | List, items: Dictionary | | | | Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both. | + | [          - boundary](## "vlan_interfaces.[].multicast.ipv4.boundaries.[].boundary") | String | Required, Unique | | | IPv4 access-list name or IPv4 multicast group prefix with mask. | | [            out](## "vlan_interfaces.[].multicast.ipv4.boundaries.[].out") | Boolean | | | | | | [        source_route_export](## "vlan_interfaces.[].multicast.ipv4.source_route_export") | Dictionary | | | | | | [          enabled](## "vlan_interfaces.[].multicast.ipv4.source_route_export.enabled") | Boolean | Required | | | | | [          administrative_distance](## "vlan_interfaces.[].multicast.ipv4.source_route_export.administrative_distance") | Integer | | | Min: 1
Max: 255 | | | [        static](## "vlan_interfaces.[].multicast.ipv4.static") | Boolean | | | | | | [      ipv6](## "vlan_interfaces.[].multicast.ipv6") | Dictionary | | | | | - | [        boundaries](## "vlan_interfaces.[].multicast.ipv6.boundaries") | List, items: Dictionary | | | | Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both | - | [          - boundary](## "vlan_interfaces.[].multicast.ipv6.boundaries.[].boundary") | String | Required, Unique | | | IPv6 access-list name or IPv6 multicast group prefix with mask | + | [        boundaries](## "vlan_interfaces.[].multicast.ipv6.boundaries") | List, items: Dictionary | | | | Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both. | + | [          - boundary](## "vlan_interfaces.[].multicast.ipv6.boundaries.[].boundary") | String | Required, Unique | | | IPv6 access-list name or IPv6 multicast group prefix with mask. | | [        source_route_export](## "vlan_interfaces.[].multicast.ipv6.source_route_export") | Dictionary | | | | | | [          enabled](## "vlan_interfaces.[].multicast.ipv6.source_route_export.enabled") | Boolean | Required | | | | | [          administrative_distance](## "vlan_interfaces.[].multicast.ipv6.source_route_export.administrative_distance") | Integer | | | Min: 1
Max: 255 | | @@ -130,11 +137,11 @@ | [    ospf_area](## "vlan_interfaces.[].ospf_area") | String | | | | | | [    ospf_cost](## "vlan_interfaces.[].ospf_cost") | Integer | | | | | | [    ospf_authentication](## "vlan_interfaces.[].ospf_authentication") | String | | | Valid Values:
- none
- simple
- message-digest | | - | [    ospf_authentication_key](## "vlan_interfaces.[].ospf_authentication_key") | String | | | | Encrypted password used for simple authentication | - | [    ospf_message_digest_keys](## "vlan_interfaces.[].ospf_message_digest_keys") | List, items: Dictionary | | | | Keys used for message-digest authentication | + | [    ospf_authentication_key](## "vlan_interfaces.[].ospf_authentication_key") | String | | | | Encrypted password used for simple authentication. | + | [    ospf_message_digest_keys](## "vlan_interfaces.[].ospf_message_digest_keys") | List, items: Dictionary | | | | Keys used for message-digest authentication. | | [      - id](## "vlan_interfaces.[].ospf_message_digest_keys.[].id") | Integer | Required, Unique | | | | | [        hash_algorithm](## "vlan_interfaces.[].ospf_message_digest_keys.[].hash_algorithm") | String | | | Valid Values:
- md5
- sha1
- sha256
- sha384
- sha512 | | - | [        key](## "vlan_interfaces.[].ospf_message_digest_keys.[].key") | String | | | | Encrypted password | + | [        key](## "vlan_interfaces.[].ospf_message_digest_keys.[].key") | String | | | | Encrypted password. | | [    pim](## "vlan_interfaces.[].pim") | Dictionary | | | | | | [      ipv4](## "vlan_interfaces.[].pim.ipv4") | Dictionary | | | | | | [        border_router](## "vlan_interfaces.[].pim.ipv4.border_router") | Boolean | | | | Configure PIM border router. EOS default is false. | @@ -146,41 +153,42 @@ | [        hello](## "vlan_interfaces.[].pim.ipv4.hello") | Dictionary | | | | | | [          count](## "vlan_interfaces.[].pim.ipv4.hello.count") | String | | | | Number of missed hellos after which the neighbor expires. Range <1.5-65535>. | | [          interval](## "vlan_interfaces.[].pim.ipv4.hello.interval") | Integer | | | Min: 1
Max: 65535 | PIM hello interval in seconds. | - | [    isis_enable](## "vlan_interfaces.[].isis_enable") | String | | | | ISIS instance name | + | [    isis_enable](## "vlan_interfaces.[].isis_enable") | String | | | | ISIS instance name. | + | [    isis_bfd](## "vlan_interfaces.[].isis_bfd") | Boolean | | | | Enable BFD for ISIS. | | [    isis_passive](## "vlan_interfaces.[].isis_passive") | Boolean | | | | | | [    isis_metric](## "vlan_interfaces.[].isis_metric") | Integer | | | | | | [    isis_network_point_to_point](## "vlan_interfaces.[].isis_network_point_to_point") | Boolean | | | | | | [    mtu](## "vlan_interfaces.[].mtu") | Integer | | | | | | [    no_autostate](## "vlan_interfaces.[].no_autostate") | Boolean | | | | | - | [    vrrp_ids](## "vlan_interfaces.[].vrrp_ids") | List, items: Dictionary | | | | Improved "vrrp" data model to support multiple VRRP IDs | - | [      - id](## "vlan_interfaces.[].vrrp_ids.[].id") | Integer | Required, Unique | | | VRID | - | [        priority_level](## "vlan_interfaces.[].vrrp_ids.[].priority_level") | Integer | | | Min: 1
Max: 254 | Instance priority | + | [    vrrp_ids](## "vlan_interfaces.[].vrrp_ids") | List, items: Dictionary | | | | Improved "vrrp" data model to support multiple VRRP IDs. | + | [      - id](## "vlan_interfaces.[].vrrp_ids.[].id") | Integer | Required, Unique | | | VRID. | + | [        priority_level](## "vlan_interfaces.[].vrrp_ids.[].priority_level") | Integer | | | Min: 1
Max: 254 | Instance priority. | | [        advertisement](## "vlan_interfaces.[].vrrp_ids.[].advertisement") | Dictionary | | | | | - | [          interval](## "vlan_interfaces.[].vrrp_ids.[].advertisement.interval") | Integer | | | Min: 1
Max: 255 | Interval in seconds | + | [          interval](## "vlan_interfaces.[].vrrp_ids.[].advertisement.interval") | Integer | | | Min: 1
Max: 255 | Interval in seconds. | | [        preempt](## "vlan_interfaces.[].vrrp_ids.[].preempt") | Dictionary | | | | | | [          enabled](## "vlan_interfaces.[].vrrp_ids.[].preempt.enabled") | Boolean | Required | | | | | [          delay](## "vlan_interfaces.[].vrrp_ids.[].preempt.delay") | Dictionary | | | | | - | [            minimum](## "vlan_interfaces.[].vrrp_ids.[].preempt.delay.minimum") | Integer | | | Min: 0
Max: 3600 | Minimum preempt delay in seconds | - | [            reload](## "vlan_interfaces.[].vrrp_ids.[].preempt.delay.reload") | Integer | | | Min: 0
Max: 3600 | Reload preempt delay in seconds | + | [            minimum](## "vlan_interfaces.[].vrrp_ids.[].preempt.delay.minimum") | Integer | | | Min: 0
Max: 3600 | Minimum preempt delay in seconds. | + | [            reload](## "vlan_interfaces.[].vrrp_ids.[].preempt.delay.reload") | Integer | | | Min: 0
Max: 3600 | Reload preempt delay in seconds. | | [        timers](## "vlan_interfaces.[].vrrp_ids.[].timers") | Dictionary | | | | | | [          delay](## "vlan_interfaces.[].vrrp_ids.[].timers.delay") | Dictionary | | | | | | [            reload](## "vlan_interfaces.[].vrrp_ids.[].timers.delay.reload") | Integer | | | Min: 0
Max: 3600 | Delay after reload in seconds. | | [        tracked_object](## "vlan_interfaces.[].vrrp_ids.[].tracked_object") | List, items: Dictionary | | | | | - | [          - name](## "vlan_interfaces.[].vrrp_ids.[].tracked_object.[].name") | String | Required, Unique | | | Tracked object name | - | [            decrement](## "vlan_interfaces.[].vrrp_ids.[].tracked_object.[].decrement") | Integer | | | Min: 1
Max: 254 | Decrement VRRP priority by 1-254 | + | [          - name](## "vlan_interfaces.[].vrrp_ids.[].tracked_object.[].name") | String | Required, Unique | | | Tracked object name. | + | [            decrement](## "vlan_interfaces.[].vrrp_ids.[].tracked_object.[].decrement") | Integer | | | Min: 1
Max: 254 | Decrement VRRP priority by 1-254. | | [            shutdown](## "vlan_interfaces.[].vrrp_ids.[].tracked_object.[].shutdown") | Boolean | | | | | | [        ipv4](## "vlan_interfaces.[].vrrp_ids.[].ipv4") | Dictionary | | | | | - | [          address](## "vlan_interfaces.[].vrrp_ids.[].ipv4.address") | String | Required | | | Virtual IPv4 address | + | [          address](## "vlan_interfaces.[].vrrp_ids.[].ipv4.address") | String | Required | | | Virtual IPv4 address. | | [          version](## "vlan_interfaces.[].vrrp_ids.[].ipv4.version") | Integer | | | Valid Values:
- 2
- 3 | | | [        ipv6](## "vlan_interfaces.[].vrrp_ids.[].ipv6") | Dictionary | | | | | - | [          address](## "vlan_interfaces.[].vrrp_ids.[].ipv6.address") | String | Required | | | Virtual IPv6 address | + | [          address](## "vlan_interfaces.[].vrrp_ids.[].ipv6.address") | String | Required | | | Virtual IPv6 address. | | [    vrrp](## "vlan_interfaces.[].vrrp") deprecated | Dictionary | | | | "vrrp" should not be mixed with the new "vrrp_ids" key above to avoid conflicts.
This key is deprecated. Support will be removed in AVD version 5.0.0. Use vrrp_ids instead. | - | [      virtual_router](## "vlan_interfaces.[].vrrp.virtual_router") | String | | | | Virtual Router ID | - | [      priority](## "vlan_interfaces.[].vrrp.priority") | Integer | | | | Instance priority | + | [      virtual_router](## "vlan_interfaces.[].vrrp.virtual_router") | String | | | | Virtual Router ID. | + | [      priority](## "vlan_interfaces.[].vrrp.priority") | Integer | | | | Instance priority. | | [      advertisement_interval](## "vlan_interfaces.[].vrrp.advertisement_interval") | Integer | | | | | | [      preempt_delay_minimum](## "vlan_interfaces.[].vrrp.preempt_delay_minimum") | Integer | | | | | - | [      ipv4](## "vlan_interfaces.[].vrrp.ipv4") | String | | | | Virtual IPv4 address | - | [      ipv6](## "vlan_interfaces.[].vrrp.ipv6") | String | | | | Virtual IPv6 address | + | [      ipv4](## "vlan_interfaces.[].vrrp.ipv4") | String | | | | Virtual IPv4 address. | + | [      ipv6](## "vlan_interfaces.[].vrrp.ipv6") | String | | | | Virtual IPv6 address. | | [    ip_attached_host_route_export](## "vlan_interfaces.[].ip_attached_host_route_export") | Dictionary | | | | | | [      enabled](## "vlan_interfaces.[].ip_attached_host_route_export.enabled") | Boolean | Required | | | | | [      distance](## "vlan_interfaces.[].ip_attached_host_route_export.distance") | Integer | | | Min: 1
Max: 255 | | @@ -190,25 +198,25 @@ | [      prefix_length](## "vlan_interfaces.[].ipv6_attached_host_route_export.prefix_length") | Integer | | | Min: 0
Max: 128 | Prefix length for generated routes. | | [    bfd](## "vlan_interfaces.[].bfd") | Dictionary | | | | | | [      echo](## "vlan_interfaces.[].bfd.echo") | Boolean | | | | | - | [      interval](## "vlan_interfaces.[].bfd.interval") | Integer | | | | Rate in milliseconds | - | [      min_rx](## "vlan_interfaces.[].bfd.min_rx") | Integer | | | | Minimum RX hold time in milliseconds | + | [      interval](## "vlan_interfaces.[].bfd.interval") | Integer | | | | Rate in milliseconds. | + | [      min_rx](## "vlan_interfaces.[].bfd.min_rx") | Integer | | | | Minimum RX hold time in milliseconds. | | [      multiplier](## "vlan_interfaces.[].bfd.multiplier") | Integer | | | Min: 3
Max: 50 | | | [    service_policy](## "vlan_interfaces.[].service_policy") | Dictionary | | | | | | [      pbr](## "vlan_interfaces.[].service_policy.pbr") | Dictionary | | | | | - | [        input](## "vlan_interfaces.[].service_policy.pbr.input") | String | | | | Name of policy-map used for policy based routing | - | [    pvlan_mapping](## "vlan_interfaces.[].pvlan_mapping") | String | | | | List of VLANs as string | - | [    tenant](## "vlan_interfaces.[].tenant") | String | | | | Key only used for documentation or validation purposes | - | [    tags](## "vlan_interfaces.[].tags") | List, items: String | | | | Key only used for documentation or validation purposes | + | [        input](## "vlan_interfaces.[].service_policy.pbr.input") | String | | | | Name of policy-map used for policy based routing. | + | [    pvlan_mapping](## "vlan_interfaces.[].pvlan_mapping") | String | | | | List of VLANs as string. | + | [    tenant](## "vlan_interfaces.[].tenant") | String | | | | Key only used for documentation or validation purposes. | + | [    tags](## "vlan_interfaces.[].tags") | List, items: String | | | | Key only used for documentation or validation purposes. | | [      - <str>](## "vlan_interfaces.[].tags.[]") | String | | | | | - | [    type](## "vlan_interfaces.[].type") | String | | | | Key only used for documentation or validation purposes | - | [    eos_cli](## "vlan_interfaces.[].eos_cli") | String | | | | Multiline EOS CLI rendered directly on the VLAN interface in the final EOS configuration | + | [    type](## "vlan_interfaces.[].type") | String | | | | Key only used for documentation or validation purposes. | + | [    eos_cli](## "vlan_interfaces.[].eos_cli") | String | | | | Multiline EOS CLI rendered directly on the VLAN interface in the final EOS configuration. | === "YAML" ```yaml vlan_interfaces: - # VLAN interface name like "Vlan123" + # VLAN interface name like "Vlan123". - name: description: logging: @@ -216,10 +224,10 @@ link_status: shutdown: - # VRF name + # VRF name. vrf: - # In seconds + # In seconds. arp_aging_timeout: arp_cache_dynamic_capacity: arp_gratuitous_accept: @@ -227,22 +235,22 @@ ip_proxy_arp: ip_directed_broadcast: - # IPv4_address/Mask + # IPv4_address/Mask. ip_address: ip_address_secondaries: - # IPv4_address/Mask + # IPv4_address/Mask. - ip_virtual_router_addresses: - # IPv4 address or IPv4_address/Mask + # IPv4 address or IPv4_address/Mask. - - # IPv4_address/Mask + # IPv4_address/Mask. ip_address_virtual: ip_address_virtual_secondaries: - # IPv4_address/Mask + # IPv4_address/Mask. - ip_verify_unicast_source_reachable_via: ip_igmp: @@ -272,17 +280,20 @@ # IGMP version on IGMP host-proxy interface. version: - # List of DHCP servers + # List of DHCP servers. ip_helpers: - # IP address or hostname of DHCP server + # IP address or hostname of DHCP server. - ip_helper: - # Interface used as source for forwarded DHCP packets + # Interface used as source for forwarded DHCP packets. source_interface: - # VRF where DHCP server can be reached + # VRF where DHCP server can be reached. vrf: + + # Allow forwarding requests with secondary IP addresses in the gateway address "giaddr" field. + ip_dhcp_relay_all_subnets: ip_nat: destination: dynamic: @@ -292,7 +303,7 @@ priority: static: - # 'access_list' and 'group' are mutual exclusive + # 'access_list' and 'group' are mutual exclusive. - access_list: comment: @@ -300,19 +311,21 @@ # EOS might remove this keyword in the configuration. So, check the configuration on targeted HW/SW. direction: - # 'access_list' and 'group' are mutual exclusive + # 'access_list' and 'group' are mutual exclusive. group: - # IPv4 address - original_ip: + # IPv4 address. The combination of `original_ip` and `original_port` must be unique. + original_ip: + + # TCP/UDP port. The combination of `original_ip` and `original_port` must be unique. original_port: priority: protocol: - # IPv4 address + # IPv4 address. translated_ip: - # requires 'original_port' + # requires 'original_port'. translated_port: source: dynamic: @@ -320,13 +333,13 @@ comment: nat_type: - # required if 'nat_type' is pool, pool-address-only or pool-full-cone - # ignored if 'nat_type' is overload + # required if 'nat_type' is pool, pool-address-only or pool-full-cone. + # ignored if 'nat_type' is overload. pool_name: priority: static: - # 'access_list' and 'group' are mutual exclusive + # 'access_list' and 'group' are mutual exclusive. - access_list: comment: @@ -334,27 +347,29 @@ # EOS might remove this keyword in the configuration. So, check the configuration on targeted HW/SW. direction: - # 'access_list' and 'group' are mutual exclusive + # 'access_list' and 'group' are mutual exclusive. group: - # IPv4 address - original_ip: + # IPv4 address. The combination of `original_ip` and `original_port` must be unique. + original_ip: + + # TCP/UDP port. The combination of `original_ip` and `original_port` must be unique. original_port: priority: protocol: - # IPv4 address + # IPv4 address. translated_ip: - # requires 'original_port' + # requires 'original_port'. translated_port: ipv6_enable: - # IPv6_address/Mask + # IPv6_address/Mask. ipv6_address: - # IPv6_address/Mask - # If both "ipv6_address_virtual" and "ipv6_address_virtuals" are set, all addresses will be configured + # IPv6_address/Mask. + # If both "ipv6_address_virtual" and "ipv6_address_virtuals" are set, all addresses will be configured. # This key is deprecated. # Support will be removed in AVD version 5.0.0. # Use ipv6_address_virtuals instead. @@ -363,10 +378,10 @@ # The new "ipv6_address_virtuals" key support multiple virtual ipv6 addresses. ipv6_address_virtuals: - # IPv6_address/Mask + # IPv6_address/Mask. - - # IPv6_address/Mask + # IPv6_address/Mask. ipv6_address_link_local: # "ipv6_virtual_router_address" should not be mixed with @@ -379,54 +394,72 @@ # Improved "VARPv6" data model to support multiple VARPv6 addresses. ipv6_virtual_router_addresses: - # IPv6 address or IPv6_address/Mask + # IPv6 address or IPv6_address/Mask. - ipv6_nd_ra_disabled: ipv6_nd_managed_config_flag: + + # Set the "other stateful configuration" flag in IPv6 router advertisements. + ipv6_nd_other_config_flag: + + # IPv6 neighbor cache options. + ipv6_nd_cache: + + # Capacity of dynamic cache entries. + dynamic_capacity: + + # Cache entries expirery in seconds. + expire: + + # Force refresh on cache expiry. + refresh_always: ipv6_nd_prefixes: - # IPv6_address/Mask + # IPv6_address/Mask. - ipv6_prefix: - # In seconds <0-4294967295> or infinite + # In seconds <0-4294967295> or infinite. valid_lifetime: - # In seconds <0-4294967295> or infinite + # In seconds <0-4294967295> or infinite. preferred_lifetime: no_autoconfig_flag: ipv6_dhcp_relay_destinations: - # DHCP server's IPv6 address + # DHCP server's IPv6 address. - address: vrf: - # Local interface to communicate with DHCP server - mutually exclusive to source_address + # Local interface to communicate with DHCP server - mutually exclusive to source_address. local_interface: - # Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface + # Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface. source_address: - # Override the default link address specified in the relayed DHCP packet + # Override the default link address specified in the relayed DHCP packet. link_address: - # IPv4 access-list name + # Allow forwarding requests with additional IPv6 addresses in the gateway address "giaddr" field. + ipv6_dhcp_relay_all_subnets: + + # IPv4 access-list name. access_group_in: - # IPv4 access-list name + # IPv4 access-list name. access_group_out: - # IPv6 access-list name + # IPv6 access-list name. ipv6_access_group_in: - # IPv6 access-list name + # IPv6 access-list name. ipv6_access_group_out: multicast: ipv4: - # Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both + # Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both. boundaries: - # IPv4 access-list name or IPv4 multicast group prefix with mask + # IPv4 access-list name or IPv4 multicast group prefix with mask. - boundary: out: source_route_export: @@ -435,10 +468,10 @@ static: ipv6: - # Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both + # Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both. boundaries: - # IPv6 access-list name or IPv6 multicast group prefix with mask + # IPv6 access-list name or IPv6 multicast group prefix with mask. - boundary: source_route_export: enabled: @@ -449,15 +482,15 @@ ospf_cost: ospf_authentication: - # Encrypted password used for simple authentication + # Encrypted password used for simple authentication. ospf_authentication_key: - # Keys used for message-digest authentication + # Keys used for message-digest authentication. ospf_message_digest_keys: - id: hash_algorithm: - # Encrypted password + # Encrypted password. key: pim: ipv4: @@ -479,34 +512,37 @@ # PIM hello interval in seconds. interval: - # ISIS instance name + # ISIS instance name. isis_enable: + + # Enable BFD for ISIS. + isis_bfd: isis_passive: isis_metric: isis_network_point_to_point: mtu: no_autostate: - # Improved "vrrp" data model to support multiple VRRP IDs + # Improved "vrrp" data model to support multiple VRRP IDs. vrrp_ids: - # VRID + # VRID. - id: - # Instance priority + # Instance priority. priority_level: advertisement: - # Interval in seconds + # Interval in seconds. interval: preempt: enabled: delay: - # Minimum preempt delay in seconds + # Minimum preempt delay in seconds. minimum: - # Reload preempt delay in seconds + # Reload preempt delay in seconds. reload: timers: delay: @@ -515,20 +551,20 @@ reload: tracked_object: - # Tracked object name + # Tracked object name. - name: - # Decrement VRRP priority by 1-254 + # Decrement VRRP priority by 1-254. decrement: shutdown: ipv4: - # Virtual IPv4 address + # Virtual IPv4 address. address: version: ipv6: - # Virtual IPv6 address + # Virtual IPv6 address. address: # "vrrp" should not be mixed with the new "vrrp_ids" key above to avoid conflicts. @@ -537,18 +573,18 @@ # Use vrrp_ids instead. vrrp: - # Virtual Router ID + # Virtual Router ID. virtual_router: - # Instance priority + # Instance priority. priority: advertisement_interval: preempt_delay_minimum: - # Virtual IPv4 address + # Virtual IPv4 address. ipv4: - # Virtual IPv6 address + # Virtual IPv6 address. ipv6: ip_attached_host_route_export: enabled: @@ -564,31 +600,31 @@ bfd: echo: - # Rate in milliseconds + # Rate in milliseconds. interval: - # Minimum RX hold time in milliseconds + # Minimum RX hold time in milliseconds. min_rx: multiplier: service_policy: pbr: - # Name of policy-map used for policy based routing + # Name of policy-map used for policy based routing. input: - # List of VLANs as string + # List of VLANs as string. pvlan_mapping: - # Key only used for documentation or validation purposes + # Key only used for documentation or validation purposes. tenant: - # Key only used for documentation or validation purposes + # Key only used for documentation or validation purposes. tags: - - # Key only used for documentation or validation purposes + # Key only used for documentation or validation purposes. type: - # Multiline EOS CLI rendered directly on the VLAN interface in the final EOS configuration + # Multiline EOS CLI rendered directly on the VLAN interface in the final EOS configuration. eos_cli: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/vlans.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/vlans.md index b92dfb870d3..75eecd73513 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/vlans.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/vlans.md @@ -8,37 +8,37 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [vlans](## "vlans") | List, items: Dictionary | | | | | - | [  - id](## "vlans.[].id") | Integer | Required, Unique | | | VLAN ID | - | [    name](## "vlans.[].name") | String | | | | VLAN Name | + | [  - id](## "vlans.[].id") | Integer | Required, Unique | | | VLAN ID. | + | [    name](## "vlans.[].name") | String | | | | VLAN Name. | | [    state](## "vlans.[].state") | String | | | Valid Values:
- active
- suspend | | | [    trunk_groups](## "vlans.[].trunk_groups") | List, items: String | | | | | - | [      - <str>](## "vlans.[].trunk_groups.[]") | String | | | | Trunk Group Name | + | [      - <str>](## "vlans.[].trunk_groups.[]") | String | | | | Trunk Group Name. | | [    private_vlan](## "vlans.[].private_vlan") | Dictionary | | | | | | [      type](## "vlans.[].private_vlan.type") | String | | | Valid Values:
- community
- isolated | | - | [      primary_vlan](## "vlans.[].private_vlan.primary_vlan") | Integer | | | | Primary VLAN ID | - | [    tenant](## "vlans.[].tenant") | String | | | | Key only used for documentation or validation purposes | + | [      primary_vlan](## "vlans.[].private_vlan.primary_vlan") | Integer | | | | Primary VLAN ID. | + | [    tenant](## "vlans.[].tenant") | String | | | | Key only used for documentation or validation purposes. | === "YAML" ```yaml vlans: - # VLAN ID + # VLAN ID. - id: - # VLAN Name + # VLAN Name. name: state: trunk_groups: - # Trunk Group Name + # Trunk Group Name. - private_vlan: type: - # Primary VLAN ID + # Primary VLAN ID. primary_vlan: - # Key only used for documentation or validation purposes + # Key only used for documentation or validation purposes. tenant: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/vmtracer-sessions.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/vmtracer-sessions.md index a45fa693dcb..79104a953c8 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/vmtracer-sessions.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/vmtracer-sessions.md @@ -8,10 +8,10 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [vmtracer_sessions](## "vmtracer_sessions") | List, items: Dictionary | | | | | - | [  - name](## "vmtracer_sessions.[].name") | String | Required, Unique | | | Vmtracer Session Name | + | [  - name](## "vmtracer_sessions.[].name") | String | Required, Unique | | | Vmtracer Session Name. | | [    url](## "vmtracer_sessions.[].url") | String | | | | | | [    username](## "vmtracer_sessions.[].username") | String | | | | | - | [    password](## "vmtracer_sessions.[].password") | String | | | | Type 7 Password Hash | + | [    password](## "vmtracer_sessions.[].password") | String | | | | Type 7 Password Hash. | | [    autovlan_disable](## "vmtracer_sessions.[].autovlan_disable") | Boolean | | | | | | [    source_interface](## "vmtracer_sessions.[].source_interface") | String | | | | | @@ -20,12 +20,12 @@ ```yaml vmtracer_sessions: - # Vmtracer Session Name + # Vmtracer Session Name. - name: url: username: - # Type 7 Password Hash + # Type 7 Password Hash. password: autovlan_disable: source_interface: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/vrfs.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/vrfs.md index 5359c8bb114..ce63acda061 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/vrfs.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/vrfs.md @@ -7,27 +7,27 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | - | [vrfs](## "vrfs") | List, items: Dictionary | | | | These keys are ignored if the name of the vrf is 'default'
| - | [  - name](## "vrfs.[].name") | String | Required, Unique | | | VRF Name | + | [vrfs](## "vrfs") | List, items: Dictionary | | | | These keys are ignored if the name of the vrf is 'default'.
| + | [  - name](## "vrfs.[].name") | String | Required, Unique | | | VRF Name. | | [    description](## "vrfs.[].description") | String | | | | | | [    ip_routing](## "vrfs.[].ip_routing") | Boolean | | | | | | [    ipv6_routing](## "vrfs.[].ipv6_routing") | Boolean | | | | | | [    ip_routing_ipv6_interfaces](## "vrfs.[].ip_routing_ipv6_interfaces") | Boolean | | | | | - | [    tenant](## "vrfs.[].tenant") | String | | | | Key only used for documentation or validation purposes | + | [    tenant](## "vrfs.[].tenant") | String | | | | Key only used for documentation or validation purposes. | === "YAML" ```yaml - # These keys are ignored if the name of the vrf is 'default' + # These keys are ignored if the name of the vrf is 'default'. vrfs: - # VRF Name + # VRF Name. - name: description: ip_routing: ipv6_routing: ip_routing_ipv6_interfaces: - # Key only used for documentation or validation purposes + # Key only used for documentation or validation purposes. tenant: ``` diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/vxlan-interface.md b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/vxlan-interface.md index ca504c9b00a..9a04aeb9a3f 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/vxlan-interface.md +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/docs/tables/vxlan-interface.md @@ -11,15 +11,15 @@ | [  Vxlan1](## "vxlan_interface.Vxlan1") | Dictionary | | | | | | [    description](## "vxlan_interface.Vxlan1.description") | String | | | | | | [    vxlan](## "vxlan_interface.Vxlan1.vxlan") | Dictionary | | | | | - | [      source_interface](## "vxlan_interface.Vxlan1.vxlan.source_interface") | String | | | | Source Interface Name | + | [      source_interface](## "vxlan_interface.Vxlan1.vxlan.source_interface") | String | | | | Source Interface Name. | | [      multicast](## "vxlan_interface.Vxlan1.vxlan.multicast") | Dictionary | | | | | | [        headend_replication](## "vxlan_interface.Vxlan1.vxlan.multicast.headend_replication") | Boolean | | | | | - | [      controller_client](## "vxlan_interface.Vxlan1.vxlan.controller_client") | Dictionary | | | | Client to CVX Controllers | + | [      controller_client](## "vxlan_interface.Vxlan1.vxlan.controller_client") | Dictionary | | | | Client to CVX Controllers. | | [        enabled](## "vxlan_interface.Vxlan1.vxlan.controller_client.enabled") | Boolean | | | | | | [      mlag_source_interface](## "vxlan_interface.Vxlan1.vxlan.mlag_source_interface") | String | | | | | | [      udp_port](## "vxlan_interface.Vxlan1.vxlan.udp_port") | Integer | | | | | | [      vtep_to_vtep_bridging](## "vxlan_interface.Vxlan1.vxlan.vtep_to_vtep_bridging") | Boolean | | | | Enable bridging between different VTEPs in vxlan overlay. | - | [      virtual_router_encapsulation_mac_address](## "vxlan_interface.Vxlan1.vxlan.virtual_router_encapsulation_mac_address") | String | | | | "mlag-system-id" or ethernet_address (H.H.H)
| + | [      virtual_router_encapsulation_mac_address](## "vxlan_interface.Vxlan1.vxlan.virtual_router_encapsulation_mac_address") | String | | | | "mlag-system-id" or ethernet_address (H.H.H).
| | [      bfd_vtep_evpn](## "vxlan_interface.Vxlan1.vxlan.bfd_vtep_evpn") | Dictionary | | | | | | [        interval](## "vxlan_interface.Vxlan1.vxlan.bfd_vtep_evpn.interval") | Integer | | | | | | [        min_rx](## "vxlan_interface.Vxlan1.vxlan.bfd_vtep_evpn.min_rx") | Integer | | | | | @@ -30,17 +30,17 @@ | [        ecn_propagation](## "vxlan_interface.Vxlan1.vxlan.qos.ecn_propagation") | Boolean | | | | Enable copying the ECN marking to/from encapsulated packets.
| | [        map_dscp_to_traffic_class_decapsulation](## "vxlan_interface.Vxlan1.vxlan.qos.map_dscp_to_traffic_class_decapsulation") | Boolean | | | | | | [      vlans](## "vxlan_interface.Vxlan1.vxlan.vlans") | List, items: Dictionary | | | | | - | [        - id](## "vxlan_interface.Vxlan1.vxlan.vlans.[].id") | Integer | Required, Unique | | | VLAN ID | + | [        - id](## "vxlan_interface.Vxlan1.vxlan.vlans.[].id") | Integer | Required, Unique | | | VLAN ID. | | [          vni](## "vxlan_interface.Vxlan1.vxlan.vlans.[].vni") | Integer | | | | | - | [          multicast_group](## "vxlan_interface.Vxlan1.vxlan.vlans.[].multicast_group") | String | | | | IP Multicast Group Address | + | [          multicast_group](## "vxlan_interface.Vxlan1.vxlan.vlans.[].multicast_group") | String | | | | IP Multicast Group Address. | | [          flood_vteps](## "vxlan_interface.Vxlan1.vxlan.vlans.[].flood_vteps") | List, items: String | | | | | - | [            - <str>](## "vxlan_interface.Vxlan1.vxlan.vlans.[].flood_vteps.[]") | String | | | | Remote VTEP IP Address | + | [            - <str>](## "vxlan_interface.Vxlan1.vxlan.vlans.[].flood_vteps.[]") | String | | | | Remote VTEP IP Address. | | [      vrfs](## "vxlan_interface.Vxlan1.vxlan.vrfs") | List, items: Dictionary | | | | | - | [        - name](## "vxlan_interface.Vxlan1.vxlan.vrfs.[].name") | String | Required, Unique | | | VRF Name | + | [        - name](## "vxlan_interface.Vxlan1.vxlan.vrfs.[].name") | String | Required, Unique | | | VRF Name. | | [          vni](## "vxlan_interface.Vxlan1.vxlan.vrfs.[].vni") | Integer | | | | | - | [          multicast_group](## "vxlan_interface.Vxlan1.vxlan.vrfs.[].multicast_group") | String | | | | IP Multicast Group Address | + | [          multicast_group](## "vxlan_interface.Vxlan1.vxlan.vrfs.[].multicast_group") | String | | | | IP Multicast Group Address. | | [      flood_vteps](## "vxlan_interface.Vxlan1.vxlan.flood_vteps") | List, items: String | | | | | - | [        - <str>](## "vxlan_interface.Vxlan1.vxlan.flood_vteps.[]") | String | | | | Remote VTEP IP Address | + | [        - <str>](## "vxlan_interface.Vxlan1.vxlan.flood_vteps.[]") | String | | | | Remote VTEP IP Address. | | [      flood_vtep_learned_data_plane](## "vxlan_interface.Vxlan1.vxlan.flood_vtep_learned_data_plane") | Boolean | | | | | | [    eos_cli](## "vxlan_interface.Vxlan1.eos_cli") | String | | | | Multiline String with EOS CLI rendered directly on the Vxlan interface in the final EOS configuration.
| @@ -52,12 +52,12 @@ description: vxlan: - # Source Interface Name + # Source Interface Name. source_interface: multicast: headend_replication: - # Client to CVX Controllers + # Client to CVX Controllers. controller_client: enabled: mlag_source_interface: @@ -66,7 +66,7 @@ # Enable bridging between different VTEPs in vxlan overlay. vtep_to_vtep_bridging: - # "mlag-system-id" or ethernet_address (H.H.H) + # "mlag-system-id" or ethernet_address (H.H.H). virtual_router_encapsulation_mac_address: bfd_vtep_evpn: interval: @@ -84,27 +84,27 @@ map_dscp_to_traffic_class_decapsulation: vlans: - # VLAN ID + # VLAN ID. - id: vni: - # IP Multicast Group Address + # IP Multicast Group Address. multicast_group: flood_vteps: - # Remote VTEP IP Address + # Remote VTEP IP Address. - vrfs: - # VRF Name + # VRF Name. - name: vni: - # IP Multicast Group Address + # IP Multicast Group Address. multicast_group: flood_vteps: - # Remote VTEP IP Address + # Remote VTEP IP Address. - flood_vtep_learned_data_plane: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/MOVED_TO_PYAVD.txt b/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/MOVED_TO_PYAVD.txt new file mode 100644 index 00000000000..6933e857c10 --- /dev/null +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/MOVED_TO_PYAVD.txt @@ -0,0 +1 @@ +The schemas have been moved to PyAVD in the folder /python-avd/pyavd/_eos_cli_config_gen/schema/ diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/event_handlers.schema.yml b/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/event_handlers.schema.yml deleted file mode 100644 index c4327167bc9..00000000000 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/event_handlers.schema.yml +++ /dev/null @@ -1,96 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -# yaml-language-server: $schema=../../../../plugins/plugin_utils/schema/avd_meta_schema.json -# Line above is used by RedHat's YAML Schema vscode extension -# Use Ctrl + Space to get suggestions for every field. Autocomplete will pop up after typing 2 letters. -type: dict -keys: - event_handlers: - type: list - description: | - Gives the ability to monitor and react to Syslog messages. - Event Handlers provide a powerful and flexible tool that can be used to apply self-healing actions, - customize the system behavior, and implement workarounds to problems discovered in the field. - primary_key: name - convert_types: - - dict - items: - type: dict - keys: - name: - type: str - description: Event Handler Name - action_type: - type: str - valid_values: ["bash", "increment", "log"] - action: - type: str - description: | - Command to execute - delay: - type: int - convert_types: - - str - description: | - Event-handler delay in seconds - trigger: - type: str - description: | - Configure event trigger condition. - valid_values: - - on-boot - - on-logging - - on-startup-config - - on-maintenance - trigger_on_maintenance: - description: Settings required for trigger 'on-maintenance'. - type: dict - keys: - operation: - type: str - required: true - valid_values: - - "enter" - - "exit" - bgp_peer: - description: |- - Ipv4/Ipv6 address or peer group name. - Trigger condition occurs on maintenance operation of specified BGP peer. - type: str - action: - type: str - required: true - description: Action for maintenance operation. - valid_values: - - after - - before - - all - - begin - - end - stage: - type: str - description: Action is triggered after/before specified stage. - valid_values: - - "bgp" - - "linkdown" - - "mlag" - - "ratemon" - vrf: - type: str - description: VRF name. VRF can be defined for "bgp_peer" only. - interface: - type: str - description: Trigger condition occurs on maintenance operation of specified interface. - unit: - type: str - description: Name of unit. Trigger condition occurs on maintenance operation of specified unit - regex: - type: str - description: | - Regular expression to use for searching log messages. Required for on-logging trigger - asynchronous: - type: bool - default: False - description: | - Set the action to be non-blocking. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/tasks/main.yml b/ansible_collections/arista/avd/roles/eos_cli_config_gen/tasks/main.yml index fe711242a97..beb22e193f1 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/tasks/main.yml +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/tasks/main.yml @@ -14,53 +14,19 @@ run_once: true register: avd_requirements -- name: Create required output directories if not present - tags: [build, provision] - ansible.builtin.file: - path: "{{ item }}" - state: directory - mode: 0775 - loop: - - "{{ structured_dir }}" - - "{{ documentation_dir }}" - - "{{ eos_config_dir }}" - - "{{ devices_dir }}" - delegate_to: localhost - run_once: true - -- name: Include device intended structure configuration variables - tags: [build, provision] - ansible.builtin.include_vars: - file: "{{ filename }}" - delegate_to: localhost - when: structured_config is not defined and lookup('first_found', filename, skip=True, errors='ignore') - vars: - filename: "{{ structured_dir }}/{{ inventory_hostname }}.{{ avd_structured_config_file_format }}" - -- name: Generate eos intended configuration - tags: [build, provision] - arista.avd.validate_and_template: - template: eos-intended-config.j2 - dest: "{{ eos_config_dir }}/{{ inventory_hostname }}.cfg" - mode: 0664 - schema_id: "{{ role_name }}" +- name: Generate eos intended configuration and device documentation + tags: [always] + arista.avd.eos_cli_config_gen: + structured_config_filename: "{{ structured_config_filename }}" + config_filename: "{{ eos_config_dir }}/{{ inventory_hostname }}.cfg" + documentation_filename: "{{ devices_dir }}/{{ inventory_hostname }}.md" + read_structured_config_from_file: "{{ structured_config is not arista.avd.defined }}" conversion_mode: "{{ avd_data_conversion_mode }}" validation_mode: "{{ avd_data_validation_mode }}" - #cprofile_file: "config-{{inventory_hostname}}.prof" + generate_device_config: "{{ ansible_run_tags is arista.avd.contains(['all', 'build', 'provision']) and ansible_skip_tags is not arista.avd.contains(['build', 'provision']) }}" + generate_device_doc: "{{ generate_device_documentation | arista.avd.default(true) and ansible_run_tags is arista.avd.contains(['all', 'build', 'provision', 'documentation']) and ansible_skip_tags is not arista.avd.contains(['build', 'provision', 'documentation']) }}" + device_doc_toc: true + cprofile_file: "{{ eos_cli_config_gen_cprofile_file | default(omit) }}" delegate_to: localhost - register: eosconfig - -- name: Generate device documentation - tags: [build, provision, documentation] - arista.avd.validate_and_template: - template: "eos-device-documentation.j2" - dest: "{{ devices_dir }}/{{ inventory_hostname }}.md" - mode: 0664 - schema_id: "{{ role_name }}" - conversion_mode: "{{ avd_data_conversion_mode }}" - validation_mode: "{{ avd_data_validation_mode }}" - add_md_toc: true - md_toc_skip_lines: 3 - #cprofile_file: "docs-{{inventory_hostname}}.prof" - delegate_to: localhost - when: generate_device_documentation | arista.avd.default(true) + vars: + structured_config_filename: "{{ structured_dir }}/{{ inventory_hostname }}.{{ avd_structured_config_file_format }}" diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/MOVED_TO_PYAVD.txt b/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/MOVED_TO_PYAVD.txt new file mode 100644 index 00000000000..6b39c24488d --- /dev/null +++ b/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/MOVED_TO_PYAVD.txt @@ -0,0 +1 @@ +All eos_cli_config_gen templates except "custom-templates.j2" have been moved to PyAVD in the folder "/python-avd/pyavd/_eos_cli_config_gen/j2templates" diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/event-handlers.j2 b/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/event-handlers.j2 deleted file mode 100644 index 6a169693b44..00000000000 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/event-handlers.j2 +++ /dev/null @@ -1,28 +0,0 @@ -{# - Copyright (c) 2023-2024 Arista Networks, Inc. - Use of this source code is governed by the Apache License 2.0 - that can be found in the LICENSE file. -#} -{# doc - event handlers #} -{% if event_handlers is arista.avd.defined %} - -### Event Handler - -#### Event Handler Summary - -| Handler | Action Type | Action | Trigger | -| ------- | ----------- | ------ | ------- | -{% for handler in event_handlers | arista.avd.natural_sort('name') %} -{% set action = handler.action | replace('|', '\|') %} -{% if handler.action_type == 'bash' %} -{% set action = '' ~ action ~ '' %} -{% endif %} -| {{ handler.name }} | {{ handler.action_type }} | {{ action }} | {{ handler.trigger }} | -{% endfor %} - -#### Event Handler Device Configuration - -```eos -{% include 'eos/event-handlers.j2' %} -``` -{% endif %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/monitor-layer1.j2 b/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/monitor-layer1.j2 deleted file mode 100644 index 58a736c8b1b..00000000000 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/monitor-layer1.j2 +++ /dev/null @@ -1,22 +0,0 @@ -{# - Copyright (c) 2023-2024 Arista Networks, Inc. - Use of this source code is governed by the Apache License 2.0 - that can be found in the LICENSE file. -#} -{# doc - monitor layer1 #} -{% if monitor_layer1.enabled is arista.avd.defined(true) %} - -## Monitor Layer 1 Logging - -| Layer 1 Event | Logging | -| ------------- | ------- | -| MAC fault | {{ monitor_layer1.logging_mac_fault | arista.avd.default(false) }} | -| Transceiver DOM | {{ monitor_layer1.logging_transceiver.dom | arista.avd.default(false) }} | -| Transceiver communication | {{ monitor_layer1.logging_transceiver.communication | arista.avd.default(false) }} | - -### Monitor Layer 1 Device Configuration - -```eos -{% include 'eos/monitor-layer1.j2' %} -``` -{% endif %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/arp.j2 b/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/arp.j2 deleted file mode 100644 index 079bd055ba3..00000000000 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/arp.j2 +++ /dev/null @@ -1,28 +0,0 @@ -{# - Copyright (c) 2023-2024 Arista Networks, Inc. - Use of this source code is governed by the Apache License 2.0 - that can be found in the LICENSE file. -#} -{# eos - arp #} -{% if arp.aging.timeout_default is arista.avd.defined %} -! -arp aging timeout default {{ arp.aging.timeout_default }} -{% endif %} -{% if arp.static_entries is arista.avd.defined %} -{# TODO - remove when dropping support for ansible 2.12.6 and its jinja2 hack #} -{% for entry in arp.static_entries %} -{% if entry.vrf is not arista.avd.defined %} -{% do entry.update({"vrf": "default"}) %} -{% endif %} -{% endfor %} -{% for vrf, entries in arp.static_entries | groupby("vrf") | arista.avd.natural_sort %} -{# TODO {% for vrf, entries in arp.static_entries | arista.avd.default([]) | groupby("vrf", default="default") | arista.avd.natural_sort %} #} -{% for entry in entries | arista.avd.natural_sort("ipv4_address") %} -{% set arp_entry_prefix = "arp" %} -{% if vrf != "default" %} -{% set arp_entry_prefix = arp_entry_prefix ~ " vrf " ~ vrf %} -{% endif %} -{{ arp_entry_prefix }} {{ entry.ipv4_address }} {{ entry.mac_address }} arpa -{% endfor %} -{% endfor %} -{% endif %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/event-handlers.j2 b/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/event-handlers.j2 deleted file mode 100644 index ba18683b691..00000000000 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/event-handlers.j2 +++ /dev/null @@ -1,53 +0,0 @@ -{# - Copyright (c) 2023-2024 Arista Networks, Inc. - Use of this source code is governed by the Apache License 2.0 - that can be found in the LICENSE file. -#} -{# eos - event handlers #} -{% if event_handlers is arista.avd.defined %} -{% for handler in event_handlers | arista.avd.natural_sort('name') %} -! -event-handler {{ handler.name }} -{% if handler.trigger is arista.avd.defined %} -{% if handler.trigger is arista.avd.defined("on-maintenance") - and handler.trigger_on_maintenance.operation is arista.avd.defined - and handler.trigger_on_maintenance.action is arista.avd.defined %} -{% set trigger_on_manitenance_cli = "trigger " ~ handler.trigger ~ " " ~ handler.trigger_on_maintenance.operation %} -{% if handler.trigger_on_maintenance.bgp_peer is arista.avd.defined %} -{% set trigger_on_manitenance_cli = trigger_on_manitenance_cli ~ " bgp " ~ handler.trigger_on_maintenance.bgp_peer %} -{% if handler.trigger_on_maintenance.vrf is arista.avd.defined %} -{% set trigger_on_manitenance_cli = trigger_on_manitenance_cli ~ " vrf " ~ handler.trigger_on_maintenance.vrf %} -{% endif %} -{% elif handler.trigger_on_maintenance.interface is arista.avd.defined %} -{% set trigger_on_manitenance_cli = trigger_on_manitenance_cli ~ " interface " ~ handler.trigger_on_maintenance.interface %} -{% elif handler.trigger_on_maintenance.unit is arista.avd.defined %} -{% set trigger_on_manitenance_cli = trigger_on_manitenance_cli ~ " unit " ~ handler.trigger_on_maintenance.unit %} -{% endif %} -{% if handler.trigger_on_maintenance.action is arista.avd.defined("after") or handler.trigger_on_maintenance.action is arista.avd.defined("before") %} -{% set trigger_on_manitenance_cli = trigger_on_manitenance_cli ~ " " ~ handler.trigger_on_maintenance.action ~ " stage " ~ handler.trigger_on_maintenance.stage %} -{% elif handler.trigger_on_maintenance.action is arista.avd.defined("all") %} -{% set trigger_on_manitenance_cli = trigger_on_manitenance_cli ~ " all" %} -{% elif handler.trigger_on_maintenance.action is arista.avd.defined("begin") %} -{% set trigger_on_manitenance_cli = trigger_on_manitenance_cli ~ " begin" %} -{% elif handler.trigger_on_maintenance.action is arista.avd.defined("end") %} -{% set trigger_on_manitenance_cli = trigger_on_manitenance_cli ~ " end" %} -{% endif %} - {{ trigger_on_manitenance_cli }} -{% else %} - trigger {{ handler.trigger }} -{% endif %} -{% if handler.regex is arista.avd.defined %} - regex {{ handler.regex }} -{% endif %} -{% endif %} -{% if handler.action is arista.avd.defined and handler.action_type is arista.avd.defined %} - action {{ handler.action_type }} {{ handler.action }} -{% endif %} -{% if handler.delay is arista.avd.defined %} - delay {{ handler.delay }} -{% endif %} -{% if handler.asynchronous is arista.avd.defined(true) %} - asynchronous -{% endif %} -{% endfor %} -{% endif %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-dhcp-relay.j2 b/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-dhcp-relay.j2 deleted file mode 100644 index 49cac08b310..00000000000 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-dhcp-relay.j2 +++ /dev/null @@ -1,10 +0,0 @@ -{# - Copyright (c) 2023-2024 Arista Networks, Inc. - Use of this source code is governed by the Apache License 2.0 - that can be found in the LICENSE file. -#} -{# eos - ip dhcp relay #} -{% if ip_dhcp_relay.information_option is arista.avd.defined(true) %} -! -ip dhcp relay information option -{% endif %} diff --git a/ansible_collections/arista/avd/roles/eos_config_deploy_cvp/README.md b/ansible_collections/arista/avd/roles/eos_config_deploy_cvp/README.md index caaa8a1dc52..bdedea4f0ff 100644 --- a/ansible_collections/arista/avd/roles/eos_config_deploy_cvp/README.md +++ b/ansible_collections/arista/avd/roles/eos_config_deploy_cvp/README.md @@ -269,7 +269,7 @@ cv_configlets: This module also supports tags to run a subset of ansible tasks: -- **`build`**: Generate Arista Validated Design configuration for EOS devices (structure_configs / configs / documentation) and CloudVision inputs. +- **`build`**: Generate Arista Validated Designs configuration for EOS devices (structure_configs / configs / documentation) and CloudVision inputs. - **`provision`**: Run `build` tags + configure CloudVision with information generated in previous tasks ```shell @@ -303,7 +303,7 @@ ansible-playbook playbook.to.deploy.with.cvp.yml --skip-tags "containers,apply" ## Requirements -Requirements are located here: [avd-requirements](../../README.md#Requirements) +Requirements are located here: [avd-requirements](../../docs/installation/collection-installation.md#additional-python-libraries-required) ## License diff --git a/ansible_collections/arista/avd/roles/eos_config_deploy_cvp/docs/avd-to-cvaas.md b/ansible_collections/arista/avd/roles/eos_config_deploy_cvp/docs/avd-to-cvaas.md index be879d1756b..3397ff9dd84 100644 --- a/ansible_collections/arista/avd/roles/eos_config_deploy_cvp/docs/avd-to-cvaas.md +++ b/ansible_collections/arista/avd/roles/eos_config_deploy_cvp/docs/avd-to-cvaas.md @@ -79,12 +79,14 @@ cluster URLs used in production: | Region | URL | |--------|-----| -| United States 1a | [www.arista.io](https://www.arista.io) | -| United States 1c| [www.cv-prod-us-central1-c.arista.io](https://www.cv-prod-us-central1-c.arista.io)| -| Canada | [www.cv-prod-na-northeast1-b.arista.io](https://www.cv-prod-na-northeast1-b.arista.io)| -| Europe West 2| [www.cv-prod-euwest-2.arista.io](https://www.cv-prod-euwest-2.arista.io)| -| Japan| [www.cv-prod-apnortheast-1.arista.io](https://www.cv-prod-apnortheast-1.arista.io)| -| Australia | [www.cv-prod-ausoutheast-1.arista.io](https://www.cv-prod-ausoutheast-1.arista.io)| +| United States 1a | `www.arista.io` | +| United States 1b | `www.cv-prod-us-central1-b.arista.io`| +| United States 1c | `www.cv-prod-us-central1-c.arista.io`| +| Canada | `www.cv-prod-na-northeast1-b.arista.io` | +| Europe West 2| `www.cv-prod-euwest-2.arista.io` | +| Japan| `www.cv-prod-apnortheast-1.arista.io` | +| Australia | `www.cv-prod-ausoutheast-1.arista.io` | +| United Kingdon | `www.cv-prod-uk-1.arista.io` | !!! Warning diff --git a/ansible_collections/arista/avd/roles/eos_config_deploy_eapi/README.md b/ansible_collections/arista/avd/roles/eos_config_deploy_eapi/README.md index cc79ed6703d..fda5a09aa6b 100644 --- a/ansible_collections/arista/avd/roles/eos_config_deploy_eapi/README.md +++ b/ansible_collections/arista/avd/roles/eos_config_deploy_eapi/README.md @@ -53,7 +53,7 @@ roles/eos_config_deploy_eapi/defaults/main.yml ## Requirements -Requirements are located here: [avd-requirements](../../README.md#Requirements) +Requirements are located here: [avd-requirements](../../docs/installation/collection-installation.md#additional-python-libraries-required) ## License diff --git a/ansible_collections/arista/avd/roles/eos_designs/README.md b/ansible_collections/arista/avd/roles/eos_designs/README.md index 4ff5f474e0e..e6242a261f9 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/README.md +++ b/ansible_collections/arista/avd/roles/eos_designs/README.md @@ -93,13 +93,13 @@ Across all designs, the following functionality is provided: **5 Stage topology example:**
- + 5 Stage topology example
**Disaggregated topology example:**
- + Disaggregated topology example
### Layer 2 Leaf Spine @@ -115,7 +115,7 @@ Across all designs, the following functionality is provided: **L2LS topology example:**
- + L2LS topology example
### MPLS Core with MPLS EVPN, VPN-IPv4, VPN-IPv6 @@ -130,7 +130,7 @@ Across all designs, the following functionality is provided: **MPLS topology example:**
- + MPLS topology example
### WAN AutoVPN / CV Pathfinder @@ -143,7 +143,7 @@ Across all designs, the following functionality is provided: **WAN topology example:**
- + WAN topology example
## Requirements diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/how-to/custom-structured-configuration.md b/ansible_collections/arista/avd/roles/eos_designs/docs/how-to/custom-structured-configuration.md index 3643d2f4bc4..2ff5fcaae79 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/how-to/custom-structured-configuration.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/how-to/custom-structured-configuration.md @@ -34,7 +34,7 @@ could lead to additional variable keys being generated by `eos_designs` in the s
- + Variable Precedence logical diagram
The recommendation is to use `custom_structured_configuration` as described below. This configuration will be merged on top of the `eos_designs` generated variables. diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/how-to/ptp.md b/ansible_collections/arista/avd/roles/eos_designs/docs/how-to/ptp.md index cdf3c1043d0..2c47444efc0 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/how-to/ptp.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/how-to/ptp.md @@ -151,7 +151,7 @@ Alternatively the default `node_type_keys` can be overridden to add a `ptp_leaf` #### Manually setting PTP priorities -The automatic PTP priorities can be manually overriden if required, for example for leaf1: +The automatic PTP priorities can be manually overridden if required, for example for leaf1: ```yaml l3leaf: diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/how-to/wan.md b/ansible_collections/arista/avd/roles/eos_designs/docs/how-to/wan.md index 805c7d02584..302c036f063 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/how-to/wan.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/how-to/wan.md @@ -38,17 +38,23 @@ Please familiarize yourself with the Arista WAN terminology before proceeding: - VRF `default` is being configured by default on all WAN devices with a `wan_vni` of 1. To override this, it is necessary to configure VRF `default` in a tenant in `network_services`. - Path-group ID `65535` is reserved for the path-group called `LAN_HA`. +!!! info "CV Pathfinder & CloudVision" + + When deploying CV Pathfinder with CloudVision, it is necessary to leverage + the `arista.avd.cv_deploy` role and not the `arista.avd.eos_config_deploy_cvp` + role, as CloudVision relies on metadata sent by AVD for visualization and to + generate and deliver certificates for STUN to devices. + ### Features in PREVIEW - WAN HA is in PREVIEW - While HA is in preview, it is required to either enable or disable HA if exactly two WAN routers are in one node group. - - For HA, the considered interfaces are only the `uplink_interfaces` in VRF default. - - It is not yet supported to disable HA on a specific LAN interface on the device, nor is it supported to add HA configuration on a non-uplink interface. + - For HA, the considered interfaces are only the `uplink_interfaces` in VRF default or the interfaces defined under `wan_ha.ha_interfaces` node settings. This key can be used either to select only some `uplink_interfaces` available for establishing the HA tunnel OR to select one interface that is not an `uplink_interfaces`, for instance for direct HA connectivity. - HA for AutoVPN is not supported -- `flow_tracking_settings` is in PREVIEW as the model will change in the next release. +- Internet-exit for Zscaler is in PREVIEW - `eos_validate_state` is being enriched to support new tests for WAN designs. - These new tests are added only in the [ANTA preview](../../../eos_validate_state/ANTA-Preview.md) mode. + These new tests are added only in the [ANTA integration](../../../eos_validate_state/anta_integration.md) mode. ### Known limitations @@ -59,13 +65,13 @@ Please familiarize yourself with the Arista WAN terminology before proceeding: - The name of the AVT policies and AVT profiles are configurable in the input variables. The Load Balance policies are named `LB-` and are not configurable. - LAN support is limited to single L2 using `uplink_type: lan` and eBGP L3 using `uplink_type: p2p-vrfs` in conjunction of `underlay_routing_protocol: ebgp`. - All the WAN routers must have a common path-group with at least one WAN route server to be able to inject the default control-plane match statement in the VRF default WAN policy. +- For the default VRF, routes received over BGP peering configured under tenants in `network_services` will not be automatically advertised to the WAN (they will be advertised toward the LAN if eBGP is used). To advertise them towards the WAN, they need to be injected in EVPN and this can be achieved by adding a route-map to mark them with the site SOO. ### Future work -- HA support out of PREVIEW - New LAN scenarios (L2 port-channel, HA for L2 `lan` using VRRP..) - HA for AutoVPN -- WAN Internet exit +- WAN Internet exit for other type than Zscaler - `import path-group` functionality - Indirect connectivity to pathfinder - BGP peerings on WAN L3 interfaces and associated route filtering. @@ -101,17 +107,18 @@ The following table list the `eos_designs` top level keys used for WAN and how t | Key | Must be the same for all the WAN routers | Comment | | --- | ---------------------------------------- | ------- | -| `wan_mode` | ✅ | Two possible modes, `autovpn` and `cv-pathfinder` (default) | -| `wan_virtual_topologies` | ✅ | to define the Policies and the VRF to policy mappings | -| `wan_path_groups` | ✅ | to define the list of path-groups in the network | -| `wan_carriers` | ✅ | to define the list of carriers in the network, each carrier is assigned to a path-group | -| `wan_ipsec_profiles` | ✅ | to define the shared key for the Control Plane and Data Plane IPSec profiles. | -| `cv_pathfinder_regions` | ✅ | to define the Region/Zone/Site hierarchy, not required for AutoVPN. | -| `tenants` | ✅ | the default tenant key from `network_services` or any other key for tenant that would hold some WAN VRF informaiton | -| `wan_stun_dtls_disable` | ✅ | disable dTLS for STUN for instance for lab. (**NOT** recommended in production) | -| `application_classification` | ✅ | to define the specific traffic classification required for the WAN if any. | -| `wan_route_servers` | ✘| Indicate to which WAN route servers the WAN router should connect to. This key is also used to tell every WAN Route Reflectors with which other RRs it should peer with. | -| `ipv4_acls` | ✘| List of IPv4 access-lists to be assigned to WAN interfaces. | +| `wan_mode` | ✅ | Two possible modes, `autovpn` and `cv-pathfinder` (default). | +| `wan_virtual_topologies` | ✅ | to define the Policies and the VRF to policy mappings. | +| `wan_path_groups` | ✅ | to define the list of path-groups in the network. | +| `wan_carriers` | ✅ | to define the list of carriers in the network, each carrier is assigned to a path-group. | +| `wan_ipsec_profiles` | ✅ | to define the shared key for the Control Plane and Data Plane IPSec profiles. | +| `cv_pathfinder_regions` | ✅ | to define the Region/Zone/Site hierarchy, not required for AutoVPN. | +| `tenants` | ✅ | the default tenant key from `network_services` or any other key for tenant that would hold some WAN VRF information. | +| `wan_stun_dtls_disable` | ✅ | disable dTLS for STUN for instance for lab. (**NOT** recommended in production). | +| `application_classification` | ✅ | to define the specific traffic classification required for the WAN if any. | +| `cv_pathfinder_internet_exit_policies` | ✅ | to define the internet-exit policies. | +| `wan_route_servers` | ✘| Indicate to which WAN route servers the WAN router should connect to. This key is also used to tell every WAN Route Reflectors with which other RRs it should peer with. | +| `ipv4_acls` | ✘| List of IPv4 access-lists to be assigned to WAN interfaces. | Additionally, following keys must be set for the WAN route servers for the connectivity to work: @@ -163,7 +170,7 @@ However, if the WAN route servers are in a different inventory, it is then neces #### WAN STUN handling -WAN STUN connections are configured by default authenticated and secured with DTLS by default. A security profile is configured with an hardcoded root certificate and matching a certifcate `.crt` and key `.key`: +WAN STUN connections are configured by default authenticated and secured with DTLS by default. A security profile is configured with an hardcoded root certificate and matching a certificate `.crt` and key `.key`: ```eos management security @@ -177,8 +184,8 @@ These values can be overwritten using `custom_structured_configuration`. This configuration requires certificates to be distributed on the WAN devices to be able to authenticate themselves: -- For CV Pathinder deployments, CloudVision will automatically deploy certificates on the devices. -- For AutoVPN, the certficiates must be generated and deployed to the devices for the STUN connections to work. +- For CV Pathinder deployments, CloudVision will automatically generate and deploy the certificates on the devices once AVD configs and metadata have been pushed. +- For AutoVPN, the certificates must be generated and deployed to the devices for the STUN connections to work. !!! Danger "Disabling STUN" @@ -234,7 +241,10 @@ wan_router: cv_pathfinder_site: Site11 ``` -For Pathfinders (`wan_rr`), it is possible to set the `cv_pathfinder_region` key. It is not rendered in configuration but leveraged in CloudVision for the visualization. +For Pathfinders (`wan_rr`), both `cv_pathfinder_site` and `cv_pathfinder_region` are optional but recommended for the following use cases: + +- To define a "global" pathfinder, only set the `cv_pathfinder_site` and define the site under `cv_pathfinder_global_sites`. +- To define a "regional" pathfinder, set both `cv_pathfinder_region` and `cv_pathfinder_site`. The region and site must be defined under `cv_pathfinder_hierarchy`. #### WAN carriers and path-groups @@ -362,7 +372,7 @@ The policies definition works as follow: - The `default_virtual_topology` is used as the default match in the policy. To prevent configuring it, the `drop_unmatched` boolean must be set to `true` otherwise, at least one `path-group` must be configured or AVD will raise an error. - Policies are assigned to VRFs using the list `wan_virtual_topologies.vrfs`. A policy can be reused in multiple VRFs. - If no policy is assigned for the `default` VRF policy, AVD auto generates one with one `default_virtual_topology` entry configured to use all available local path-groups. -- For the policy defined for VRF `default` (or the auto-generared one), an extra match statement is injected in the policy to match the traffic towards the Pathfinders or AutoVPN RRs, the name of the application-profile is hardcoded as `APP-PROFILE-CONTROL-PLANE`. A special policy is created by appending `-WITH-CP` at the end of the targetted policy name. +- For the policy defined for VRF `default` (or the auto-generared one), an extra match statement is injected in the policy to match the traffic towards the Pathfinders or AutoVPN RRs, the name of the application-profile is hardcoded as `APP-PROFILE-CONTROL-PLANE`. A special policy is created by appending `-WITH-CP` at the end of the targeted policy name. - For the policy defined for VRF `default` (or the auto-generated one), an extra match statement is always injected in the policy to match the traffic towards the Pathfinders or AutoVPN RRs. The name of the injected application-profile is hardcoded as `APP-PROFILE-CONTROL-PLANE`. A special policy is created by appending `-WITH-CP` at the end of the targeted policy name. ```yaml @@ -420,13 +430,192 @@ wan_virtual_topologies: This block of configuration will configure the Load Balance policy, the match statement in the policy (in `router path-selection` for AutoVPN or `router adaptive-virtual-topology` for CV-Pathfinder) and for CV-Pathfinder, the AVT profile. The application profile must be defined under `application_classification.application_profiles`. The Load Balance policy will favor direct path over multihop path (`lowest_hop_count`). - MPLS is prefered over the INET path-group. + MPLS is preferred over the INET path-group. 6. The constraints are applied on the load-balance policy. If the delay, jitter or loss-rate of a given path-selection path exceeds the defined criteria, the path is avoided and the remaining ECMP paths are used or the next path in line meeting the constraints is used. 7. The `id` is used as the AVT profile ID in the configuration. 8. The `MPLS-ONLY` application profile won't be rendered on devices not having this path-group. +### Internet-exit policies + +!!! info "Supported internet-exit policy types" + + In its current version, AVD supports only Internet-Exit policies towards Zscaler in PREVIEW mode. + +!!! warning "PREVIEW: Changes ahead" + + This configuration currently in PREVIEW **may** change in future version of AVD. + +The Internet exit feature enables hosts attached to a VRF in an edge router to reach prefixes that may be reachable over the internet. +Internet-exit can be achieved in multiple ways: + +- Local exit toward the ISP +- Local exit toward an enterprise firewall +- Local exit toward a Secure Internet Gateway + +#### AVD abstraction + +The internet-exit policies are defined as global variables for all the WAN routers under `cv_pathfinder_internet_exit_policies`. + +- A device is configured with an Internet-exit policy if the internet-exit policy is configured **both** under one of its WAN interfaces and under a WAN virtual topology applied on the device. +- The internet-exit policies are not included on the Pathfinders. + +The policies are assigned a type, currently `zscaler` and `direct` are supported. Then additional parameters can be provided according to the type. + +```yaml +cv_pathfinder_internet_exit_policies: + - name: ZSCALER-EXIT-POLICY-1 + type: zscaler + # [...] type specific options + - name: ZSCALER-EXIT-POLICY-2 + fallback_to_system_default: False + type: zscaler + # [...] type specific options + - name: DIRECT-EXIT-POLICY-1 + type: direct + # [...] type specific options +``` + +An Application Virtual Topology policy is composed of multiple profiles. An AVT profile can be assigned an Internet-policy as follow: + +```yaml +wan_virtual_topologies: + vrfs: + [...] + policies: + - name: PROD-AVT-POLICY + default_virtual_topology: + path_groups: + - names: [INET] + preference: preferred + - names: [MPLS] + preference: alternate + internet_exit: + policy: DIRECT-EXIT-POLICY-1 # (2)! + application_virtual_topologies: + - application_profile: VOICE + path_groups: + - names: [MPLS] + preference: preferred + - names: [INET] + preference: alternate + internet_exit: + policy: ZSCALER-EXIT-POLICY-1 # (1)! + id: 2 +``` + +1. Assign the `ZSCALER-EXIT-POLICY-1` internet-exit policy to the AVT profile. +2. Assign the `DIRECT-EXIT-POLICY-1` internet-exit policy to the default AVT. + +Then on each device, the local Internet-exit policies needs to be assigned to the exit WAN interface under the node-settings `l3_interfaces`: + +```yaml +wan_router: + defaults: + loopback_ipv4_pool: 192.168.42.0/24 + vtep_loopback_ipv4_pool: 192.168.142.0/24 + filter: + always_include_vrfs_in_tenants: [TenantA] + uplink_ipv4_pool: 172.17.0.0/16 + bgp_as: 65000 + nodes: + - name: cv-pathfinder-edge1 + id: 2 + uplink_switch_interfaces: [Ethernet2] + l3_interfaces: + - name: Ethernet3 + wan_carrier: Comcast-5G + wan_circuit_id: AF830 + ip_address: 172.20.20.20/31 + connected_to_pathfinder: false + wan_circuit_id: 404 + dhcp_accept_default_route: true + ip_address: dhcp + cv_pathfinder_internet_exit: # (1)! + policies: + - name: ZSCALER-EXIT-POLICY-1 + tunnel_interface_numbers: 100-102 + - name: ZSCALER-EXIT-POLICY-2 + tunnel_interface_numbers: 110-112 + - name: DIRECT-EXIT-POLICY-1 +``` + +1. Assign the `ZSCALER-EXIT-POLICY-1` and `ZSCALER-EXIT-POLICY-2` internet-exit policies to the Ethernet3 WAN interface. + +#### Local exit toward the ISP + +!!! Warning "Only supported in PREVIEW" + +Internet-exit policy type should be set to `direct` to locally exit toward the ISP. +The feature requires NAT to be enabled on the interfaces part of the policy and following NAT policy will be configured on the interfaces implicitly. + +```eos +ip access-list ALLOW-ALL + 10 permit ip any any +! +ip nat profile IE-DIRECT-NAT + ip nat source dynamic access-list ALLOW-ALL overload +! +interface Ethernet3 + description Comcast-5G_AF830 + no shutdown + no switchport + ip address 172.20.20.20/31 + ip nat service-profile IE-DIRECT-NAT +``` + +#### Local exit toward an entreprise firewall + +!!! Warning "Not currently supported in eos_designs." + +#### Local exit toward a Secure Internet Gateway + +!!! Warning "Only supported in PREVIEW toward Zscaler SIG" + +An internet-exit policy of type `zscaler` leverages the following AVD data model to generate the target configuration. + +AVD supports up to three tunnels (primary, secondary, tertiary). + +The target is for this data to be retrieved from Cloudvision through a lookup plugin for each device to determine what are the best tunnel(s) to use for a given location. + +```yaml +# Variables used by the lookup plugin to connect to Cloudvision +cv_server: +cv_token: + +# Lookup plugin usage +zscaler_endpoints: "{{ lookup('arista.avd.cv_zscaler_endpoints') }}" +``` + +For each `zscaler` type Internet-policies, AVD uses the `cv_pathinfder_internet_exit_policies[name=].zscaler` dictionary and the `zscaler_endpoints` in combination with the `l3_interfaces.cv_pathfinder_internet_exit.policies[name=].tunnel_interface_numbers` to generate the internet-exit configuration. + +The `cv_pathinfder_internet_exit_policies[name=].zscaler` dictionary has additonnal options to configure the policy parameters shared with Zscaler through Cloudvision. + +```yaml + # PREVIEW: These keys are in preview mode. + cv_pathfinder_internet_exit_policies: + - name: + type: + fallback_to_system_default: + zscaler: + ipsec_key_salt: + domain_name: + encrypt_traffic: + download_bandwidth: + upload_bandwidth: + firewall: + enabled: + ips: + acceptable_use_policy: +``` + +!!! tip "IPsec" + + When `encrypt_traffic: true` the traffic going over the tunnels will be encrypted with AES-256-GCM. + Otherwise the traffic will be using NULL encryption. + Note that encryption requires a subscription on the Zscaler account. + ### LAN Designs !!! danger "VRF default routing" @@ -438,24 +627,111 @@ The following LAN scenarios are supported: - Single Router L3 EBGP LAN - Single Router L2 LAN +- Dual Router L3 EBGP LAN with HA +- Dual Router using one directed connected HA interface. -The following LAN scenarios are in PREVIEW: +Some design points: -- Dual Router L3 EBGP LAN with HA +- The Site of Origin (SOO) extended community is configured as `:` + note: site id is unique per zone (only a default zone supported today). + for HA site, the SOO is set as `:` where `router1` is + the first router defined in the group. +- HA is not supported for more than two routers for CV Pathfinders. +- The routes to be advertised towards the WAN must be marked with the site SOO. + - The connected routes and static routes are marked with the SOO when + redistributed in BGP + - the routes redistributed into BGP via the route-map `RM-CONN-2-BGP` are tagged with the SOO. + - the routes redistributed into BGP via the route-map `RM-STATIC-2-BGP` are tagged with the SOO. + - the routes received from LAN are marked with the SOO when received from + the LAN over BGP or when redistributed into BGP from the LAN protocol. + note: For other connection (e.g. L3 interface with a BGP peering, the + user must mark them with the SOO) +- For VRF default, there is a requirement to explicitly redistribute the routes for EVPN. The `RM-EVPN-EXPORT-VRF-DEFAULT` is configured to export the routes tagged with the SOO. +- Routes received from the WAN with the local SOO are dropped. +- Routes received from the WAN are redistributed / advertised towards the LAN. +- For HA, an iBGP session using EVPN Gateway is used to share the routes from + one peer to the other. + - WAN, LAN and local static routes are sent to the HA peer to cater for various failure scenarii. + - The routes received from the HA peer are made less preferred than routes received from the LAN or from the WAN. + +The following diagram represents the various redistribution occurring for default +and non-default VRFs in the common case. This indicates the route-maps on each +interaction to help understand how everything fits together. This diagram +represents the common scenario for a single router, without any LAN. It will be +reused when adding LAN protocols to help understand the changes. + + + +
+ WAN LAN Common design +
+ +#### LAN HA common configuration + +EOS (and hence AVD) supports maximum 2 routers for HA. To establish LAN HA the requirements are the following: + +- The HA tunnels can be established only in the default VRF (EOS limitation) +- The HA interfaces must be able to establish IPSec tunnels between each other. This implies that if the interfaces are on different subnet, the LAN must be able to route traffic between each interface. +- EVPN Gateway is used to exchange the routes between the HA peers configured as follow - the advantage is that it caters for all VRFs and the default VRF export route-map is still valid. + +By default, AVD uses the uplinks as the HA links. It is possible to override this by setting a single interface to be used as the *Direct HA link*: + +```yaml +wan_router: + node_groups: + - group: Site42 + cv_pathfinder_region: AVD_Land_West + cv_pathfinder_site: Site42 + wan_ha: + enabled: true + ha_interfaces: [Ethernet52] # (1)! + ha_ipv4_pool: 10.10.10.0/24 # (2)! +``` + +1. Select the interface for HA, it can either be a way to select ONE interface for Direct HA, or to filter some of the uplink HA interfaces. +2. Prefix to use to allocate the IP address for the direct HA link. + +!!! warning + + Only one interface can be used for Direct HA today in AVD. + +From a configuration standpoint: + +- The routes sent to the HA peers are applied a route-map to make the routes less preferred than the one received from the WAN or from the LAN + - The sent routes are set with a local-preference of 75 if they originate directly from the local HA peer or 50 if they are received from the WAN. +- On the other end, all the received routes are tagged to be able to influence the redistribution towards the LAN of the HA routes when required. A tag of 50 is used to mark the routes received from the HA peer. +- The two levels of Local Preference exist to be able to always select the remote VTEP in a scenario where an HA site receives routes from another HA site: + - The routes received directly from a given remote VTEP are received with LP 100 + - The same routes received from the HA peer of the remote VTEP are received with LP 75 + - The same routes received from the local HA peer that went through the LAN are received with LP 50 + - This hierarchy allows selecting the correct best destination VTEP first and avoid decap and re-encap at EVPN level. Then DPS kicks in and can select a path that goes over the local or remote HA peer but targeting the correct best VTEP. + +The following diagram represents this scenario: + + + +
+ WAN Direct HA +
#### EBGP LAN -- the Site of Origin (SoO) extended community is configured as : - note: site id is unique per zone (only a default zone supported today). - the routes redistributed into BGP via the route-map `RM-CONN-2-BGP` are tagged with the SoO. -- the Underlay peer group (towards the LAN) is configured with two route-maps reused from existing designed but configured differently - - one outbound route-map `RM-BGP-UNDERLAY-PEERS-OUT`: - - advertised the local routes tagged with the SoO extended community. - - advertised the routes received from iBGP (WAN) towards the LAN also marked with the SoO community. +- the Underlay peer group (towards the LAN) is configured with one inbound route-map - one inbound route-map `RM-BGP-UNDERLAY-PEERS-IN`: - - deny routes received from LAN that already contain the WAN AS in the path. - accept routes coming from the LAN and set the SoO extended community on them. -- For VRF default, there is a requirement to explicitly redistribute the routes for EVPN. The `RM-EVPN-EXPORT-VRF-DEFAULT` is configured to export the routes tagged with the SoO. + +!!! warning + - the Underlay peer group (towards the LAN) is not configured with any outbound route-map. + - For VRF default, there is a requirement to explicitly redistribute the routes for EVPN. The `RM-EVPN-EXPORT-VRF-DEFAULT` is configured to export the routes tagged with the SoO. + +The following diagram shows the additional route-maps configured to support eBGP on LAN: + + + +
+ WAN eBGP LAN Single Router +
##### HA (PREVIEW) @@ -465,20 +741,32 @@ The following LAN scenarios are in PREVIEW: for eBGP LAN routing protocol the following is done to enable HA: -- the uplink interfaces are used as HA interfaces. +- the uplink interfaces are used as HA interfaces by default. - the subnets of the HA interfaces are redistributed to BGP via the `RM-CONN-2-BGP` route-map -BGP underlay peer group is configured with `allowas-in 1` to be able to learn the HA peer uplink interface subnet over the LAN as well as learning WAN routes from other sites (as backup in case all WAN links are lost). -- the Underlay peer group is configured with two route-maps - - one inbound route-map `RM-UNDERLAY-PEERS-IN` - - Match HA peer's uplink subnets (not marked) to be able to form HA tunnel (not exported to EVPN). - - Match HA peer's originated prefixes, set longer AS path and mark with SoO to export to EVPN. These will be used as backup from other sites to destinations on HA Peer Router in case all WAN connections on Peer are down. - - Match all WAN routes using AS path and set no-advertise community. This will be used as backup routes to the WAN in case this router looses all WAN connections. - - Match anything else (LAN prefixes) and mark with the SoO `:` to export to EVPN. - - one outbound route-map `RM-UNDERLAY-PEERS-OUT` - - allowing local routes marked with SoO (routes/interfaces defined via tenants + router-id) - - allowing subnets of uplink interfaces. - - allow all routes learned from iBGP (WAN) - - Implicitly denying other routes which could be learned from BGP towards a WAN provider or redistributed without marking with SoO. +- BGP underlay peer group is configured with `allowas-in 1` to be able to learn the HA peer uplink interface subnet over the LAN as well as learning WAN routes from other sites (as backup in case all WAN links are lost). +- the Underlay peer group is configured with one inbound route-map + - one inbound route-map `RM-BGP-UNDERLAY-PEERS-IN` + - Match HA peer's uplink subnets to be able to form HA tunnel (not exported to EVPN). + - Deny any other route from the HA peer as they are already shared over EVPN. + - Match anything else (LAN prefixes) and mark with the SOO `:` to export to EVPN. + +This is described in the following diagram: + + + +
+ WAN eBGP LAN with HA +
+ +##### HA with Direct Link (PREVIEW) + +In the situation where the LAN is EBGP but HA is configured over a direct link, there is no peering with the HA peer required via the LAN and the configuration is simplified as follow: + + + +
+ WAN eBGP LAN with Direct HA link +
#### OSPF LAN (NOT SUPPORTED) @@ -536,11 +824,11 @@ The tags will only be generated when `wan_mode` is set to `cv-pathfinder`. As described in the design principles, the goal is to be able to distribute the WAN routers in separate Ansible inventories. -When leveraging multiple inventories, the arista.avd collection provide capabilites to create [global variables](../../../../docs/plugins/Vars_plugins/global_vars.md). -The following example will be leveraging this capability to share required WAN variables accross multiple inventories. +When leveraging multiple inventories, the arista.avd collection provide capabilities to create [global variables](../../../../docs/plugins/Vars_plugins/global_vars.md). +The following example will be leveraging this capability to share required WAN variables across multiple inventories. This example contains contains two sites, SITE1 and SITE2 and a dedicate inventory for pathfinder nodes. -This would still relevant for configuring AutoVPN in seperate ansible inventories. +This would still relevant for configuring AutoVPN in separate ansible inventories. Inventory layout: @@ -578,7 +866,7 @@ Inventory layout: ```yaml title="global_vars/cv_pathfinder.yml" wan_mode: cv-pathfinder -# When Pathfinders are in a seperate inventory in addition to the hostname you also need to capture the `vtep_ip` and `path_groups`. +# When Pathfinders are in a separate inventory in addition to the hostname you also need to capture the `vtep_ip` and `path_groups`. wan_route_servers: - hostname: pf1 vtep_ip: 10.255.0.1 @@ -603,7 +891,7 @@ wan_route_servers: - name: Ethernet2 public_ip: 100.64.2.2/24 -# Suggested variables to share in your global variables accross inventories. +# Suggested variables to share in your global variables across inventories. cv_pathfinder_regions: - name: Global @@ -668,3 +956,18 @@ wan_virtual_topologies: - names: [internet] preference: alternate ``` + +### WAN Validation + +`eos_validate_state` is being enriched to support new tests for WAN designs. The tests listed below are validating WAN designs. + +| AVD Test Class | ANTA Test Class | Description | +| -------------- | --------------- | ----------- | +| AvdTestInterfacesState | VerifyInterfacesStatus | Validate the DPS interface status. | +| AvdTestBGP | VerifyBGPSpecificPeers | Validate the state of BGP Address Family sessions, including `Path-Selection` for AutoVPN, `Link-State` and `IPv4/IPv6 SR-TE` for CV Pathfinder. | +| AvdTestIPSecurity | VerifySpecificIPSecConn | Validate the establishment of IP security connections for each static peer under the `router path-selection` section of the configuration. | +| AvdTestStun | VerifyStunClient | Validate the presence of a STUN client translation for a given source IPv4 address and port. The list of expected translations for each device is built by searching local interfaces in each path-group. | + +!!! note + More WAN-related tests are available directly in ANTA and can be added using custom catalogs. + They will be progressively added to `eos_validate_state`. diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/input-variables.md b/ansible_collections/arista/avd/roles/eos_designs/docs/input-variables.md index ded343084e0..9a1e2b84505 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/input-variables.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/input-variables.md @@ -52,7 +52,7 @@ See the following examples using the `l3ls-evpn` design: ### 5-stage clos topology support (Super Spine) -- The **eos_designs** role support lager deployments with super-spines (5-stage Clos) and optionally, with dedicated overlay controllers. +- The **eos_designs** role support larger deployments with super-spines (5-stage Clos) and optionally, with dedicated overlay controllers. - 5 stage Clos fabric can be represented as multiple leaf-spine structures (called PODs - Point of Delivery) interconnected by super-spines. - The logic to deploy every leaf-spine POD fabric remains unchanged. - Super-spines can be deployed as a single plane (typically chassis switches) or multiple planes. @@ -110,7 +110,7 @@ For more information please read the [WAN how-to guide](./how-to/wan.md). ## Fabric topology hierarchy
- + 5 stage topology
As per the diagram above, the topology hierarchy is the following: @@ -139,15 +139,15 @@ To customize or create new node types, please refer to [node type customization] ### L3LS EVPN -| Node Type Key | Underlay Router | Uplink Type | Default EVPN Role | L2 Network Services | L3 Network Services | VTEP | MLAG Support | Connected Endpoints | Defaut WAN Role | Default Underlay Routing Protocol | Default Overlay Routing Protocol | -| ------------------ | --------------- | ------------ | ----------------- | ------------------- | ------------------- | ---- | ------------ | ------------------- | --------------- | --------------------------------- | -------------------------------- | -| super_spine | ✅ | p2p | none | ✘ | ✘ | ✘ | ✘ | ✘ | ✘ | eBGP | eBGP | -| spine | ✅ | p2p | server | ✘ | ✘ | ✘ | ✘ | ✘ | ✘ | eBGP | eBGP | -| l3leaf | ✅ | p2p | client | ✅ | ✅ | ✅ | ✅ | ✅ | ✘ | eBGP | eBGP | -| l2leaf | ✘ | port-channel | none | ✅ | ✘ | ✘ | ✅ | ✅ | ✘ | eBGP | eBGP | -| overlay_controller | ✅ | p2p | server | ✘ | ✘ | ✘ | ✘ | ✘ | ✘ | eBGP | eBGP | -| wan_rr | ✅ | p2p | server | ✘ | ✅ | ✅ | ✘ | ✘ | server | none | iBGP | -| wan_router | ✅ | p2p | client | ✘ | ✅ | ✅ | ✘ | ✘ | client | none | iBGP | +| Node Type Key | Underlay Router | Uplink Type | Default EVPN Role | L2 Network Services | L3 Network Services | VTEP | MLAG Support | Connected Endpoints | Default WAN Role | Default Underlay Routing Protocol | Default Overlay Routing Protocol | +| ------------------ | --------------- | ------------ | ----------------- | ------------------- | ------------------- | ---- | ------------ | ------------------- | ---------------- | --------------------------------- | -------------------------------- | +| super_spine | ✅ | p2p | none | ✘ | ✘ | ✘ | ✘ | ✘ | ✘ | eBGP | eBGP | +| spine | ✅ | p2p | server | ✘ | ✘ | ✘ | ✘ | ✘ | ✘ | eBGP | eBGP | +| l3leaf | ✅ | p2p | client | ✅ | ✅ | ✅ | ✅ | ✅ | ✘ | eBGP | eBGP | +| l2leaf | ✘ | port-channel | none | ✅ | ✘ | ✘ | ✅ | ✅ | ✘ | eBGP | eBGP | +| overlay_controller | ✅ | p2p | server | ✘ | ✘ | ✘ | ✘ | ✘ | ✘ | eBGP | eBGP | +| wan_rr | ✅ | p2p | server | ✘ | ✅ | ✅ | ✘ | ✘ | server | none | iBGP | +| wan_router | ✅ | p2p | client | ✘ | ✅ | ✅ | ✘ | ✘ | client | none | iBGP | - `wan_router`: Edge routers for AutoVPN or Edge and Transit routers for CV Pathfinder depending on the `wan_mode` value. - `wan_rr`: AutoVPN RR or Pathfinder depending on the `wan_mode` value. @@ -162,11 +162,11 @@ To customize or create new node types, please refer to [node type customization] ### MPLS -| Node Type Key | Underlay Router | Uplink Type | Default Overlay Role | L2 Network Services | L3 Network Services | VTEP | MLAG Support | Connected Endpoints | -| --------------| --------------- | ----------- | -------------------- | ------------------- | ------------------- | ---- | ------------ | ------------------- | -| p | ✅ | p2p | none | ✘ | ✘ | ✘ | ✘ | ✘ | -| rr | ✅ | p2p | server | ✘ | ✘ | ✘ | ✘ | ✘ | -| pe | ✅ | p2p | client | ✅ | ✅ | ✅ | ✘ | ✅ | +| Node Type Key | Underlay Router | Uplink Type | Default Overlay Role | L2 Network Services | L3 Network Services | VTEP | MLAG Support | Connected Endpoints | +| ------------------ | --------------- | ------------ | -------------------- | ------------------- | ------------------- | ---- | ------------ | ------------------- | +| p | ✅ | p2p | none | ✘ | ✘ | ✘ | ✘ | ✘ | +| rr | ✅ | p2p | server | ✘ | ✘ | ✘ | ✘ | ✘ | +| pe | ✅ | p2p | client | ✅ | ✅ | ✅ | ✘ | ✅ | ## Node type customization @@ -326,7 +326,9 @@ mlag_ip_primary & mlag_ip_secondary: - `{{ mlag_primary_id }}` - `{{ mlag_secondary_id }}` +- `{{ switch_data.combined.mlag_peer_address_family }}` - `{{ switch_data.combined.mlag_peer_ipv4_pool }}` +- `{{ switch_data.combined.mlag_peer_ipv6_pool }}` - All group/hostvars mlag_l3_ip_primary & mlag_l3_ip_secondary: @@ -719,6 +721,12 @@ roles/eos_designs/docs/tables/bfd-settings.md roles/eos_designs/docs/tables/bgp-settings.md --8<-- +## IPv4 ACL settings + +--8<-- +roles/eos_designs/docs/tables/ipv4-acls.md +--8<-- + ## OSPF settings --8<-- @@ -798,6 +806,27 @@ roles/eos_designs/docs/tables/wan-virtual-topologies.md roles/eos_designs/docs/tables/application-classification.md --8<-- +#### Internet Exit policies + +!!! note + + This section is only relevant for CV Pathfinder and not for AutoVPN + +--8<-- +roles/eos_designs/docs/tables/cv-pathfinder-internet-exit-policies.md +--8<-- + +##### Zscaler Internet Exit + +!!! note + + This data model is intended to be autofilled using a lookup plugin. + See the top level key description for more information. + +--8<-- +roles/eos_designs/docs/tables/zscaler-endpoints.md +--8<-- + ## Management settings --8<-- @@ -819,7 +848,7 @@ roles/eos_designs/docs/tables/management-sflow-settings.md ### Flow Tracking Settings --8<-- -roles/eos_designs/docs/tables/flow-tracking-settings.md +roles/eos_designs/docs/tables/management-flow-tracking-settings.md --8<-- ### SNMP settings @@ -989,15 +1018,10 @@ Both data models support variable inheritance from profiles defined under [`port To help provide consistency when configuring EVPN A/A ESI values, arista.avd provides an abstraction in the form of a `short_esi` key. `short_esi` is an abbreviated 3 octets value to encode [Ethernet Segment ID](https://tools.ietf.org/html/rfc7432#section-8.3.1) and LACP ID. - Transformation from abstraction to network values is managed by the following Ansible filter plugins: - - - [`arista.avd.generate_esi`](../../../docs/plugins/Filter_plugins/generate_esi.md) - - [`arista.avd.generate_lacp_id`](../../../docs/plugins/Filter_plugins/generate_lacp_id.md). - - [`arista.avd.generate_route_target`](../../../docs/plugins/Filter_plugins/generate_route_target.md). - The plugins provides the following result: + The abstracted `short_esi: "0303:0202:0101"` is transformed into the following network values: - - *EVPN ESI*: 000:000:0303:0202:0101 + - *EVPN ESI*: 0000:0000:0303:0202:0101 - *LACP ID*: 0303.0202.0101 - *Route Target*: 03:03:02:02:01:01 @@ -1026,6 +1050,7 @@ Both data models support variable inheritance from profiles defined under [`port port_channel: description: PortChanne1 mode: active + ethernet_segment: short_esi: 0303:0202:0101 ``` @@ -1177,7 +1202,7 @@ The network services are grouped by tenants. The definition of a tenant may vary The filtering models defined under [Node type network services configuration](#node-type-network-services-configuration) allows for granular deployment of network services to the fabric leveraging the tenant name and tags applied to the service definition. -- This allows for the re-use of SVI/VLAN IDs across the fabric. +- This allows for the reuse of SVI/VLAN IDs across the fabric. - An error will be returned at runtime in case of duplicate or conflicting SVI/VLAN IDs or VNIs targeted towards the same device. ### Network services settings diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/application-classification.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/application-classification.md index f9509c94826..6fc48f381c1 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/application-classification.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/application-classification.md @@ -23,18 +23,28 @@ | [        prefix_values](## "application_classification.field_sets.ipv4_prefixes.[].prefix_values") | List, items: String | | | | | | [          - <str>](## "application_classification.field_sets.ipv4_prefixes.[].prefix_values.[]") | String | | | | IP prefix (ex 1.2.3.0/24). | | [  applications](## "application_classification.applications") | Dictionary | | | | | - | [    ipv4_applications](## "application_classification.applications.ipv4_applications") | List, items: Dictionary | | | | List of user defined IPv4 applications. | + | [    ipv4_applications](## "application_classification.applications.ipv4_applications") | List, items: Dictionary | | | | List of user defined IPv4 applications. The name should be unique over all defined applications (ipv4 and l4). | | [      - name](## "application_classification.applications.ipv4_applications.[].name") | String | Required, Unique | | | Application name. | | [        src_prefix_set_name](## "application_classification.applications.ipv4_applications.[].src_prefix_set_name") | String | | | | Source prefix set name. | | [        dest_prefix_set_name](## "application_classification.applications.ipv4_applications.[].dest_prefix_set_name") | String | | | | Destination prefix set name. | - | [        protocols](## "application_classification.applications.ipv4_applications.[].protocols") | List, items: String | | | | List of protocols to consider for this application.

To use port field-sets (source, destination or both), the list
must contain only one or two protocols, either `tcp` or `udp`.
When using both protocols, one line is rendered for each in the configuration,
hence the field-sets must have the same value for `tcp_src_port_set_name` and
`udp_src_port_set_name` and for `tcp_dest_port_set_name` and `udp_dest_port_set_name`
if set in order to generate valid configuration in EOS. | + | [        protocols](## "application_classification.applications.ipv4_applications.[].protocols") | List, items: String | | | | List of protocols to consider for this application.
To use port field-sets (source, destination or both), the list
must contain only one or two protocols, either `tcp` or `udp`.
When using both protocols, one line is rendered for each in the configuration,
hence the field-sets must have the same value for `tcp_src_port_set_name` and
`udp_src_port_set_name` and for `tcp_dest_port_set_name` and `udp_dest_port_set_name`
if set in order to generate valid configuration in EOS. | | [          - <str>](## "application_classification.applications.ipv4_applications.[].protocols.[]") | String | | | Valid Values:
- ahp
- esp
- icmp
- igmp
- ospf
- pim
- rsvp
- tcp
- udp
- vrrp | | - | [        protocol_ranges](## "application_classification.applications.ipv4_applications.[].protocol_ranges") | List, items: String | | | | Acccept protocol value(s) or range(s).
Protocol values can be between 1 and 255. | + | [        protocol_ranges](## "application_classification.applications.ipv4_applications.[].protocol_ranges") | List, items: String | | | | Accept protocol value(s) or range(s).
Protocol values can be between 1 and 255. | | [          - <str>](## "application_classification.applications.ipv4_applications.[].protocol_ranges.[]") | String | | | | | - | [        udp_src_port_set_name](## "application_classification.applications.ipv4_applications.[].udp_src_port_set_name") | String | | | | Name of field set for UDP source ports.

When the `protocols` list contain both `tcp` and `udp`, this key value
must be the same as `tcp_src_port_set_name`. | - | [        tcp_src_port_set_name](## "application_classification.applications.ipv4_applications.[].tcp_src_port_set_name") | String | | | | Name of field set for TCP source ports.

When the `protocols` list contain both `tcp` and `udp`, this key value
must be the same as `udp_src_port_set_name`. | - | [        udp_dest_port_set_name](## "application_classification.applications.ipv4_applications.[].udp_dest_port_set_name") | String | | | | Name of field set for UDP destination ports.

When the `protocols` list contain both `tcp` and `udp`, this key value
must be the same as `tcp_dest_port_set_name`. | - | [        tcp_dest_port_set_name](## "application_classification.applications.ipv4_applications.[].tcp_dest_port_set_name") | String | | | | Name of field set for TCP destination ports.

When the `protocols` list contain both `tcp` and `udp`, this key value
must be the same as `udp_dest_port_set_name`. | + | [        udp_src_port_set_name](## "application_classification.applications.ipv4_applications.[].udp_src_port_set_name") | String | | | | Name of field set for UDP source ports.
When the `protocols` list contain both `tcp` and `udp`, this key value
must be the same as `tcp_src_port_set_name`. | + | [        tcp_src_port_set_name](## "application_classification.applications.ipv4_applications.[].tcp_src_port_set_name") | String | | | | Name of field set for TCP source ports.
When the `protocols` list contain both `tcp` and `udp`, this key value
must be the same as `udp_src_port_set_name`. | + | [        udp_dest_port_set_name](## "application_classification.applications.ipv4_applications.[].udp_dest_port_set_name") | String | | | | Name of field set for UDP destination ports.
When the `protocols` list contain both `tcp` and `udp`, this key value
must be the same as `tcp_dest_port_set_name`. | + | [        tcp_dest_port_set_name](## "application_classification.applications.ipv4_applications.[].tcp_dest_port_set_name") | String | | | | Name of field set for TCP destination ports.
When the `protocols` list contain both `tcp` and `udp`, this key value
must be the same as `udp_dest_port_set_name`. | + | [    l4_applications](## "application_classification.applications.l4_applications") | List, items: Dictionary | | | | List of user defined L4 applications. The name should be unique over all defined applications (ipv4 and l4). | + | [      - name](## "application_classification.applications.l4_applications.[].name") | String | Required, Unique | | | Application name. | + | [        protocols](## "application_classification.applications.l4_applications.[].protocols") | List, items: String | | | | List of protocols to consider for this application.
To use port field-sets (source, destination or both), the list
must contain only one or two protocols, either `tcp` or `udp`.
When using both protocols, one line is rendered for each in the configuration,
hence the field-sets must have the same value for `tcp_src_port_set_name` and
`udp_src_port_set_name` and for `tcp_dest_port_set_name` and `udp_dest_port_set_name`
if set in order to generate valid configuration in EOS. | + | [          - <str>](## "application_classification.applications.l4_applications.[].protocols.[]") | String | | | Valid Values:
- ahp
- esp
- icmp
- igmp
- ospf
- pim
- rsvp
- tcp
- udp
- vrrp | | + | [        protocol_ranges](## "application_classification.applications.l4_applications.[].protocol_ranges") | List, items: String | | | | Accept protocol value(s) or range(s).
Protocol values can be between 1 and 255. | + | [          - <str>](## "application_classification.applications.l4_applications.[].protocol_ranges.[]") | String | | | | | + | [        udp_src_port_set_name](## "application_classification.applications.l4_applications.[].udp_src_port_set_name") | String | | | | Name of field set for UDP source ports.
When the `protocols` list contain both `tcp` and `udp`, this key value
must be the same as `tcp_src_port_set_name`. | + | [        tcp_src_port_set_name](## "application_classification.applications.l4_applications.[].tcp_src_port_set_name") | String | | | | Name of field set for TCP source ports.
When the `protocols` list contain both `tcp` and `udp`, this key value
must be the same as `udp_src_port_set_name`. | + | [        udp_dest_port_set_name](## "application_classification.applications.l4_applications.[].udp_dest_port_set_name") | String | | | | Name of field set for UDP destination ports.
When the `protocols` list contain both `tcp` and `udp`, this key value
must be the same as `tcp_dest_port_set_name`. | + | [        tcp_dest_port_set_name](## "application_classification.applications.l4_applications.[].tcp_dest_port_set_name") | String | | | | Name of field set for TCP destination ports.
When the `protocols` list contain both `tcp` and `udp`, this key value
must be the same as `udp_dest_port_set_name`. | | [  application_profiles](## "application_classification.application_profiles") | List, items: Dictionary | | | | Group of applications. | | [    - name](## "application_classification.application_profiles.[].name") | String | | | | Application Profile name. | | [      applications](## "application_classification.application_profiles.[].applications") | List, items: Dictionary | | | | List of applications part of the application profile. | @@ -93,7 +103,7 @@ - applications: - # List of user defined IPv4 applications. + # List of user defined IPv4 applications. The name should be unique over all defined applications (ipv4 and l4). ipv4_applications: # Application name. @@ -106,7 +116,6 @@ dest_prefix_set_name: # List of protocols to consider for this application. - # # To use port field-sets (source, destination or both), the list # must contain only one or two protocols, either `tcp` or `udp`. # When using both protocols, one line is rendered for each in the configuration, @@ -116,31 +125,68 @@ protocols: - - # Acccept protocol value(s) or range(s). + # Accept protocol value(s) or range(s). + # Protocol values can be between 1 and 255. + protocol_ranges: + - + + # Name of field set for UDP source ports. + # When the `protocols` list contain both `tcp` and `udp`, this key value + # must be the same as `tcp_src_port_set_name`. + udp_src_port_set_name: + + # Name of field set for TCP source ports. + # When the `protocols` list contain both `tcp` and `udp`, this key value + # must be the same as `udp_src_port_set_name`. + tcp_src_port_set_name: + + # Name of field set for UDP destination ports. + # When the `protocols` list contain both `tcp` and `udp`, this key value + # must be the same as `tcp_dest_port_set_name`. + udp_dest_port_set_name: + + # Name of field set for TCP destination ports. + # When the `protocols` list contain both `tcp` and `udp`, this key value + # must be the same as `udp_dest_port_set_name`. + tcp_dest_port_set_name: + + # List of user defined L4 applications. The name should be unique over all defined applications (ipv4 and l4). + l4_applications: + + # Application name. + - name: + + # List of protocols to consider for this application. + # To use port field-sets (source, destination or both), the list + # must contain only one or two protocols, either `tcp` or `udp`. + # When using both protocols, one line is rendered for each in the configuration, + # hence the field-sets must have the same value for `tcp_src_port_set_name` and + # `udp_src_port_set_name` and for `tcp_dest_port_set_name` and `udp_dest_port_set_name` + # if set in order to generate valid configuration in EOS. + protocols: + - + + # Accept protocol value(s) or range(s). # Protocol values can be between 1 and 255. protocol_ranges: - # Name of field set for UDP source ports. - # # When the `protocols` list contain both `tcp` and `udp`, this key value # must be the same as `tcp_src_port_set_name`. udp_src_port_set_name: # Name of field set for TCP source ports. - # # When the `protocols` list contain both `tcp` and `udp`, this key value # must be the same as `udp_src_port_set_name`. tcp_src_port_set_name: # Name of field set for UDP destination ports. - # # When the `protocols` list contain both `tcp` and `udp`, this key value # must be the same as `tcp_dest_port_set_name`. udp_dest_port_set_name: # Name of field set for TCP destination ports. - # # When the `protocols` list contain both `tcp` and `udp`, this key value # must be the same as `udp_dest_port_set_name`. tcp_dest_port_set_name: diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/cloudvision-settings.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/cloudvision-settings.md index c7ddc03657e..c77a156a3a2 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/cloudvision-settings.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/cloudvision-settings.md @@ -10,7 +10,7 @@ | [cvp_ingestauth_key](## "cvp_ingestauth_key") | String | | | | On-premise CVP ingest auth key. If set, TerminAttr will be configured with key-based authentication for on-premise CVP.
If not set, TerminAttr will be configured with certificate based authentication:
- On-premise using token onboarding. Default token path is '/tmp/token'.
- CVaaS using token-secure onboarding. Default token path is '/tmp/cv-onboarding-token'.
Token must be copied to the device first. | | [cvp_instance_ip](## "cvp_instance_ip") deprecated | String | | | | IPv4 address or DNS name for CloudVision.
This variable only supports an on-premise single-node cluster or the DNS name of a CloudVision as a Service instance.
This key is deprecated. Support will be removed in AVD version 5.0.0. Use cvp_instance_ips instead. | | [cvp_instance_ips](## "cvp_instance_ips") | List, items: String | | | | List of IPv4 addresses or DNS names for CloudVision.
For on-premise CloudVision enter all the nodes of the cluster.
For CloudVision as a Service enter the DNS name of the instance.
`eos_designs` only supports one CloudVision cluster.
| - | [  - <str>](## "cvp_instance_ips.[]") | String | | | | IPv4 address or DNS name for CloudVision | + | [  - <str>](## "cvp_instance_ips.[]") | String | | | | IPv4 address or DNS name for CloudVision. | | [cvp_token_file](## "cvp_token_file") | String | | | | cvp_token_file is the path to the token file on the switch.
If not set the default locations for on-premise or CVaaS will be used.
See cvp_ingestauth_key for details. | | [terminattr_disable_aaa](## "terminattr_disable_aaa") | Boolean | | `False` | | | | [terminattr_ingestexclude](## "terminattr_ingestexclude") | String | | `/Sysdb/cell/1/agent,/Sysdb/cell/2/agent` | | | @@ -40,7 +40,7 @@ # `eos_designs` only supports one CloudVision cluster. cvp_instance_ips: - # IPv4 address or DNS name for CloudVision + # IPv4 address or DNS name for CloudVision. - # cvp_token_file is the path to the token file on the switch. diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/connected-endpoints-keys.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/connected-endpoints-keys.md index 48ce2e4bba8..81ba87a3ee9 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/connected-endpoints-keys.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/connected-endpoints-keys.md @@ -33,40 +33,40 @@ ```yaml connected_endpoints_keys: - - description: Server + - description: Server. key: servers type: server - - description: Firewall + - description: Firewall. key: firewalls type: firewall - - description: Router + - description: Router. key: routers type: router - - description: Load Balancer + - description: Load Balancer. key: load_balancers type: load_balancer - - description: Storage Array + - description: Storage Array. key: storage_arrays type: storage_array - - description: CPE + - description: CPE. key: cpes type: cpe - - description: Workstation + - description: Workstation. key: workstations type: workstation - - description: Access Point + - description: Access Point. key: access_points type: access_point - - description: Phone + - description: Phone. key: phones type: phone - - description: Printer + - description: Printer. key: printers type: printer - - description: Camera + - description: Camera. key: cameras type: camera - - description: Generic Device + - description: Generic Device. key: generic_devices type: generic_device ``` diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/connected-endpoints.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/connected-endpoints.md index a2674529bb6..0bd8112c194 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/connected-endpoints.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/connected-endpoints.md @@ -14,20 +14,20 @@ | [      - switch_ports](## ".[].adapters.[].switch_ports") | List, items: String | Required | | | List of switch interfaces.
The lists `endpoint_ports`, `switch_ports`, and `switches` must have the same length.
| | [          - <str>](## ".[].adapters.[].switch_ports.[]") | String | | | | Switchport interface. | | [        switches](## ".[].adapters.[].switches") | List, items: String | Required | | | List of switches.
The lists `endpoint_ports`, `switch_ports`, and `switches` must have the same length.
| - | [          - <str>](## ".[].adapters.[].switches.[]") | String | | | | Device | + | [          - <str>](## ".[].adapters.[].switches.[]") | String | | | | Device. | | [        endpoint_ports](## ".[].adapters.[].endpoint_ports") | List, items: String | | | | Endpoint ports is used for description, required unless `description` or `descriptions` is set.
The lists `endpoint_ports`, `switch_ports`, `descriptions` and `switches` must have the same length.
Each list item is one switchport.
| | [          - <str>](## ".[].adapters.[].endpoint_ports.[]") | String | | | | Interface name. | | [        descriptions](## ".[].adapters.[].descriptions") | List | | | | Unique description per port. When set, takes priority over description.
| | [        server_ports](## ".[].adapters.[].server_ports") removed | List, items: String | | | | This key was removed. Support was removed in AVD version 4.0.0. Use endpoint_ports instead. | | [          - <str>](## ".[].adapters.[].server_ports.[]") | String | | | | Used for documentation purposes. | | [        speed](## ".[].adapters.[].speed") | String | | | | Set adapter speed in the format `` or `forced ` or `auto `.
If not specified speed will be auto.
| - | [        description](## ".[].adapters.[].description") | String | | | | By default the description is built leveraging `_`.
When set this key will overide the default value on the physical ports.
| + | [        description](## ".[].adapters.[].description") | String | | | | By default the description is built leveraging `_`.
When set this key will override the default value on the physical ports.
| | [        profile](## ".[].adapters.[].profile") | String | | | | Port-profile name to inherit configuration. | | [        enabled](## ".[].adapters.[].enabled") | Boolean | | `True` | | Administrative state, setting to false will set the port to 'shutdown' in the intended configuration.
| | [        mode](## ".[].adapters.[].mode") | String | | | Valid Values:
- access
- dot1q-tunnel
- trunk
- trunk phone | Interface mode. | | [        mtu](## ".[].adapters.[].mtu") | Integer | | | Min: 68
Max: 65535 | | - | [        l2_mtu](## ".[].adapters.[].l2_mtu") | Integer | | | Min: 68
Max: 65535 | "l2_mtu" should only be defined for platforms supporting the "l2 mtu" CLI
| - | [        l2_mru](## ".[].adapters.[].l2_mru") | Integer | | | Min: 68
Max: 65535 | "l2_mru" should only be defined for platforms supporting the "l2 mru" CLI
| + | [        l2_mtu](## ".[].adapters.[].l2_mtu") | Integer | | | Min: 68
Max: 65535 | "l2_mtu" should only be defined for platforms supporting the "l2 mtu" CLI.
| + | [        l2_mru](## ".[].adapters.[].l2_mru") | Integer | | | Min: 68
Max: 65535 | "l2_mru" should only be defined for platforms supporting the "l2 mru" CLI.
| | [        native_vlan](## ".[].adapters.[].native_vlan") | Integer | | | Min: 1
Max: 4094 | Native VLAN for a trunk port.
If both `native_vlan` and `native_vlan_tag`, `native_vlan_tag` takes precedence.
| | [        native_vlan_tag](## ".[].adapters.[].native_vlan_tag") | Boolean | | `False` | | If both `native_vlan` and `native_vlan_tag`, `native_vlan_tag` takes precedence. | | [        phone_vlan](## ".[].adapters.[].phone_vlan") | Integer | | | Min: 1
Max: 4094 | Phone VLAN for a mode `trunk phone` port.
Requires `mode: trunk phone` to be set. | @@ -40,12 +40,15 @@ | [        spanning_tree_bpduguard](## ".[].adapters.[].spanning_tree_bpduguard") | String | | | Valid Values:
- enabled
- disabled
- True
- False
- true
- false | | | [        flowcontrol](## ".[].adapters.[].flowcontrol") | Dictionary | | | | | | [          received](## ".[].adapters.[].flowcontrol.received") | String | | | Valid Values:
- received
- send
- on | | - | [        qos_profile](## ".[].adapters.[].qos_profile") | String | | | | QOS profile name | + | [        qos_profile](## ".[].adapters.[].qos_profile") | String | | | | QOS profile name. | | [        ptp](## ".[].adapters.[].ptp") | Dictionary | | | | The global PTP profile parameters will be applied to all connected endpoints where `ptp` is manually enabled.
`ptp role master` is set to ensure control over the PTP topology.
| | [          enabled](## ".[].adapters.[].ptp.enabled") | Boolean | | `False` | | | | [          endpoint_role](## ".[].adapters.[].ptp.endpoint_role") | String | | `follower` | Valid Values:
- bmca
- default
- follower | | | [          profile](## ".[].adapters.[].ptp.profile") | String | | `aes67-r16-2016` | Valid Values:
- aes67
- aes67-r16-2016
- smpte2059-2 | | - | [        sflow](## ".[].adapters.[].sflow") | Boolean | | | | Configures sFlow on the interface. Overrides `fabric_sflow` setting.
| + | [        sflow](## ".[].adapters.[].sflow") | Boolean | | | | Configures sFlow on the interface. Overrides `fabric_sflow.endpoints` setting. | + | [        flow_tracking](## ".[].adapters.[].flow_tracking") | Dictionary | | | | Configures flow-tracking on the interface. Overrides `fabric_flow_tracking.endpoints` setting. | + | [          enabled](## ".[].adapters.[].flow_tracking.enabled") | Boolean | | | | | + | [          name](## ".[].adapters.[].flow_tracking.name") | String | | | | Flow tracker name as defined in flow_tracking_settings. | | [        link_tracking](## ".[].adapters.[].link_tracking") | Dictionary | | | | Configure the downstream interfaces of a respective Link Tracking Group.
If `port_channel` is defined in an adapter, then the port-channel interface is configured to be the downstream.
Else all the ethernet interfaces will be configured as downstream -> to configure single-active EVPN multihomed networks.
| | [          enabled](## ".[].adapters.[].link_tracking.enabled") | Boolean | | | | | | [          name](## ".[].adapters.[].link_tracking.name") | String | | | | Tracking group name.
The default group name is taken from fabric variable of the switch, `link_tracking.groups[0].name` with default value being "LT_GROUP1".
Optional if default link_tracking settings are configured on the node.
| @@ -77,18 +80,18 @@ | [            native_vlan_membership_egress](## ".[].adapters.[].dot1x.unauthorized.native_vlan_membership_egress") | Boolean | | | | | | [        poe](## ".[].adapters.[].poe") | Dictionary | | | | Power Over Ethernet settings applied on port. Only configured if platform supports PoE. | | [          disabled](## ".[].adapters.[].poe.disabled") | Boolean | | `False` | | Disable PoE on a POE capable port. PoE is enabled on all ports that support it by default in EOS. | - | [          priority](## ".[].adapters.[].poe.priority") | String | | | Valid Values:
- critical
- high
- medium
- low | Prioritize a port's power in the event that one of the switch's power supplies loses power | - | [          reboot](## ".[].adapters.[].poe.reboot") | Dictionary | | | | Set the PoE power behavior for a PoE port when the system is rebooted | - | [            action](## ".[].adapters.[].poe.reboot.action") | String | | | Valid Values:
- maintain
- power-off | PoE action for interface | - | [          link_down](## ".[].adapters.[].poe.link_down") | Dictionary | | | | Set the PoE power behavior for a PoE port when the port goes down | - | [            action](## ".[].adapters.[].poe.link_down.action") | String | | | Valid Values:
- maintain
- power-off | PoE action for interface | + | [          priority](## ".[].adapters.[].poe.priority") | String | | | Valid Values:
- critical
- high
- medium
- low | Prioritize a port's power in the event that one of the switch's power supplies loses power. | + | [          reboot](## ".[].adapters.[].poe.reboot") | Dictionary | | | | Set the PoE power behavior for a PoE port when the system is rebooted. | + | [            action](## ".[].adapters.[].poe.reboot.action") | String | | | Valid Values:
- maintain
- power-off | PoE action for interface. | + | [          link_down](## ".[].adapters.[].poe.link_down") | Dictionary | | | | Set the PoE power behavior for a PoE port when the port goes down. | + | [            action](## ".[].adapters.[].poe.link_down.action") | String | | | Valid Values:
- maintain
- power-off | PoE action for interface. | | [            power_off_delay](## ".[].adapters.[].poe.link_down.power_off_delay") | Integer | | | Min: 1
Max: 86400 | Number of seconds to delay shutting the power off after a link down event occurs. Default value is 5 seconds in EOS. | - | [          shutdown](## ".[].adapters.[].poe.shutdown") | Dictionary | | | | Set the PoE power behavior for a PoE port when the port is admin down | - | [            action](## ".[].adapters.[].poe.shutdown.action") | String | | | Valid Values:
- maintain
- power-off | PoE action for interface | + | [          shutdown](## ".[].adapters.[].poe.shutdown") | Dictionary | | | | Set the PoE power behavior for a PoE port when the port is admin down. | + | [            action](## ".[].adapters.[].poe.shutdown.action") | String | | | Valid Values:
- maintain
- power-off | PoE action for interface. | | [          limit](## ".[].adapters.[].poe.limit") | Dictionary | | | | Override the hardware-negotiated power limit using either wattage or a power class. Note that if using a power class, AVD will automatically convert the class value to the wattage value corresponding to that power class. | | [            class](## ".[].adapters.[].poe.limit.class") | Integer | | | Min: 0
Max: 8 | | | [            watts](## ".[].adapters.[].poe.limit.watts") | String | | | | | - | [            fixed](## ".[].adapters.[].poe.limit.fixed") | Boolean | | | | Set to ignore hardware classification | + | [            fixed](## ".[].adapters.[].poe.limit.fixed") | Boolean | | | | Set to ignore hardware classification. | | [          negotiation_lldp](## ".[].adapters.[].poe.negotiation_lldp") | Boolean | | | | Disable to prevent port from negotiating power with powered devices over LLDP. Enabled by default in EOS. | | [          legacy_detect](## ".[].adapters.[].poe.legacy_detect") | Boolean | | | | Allow a subset of legacy devices to work with the PoE switch. Disabled by default in EOS because it can cause false positive detections. | | [        storm_control](## ".[].adapters.[].storm_control") | Dictionary | | | | Storm control settings applied on port toward the endpoint. | @@ -124,7 +127,7 @@ | [              sample](## ".[].adapters.[].monitor_sessions.[].session_settings.sample") | Integer | | | | | | [              truncate](## ".[].adapters.[].monitor_sessions.[].session_settings.truncate") | Dictionary | | | | | | [                enabled](## ".[].adapters.[].monitor_sessions.[].session_settings.truncate.enabled") | Boolean | | | | | - | [                size](## ".[].adapters.[].monitor_sessions.[].session_settings.truncate.size") | Integer | | | | Size in bytes | + | [                size](## ".[].adapters.[].monitor_sessions.[].session_settings.truncate.size") | Integer | | | | Size in bytes. | | [        ethernet_segment](## ".[].adapters.[].ethernet_segment") | Dictionary | | | | Settings for all or single-active EVPN multihoming. | | [          short_esi](## ".[].adapters.[].ethernet_segment.short_esi") | String | Required | | | In format xxxx:xxxx:xxxx or "auto".
Define a manual short-esi (be careful using this on profiles) or set the value to "auto" to automatically generate the value.
Please see the notes under "EVPN A/A ESI dual and single-attached endpoint scenarios" before setting `short_esi: auto`.
| | [          redundancy](## ".[].adapters.[].ethernet_segment.redundancy") | String | | | Valid Values:
- all-active
- single-active | If omitted, Port-Channels use the EOS default of all-active.
If omitted, Ethernet interfaces are configured as single-active.
| @@ -137,6 +140,7 @@ | [          channel_id](## ".[].adapters.[].port_channel.channel_id") | Integer | | | | Port-Channel ID.
If no channel_id is specified, an id is generated from the first switch port in the port channel.
| | [          description](## ".[].adapters.[].port_channel.description") | String | | | | By default the description is built leveraging `` name or `adapter.description` when defined.
When this key is defined, it will append its content to the physical port description.
| | [          enabled](## ".[].adapters.[].port_channel.enabled") | Boolean | | `True` | | Port-Channel administrative state.
Setting to false will set port to 'shutdown' in intended configuration.
| + | [          ptp_mpass](## ".[].adapters.[].port_channel.ptp_mpass") | Boolean | | `False` | | When MPASS is enabled on an MLAG port-channel, MLAG peers coordinate to function as a single PTP logical device.
Arista PTP enabled devices always place PTP messages on the same physical link within the port-channel.
Hence, MPASS is needed only on MLAG port-channels connected to non-Arista devices. | | [          esi](## ".[].adapters.[].port_channel.esi") removed | String | | | | Format xxxx:xxxx:xxxx.This key was removed. Support was removed in AVD version 4.0.0. Use short_esi instead. | | [          short_esi](## ".[].adapters.[].port_channel.short_esi") deprecated | String | | | | In format xxxx:xxxx:xxxx or "auto".This key is deprecated. Support will be removed in AVD version 5.0.0. Use ethernet_segment.short_esi instead. | | [          lacp_fallback](## ".[].adapters.[].port_channel.lacp_fallback") | Dictionary | | | | LACP fallback configuration. | @@ -148,8 +152,8 @@ | [            mode](## ".[].adapters.[].port_channel.lacp_timer.mode") | String | | | Valid Values:
- normal
- fast | LACP mode for interface members. | | [            multiplier](## ".[].adapters.[].port_channel.lacp_timer.multiplier") | Integer | | | | Number of LACP BPDUs lost before deeming the peer down. EOS default is 3. | | [          subinterfaces](## ".[].adapters.[].port_channel.subinterfaces") | List, items: Dictionary | | | | Port-Channel L2 Subinterfaces
Subinterfaces are only supported on routed port-channels, which means they cannot be configured on MLAG port-channels.
Setting short_esi: auto generates the short_esi automatically using a hash of configuration elements.
Please see the notes under "EVPN A/A ESI dual-attached endpoint scenario" before setting short_esi: auto.
| - | [            - number](## ".[].adapters.[].port_channel.subinterfaces.[].number") | Integer | | | | Subinterface number | - | [              short_esi](## ".[].adapters.[].port_channel.subinterfaces.[].short_esi") | String | | | | In format xxxx:xxxx:xxxx or "auto"
Required for multihomed port-channels with subinterfaces
| + | [            - number](## ".[].adapters.[].port_channel.subinterfaces.[].number") | Integer | | | | Subinterface number. | + | [              short_esi](## ".[].adapters.[].port_channel.subinterfaces.[].short_esi") | String | | | | In format xxxx:xxxx:xxxx or "auto".
Required for multihomed port-channels with subinterfaces.
| | [              vlan_id](## ".[].adapters.[].port_channel.subinterfaces.[].vlan_id") | Integer | | | Min: 1
Max: 4094 | VLAN ID to bridge.
Default is subinterface number.
| | [              encapsulation_vlan](## ".[].adapters.[].port_channel.subinterfaces.[].encapsulation_vlan") | Dictionary | | | | Client VLAN ID encapsulation.
Default is subinterface number.
| | [                client_dot1q](## ".[].adapters.[].port_channel.subinterfaces.[].encapsulation_vlan.client_dot1q") | Integer | | | Min: 1
Max: 4094 | | @@ -187,7 +191,7 @@ # The lists `endpoint_ports`, `switch_ports`, and `switches` must have the same length. switches: # required - # Device + # Device. - # Endpoint ports is used for description, required unless `description` or `descriptions` is set. @@ -206,7 +210,7 @@ speed: # By default the description is built leveraging `_`. - # When set this key will overide the default value on the physical ports. + # When set this key will override the default value on the physical ports. description: # Port-profile name to inherit configuration. @@ -219,10 +223,10 @@ mode: mtu: - # "l2_mtu" should only be defined for platforms supporting the "l2 mtu" CLI + # "l2_mtu" should only be defined for platforms supporting the "l2 mtu" CLI. l2_mtu: - # "l2_mru" should only be defined for platforms supporting the "l2 mru" CLI + # "l2_mru" should only be defined for platforms supporting the "l2 mru" CLI. l2_mru: # Native VLAN for a trunk port. @@ -253,7 +257,7 @@ flowcontrol: received: - # QOS profile name + # QOS profile name. qos_profile: # The global PTP profile parameters will be applied to all connected endpoints where `ptp` is manually enabled. @@ -263,9 +267,16 @@ endpoint_role: profile: - # Configures sFlow on the interface. Overrides `fabric_sflow` setting. + # Configures sFlow on the interface. Overrides `fabric_sflow.endpoints` setting. sflow: + # Configures flow-tracking on the interface. Overrides `fabric_flow_tracking.endpoints` setting. + flow_tracking: + enabled: + + # Flow tracker name as defined in flow_tracking_settings. + name: + # Configure the downstream interfaces of a respective Link Tracking Group. # If `port_channel` is defined in an adapter, then the port-channel interface is configured to be the downstream. # Else all the ethernet interfaces will be configured as downstream -> to configure single-active EVPN multihomed networks. @@ -313,28 +324,28 @@ # Disable PoE on a POE capable port. PoE is enabled on all ports that support it by default in EOS. disabled: - # Prioritize a port's power in the event that one of the switch's power supplies loses power + # Prioritize a port's power in the event that one of the switch's power supplies loses power. priority: - # Set the PoE power behavior for a PoE port when the system is rebooted + # Set the PoE power behavior for a PoE port when the system is rebooted. reboot: - # PoE action for interface + # PoE action for interface. action: - # Set the PoE power behavior for a PoE port when the port goes down + # Set the PoE power behavior for a PoE port when the port goes down. link_down: - # PoE action for interface + # PoE action for interface. action: # Number of seconds to delay shutting the power off after a link down event occurs. Default value is 5 seconds in EOS. power_off_delay: - # Set the PoE power behavior for a PoE port when the port is admin down + # Set the PoE power behavior for a PoE port when the port is admin down. shutdown: - # PoE action for interface + # PoE action for interface. action: # Override the hardware-negotiated power limit using either wattage or a power class. Note that if using a power class, AVD will automatically convert the class value to the wattage value corresponding to that power class. @@ -342,7 +353,7 @@ class: watts: - # Set to ignore hardware classification + # Set to ignore hardware classification. fixed: # Disable to prevent port from negotiating power with powered devices over LLDP. Enabled by default in EOS. @@ -427,7 +438,7 @@ truncate: enabled: - # Size in bytes + # Size in bytes. size: # Settings for all or single-active EVPN multihoming. @@ -476,6 +487,11 @@ # Setting to false will set port to 'shutdown' in intended configuration. enabled: + # When MPASS is enabled on an MLAG port-channel, MLAG peers coordinate to function as a single PTP logical device. + # Arista PTP enabled devices always place PTP messages on the same physical link within the port-channel. + # Hence, MPASS is needed only on MLAG port-channels connected to non-Arista devices. + ptp_mpass: + # In format xxxx:xxxx:xxxx or "auto". # This key is deprecated. # Support will be removed in AVD version 5.0.0. @@ -513,11 +529,11 @@ # Please see the notes under "EVPN A/A ESI dual-attached endpoint scenario" before setting short_esi: auto. subinterfaces: - # Subinterface number + # Subinterface number. - number: - # In format xxxx:xxxx:xxxx or "auto" - # Required for multihomed port-channels with subinterfaces + # In format xxxx:xxxx:xxxx or "auto". + # Required for multihomed port-channels with subinterfaces. short_esi: # VLAN ID to bridge. diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/core-interfaces.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/core-interfaces.md index 3f12a08fbb0..2ded1723cab 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/core-interfaces.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/core-interfaces.md @@ -42,6 +42,10 @@ | [      ptp](## "core_interfaces.p2p_links_profiles.[].ptp") | Dictionary | | | | PTP parameters. | | [        enabled](## "core_interfaces.p2p_links_profiles.[].ptp.enabled") | Boolean | | `False` | | Enable PTP. | | [      sflow](## "core_interfaces.p2p_links_profiles.[].sflow") | Boolean | | | | Enable sFlow. Overrides `fabric_sflow` setting. | + | [      underlay_multicast](## "core_interfaces.p2p_links_profiles.[].underlay_multicast") | Boolean | | `False` | | Enable PIM sparse mode. Requires `include_in_underlay_protocol` and the global `underlay_multicast` to be `true`. | + | [      flow_tracking](## "core_interfaces.p2p_links_profiles.[].flow_tracking") | Dictionary | | | | Enable flow-tracking. Overrides `fabric_flow_tracking` setting. | + | [        enabled](## "core_interfaces.p2p_links_profiles.[].flow_tracking.enabled") | Boolean | | | | | + | [        name](## "core_interfaces.p2p_links_profiles.[].flow_tracking.name") | String | | | | Flow tracker name as defined in flow_tracking_settings. | | [      qos_profile](## "core_interfaces.p2p_links_profiles.[].qos_profile") | String | | | | QOS service profile. | | [      macsec_profile](## "core_interfaces.p2p_links_profiles.[].macsec_profile") | String | | | | MAC security profile. | | [      port_channel](## "core_interfaces.p2p_links_profiles.[].port_channel") | Dictionary | | | | Port-channel parameters. | @@ -53,7 +57,7 @@ | [            channel_id](## "core_interfaces.p2p_links_profiles.[].port_channel.nodes_child_interfaces.[].channel_id") | Integer | | | | Port-Channel ID. If no channel_id is specified, an id is generated from the first switch port in the port channel. | | [      raw_eos_cli](## "core_interfaces.p2p_links_profiles.[].raw_eos_cli") | String | | | | EOS CLI rendered directly on the point-to-point interface in the final EOS configuration. | | [      routing_protocol](## "core_interfaces.p2p_links_profiles.[].routing_protocol") | String | | | Valid Values:
- ebgp | Enables deviation of the routing protocol used on this link from the fabric underlay default.
- ebgp: Enforce plain IPv4 BGP peering | - | [      structured_config](## "core_interfaces.p2p_links_profiles.[].structured_config") | Dictionary | | | | Custom structured config for interfaces
Note! The content of this dictionary is _not_ validated by the schema, since it can be either ethernet_interfaces or port_channel_interfaces. | + | [      structured_config](## "core_interfaces.p2p_links_profiles.[].structured_config") | Dictionary | | | | Custom structured config for interfaces.
Note! The content of this dictionary is _not_ validated by the schema, since it can be either ethernet_interfaces or port_channel_interfaces. | | [  p2p_links](## "core_interfaces.p2p_links") | List, items: Dictionary | | | | | | [    - nodes](## "core_interfaces.p2p_links.[].nodes") | List, items: String | Required | | | Nodes where this link should be configured. | | [        - <str>](## "core_interfaces.p2p_links.[].nodes.[]") | String | | | | The values can be < node_a >, < node_b >.
ex.- [ core-1-isis-sr-ldp, core-2-ospf-ldp ].
| @@ -84,6 +88,10 @@ | [      ptp](## "core_interfaces.p2p_links.[].ptp") | Dictionary | | | | PTP parameters. | | [        enabled](## "core_interfaces.p2p_links.[].ptp.enabled") | Boolean | | `False` | | Enable PTP. | | [      sflow](## "core_interfaces.p2p_links.[].sflow") | Boolean | | | | Enable sFlow. Overrides `fabric_sflow` setting. | + | [      underlay_multicast](## "core_interfaces.p2p_links.[].underlay_multicast") | Boolean | | `False` | | Enable PIM sparse mode. Requires `include_in_underlay_protocol` and the global `underlay_multicast` to be `true`. | + | [      flow_tracking](## "core_interfaces.p2p_links.[].flow_tracking") | Dictionary | | | | Enable flow-tracking. Overrides `fabric_flow_tracking` setting. | + | [        enabled](## "core_interfaces.p2p_links.[].flow_tracking.enabled") | Boolean | | | | | + | [        name](## "core_interfaces.p2p_links.[].flow_tracking.name") | String | | | | Flow tracker name as defined in flow_tracking_settings. | | [      qos_profile](## "core_interfaces.p2p_links.[].qos_profile") | String | | | | QOS service profile. | | [      macsec_profile](## "core_interfaces.p2p_links.[].macsec_profile") | String | | | | MAC security profile. | | [      port_channel](## "core_interfaces.p2p_links.[].port_channel") | Dictionary | | | | Port-channel parameters. | @@ -95,7 +103,7 @@ | [            channel_id](## "core_interfaces.p2p_links.[].port_channel.nodes_child_interfaces.[].channel_id") | Integer | | | | Port-Channel ID. If no channel_id is specified, an id is generated from the first switch port in the port channel. | | [      raw_eos_cli](## "core_interfaces.p2p_links.[].raw_eos_cli") | String | | | | EOS CLI rendered directly on the point-to-point interface in the final EOS configuration. | | [      routing_protocol](## "core_interfaces.p2p_links.[].routing_protocol") | String | | | Valid Values:
- ebgp | Enables deviation of the routing protocol used on this link from the fabric underlay default.
- ebgp: Enforce plain IPv4 BGP peering | - | [      structured_config](## "core_interfaces.p2p_links.[].structured_config") | Dictionary | | | | Custom structured config for interfaces
Note! The content of this dictionary is _not_ validated by the schema, since it can be either ethernet_interfaces or port_channel_interfaces. | + | [      structured_config](## "core_interfaces.p2p_links.[].structured_config") | Dictionary | | | | Custom structured config for interfaces.
Note! The content of this dictionary is _not_ validated by the schema, since it can be either ethernet_interfaces or port_channel_interfaces. | === "YAML" @@ -194,6 +202,16 @@ # Enable sFlow. Overrides `fabric_sflow` setting. sflow: + # Enable PIM sparse mode. Requires `include_in_underlay_protocol` and the global `underlay_multicast` to be `true`. + underlay_multicast: + + # Enable flow-tracking. Overrides `fabric_flow_tracking` setting. + flow_tracking: + enabled: + + # Flow tracker name as defined in flow_tracking_settings. + name: + # QOS service profile. qos_profile: @@ -220,7 +238,7 @@ # - ebgp: Enforce plain IPv4 BGP peering routing_protocol: - # Custom structured config for interfaces + # Custom structured config for interfaces. # Note! The content of this dictionary is _not_ validated by the schema, since it can be either ethernet_interfaces or port_channel_interfaces. structured_config: p2p_links: @@ -306,6 +324,16 @@ # Enable sFlow. Overrides `fabric_sflow` setting. sflow: + # Enable PIM sparse mode. Requires `include_in_underlay_protocol` and the global `underlay_multicast` to be `true`. + underlay_multicast: + + # Enable flow-tracking. Overrides `fabric_flow_tracking` setting. + flow_tracking: + enabled: + + # Flow tracker name as defined in flow_tracking_settings. + name: + # QOS service profile. qos_profile: @@ -332,7 +360,7 @@ # - ebgp: Enforce plain IPv4 BGP peering routing_protocol: - # Custom structured config for interfaces + # Custom structured config for interfaces. # Note! The content of this dictionary is _not_ validated by the schema, since it can be either ethernet_interfaces or port_channel_interfaces. structured_config: ``` diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/cv-pathfinder-internet-exit-policies.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/cv-pathfinder-internet-exit-policies.md new file mode 100644 index 00000000000..4dc5f91afdb --- /dev/null +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/cv-pathfinder-internet-exit-policies.md @@ -0,0 +1,74 @@ + +=== "Table" + + | Variable | Type | Required | Default | Value Restrictions | Description | + | -------- | ---- | -------- | ------- | ------------------ | ----------- | + | [cv_pathfinder_internet_exit_policies](## "cv_pathfinder_internet_exit_policies") | List, items: Dictionary | | | | PREVIEW: These keys are in preview mode.

List of internet-exit policies used for the WAN configuration. | + | [  - name](## "cv_pathfinder_internet_exit_policies.[].name") | String | Required, Unique | | | Internet-exit policy name. | + | [    type](## "cv_pathfinder_internet_exit_policies.[].type") | String | Required | | Valid Values:
- direct
- zscaler | Internet-exit policy type.
direct: Exit directly over wan interfaces
zscaler: Exit using Zscaler secure web gateway service | + | [    fallback_to_system_default](## "cv_pathfinder_internet_exit_policies.[].fallback_to_system_default") | Boolean | | `True` | | Add system default exit-group at the end of the policy. | + | [    zscaler](## "cv_pathfinder_internet_exit_policies.[].zscaler") | Dictionary | | | | Zscaler information. Only used if `type` is 'zscaler'. | + | [      ipsec_key_salt](## "cv_pathfinder_internet_exit_policies.[].zscaler.ipsec_key_salt") | String | Required | | | "Salt" used for auto generation of encryption keys for IPsec tunnels to Zscaler.
The keys will be generated as a hash of `salt__`.
Since this salt can be used to deduct the encryption key, it is recommeneded to use vault. | + | [      domain_name](## "cv_pathfinder_internet_exit_policies.[].zscaler.domain_name") | String | Required | | | Domain name as configured in Zscaler for the tenant. Used as UFQDN suffix for authentication. | + | [      encrypt_traffic](## "cv_pathfinder_internet_exit_policies.[].zscaler.encrypt_traffic") | Boolean | | `True` | | When `true` the traffic going over the tunnels will be encrypted with AES-256-GCM. Otherwise the traffic will be using NULL encryption.
Note that encryption requires a subscription on the Zscaler account. | + | [      download_bandwidth](## "cv_pathfinder_internet_exit_policies.[].zscaler.download_bandwidth") | Integer | | | | Maximum allowed download bandwidth in Mbps for each device using this policy. | + | [      upload_bandwidth](## "cv_pathfinder_internet_exit_policies.[].zscaler.upload_bandwidth") | Integer | | | | Maximum allowed upload bandwidth in Mbps for each device using this policy. | + | [      firewall](## "cv_pathfinder_internet_exit_policies.[].zscaler.firewall") | Dictionary | | | | | + | [        enabled](## "cv_pathfinder_internet_exit_policies.[].zscaler.firewall.enabled") | Boolean | | `False` | | Enforce firewall controls. | + | [        ips](## "cv_pathfinder_internet_exit_policies.[].zscaler.firewall.ips") | Boolean | | `False` | | Enable IPS Controls for the firewall. | + | [      acceptable_use_policy](## "cv_pathfinder_internet_exit_policies.[].zscaler.acceptable_use_policy") | Boolean | | `False` | | Display an Acceptable Use Policy (AUP) and require users to accept it. | + +=== "YAML" + + ```yaml + # PREVIEW: These keys are in preview mode. + # + # List of internet-exit policies used for the WAN configuration. + cv_pathfinder_internet_exit_policies: + + # Internet-exit policy name. + - name: + + # Internet-exit policy type. + # direct: Exit directly over wan interfaces + # zscaler: Exit using Zscaler secure web gateway service + type: + + # Add system default exit-group at the end of the policy. + fallback_to_system_default: + + # Zscaler information. Only used if `type` is 'zscaler'. + zscaler: + + # "Salt" used for auto generation of encryption keys for IPsec tunnels to Zscaler. + # The keys will be generated as a hash of `salt__`. + # Since this salt can be used to deduct the encryption key, it is recommeneded to use vault. + ipsec_key_salt: + + # Domain name as configured in Zscaler for the tenant. Used as UFQDN suffix for authentication. + domain_name: + + # When `true` the traffic going over the tunnels will be encrypted with AES-256-GCM. Otherwise the traffic will be using NULL encryption. + # Note that encryption requires a subscription on the Zscaler account. + encrypt_traffic: + + # Maximum allowed download bandwidth in Mbps for each device using this policy. + download_bandwidth: + + # Maximum allowed upload bandwidth in Mbps for each device using this policy. + upload_bandwidth: + firewall: + + # Enforce firewall controls. + enabled: + + # Enable IPS Controls for the firewall. + ips: + + # Display an Acceptable Use Policy (AUP) and require users to accept it. + acceptable_use_policy: + ``` diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/evpn-settings.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/evpn-settings.md index dd3817340c1..c597fe72c99 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/evpn-settings.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/evpn-settings.md @@ -22,7 +22,7 @@ | [evpn_rd_type](## "evpn_rd_type") removed | Dictionary | | | | This key was removed. Support was removed in AVD version 4.0.0. Use overlay_rd_type instead. | | [evpn_rt_type](## "evpn_rt_type") removed | Dictionary | | | | This key was removed. Support was removed in AVD version 4.0.0. Use overlay_rt_type instead. | | [evpn_short_esi_prefix](## "evpn_short_esi_prefix") | String | | `0000:0000:` | | Configure prefix for "short_esi" values. | - | [evpn_vlan_aware_bundles](## "evpn_vlan_aware_bundles") | Boolean | | `False` | | Enable vlan aware bundles for EVPN MAC-VRF. | + | [evpn_vlan_aware_bundles](## "evpn_vlan_aware_bundles") | Boolean | | `False` | | Enable VLAN aware bundles for every EVPN MAC-VRF.
If set to `true` all SVIs in a VRF are configured in a vlan-aware-bundle using the VRF name as the bundle name. `l2vlans` are bundled in vlan-aware-bundles using the VLAN name as the bundle name.

The `evpn_vlan_bundle` option under `svis` and `l2vlans` takes precedence and overrides this behavior. Per svi/l2vlan `evpn_vlan_bundle` also works when this setting is disabled which allow mixing vlan-aware-bundles with regular MAC-VRFs. | | [fabric_evpn_encapsulation](## "fabric_evpn_encapsulation") | String | | `vxlan` | Valid Values:
- vxlan
- mpls | Should be set to mpls for evpn-mpls scenario. | | [vxlan_vlan_aware_bundles](## "vxlan_vlan_aware_bundles") removed | Boolean | | `False` | | This key was removed. Support was removed in AVD version 4.0.0. Use evpn_vlan_aware_bundles instead. | @@ -79,7 +79,10 @@ # Configure prefix for "short_esi" values. evpn_short_esi_prefix: - # Enable vlan aware bundles for EVPN MAC-VRF. + # Enable VLAN aware bundles for every EVPN MAC-VRF. + # If set to `true` all SVIs in a VRF are configured in a vlan-aware-bundle using the VRF name as the bundle name. `l2vlans` are bundled in vlan-aware-bundles using the VLAN name as the bundle name. + # + # The `evpn_vlan_bundle` option under `svis` and `l2vlans` takes precedence and overrides this behavior. Per svi/l2vlan `evpn_vlan_bundle` also works when this setting is disabled which allow mixing vlan-aware-bundles with regular MAC-VRFs. evpn_vlan_aware_bundles: # Should be set to mpls for evpn-mpls scenario. diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/evpn-vlan-bundles.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/evpn-vlan-bundles.md index f93fb51c8ac..4c246c4e0d1 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/evpn-vlan-bundles.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/evpn-vlan-bundles.md @@ -10,8 +10,8 @@ | [evpn_vlan_bundles](## "evpn_vlan_bundles") | List, items: Dictionary | | | | | | [  - name](## "evpn_vlan_bundles.[].name") | String | Required, Unique | | | Specify an EVPN vlan-aware-bundle name.
EVPN vlan-aware-bundles group L2 VLANs and define common settings.
| | [    id](## "evpn_vlan_bundles.[].id") | Integer | Required | | | "id" may be used for vlan-aware-bundle RD/RT ID so it should not overlap with l2vlan IDs which are not part of this bundle.
See "overlay_rd_type" and "overlay_rt_type" for details.
| - | [    rt_override](## "evpn_vlan_bundles.[].rt_override") | String | | | | By default the MAC VRF bundle RT will be derived from mac_vrf_id_base + bundle_id.
The rt_override allows us to override this value and statically define it.
rt_override will default to vni_override if set.

rt_override supports two formats:
- A single number which will be used in the RT fields instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rt_type' for details).
- A full RT string with colon seperator which will override the full RT.
| - | [    rd_override](## "evpn_vlan_bundles.[].rd_override") | String | | | | By default the MAC VRF bundle RD will be derived from mac_vrf_id_base + bundle_id.
The rt_override allows us to override this value and statically define it.
rd_override will default to rt_override or vni_override if set.

rd_override supports two formats:
- A single number which will be used in the RD assigned number field instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rd_type' for details).
- A full RD string with colon seperator which will override the full RD.
| + | [    rt_override](## "evpn_vlan_bundles.[].rt_override") | String | | | | By default the MAC VRF bundle RT will be derived from mac_vrf_id_base + bundle_id.
The rt_override allows us to override this value and statically define it.
rt_override will default to vni_override if set.

rt_override supports two formats:
- A single number which will be used in the RT fields instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rt_type' for details).
- A full RT string with colon separator which will override the full RT.
| + | [    rd_override](## "evpn_vlan_bundles.[].rd_override") | String | | | | By default the MAC VRF bundle RD will be derived from mac_vrf_id_base + bundle_id.
The rt_override allows us to override this value and statically define it.
rd_override will default to rt_override or vni_override if set.

rd_override supports two formats:
- A single number which will be used in the RD assigned number field instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rd_type' for details).
- A full RD string with colon separator which will override the full RD.
| | [    evpn_l2_multi_domain](## "evpn_vlan_bundles.[].evpn_l2_multi_domain") | Boolean | | | | Explicitly extend VLAN-Aware Bundle to remote EVPN domains.
Overrides `.[].evpn_l2_multi_domain`.
| | [    bgp](## "evpn_vlan_bundles.[].bgp") | Dictionary | | | | | | [      raw_eos_cli](## "evpn_vlan_bundles.[].bgp.raw_eos_cli") | String | | | | EOS cli commands rendered on router_bgp.vlans-aware-bundle.
| @@ -35,7 +35,7 @@ # # rt_override supports two formats: # - A single number which will be used in the RT fields instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rt_type' for details). - # - A full RT string with colon seperator which will override the full RT. + # - A full RT string with colon separator which will override the full RT. rt_override: # By default the MAC VRF bundle RD will be derived from mac_vrf_id_base + bundle_id. @@ -44,7 +44,7 @@ # # rd_override supports two formats: # - A single number which will be used in the RD assigned number field instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rd_type' for details). - # - A full RD string with colon seperator which will override the full RD. + # - A full RD string with colon separator which will override the full RD. rd_override: # Explicitly extend VLAN-Aware Bundle to remote EVPN domains. diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/fabric-ip-addressing.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/fabric-ip-addressing.md index 8ad6497e719..5a31cd414eb 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/fabric-ip-addressing.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/fabric-ip-addressing.md @@ -11,6 +11,7 @@ | [  mlag](## "fabric_ip_addressing.mlag") | Dictionary | | | | | | [    algorithm](## "fabric_ip_addressing.mlag.algorithm") | String | | `first_id` | Valid Values:
- first_id
- odd_id
- same_subnet | This variable defines the Multi-chassis Link Aggregation (MLAG) algorithm used.
Each MLAG link will have a /31* subnet with each subnet allocated from the relevant MLAG pool via a calculated offset.
The offset is calculated using one of the following algorithms:
- first_id: `(mlag_primary_id - 1) * 2` where `mlag_primary_id` is the ID of the first node defined under the node_group.
This allocation method will skip every other /31* subnet making it less space efficient than `odd_id`.
- odd_id: `(odd_id - 1) / 2`. Requires the node_group to have a node with an odd ID and a node with an even ID.
- same_subnet: the offset will always be zero.
This allocation method will cause every MLAG link to be addressed with the same /31* subnet.
\* - The prefix length is configurable with a default of /31. | | [    ipv4_prefix_length](## "fabric_ip_addressing.mlag.ipv4_prefix_length") | Integer | | `31` | Min: 1
Max: 31 | IPv4 prefix length used for MLAG peer-vlan and L3 point-to-point SVIs over the MLAG peer-link. | + | [    ipv6_prefix_length](## "fabric_ip_addressing.mlag.ipv6_prefix_length") | Integer | | `64` | Min: 1
Max: 127 | IPv6 prefix length used for MLAG peer-vlan and L3 point-to-point SVIs over the MLAG peer-link. | | [  p2p_uplinks](## "fabric_ip_addressing.p2p_uplinks") | Dictionary | | | | | | [    ipv4_prefix_length](## "fabric_ip_addressing.p2p_uplinks.ipv4_prefix_length") | Integer | | `31` | Min: 1
Max: 31 | IPv4 prefix length used for L3 point-to-point uplinks. | @@ -33,6 +34,9 @@ # IPv4 prefix length used for MLAG peer-vlan and L3 point-to-point SVIs over the MLAG peer-link. ipv4_prefix_length: + + # IPv6 prefix length used for MLAG peer-vlan and L3 point-to-point SVIs over the MLAG peer-link. + ipv6_prefix_length: p2p_uplinks: # IPv4 prefix length used for L3 point-to-point uplinks. diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/fabric-settings.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/fabric-settings.md index 19b5052566d..9a466d70285 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/fabric-settings.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/fabric-settings.md @@ -12,6 +12,7 @@ | [only_local_vlan_trunk_groups](## "only_local_vlan_trunk_groups") | Boolean | | `False` | | A vlan can have many trunk_groups assigned.
To avoid unneeded configuration changes on all leaf switches when a new trunk group is added,
this feature will only configure the vlan trunk groups matched with local connected_endpoints.
See "Details on only_local_vlan_trunk_groups" below.
Requires "enable_trunk_groups: true".
| | [p2p_uplinks_mtu](## "p2p_uplinks_mtu") | Integer | | `9214` | Min: 68
Max: 65535 | Point to Point Links MTU. | | [p2p_uplinks_qos_profile](## "p2p_uplinks_qos_profile") | String | | | | QOS Profile assigned on all infrastructure links. | + | [shutdown_bgp_towards_undeployed_peers](## "shutdown_bgp_towards_undeployed_peers") | Boolean | | `False` | | When a device is set undeployed using `is_deployed: false` and `shutdown_bgp_towards_undeployed_peers` key is set to true, the BGP neighborship is shutdown on the peer. | | [shutdown_interfaces_towards_undeployed_peers](## "shutdown_interfaces_towards_undeployed_peers") | Boolean | | `False` | | - It is possible to provision configurations for a complete topology but flag devices as undeployed using the host level variable `is_deployed: false`.

```yaml
# Use at the host level
is_deployed: < true or false or default -> true >
```

- By default, this will have no impact within the `eos_designs` role. Configs will still be generated by the `eos_cli_config_gen` role and will still be pushed by the `eos_config_deploy_eapi` directly to devices if used.
- However, if the `eos_config_deploy_cvp` role is used to push configurations, CloudVision will ignore the devices flagged as `is_deployed: false` and not attempt to configure them.
- If the device is not present in the network due to CloudVision not configuring the device, `eos_validate_state` role will fail tests on peers of the undeployed device trying to verify that interfaces are up.
- To overcome this and shutdown interfaces towards undeployed peers, the variable `shutdown_interfaces_towards_undeployed_peers` can be used, satisfying the `eos_validate_state` role interface tests.
- Again, this is only an issue if `eos_config_deploy_cvp` is used and the devices are not present in the network.
| | [trunk_groups](## "trunk_groups") | Dictionary | | | | | | [  mlag](## "trunk_groups.mlag") | Dictionary | | | | Trunk Group used for MLAG VLAN (Typically VLAN 4094).
| @@ -68,6 +69,9 @@ # QOS Profile assigned on all infrastructure links. p2p_uplinks_qos_profile: + # When a device is set undeployed using `is_deployed: false` and `shutdown_bgp_towards_undeployed_peers` key is set to true, the BGP neighborship is shutdown on the peer. + shutdown_bgp_towards_undeployed_peers: + # - It is possible to provision configurations for a complete topology but flag devices as undeployed using the host level variable `is_deployed: false`. # # ```yaml diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/flow-tracking-settings.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/flow-tracking-settings.md deleted file mode 100644 index 755b3d14f91..00000000000 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/flow-tracking-settings.md +++ /dev/null @@ -1,43 +0,0 @@ - -=== "Table" - - | Variable | Type | Required | Default | Value Restrictions | Description | - | -------- | ---- | -------- | ------- | ------------------ | ----------- | - | [flow_tracking_settings](## "flow_tracking_settings") | Dictionary | | | | PREVIEW: This key is currently not supported

Define the flow tracking parameters for this topology. | - | [  flow_tracker_name](## "flow_tracking_settings.flow_tracker_name") | String | | `FLOW-TRACKER` | | Flow Tracker Name. | - | [  record_export](## "flow_tracking_settings.record_export") | Dictionary | | | | | - | [    on_inactive_timeout](## "flow_tracking_settings.record_export.on_inactive_timeout") | Integer | | `70000` | Min: 3000
Max: 900000 | Flow record inactive export timeout in milliseconds. | - | [    on_interval](## "flow_tracking_settings.record_export.on_interval") | Integer | | `300000` | Min: 1000
Max: 36000000 | Flow record export interval in milliseconds. | - | [  exporter](## "flow_tracking_settings.exporter") | Dictionary | | | | | - | [    name](## "flow_tracking_settings.exporter.name") | String | | `CV-TELEMETRY` | | Exporter Name. | - | [    template_interval](## "flow_tracking_settings.exporter.template_interval") | Integer | | `3600000` | Min: 5000
Max: 3600000 | Template interval in milliseconds. | - -=== "YAML" - - ```yaml - # PREVIEW: This key is currently not supported - # - # Define the flow tracking parameters for this topology. - flow_tracking_settings: - - # Flow Tracker Name. - flow_tracker_name: - record_export: - - # Flow record inactive export timeout in milliseconds. - on_inactive_timeout: - - # Flow record export interval in milliseconds. - on_interval: - exporter: - - # Exporter Name. - name: - - # Template interval in milliseconds. - template_interval: - ``` diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/ipv4-acls.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/ipv4-acls.md index 1f344244c49..ac7ac350e85 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/ipv4-acls.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/ipv4-acls.md @@ -10,8 +10,8 @@ | [ipv4_acls](## "ipv4_acls") | List, items: Dictionary | | | | IPv4 extended access-lists supporting substitution on certain fields.
These access-lists can be referenced under node settings `l3_interfaces`, and will only be configured on devices where they are in use.

The substitution is useful when assigning the same access-list on multiple interfaces,
but where certain fields require unique values like the "interface_ip" or "peer_ip".
When using substitution, the interface name will be appended to the ACL name. | | [  - name](## "ipv4_acls.[].name") | String | Required, Unique | | | Access-list name.
When using substitution for any fields, the interface name will be appended to the ACL name. | | [    entries](## "ipv4_acls.[].entries") | List, items: Dictionary | Required | | | ACL Entries. | - | [      - source](## "ipv4_acls.[].entries.[].source") | String | | | | This field supports substitution of the fields "interface_ip" and "peer_ip".
Alternatively it can be set with a static value of "any", "/" or "".
"" without a mask means host.
Required except for remarks. | - | [        destination](## "ipv4_acls.[].entries.[].destination") | String | | | | This field supports substitution of the fields "interface_ip" and "peer_ip".
Alternatively it can be set with a static value of "any", "/" or "".
"" without a mask means host.
Required except for remarks. | + | [      - source](## "ipv4_acls.[].entries.[].source") | String | | | | This field supports substitution of the fields "interface_ip" for SVIs and both "interface_ip" and "peer_ip" for Layer 3 interfaces.
Alternatively it can be set with a static value of "any", "/" or "".
"" without a mask means host.
Required except for remarks. | + | [        destination](## "ipv4_acls.[].entries.[].destination") | String | | | | This field supports substitution of the fields "interface_ip" for SVIs and both "interface_ip" and "peer_ip" for Layer 3 interfaces.
Alternatively it can be set with a static value of "any", "/" or "".
"" without a mask means host.
Required except for remarks. | | [        sequence](## "ipv4_acls.[].entries.[].sequence") | Integer | | | | ACL entry sequence number. | | [        remark](## "ipv4_acls.[].entries.[].remark") | String | | | | Comment up to 100 characters.
If remark is defined, other keys in the ACL entry will be ignored. | | [        action](## "ipv4_acls.[].entries.[].action") | String | | | Valid Values:
- permit
- deny | ACL action.
Required except for remarks. | @@ -26,7 +26,7 @@ | [          - <str>](## "ipv4_acls.[].entries.[].tcp_flags.[]") | String | | | | TCP Flag Name. | | [        fragments](## "ipv4_acls.[].entries.[].fragments") | Boolean | | | | Match non-head fragment packets. | | [        log](## "ipv4_acls.[].entries.[].log") | Boolean | | | | Log matches against this rule. | - | [        ttl](## "ipv4_acls.[].entries.[].ttl") | Integer | | | Min: 0
Max: 255 | TTL value | + | [        ttl](## "ipv4_acls.[].entries.[].ttl") | Integer | | | Min: 0
Max: 255 | TTL value. | | [        ttl_match](## "ipv4_acls.[].entries.[].ttl_match") | String | | `eq` | Valid Values:
- eq
- gt
- lt
- neq | | | [        icmp_type](## "ipv4_acls.[].entries.[].icmp_type") | String | | | | Message type name/number for ICMP packets. | | [        icmp_code](## "ipv4_acls.[].entries.[].icmp_code") | String | | | | Message code for ICMP packets. | @@ -56,13 +56,13 @@ # ACL Entries. entries: # required - # This field supports substitution of the fields "interface_ip" and "peer_ip". + # This field supports substitution of the fields "interface_ip" for SVIs and both "interface_ip" and "peer_ip" for Layer 3 interfaces. # Alternatively it can be set with a static value of "any", "/" or "". # "" without a mask means host. # Required except for remarks. - source: - # This field supports substitution of the fields "interface_ip" and "peer_ip". + # This field supports substitution of the fields "interface_ip" for SVIs and both "interface_ip" and "peer_ip" for Layer 3 interfaces. # Alternatively it can be set with a static value of "any", "/" or "". # "" without a mask means host. # Required except for remarks. @@ -103,7 +103,7 @@ # Log matches against this rule. log: - # TTL value + # TTL value. ttl: ttl_match: diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/isis-settings.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/isis-settings.md index 7fec2a534e6..6a8ee5f3c6a 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/isis-settings.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/isis-settings.md @@ -18,6 +18,7 @@ | [  enabled](## "isis_ti_lfa.enabled") | Boolean | | `False` | | | | [  protection](## "isis_ti_lfa.protection") | String | | | Valid Values:
- link
- node | | | [  local_convergence_delay](## "isis_ti_lfa.local_convergence_delay") | Integer | | `10000` | | Local convergence delay in milliseconds. | + | [underlay_isis_bfd](## "underlay_isis_bfd") | Boolean | | `False` | | Enable BFD for ISIS on all underlay links. | | [underlay_isis_instance_name](## "underlay_isis_instance_name") | String | | | | Default -> "EVPN_UNDERLAY" for l3ls, "CORE" for mpls. | === "YAML" @@ -48,6 +49,9 @@ # Local convergence delay in milliseconds. local_convergence_delay: + # Enable BFD for ISIS on all underlay links. + underlay_isis_bfd: + # Default -> "EVPN_UNDERLAY" for l3ls, "CORE" for mpls. underlay_isis_instance_name: ``` diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/l3-edge.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/l3-edge.md index e367bde2431..db7b4be549a 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/l3-edge.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/l3-edge.md @@ -42,6 +42,10 @@ | [      ptp](## "l3_edge.p2p_links_profiles.[].ptp") | Dictionary | | | | PTP parameters. | | [        enabled](## "l3_edge.p2p_links_profiles.[].ptp.enabled") | Boolean | | `False` | | Enable PTP. | | [      sflow](## "l3_edge.p2p_links_profiles.[].sflow") | Boolean | | | | Enable sFlow. Overrides `fabric_sflow` setting. | + | [      underlay_multicast](## "l3_edge.p2p_links_profiles.[].underlay_multicast") | Boolean | | `False` | | Enable PIM sparse mode. Requires `include_in_underlay_protocol` and the global `underlay_multicast` to be `true`. | + | [      flow_tracking](## "l3_edge.p2p_links_profiles.[].flow_tracking") | Dictionary | | | | Enable flow-tracking. Overrides `fabric_flow_tracking` setting. | + | [        enabled](## "l3_edge.p2p_links_profiles.[].flow_tracking.enabled") | Boolean | | | | | + | [        name](## "l3_edge.p2p_links_profiles.[].flow_tracking.name") | String | | | | Flow tracker name as defined in flow_tracking_settings. | | [      qos_profile](## "l3_edge.p2p_links_profiles.[].qos_profile") | String | | | | QOS service profile. | | [      macsec_profile](## "l3_edge.p2p_links_profiles.[].macsec_profile") | String | | | | MAC security profile. | | [      port_channel](## "l3_edge.p2p_links_profiles.[].port_channel") | Dictionary | | | | Port-channel parameters. | @@ -53,7 +57,7 @@ | [            channel_id](## "l3_edge.p2p_links_profiles.[].port_channel.nodes_child_interfaces.[].channel_id") | Integer | | | | Port-Channel ID. If no channel_id is specified, an id is generated from the first switch port in the port channel. | | [      raw_eos_cli](## "l3_edge.p2p_links_profiles.[].raw_eos_cli") | String | | | | EOS CLI rendered directly on the point-to-point interface in the final EOS configuration. | | [      routing_protocol](## "l3_edge.p2p_links_profiles.[].routing_protocol") | String | | | Valid Values:
- ebgp | Enables deviation of the routing protocol used on this link from the fabric underlay default.
- ebgp: Enforce plain IPv4 BGP peering | - | [      structured_config](## "l3_edge.p2p_links_profiles.[].structured_config") | Dictionary | | | | Custom structured config for interfaces
Note! The content of this dictionary is _not_ validated by the schema, since it can be either ethernet_interfaces or port_channel_interfaces. | + | [      structured_config](## "l3_edge.p2p_links_profiles.[].structured_config") | Dictionary | | | | Custom structured config for interfaces.
Note! The content of this dictionary is _not_ validated by the schema, since it can be either ethernet_interfaces or port_channel_interfaces. | | [  p2p_links](## "l3_edge.p2p_links") | List, items: Dictionary | | | | | | [    - nodes](## "l3_edge.p2p_links.[].nodes") | List, items: String | Required | | | Nodes where this link should be configured. | | [        - <str>](## "l3_edge.p2p_links.[].nodes.[]") | String | | | | The values can be < node_a >, < node_b >.
ex.- [ core-1-isis-sr-ldp, core-2-ospf-ldp ].
| @@ -84,6 +88,10 @@ | [      ptp](## "l3_edge.p2p_links.[].ptp") | Dictionary | | | | PTP parameters. | | [        enabled](## "l3_edge.p2p_links.[].ptp.enabled") | Boolean | | `False` | | Enable PTP. | | [      sflow](## "l3_edge.p2p_links.[].sflow") | Boolean | | | | Enable sFlow. Overrides `fabric_sflow` setting. | + | [      underlay_multicast](## "l3_edge.p2p_links.[].underlay_multicast") | Boolean | | `False` | | Enable PIM sparse mode. Requires `include_in_underlay_protocol` and the global `underlay_multicast` to be `true`. | + | [      flow_tracking](## "l3_edge.p2p_links.[].flow_tracking") | Dictionary | | | | Enable flow-tracking. Overrides `fabric_flow_tracking` setting. | + | [        enabled](## "l3_edge.p2p_links.[].flow_tracking.enabled") | Boolean | | | | | + | [        name](## "l3_edge.p2p_links.[].flow_tracking.name") | String | | | | Flow tracker name as defined in flow_tracking_settings. | | [      qos_profile](## "l3_edge.p2p_links.[].qos_profile") | String | | | | QOS service profile. | | [      macsec_profile](## "l3_edge.p2p_links.[].macsec_profile") | String | | | | MAC security profile. | | [      port_channel](## "l3_edge.p2p_links.[].port_channel") | Dictionary | | | | Port-channel parameters. | @@ -95,7 +103,7 @@ | [            channel_id](## "l3_edge.p2p_links.[].port_channel.nodes_child_interfaces.[].channel_id") | Integer | | | | Port-Channel ID. If no channel_id is specified, an id is generated from the first switch port in the port channel. | | [      raw_eos_cli](## "l3_edge.p2p_links.[].raw_eos_cli") | String | | | | EOS CLI rendered directly on the point-to-point interface in the final EOS configuration. | | [      routing_protocol](## "l3_edge.p2p_links.[].routing_protocol") | String | | | Valid Values:
- ebgp | Enables deviation of the routing protocol used on this link from the fabric underlay default.
- ebgp: Enforce plain IPv4 BGP peering | - | [      structured_config](## "l3_edge.p2p_links.[].structured_config") | Dictionary | | | | Custom structured config for interfaces
Note! The content of this dictionary is _not_ validated by the schema, since it can be either ethernet_interfaces or port_channel_interfaces. | + | [      structured_config](## "l3_edge.p2p_links.[].structured_config") | Dictionary | | | | Custom structured config for interfaces.
Note! The content of this dictionary is _not_ validated by the schema, since it can be either ethernet_interfaces or port_channel_interfaces. | === "YAML" @@ -194,6 +202,16 @@ # Enable sFlow. Overrides `fabric_sflow` setting. sflow: + # Enable PIM sparse mode. Requires `include_in_underlay_protocol` and the global `underlay_multicast` to be `true`. + underlay_multicast: + + # Enable flow-tracking. Overrides `fabric_flow_tracking` setting. + flow_tracking: + enabled: + + # Flow tracker name as defined in flow_tracking_settings. + name: + # QOS service profile. qos_profile: @@ -220,7 +238,7 @@ # - ebgp: Enforce plain IPv4 BGP peering routing_protocol: - # Custom structured config for interfaces + # Custom structured config for interfaces. # Note! The content of this dictionary is _not_ validated by the schema, since it can be either ethernet_interfaces or port_channel_interfaces. structured_config: p2p_links: @@ -306,6 +324,16 @@ # Enable sFlow. Overrides `fabric_sflow` setting. sflow: + # Enable PIM sparse mode. Requires `include_in_underlay_protocol` and the global `underlay_multicast` to be `true`. + underlay_multicast: + + # Enable flow-tracking. Overrides `fabric_flow_tracking` setting. + flow_tracking: + enabled: + + # Flow tracker name as defined in flow_tracking_settings. + name: + # QOS service profile. qos_profile: @@ -332,7 +360,7 @@ # - ebgp: Enforce plain IPv4 BGP peering routing_protocol: - # Custom structured config for interfaces + # Custom structured config for interfaces. # Note! The content of this dictionary is _not_ validated by the schema, since it can be either ethernet_interfaces or port_channel_interfaces. structured_config: ``` diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/management-flow-tracking-settings.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/management-flow-tracking-settings.md new file mode 100644 index 00000000000..a567c7a1e66 --- /dev/null +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/management-flow-tracking-settings.md @@ -0,0 +1,225 @@ + +=== "Table" + + | Variable | Type | Required | Default | Value Restrictions | Description | + | -------- | ---- | -------- | ------- | ------------------ | ----------- | + | [fabric_flow_tracking](## "fabric_flow_tracking") | Dictionary | | | | Default enabling of flow-tracking(IPFIX) for various interface types across the fabric.
Flow Tracking can also be enabled/disabled under each of the specific data models.
For general flow-tracking settings see `flow_tracking_settings`. | + | [  uplinks](## "fabric_flow_tracking.uplinks") | Dictionary | | | | Enable flow-tracking on all fabric uplinks. | + | [    enabled](## "fabric_flow_tracking.uplinks.enabled") | Boolean | | | | | + | [    name](## "fabric_flow_tracking.uplinks.name") | String | | | | Flow tracker name as defined in flow_tracking_settings. | + | [  downlinks](## "fabric_flow_tracking.downlinks") | Dictionary | | | | Enable flow-tracking on all fabric downlinks. | + | [    enabled](## "fabric_flow_tracking.downlinks.enabled") | Boolean | | | | | + | [    name](## "fabric_flow_tracking.downlinks.name") | String | | | | Flow tracker name as defined in flow_tracking_settings. | + | [  endpoints](## "fabric_flow_tracking.endpoints") | Dictionary | | | | Enable flow-tracking on all endpoints ports. | + | [    enabled](## "fabric_flow_tracking.endpoints.enabled") | Boolean | | | | | + | [    name](## "fabric_flow_tracking.endpoints.name") | String | | | | Flow tracker name as defined in flow_tracking_settings. | + | [  l3_edge](## "fabric_flow_tracking.l3_edge") | Dictionary | | | | Enable flow-tracking on all p2p_links defined under l3_edge. | + | [    enabled](## "fabric_flow_tracking.l3_edge.enabled") | Boolean | | | | | + | [    name](## "fabric_flow_tracking.l3_edge.name") | String | | | | Flow tracker name as defined in flow_tracking_settings. | + | [  core_interfaces](## "fabric_flow_tracking.core_interfaces") | Dictionary | | | | Enable flow-tracking on all p2p_links defined under core_interfaces. | + | [    enabled](## "fabric_flow_tracking.core_interfaces.enabled") | Boolean | | | | | + | [    name](## "fabric_flow_tracking.core_interfaces.name") | String | | | | Flow tracker name as defined in flow_tracking_settings. | + | [  mlag_interfaces](## "fabric_flow_tracking.mlag_interfaces") | Dictionary | | | | Enable flow-tracking on all MLAG peer interfaces. | + | [    enabled](## "fabric_flow_tracking.mlag_interfaces.enabled") | Boolean | | | | | + | [    name](## "fabric_flow_tracking.mlag_interfaces.name") | String | | | | Flow tracker name as defined in flow_tracking_settings. | + | [  l3_interfaces](## "fabric_flow_tracking.l3_interfaces") | Dictionary | | | | Enable flow-tracking on all node.l3_interfaces. | + | [    enabled](## "fabric_flow_tracking.l3_interfaces.enabled") | Boolean | | | | | + | [    name](## "fabric_flow_tracking.l3_interfaces.name") | String | | | | Flow tracker name as defined in flow_tracking_settings. | + | [  dps_interfaces](## "fabric_flow_tracking.dps_interfaces") | Dictionary | | | | Enable flow-tracking on all dps_interfaces. | + | [    enabled](## "fabric_flow_tracking.dps_interfaces.enabled") | Boolean | | | | | + | [    name](## "fabric_flow_tracking.dps_interfaces.name") | String | | | | Flow tracker name as defined in flow_tracking_settings. | + | [  direct_wan_ha_links](## "fabric_flow_tracking.direct_wan_ha_links") | Dictionary | | | | Enable flow-tracking on all direct WAN HA links. | + | [    enabled](## "fabric_flow_tracking.direct_wan_ha_links.enabled") | Boolean | | | | | + | [    name](## "fabric_flow_tracking.direct_wan_ha_links.name") | String | | | | Flow tracker name as defined in flow_tracking_settings. | + | [flow_tracking_settings](## "flow_tracking_settings") | Dictionary | | | | PREVIEW: This key is currently not supported

Define the flow tracking parameters for this topology. | + | [  sampled](## "flow_tracking_settings.sampled") | Dictionary | | | | The options relevant only for flow tracker type sampled. | + | [    encapsulation](## "flow_tracking_settings.sampled.encapsulation") | Dictionary | | | | | + | [      ipv4_ipv6](## "flow_tracking_settings.sampled.encapsulation.ipv4_ipv6") | Boolean | | | | | + | [      mpls](## "flow_tracking_settings.sampled.encapsulation.mpls") | Boolean | | | | | + | [    sample](## "flow_tracking_settings.sampled.sample") | Integer | | `10000` | Min: 1
Max: 4294967295 | | + | [    hardware_offload](## "flow_tracking_settings.sampled.hardware_offload") | Dictionary | | | | | + | [      ipv4](## "flow_tracking_settings.sampled.hardware_offload.ipv4") | Boolean | | | | Configure hardware offload for IPv4 traffic. | + | [      ipv6](## "flow_tracking_settings.sampled.hardware_offload.ipv6") | Boolean | | | | Configure hardware offload for IPv6 traffic. | + | [      threshold_minimum](## "flow_tracking_settings.sampled.hardware_offload.threshold_minimum") | Integer | | | Min: 1
Max: 4294967295 | Minimum number of samples. | + | [  hardware](## "flow_tracking_settings.hardware") | Dictionary | | | | The options relevant only for flow tracker type hardware. | + | [    record](## "flow_tracking_settings.hardware.record") | Dictionary | | | | | + | [      format_ipfix_standard_timestamps_counters](## "flow_tracking_settings.hardware.record.format_ipfix_standard_timestamps_counters") | Boolean | | | | Enable software export of IPFIX data records. | + | [  trackers](## "flow_tracking_settings.trackers") | List, items: Dictionary | | See (+) on YAML tab | | | + | [    - name](## "flow_tracking_settings.trackers.[].name") | String | Required, Unique | | | Tracker Name | + | [      sampled](## "flow_tracking_settings.trackers.[].sampled") | Dictionary | | | | The options relevant only for flow tracker type sampled. | + | [        table_size](## "flow_tracking_settings.trackers.[].sampled.table_size") | Integer | | | Min: 1
Max: 614400 | Maximum number of entries in flow table.
| + | [        record_export](## "flow_tracking_settings.trackers.[].sampled.record_export") | Dictionary | | | | | + | [          mpls](## "flow_tracking_settings.trackers.[].sampled.record_export.mpls") | Boolean | | | | Export MPLS forwarding information. | + | [      record_export](## "flow_tracking_settings.trackers.[].record_export") | Dictionary | | | | | + | [        on_inactive_timeout](## "flow_tracking_settings.trackers.[].record_export.on_inactive_timeout") | Integer | | | Min: 3000
Max: 900000 | Flow record inactive export timeout in milliseconds | + | [        on_interval](## "flow_tracking_settings.trackers.[].record_export.on_interval") | Integer | | | Min: 1000
Max: 36000000 | Flow record export interval in milliseconds | + | [      exporters](## "flow_tracking_settings.trackers.[].exporters") | List, items: Dictionary | | | | | + | [        - name](## "flow_tracking_settings.trackers.[].exporters.[].name") | String | Required, Unique | | | Exporter Name | + | [          collector](## "flow_tracking_settings.trackers.[].exporters.[].collector") | Dictionary | | | | | + | [            host](## "flow_tracking_settings.trackers.[].exporters.[].collector.host") | String | | | | Collector IPv4 address or IPv6 address or fully qualified domain name | + | [            port](## "flow_tracking_settings.trackers.[].exporters.[].collector.port") | Integer | | | Min: 1
Max: 65535 | Collector Port Number | + | [          format](## "flow_tracking_settings.trackers.[].exporters.[].format") | Dictionary | | | | | + | [            ipfix_version](## "flow_tracking_settings.trackers.[].exporters.[].format.ipfix_version") | Integer | | | | | + | [          local_interface](## "flow_tracking_settings.trackers.[].exporters.[].local_interface") | String | | | | Local Source Interface | + | [          template_interval](## "flow_tracking_settings.trackers.[].exporters.[].template_interval") | Integer | | | Min: 5000
Max: 3600000 | Template interval in milliseconds | + +=== "YAML" + + ```yaml + # Default enabling of flow-tracking(IPFIX) for various interface types across the fabric. + # Flow Tracking can also be enabled/disabled under each of the specific data models. + # For general flow-tracking settings see `flow_tracking_settings`. + fabric_flow_tracking: + + # Enable flow-tracking on all fabric uplinks. + uplinks: + enabled: + + # Flow tracker name as defined in flow_tracking_settings. + name: + + # Enable flow-tracking on all fabric downlinks. + downlinks: + enabled: + + # Flow tracker name as defined in flow_tracking_settings. + name: + + # Enable flow-tracking on all endpoints ports. + endpoints: + enabled: + + # Flow tracker name as defined in flow_tracking_settings. + name: + + # Enable flow-tracking on all p2p_links defined under l3_edge. + l3_edge: + enabled: + + # Flow tracker name as defined in flow_tracking_settings. + name: + + # Enable flow-tracking on all p2p_links defined under core_interfaces. + core_interfaces: + enabled: + + # Flow tracker name as defined in flow_tracking_settings. + name: + + # Enable flow-tracking on all MLAG peer interfaces. + mlag_interfaces: + enabled: + + # Flow tracker name as defined in flow_tracking_settings. + name: + + # Enable flow-tracking on all node.l3_interfaces. + l3_interfaces: + enabled: + + # Flow tracker name as defined in flow_tracking_settings. + name: + + # Enable flow-tracking on all dps_interfaces. + dps_interfaces: + enabled: + + # Flow tracker name as defined in flow_tracking_settings. + name: + + # Enable flow-tracking on all direct WAN HA links. + direct_wan_ha_links: + enabled: + + # Flow tracker name as defined in flow_tracking_settings. + name: + + # PREVIEW: This key is currently not supported + # + # Define the flow tracking parameters for this topology. + flow_tracking_settings: + + # The options relevant only for flow tracker type sampled. + sampled: + encapsulation: + ipv4_ipv6: + mpls: + sample: + hardware_offload: + + # Configure hardware offload for IPv4 traffic. + ipv4: + + # Configure hardware offload for IPv6 traffic. + ipv6: + + # Minimum number of samples. + threshold_minimum: + + # The options relevant only for flow tracker type hardware. + hardware: + record: + + # Enable software export of IPFIX data records. + format_ipfix_standard_timestamps_counters: + trackers: # (1)! + + # Tracker Name + - name: + + # The options relevant only for flow tracker type sampled. + sampled: + + # Maximum number of entries in flow table. + table_size: + record_export: + + # Export MPLS forwarding information. + mpls: + record_export: + + # Flow record inactive export timeout in milliseconds + on_inactive_timeout: + + # Flow record export interval in milliseconds + on_interval: + exporters: + + # Exporter Name + - name: + collector: + + # Collector IPv4 address or IPv6 address or fully qualified domain name + host: + + # Collector Port Number + port: + format: + ipfix_version: + + # Local Source Interface + local_interface: + + # Template interval in milliseconds + template_interval: + ``` + + 1. Default Value + + ```yaml + trackers: + - exporters: + - collector: + host: 127.0.0.1 + local_interface: Loopback0 + name: CV-TELEMETRY + template_interval: 3600000 + name: FLOW-TRACKER + record_export: + on_inactive_timeout: 70000 + on_interval: 300000 + ``` diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/management-settings.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/management-settings.md index 78bccd5868e..e1effa39ae5 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/management-settings.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/management-settings.md @@ -8,11 +8,27 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [event_handlers](## "event_handlers") | List, items: Dictionary | | | | Gives the ability to monitor and react to Syslog messages.
Event Handlers provide a powerful and flexible tool that can be used to apply self-healing actions,
customize the system behavior, and implement workarounds to problems discovered in the field.
| - | [  - name](## "event_handlers.[].name") | String | Required, Unique | | | Event Handler Name | - | [    action_type](## "event_handlers.[].action_type") | String | | | Valid Values:
- bash
- increment
- log | | - | [    action](## "event_handlers.[].action") | String | | | | Command to execute
| - | [    delay](## "event_handlers.[].delay") | Integer | | | | Event-handler delay in seconds
| - | [    trigger](## "event_handlers.[].trigger") | String | | | Valid Values:
- on-boot
- on-logging
- on-startup-config
- on-maintenance | Configure event trigger condition.
| + | [  - name](## "event_handlers.[].name") | String | Required, Unique | | | Event Handler Name. | + | [    action_type](## "event_handlers.[].action_type") deprecated | String | | | Valid Values:
- bash
- increment
- log | This key is deprecated. Support will be removed in AVD version 5.0.0. Use event_handlers.actions instead. | + | [    action](## "event_handlers.[].action") deprecated | String | | | | Command to execute.
This key is deprecated. Support will be removed in AVD version 5.0.0. Use event_handlers.actions instead. | + | [    actions](## "event_handlers.[].actions") | Dictionary | | | | Note: `bash_command` and `log` are mutually exclusive. `bash_command` takes precedence over `log`. | + | [      bash_command](## "event_handlers.[].actions.bash_command") | String | | | | Define BASH command action. Command could be multiline also. | + | [      log](## "event_handlers.[].actions.log") | Boolean | | | | Log a message when the event is triggered. | + | [      increment_device_health_metric](## "event_handlers.[].actions.increment_device_health_metric") | String | | | | Name of device-health metric. | + | [    delay](## "event_handlers.[].delay") | Integer | | | | Event-handler delay in seconds.
| + | [    trigger](## "event_handlers.[].trigger") | String | | | Valid Values:
- on-boot
- on-counters
- on-intf
- on-logging
- on-maintenance
- on-startup-config
- vm-tracer vm | Configure event trigger condition.
| + | [    trigger_on_counters](## "event_handlers.[].trigger_on_counters") | Dictionary | | | | | + | [      condition](## "event_handlers.[].trigger_on_counters.condition") | String | | | | Set the logical expression to evaluate. | + | [      granularity_per_source](## "event_handlers.[].trigger_on_counters.granularity_per_source") | Boolean | | | | Set the granularity of event counting for a wildcarded condition.
Example -
condition ( Arad*.IptCrcErrCnt.delta > 100 ) and ( Arad*.UcFifoFullDrop.delta > 100 )
[* wildcard is used here] | + | [      poll_interval](## "event_handlers.[].trigger_on_counters.poll_interval") | Integer | | | Min: 1
Max: 1000000 | Set the polling interval in seconds. | + | [    trigger_on_logging](## "event_handlers.[].trigger_on_logging") | Dictionary | | | | | + | [      poll_interval](## "event_handlers.[].trigger_on_logging.poll_interval") | Integer | | | Min: 1
Max: 1000000 | Set the polling interval in seconds. | + | [      regex](## "event_handlers.[].trigger_on_logging.regex") | String | | | | Regular expression to use for searching log messages. | + | [    trigger_on_intf](## "event_handlers.[].trigger_on_intf") | Dictionary | | | | Trigger condition occurs on specified interface changes.
Note: Any one of the `ip`, `ipv6` and `operstatus` key needs to be defined along with the `interface`. | + | [      interface](## "event_handlers.[].trigger_on_intf.interface") | String | Required | | | Interface name.
Example - Ethernet4
Loopback4-6
Port-channel4,7 | + | [      ip](## "event_handlers.[].trigger_on_intf.ip") | Boolean | | | | Action is triggered upon changes to interface IP address assignment. | + | [      ipv6](## "event_handlers.[].trigger_on_intf.ipv6") | Boolean | | | | Action is triggered upon changes to interface ipv6 address assignment. | + | [      operstatus](## "event_handlers.[].trigger_on_intf.operstatus") | Boolean | | | | Action is triggered upon changes to interface operStatus. | | [    trigger_on_maintenance](## "event_handlers.[].trigger_on_maintenance") | Dictionary | | | | Settings required for trigger 'on-maintenance'. | | [      operation](## "event_handlers.[].trigger_on_maintenance.operation") | String | Required | | Valid Values:
- enter
- exit | | | [      bgp_peer](## "event_handlers.[].trigger_on_maintenance.bgp_peer") | String | | | | Ipv4/Ipv6 address or peer group name.
Trigger condition occurs on maintenance operation of specified BGP peer. | @@ -21,45 +37,45 @@ | [      vrf](## "event_handlers.[].trigger_on_maintenance.vrf") | String | | | | VRF name. VRF can be defined for "bgp_peer" only. | | [      interface](## "event_handlers.[].trigger_on_maintenance.interface") | String | | | | Trigger condition occurs on maintenance operation of specified interface. | | [      unit](## "event_handlers.[].trigger_on_maintenance.unit") | String | | | | Name of unit. Trigger condition occurs on maintenance operation of specified unit | - | [    regex](## "event_handlers.[].regex") | String | | | | Regular expression to use for searching log messages. Required for on-logging trigger
| + | [    regex](## "event_handlers.[].regex") deprecated | String | | | | Regular expression to use for searching log messages. Required for on-logging trigger.
This key is deprecated. Support will be removed in AVD version 5.0.0. Use event_handlers.trigger_on_logging.regex instead. | | [    asynchronous](## "event_handlers.[].asynchronous") | Boolean | | `False` | | Set the action to be non-blocking.
| | [ipv6_mgmt_destination_networks](## "ipv6_mgmt_destination_networks") | List, items: String | | | | List of IPv6 prefixes to configure as static routes towards the OOB IPv6 Management interface gateway.
Replaces the default route.
| | [  - <str>](## "ipv6_mgmt_destination_networks.[]") | String | | | | IPv6_network/Mask. | | [ipv6_mgmt_gateway](## "ipv6_mgmt_gateway") | String | | | Format: ipv6 | OOB Management interface gateway in IPv6 format.
Used as next-hop for default gateway or static routes defined under 'ipv6_mgmt_destination_networks'.
| | [local_users](## "local_users") | List, items: Dictionary | | | | | - | [  - name](## "local_users.[].name") | String | Required, Unique | | | Username | + | [  - name](## "local_users.[].name") | String | Required, Unique | | | Username. | | [    disabled](## "local_users.[].disabled") | Boolean | | | | If true, the user will be removed and all other settings are ignored.
Useful for removing the default "admin" user.
| | [    privilege](## "local_users.[].privilege") | Integer | | | Min: 0
Max: 15 | Initial privilege level with local EXEC authorization.
| - | [    role](## "local_users.[].role") | String | | | | EOS RBAC Role to be assigned to the user such as "network-admin" or "network-operator"
| - | [    sha512_password](## "local_users.[].sha512_password") | String | | | | SHA512 Hash of Password
Must be the hash of the password. By default EOS salts the password with the username, so the simplest is to generate the hash on an EOS device using the same username.
| + | [    role](## "local_users.[].role") | String | | | | EOS RBAC Role to be assigned to the user such as "network-admin" or "network-operator".
| + | [    sha512_password](## "local_users.[].sha512_password") | String | | | | SHA512 Hash of Password.
Must be the hash of the password. By default EOS salts the password with the username, so the simplest is to generate the hash on an EOS device using the same username.
| | [    no_password](## "local_users.[].no_password") | Boolean | | | | If set a password will not be configured for this user. "sha512_password" MUST not be defined for this user.
| | [    ssh_key](## "local_users.[].ssh_key") | String | | | | | | [    secondary_ssh_key](## "local_users.[].secondary_ssh_key") | String | | | | | - | [    shell](## "local_users.[].shell") | String | | | Valid Values:
- /bin/bash
- /bin/sh
- /sbin/nologin | Specify shell for the user
| + | [    shell](## "local_users.[].shell") | String | | | Valid Values:
- /bin/bash
- /bin/sh
- /sbin/nologin | Specify shell for the user.
| | [management_eapi](## "management_eapi") | Dictionary | | | | Default is HTTPS management eAPI enabled.
The VRF is set to < mgmt_interface_vrf >.
| | [  enable_http](## "management_eapi.enable_http") | Boolean | | `False` | | | | [  enable_https](## "management_eapi.enable_https") | Boolean | | `True` | | | | [  default_services](## "management_eapi.default_services") | Boolean | | | | | | [name_servers](## "name_servers") | List, items: String | | | | List of DNS servers. The VRF is set to < mgmt_interface_vrf >. | - | [  - <str>](## "name_servers.[]") | String | | | | IPv4 address | + | [  - <str>](## "name_servers.[]") | String | | | | IPv4 or IPv6 address. | | [ntp_settings](## "ntp_settings") | Dictionary | | | | NTP settings | | [  server_vrf](## "ntp_settings.server_vrf") | String | | | | EOS only supports NTP servers in one VRF, so this VRF is used for all NTP servers and one local-interface.
- `use_mgmt_interface_vrf` will configure the NTP server(s) under the VRF set with `mgmt_interface_vrf` and set the `mgmt_interface` as NTP local-interface.
An error will be raised if `mgmt_ip` or `ipv6_mgmt_ip` are not configured for the device.
- `use_inband_mgmt_vrf` will configure the NTP server(s) under the VRF set with `inband_mgmt_vrf` and set the `inband_mgmt_interface` as NTP local-interface.
An error will be raised if inband management is not configured for the device.
- Any other string will be used directly as the VRF name but local interface must be set with `custom_structured_configuration_ntp` if needed.
If not set, the VRF is automatically picked up from the global setting `default_mgmt_method`. | | [  servers](## "ntp_settings.servers") | List, items: Dictionary | | | | The first server is always set as "preferred". | - | [    - name](## "ntp_settings.servers.[].name") | String | | | | IP or hostname e.g., 2.2.2.55, ie.pool.ntp.org | + | [    - name](## "ntp_settings.servers.[].name") | String | | | | IP or hostname e.g., 2.2.2.55, 2001:db8::55, ie.pool.ntp.org. | | [      burst](## "ntp_settings.servers.[].burst") | Boolean | | | | | | [      iburst](## "ntp_settings.servers.[].iburst") | Boolean | | | | | | [      key](## "ntp_settings.servers.[].key") | Integer | | | Min: 1
Max: 65535 | | - | [      maxpoll](## "ntp_settings.servers.[].maxpoll") | Integer | | | Min: 3
Max: 17 | Value of maxpoll between 3 - 17 (Logarithmic) | - | [      minpoll](## "ntp_settings.servers.[].minpoll") | Integer | | | Min: 3
Max: 17 | Value of minpoll between 3 - 17 (Logarithmic) | + | [      maxpoll](## "ntp_settings.servers.[].maxpoll") | Integer | | | Min: 3
Max: 17 | Value of maxpoll between 3 - 17 (Logarithmic). | + | [      minpoll](## "ntp_settings.servers.[].minpoll") | Integer | | | Min: 3
Max: 17 | Value of minpoll between 3 - 17 (Logarithmic). | | [      version](## "ntp_settings.servers.[].version") | Integer | | | Min: 1
Max: 4 | | | [  authenticate](## "ntp_settings.authenticate") | Boolean | | | | | | [  authenticate_servers_only](## "ntp_settings.authenticate_servers_only") | Boolean | | | | | | [  authentication_keys](## "ntp_settings.authentication_keys") | List, items: Dictionary | | | | | - | [    - id](## "ntp_settings.authentication_keys.[].id") | Integer | Required, Unique | | Min: 1
Max: 65534 | Key identifier | + | [    - id](## "ntp_settings.authentication_keys.[].id") | Integer | Required, Unique | | Min: 1
Max: 65534 | Key identifier. | | [      hash_algorithm](## "ntp_settings.authentication_keys.[].hash_algorithm") | String | | | Valid Values:
- md5
- sha1 | | - | [      key](## "ntp_settings.authentication_keys.[].key") | String | | | | Obfuscated key | + | [      key](## "ntp_settings.authentication_keys.[].key") | String | | | | Obfuscated key. | | [      key_type](## "ntp_settings.authentication_keys.[].key_type") | String | | | Valid Values:
- 0
- 7
- 8a | | - | [  trusted_keys](## "ntp_settings.trusted_keys") | String | | | | List of trusted-keys as string ex. 10-12,15 | + | [  trusted_keys](## "ntp_settings.trusted_keys") | String | | | | List of trusted-keys as string ex. 10-12,15. | | [timezone](## "timezone") | String | | | | Clock timezone like "CET" or "US/Pacific". | === "YAML" @@ -70,18 +86,75 @@ # customize the system behavior, and implement workarounds to problems discovered in the field. event_handlers: - # Event Handler Name + # Event Handler Name. - name: + # This key is deprecated. + # Support will be removed in AVD version 5.0.0. + # Use event_handlers.actions instead. action_type: - # Command to execute + # Command to execute. + # This key is deprecated. + # Support will be removed in AVD version 5.0.0. + # Use event_handlers.actions instead. action: - # Event-handler delay in seconds + # Note: `bash_command` and `log` are mutually exclusive. `bash_command` takes precedence over `log`. + actions: + + # Define BASH command action. Command could be multiline also. + bash_command: + + # Log a message when the event is triggered. + log: + + # Name of device-health metric. + increment_device_health_metric: + + # Event-handler delay in seconds. delay: # Configure event trigger condition. - trigger: + trigger: + trigger_on_counters: + + # Set the logical expression to evaluate. + condition: + + # Set the granularity of event counting for a wildcarded condition. + # Example - + # condition ( Arad*.IptCrcErrCnt.delta > 100 ) and ( Arad*.UcFifoFullDrop.delta > 100 ) + # [* wildcard is used here] + granularity_per_source: + + # Set the polling interval in seconds. + poll_interval: + trigger_on_logging: + + # Set the polling interval in seconds. + poll_interval: + + # Regular expression to use for searching log messages. + regex: + + # Trigger condition occurs on specified interface changes. + # Note: Any one of the `ip`, `ipv6` and `operstatus` key needs to be defined along with the `interface`. + trigger_on_intf: + + # Interface name. + # Example - Ethernet4 + # Loopback4-6 + # Port-channel4,7 + interface: + + # Action is triggered upon changes to interface IP address assignment. + ip: + + # Action is triggered upon changes to interface ipv6 address assignment. + ipv6: + + # Action is triggered upon changes to interface operStatus. + operstatus: # Settings required for trigger 'on-maintenance'. trigger_on_maintenance: @@ -106,7 +179,10 @@ # Name of unit. Trigger condition occurs on maintenance operation of specified unit unit: - # Regular expression to use for searching log messages. Required for on-logging trigger + # Regular expression to use for searching log messages. Required for on-logging trigger. + # This key is deprecated. + # Support will be removed in AVD version 5.0.0. + # Use event_handlers.trigger_on_logging.regex instead. regex: # Set the action to be non-blocking. @@ -124,7 +200,7 @@ ipv6_mgmt_gateway: local_users: - # Username + # Username. - name: # If true, the user will be removed and all other settings are ignored. @@ -134,10 +210,10 @@ # Initial privilege level with local EXEC authorization. privilege: - # EOS RBAC Role to be assigned to the user such as "network-admin" or "network-operator" + # EOS RBAC Role to be assigned to the user such as "network-admin" or "network-operator". role: - # SHA512 Hash of Password + # SHA512 Hash of Password. # Must be the hash of the password. By default EOS salts the password with the username, so the simplest is to generate the hash on an EOS device using the same username. sha512_password: @@ -146,7 +222,7 @@ ssh_key: secondary_ssh_key: - # Specify shell for the user + # Specify shell for the user. shell: # Default is HTTPS management eAPI enabled. @@ -159,7 +235,7 @@ # List of DNS servers. The VRF is set to < mgmt_interface_vrf >. name_servers: - # IPv4 address + # IPv4 or IPv6 address. - # NTP settings @@ -177,31 +253,31 @@ # The first server is always set as "preferred". servers: - # IP or hostname e.g., 2.2.2.55, ie.pool.ntp.org + # IP or hostname e.g., 2.2.2.55, 2001:db8::55, ie.pool.ntp.org. - name: burst: iburst: key: - # Value of maxpoll between 3 - 17 (Logarithmic) + # Value of maxpoll between 3 - 17 (Logarithmic). maxpoll: - # Value of minpoll between 3 - 17 (Logarithmic) + # Value of minpoll between 3 - 17 (Logarithmic). minpoll: version: authenticate: authenticate_servers_only: authentication_keys: - # Key identifier + # Key identifier. - id: hash_algorithm: - # Obfuscated key + # Obfuscated key. key: key_type: - # List of trusted-keys as string ex. 10-12,15 + # List of trusted-keys as string ex. 10-12,15. trusted_keys: # Clock timezone like "CET" or "US/Pacific". diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/management-sflow-settings.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/management-sflow-settings.md index 3d10ecdfbab..ce39e39b459 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/management-sflow-settings.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/management-sflow-settings.md @@ -15,6 +15,8 @@ | [  core_interfaces](## "fabric_sflow.core_interfaces") | Boolean | | | | Enable sFlow on all p2p_links defined under core_interfaces. | | [  mlag_interfaces](## "fabric_sflow.mlag_interfaces") | Boolean | | | | Enable sFlow on all MLAG peer interfaces. | | [sflow_settings](## "sflow_settings") | Dictionary | | | | sFlow settings.
The sFlow process will only be configured if any interface is enabled for sFlow.
For default enabling of sFlow for various interface types across the fabric see `fabric_sflow`. | + | [  sample](## "sflow_settings.sample") | Dictionary | | | | | + | [    rate](## "sflow_settings.sample.rate") | Integer | | | Min: 1
Max: 4294967295 | Packet sampling rate that defines the average number of ingress packets that pass through an interface for every packet that is sampled.
A rate of 16384 corresponds to an average sample of one per 16384 packets. | | [  destinations](## "sflow_settings.destinations") | List, items: Dictionary | | | | | | [    - destination](## "sflow_settings.destinations.[].destination") | String | Required | | | sFlow destination name or IP address. | | [      port](## "sflow_settings.destinations.[].port") | Integer | | | Min: 1
Max: 65535 | UDP Port number. The default port number for sFlow is 6343. | @@ -53,6 +55,11 @@ # The sFlow process will only be configured if any interface is enabled for sFlow. # For default enabling of sFlow for various interface types across the fabric see `fabric_sflow`. sflow_settings: + sample: + + # Packet sampling rate that defines the average number of ingress packets that pass through an interface for every packet that is sampled. + # A rate of 16384 corresponds to an average sample of one per 16384 packets. + rate: destinations: # sFlow destination name or IP address. diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/management-snmp-settings.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/management-snmp-settings.md index 4cbb8119890..8f05174533a 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/management-snmp-settings.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/management-snmp-settings.md @@ -7,11 +7,11 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | - | [snmp_settings](## "snmp_settings") | Dictionary | | | | SNMP settings
For SNMP local-interfaces see "source_interfaces.snmp"
Configuration of remote SNMP engine IDs are currently only possible using `structured_config`. | + | [snmp_settings](## "snmp_settings") | Dictionary | | | | SNMP settings.
For SNMP local-interfaces see "source_interfaces.snmp".
Configuration of remote SNMP engine IDs are currently only possible using `structured_config`. | | [  contact](## "snmp_settings.contact") | String | | | | SNMP contact. | | [  location](## "snmp_settings.location") | Boolean | | `False` | | Set SNMP location. Formatted as " ". | | [  vrfs](## "snmp_settings.vrfs") | List, items: Dictionary | | | | Enable/disable SNMP for one or more VRFs.
Can be used in combination with "enable_mgmt_interface_vrf" and "enable_inband_mgmt_vrf". | - | [    - name](## "snmp_settings.vrfs.[].name") | String | Required, Unique | | | VRF name | + | [    - name](## "snmp_settings.vrfs.[].name") | String | Required, Unique | | | VRF name. | | [      enable](## "snmp_settings.vrfs.[].enable") | Boolean | | | | | | [  enable_mgmt_interface_vrf](## "snmp_settings.enable_mgmt_interface_vrf") | Boolean | | | | Enable/disable SNMP for the VRF set with "mgmt_interface_vrf".
Ignored if 'mgmt_ip' or 'ipv6_mgmt_ip' are not configured for the device.
Can be used in combination with "vrfs" and "enable_inband_mgmt_vrf". | | [  enable_inband_mgmt_vrf](## "snmp_settings.enable_inband_mgmt_vrf") | Boolean | | | | Enable/disable SNMP for the VRF set with "inband_mgmt_vrf".
Ignored if inband management is not configured for the device.
Can be used in combination with "vrfs" and "enable_mgmt_interface_vrf". | @@ -19,60 +19,60 @@ | [  compute_local_engineid_source](## "snmp_settings.compute_local_engineid_source") | String | | `hostname_and_ip` | Valid Values:
- hostname_and_ip
- system_mac | `compute_local_engineid_source` supports:
- `hostname_and_ip` generate a local engineId for SNMP by hashing via SHA1
the string generated via the concatenation of the hostname plus the management IP.
{{ inventory_hostname }} + {{ switch.mgmt_ip }}.
- `system_mac` generate the switch default engine id for AVD usage.
To use this, `system_mac_address` MUST be set for the device.
The formula is f5717f + system_mac_address + 00.
| | [  compute_v3_user_localized_key](## "snmp_settings.compute_v3_user_localized_key") | Boolean | | `False` | | Requires compute_local_engineid to be `true`.
If enabled, the SNMPv3 passphrases for auth and priv are transformed using RFC 2574, matching the value they would take in EOS CLI.
The algorithm requires a local engineId, which is unknown to AVD, hence the necessity to generate one beforehand.
| | [  users](## "snmp_settings.users") | List, items: Dictionary | | | | Configuration of local SNMP users.
Configuration of remote SNMP users are currently only possible using `structured_config`. | - | [    - name](## "snmp_settings.users.[].name") | String | | | | Username | - | [      group](## "snmp_settings.users.[].group") | String | | | | Group name | + | [    - name](## "snmp_settings.users.[].name") | String | | | | Username. | + | [      group](## "snmp_settings.users.[].group") | String | | | | Group name. | | [      version](## "snmp_settings.users.[].version") | String | | | Valid Values:
- v1
- v2c
- v3 | | | [      auth](## "snmp_settings.users.[].auth") | String | | | Valid Values:
- md5
- sha
- sha256
- sha384
- sha512 | | | [      auth_passphrase](## "snmp_settings.users.[].auth_passphrase") | String | | | | Cleartext passphrase so the recommendation is to use vault. Requires 'auth' to be set. | | [      priv](## "snmp_settings.users.[].priv") | String | | | Valid Values:
- des
- aes
- aes192
- aes256 | | | [      priv_passphrase](## "snmp_settings.users.[].priv_passphrase") | String | | | | Cleartext passphrase so the recommendation is to use vault. Requires 'priv' to be set. | | [  hosts](## "snmp_settings.hosts") | List, items: Dictionary | | | | | - | [    - host](## "snmp_settings.hosts.[].host") | String | | | | Host IP address or name | + | [    - host](## "snmp_settings.hosts.[].host") | String | | | | Host IP address or name. | | [      vrf](## "snmp_settings.hosts.[].vrf") | String | | | | VRF Name.
Can be used in combination with "use_mgmt_interface_vrf" and "use_inband_mgmt_vrf" to configure the SNMP host under multiple VRFs. | | [      use_mgmt_interface_vrf](## "snmp_settings.hosts.[].use_mgmt_interface_vrf") | Boolean | | | | Configure the SNMP host under the VRF set with "mgmt_interface_vrf". Ignored if 'mgmt_ip' or 'ipv6_mgmt_ip' are not configured for the device, so if the host is only configured with this VRF, the host will not be configured at all. Can be used in combination with "vrf" and "use_inband_mgmt_vrf" to configure the SNMP host under multiple VRFs. | | [      use_inband_mgmt_vrf](## "snmp_settings.hosts.[].use_inband_mgmt_vrf") | Boolean | | | | Configure the SNMP host under the VRF set with "inband_mgmt_vrf". Ignored if inband management is not configured for the device, so if the host is only configured with this VRF, the host will not be configured at all. Can be used in combination with "vrf" and "use_mgmt_interface_vrf" to configure the SNMP host under multiple VRFs. | | [      version](## "snmp_settings.hosts.[].version") | String | | | Valid Values:
- 1
- 2c
- 3 | | - | [      community](## "snmp_settings.hosts.[].community") | String | | | | Community name | + | [      community](## "snmp_settings.hosts.[].community") | String | | | | Community name. | | [      users](## "snmp_settings.hosts.[].users") | List, items: Dictionary | | | | | | [        - username](## "snmp_settings.hosts.[].users.[].username") | String | | | | | | [          authentication_level](## "snmp_settings.hosts.[].users.[].authentication_level") | String | | | Valid Values:
- auth
- noauth
- priv | | | [  communities](## "snmp_settings.communities") | List, items: Dictionary | | | | | - | [    - name](## "snmp_settings.communities.[].name") | String | Required, Unique | | | Community name | + | [    - name](## "snmp_settings.communities.[].name") | String | Required, Unique | | | Community name. | | [      access](## "snmp_settings.communities.[].access") | String | | | Valid Values:
- ro
- rw | | | [      access_list_ipv4](## "snmp_settings.communities.[].access_list_ipv4") | Dictionary | | | | | - | [        name](## "snmp_settings.communities.[].access_list_ipv4.name") | String | | | | IPv4 access list name | + | [        name](## "snmp_settings.communities.[].access_list_ipv4.name") | String | | | | IPv4 access list name. | | [      access_list_ipv6](## "snmp_settings.communities.[].access_list_ipv6") | Dictionary | | | | | - | [        name](## "snmp_settings.communities.[].access_list_ipv6.name") | String | | | | IPv6 access list name | + | [        name](## "snmp_settings.communities.[].access_list_ipv6.name") | String | | | | IPv6 access list name. | | [      view](## "snmp_settings.communities.[].view") | String | | | | | | [  ipv4_acls](## "snmp_settings.ipv4_acls") | List, items: Dictionary | | | | | - | [    - name](## "snmp_settings.ipv4_acls.[].name") | String | | | | IPv4 access list name | + | [    - name](## "snmp_settings.ipv4_acls.[].name") | String | | | | IPv4 access list name. | | [      vrf](## "snmp_settings.ipv4_acls.[].vrf") | String | | | | | | [  ipv6_acls](## "snmp_settings.ipv6_acls") | List, items: Dictionary | | | | | - | [    - name](## "snmp_settings.ipv6_acls.[].name") | String | | | | IPv6 access list name | + | [    - name](## "snmp_settings.ipv6_acls.[].name") | String | | | | IPv6 access list name. | | [      vrf](## "snmp_settings.ipv6_acls.[].vrf") | String | | | | | | [  views](## "snmp_settings.views") | List, items: Dictionary | | | | | - | [    - name](## "snmp_settings.views.[].name") | String | | | | SNMP view name | + | [    - name](## "snmp_settings.views.[].name") | String | | | | SNMP view name. | | [      mib_family_name](## "snmp_settings.views.[].mib_family_name") | String | | | | | | [      included](## "snmp_settings.views.[].included") | Boolean | | | | | | [      MIB_family_name](## "snmp_settings.views.[].MIB_family_name") deprecated | String | | | | This key is deprecated. Support will be removed in AVD version 5.0.0. Use mib_family_name instead. | | [  groups](## "snmp_settings.groups") | List, items: Dictionary | | | | | - | [    - name](## "snmp_settings.groups.[].name") | String | | | | Group name | + | [    - name](## "snmp_settings.groups.[].name") | String | | | | Group name. | | [      version](## "snmp_settings.groups.[].version") | String | | | Valid Values:
- v1
- v2c
- v3 | | | [      authentication](## "snmp_settings.groups.[].authentication") | String | | | Valid Values:
- auth
- noauth
- priv | | - | [      read](## "snmp_settings.groups.[].read") | String | | | | Read view | - | [      write](## "snmp_settings.groups.[].write") | String | | | | Write view | - | [      notify](## "snmp_settings.groups.[].notify") | String | | | | Notify view | + | [      read](## "snmp_settings.groups.[].read") | String | | | | Read view. | + | [      write](## "snmp_settings.groups.[].write") | String | | | | Write view. | + | [      notify](## "snmp_settings.groups.[].notify") | String | | | | Notify view. | | [  traps](## "snmp_settings.traps") | Dictionary | | | | | - | [    enable](## "snmp_settings.traps.enable") | Boolean | | `False` | | Enable or disable all snmp-traps
| + | [    enable](## "snmp_settings.traps.enable") | Boolean | | `False` | | Enable or disable all snmp-traps.
| | [    snmp_traps](## "snmp_settings.traps.snmp_traps") | List, items: Dictionary | | | | | - | [      - name](## "snmp_settings.traps.snmp_traps.[].name") | String | | | | Enable or disable specific snmp-traps and their sub_traps
Examples:
- "bgp"
- "bgp established"
| + | [      - name](## "snmp_settings.traps.snmp_traps.[].name") | String | | | | Enable or disable specific snmp-traps and their sub_traps.
Examples:
- "bgp"
- "bgp established"
| | [        enabled](## "snmp_settings.traps.snmp_traps.[].enabled") | Boolean | | `True` | | | === "YAML" ```yaml - # SNMP settings - # For SNMP local-interfaces see "source_interfaces.snmp" + # SNMP settings. + # For SNMP local-interfaces see "source_interfaces.snmp". # Configuration of remote SNMP engine IDs are currently only possible using `structured_config`. snmp_settings: @@ -86,7 +86,7 @@ # Can be used in combination with "enable_mgmt_interface_vrf" and "enable_inband_mgmt_vrf". vrfs: - # VRF name + # VRF name. - name: enable: @@ -121,10 +121,10 @@ # Configuration of remote SNMP users are currently only possible using `structured_config`. users: - # Username + # Username. - name: - # Group name + # Group name. group: version: auth: @@ -137,7 +137,7 @@ priv_passphrase: hosts: - # Host IP address or name + # Host IP address or name. - host: # VRF Name. @@ -151,38 +151,38 @@ use_inband_mgmt_vrf: version: - # Community name + # Community name. community: users: - username: authentication_level: communities: - # Community name + # Community name. - name: access: access_list_ipv4: - # IPv4 access list name + # IPv4 access list name. name: access_list_ipv6: - # IPv6 access list name + # IPv6 access list name. name: view: ipv4_acls: - # IPv4 access list name + # IPv4 access list name. - name: vrf: ipv6_acls: - # IPv6 access list name + # IPv6 access list name. - name: vrf: views: - # SNMP view name + # SNMP view name. - name: mib_family_name: included: @@ -192,26 +192,26 @@ MIB_family_name: groups: - # Group name + # Group name. - name: version: authentication: - # Read view + # Read view. read: - # Write view + # Write view. write: - # Notify view + # Notify view. notify: traps: - # Enable or disable all snmp-traps + # Enable or disable all snmp-traps. enable: snmp_traps: - # Enable or disable specific snmp-traps and their sub_traps + # Enable or disable specific snmp-traps and their sub_traps. # Examples: # - "bgp" # - "bgp established" diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-ports.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-ports.md index aa88941d533..95cdf5f8465 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-ports.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-ports.md @@ -18,8 +18,8 @@ | [    enabled](## "network_ports.[].enabled") | Boolean | | `True` | | Administrative state, setting to false will set the port to 'shutdown' in the intended configuration.
| | [    mode](## "network_ports.[].mode") | String | | | Valid Values:
- access
- dot1q-tunnel
- trunk
- trunk phone | Interface mode. | | [    mtu](## "network_ports.[].mtu") | Integer | | | Min: 68
Max: 65535 | | - | [    l2_mtu](## "network_ports.[].l2_mtu") | Integer | | | Min: 68
Max: 65535 | "l2_mtu" should only be defined for platforms supporting the "l2 mtu" CLI
| - | [    l2_mru](## "network_ports.[].l2_mru") | Integer | | | Min: 68
Max: 65535 | "l2_mru" should only be defined for platforms supporting the "l2 mru" CLI
| + | [    l2_mtu](## "network_ports.[].l2_mtu") | Integer | | | Min: 68
Max: 65535 | "l2_mtu" should only be defined for platforms supporting the "l2 mtu" CLI.
| + | [    l2_mru](## "network_ports.[].l2_mru") | Integer | | | Min: 68
Max: 65535 | "l2_mru" should only be defined for platforms supporting the "l2 mru" CLI.
| | [    native_vlan](## "network_ports.[].native_vlan") | Integer | | | Min: 1
Max: 4094 | Native VLAN for a trunk port.
If both `native_vlan` and `native_vlan_tag`, `native_vlan_tag` takes precedence.
| | [    native_vlan_tag](## "network_ports.[].native_vlan_tag") | Boolean | | `False` | | If both `native_vlan` and `native_vlan_tag`, `native_vlan_tag` takes precedence. | | [    phone_vlan](## "network_ports.[].phone_vlan") | Integer | | | Min: 1
Max: 4094 | Phone VLAN for a mode `trunk phone` port.
Requires `mode: trunk phone` to be set. | @@ -32,12 +32,15 @@ | [    spanning_tree_bpduguard](## "network_ports.[].spanning_tree_bpduguard") | String | | | Valid Values:
- enabled
- disabled
- True
- False
- true
- false | | | [    flowcontrol](## "network_ports.[].flowcontrol") | Dictionary | | | | | | [      received](## "network_ports.[].flowcontrol.received") | String | | | Valid Values:
- received
- send
- on | | - | [    qos_profile](## "network_ports.[].qos_profile") | String | | | | QOS profile name | + | [    qos_profile](## "network_ports.[].qos_profile") | String | | | | QOS profile name. | | [    ptp](## "network_ports.[].ptp") | Dictionary | | | | The global PTP profile parameters will be applied to all connected endpoints where `ptp` is manually enabled.
`ptp role master` is set to ensure control over the PTP topology.
| | [      enabled](## "network_ports.[].ptp.enabled") | Boolean | | `False` | | | | [      endpoint_role](## "network_ports.[].ptp.endpoint_role") | String | | `follower` | Valid Values:
- bmca
- default
- follower | | | [      profile](## "network_ports.[].ptp.profile") | String | | `aes67-r16-2016` | Valid Values:
- aes67
- aes67-r16-2016
- smpte2059-2 | | - | [    sflow](## "network_ports.[].sflow") | Boolean | | | | Configures sFlow on the interface. Overrides `fabric_sflow` setting.
| + | [    sflow](## "network_ports.[].sflow") | Boolean | | | | Configures sFlow on the interface. Overrides `fabric_sflow.endpoints` setting. | + | [    flow_tracking](## "network_ports.[].flow_tracking") | Dictionary | | | | Configures flow-tracking on the interface. Overrides `fabric_flow_tracking.endpoints` setting. | + | [      enabled](## "network_ports.[].flow_tracking.enabled") | Boolean | | | | | + | [      name](## "network_ports.[].flow_tracking.name") | String | | | | Flow tracker name as defined in flow_tracking_settings. | | [    link_tracking](## "network_ports.[].link_tracking") | Dictionary | | | | Configure the downstream interfaces of a respective Link Tracking Group.
If `port_channel` is defined in an adapter, then the port-channel interface is configured to be the downstream.
Else all the ethernet interfaces will be configured as downstream -> to configure single-active EVPN multihomed networks.
| | [      enabled](## "network_ports.[].link_tracking.enabled") | Boolean | | | | | | [      name](## "network_ports.[].link_tracking.name") | String | | | | Tracking group name.
The default group name is taken from fabric variable of the switch, `link_tracking.groups[0].name` with default value being "LT_GROUP1".
Optional if default link_tracking settings are configured on the node.
| @@ -69,18 +72,18 @@ | [        native_vlan_membership_egress](## "network_ports.[].dot1x.unauthorized.native_vlan_membership_egress") | Boolean | | | | | | [    poe](## "network_ports.[].poe") | Dictionary | | | | Power Over Ethernet settings applied on port. Only configured if platform supports PoE. | | [      disabled](## "network_ports.[].poe.disabled") | Boolean | | `False` | | Disable PoE on a POE capable port. PoE is enabled on all ports that support it by default in EOS. | - | [      priority](## "network_ports.[].poe.priority") | String | | | Valid Values:
- critical
- high
- medium
- low | Prioritize a port's power in the event that one of the switch's power supplies loses power | - | [      reboot](## "network_ports.[].poe.reboot") | Dictionary | | | | Set the PoE power behavior for a PoE port when the system is rebooted | - | [        action](## "network_ports.[].poe.reboot.action") | String | | | Valid Values:
- maintain
- power-off | PoE action for interface | - | [      link_down](## "network_ports.[].poe.link_down") | Dictionary | | | | Set the PoE power behavior for a PoE port when the port goes down | - | [        action](## "network_ports.[].poe.link_down.action") | String | | | Valid Values:
- maintain
- power-off | PoE action for interface | + | [      priority](## "network_ports.[].poe.priority") | String | | | Valid Values:
- critical
- high
- medium
- low | Prioritize a port's power in the event that one of the switch's power supplies loses power. | + | [      reboot](## "network_ports.[].poe.reboot") | Dictionary | | | | Set the PoE power behavior for a PoE port when the system is rebooted. | + | [        action](## "network_ports.[].poe.reboot.action") | String | | | Valid Values:
- maintain
- power-off | PoE action for interface. | + | [      link_down](## "network_ports.[].poe.link_down") | Dictionary | | | | Set the PoE power behavior for a PoE port when the port goes down. | + | [        action](## "network_ports.[].poe.link_down.action") | String | | | Valid Values:
- maintain
- power-off | PoE action for interface. | | [        power_off_delay](## "network_ports.[].poe.link_down.power_off_delay") | Integer | | | Min: 1
Max: 86400 | Number of seconds to delay shutting the power off after a link down event occurs. Default value is 5 seconds in EOS. | - | [      shutdown](## "network_ports.[].poe.shutdown") | Dictionary | | | | Set the PoE power behavior for a PoE port when the port is admin down | - | [        action](## "network_ports.[].poe.shutdown.action") | String | | | Valid Values:
- maintain
- power-off | PoE action for interface | + | [      shutdown](## "network_ports.[].poe.shutdown") | Dictionary | | | | Set the PoE power behavior for a PoE port when the port is admin down. | + | [        action](## "network_ports.[].poe.shutdown.action") | String | | | Valid Values:
- maintain
- power-off | PoE action for interface. | | [      limit](## "network_ports.[].poe.limit") | Dictionary | | | | Override the hardware-negotiated power limit using either wattage or a power class. Note that if using a power class, AVD will automatically convert the class value to the wattage value corresponding to that power class. | | [        class](## "network_ports.[].poe.limit.class") | Integer | | | Min: 0
Max: 8 | | | [        watts](## "network_ports.[].poe.limit.watts") | String | | | | | - | [        fixed](## "network_ports.[].poe.limit.fixed") | Boolean | | | | Set to ignore hardware classification | + | [        fixed](## "network_ports.[].poe.limit.fixed") | Boolean | | | | Set to ignore hardware classification. | | [      negotiation_lldp](## "network_ports.[].poe.negotiation_lldp") | Boolean | | | | Disable to prevent port from negotiating power with powered devices over LLDP. Enabled by default in EOS. | | [      legacy_detect](## "network_ports.[].poe.legacy_detect") | Boolean | | | | Allow a subset of legacy devices to work with the PoE switch. Disabled by default in EOS because it can cause false positive detections. | | [    storm_control](## "network_ports.[].storm_control") | Dictionary | | | | Storm control settings applied on port toward the endpoint. | @@ -116,7 +119,7 @@ | [          sample](## "network_ports.[].monitor_sessions.[].session_settings.sample") | Integer | | | | | | [          truncate](## "network_ports.[].monitor_sessions.[].session_settings.truncate") | Dictionary | | | | | | [            enabled](## "network_ports.[].monitor_sessions.[].session_settings.truncate.enabled") | Boolean | | | | | - | [            size](## "network_ports.[].monitor_sessions.[].session_settings.truncate.size") | Integer | | | | Size in bytes | + | [            size](## "network_ports.[].monitor_sessions.[].session_settings.truncate.size") | Integer | | | | Size in bytes. | | [    ethernet_segment](## "network_ports.[].ethernet_segment") | Dictionary | | | | Settings for all or single-active EVPN multihoming. | | [      short_esi](## "network_ports.[].ethernet_segment.short_esi") | String | Required | | | In format xxxx:xxxx:xxxx or "auto".
Define a manual short-esi (be careful using this on profiles) or set the value to "auto" to automatically generate the value.
Please see the notes under "EVPN A/A ESI dual and single-attached endpoint scenarios" before setting `short_esi: auto`.
| | [      redundancy](## "network_ports.[].ethernet_segment.redundancy") | String | | | Valid Values:
- all-active
- single-active | If omitted, Port-Channels use the EOS default of all-active.
If omitted, Ethernet interfaces are configured as single-active.
| @@ -129,6 +132,7 @@ | [      channel_id](## "network_ports.[].port_channel.channel_id") | Integer | | | | Port-Channel ID.
If no channel_id is specified, an id is generated from the first switch port in the port channel.
| | [      description](## "network_ports.[].port_channel.description") | String | | | | By default the description is built leveraging `` name or `adapter.description` when defined.
When this key is defined, it will append its content to the physical port description.
| | [      enabled](## "network_ports.[].port_channel.enabled") | Boolean | | `True` | | Port-Channel administrative state.
Setting to false will set port to 'shutdown' in intended configuration.
| + | [      ptp_mpass](## "network_ports.[].port_channel.ptp_mpass") | Boolean | | `False` | | When MPASS is enabled on an MLAG port-channel, MLAG peers coordinate to function as a single PTP logical device.
Arista PTP enabled devices always place PTP messages on the same physical link within the port-channel.
Hence, MPASS is needed only on MLAG port-channels connected to non-Arista devices. | | [      esi](## "network_ports.[].port_channel.esi") removed | String | | | | Format xxxx:xxxx:xxxx.This key was removed. Support was removed in AVD version 4.0.0. Use short_esi instead. | | [      short_esi](## "network_ports.[].port_channel.short_esi") deprecated | String | | | | In format xxxx:xxxx:xxxx or "auto".This key is deprecated. Support will be removed in AVD version 5.0.0. Use ethernet_segment.short_esi instead. | | [      lacp_fallback](## "network_ports.[].port_channel.lacp_fallback") | Dictionary | | | | LACP fallback configuration. | @@ -140,8 +144,8 @@ | [        mode](## "network_ports.[].port_channel.lacp_timer.mode") | String | | | Valid Values:
- normal
- fast | LACP mode for interface members. | | [        multiplier](## "network_ports.[].port_channel.lacp_timer.multiplier") | Integer | | | | Number of LACP BPDUs lost before deeming the peer down. EOS default is 3. | | [      subinterfaces](## "network_ports.[].port_channel.subinterfaces") | List, items: Dictionary | | | | Port-Channel L2 Subinterfaces
Subinterfaces are only supported on routed port-channels, which means they cannot be configured on MLAG port-channels.
Setting short_esi: auto generates the short_esi automatically using a hash of configuration elements.
Please see the notes under "EVPN A/A ESI dual-attached endpoint scenario" before setting short_esi: auto.
| - | [        - number](## "network_ports.[].port_channel.subinterfaces.[].number") | Integer | | | | Subinterface number | - | [          short_esi](## "network_ports.[].port_channel.subinterfaces.[].short_esi") | String | | | | In format xxxx:xxxx:xxxx or "auto"
Required for multihomed port-channels with subinterfaces
| + | [        - number](## "network_ports.[].port_channel.subinterfaces.[].number") | Integer | | | | Subinterface number. | + | [          short_esi](## "network_ports.[].port_channel.subinterfaces.[].short_esi") | String | | | | In format xxxx:xxxx:xxxx or "auto".
Required for multihomed port-channels with subinterfaces.
| | [          vlan_id](## "network_ports.[].port_channel.subinterfaces.[].vlan_id") | Integer | | | Min: 1
Max: 4094 | VLAN ID to bridge.
Default is subinterface number.
| | [          encapsulation_vlan](## "network_ports.[].port_channel.subinterfaces.[].encapsulation_vlan") | Dictionary | | | | Client VLAN ID encapsulation.
Default is subinterface number.
| | [            client_dot1q](## "network_ports.[].port_channel.subinterfaces.[].encapsulation_vlan.client_dot1q") | Integer | | | Min: 1
Max: 4094 | | @@ -191,10 +195,10 @@ mode: mtu: - # "l2_mtu" should only be defined for platforms supporting the "l2 mtu" CLI + # "l2_mtu" should only be defined for platforms supporting the "l2 mtu" CLI. l2_mtu: - # "l2_mru" should only be defined for platforms supporting the "l2 mru" CLI + # "l2_mru" should only be defined for platforms supporting the "l2 mru" CLI. l2_mru: # Native VLAN for a trunk port. @@ -225,7 +229,7 @@ flowcontrol: received: - # QOS profile name + # QOS profile name. qos_profile: # The global PTP profile parameters will be applied to all connected endpoints where `ptp` is manually enabled. @@ -235,9 +239,16 @@ endpoint_role: profile: - # Configures sFlow on the interface. Overrides `fabric_sflow` setting. + # Configures sFlow on the interface. Overrides `fabric_sflow.endpoints` setting. sflow: + # Configures flow-tracking on the interface. Overrides `fabric_flow_tracking.endpoints` setting. + flow_tracking: + enabled: + + # Flow tracker name as defined in flow_tracking_settings. + name: + # Configure the downstream interfaces of a respective Link Tracking Group. # If `port_channel` is defined in an adapter, then the port-channel interface is configured to be the downstream. # Else all the ethernet interfaces will be configured as downstream -> to configure single-active EVPN multihomed networks. @@ -285,28 +296,28 @@ # Disable PoE on a POE capable port. PoE is enabled on all ports that support it by default in EOS. disabled: - # Prioritize a port's power in the event that one of the switch's power supplies loses power + # Prioritize a port's power in the event that one of the switch's power supplies loses power. priority: - # Set the PoE power behavior for a PoE port when the system is rebooted + # Set the PoE power behavior for a PoE port when the system is rebooted. reboot: - # PoE action for interface + # PoE action for interface. action: - # Set the PoE power behavior for a PoE port when the port goes down + # Set the PoE power behavior for a PoE port when the port goes down. link_down: - # PoE action for interface + # PoE action for interface. action: # Number of seconds to delay shutting the power off after a link down event occurs. Default value is 5 seconds in EOS. power_off_delay: - # Set the PoE power behavior for a PoE port when the port is admin down + # Set the PoE power behavior for a PoE port when the port is admin down. shutdown: - # PoE action for interface + # PoE action for interface. action: # Override the hardware-negotiated power limit using either wattage or a power class. Note that if using a power class, AVD will automatically convert the class value to the wattage value corresponding to that power class. @@ -314,7 +325,7 @@ class: watts: - # Set to ignore hardware classification + # Set to ignore hardware classification. fixed: # Disable to prevent port from negotiating power with powered devices over LLDP. Enabled by default in EOS. @@ -399,7 +410,7 @@ truncate: enabled: - # Size in bytes + # Size in bytes. size: # Settings for all or single-active EVPN multihoming. @@ -448,6 +459,11 @@ # Setting to false will set port to 'shutdown' in intended configuration. enabled: + # When MPASS is enabled on an MLAG port-channel, MLAG peers coordinate to function as a single PTP logical device. + # Arista PTP enabled devices always place PTP messages on the same physical link within the port-channel. + # Hence, MPASS is needed only on MLAG port-channels connected to non-Arista devices. + ptp_mpass: + # In format xxxx:xxxx:xxxx or "auto". # This key is deprecated. # Support will be removed in AVD version 5.0.0. @@ -485,11 +501,11 @@ # Please see the notes under "EVPN A/A ESI dual-attached endpoint scenario" before setting short_esi: auto. subinterfaces: - # Subinterface number + # Subinterface number. - number: - # In format xxxx:xxxx:xxxx or "auto" - # Required for multihomed port-channels with subinterfaces + # In format xxxx:xxxx:xxxx or "auto". + # Required for multihomed port-channels with subinterfaces. short_esi: # VLAN ID to bridge. diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services-l2vlans-settings.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services-l2vlans-settings.md index 9a011cab06b..36805c5720c 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services-l2vlans-settings.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services-l2vlans-settings.md @@ -10,16 +10,16 @@ | [<network_services_keys.name>](## "") | List, items: Dictionary | | | | | | [  - name](## ".[].name") | String | Required, Unique | | | Specify a tenant name.
Tenant provide a construct to group L3 VRFs and L2 VLANs.
Networks services can be filtered by tenant name.
| | [    l2vlans](## ".[].l2vlans") | List, items: Dictionary | | | | Define L2 network services organized by vlan id. | - | [      - id](## ".[].l2vlans.[].id") | Integer | Required | | Min: 1
Max: 4094 | VLAN ID | + | [      - id](## ".[].l2vlans.[].id") | Integer | Required | | Min: 1
Max: 4094 | VLAN ID. | | [        vni_override](## ".[].l2vlans.[].vni_override") | Integer | | | Min: 1
Max: 16777215 | By default the VNI will be derived from mac_vrf_vni_base.
The vni_override, allows to override this value and statically define it.
| - | [        rt_override](## ".[].l2vlans.[].rt_override") | String | | | | By default the MAC VRF RT will be derived from mac_vrf_id_base + vlan_id.
The rt_override allows us to override this value and statically define it.
rt_override will default to vni_override if set.

rt_override supports two formats:
- A single number which will be used in the RT fields instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rt_type' for details).
- A full RT string with colon seperator which will override the full RT.
| - | [        rd_override](## ".[].l2vlans.[].rd_override") | String | | | | By default the MAC VRF RD will be derived from mac_vrf_id_base + vlan_id.
The rt_override allows us to override this value and statically define it.
rd_override will default to rt_override or vni_override if set.

rd_override supports two formats:
- A single number which will be used in the RD assigned number field instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rd_type' for details).
- A full RD string with colon seperator which will override the full RD.
| - | [        name](## ".[].l2vlans.[].name") | String | Required | | | VLAN name | + | [        rt_override](## ".[].l2vlans.[].rt_override") | String | | | | By default the MAC VRF RT will be derived from mac_vrf_id_base + vlan_id.
The rt_override allows us to override this value and statically define it.
rt_override will default to vni_override if set.

rt_override supports two formats:
- A single number which will be used in the RT fields instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rt_type' for details).
- A full RT string with colon separator which will override the full RT.
| + | [        rd_override](## ".[].l2vlans.[].rd_override") | String | | | | By default the MAC VRF RD will be derived from mac_vrf_id_base + vlan_id.
The rt_override allows us to override this value and statically define it.
rd_override will default to rt_override or vni_override if set.

rd_override supports two formats:
- A single number which will be used in the RD assigned number field instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rd_type' for details).
- A full RD string with colon separator which will override the full RD.
| + | [        name](## ".[].l2vlans.[].name") | String | Required | | | VLAN name. | | [        tags](## ".[].l2vlans.[].tags") | List, items: String | | | | Tags leveraged for networks services filtering.
Tags are matched against filter.tags defined under node type settings.
Tags are also matched against the node_group name under node type settings.
| | [          - <str>](## ".[].l2vlans.[].tags.[]") | String | | `all` | | | | [        vxlan](## ".[].l2vlans.[].vxlan") | Boolean | | `True` | | Extend this L2VLAN over VXLAN. | | [        spanning_tree_priority](## ".[].l2vlans.[].spanning_tree_priority") | Integer | | | | Setting spanning-tree priority per VLAN is only supported with `spanning_tree_mode: rapid-pvst` under node type settings.
The default priority for rapid-PVST is set under the node type settings with `spanning_tree_priority` (default=32768). | - | [        evpn_vlan_bundle](## ".[].l2vlans.[].evpn_vlan_bundle") | String | | | | Name of a bundle defined under 'evpn_vlan_bundles' to inherit configuration.
To use this option the common "evpn_vlan_aware_bundles" option must be set to true.
| + | [        evpn_vlan_bundle](## ".[].l2vlans.[].evpn_vlan_bundle") | String | | | | Name of a bundle defined under 'evpn_vlan_bundles' to inherit configuration.
This setting overrides "evpn_vlan_bundle" set at tenant level.
The common option "evpn_vlan_aware_bundles" is disregarded for this option.
| | [        trunk_groups](## ".[].l2vlans.[].trunk_groups") | List, items: String | | | | | | [          - <str>](## ".[].l2vlans.[].trunk_groups.[]") | String | | | | Trunk groups are used for limiting vlans to trunk ports assigned to the same trunk group.
Requires enable_trunk_groups: true.
| | [        bgp](## ".[].l2vlans.[].bgp") | Dictionary | | | | | @@ -39,7 +39,7 @@ # Define L2 network services organized by vlan id. l2vlans: - # VLAN ID + # VLAN ID. - id: # By default the VNI will be derived from mac_vrf_vni_base. @@ -52,7 +52,7 @@ # # rt_override supports two formats: # - A single number which will be used in the RT fields instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rt_type' for details). - # - A full RT string with colon seperator which will override the full RT. + # - A full RT string with colon separator which will override the full RT. rt_override: # By default the MAC VRF RD will be derived from mac_vrf_id_base + vlan_id. @@ -61,10 +61,10 @@ # # rd_override supports two formats: # - A single number which will be used in the RD assigned number field instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rd_type' for details). - # - A full RD string with colon seperator which will override the full RD. + # - A full RD string with colon separator which will override the full RD. rd_override: - # VLAN name + # VLAN name. name: # Tags leveraged for networks services filtering. @@ -81,7 +81,8 @@ spanning_tree_priority: # Name of a bundle defined under 'evpn_vlan_bundles' to inherit configuration. - # To use this option the common "evpn_vlan_aware_bundles" option must be set to true. + # This setting overrides "evpn_vlan_bundle" set at tenant level. + # The common option "evpn_vlan_aware_bundles" is disregarded for this option. evpn_vlan_bundle: trunk_groups: diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services-multicast-settings.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services-multicast-settings.md index 3117655deb5..ffe0448a527 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services-multicast-settings.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services-multicast-settings.md @@ -11,11 +11,11 @@ | [  - name](## ".[].name") | String | Required, Unique | | | Specify a tenant name.
Tenant provide a construct to group L3 VRFs and L2 VLANs.
Networks services can be filtered by tenant name.
| | [    evpn_l2_multicast](## ".[].evpn_l2_multicast") | Dictionary | | | | Enable EVPN L2 Multicast for all SVIs and l2vlans within Tenant.
- Multicast group binding is created only for Multicast traffic. BULL traffic will use ingress-replication.
- Configures binding between VXLAN, VLAN, and multicast group IPv4 address using the following formula:
< evpn_l2_multicast.underlay_l2_multicast_group_ipv4_pool > + < vlan_id - 1 > + < evpn_l2_multicast.underlay_l2_multicast_group_ipv4_pool_offset >.
- The recommendation is to assign a /20 block within the 232.0.0.0/8 Source-Specific Multicast range.
- Enables `redistribute igmp` on the router bgp MAC VRF.
- When evpn_l2_multicast.enabled is true for a VLAN or a tenant, "igmp snooping" and "igmp snooping querier" will always be enabled - overriding those individual settings.
- Requires `evpn_multicast` to also be set to `true`.
| | [      enabled](## ".[].evpn_l2_multicast.enabled") | Boolean | | | | | - | [      underlay_l2_multicast_group_ipv4_pool](## ".[].evpn_l2_multicast.underlay_l2_multicast_group_ipv4_pool") | String | | | | IPv4_address/Mask | + | [      underlay_l2_multicast_group_ipv4_pool](## ".[].evpn_l2_multicast.underlay_l2_multicast_group_ipv4_pool") | String | | | | IPv4_address/Mask. | | [      underlay_l2_multicast_group_ipv4_pool_offset](## ".[].evpn_l2_multicast.underlay_l2_multicast_group_ipv4_pool_offset") | Integer | | | | | | [    evpn_l3_multicast](## ".[].evpn_l3_multicast") | Dictionary | | | | Enable L3 Multicast for all SVIs and l3vlans within Tenant.
- In the evpn-l3ls design type, this enables L3 EVPN Multicast (aka OISM)'.
- Multicast group binding for VRF is created only for Multicast traffic. BULL traffic will use ingress-replication.
- Configures binding between VXLAN, VLAN, and multicast group IPv4 address using the following formula:
< l3_multicast.evpn_underlay_l3_multicast_group_ipv4_pool > + < vrf_vni - 1 > + < l3_multicast.evpn_underlay_l3_multicast_group_ipv4_pool_offset >.
- The recommendation is to assign a /20 block within the 232.0.0.0/8 Source-Specific Multicast range.
- If enabled on an SVI using the anycast default gateway feature, a diagnostic loopback (see below) MUST be configured to source IGMP traffic.
- Enables `evpn multicast` on the router bgp VRF.
- When enabled on an SVI:
- If switch is part of an MLAG pair, enables "pim ipv4 sparse-mode" on the SVI.
- If switch is standalone or A-A MH, enables "ip igmp" on the SVI.
- If "ip address virtual" is configured, enables "pim ipv4 local-interface" and uses the diagnostic Loopback defined in the VRF
- Requires `evpn_multicast` to also be set to `true`.
| | [      enabled](## ".[].evpn_l3_multicast.enabled") | Boolean | | | | | - | [      evpn_underlay_l3_multicast_group_ipv4_pool](## ".[].evpn_l3_multicast.evpn_underlay_l3_multicast_group_ipv4_pool") | String | Required | | | IPv4_address/Mask | + | [      evpn_underlay_l3_multicast_group_ipv4_pool](## ".[].evpn_l3_multicast.evpn_underlay_l3_multicast_group_ipv4_pool") | String | Required | | | IPv4_address/Mask. | | [      evpn_underlay_l3_multicast_group_ipv4_pool_offset](## ".[].evpn_l3_multicast.evpn_underlay_l3_multicast_group_ipv4_pool_offset") | Integer | | | | | | [      evpn_peg](## ".[].evpn_l3_multicast.evpn_peg") | List, items: Dictionary | | | | For each group of nodes, allow configuration of EVPN PEG options.
The first group of settings where the device's hostname is present in the 'nodes' list will be used.
| | [        - nodes](## ".[].evpn_l3_multicast.evpn_peg.[].nodes") | List, items: String | | | | A description will be applied to all nodes with RP addresses configured if not set. | @@ -31,7 +31,7 @@ | [        access_list_name](## ".[].pim_rp_addresses.[].access_list_name") | String | | | | List of groups to associate with the RP address set in 'rp'.
If access_list_name is set, a standard access-list will be configured matching these groups.
Otherwise the groups are configured directly on the RP command.
| | [    igmp_snooping_querier](## ".[].igmp_snooping_querier") | Dictionary | | | | Enable IGMP snooping querier for each SVI/l2vlan within tenant, by default using IP address of Loopback 0.
When enabled, IGMP snooping querier will only be configured on L3 devices, i.e., uplink_type: p2p.
| | [      enabled](## ".[].igmp_snooping_querier.enabled") | Boolean | | | | Will be enabled automatically if "evpn_l2_multicast" is enabled. | - | [      source_address](## ".[].igmp_snooping_querier.source_address") | String | | | Format: ipv4 | Default IP address of Loopback0 | + | [      source_address](## ".[].igmp_snooping_querier.source_address") | String | | | Format: ipv4 | Default IP address of Loopback0. | | [      version](## ".[].igmp_snooping_querier.version") | Integer | | `2` | Valid Values:
- 1
- 2
- 3 | | | [    vrfs](## ".[].vrfs") | List, items: Dictionary | | | | VRFs will only be configured on a node if any of the underlying objects like `svis` or `l3_interfaces` apply to the node.

It is recommended to only define a VRF in one Tenant. If the same VRF name is used across multiple tenants and those tenants
are accepted by `filter.tenants` on the node, any object set under the duplicate VRFs must either be unique or be an exact match.

VRF "default" is partially supported under network-services. Currently the supported options for "default" vrf are route-target,
route-distinguisher settings, structured_config, raw_eos_cli in bgp and SVIs are the only supported interface type.
Vlan-aware-bundles are supported as well inside default vrf. OSPF is not supported currently.
| | [      - name](## ".[].vrfs.[].name") | String | Required, Unique | | | | @@ -53,7 +53,7 @@ | [        svis](## ".[].vrfs.[].svis") | List, items: Dictionary | | | | List of SVIs.
This will create both the L3 SVI and L2 VLAN based on filters applied to the node.
| | [          - id](## ".[].vrfs.[].svis.[].id") | Integer | Required | | Min: 1
Max: 4096 | SVI interface id and VLAN id. | | [            nodes](## ".[].vrfs.[].svis.[].nodes") | List, items: Dictionary | | | | Define node specific configuration, such as unique IP addresses.
Any keys set here will be merged onto the SVI config, except `structured_config` keys which will replace the `structured_config` set on SVI level.
| - | [              - node](## ".[].vrfs.[].svis.[].nodes.[].node") | String | Required, Unique | | | l3_leaf inventory hostname | + | [              - node](## ".[].vrfs.[].svis.[].nodes.[].node") | String | Required, Unique | | | l3_leaf inventory hostname. | | [                evpn_l2_multicast](## ".[].vrfs.[].svis.[].nodes.[].evpn_l2_multicast") | Dictionary | | | | Explicitly enable or disable evpn_l2_multicast to override setting of `.[].evpn_l2_multicast.enabled`.
When evpn_l2_multicast.enabled is set to true for a vlan or a tenant, "igmp snooping" and "igmp snooping querier" will always be enabled, overriding those individual settings.
Requires `evpn_multicast` to also be set to `true`.
| | [                  enabled](## ".[].vrfs.[].svis.[].nodes.[].evpn_l2_multicast.enabled") | Boolean | | | | | | [                evpn_l3_multicast](## ".[].vrfs.[].svis.[].nodes.[].evpn_l3_multicast") | Dictionary | | | | Explicitly enable or disable evpn_l3_multicast to override setting of `.[].evpn_l3_multicast.enabled` and `.[].vrfs.[].evpn_l3_multicast.enabled`.
Requires `evpn_multicast` to also be set to `true`.
| @@ -73,7 +73,7 @@ | [              source_address](## ".[].vrfs.[].svis.[].igmp_snooping_querier.source_address") | String | | | | IPv4_address
If not set, IP address of "Loopback0" will be used.
| | [              version](## ".[].vrfs.[].svis.[].igmp_snooping_querier.version") | Integer | | | Valid Values:
- 1
- 2
- 3 | IGMP Version (By default EOS uses IGMP version 2 for IGMP querier). | | [    l2vlans](## ".[].l2vlans") | List, items: Dictionary | | | | Define L2 network services organized by vlan id. | - | [      - id](## ".[].l2vlans.[].id") | Integer | Required | | Min: 1
Max: 4094 | VLAN ID | + | [      - id](## ".[].l2vlans.[].id") | Integer | Required | | Min: 1
Max: 4094 | VLAN ID. | | [        evpn_l2_multicast](## ".[].l2vlans.[].evpn_l2_multicast") | Dictionary | | | | Explicitly enable or disable evpn_l2_multicast to override setting of `.[].evpn_l2_multicast.enabled`.
When evpn_l2_multicast.enabled is set to true for a vlan or a tenant, igmp snooping and igmp snooping querier will always be enabled, overriding those individual settings.
Requires `evpn_multicast` to also be set to `true`.
| | [          enabled](## ".[].l2vlans.[].evpn_l2_multicast.enabled") | Boolean | | | | | | [        igmp_snooping_enabled](## ".[].l2vlans.[].igmp_snooping_enabled") | Boolean | | `True` | | Activate or deactivate IGMP snooping. | @@ -82,9 +82,9 @@ | [          source_address](## ".[].l2vlans.[].igmp_snooping_querier.source_address") | String | | | | IPv4_address
If not set, IP address of "Loopback0" will be used.
| | [          version](## ".[].l2vlans.[].igmp_snooping_querier.version") | Integer | | `2` | Valid Values:
- 1
- 2
- 3 | | | [svi_profiles](## "svi_profiles") | List, items: Dictionary | | | | Profiles to share common settings for SVIs under `.[].vrfs.svis`.
Keys are the same used under SVIs. Keys defined under SVIs take precedence.
Note: structured configuration is not merged recursively and will be taken directly from the most specific level in the following order:
1. svi.nodes[inventory_hostname].structured_config
2. svi_profile.nodes[inventory_hostname].structured_config
3. svi_parent_profile.nodes[inventory_hostname].structured_config
4. svi.structured_config
5. svi_profile.structured_config
6. svi_parent_profile.structured_config
| - | [  - profile](## "svi_profiles.[].profile") | String | Required, Unique | | | Profile name | + | [  - profile](## "svi_profiles.[].profile") | String | Required, Unique | | | Profile name. | | [    nodes](## "svi_profiles.[].nodes") | List, items: Dictionary | | | | Define node specific configuration, such as unique IP addresses.
Any keys set here will be merged onto the SVI config, except `structured_config` keys which will replace the `structured_config` set on SVI level.
| - | [      - node](## "svi_profiles.[].nodes.[].node") | String | Required, Unique | | | l3_leaf inventory hostname | + | [      - node](## "svi_profiles.[].nodes.[].node") | String | Required, Unique | | | l3_leaf inventory hostname. | | [        evpn_l2_multicast](## "svi_profiles.[].nodes.[].evpn_l2_multicast") | Dictionary | | | | Explicitly enable or disable evpn_l2_multicast to override setting of `.[].evpn_l2_multicast.enabled`.
When evpn_l2_multicast.enabled is set to true for a vlan or a tenant, "igmp snooping" and "igmp snooping querier" will always be enabled, overriding those individual settings.
Requires `evpn_multicast` to also be set to `true`.
| | [          enabled](## "svi_profiles.[].nodes.[].evpn_l2_multicast.enabled") | Boolean | | | | | | [        evpn_l3_multicast](## "svi_profiles.[].nodes.[].evpn_l3_multicast") | Dictionary | | | | Explicitly enable or disable evpn_l3_multicast to override setting of `.[].evpn_l3_multicast.enabled` and `.[].vrfs.[].evpn_l3_multicast.enabled`.
Requires `evpn_multicast` to also be set to `true`.
| @@ -125,7 +125,7 @@ evpn_l2_multicast: enabled: - # IPv4_address/Mask + # IPv4_address/Mask. underlay_l2_multicast_group_ipv4_pool: underlay_l2_multicast_group_ipv4_pool_offset: @@ -145,7 +145,7 @@ evpn_l3_multicast: enabled: - # IPv4_address/Mask + # IPv4_address/Mask. evpn_underlay_l3_multicast_group_ipv4_pool: evpn_underlay_l3_multicast_group_ipv4_pool_offset: @@ -190,7 +190,7 @@ # Will be enabled automatically if "evpn_l2_multicast" is enabled. enabled: - # Default IP address of Loopback0 + # Default IP address of Loopback0. source_address: version: @@ -260,7 +260,7 @@ # Any keys set here will be merged onto the SVI config, except `structured_config` keys which will replace the `structured_config` set on SVI level. nodes: - # l3_leaf inventory hostname + # l3_leaf inventory hostname. - node: # Explicitly enable or disable evpn_l2_multicast to override setting of `.[].evpn_l2_multicast.enabled`. @@ -316,7 +316,7 @@ # Define L2 network services organized by vlan id. l2vlans: - # VLAN ID + # VLAN ID. - id: # Explicitly enable or disable evpn_l2_multicast to override setting of `.[].evpn_l2_multicast.enabled`. @@ -351,14 +351,14 @@ # 6. svi_parent_profile.structured_config svi_profiles: - # Profile name + # Profile name. - profile: # Define node specific configuration, such as unique IP addresses. # Any keys set here will be merged onto the SVI config, except `structured_config` keys which will replace the `structured_config` set on SVI level. nodes: - # l3_leaf inventory hostname + # l3_leaf inventory hostname. - node: # Explicitly enable or disable evpn_l2_multicast to override setting of `.[].evpn_l2_multicast.enabled`. diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services-point-to-point-services-settings.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services-point-to-point-services-settings.md index 98e71271ec2..bda6a7ca2ce 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services-point-to-point-services-settings.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services-point-to-point-services-settings.md @@ -11,13 +11,13 @@ | [  - name](## ".[].name") | String | Required, Unique | | | Specify a tenant name.
Tenant provide a construct to group L3 VRFs and L2 VLANs.
Networks services can be filtered by tenant name.
| | [    pseudowire_rt_base](## ".[].pseudowire_rt_base") | Integer | | | | Pseudowire RT base, used to generate route targets for VPWS services.
Avoid overlapping route target spaces between different services.
| | [    point_to_point_services](## ".[].point_to_point_services") | List, items: Dictionary | | | | Point to point services (pseudowires).
Only supported for node types with "network_services.l1: true".
By default this is only set for node type "pe" with "design.type: mpls"
| - | [      - name](## ".[].point_to_point_services.[].name") | String | Required, Unique | | | Pseudowire name | + | [      - name](## ".[].point_to_point_services.[].name") | String | Required, Unique | | | Pseudowire name. | | [        type](## ".[].point_to_point_services.[].type") | String | | `vpws-pseudowire` | Valid Values:
- vpws-pseudowire | | | [        subinterfaces](## ".[].point_to_point_services.[].subinterfaces") | List, items: Dictionary | | | | Subinterfaces will create subinterfaces and additional pseudowires/patch panel config for each endpoint. | - | [          - number](## ".[].point_to_point_services.[].subinterfaces.[].number") | Integer | Required, Unique | | | Subinterface number | + | [          - number](## ".[].point_to_point_services.[].subinterfaces.[].number") | Integer | Required, Unique | | | Subinterface number. | | [        endpoints](## ".[].point_to_point_services.[].endpoints") | List, items: Dictionary | | | Min Length: 2
Max Length: 2 | Pseudowire terminating endpoints. Must have exactly two items. | | [          - id](## ".[].point_to_point_services.[].endpoints.[].id") | Integer | Required | | | Pseudowire ID on this endpoint. | - | [            nodes](## ".[].point_to_point_services.[].endpoints.[].nodes") | List, items: String | Required | | Min Length: 1 | Usually one node. With ESI multihoming we support two nodes per pseudowire endpoint | + | [            nodes](## ".[].point_to_point_services.[].endpoints.[].nodes") | List, items: String | Required | | Min Length: 1 | Usually one node. With ESI multihoming we support two nodes per pseudowire endpoint. | | [              - <str>](## ".[].point_to_point_services.[].endpoints.[].nodes.[]") | String | | | | | | [            interfaces](## ".[].point_to_point_services.[].endpoints.[].interfaces") | List, items: String | Required | | Min Length: 1 | Interfaces patched to the pseudowire on this endpoints.
The list of interfaces is mapped to the list of nodes, so they must have the same length.
| | [              - <str>](## ".[].point_to_point_services.[].endpoints.[].interfaces.[]") | String | | | | | @@ -45,14 +45,14 @@ # By default this is only set for node type "pe" with "design.type: mpls" point_to_point_services: - # Pseudowire name + # Pseudowire name. - name: type: # Subinterfaces will create subinterfaces and additional pseudowires/patch panel config for each endpoint. subinterfaces: - # Subinterface number + # Subinterface number. - number: # Pseudowire terminating endpoints. Must have exactly two items. @@ -61,7 +61,7 @@ # Pseudowire ID on this endpoint. - id: - # Usually one node. With ESI multihoming we support two nodes per pseudowire endpoint + # Usually one node. With ESI multihoming we support two nodes per pseudowire endpoint. nodes: # >=1 items; required - diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services-vrfs-bgp-settings.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services-vrfs-bgp-settings.md index 09bb393c2dd..c4ace32c5d9 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services-vrfs-bgp-settings.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services-vrfs-bgp-settings.md @@ -13,62 +13,96 @@ | [      - name](## ".[].bgp_peer_groups.[].name") | String | Required, Unique | | | BGP peer group name. | | [        nodes](## ".[].bgp_peer_groups.[].nodes") | List, items: String | | | | Nodes is required to restrict configuration of BGP neighbors to certain nodes in the network.
If not set the peer-group is created on devices which have a bgp_peer mapped to the corresponding peer_group.
| | [          - <str>](## ".[].bgp_peer_groups.[].nodes.[]") | String | | | | | - | [        type](## ".[].bgp_peer_groups.[].type") | String | | | | Key only used for documentation or validation purposes | + | [        address_family_ipv4](## ".[].bgp_peer_groups.[].address_family_ipv4") | Dictionary | | | | | + | [          activate](## ".[].bgp_peer_groups.[].address_family_ipv4.activate") | Boolean | | | | | + | [          route_map_in](## ".[].bgp_peer_groups.[].address_family_ipv4.route_map_in") | String | | | | Inbound route-map name. | + | [          route_map_out](## ".[].bgp_peer_groups.[].address_family_ipv4.route_map_out") | String | | | | Outbound route-map name. | + | [          default_originate](## ".[].bgp_peer_groups.[].address_family_ipv4.default_originate") | Dictionary | | | | | + | [            always](## ".[].bgp_peer_groups.[].address_family_ipv4.default_originate.always") | Boolean | | | | | + | [            route_map](## ".[].bgp_peer_groups.[].address_family_ipv4.default_originate.route_map") | String | | | | Route-map name. | + | [          next_hop](## ".[].bgp_peer_groups.[].address_family_ipv4.next_hop") | Dictionary | | | | | + | [            address_family_ipv6](## ".[].bgp_peer_groups.[].address_family_ipv4.next_hop.address_family_ipv6") | Dictionary | | | | | + | [              enabled](## ".[].bgp_peer_groups.[].address_family_ipv4.next_hop.address_family_ipv6.enabled") | Boolean | Required | | | | + | [              originate](## ".[].bgp_peer_groups.[].address_family_ipv4.next_hop.address_family_ipv6.originate") | Boolean | | | | | + | [            address_family_ipv6_originate](## ".[].bgp_peer_groups.[].address_family_ipv4.next_hop.address_family_ipv6_originate") deprecated | Boolean | | | | This key is deprecated. Support will be removed in AVD version 5.0.0. Use address_family_ipv6 instead. | + | [          prefix_list_in](## ".[].bgp_peer_groups.[].address_family_ipv4.prefix_list_in") | String | | | | Inbound prefix-list name. | + | [          prefix_list_out](## ".[].bgp_peer_groups.[].address_family_ipv4.prefix_list_out") | String | | | | Outbound prefix-list name. | + | [        address_family_ipv6](## ".[].bgp_peer_groups.[].address_family_ipv6") | Dictionary | | | | | + | [          activate](## ".[].bgp_peer_groups.[].address_family_ipv6.activate") | Boolean | | | | | + | [          route_map_in](## ".[].bgp_peer_groups.[].address_family_ipv6.route_map_in") | String | | | | Inbound route-map name. | + | [          route_map_out](## ".[].bgp_peer_groups.[].address_family_ipv6.route_map_out") | String | | | | Outbound route-map name. | + | [          prefix_list_in](## ".[].bgp_peer_groups.[].address_family_ipv6.prefix_list_in") | String | | | | Inbound prefix-list name. | + | [          prefix_list_out](## ".[].bgp_peer_groups.[].address_family_ipv6.prefix_list_out") | String | | | | Outbound prefix-list name. | + | [        type](## ".[].bgp_peer_groups.[].type") | String | | | | Key only used for documentation or validation purposes. | | [        remote_as](## ".[].bgp_peer_groups.[].remote_as") | String | | | | BGP AS <1-4294967295> or AS number in asdot notation "<1-65535>.<0-65535>".
For asdot notation in YAML inputs, the value must be put in quotes, to prevent it from being interpreted as a float number. | | [        local_as](## ".[].bgp_peer_groups.[].local_as") | String | | | | BGP AS <1-4294967295> or AS number in asdot notation "<1-65535>.<0-65535>".
For asdot notation in YAML inputs, the value must be put in quotes, to prevent it from being interpreted as a float number. | | [        description](## ".[].bgp_peer_groups.[].description") | String | | | | | | [        shutdown](## ".[].bgp_peer_groups.[].shutdown") | Boolean | | | | | - | [        as_path](## ".[].bgp_peer_groups.[].as_path") | Dictionary | | | | BGP AS-PATH options | - | [          remote_as_replace_out](## ".[].bgp_peer_groups.[].as_path.remote_as_replace_out") | Boolean | | | | Replace AS number with local AS number | - | [          prepend_own_disabled](## ".[].bgp_peer_groups.[].as_path.prepend_own_disabled") | Boolean | | | | Disable prepending own AS number to AS path | - | [        remove_private_as](## ".[].bgp_peer_groups.[].remove_private_as") | Dictionary | | | | Remove private AS numbers in outbound AS path | + | [        as_path](## ".[].bgp_peer_groups.[].as_path") | Dictionary | | | | BGP AS-PATH options. | + | [          remote_as_replace_out](## ".[].bgp_peer_groups.[].as_path.remote_as_replace_out") | Boolean | | | | Replace AS number with local AS number. | + | [          prepend_own_disabled](## ".[].bgp_peer_groups.[].as_path.prepend_own_disabled") | Boolean | | | | Disable prepending own AS number to AS path. | + | [        remove_private_as](## ".[].bgp_peer_groups.[].remove_private_as") | Dictionary | | | | Remove private AS numbers in outbound AS path. | | [          enabled](## ".[].bgp_peer_groups.[].remove_private_as.enabled") | Boolean | | | | | | [          all](## ".[].bgp_peer_groups.[].remove_private_as.all") | Boolean | | | | | | [          replace_as](## ".[].bgp_peer_groups.[].remove_private_as.replace_as") | Boolean | | | | | | [        remove_private_as_ingress](## ".[].bgp_peer_groups.[].remove_private_as_ingress") | Dictionary | | | | | | [          enabled](## ".[].bgp_peer_groups.[].remove_private_as_ingress.enabled") | Boolean | | | | | | [          replace_as](## ".[].bgp_peer_groups.[].remove_private_as_ingress.replace_as") | Boolean | | | | | - | [        peer_filter](## ".[].bgp_peer_groups.[].peer_filter") deprecated | String | | | | Peer-filter name
note: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with
the new `listen_ranges` key above to avoid conflicts.
This key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead. | + | [        peer_filter](## ".[].bgp_peer_groups.[].peer_filter") deprecated | String | | | | Peer-filter name.
note: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with
the new `listen_ranges` key above to avoid conflicts.
This key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead. | | [        next_hop_unchanged](## ".[].bgp_peer_groups.[].next_hop_unchanged") | Boolean | | | | | - | [        update_source](## ".[].bgp_peer_groups.[].update_source") | String | | | | IP address or interface name | + | [        update_source](## ".[].bgp_peer_groups.[].update_source") | String | | | | IP address or interface name. | | [        route_reflector_client](## ".[].bgp_peer_groups.[].route_reflector_client") | Boolean | | | | | | [        bfd](## ".[].bgp_peer_groups.[].bfd") | Boolean | | | | Enable BFD. | | [        bfd_timers](## ".[].bgp_peer_groups.[].bfd_timers") | Dictionary | | | | Override default BFD timers. BFD must be enabled with `bfd: true`. | | [          interval](## ".[].bgp_peer_groups.[].bfd_timers.interval") | Integer | Required | | Min: 50
Max: 60000 | Interval in milliseconds. | | [          min_rx](## ".[].bgp_peer_groups.[].bfd_timers.min_rx") | Integer | Required | | Min: 50
Max: 60000 | Rate in milliseconds. | | [          multiplier](## ".[].bgp_peer_groups.[].bfd_timers.multiplier") | Integer | Required | | Min: 3
Max: 50 | | - | [        ebgp_multihop](## ".[].bgp_peer_groups.[].ebgp_multihop") | Integer | | | Min: 1
Max: 255 | Time-to-live in range of hops | + | [        ebgp_multihop](## ".[].bgp_peer_groups.[].ebgp_multihop") | Integer | | | Min: 1
Max: 255 | Time-to-live in range of hops. | | [        next_hop_self](## ".[].bgp_peer_groups.[].next_hop_self") | Boolean | | | | | | [        password](## ".[].bgp_peer_groups.[].password") | String | | | | | | [        passive](## ".[].bgp_peer_groups.[].passive") | Boolean | | | | | | [        default_originate](## ".[].bgp_peer_groups.[].default_originate") | Dictionary | | | | | | [          enabled](## ".[].bgp_peer_groups.[].default_originate.enabled") | Boolean | | | | | | [          always](## ".[].bgp_peer_groups.[].default_originate.always") | Boolean | | | | | - | [          route_map](## ".[].bgp_peer_groups.[].default_originate.route_map") | String | | | | Route-map name | - | [        send_community](## ".[].bgp_peer_groups.[].send_community") | String | | | | 'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)' | - | [        maximum_routes](## ".[].bgp_peer_groups.[].maximum_routes") | Integer | | | Min: 0
Max: 4294967294 | Maximum number of routes (0 means unlimited) | - | [        maximum_routes_warning_limit](## ".[].bgp_peer_groups.[].maximum_routes_warning_limit") | String | | | | Maximum number of routes after which a warning is issued (0 means never warn) or
Percentage of maximum number of routes at which to warn ("<1-100> percent")
| + | [          route_map](## ".[].bgp_peer_groups.[].default_originate.route_map") | String | | | | Route-map name. | + | [        send_community](## ".[].bgp_peer_groups.[].send_community") | String | | | | 'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'. | + | [        maximum_routes](## ".[].bgp_peer_groups.[].maximum_routes") | Integer | | | Min: 0
Max: 4294967294 | Maximum number of routes (0 means unlimited). | + | [        maximum_routes_warning_limit](## ".[].bgp_peer_groups.[].maximum_routes_warning_limit") | String | | | | Maximum number of routes after which a warning is issued (0 means never warn) or
Percentage of maximum number of routes at which to warn ("<1-100> percent").
| | [        maximum_routes_warning_only](## ".[].bgp_peer_groups.[].maximum_routes_warning_only") | Boolean | | | | | + | [        missing_policy](## ".[].bgp_peer_groups.[].missing_policy") | Dictionary | | | | Missing policy configuration for all address-families. | + | [          direction_in](## ".[].bgp_peer_groups.[].missing_policy.direction_in") | Dictionary | | | | Missing policy inbound direction. | + | [            action](## ".[].bgp_peer_groups.[].missing_policy.direction_in.action") | String | Required | | Valid Values:
- deny
- permit
- deny-in-out | Missing policy action. | + | [            include_community_list](## ".[].bgp_peer_groups.[].missing_policy.direction_in.include_community_list") | Boolean | | | | Include community-list references in missing policy decision. | + | [            include_prefix_list](## ".[].bgp_peer_groups.[].missing_policy.direction_in.include_prefix_list") | Boolean | | | | Include prefix-list references in missing policy decision. | + | [            include_sub_route_map](## ".[].bgp_peer_groups.[].missing_policy.direction_in.include_sub_route_map") | Boolean | | | | Include sub-route-map references in missing policy decision. | + | [          direction_out](## ".[].bgp_peer_groups.[].missing_policy.direction_out") | Dictionary | | | | Missing policy outbound direction. | + | [            action](## ".[].bgp_peer_groups.[].missing_policy.direction_out.action") | String | Required | | Valid Values:
- deny
- permit
- deny-in-out | Missing policy action. | + | [            include_community_list](## ".[].bgp_peer_groups.[].missing_policy.direction_out.include_community_list") | Boolean | | | | Include community-list references in missing policy decision. | + | [            include_prefix_list](## ".[].bgp_peer_groups.[].missing_policy.direction_out.include_prefix_list") | Boolean | | | | Include prefix-list references in missing policy decision. | + | [            include_sub_route_map](## ".[].bgp_peer_groups.[].missing_policy.direction_out.include_sub_route_map") | Boolean | | | | Include sub-route-map references in missing policy decision. | | [        link_bandwidth](## ".[].bgp_peer_groups.[].link_bandwidth") | Dictionary | | | | | | [          enabled](## ".[].bgp_peer_groups.[].link_bandwidth.enabled") | Boolean | | | | | - | [          default](## ".[].bgp_peer_groups.[].link_bandwidth.default") | String | | | | nn.nn(K|M|G) link speed in bits/second | + | [          default](## ".[].bgp_peer_groups.[].link_bandwidth.default") | String | | | | nn.nn(K|M|G) link speed in bits/second. | | [        allowas_in](## ".[].bgp_peer_groups.[].allowas_in") | Dictionary | | | | | | [          enabled](## ".[].bgp_peer_groups.[].allowas_in.enabled") | Boolean | | | | | - | [          times](## ".[].bgp_peer_groups.[].allowas_in.times") | Integer | | | Min: 1
Max: 10 | Number of local ASNs allowed in a BGP update | + | [          times](## ".[].bgp_peer_groups.[].allowas_in.times") | Integer | | | Min: 1
Max: 10 | Number of local ASNs allowed in a BGP update. | | [        weight](## ".[].bgp_peer_groups.[].weight") | Integer | | | Min: 0
Max: 65535 | | - | [        timers](## ".[].bgp_peer_groups.[].timers") | String | | | | BGP Keepalive and Hold Timer values in seconds as string "<0-3600> <0-3600>" | + | [        timers](## ".[].bgp_peer_groups.[].timers") | String | | | | BGP Keepalive and Hold Timer values in seconds as string "<0-3600> <0-3600>". | | [        rib_in_pre_policy_retain](## ".[].bgp_peer_groups.[].rib_in_pre_policy_retain") | Dictionary | | | | | | [          enabled](## ".[].bgp_peer_groups.[].rib_in_pre_policy_retain.enabled") | Boolean | | | | | | [          all](## ".[].bgp_peer_groups.[].rib_in_pre_policy_retain.all") | Boolean | | | | | - | [        route_map_in](## ".[].bgp_peer_groups.[].route_map_in") | String | | | | Inbound route-map name | - | [        route_map_out](## ".[].bgp_peer_groups.[].route_map_out") | String | | | | Outbound route-map name | - | [        bgp_listen_range_prefix](## ".[].bgp_peer_groups.[].bgp_listen_range_prefix") deprecated | String | | | | IP prefix range
note: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with
the new `listen_ranges` key above to avoid conflicts.
This key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead. | + | [        route_map_in](## ".[].bgp_peer_groups.[].route_map_in") | String | | | | Inbound route-map name. | + | [        route_map_out](## ".[].bgp_peer_groups.[].route_map_out") | String | | | | Outbound route-map name. | + | [        bgp_listen_range_prefix](## ".[].bgp_peer_groups.[].bgp_listen_range_prefix") deprecated | String | | | | IP prefix range.
note: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with
the new `listen_ranges` key above to avoid conflicts.
This key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead. | | [        session_tracker](## ".[].bgp_peer_groups.[].session_tracker") | String | | | | | + | [        shared_secret](## ".[].bgp_peer_groups.[].shared_secret") | Dictionary | | | | | + | [          profile](## ".[].bgp_peer_groups.[].shared_secret.profile") | String | Required | | | Name of profile defined under `management_security`. | + | [          hash_algorithm](## ".[].bgp_peer_groups.[].shared_secret.hash_algorithm") | String | Required | | Valid Values:
- aes-128-cmac-96
- hmac-sha-256
- hmac-sha1-96 | Note: Algorithm hmac-sha-256 requires EOS version 4.31.1F and above. | | [        ttl_maximum_hops](## ".[].bgp_peer_groups.[].ttl_maximum_hops") | Integer | | | Min: 0
Max: 254 | Maximum number of hops. | | [    vrfs](## ".[].vrfs") | List, items: Dictionary | | | | VRFs will only be configured on a node if any of the underlying objects like `svis` or `l3_interfaces` apply to the node.

It is recommended to only define a VRF in one Tenant. If the same VRF name is used across multiple tenants and those tenants
are accepted by `filter.tenants` on the node, any object set under the duplicate VRFs must either be unique or be an exact match.

VRF "default" is partially supported under network-services. Currently the supported options for "default" vrf are route-target,
route-distinguisher settings, structured_config, raw_eos_cli in bgp and SVIs are the only supported interface type.
Vlan-aware-bundles are supported as well inside default vrf. OSPF is not supported currently.
| | [      - name](## ".[].vrfs.[].name") | String | Required, Unique | | | | | [        bgp_peers](## ".[].vrfs.[].bgp_peers") | List, items: Dictionary | | | | List of BGP peer definitions.
This will configure BGP neighbors inside the tenant VRF for peering with external devices.
The configured peer will automatically be activated for ipv4 or ipv6 address family based on the ip address.
Note, only ipv4 and ipv6 address families are currently supported in eos_designs.
For other address families, use custom_structured configuration with eos_cli_config_gen.
| - | [          - ip_address](## ".[].vrfs.[].bgp_peers.[].ip_address") | String | Required, Unique | | | IPv4_address or IPv6_address. | + | [          - ip_address](## ".[].vrfs.[].bgp_peers.[].ip_address") | String | Required | | | IPv4_address or IPv6_address. | | [            peer_group](## ".[].vrfs.[].bgp_peers.[].peer_group") | String | | | | Peer group name. | | [            remote_as](## ".[].vrfs.[].bgp_peers.[].remote_as") | String | | | | BGP AS <1-4294967295> or AS number in asdot notation "<1-65535>.<0-65535>".
For asdot notation in YAML inputs, the value must be put in quotes, to prevent it from being interpreted as a float number. | | [            description](## ".[].vrfs.[].bgp_peers.[].description") | String | | | | | @@ -98,57 +132,91 @@ | [          - name](## ".[].vrfs.[].bgp_peer_groups.[].name") | String | | | | BGP peer group name. | | [            nodes](## ".[].vrfs.[].bgp_peer_groups.[].nodes") | List, items: String | | | | Nodes is required to restrict configuration of BGP neighbors to certain nodes in the network.
If not set the peer-group is created on devices which have a bgp_peer mapped to the corresponding peer_group.
| | [              - <str>](## ".[].vrfs.[].bgp_peer_groups.[].nodes.[]") | String | | | | | - | [            type](## ".[].vrfs.[].bgp_peer_groups.[].type") | String | | | | Key only used for documentation or validation purposes | + | [            address_family_ipv4](## ".[].vrfs.[].bgp_peer_groups.[].address_family_ipv4") | Dictionary | | | | | + | [              activate](## ".[].vrfs.[].bgp_peer_groups.[].address_family_ipv4.activate") | Boolean | | | | | + | [              route_map_in](## ".[].vrfs.[].bgp_peer_groups.[].address_family_ipv4.route_map_in") | String | | | | Inbound route-map name. | + | [              route_map_out](## ".[].vrfs.[].bgp_peer_groups.[].address_family_ipv4.route_map_out") | String | | | | Outbound route-map name. | + | [              default_originate](## ".[].vrfs.[].bgp_peer_groups.[].address_family_ipv4.default_originate") | Dictionary | | | | | + | [                always](## ".[].vrfs.[].bgp_peer_groups.[].address_family_ipv4.default_originate.always") | Boolean | | | | | + | [                route_map](## ".[].vrfs.[].bgp_peer_groups.[].address_family_ipv4.default_originate.route_map") | String | | | | Route-map name. | + | [              next_hop](## ".[].vrfs.[].bgp_peer_groups.[].address_family_ipv4.next_hop") | Dictionary | | | | | + | [                address_family_ipv6](## ".[].vrfs.[].bgp_peer_groups.[].address_family_ipv4.next_hop.address_family_ipv6") | Dictionary | | | | | + | [                  enabled](## ".[].vrfs.[].bgp_peer_groups.[].address_family_ipv4.next_hop.address_family_ipv6.enabled") | Boolean | Required | | | | + | [                  originate](## ".[].vrfs.[].bgp_peer_groups.[].address_family_ipv4.next_hop.address_family_ipv6.originate") | Boolean | | | | | + | [                address_family_ipv6_originate](## ".[].vrfs.[].bgp_peer_groups.[].address_family_ipv4.next_hop.address_family_ipv6_originate") deprecated | Boolean | | | | This key is deprecated. Support will be removed in AVD version 5.0.0. Use address_family_ipv6 instead. | + | [              prefix_list_in](## ".[].vrfs.[].bgp_peer_groups.[].address_family_ipv4.prefix_list_in") | String | | | | Inbound prefix-list name. | + | [              prefix_list_out](## ".[].vrfs.[].bgp_peer_groups.[].address_family_ipv4.prefix_list_out") | String | | | | Outbound prefix-list name. | + | [            address_family_ipv6](## ".[].vrfs.[].bgp_peer_groups.[].address_family_ipv6") | Dictionary | | | | | + | [              activate](## ".[].vrfs.[].bgp_peer_groups.[].address_family_ipv6.activate") | Boolean | | | | | + | [              route_map_in](## ".[].vrfs.[].bgp_peer_groups.[].address_family_ipv6.route_map_in") | String | | | | Inbound route-map name. | + | [              route_map_out](## ".[].vrfs.[].bgp_peer_groups.[].address_family_ipv6.route_map_out") | String | | | | Outbound route-map name. | + | [              prefix_list_in](## ".[].vrfs.[].bgp_peer_groups.[].address_family_ipv6.prefix_list_in") | String | | | | Inbound prefix-list name. | + | [              prefix_list_out](## ".[].vrfs.[].bgp_peer_groups.[].address_family_ipv6.prefix_list_out") | String | | | | Outbound prefix-list name. | + | [            type](## ".[].vrfs.[].bgp_peer_groups.[].type") | String | | | | Key only used for documentation or validation purposes. | | [            remote_as](## ".[].vrfs.[].bgp_peer_groups.[].remote_as") | String | | | | BGP AS <1-4294967295> or AS number in asdot notation "<1-65535>.<0-65535>".
For asdot notation in YAML inputs, the value must be put in quotes, to prevent it from being interpreted as a float number. | | [            local_as](## ".[].vrfs.[].bgp_peer_groups.[].local_as") | String | | | | BGP AS <1-4294967295> or AS number in asdot notation "<1-65535>.<0-65535>".
For asdot notation in YAML inputs, the value must be put in quotes, to prevent it from being interpreted as a float number. | | [            description](## ".[].vrfs.[].bgp_peer_groups.[].description") | String | | | | | | [            shutdown](## ".[].vrfs.[].bgp_peer_groups.[].shutdown") | Boolean | | | | | - | [            as_path](## ".[].vrfs.[].bgp_peer_groups.[].as_path") | Dictionary | | | | BGP AS-PATH options | - | [              remote_as_replace_out](## ".[].vrfs.[].bgp_peer_groups.[].as_path.remote_as_replace_out") | Boolean | | | | Replace AS number with local AS number | - | [              prepend_own_disabled](## ".[].vrfs.[].bgp_peer_groups.[].as_path.prepend_own_disabled") | Boolean | | | | Disable prepending own AS number to AS path | - | [            remove_private_as](## ".[].vrfs.[].bgp_peer_groups.[].remove_private_as") | Dictionary | | | | Remove private AS numbers in outbound AS path | + | [            as_path](## ".[].vrfs.[].bgp_peer_groups.[].as_path") | Dictionary | | | | BGP AS-PATH options. | + | [              remote_as_replace_out](## ".[].vrfs.[].bgp_peer_groups.[].as_path.remote_as_replace_out") | Boolean | | | | Replace AS number with local AS number. | + | [              prepend_own_disabled](## ".[].vrfs.[].bgp_peer_groups.[].as_path.prepend_own_disabled") | Boolean | | | | Disable prepending own AS number to AS path. | + | [            remove_private_as](## ".[].vrfs.[].bgp_peer_groups.[].remove_private_as") | Dictionary | | | | Remove private AS numbers in outbound AS path. | | [              enabled](## ".[].vrfs.[].bgp_peer_groups.[].remove_private_as.enabled") | Boolean | | | | | | [              all](## ".[].vrfs.[].bgp_peer_groups.[].remove_private_as.all") | Boolean | | | | | | [              replace_as](## ".[].vrfs.[].bgp_peer_groups.[].remove_private_as.replace_as") | Boolean | | | | | | [            remove_private_as_ingress](## ".[].vrfs.[].bgp_peer_groups.[].remove_private_as_ingress") | Dictionary | | | | | | [              enabled](## ".[].vrfs.[].bgp_peer_groups.[].remove_private_as_ingress.enabled") | Boolean | | | | | | [              replace_as](## ".[].vrfs.[].bgp_peer_groups.[].remove_private_as_ingress.replace_as") | Boolean | | | | | - | [            peer_filter](## ".[].vrfs.[].bgp_peer_groups.[].peer_filter") deprecated | String | | | | Peer-filter name
note: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with
the new `listen_ranges` key above to avoid conflicts.
This key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead. | + | [            peer_filter](## ".[].vrfs.[].bgp_peer_groups.[].peer_filter") deprecated | String | | | | Peer-filter name.
note: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with
the new `listen_ranges` key above to avoid conflicts.
This key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead. | | [            next_hop_unchanged](## ".[].vrfs.[].bgp_peer_groups.[].next_hop_unchanged") | Boolean | | | | | - | [            update_source](## ".[].vrfs.[].bgp_peer_groups.[].update_source") | String | | | | IP address or interface name | + | [            update_source](## ".[].vrfs.[].bgp_peer_groups.[].update_source") | String | | | | IP address or interface name. | | [            route_reflector_client](## ".[].vrfs.[].bgp_peer_groups.[].route_reflector_client") | Boolean | | | | | | [            bfd](## ".[].vrfs.[].bgp_peer_groups.[].bfd") | Boolean | | | | Enable BFD. | | [            bfd_timers](## ".[].vrfs.[].bgp_peer_groups.[].bfd_timers") | Dictionary | | | | Override default BFD timers. BFD must be enabled with `bfd: true`. | | [              interval](## ".[].vrfs.[].bgp_peer_groups.[].bfd_timers.interval") | Integer | Required | | Min: 50
Max: 60000 | Interval in milliseconds. | | [              min_rx](## ".[].vrfs.[].bgp_peer_groups.[].bfd_timers.min_rx") | Integer | Required | | Min: 50
Max: 60000 | Rate in milliseconds. | | [              multiplier](## ".[].vrfs.[].bgp_peer_groups.[].bfd_timers.multiplier") | Integer | Required | | Min: 3
Max: 50 | | - | [            ebgp_multihop](## ".[].vrfs.[].bgp_peer_groups.[].ebgp_multihop") | Integer | | | Min: 1
Max: 255 | Time-to-live in range of hops | + | [            ebgp_multihop](## ".[].vrfs.[].bgp_peer_groups.[].ebgp_multihop") | Integer | | | Min: 1
Max: 255 | Time-to-live in range of hops. | | [            next_hop_self](## ".[].vrfs.[].bgp_peer_groups.[].next_hop_self") | Boolean | | | | | | [            password](## ".[].vrfs.[].bgp_peer_groups.[].password") | String | | | | | | [            passive](## ".[].vrfs.[].bgp_peer_groups.[].passive") | Boolean | | | | | | [            default_originate](## ".[].vrfs.[].bgp_peer_groups.[].default_originate") | Dictionary | | | | | | [              enabled](## ".[].vrfs.[].bgp_peer_groups.[].default_originate.enabled") | Boolean | | | | | | [              always](## ".[].vrfs.[].bgp_peer_groups.[].default_originate.always") | Boolean | | | | | - | [              route_map](## ".[].vrfs.[].bgp_peer_groups.[].default_originate.route_map") | String | | | | Route-map name | - | [            send_community](## ".[].vrfs.[].bgp_peer_groups.[].send_community") | String | | | | 'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)' | - | [            maximum_routes](## ".[].vrfs.[].bgp_peer_groups.[].maximum_routes") | Integer | | | Min: 0
Max: 4294967294 | Maximum number of routes (0 means unlimited) | - | [            maximum_routes_warning_limit](## ".[].vrfs.[].bgp_peer_groups.[].maximum_routes_warning_limit") | String | | | | Maximum number of routes after which a warning is issued (0 means never warn) or
Percentage of maximum number of routes at which to warn ("<1-100> percent")
| + | [              route_map](## ".[].vrfs.[].bgp_peer_groups.[].default_originate.route_map") | String | | | | Route-map name. | + | [            send_community](## ".[].vrfs.[].bgp_peer_groups.[].send_community") | String | | | | 'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'. | + | [            maximum_routes](## ".[].vrfs.[].bgp_peer_groups.[].maximum_routes") | Integer | | | Min: 0
Max: 4294967294 | Maximum number of routes (0 means unlimited). | + | [            maximum_routes_warning_limit](## ".[].vrfs.[].bgp_peer_groups.[].maximum_routes_warning_limit") | String | | | | Maximum number of routes after which a warning is issued (0 means never warn) or
Percentage of maximum number of routes at which to warn ("<1-100> percent").
| | [            maximum_routes_warning_only](## ".[].vrfs.[].bgp_peer_groups.[].maximum_routes_warning_only") | Boolean | | | | | + | [            missing_policy](## ".[].vrfs.[].bgp_peer_groups.[].missing_policy") | Dictionary | | | | Missing policy configuration for all address-families. | + | [              direction_in](## ".[].vrfs.[].bgp_peer_groups.[].missing_policy.direction_in") | Dictionary | | | | Missing policy inbound direction. | + | [                action](## ".[].vrfs.[].bgp_peer_groups.[].missing_policy.direction_in.action") | String | Required | | Valid Values:
- deny
- permit
- deny-in-out | Missing policy action. | + | [                include_community_list](## ".[].vrfs.[].bgp_peer_groups.[].missing_policy.direction_in.include_community_list") | Boolean | | | | Include community-list references in missing policy decision. | + | [                include_prefix_list](## ".[].vrfs.[].bgp_peer_groups.[].missing_policy.direction_in.include_prefix_list") | Boolean | | | | Include prefix-list references in missing policy decision. | + | [                include_sub_route_map](## ".[].vrfs.[].bgp_peer_groups.[].missing_policy.direction_in.include_sub_route_map") | Boolean | | | | Include sub-route-map references in missing policy decision. | + | [              direction_out](## ".[].vrfs.[].bgp_peer_groups.[].missing_policy.direction_out") | Dictionary | | | | Missing policy outbound direction. | + | [                action](## ".[].vrfs.[].bgp_peer_groups.[].missing_policy.direction_out.action") | String | Required | | Valid Values:
- deny
- permit
- deny-in-out | Missing policy action. | + | [                include_community_list](## ".[].vrfs.[].bgp_peer_groups.[].missing_policy.direction_out.include_community_list") | Boolean | | | | Include community-list references in missing policy decision. | + | [                include_prefix_list](## ".[].vrfs.[].bgp_peer_groups.[].missing_policy.direction_out.include_prefix_list") | Boolean | | | | Include prefix-list references in missing policy decision. | + | [                include_sub_route_map](## ".[].vrfs.[].bgp_peer_groups.[].missing_policy.direction_out.include_sub_route_map") | Boolean | | | | Include sub-route-map references in missing policy decision. | | [            link_bandwidth](## ".[].vrfs.[].bgp_peer_groups.[].link_bandwidth") | Dictionary | | | | | | [              enabled](## ".[].vrfs.[].bgp_peer_groups.[].link_bandwidth.enabled") | Boolean | | | | | - | [              default](## ".[].vrfs.[].bgp_peer_groups.[].link_bandwidth.default") | String | | | | nn.nn(K|M|G) link speed in bits/second | + | [              default](## ".[].vrfs.[].bgp_peer_groups.[].link_bandwidth.default") | String | | | | nn.nn(K|M|G) link speed in bits/second. | | [            allowas_in](## ".[].vrfs.[].bgp_peer_groups.[].allowas_in") | Dictionary | | | | | | [              enabled](## ".[].vrfs.[].bgp_peer_groups.[].allowas_in.enabled") | Boolean | | | | | - | [              times](## ".[].vrfs.[].bgp_peer_groups.[].allowas_in.times") | Integer | | | Min: 1
Max: 10 | Number of local ASNs allowed in a BGP update | + | [              times](## ".[].vrfs.[].bgp_peer_groups.[].allowas_in.times") | Integer | | | Min: 1
Max: 10 | Number of local ASNs allowed in a BGP update. | | [            weight](## ".[].vrfs.[].bgp_peer_groups.[].weight") | Integer | | | Min: 0
Max: 65535 | | - | [            timers](## ".[].vrfs.[].bgp_peer_groups.[].timers") | String | | | | BGP Keepalive and Hold Timer values in seconds as string "<0-3600> <0-3600>" | + | [            timers](## ".[].vrfs.[].bgp_peer_groups.[].timers") | String | | | | BGP Keepalive and Hold Timer values in seconds as string "<0-3600> <0-3600>". | | [            rib_in_pre_policy_retain](## ".[].vrfs.[].bgp_peer_groups.[].rib_in_pre_policy_retain") | Dictionary | | | | | | [              enabled](## ".[].vrfs.[].bgp_peer_groups.[].rib_in_pre_policy_retain.enabled") | Boolean | | | | | | [              all](## ".[].vrfs.[].bgp_peer_groups.[].rib_in_pre_policy_retain.all") | Boolean | | | | | - | [            route_map_in](## ".[].vrfs.[].bgp_peer_groups.[].route_map_in") | String | | | | Inbound route-map name | - | [            route_map_out](## ".[].vrfs.[].bgp_peer_groups.[].route_map_out") | String | | | | Outbound route-map name | - | [            bgp_listen_range_prefix](## ".[].vrfs.[].bgp_peer_groups.[].bgp_listen_range_prefix") deprecated | String | | | | IP prefix range
note: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with
the new `listen_ranges` key above to avoid conflicts.
This key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead. | + | [            route_map_in](## ".[].vrfs.[].bgp_peer_groups.[].route_map_in") | String | | | | Inbound route-map name. | + | [            route_map_out](## ".[].vrfs.[].bgp_peer_groups.[].route_map_out") | String | | | | Outbound route-map name. | + | [            bgp_listen_range_prefix](## ".[].vrfs.[].bgp_peer_groups.[].bgp_listen_range_prefix") deprecated | String | | | | IP prefix range.
note: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with
the new `listen_ranges` key above to avoid conflicts.
This key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead. | | [            session_tracker](## ".[].vrfs.[].bgp_peer_groups.[].session_tracker") | String | | | | | + | [            shared_secret](## ".[].vrfs.[].bgp_peer_groups.[].shared_secret") | Dictionary | | | | | + | [              profile](## ".[].vrfs.[].bgp_peer_groups.[].shared_secret.profile") | String | Required | | | Name of profile defined under `management_security`. | + | [              hash_algorithm](## ".[].vrfs.[].bgp_peer_groups.[].shared_secret.hash_algorithm") | String | Required | | Valid Values:
- aes-128-cmac-96
- hmac-sha-256
- hmac-sha1-96 | Note: Algorithm hmac-sha-256 requires EOS version 4.31.1F and above. | | [            ttl_maximum_hops](## ".[].vrfs.[].bgp_peer_groups.[].ttl_maximum_hops") | Integer | | | Min: 0
Max: 254 | Maximum number of hops. | === "YAML" @@ -174,8 +242,49 @@ # If not set the peer-group is created on devices which have a bgp_peer mapped to the corresponding peer_group. nodes: - + address_family_ipv4: + activate: - # Key only used for documentation or validation purposes + # Inbound route-map name. + route_map_in: + + # Outbound route-map name. + route_map_out: + default_originate: + always: + + # Route-map name. + route_map: + next_hop: + address_family_ipv6: + enabled: + originate: + # This key is deprecated. + # Support will be removed in AVD version 5.0.0. + # Use address_family_ipv6 instead. + address_family_ipv6_originate: + + # Inbound prefix-list name. + prefix_list_in: + + # Outbound prefix-list name. + prefix_list_out: + address_family_ipv6: + activate: + + # Inbound route-map name. + route_map_in: + + # Outbound route-map name. + route_map_out: + + # Inbound prefix-list name. + prefix_list_in: + + # Outbound prefix-list name. + prefix_list_out: + + # Key only used for documentation or validation purposes. type: # BGP AS <1-4294967295> or AS number in asdot notation "<1-65535>.<0-65535>". @@ -188,16 +297,16 @@ description: shutdown: - # BGP AS-PATH options + # BGP AS-PATH options. as_path: - # Replace AS number with local AS number + # Replace AS number with local AS number. remote_as_replace_out: - # Disable prepending own AS number to AS path + # Disable prepending own AS number to AS path. prepend_own_disabled: - # Remove private AS numbers in outbound AS path + # Remove private AS numbers in outbound AS path. remove_private_as: enabled: all: @@ -206,7 +315,7 @@ enabled: replace_as: - # Peer-filter name + # Peer-filter name. # note: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with # the new `listen_ranges` key above to avoid conflicts. # This key is deprecated. @@ -215,7 +324,7 @@ peer_filter: next_hop_unchanged: - # IP address or interface name + # IP address or interface name. update_source: route_reflector_client: @@ -232,7 +341,7 @@ min_rx: multiplier: - # Time-to-live in range of hops + # Time-to-live in range of hops. ebgp_multihop: next_hop_self: password: @@ -241,44 +350,77 @@ enabled: always: - # Route-map name + # Route-map name. route_map: - # 'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)' + # 'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'. send_community: - # Maximum number of routes (0 means unlimited) + # Maximum number of routes (0 means unlimited). maximum_routes: # Maximum number of routes after which a warning is issued (0 means never warn) or - # Percentage of maximum number of routes at which to warn ("<1-100> percent") + # Percentage of maximum number of routes at which to warn ("<1-100> percent"). maximum_routes_warning_limit: maximum_routes_warning_only: + + # Missing policy configuration for all address-families. + missing_policy: + + # Missing policy inbound direction. + direction_in: + + # Missing policy action. + action: + + # Include community-list references in missing policy decision. + include_community_list: + + # Include prefix-list references in missing policy decision. + include_prefix_list: + + # Include sub-route-map references in missing policy decision. + include_sub_route_map: + + # Missing policy outbound direction. + direction_out: + + # Missing policy action. + action: + + # Include community-list references in missing policy decision. + include_community_list: + + # Include prefix-list references in missing policy decision. + include_prefix_list: + + # Include sub-route-map references in missing policy decision. + include_sub_route_map: link_bandwidth: enabled: - # nn.nn(K|M|G) link speed in bits/second + # nn.nn(K|M|G) link speed in bits/second. default: allowas_in: enabled: - # Number of local ASNs allowed in a BGP update + # Number of local ASNs allowed in a BGP update. times: weight: - # BGP Keepalive and Hold Timer values in seconds as string "<0-3600> <0-3600>" + # BGP Keepalive and Hold Timer values in seconds as string "<0-3600> <0-3600>". timers: rib_in_pre_policy_retain: enabled: all: - # Inbound route-map name + # Inbound route-map name. route_map_in: - # Outbound route-map name + # Outbound route-map name. route_map_out: - # IP prefix range + # IP prefix range. # note: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with # the new `listen_ranges` key above to avoid conflicts. # This key is deprecated. @@ -286,6 +428,13 @@ # Use listen_ranges instead. bgp_listen_range_prefix: session_tracker: + shared_secret: + + # Name of profile defined under `management_security`. + profile: + + # Note: Algorithm hmac-sha-256 requires EOS version 4.31.1F and above. + hash_algorithm: # Maximum number of hops. ttl_maximum_hops: @@ -387,8 +536,49 @@ # If not set the peer-group is created on devices which have a bgp_peer mapped to the corresponding peer_group. nodes: - + address_family_ipv4: + activate: - # Key only used for documentation or validation purposes + # Inbound route-map name. + route_map_in: + + # Outbound route-map name. + route_map_out: + default_originate: + always: + + # Route-map name. + route_map: + next_hop: + address_family_ipv6: + enabled: + originate: + # This key is deprecated. + # Support will be removed in AVD version 5.0.0. + # Use address_family_ipv6 instead. + address_family_ipv6_originate: + + # Inbound prefix-list name. + prefix_list_in: + + # Outbound prefix-list name. + prefix_list_out: + address_family_ipv6: + activate: + + # Inbound route-map name. + route_map_in: + + # Outbound route-map name. + route_map_out: + + # Inbound prefix-list name. + prefix_list_in: + + # Outbound prefix-list name. + prefix_list_out: + + # Key only used for documentation or validation purposes. type: # BGP AS <1-4294967295> or AS number in asdot notation "<1-65535>.<0-65535>". @@ -401,16 +591,16 @@ description: shutdown: - # BGP AS-PATH options + # BGP AS-PATH options. as_path: - # Replace AS number with local AS number + # Replace AS number with local AS number. remote_as_replace_out: - # Disable prepending own AS number to AS path + # Disable prepending own AS number to AS path. prepend_own_disabled: - # Remove private AS numbers in outbound AS path + # Remove private AS numbers in outbound AS path. remove_private_as: enabled: all: @@ -419,7 +609,7 @@ enabled: replace_as: - # Peer-filter name + # Peer-filter name. # note: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with # the new `listen_ranges` key above to avoid conflicts. # This key is deprecated. @@ -428,7 +618,7 @@ peer_filter: next_hop_unchanged: - # IP address or interface name + # IP address or interface name. update_source: route_reflector_client: @@ -445,7 +635,7 @@ min_rx: multiplier: - # Time-to-live in range of hops + # Time-to-live in range of hops. ebgp_multihop: next_hop_self: password: @@ -454,44 +644,77 @@ enabled: always: - # Route-map name + # Route-map name. route_map: - # 'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)' + # 'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'. send_community: - # Maximum number of routes (0 means unlimited) + # Maximum number of routes (0 means unlimited). maximum_routes: # Maximum number of routes after which a warning is issued (0 means never warn) or - # Percentage of maximum number of routes at which to warn ("<1-100> percent") + # Percentage of maximum number of routes at which to warn ("<1-100> percent"). maximum_routes_warning_limit: maximum_routes_warning_only: + + # Missing policy configuration for all address-families. + missing_policy: + + # Missing policy inbound direction. + direction_in: + + # Missing policy action. + action: + + # Include community-list references in missing policy decision. + include_community_list: + + # Include prefix-list references in missing policy decision. + include_prefix_list: + + # Include sub-route-map references in missing policy decision. + include_sub_route_map: + + # Missing policy outbound direction. + direction_out: + + # Missing policy action. + action: + + # Include community-list references in missing policy decision. + include_community_list: + + # Include prefix-list references in missing policy decision. + include_prefix_list: + + # Include sub-route-map references in missing policy decision. + include_sub_route_map: link_bandwidth: enabled: - # nn.nn(K|M|G) link speed in bits/second + # nn.nn(K|M|G) link speed in bits/second. default: allowas_in: enabled: - # Number of local ASNs allowed in a BGP update + # Number of local ASNs allowed in a BGP update. times: weight: - # BGP Keepalive and Hold Timer values in seconds as string "<0-3600> <0-3600>" + # BGP Keepalive and Hold Timer values in seconds as string "<0-3600> <0-3600>". timers: rib_in_pre_policy_retain: enabled: all: - # Inbound route-map name + # Inbound route-map name. route_map_in: - # Outbound route-map name + # Outbound route-map name. route_map_out: - # IP prefix range + # IP prefix range. # note: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with # the new `listen_ranges` key above to avoid conflicts. # This key is deprecated. @@ -499,6 +722,13 @@ # Use listen_ranges instead. bgp_listen_range_prefix: session_tracker: + shared_secret: + + # Name of profile defined under `management_security`. + profile: + + # Note: Algorithm hmac-sha-256 requires EOS version 4.31.1F and above. + hash_algorithm: # Maximum number of hops. ttl_maximum_hops: diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services-vrfs-l3-interfaces-settings.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services-vrfs-l3-interfaces-settings.md index c4d9b0a6724..6d024119619 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services-vrfs-l3-interfaces-settings.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services-vrfs-l3-interfaces-settings.md @@ -36,8 +36,11 @@ | [                - id](## ".[].vrfs.[].l3_interfaces.[].ospf.message_digest_keys.[].id") | Integer | | | | | | [                  hash_algorithm](## ".[].vrfs.[].l3_interfaces.[].ospf.message_digest_keys.[].hash_algorithm") | String | | `sha512` | Valid Values:
- md5
- sha1
- sha256
- sha384
- sha512 | | | [                  key](## ".[].vrfs.[].l3_interfaces.[].ospf.message_digest_keys.[].key") | String | | | | Key password. | - | [            pim](## ".[].vrfs.[].l3_interfaces.[].pim") | Dictionary | | | | Enable PIM sparse-mode on the interface; requires "evpn_l3_multicast" to be enabled on the VRF/Tenant
Enabling this implicitly makes the device a PIM External Gateway (PEG) in EVPN designs only.
At least one RP address must be configured for EVPN PEG to be configured.
| + | [            pim](## ".[].vrfs.[].l3_interfaces.[].pim") | Dictionary | | | | Enable PIM sparse-mode on the interface; requires "evpn_l3_multicast" to be enabled on the VRF/Tenant.
Enabling this implicitly makes the device a PIM External Gateway (PEG) in EVPN designs only.
At least one RP address must be configured for EVPN PEG to be configured.
| | [              enabled](## ".[].vrfs.[].l3_interfaces.[].pim.enabled") | Boolean | | | | | + | [            flow_tracking](## ".[].vrfs.[].l3_interfaces.[].flow_tracking") | Dictionary | | | | Configures flow-tracking on the interface. Overrides `fabric_flow_tracking.l3_interfaces` setting. | + | [              enabled](## ".[].vrfs.[].l3_interfaces.[].flow_tracking.enabled") | Boolean | | | | | + | [              name](## ".[].vrfs.[].l3_interfaces.[].flow_tracking.name") | String | | | | Flow tracker name as defined in flow_tracking_settings. | | [            structured_config](## ".[].vrfs.[].l3_interfaces.[].structured_config") | Dictionary | | | | Custom structured config added under ethernet_interfaces.[name=] for eos_cli_config_gen. | | [            raw_eos_cli](## ".[].vrfs.[].l3_interfaces.[].raw_eos_cli") | String | | | | EOS CLI rendered directly on the Ethernet interface in the final EOS configuration.
| @@ -110,12 +113,19 @@ # Key password. key: - # Enable PIM sparse-mode on the interface; requires "evpn_l3_multicast" to be enabled on the VRF/Tenant + # Enable PIM sparse-mode on the interface; requires "evpn_l3_multicast" to be enabled on the VRF/Tenant. # Enabling this implicitly makes the device a PIM External Gateway (PEG) in EVPN designs only. # At least one RP address must be configured for EVPN PEG to be configured. pim: enabled: + # Configures flow-tracking on the interface. Overrides `fabric_flow_tracking.l3_interfaces` setting. + flow_tracking: + enabled: + + # Flow tracker name as defined in flow_tracking_settings. + name: + # Custom structured config added under ethernet_interfaces.[name=] for eos_cli_config_gen. structured_config: diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services-vrfs-ospf-settings.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services-vrfs-ospf-settings.md index bc3863772ee..b16beb9b351 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services-vrfs-ospf-settings.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services-vrfs-ospf-settings.md @@ -29,7 +29,7 @@ | [        svis](## ".[].vrfs.[].svis") | List, items: Dictionary | | | | List of SVIs.
This will create both the L3 SVI and L2 VLAN based on filters applied to the node.
| | [          - id](## ".[].vrfs.[].svis.[].id") | Integer | Required | | Min: 1
Max: 4096 | SVI interface id and VLAN id. | | [            nodes](## ".[].vrfs.[].svis.[].nodes") | List, items: Dictionary | | | | Define node specific configuration, such as unique IP addresses.
Any keys set here will be merged onto the SVI config, except `structured_config` keys which will replace the `structured_config` set on SVI level.
| - | [              - node](## ".[].vrfs.[].svis.[].nodes.[].node") | String | Required, Unique | | | l3_leaf inventory hostname | + | [              - node](## ".[].vrfs.[].svis.[].nodes.[].node") | String | Required, Unique | | | l3_leaf inventory hostname. | | [                ospf](## ".[].vrfs.[].svis.[].nodes.[].ospf") | Dictionary | | | | OSPF interface configuration. | | [                  enabled](## ".[].vrfs.[].svis.[].nodes.[].ospf.enabled") | Boolean | | | | | | [                  point_to_point](## ".[].vrfs.[].svis.[].nodes.[].ospf.point_to_point") | Boolean | | `True` | | | @@ -53,9 +53,9 @@ | [                  hash_algorithm](## ".[].vrfs.[].svis.[].ospf.message_digest_keys.[].hash_algorithm") | String | | `sha512` | Valid Values:
- md5
- sha1
- sha256
- sha384
- sha512 | | | [                  key](## ".[].vrfs.[].svis.[].ospf.message_digest_keys.[].key") | String | | | | Type 7 encrypted key. | | [svi_profiles](## "svi_profiles") | List, items: Dictionary | | | | Profiles to share common settings for SVIs under `.[].vrfs.svis`.
Keys are the same used under SVIs. Keys defined under SVIs take precedence.
Note: structured configuration is not merged recursively and will be taken directly from the most specific level in the following order:
1. svi.nodes[inventory_hostname].structured_config
2. svi_profile.nodes[inventory_hostname].structured_config
3. svi_parent_profile.nodes[inventory_hostname].structured_config
4. svi.structured_config
5. svi_profile.structured_config
6. svi_parent_profile.structured_config
| - | [  - profile](## "svi_profiles.[].profile") | String | Required, Unique | | | Profile name | + | [  - profile](## "svi_profiles.[].profile") | String | Required, Unique | | | Profile name. | | [    nodes](## "svi_profiles.[].nodes") | List, items: Dictionary | | | | Define node specific configuration, such as unique IP addresses.
Any keys set here will be merged onto the SVI config, except `structured_config` keys which will replace the `structured_config` set on SVI level.
| - | [      - node](## "svi_profiles.[].nodes.[].node") | String | Required, Unique | | | l3_leaf inventory hostname | + | [      - node](## "svi_profiles.[].nodes.[].node") | String | Required, Unique | | | l3_leaf inventory hostname. | | [        ospf](## "svi_profiles.[].nodes.[].ospf") | Dictionary | | | | OSPF interface configuration. | | [          enabled](## "svi_profiles.[].nodes.[].ospf.enabled") | Boolean | | | | | | [          point_to_point](## "svi_profiles.[].nodes.[].ospf.point_to_point") | Boolean | | `True` | | | @@ -143,7 +143,7 @@ # Any keys set here will be merged onto the SVI config, except `structured_config` keys which will replace the `structured_config` set on SVI level. nodes: - # l3_leaf inventory hostname + # l3_leaf inventory hostname. - node: # OSPF interface configuration. @@ -199,14 +199,14 @@ # 6. svi_parent_profile.structured_config svi_profiles: - # Profile name + # Profile name. - profile: # Define node specific configuration, such as unique IP addresses. # Any keys set here will be merged onto the SVI config, except `structured_config` keys which will replace the `structured_config` set on SVI level. nodes: - # l3_leaf inventory hostname + # l3_leaf inventory hostname. - node: # OSPF interface configuration. diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services-vrfs-settings.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services-vrfs-settings.md index b27d152ceca..fc5f2d80e87 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services-vrfs-settings.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services-vrfs-settings.md @@ -18,8 +18,8 @@ | [        description](## ".[].vrfs.[].description") | String | | | | VRF description. | | [        vrf_vni](## ".[].vrfs.[].vrf_vni") | Integer | | | Min: 1
Max: 16777215 | Required if "vrf_id" is not set.
The VRF VNI range is not limited, but if vrf_id is not set, "vrf_vni" is used for calculating MLAG iBGP peering vlan id.
"vrf_vni" may also be used for VRF RD/RT ID. See "overlay_rd_type" and "overlay_rt_type" for details.
See "mlag_ibgp_peering_vrfs.base_vlan" for details.
If vrf_vni > 10000 make sure to adjust "mac_vrf_vni_base" accordingly to avoid overlap.
| | [        vrf_id](## ".[].vrfs.[].vrf_id") | Integer | | | | Required if "vrf_vni" is not set.
"vrf_id" is used as default value for "vrf_vni" and "ospf.process_id" unless those are set.
"vrf_id" may also be used for VRF RD/RT ID. See "overlay_rd_type" and "overlay_rt_type" for details.
"vrf_id" is preferred over "vrf_vni" for MLAG iBGP peering vlan, see "mlag_ibgp_peering_vrfs.base_vlan" for details.
| - | [        rd_override](## ".[].vrfs.[].rd_override") | String | | | | By default, the VRF RD will be derived from the pattern defined in `overlay_rd_type`.
The rd_override allows us to override this value and statically define it.

rd_override supports two formats:
- A single number will be used in the RD assigned number subfield (second part of the RD).
- A full RD string with colon seperator which will override the full RD.
| - | [        rt_override](## ".[].vrfs.[].rt_override") | String | | | | By default, the VRF RT will be derived from the pattern defined in `overlay_rt_type`.
The rt_override allows us to override this value and statically define it.

rt_override supports two formats:
- A single number will be used in the RT assigned number subfield (second part of the RT).
- A full RT string with colon seperator which will override the full RT.
| + | [        rd_override](## ".[].vrfs.[].rd_override") | String | | | | By default, the VRF RD will be derived from the pattern defined in `overlay_rd_type`.
The rd_override allows us to override this value and statically define it.

rd_override supports two formats:
- A single number will be used in the RD assigned number subfield (second part of the RD).
- A full RD string with colon separator which will override the full RD.
| + | [        rt_override](## ".[].vrfs.[].rt_override") | String | | | | By default, the VRF RT will be derived from the pattern defined in `overlay_rt_type`.
The rt_override allows us to override this value and statically define it.

rt_override supports two formats:
- A single number will be used in the RT assigned number subfield (second part of the RT).
- A full RT string with colon separator which will override the full RT.
| | [        mlag_ibgp_peering_ipv4_pool](## ".[].vrfs.[].mlag_ibgp_peering_ipv4_pool") | String | | | | IPv4_address/Mask
The subnet used for iBGP peering in the VRF.
Each MLAG pair will be assigned a subnet based on the ID of the primary MLAG switch.
If not set, "mlag_peer_l3_ipv4_pool" or "mlag_peer_ipv4_pool" will be used.
| | [        ip_helpers](## ".[].vrfs.[].ip_helpers") | List, items: Dictionary | | | | IP helper for DHCP relay. | | [          - ip_helper](## ".[].vrfs.[].ip_helpers.[].ip_helper") | String | Required, Unique | | | IPv4 DHCP server IP. | @@ -69,6 +69,8 @@ | [              - <str>](## ".[].vrfs.[].additional_route_targets.[].nodes.[]") | String | | | | | | [        raw_eos_cli](## ".[].vrfs.[].raw_eos_cli") | String | | | | EOS CLI rendered directly on the root level of the final EOS configuration. | | [        structured_config](## ".[].vrfs.[].structured_config") | Dictionary | | | | Custom structured config for eos_cli_config_gen. | + | [mlag_ibgp_peering_vrfs](## "mlag_ibgp_peering_vrfs") | Dictionary | | | | On mlag leafs, an SVI interface is defined per vrf, to establish iBGP peering (required when there are MLAG leafs in topology).
The SVI id will be derived from the base vlan defined: mlag_ibgp_peering_vrfs.base_vlan + (vrf_id or vrf_vni) - 1.
Depending on the values of vrf_id / vrf_vni it may be required to adjust the base_vlan to avoid overlaps or invalid vlan ids.
The SVI ip address derived from mlag_l3_peer_ipv4_pool is re-used across all iBGP peerings.
| + | [  base_vlan](## "mlag_ibgp_peering_vrfs.base_vlan") | Integer | | `3000` | Min: 1
Max: 4093 | | === "YAML" @@ -126,7 +128,7 @@ # # rd_override supports two formats: # - A single number will be used in the RD assigned number subfield (second part of the RD). - # - A full RD string with colon seperator which will override the full RD. + # - A full RD string with colon separator which will override the full RD. rd_override: # By default, the VRF RT will be derived from the pattern defined in `overlay_rt_type`. @@ -134,7 +136,7 @@ # # rt_override supports two formats: # - A single number will be used in the RT assigned number subfield (second part of the RT). - # - A full RT string with colon seperator which will override the full RT. + # - A full RT string with colon separator which will override the full RT. rt_override: # IPv4_address/Mask @@ -261,4 +263,11 @@ # Custom structured config for eos_cli_config_gen. structured_config: + + # On mlag leafs, an SVI interface is defined per vrf, to establish iBGP peering (required when there are MLAG leafs in topology). + # The SVI id will be derived from the base vlan defined: mlag_ibgp_peering_vrfs.base_vlan + (vrf_id or vrf_vni) - 1. + # Depending on the values of vrf_id / vrf_vni it may be required to adjust the base_vlan to avoid overlaps or invalid vlan ids. + # The SVI ip address derived from mlag_l3_peer_ipv4_pool is re-used across all iBGP peerings. + mlag_ibgp_peering_vrfs: + base_vlan: ``` diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services-vrfs-svis-settings.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services-vrfs-svis-settings.md index 4d004e5049b..2055fd0fa09 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services-vrfs-svis-settings.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services-vrfs-svis-settings.md @@ -17,73 +17,77 @@ | [            profile](## ".[].vrfs.[].svis.[].profile") | String | | | | SVI profile name to apply.
SVI can refer to one svi_profile which again can refer to another svi_profile to inherit settings in up to two levels (svi -> svi_profile -> svi_parent_profile).
| | [            tags](## ".[].vrfs.[].svis.[].tags") | List, items: String | | `['all']` | | Tags leveraged for networks services filtering.
Tags are matched against "filter.tags" defined under node type settings.
Tags are also matched against the "node_group" name under node type settings.
| | [              - <str>](## ".[].vrfs.[].svis.[].tags.[]") | String | | | | Tag value. | - | [            evpn_vlan_bundle](## ".[].vrfs.[].svis.[].evpn_vlan_bundle") | String | | | | Name of a bundle defined under 'evpn_vlan_bundles' to inherit configuration.
To use this option the common "evpn_vlan_aware_bundles" option must be set to true.
| + | [            evpn_vlan_bundle](## ".[].vrfs.[].svis.[].evpn_vlan_bundle") | String | | | | Name of a bundle defined under 'evpn_vlan_bundles' to inherit configuration.
This setting overrides "evpn_vlan_bundle" set at tenant level.
The common option "evpn_vlan_aware_bundles" is disregarded for this option.
| | [            nodes](## ".[].vrfs.[].svis.[].nodes") | List, items: Dictionary | | | | Define node specific configuration, such as unique IP addresses.
Any keys set here will be merged onto the SVI config, except `structured_config` keys which will replace the `structured_config` set on SVI level.
| - | [              - node](## ".[].vrfs.[].svis.[].nodes.[].node") | String | Required, Unique | | | l3_leaf inventory hostname | + | [              - node](## ".[].vrfs.[].svis.[].nodes.[].node") | String | Required, Unique | | | l3_leaf inventory hostname. | | [                tags](## ".[].vrfs.[].svis.[].nodes.[].tags") | List, items: String | | `['all']` | | Tags leveraged for networks services filtering.
Tags are matched against "filter.tags" defined under node type settings.
Tags are also matched against the "node_group" name under node type settings.
| | [                  - <str>](## ".[].vrfs.[].svis.[].nodes.[].tags.[]") | String | | | | Tag value. | - | [                name](## ".[].vrfs.[].svis.[].nodes.[].name") | String | | | | VLAN name | - | [                enabled](## ".[].vrfs.[].svis.[].nodes.[].enabled") | Boolean | | | | Enable or disable interface | + | [                name](## ".[].vrfs.[].svis.[].nodes.[].name") | String | | | | VLAN name. | + | [                enabled](## ".[].vrfs.[].svis.[].nodes.[].enabled") | Boolean | | | | Enable or disable interface. | | [                description](## ".[].vrfs.[].svis.[].nodes.[].description") | String | | | | SVI description. By default set to VLAN name.
| | [                ip_address](## ".[].vrfs.[].svis.[].nodes.[].ip_address") | String | | | | IPv4_address/Mask. Usually set under "nodes" to have unique IPv4 addresses per node. | | [                ipv6_address](## ".[].vrfs.[].svis.[].nodes.[].ipv6_address") | String | | | | IPv6_address/Mask. Usually set under "nodes" to have unique IPv6 addresses per node. | | [                ipv6_enable](## ".[].vrfs.[].svis.[].nodes.[].ipv6_enable") | Boolean | | | | Explicitly enable/disable link-local IPv6 addressing. | - | [                ip_address_virtual](## ".[].vrfs.[].svis.[].nodes.[].ip_address_virtual") | String | | | | IPv4_address/Mask
IPv4 VXLAN Anycast IP address
Conserves IP addresses in VXLAN deployments as it doesn't require unique IP addresses on each node.
| - | [                ipv6_address_virtual](## ".[].vrfs.[].svis.[].nodes.[].ipv6_address_virtual") deprecated | String | | | | IPv6_address/Mask
ipv6 address virtuals to configure VXLAN Anycast IP address (Optional)
If both "ipv6_address_virtual" and "ipv6_address_virtuals" are set, all addresses will be configured
This key is deprecated. Support will be removed in AVD version 5.0.0. Use ipv6_address_virtuals instead. | - | [                ipv6_address_virtuals](## ".[].vrfs.[].svis.[].nodes.[].ipv6_address_virtuals") | List, items: String | | | | IPv6 VXLAN Anycast IP addresses
Conserves IPv6 addresses in VXLAN deployments as it doesn't require unique IPv6 addresses on each node.
| - | [                  - <str>](## ".[].vrfs.[].svis.[].nodes.[].ipv6_address_virtuals.[]") | String | | | | IPv6_address/Mask | - | [                ip_address_virtual_secondaries](## ".[].vrfs.[].svis.[].nodes.[].ip_address_virtual_secondaries") | List, items: String | | | | Secondary IPv4 VXLAN Anycast IP addresses | - | [                  - <str>](## ".[].vrfs.[].svis.[].nodes.[].ip_address_virtual_secondaries.[]") | String | | | | IPv4_address/Mask | + | [                ip_address_virtual](## ".[].vrfs.[].svis.[].nodes.[].ip_address_virtual") | String | | | | IPv4_address/Mask.
IPv4 VXLAN Anycast IP address.
Conserves IP addresses in VXLAN deployments as it doesn't require unique IP addresses on each node.
| + | [                ipv6_address_virtual](## ".[].vrfs.[].svis.[].nodes.[].ipv6_address_virtual") deprecated | String | | | | IPv6_address/Mask.
ipv6 address virtuals to configure VXLAN Anycast IP address (Optional).
If both "ipv6_address_virtual" and "ipv6_address_virtuals" are set, all addresses will be configured.
This key is deprecated. Support will be removed in AVD version 5.0.0. Use ipv6_address_virtuals instead. | + | [                ipv6_address_virtuals](## ".[].vrfs.[].svis.[].nodes.[].ipv6_address_virtuals") | List, items: String | | | | IPv6 VXLAN Anycast IP addresses.
Conserves IPv6 addresses in VXLAN deployments as it doesn't require unique IPv6 addresses on each node.
| + | [                  - <str>](## ".[].vrfs.[].svis.[].nodes.[].ipv6_address_virtuals.[]") | String | | | | IPv6_address/Mask. | + | [                ip_address_virtual_secondaries](## ".[].vrfs.[].svis.[].nodes.[].ip_address_virtual_secondaries") | List, items: String | | | | Secondary IPv4 VXLAN Anycast IP addresses. | + | [                  - <str>](## ".[].vrfs.[].svis.[].nodes.[].ip_address_virtual_secondaries.[]") | String | | | | IPv4_address/Mask. | | [                ip_virtual_router_addresses](## ".[].vrfs.[].svis.[].nodes.[].ip_virtual_router_addresses") | List, items: String | | | | IPv4 VARP addresses.
Requires an IP address to be configured on the SVI.
If ip_address_virtual is also set, ip_virtual_router_addresses will take precedence
_if_ there is an ip_address configured for the node.
| - | [                  - <str>](## ".[].vrfs.[].svis.[].nodes.[].ip_virtual_router_addresses.[]") | String | | | | IPv4_address/Mask or IPv4_address
IPv4_address/Mask will also configure a static route to the SVI per best practice.
| + | [                  - <str>](## ".[].vrfs.[].svis.[].nodes.[].ip_virtual_router_addresses.[]") | String | | | | IPv4_address/Mask or IPv4_address.
IPv4_address/Mask will also configure a static route to the SVI per best practice.
| | [                ipv6_virtual_router_addresses](## ".[].vrfs.[].svis.[].nodes.[].ipv6_virtual_router_addresses") | List, items: String | | | | IPv6 VARP addresses.
Requires an IPv6 address to be configured on the SVI.
If ipv6_address_virtuals is also set, ipv6_virtual_router_addresses will take precedence
_if_ there is an ipv6_address configured for the node.
| - | [                  - <str>](## ".[].vrfs.[].svis.[].nodes.[].ipv6_virtual_router_addresses.[]") | String | | | | IPv6_address | - | [                ip_helpers](## ".[].vrfs.[].svis.[].nodes.[].ip_helpers") | List, items: Dictionary | | | | IP helper for DHCP relay | - | [                  - ip_helper](## ".[].vrfs.[].svis.[].nodes.[].ip_helpers.[].ip_helper") | String | Required, Unique | | | IPv4 DHCP server IP | + | [                  - <str>](## ".[].vrfs.[].svis.[].nodes.[].ipv6_virtual_router_addresses.[]") | String | | | | IPv6_address. | + | [                ipv4_acl_in](## ".[].vrfs.[].svis.[].nodes.[].ipv4_acl_in") | String | | | | Name of the IPv4 access-list to be assigned in the ingress direction.
The access-list must be defined under `ipv4_acls` and supports substitution of the field "interface_ip". | + | [                ipv4_acl_out](## ".[].vrfs.[].svis.[].nodes.[].ipv4_acl_out") | String | | | | Name of the IPv4 Access-list to be assigned in the egress direction.
The access-list must be defined under `ipv4_acls` and supports substitution of the field "interface_ip". | + | [                ip_helpers](## ".[].vrfs.[].svis.[].nodes.[].ip_helpers") | List, items: Dictionary | | | | IP helper for DHCP relay. | + | [                  - ip_helper](## ".[].vrfs.[].svis.[].nodes.[].ip_helpers.[].ip_helper") | String | Required, Unique | | | IPv4 DHCP server IP. | | [                    source_interface](## ".[].vrfs.[].svis.[].nodes.[].ip_helpers.[].source_interface") | String | | | | Interface name to originate DHCP relay packets to DHCP server. | | [                    source_vrf](## ".[].vrfs.[].svis.[].nodes.[].ip_helpers.[].source_vrf") | String | | | | VRF to originate DHCP relay packets to DHCP server. If not set, EOS uses the VRF on the SVI. | | [                vni_override](## ".[].vrfs.[].svis.[].nodes.[].vni_override") | Integer | | | Min: 1
Max: 16777215 | By default the VNI will be derived from "mac_vrf_vni_base".
The vni_override allows us to override this value and statically define it (optional).
| - | [                rt_override](## ".[].vrfs.[].svis.[].nodes.[].rt_override") | String | | | | By default the MAC VRF RT will be derived from mac_vrf_id_base + vlan_id.
The rt_override allows us to override this value and statically define it.
rt_override will default to vni_override if set.

rt_override supports two formats:
- A single number which will be used in the RT fields instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rt_type' for details).
- A full RT string with colon seperator which will override the full RT.
| - | [                rd_override](## ".[].vrfs.[].svis.[].nodes.[].rd_override") | String | | | | By default the MAC VRF RD will be derived from mac_vrf_id_base + vlan_id.
The rt_override allows us to override this value and statically define it.
rd_override will default to rt_override or vni_override if set.

rd_override supports two formats:
- A single number which will be used in the RD assigned number field instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rd_type' for details).
- A full RD string with colon seperator which will override the full RD.
| + | [                rt_override](## ".[].vrfs.[].svis.[].nodes.[].rt_override") | String | | | | By default the MAC VRF RT will be derived from mac_vrf_id_base + vlan_id.
The rt_override allows us to override this value and statically define it.
rt_override will default to vni_override if set.

rt_override supports two formats:
- A single number which will be used in the RT fields instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rt_type' for details).
- A full RT string with colon separator which will override the full RT.
| + | [                rd_override](## ".[].vrfs.[].svis.[].nodes.[].rd_override") | String | | | | By default the MAC VRF RD will be derived from mac_vrf_id_base + vlan_id.
The rt_override allows us to override this value and statically define it.
rd_override will default to rt_override or vni_override if set.

rd_override supports two formats:
- A single number which will be used in the RD assigned number field instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rd_type' for details).
- A full RD string with colon separator which will override the full RD.
| | [                trunk_groups](## ".[].vrfs.[].svis.[].nodes.[].trunk_groups") | List, items: String | | | | | | [                  - <str>](## ".[].vrfs.[].svis.[].nodes.[].trunk_groups.[]") | String | | | | Trunk groups are used for limiting vlans to trunk ports assigned to the same trunk group.
Requires "enable_trunk_groups: true".
| | [                vxlan](## ".[].vrfs.[].svis.[].nodes.[].vxlan") | Boolean | | `True` | | Extend this SVI over VXLAN. | | [                spanning_tree_priority](## ".[].vrfs.[].svis.[].nodes.[].spanning_tree_priority") | Integer | | | | Setting spanning-tree priority per VLAN is only supported with `spanning_tree_mode: rapid-pvst` under node type settings.
The default priority for rapid-PVST is set under the node type settings with `spanning_tree_priority` (default=32768). | | [                mtu](## ".[].vrfs.[].svis.[].nodes.[].mtu") | Integer | | | | Interface MTU. | | [                bgp](## ".[].vrfs.[].svis.[].nodes.[].bgp") | Dictionary | | | | | - | [                  structured_config](## ".[].vrfs.[].svis.[].nodes.[].bgp.structured_config") | Dictionary | | | | Structured configuration and EOS CLI commands rendered on router_bgp.vlans.[id=]
This configuration will not be applied to vlan aware bundles
| + | [                  structured_config](## ".[].vrfs.[].svis.[].nodes.[].bgp.structured_config") | Dictionary | | | | Structured configuration and EOS CLI commands rendered on router_bgp.vlans.[id=].
This configuration will not be applied to vlan aware bundles.
| | [                  raw_eos_cli](## ".[].vrfs.[].svis.[].nodes.[].bgp.raw_eos_cli") | String | | | | EOS CLI rendered directly on the Router BGP, VLAN definition in the final EOS configuration.
| | [                raw_eos_cli](## ".[].vrfs.[].svis.[].nodes.[].raw_eos_cli") | String | | | | EOS CLI rendered directly on the VLAN interface in the final EOS configuration.
| | [                structured_config](## ".[].vrfs.[].svis.[].nodes.[].structured_config") | Dictionary | | | | Custom structured config added under vlan_interfaces.[name=] for eos_cli_config_gen.
| - | [            enabled](## ".[].vrfs.[].svis.[].enabled") | Boolean | | | | Enable or disable interface | + | [            enabled](## ".[].vrfs.[].svis.[].enabled") | Boolean | | | | Enable or disable interface. | | [            description](## ".[].vrfs.[].svis.[].description") | String | | | | SVI description. By default set to VLAN name.
| | [            ip_address](## ".[].vrfs.[].svis.[].ip_address") | String | | | | IPv4_address/Mask. Usually set under "nodes" to have unique IPv4 addresses per node. | | [            ipv6_address](## ".[].vrfs.[].svis.[].ipv6_address") | String | | | | IPv6_address/Mask. Usually set under "nodes" to have unique IPv6 addresses per node. | | [            ipv6_enable](## ".[].vrfs.[].svis.[].ipv6_enable") | Boolean | | | | Explicitly enable/disable link-local IPv6 addressing. | - | [            ip_address_virtual](## ".[].vrfs.[].svis.[].ip_address_virtual") | String | | | | IPv4_address/Mask
IPv4 VXLAN Anycast IP address
Conserves IP addresses in VXLAN deployments as it doesn't require unique IP addresses on each node.
| - | [            ipv6_address_virtual](## ".[].vrfs.[].svis.[].ipv6_address_virtual") deprecated | String | | | | IPv6_address/Mask
ipv6 address virtuals to configure VXLAN Anycast IP address (Optional)
If both "ipv6_address_virtual" and "ipv6_address_virtuals" are set, all addresses will be configured
This key is deprecated. Support will be removed in AVD version 5.0.0. Use ipv6_address_virtuals instead. | - | [            ipv6_address_virtuals](## ".[].vrfs.[].svis.[].ipv6_address_virtuals") | List, items: String | | | | IPv6 VXLAN Anycast IP addresses
Conserves IPv6 addresses in VXLAN deployments as it doesn't require unique IPv6 addresses on each node.
| - | [              - <str>](## ".[].vrfs.[].svis.[].ipv6_address_virtuals.[]") | String | | | | IPv6_address/Mask | - | [            ip_address_virtual_secondaries](## ".[].vrfs.[].svis.[].ip_address_virtual_secondaries") | List, items: String | | | | Secondary IPv4 VXLAN Anycast IP addresses | - | [              - <str>](## ".[].vrfs.[].svis.[].ip_address_virtual_secondaries.[]") | String | | | | IPv4_address/Mask | + | [            ip_address_virtual](## ".[].vrfs.[].svis.[].ip_address_virtual") | String | | | | IPv4_address/Mask.
IPv4 VXLAN Anycast IP address.
Conserves IP addresses in VXLAN deployments as it doesn't require unique IP addresses on each node.
| + | [            ipv6_address_virtual](## ".[].vrfs.[].svis.[].ipv6_address_virtual") deprecated | String | | | | IPv6_address/Mask.
ipv6 address virtuals to configure VXLAN Anycast IP address (Optional).
If both "ipv6_address_virtual" and "ipv6_address_virtuals" are set, all addresses will be configured.
This key is deprecated. Support will be removed in AVD version 5.0.0. Use ipv6_address_virtuals instead. | + | [            ipv6_address_virtuals](## ".[].vrfs.[].svis.[].ipv6_address_virtuals") | List, items: String | | | | IPv6 VXLAN Anycast IP addresses.
Conserves IPv6 addresses in VXLAN deployments as it doesn't require unique IPv6 addresses on each node.
| + | [              - <str>](## ".[].vrfs.[].svis.[].ipv6_address_virtuals.[]") | String | | | | IPv6_address/Mask. | + | [            ip_address_virtual_secondaries](## ".[].vrfs.[].svis.[].ip_address_virtual_secondaries") | List, items: String | | | | Secondary IPv4 VXLAN Anycast IP addresses. | + | [              - <str>](## ".[].vrfs.[].svis.[].ip_address_virtual_secondaries.[]") | String | | | | IPv4_address/Mask. | | [            ip_virtual_router_addresses](## ".[].vrfs.[].svis.[].ip_virtual_router_addresses") | List, items: String | | | | IPv4 VARP addresses.
Requires an IP address to be configured on the SVI.
If ip_address_virtual is also set, ip_virtual_router_addresses will take precedence
_if_ there is an ip_address configured for the node.
| - | [              - <str>](## ".[].vrfs.[].svis.[].ip_virtual_router_addresses.[]") | String | | | | IPv4_address/Mask or IPv4_address
IPv4_address/Mask will also configure a static route to the SVI per best practice.
| + | [              - <str>](## ".[].vrfs.[].svis.[].ip_virtual_router_addresses.[]") | String | | | | IPv4_address/Mask or IPv4_address.
IPv4_address/Mask will also configure a static route to the SVI per best practice.
| | [            ipv6_virtual_router_addresses](## ".[].vrfs.[].svis.[].ipv6_virtual_router_addresses") | List, items: String | | | | IPv6 VARP addresses.
Requires an IPv6 address to be configured on the SVI.
If ipv6_address_virtuals is also set, ipv6_virtual_router_addresses will take precedence
_if_ there is an ipv6_address configured for the node.
| - | [              - <str>](## ".[].vrfs.[].svis.[].ipv6_virtual_router_addresses.[]") | String | | | | IPv6_address | - | [            ip_helpers](## ".[].vrfs.[].svis.[].ip_helpers") | List, items: Dictionary | | | | IP helper for DHCP relay | - | [              - ip_helper](## ".[].vrfs.[].svis.[].ip_helpers.[].ip_helper") | String | Required, Unique | | | IPv4 DHCP server IP | + | [              - <str>](## ".[].vrfs.[].svis.[].ipv6_virtual_router_addresses.[]") | String | | | | IPv6_address. | + | [            ipv4_acl_in](## ".[].vrfs.[].svis.[].ipv4_acl_in") | String | | | | Name of the IPv4 access-list to be assigned in the ingress direction.
The access-list must be defined under `ipv4_acls` and supports substitution of the field "interface_ip". | + | [            ipv4_acl_out](## ".[].vrfs.[].svis.[].ipv4_acl_out") | String | | | | Name of the IPv4 Access-list to be assigned in the egress direction.
The access-list must be defined under `ipv4_acls` and supports substitution of the field "interface_ip". | + | [            ip_helpers](## ".[].vrfs.[].svis.[].ip_helpers") | List, items: Dictionary | | | | IP helper for DHCP relay. | + | [              - ip_helper](## ".[].vrfs.[].svis.[].ip_helpers.[].ip_helper") | String | Required, Unique | | | IPv4 DHCP server IP. | | [                source_interface](## ".[].vrfs.[].svis.[].ip_helpers.[].source_interface") | String | | | | Interface name to originate DHCP relay packets to DHCP server. | | [                source_vrf](## ".[].vrfs.[].svis.[].ip_helpers.[].source_vrf") | String | | | | VRF to originate DHCP relay packets to DHCP server. If not set, EOS uses the VRF on the SVI. | | [            vni_override](## ".[].vrfs.[].svis.[].vni_override") | Integer | | | Min: 1
Max: 16777215 | By default the VNI will be derived from "mac_vrf_vni_base".
The vni_override allows us to override this value and statically define it (optional).
| - | [            rt_override](## ".[].vrfs.[].svis.[].rt_override") | String | | | | By default the MAC VRF RT will be derived from mac_vrf_id_base + vlan_id.
The rt_override allows us to override this value and statically define it.
rt_override will default to vni_override if set.

rt_override supports two formats:
- A single number which will be used in the RT fields instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rt_type' for details).
- A full RT string with colon seperator which will override the full RT.
| - | [            rd_override](## ".[].vrfs.[].svis.[].rd_override") | String | | | | By default the MAC VRF RD will be derived from mac_vrf_id_base + vlan_id.
The rt_override allows us to override this value and statically define it.
rd_override will default to rt_override or vni_override if set.

rd_override supports two formats:
- A single number which will be used in the RD assigned number field instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rd_type' for details).
- A full RD string with colon seperator which will override the full RD.
| + | [            rt_override](## ".[].vrfs.[].svis.[].rt_override") | String | | | | By default the MAC VRF RT will be derived from mac_vrf_id_base + vlan_id.
The rt_override allows us to override this value and statically define it.
rt_override will default to vni_override if set.

rt_override supports two formats:
- A single number which will be used in the RT fields instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rt_type' for details).
- A full RT string with colon separator which will override the full RT.
| + | [            rd_override](## ".[].vrfs.[].svis.[].rd_override") | String | | | | By default the MAC VRF RD will be derived from mac_vrf_id_base + vlan_id.
The rt_override allows us to override this value and statically define it.
rd_override will default to rt_override or vni_override if set.

rd_override supports two formats:
- A single number which will be used in the RD assigned number field instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rd_type' for details).
- A full RD string with colon separator which will override the full RD.
| | [            trunk_groups](## ".[].vrfs.[].svis.[].trunk_groups") | List, items: String | | | | | | [              - <str>](## ".[].vrfs.[].svis.[].trunk_groups.[]") | String | | | | Trunk groups are used for limiting vlans to trunk ports assigned to the same trunk group.
Requires "enable_trunk_groups: true".
| | [            vxlan](## ".[].vrfs.[].svis.[].vxlan") | Boolean | | `True` | | Extend this SVI over VXLAN. | | [            spanning_tree_priority](## ".[].vrfs.[].svis.[].spanning_tree_priority") | Integer | | | | Setting spanning-tree priority per VLAN is only supported with `spanning_tree_mode: rapid-pvst` under node type settings.
The default priority for rapid-PVST is set under the node type settings with `spanning_tree_priority` (default=32768). | | [            mtu](## ".[].vrfs.[].svis.[].mtu") | Integer | | | | Interface MTU. | | [            bgp](## ".[].vrfs.[].svis.[].bgp") | Dictionary | | | | | - | [              structured_config](## ".[].vrfs.[].svis.[].bgp.structured_config") | Dictionary | | | | Structured configuration and EOS CLI commands rendered on router_bgp.vlans.[id=]
This configuration will not be applied to vlan aware bundles
| + | [              structured_config](## ".[].vrfs.[].svis.[].bgp.structured_config") | Dictionary | | | | Structured configuration and EOS CLI commands rendered on router_bgp.vlans.[id=].
This configuration will not be applied to vlan aware bundles.
| | [              raw_eos_cli](## ".[].vrfs.[].svis.[].bgp.raw_eos_cli") | String | | | | EOS CLI rendered directly on the Router BGP, VLAN definition in the final EOS configuration.
| | [            raw_eos_cli](## ".[].vrfs.[].svis.[].raw_eos_cli") | String | | | | EOS CLI rendered directly on the VLAN interface in the final EOS configuration.
| | [            structured_config](## ".[].vrfs.[].svis.[].structured_config") | Dictionary | | | | Custom structured config added under vlan_interfaces.[name=] for eos_cli_config_gen.
| @@ -132,14 +136,15 @@ - # Name of a bundle defined under 'evpn_vlan_bundles' to inherit configuration. - # To use this option the common "evpn_vlan_aware_bundles" option must be set to true. + # This setting overrides "evpn_vlan_bundle" set at tenant level. + # The common option "evpn_vlan_aware_bundles" is disregarded for this option. evpn_vlan_bundle: # Define node specific configuration, such as unique IP addresses. # Any keys set here will be merged onto the SVI config, except `structured_config` keys which will replace the `structured_config` set on SVI level. nodes: - # l3_leaf inventory hostname + # l3_leaf inventory hostname. - node: # Tags leveraged for networks services filtering. @@ -150,10 +155,10 @@ # Tag value. - - # VLAN name + # VLAN name. name: - # Enable or disable interface + # Enable or disable interface. enabled: # SVI description. By default set to VLAN name. @@ -168,30 +173,30 @@ # Explicitly enable/disable link-local IPv6 addressing. ipv6_enable: - # IPv4_address/Mask - # IPv4 VXLAN Anycast IP address + # IPv4_address/Mask. + # IPv4 VXLAN Anycast IP address. # Conserves IP addresses in VXLAN deployments as it doesn't require unique IP addresses on each node. ip_address_virtual: - # IPv6_address/Mask - # ipv6 address virtuals to configure VXLAN Anycast IP address (Optional) - # If both "ipv6_address_virtual" and "ipv6_address_virtuals" are set, all addresses will be configured + # IPv6_address/Mask. + # ipv6 address virtuals to configure VXLAN Anycast IP address (Optional). + # If both "ipv6_address_virtual" and "ipv6_address_virtuals" are set, all addresses will be configured. # This key is deprecated. # Support will be removed in AVD version 5.0.0. # Use ipv6_address_virtuals instead. ipv6_address_virtual: - # IPv6 VXLAN Anycast IP addresses + # IPv6 VXLAN Anycast IP addresses. # Conserves IPv6 addresses in VXLAN deployments as it doesn't require unique IPv6 addresses on each node. ipv6_address_virtuals: - # IPv6_address/Mask + # IPv6_address/Mask. - - # Secondary IPv4 VXLAN Anycast IP addresses + # Secondary IPv4 VXLAN Anycast IP addresses. ip_address_virtual_secondaries: - # IPv4_address/Mask + # IPv4_address/Mask. - # IPv4 VARP addresses. @@ -200,7 +205,7 @@ # _if_ there is an ip_address configured for the node. ip_virtual_router_addresses: - # IPv4_address/Mask or IPv4_address + # IPv4_address/Mask or IPv4_address. # IPv4_address/Mask will also configure a static route to the SVI per best practice. - @@ -210,13 +215,21 @@ # _if_ there is an ipv6_address configured for the node. ipv6_virtual_router_addresses: - # IPv6_address + # IPv6_address. - - # IP helper for DHCP relay + # Name of the IPv4 access-list to be assigned in the ingress direction. + # The access-list must be defined under `ipv4_acls` and supports substitution of the field "interface_ip". + ipv4_acl_in: + + # Name of the IPv4 Access-list to be assigned in the egress direction. + # The access-list must be defined under `ipv4_acls` and supports substitution of the field "interface_ip". + ipv4_acl_out: + + # IP helper for DHCP relay. ip_helpers: - # IPv4 DHCP server IP + # IPv4 DHCP server IP. - ip_helper: # Interface name to originate DHCP relay packets to DHCP server. @@ -235,7 +248,7 @@ # # rt_override supports two formats: # - A single number which will be used in the RT fields instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rt_type' for details). - # - A full RT string with colon seperator which will override the full RT. + # - A full RT string with colon separator which will override the full RT. rt_override: # By default the MAC VRF RD will be derived from mac_vrf_id_base + vlan_id. @@ -244,7 +257,7 @@ # # rd_override supports two formats: # - A single number which will be used in the RD assigned number field instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rd_type' for details). - # - A full RD string with colon seperator which will override the full RD. + # - A full RD string with colon separator which will override the full RD. rd_override: trunk_groups: @@ -263,8 +276,8 @@ mtu: bgp: - # Structured configuration and EOS CLI commands rendered on router_bgp.vlans.[id=] - # This configuration will not be applied to vlan aware bundles + # Structured configuration and EOS CLI commands rendered on router_bgp.vlans.[id=]. + # This configuration will not be applied to vlan aware bundles. structured_config: # EOS CLI rendered directly on the Router BGP, VLAN definition in the final EOS configuration. @@ -276,7 +289,7 @@ # Custom structured config added under vlan_interfaces.[name=] for eos_cli_config_gen. structured_config: - # Enable or disable interface + # Enable or disable interface. enabled: # SVI description. By default set to VLAN name. @@ -291,30 +304,30 @@ # Explicitly enable/disable link-local IPv6 addressing. ipv6_enable: - # IPv4_address/Mask - # IPv4 VXLAN Anycast IP address + # IPv4_address/Mask. + # IPv4 VXLAN Anycast IP address. # Conserves IP addresses in VXLAN deployments as it doesn't require unique IP addresses on each node. ip_address_virtual: - # IPv6_address/Mask - # ipv6 address virtuals to configure VXLAN Anycast IP address (Optional) - # If both "ipv6_address_virtual" and "ipv6_address_virtuals" are set, all addresses will be configured + # IPv6_address/Mask. + # ipv6 address virtuals to configure VXLAN Anycast IP address (Optional). + # If both "ipv6_address_virtual" and "ipv6_address_virtuals" are set, all addresses will be configured. # This key is deprecated. # Support will be removed in AVD version 5.0.0. # Use ipv6_address_virtuals instead. ipv6_address_virtual: - # IPv6 VXLAN Anycast IP addresses + # IPv6 VXLAN Anycast IP addresses. # Conserves IPv6 addresses in VXLAN deployments as it doesn't require unique IPv6 addresses on each node. ipv6_address_virtuals: - # IPv6_address/Mask + # IPv6_address/Mask. - - # Secondary IPv4 VXLAN Anycast IP addresses + # Secondary IPv4 VXLAN Anycast IP addresses. ip_address_virtual_secondaries: - # IPv4_address/Mask + # IPv4_address/Mask. - # IPv4 VARP addresses. @@ -323,7 +336,7 @@ # _if_ there is an ip_address configured for the node. ip_virtual_router_addresses: - # IPv4_address/Mask or IPv4_address + # IPv4_address/Mask or IPv4_address. # IPv4_address/Mask will also configure a static route to the SVI per best practice. - @@ -333,13 +346,21 @@ # _if_ there is an ipv6_address configured for the node. ipv6_virtual_router_addresses: - # IPv6_address + # IPv6_address. - - # IP helper for DHCP relay + # Name of the IPv4 access-list to be assigned in the ingress direction. + # The access-list must be defined under `ipv4_acls` and supports substitution of the field "interface_ip". + ipv4_acl_in: + + # Name of the IPv4 Access-list to be assigned in the egress direction. + # The access-list must be defined under `ipv4_acls` and supports substitution of the field "interface_ip". + ipv4_acl_out: + + # IP helper for DHCP relay. ip_helpers: - # IPv4 DHCP server IP + # IPv4 DHCP server IP. - ip_helper: # Interface name to originate DHCP relay packets to DHCP server. @@ -358,7 +379,7 @@ # # rt_override supports two formats: # - A single number which will be used in the RT fields instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rt_type' for details). - # - A full RT string with colon seperator which will override the full RT. + # - A full RT string with colon separator which will override the full RT. rt_override: # By default the MAC VRF RD will be derived from mac_vrf_id_base + vlan_id. @@ -367,7 +388,7 @@ # # rd_override supports two formats: # - A single number which will be used in the RD assigned number field instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rd_type' for details). - # - A full RD string with colon seperator which will override the full RD. + # - A full RD string with colon separator which will override the full RD. rd_override: trunk_groups: @@ -386,8 +407,8 @@ mtu: bgp: - # Structured configuration and EOS CLI commands rendered on router_bgp.vlans.[id=] - # This configuration will not be applied to vlan aware bundles + # Structured configuration and EOS CLI commands rendered on router_bgp.vlans.[id=]. + # This configuration will not be applied to vlan aware bundles. structured_config: # EOS CLI rendered directly on the Router BGP, VLAN definition in the final EOS configuration. diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services.md index f4937178b68..176f67c0585 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/network-services.md @@ -12,6 +12,7 @@ | [    mac_vrf_vni_base](## ".[].mac_vrf_vni_base") | Integer | | | Min: 0
Max: 16770000 | Base number for MAC VRF VXLAN Network Identifier (required with VXLAN).
VXLAN VNI is derived from the base number with simple addition.
i.e. mac_vrf_vni_base = 10000, svi 100 = VNI 10100, svi 300 = VNI 10300.
| | [    mac_vrf_id_base](## ".[].mac_vrf_id_base") | Integer | | | Min: 0
Max: 16770000 | If not set, "mac_vrf_vni_base" will be used.
Base number for MAC VRF RD/RT ID (Required unless mac_vrf_vni_base is set)
ID is derived from the base number with simple addition.
i.e. mac_vrf_id_base = 10000, svi 100 = RD/RT 10100, svi 300 = RD/RT 10300.
| | [    vlan_aware_bundle_number_base](## ".[].vlan_aware_bundle_number_base") | Integer | | `0` | | Base number for VLAN aware bundle RD/RT.
The "Assigned Number" part of RD/RT is derived from vrf_vni + vlan_aware_bundle_number_base.
| + | [    evpn_vlan_bundle](## ".[].evpn_vlan_bundle") | String | | | | Enable `evpn_vlan_bundle` for all l2vlans and SVIs under the tenant. This `evpn_vlan_bundle` should be present in `evpn_vlan_bundles`. | | [    evpn_l2_multi_domain](## ".[].evpn_l2_multi_domain") | Boolean | | `True` | | Explicitly extend all VLANs/VLAN-Aware Bundles inside the tenant to remote EVPN domains. | === "YAML" @@ -39,6 +40,9 @@ # The "Assigned Number" part of RD/RT is derived from vrf_vni + vlan_aware_bundle_number_base. vlan_aware_bundle_number_base: + # Enable `evpn_vlan_bundle` for all l2vlans and SVIs under the tenant. This `evpn_vlan_bundle` should be present in `evpn_vlan_bundles`. + evpn_vlan_bundle: + # Explicitly extend all VLANs/VLAN-Aware Bundles inside the tenant to remote EVPN domains. evpn_l2_multi_domain: ``` diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/node-type-keys.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/node-type-keys.md index fea8f44b84b..a8beac35d04 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/node-type-keys.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/node-type-keys.md @@ -20,6 +20,7 @@ | [      - <str>](## "node_type_keys.[].default_overlay_address_families.[]") | String | | | Value is converted to lower case.
Valid Values:
- evpn
- vpn-ipv4
- vpn-ipv6 | | | [    default_evpn_encapsulation](## "node_type_keys.[].default_evpn_encapsulation") | String | | | Value is converted to lower case.
Valid Values:
- mpls
- vxlan | Set the default evpn encapsulation.
| | [    default_wan_role](## "node_type_keys.[].default_wan_role") | String | | | Valid Values:
- client
- server | Set the default WAN role.

This is used both for AutoVPN and Pathfinder designs.
That means if `wan_mode` root key is set to `autovpn` or `cv-pathfinder`.
`server` indicates that the router is a route-reflector.

Only supported if `overlay_routing_protocol` is set to `ibgp`.
| + | [    default_flow_tracker_type](## "node_type_keys.[].default_flow_tracker_type") | String | | `sampled` | Valid Values:
- sampled
- hardware | Set the default flow tracker type. | | [    mlag_support](## "node_type_keys.[].mlag_support") | Boolean | | `False` | | Can this node type support mlag. | | [    network_services](## "node_type_keys.[].network_services") | Dictionary | | | | Will network services be deployed on this node type. | | [      l1](## "node_type_keys.[].network_services.l1") | Boolean | | `False` | | ?? | @@ -44,7 +45,7 @@ | [      p2p_uplinks_peer_ip](## "node_type_keys.[].ip_addressing.p2p_uplinks_peer_ip") | String | | | | Path to Custom J2 template. | | [      vtep_ip_mlag](## "node_type_keys.[].ip_addressing.vtep_ip_mlag") | String | | | | Path to Custom J2 template. | | [      vtep_ip](## "node_type_keys.[].ip_addressing.vtep_ip") | String | | | | Path to Custom J2 template. | - | [    interface_descriptions](## "node_type_keys.[].interface_descriptions") | Dictionary | | | | Override interface_descriptions templates
If description templates use Jinja2, they have to strip whitespaces using {%- -%} on any code blocks.
| + | [    interface_descriptions](## "node_type_keys.[].interface_descriptions") | Dictionary | | | | Override interface_descriptions templates.
If description templates use Jinja2, they have to strip whitespaces using {%- -%} on any code blocks.
| | [      python_module](## "node_type_keys.[].interface_descriptions.python_module") | String | | | | Custom Python Module to import for interface descriptions. | | [      python_class_name](## "node_type_keys.[].interface_descriptions.python_class_name") | String | | | | Name of Custom Python Class to import for interface descriptions. | | [      underlay_ethernet_interfaces](## "node_type_keys.[].interface_descriptions.underlay_ethernet_interfaces") | String | | | | Path to Custom J2 template. | @@ -106,6 +107,9 @@ # Only supported if `overlay_routing_protocol` is set to `ibgp`. default_wan_role: + # Set the default flow tracker type. + default_flow_tracker_type: + # Can this node type support mlag. mlag_support: @@ -192,7 +196,7 @@ # Path to Custom J2 template. vtep_ip: - # Override interface_descriptions templates + # Override interface_descriptions templates. # If description templates use Jinja2, they have to strip whitespaces using {%- -%} on any code blocks. interface_descriptions: diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/node-type-l2-mlag-configuration.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/node-type-l2-mlag-configuration.md index 0e083b96b34..d86242398ff 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/node-type-l2-mlag-configuration.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/node-type-l2-mlag-configuration.md @@ -22,7 +22,9 @@ | [    mlag_peer_l3_ipv4_pool](## ".defaults.mlag_peer_l3_ipv4_pool") | String | | | Format: ipv4_cidr | IP address pool used for MLAG underlay L3 peering. IP is derived from the node id.
Required when MLAG leafs present in topology and they are using a separate L3 peering VLAN.
| | [    mlag_peer_vlan](## ".defaults.mlag_peer_vlan") | Integer | | `4094` | Min: 1
Max: 4094 | MLAG Peer Link (control link) SVI interface id. | | [    mlag_peer_link_allowed_vlans](## ".defaults.mlag_peer_link_allowed_vlans") | String | | | | | - | [    mlag_peer_ipv4_pool](## ".defaults.mlag_peer_ipv4_pool") | String | | | Format: ipv4_cidr | IP address pool used for MLAG Peer Link (control link). IP is derived from the node id.
Required when MLAG leafs present in topology.
| + | [    mlag_peer_address_family](## ".defaults.mlag_peer_address_family") | String | | `ipv4` | Valid Values:
- ipv4
- ipv6 | IP address family used to establish MLAG Peer Link (control link).
`ipv6` requires EOS version 4.31.1F or higher.
Note: `ipv6` is not supported in combination with a common MLAG peer link VLAN (ex. `mlag_l3_peer_vlan` set to 4094). | + | [    mlag_peer_ipv4_pool](## ".defaults.mlag_peer_ipv4_pool") | String | | | Format: ipv4_cidr | IPv4 address pool used for MLAG Peer Link (control link). IP is derived from the node id.
Required for MLAG leafs when `mlag_peer_address_family` is `ipv4` (default). | + | [    mlag_peer_ipv6_pool](## ".defaults.mlag_peer_ipv6_pool") | String | | | Format: ipv6_cidr | IPv6 address pool used for MLAG Peer Link (control link). IP is derived from the node id.
Required for MLAG leafs when `mlag_peer_address_family` is `ipv6`. | | [    mlag_port_channel_id](## ".defaults.mlag_port_channel_id") | Integer | | | | If not set, the mlag port-channel id is generated based on the digits of the first interface present in 'mlag_interfaces'.
Valid port-channel id numbers are < 1-2000 > for EOS < 4.25.0F and < 1 - 999999 > for EOS >= 4.25.0F.
| | [    mlag_domain_id](## ".defaults.mlag_domain_id") | String | | | | MLAG Domain ID. If not set the node group name (Set with "group" key) will be used. | | [    spanning_tree_mode](## ".defaults.spanning_tree_mode") | String | | | Valid Values:
- mstp
- rstp
- rapid-pvst
- none | | @@ -46,7 +48,9 @@ | [          mlag_peer_l3_ipv4_pool](## ".node_groups.[].nodes.[].mlag_peer_l3_ipv4_pool") | String | | | Format: ipv4_cidr | IP address pool used for MLAG underlay L3 peering. IP is derived from the node id.
Required when MLAG leafs present in topology and they are using a separate L3 peering VLAN.
| | [          mlag_peer_vlan](## ".node_groups.[].nodes.[].mlag_peer_vlan") | Integer | | `4094` | Min: 1
Max: 4094 | MLAG Peer Link (control link) SVI interface id. | | [          mlag_peer_link_allowed_vlans](## ".node_groups.[].nodes.[].mlag_peer_link_allowed_vlans") | String | | | | | - | [          mlag_peer_ipv4_pool](## ".node_groups.[].nodes.[].mlag_peer_ipv4_pool") | String | | | Format: ipv4_cidr | IP address pool used for MLAG Peer Link (control link). IP is derived from the node id.
Required when MLAG leafs present in topology.
| + | [          mlag_peer_address_family](## ".node_groups.[].nodes.[].mlag_peer_address_family") | String | | `ipv4` | Valid Values:
- ipv4
- ipv6 | IP address family used to establish MLAG Peer Link (control link).
`ipv6` requires EOS version 4.31.1F or higher.
Note: `ipv6` is not supported in combination with a common MLAG peer link VLAN (ex. `mlag_l3_peer_vlan` set to 4094). | + | [          mlag_peer_ipv4_pool](## ".node_groups.[].nodes.[].mlag_peer_ipv4_pool") | String | | | Format: ipv4_cidr | IPv4 address pool used for MLAG Peer Link (control link). IP is derived from the node id.
Required for MLAG leafs when `mlag_peer_address_family` is `ipv4` (default). | + | [          mlag_peer_ipv6_pool](## ".node_groups.[].nodes.[].mlag_peer_ipv6_pool") | String | | | Format: ipv6_cidr | IPv6 address pool used for MLAG Peer Link (control link). IP is derived from the node id.
Required for MLAG leafs when `mlag_peer_address_family` is `ipv6`. | | [          mlag_port_channel_id](## ".node_groups.[].nodes.[].mlag_port_channel_id") | Integer | | | | If not set, the mlag port-channel id is generated based on the digits of the first interface present in 'mlag_interfaces'.
Valid port-channel id numbers are < 1-2000 > for EOS < 4.25.0F and < 1 - 999999 > for EOS >= 4.25.0F.
| | [          mlag_domain_id](## ".node_groups.[].nodes.[].mlag_domain_id") | String | | | | MLAG Domain ID. If not set the node group name (Set with "group" key) will be used. | | [          spanning_tree_mode](## ".node_groups.[].nodes.[].spanning_tree_mode") | String | | | Valid Values:
- mstp
- rstp
- rapid-pvst
- none | | @@ -66,7 +70,9 @@ | [      mlag_peer_l3_ipv4_pool](## ".node_groups.[].mlag_peer_l3_ipv4_pool") | String | | | Format: ipv4_cidr | IP address pool used for MLAG underlay L3 peering. IP is derived from the node id.
Required when MLAG leafs present in topology and they are using a separate L3 peering VLAN.
| | [      mlag_peer_vlan](## ".node_groups.[].mlag_peer_vlan") | Integer | | `4094` | Min: 1
Max: 4094 | MLAG Peer Link (control link) SVI interface id. | | [      mlag_peer_link_allowed_vlans](## ".node_groups.[].mlag_peer_link_allowed_vlans") | String | | | | | - | [      mlag_peer_ipv4_pool](## ".node_groups.[].mlag_peer_ipv4_pool") | String | | | Format: ipv4_cidr | IP address pool used for MLAG Peer Link (control link). IP is derived from the node id.
Required when MLAG leafs present in topology.
| + | [      mlag_peer_address_family](## ".node_groups.[].mlag_peer_address_family") | String | | `ipv4` | Valid Values:
- ipv4
- ipv6 | IP address family used to establish MLAG Peer Link (control link).
`ipv6` requires EOS version 4.31.1F or higher.
Note: `ipv6` is not supported in combination with a common MLAG peer link VLAN (ex. `mlag_l3_peer_vlan` set to 4094). | + | [      mlag_peer_ipv4_pool](## ".node_groups.[].mlag_peer_ipv4_pool") | String | | | Format: ipv4_cidr | IPv4 address pool used for MLAG Peer Link (control link). IP is derived from the node id.
Required for MLAG leafs when `mlag_peer_address_family` is `ipv4` (default). | + | [      mlag_peer_ipv6_pool](## ".node_groups.[].mlag_peer_ipv6_pool") | String | | | Format: ipv6_cidr | IPv6 address pool used for MLAG Peer Link (control link). IP is derived from the node id.
Required for MLAG leafs when `mlag_peer_address_family` is `ipv6`. | | [      mlag_port_channel_id](## ".node_groups.[].mlag_port_channel_id") | Integer | | | | If not set, the mlag port-channel id is generated based on the digits of the first interface present in 'mlag_interfaces'.
Valid port-channel id numbers are < 1-2000 > for EOS < 4.25.0F and < 1 - 999999 > for EOS >= 4.25.0F.
| | [      mlag_domain_id](## ".node_groups.[].mlag_domain_id") | String | | | | MLAG Domain ID. If not set the node group name (Set with "group" key) will be used. | | [      spanning_tree_mode](## ".node_groups.[].spanning_tree_mode") | String | | | Valid Values:
- mstp
- rstp
- rapid-pvst
- none | | @@ -88,7 +94,9 @@ | [      mlag_peer_l3_ipv4_pool](## ".nodes.[].mlag_peer_l3_ipv4_pool") | String | | | Format: ipv4_cidr | IP address pool used for MLAG underlay L3 peering. IP is derived from the node id.
Required when MLAG leafs present in topology and they are using a separate L3 peering VLAN.
| | [      mlag_peer_vlan](## ".nodes.[].mlag_peer_vlan") | Integer | | `4094` | Min: 1
Max: 4094 | MLAG Peer Link (control link) SVI interface id. | | [      mlag_peer_link_allowed_vlans](## ".nodes.[].mlag_peer_link_allowed_vlans") | String | | | | | - | [      mlag_peer_ipv4_pool](## ".nodes.[].mlag_peer_ipv4_pool") | String | | | Format: ipv4_cidr | IP address pool used for MLAG Peer Link (control link). IP is derived from the node id.
Required when MLAG leafs present in topology.
| + | [      mlag_peer_address_family](## ".nodes.[].mlag_peer_address_family") | String | | `ipv4` | Valid Values:
- ipv4
- ipv6 | IP address family used to establish MLAG Peer Link (control link).
`ipv6` requires EOS version 4.31.1F or higher.
Note: `ipv6` is not supported in combination with a common MLAG peer link VLAN (ex. `mlag_l3_peer_vlan` set to 4094). | + | [      mlag_peer_ipv4_pool](## ".nodes.[].mlag_peer_ipv4_pool") | String | | | Format: ipv4_cidr | IPv4 address pool used for MLAG Peer Link (control link). IP is derived from the node id.
Required for MLAG leafs when `mlag_peer_address_family` is `ipv4` (default). | + | [      mlag_peer_ipv6_pool](## ".nodes.[].mlag_peer_ipv6_pool") | String | | | Format: ipv6_cidr | IPv6 address pool used for MLAG Peer Link (control link). IP is derived from the node id.
Required for MLAG leafs when `mlag_peer_address_family` is `ipv6`. | | [      mlag_port_channel_id](## ".nodes.[].mlag_port_channel_id") | Integer | | | | If not set, the mlag port-channel id is generated based on the digits of the first interface present in 'mlag_interfaces'.
Valid port-channel id numbers are < 1-2000 > for EOS < 4.25.0F and < 1 - 999999 > for EOS >= 4.25.0F.
| | [      mlag_domain_id](## ".nodes.[].mlag_domain_id") | String | | | | MLAG Domain ID. If not set the node group name (Set with "group" key) will be used. | | [      spanning_tree_mode](## ".nodes.[].spanning_tree_mode") | String | | | Valid Values:
- mstp
- rstp
- rapid-pvst
- none | | @@ -154,10 +162,19 @@ mlag_peer_vlan: mlag_peer_link_allowed_vlans: - # IP address pool used for MLAG Peer Link (control link). IP is derived from the node id. - # Required when MLAG leafs present in topology. + # IP address family used to establish MLAG Peer Link (control link). + # `ipv6` requires EOS version 4.31.1F or higher. + # Note: `ipv6` is not supported in combination with a common MLAG peer link VLAN (ex. `mlag_l3_peer_vlan` set to 4094). + mlag_peer_address_family: + + # IPv4 address pool used for MLAG Peer Link (control link). IP is derived from the node id. + # Required for MLAG leafs when `mlag_peer_address_family` is `ipv4` (default). mlag_peer_ipv4_pool: + # IPv6 address pool used for MLAG Peer Link (control link). IP is derived from the node id. + # Required for MLAG leafs when `mlag_peer_address_family` is `ipv6`. + mlag_peer_ipv6_pool: + # If not set, the mlag port-channel id is generated based on the digits of the first interface present in 'mlag_interfaces'. # Valid port-channel id numbers are < 1-2000 > for EOS < 4.25.0F and < 1 - 999999 > for EOS >= 4.25.0F. mlag_port_channel_id: @@ -237,10 +254,19 @@ mlag_peer_vlan: mlag_peer_link_allowed_vlans: - # IP address pool used for MLAG Peer Link (control link). IP is derived from the node id. - # Required when MLAG leafs present in topology. + # IP address family used to establish MLAG Peer Link (control link). + # `ipv6` requires EOS version 4.31.1F or higher. + # Note: `ipv6` is not supported in combination with a common MLAG peer link VLAN (ex. `mlag_l3_peer_vlan` set to 4094). + mlag_peer_address_family: + + # IPv4 address pool used for MLAG Peer Link (control link). IP is derived from the node id. + # Required for MLAG leafs when `mlag_peer_address_family` is `ipv4` (default). mlag_peer_ipv4_pool: + # IPv6 address pool used for MLAG Peer Link (control link). IP is derived from the node id. + # Required for MLAG leafs when `mlag_peer_address_family` is `ipv6`. + mlag_peer_ipv6_pool: + # If not set, the mlag port-channel id is generated based on the digits of the first interface present in 'mlag_interfaces'. # Valid port-channel id numbers are < 1-2000 > for EOS < 4.25.0F and < 1 - 999999 > for EOS >= 4.25.0F. mlag_port_channel_id: @@ -307,10 +333,19 @@ mlag_peer_vlan: mlag_peer_link_allowed_vlans: - # IP address pool used for MLAG Peer Link (control link). IP is derived from the node id. - # Required when MLAG leafs present in topology. + # IP address family used to establish MLAG Peer Link (control link). + # `ipv6` requires EOS version 4.31.1F or higher. + # Note: `ipv6` is not supported in combination with a common MLAG peer link VLAN (ex. `mlag_l3_peer_vlan` set to 4094). + mlag_peer_address_family: + + # IPv4 address pool used for MLAG Peer Link (control link). IP is derived from the node id. + # Required for MLAG leafs when `mlag_peer_address_family` is `ipv4` (default). mlag_peer_ipv4_pool: + # IPv6 address pool used for MLAG Peer Link (control link). IP is derived from the node id. + # Required for MLAG leafs when `mlag_peer_address_family` is `ipv6`. + mlag_peer_ipv6_pool: + # If not set, the mlag port-channel id is generated based on the digits of the first interface present in 'mlag_interfaces'. # Valid port-channel id numbers are < 1-2000 > for EOS < 4.25.0F and < 1 - 999999 > for EOS >= 4.25.0F. mlag_port_channel_id: @@ -383,10 +418,19 @@ mlag_peer_vlan: mlag_peer_link_allowed_vlans: - # IP address pool used for MLAG Peer Link (control link). IP is derived from the node id. - # Required when MLAG leafs present in topology. + # IP address family used to establish MLAG Peer Link (control link). + # `ipv6` requires EOS version 4.31.1F or higher. + # Note: `ipv6` is not supported in combination with a common MLAG peer link VLAN (ex. `mlag_l3_peer_vlan` set to 4094). + mlag_peer_address_family: + + # IPv4 address pool used for MLAG Peer Link (control link). IP is derived from the node id. + # Required for MLAG leafs when `mlag_peer_address_family` is `ipv4` (default). mlag_peer_ipv4_pool: + # IPv6 address pool used for MLAG Peer Link (control link). IP is derived from the node id. + # Required for MLAG leafs when `mlag_peer_address_family` is `ipv6`. + mlag_peer_ipv6_pool: + # If not set, the mlag port-channel id is generated based on the digits of the first interface present in 'mlag_interfaces'. # Valid port-channel id numbers are < 1-2000 > for EOS < 4.25.0F and < 1 - 999999 > for EOS >= 4.25.0F. mlag_port_channel_id: diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/node-type-l3-interfaces-configuration.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/node-type-l3-interfaces-configuration.md index eba68924d51..c03f0325424 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/node-type-l3-interfaces-configuration.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/node-type-l3-interfaces-configuration.md @@ -11,8 +11,8 @@ | [  defaults](## ".defaults") | Dictionary | | | | Define variables for all nodes of this type. | | [    l3_interfaces](## ".defaults.l3_interfaces") | List, items: Dictionary | | | | L3 Interfaces to configure on the node.
Used to define the node for WAN interfaces when `wan_carrier` is set. | | [      - profile](## ".defaults.l3_interfaces.[].profile") | String | | | | L3 interface profile name. Profile defined under `l3_interface_profiles`.
| - | [        name](## ".defaults.l3_interfaces.[].name") | String | Required, Unique | | Pattern: Ethernet[\d/]+(.[\d]+)? | Ethernet interface name like 'Ethernet2' or subinterface name like 'Ethernet2.42'
For a subinterface, the parent physical interface is automatically created. | - | [        description](## ".defaults.l3_interfaces.[].description") | String | | | | Interface description.
If not set a default description will be configured with '[[ ]]' | + | [        name](## ".defaults.l3_interfaces.[].name") | String | Required, Unique | | Pattern: Ethernet[\d/]+(.[\d]+)? | Ethernet interface name like 'Ethernet2' or subinterface name like 'Ethernet2.42'.
For a subinterface, the parent physical interface is automatically created. | + | [        description](## ".defaults.l3_interfaces.[].description") | String | | | | Interface description.
If not set a default description will be configured with '[[ ]]'. | | [        ip_address](## ".defaults.l3_interfaces.[].ip_address") | String | | | | Node IPv4 address/Mask or 'dhcp'. | | [        dhcp_ip](## ".defaults.l3_interfaces.[].dhcp_ip") | String | | | | When the `ip_address` is `dhcp`, this optional field allows to indicate the expected
IPv4 address (without mask) to be allocated on the interface if known.
This is not rendered in the configuration but can be used for substitution of 'interface_ip' in the Access-list
set under `ipv4_acl_in` and `ipv4_acl_out`. | | [        public_ip](## ".defaults.l3_interfaces.[].public_ip") | String | | | | Node IPv4 address (no mask).

This is used to get the public IP (if known) when the device is behind NAT.
This is only used for `wan_rr` routers (AutoVPN RRs and Pathfinders) to determine the Public IP
with the following preference:
`wan_route_servers.path_groups.interfaces.ip_address`
-> `l3_interfaces.public_ip`
-> `l3_interfaces.ip_address`

The determined Public IP is used by WAN routers when peering with this interface. | @@ -20,18 +20,29 @@ | [        dhcp_accept_default_route](## ".defaults.l3_interfaces.[].dhcp_accept_default_route") | Boolean | | `True` | | Accept a default route from DHCP if `ip_address` is set to `dhcp`. | | [        enabled](## ".defaults.l3_interfaces.[].enabled") | Boolean | | `True` | | Enable or Shutdown the interface. | | [        speed](## ".defaults.l3_interfaces.[].speed") | String | | | | Speed should be set in the format `` or `forced ` or `auto `. | - | [        peer](## ".defaults.l3_interfaces.[].peer") | String | | | | The peer device name. Used for description and documentation | - | [        peer_interface](## ".defaults.l3_interfaces.[].peer_interface") | String | | | | The peer device interface. Used for description and documentation | + | [        peer](## ".defaults.l3_interfaces.[].peer") | String | | | | The peer device name. Used for description and documentation. | + | [        peer_interface](## ".defaults.l3_interfaces.[].peer_interface") | String | | | | The peer device interface. Used for description and documentation. | | [        peer_ip](## ".defaults.l3_interfaces.[].peer_ip") | String | | | | The peer device IPv4 address (no mask). Used as default route gateway if `set_default_route` is true and `ip` is an IP address. | - | [        ipv4_acl_in](## ".defaults.l3_interfaces.[].ipv4_acl_in") | String | | | | Name of the IPv4 access-list to be assigned in the ingress direction.
The access-list must be defined under `ipv4_acls`.
Required for all WAN interfaces (`wan_carrier` is set) unless the carrier is marked as 'trusted' under `wan_carriers`. | - | [        ipv4_acl_out](## ".defaults.l3_interfaces.[].ipv4_acl_out") | String | | | | Name of the IPv4 Access-list to be assigned in the egress direction.
The access-list must be defined under `ipv4_acls`. | + | [        bgp](## ".defaults.l3_interfaces.[].bgp") | Dictionary | | | | Enforce IPv4 BGP peering for the peer | + | [          peer_as](## ".defaults.l3_interfaces.[].bgp.peer_as") | String | Required | | | BGP AS <1-4294967295> or AS number in asdot notation "<1-65535>.<0-65535>".
For asdot notation in YAML inputs, the value must be put in quotes, to prevent it from being interpreted as a float number. | + | [          ipv4_prefix_list_in](## ".defaults.l3_interfaces.[].bgp.ipv4_prefix_list_in") | String | | | | Prefix List Name. Accept routes for only these prefixes from the peer.
Required for wan interfaces. | + | [          ipv4_prefix_list_out](## ".defaults.l3_interfaces.[].bgp.ipv4_prefix_list_out") | String | | | | Prefix List Name. Advertise routes for only these prefixes.
If not specified, nothing would be advertised. | + | [        ipv4_acl_in](## ".defaults.l3_interfaces.[].ipv4_acl_in") | String | | | | Name of the IPv4 access-list to be assigned in the ingress direction.
The access-list must be defined under `ipv4_acls` and supports field substitution for "interface_ip" and "peer_ip".
Required for all WAN interfaces (`wan_carrier` is set) unless the carrier is marked as 'trusted' under `wan_carriers`. | + | [        ipv4_acl_out](## ".defaults.l3_interfaces.[].ipv4_acl_out") | String | | | | Name of the IPv4 Access-list to be assigned in the egress direction.
The access-list must be defined under `ipv4_acls` and supports field substitution for "interface_ip" and "peer_ip". | | [        static_routes](## ".defaults.l3_interfaces.[].static_routes") | List, items: Dictionary | | | Min Length: 1 | Configure IPv4 static routes pointing to `peer_ip`. | - | [          - prefix](## ".defaults.l3_interfaces.[].static_routes.[].prefix") | String | Required | | | IPv4_network/Mask | + | [          - prefix](## ".defaults.l3_interfaces.[].static_routes.[].prefix") | String | Required | | | IPv4_network/Mask. | | [        qos_profile](## ".defaults.l3_interfaces.[].qos_profile") | String | | | | QOS service profile. | | [        wan_carrier](## ".defaults.l3_interfaces.[].wan_carrier") | String | | | | The WAN carrier this interface is connected to.
This is used to infer the path-groups in which this interface should be configured.
Unless the carrier is marked as 'trusted' under `wan_carriers`, `ipv4_acl_in` is also required on all WAN interfaces. | | [        wan_circuit_id](## ".defaults.l3_interfaces.[].wan_circuit_id") | String | | | | The WAN circuit ID for this interface.
This is not rendered in the configuration but used for WAN designs. | | [        connected_to_pathfinder](## ".defaults.l3_interfaces.[].connected_to_pathfinder") | Boolean | | `True` | | For a WAN interface (`wan_carrier` is set), allow to disable the static tunnel towards Pathfinders. | + | [        cv_pathfinder_internet_exit](## ".defaults.l3_interfaces.[].cv_pathfinder_internet_exit") | Dictionary | | | | PREVIEW: This key is in preview mode | + | [          policies](## ".defaults.l3_interfaces.[].cv_pathfinder_internet_exit.policies") | List, items: Dictionary | | | | List of Internet-exit policies using this interface as exit. | + | [            - name](## ".defaults.l3_interfaces.[].cv_pathfinder_internet_exit.policies.[].name") | String | Required, Unique | | | Internet-exit policy name. | + | [              tunnel_interface_numbers](## ".defaults.l3_interfaces.[].cv_pathfinder_internet_exit.policies.[].tunnel_interface_numbers") | String | | | | Number range to use for Tunnel interfaces to an internet-exit service provider using this local interface.
Examples: '1-3' or '100,200,300' | | [        raw_eos_cli](## ".defaults.l3_interfaces.[].raw_eos_cli") | String | | | | EOS CLI rendered directly on the interface in the final EOS configuration. | + | [        flow_tracking](## ".defaults.l3_interfaces.[].flow_tracking") | Dictionary | | | | Configures flow-tracking on the interface. Overrides `fabric_flow_tracking.l3_interfaces` setting. | + | [          enabled](## ".defaults.l3_interfaces.[].flow_tracking.enabled") | Boolean | | | | | + | [          name](## ".defaults.l3_interfaces.[].flow_tracking.name") | String | | | | Flow tracker name as defined in flow_tracking_settings. | | [        structured_config](## ".defaults.l3_interfaces.[].structured_config") | Dictionary | | | | Custom structured config for the Ethernet interface. | | [  node_groups](## ".node_groups") | List, items: Dictionary | | | | Define variables related to all nodes part of this group. | | [    - group](## ".node_groups.[].group") | String | Required, Unique | | | The Node Group Name is used for MLAG domain unless set with 'mlag_domain_id'.
The Node Group Name is also used for peer description on downstream switches' uplinks.
| @@ -39,8 +50,8 @@ | [        - name](## ".node_groups.[].nodes.[].name") | String | Required, Unique | | | The Node Name is used as "hostname". | | [          l3_interfaces](## ".node_groups.[].nodes.[].l3_interfaces") | List, items: Dictionary | | | | L3 Interfaces to configure on the node.
Used to define the node for WAN interfaces when `wan_carrier` is set. | | [            - profile](## ".node_groups.[].nodes.[].l3_interfaces.[].profile") | String | | | | L3 interface profile name. Profile defined under `l3_interface_profiles`.
| - | [              name](## ".node_groups.[].nodes.[].l3_interfaces.[].name") | String | Required, Unique | | Pattern: Ethernet[\d/]+(.[\d]+)? | Ethernet interface name like 'Ethernet2' or subinterface name like 'Ethernet2.42'
For a subinterface, the parent physical interface is automatically created. | - | [              description](## ".node_groups.[].nodes.[].l3_interfaces.[].description") | String | | | | Interface description.
If not set a default description will be configured with '[[ ]]' | + | [              name](## ".node_groups.[].nodes.[].l3_interfaces.[].name") | String | Required, Unique | | Pattern: Ethernet[\d/]+(.[\d]+)? | Ethernet interface name like 'Ethernet2' or subinterface name like 'Ethernet2.42'.
For a subinterface, the parent physical interface is automatically created. | + | [              description](## ".node_groups.[].nodes.[].l3_interfaces.[].description") | String | | | | Interface description.
If not set a default description will be configured with '[[ ]]'. | | [              ip_address](## ".node_groups.[].nodes.[].l3_interfaces.[].ip_address") | String | | | | Node IPv4 address/Mask or 'dhcp'. | | [              dhcp_ip](## ".node_groups.[].nodes.[].l3_interfaces.[].dhcp_ip") | String | | | | When the `ip_address` is `dhcp`, this optional field allows to indicate the expected
IPv4 address (without mask) to be allocated on the interface if known.
This is not rendered in the configuration but can be used for substitution of 'interface_ip' in the Access-list
set under `ipv4_acl_in` and `ipv4_acl_out`. | | [              public_ip](## ".node_groups.[].nodes.[].l3_interfaces.[].public_ip") | String | | | | Node IPv4 address (no mask).

This is used to get the public IP (if known) when the device is behind NAT.
This is only used for `wan_rr` routers (AutoVPN RRs and Pathfinders) to determine the Public IP
with the following preference:
`wan_route_servers.path_groups.interfaces.ip_address`
-> `l3_interfaces.public_ip`
-> `l3_interfaces.ip_address`

The determined Public IP is used by WAN routers when peering with this interface. | @@ -48,23 +59,34 @@ | [              dhcp_accept_default_route](## ".node_groups.[].nodes.[].l3_interfaces.[].dhcp_accept_default_route") | Boolean | | `True` | | Accept a default route from DHCP if `ip_address` is set to `dhcp`. | | [              enabled](## ".node_groups.[].nodes.[].l3_interfaces.[].enabled") | Boolean | | `True` | | Enable or Shutdown the interface. | | [              speed](## ".node_groups.[].nodes.[].l3_interfaces.[].speed") | String | | | | Speed should be set in the format `` or `forced ` or `auto `. | - | [              peer](## ".node_groups.[].nodes.[].l3_interfaces.[].peer") | String | | | | The peer device name. Used for description and documentation | - | [              peer_interface](## ".node_groups.[].nodes.[].l3_interfaces.[].peer_interface") | String | | | | The peer device interface. Used for description and documentation | + | [              peer](## ".node_groups.[].nodes.[].l3_interfaces.[].peer") | String | | | | The peer device name. Used for description and documentation. | + | [              peer_interface](## ".node_groups.[].nodes.[].l3_interfaces.[].peer_interface") | String | | | | The peer device interface. Used for description and documentation. | | [              peer_ip](## ".node_groups.[].nodes.[].l3_interfaces.[].peer_ip") | String | | | | The peer device IPv4 address (no mask). Used as default route gateway if `set_default_route` is true and `ip` is an IP address. | - | [              ipv4_acl_in](## ".node_groups.[].nodes.[].l3_interfaces.[].ipv4_acl_in") | String | | | | Name of the IPv4 access-list to be assigned in the ingress direction.
The access-list must be defined under `ipv4_acls`.
Required for all WAN interfaces (`wan_carrier` is set) unless the carrier is marked as 'trusted' under `wan_carriers`. | - | [              ipv4_acl_out](## ".node_groups.[].nodes.[].l3_interfaces.[].ipv4_acl_out") | String | | | | Name of the IPv4 Access-list to be assigned in the egress direction.
The access-list must be defined under `ipv4_acls`. | + | [              bgp](## ".node_groups.[].nodes.[].l3_interfaces.[].bgp") | Dictionary | | | | Enforce IPv4 BGP peering for the peer | + | [                peer_as](## ".node_groups.[].nodes.[].l3_interfaces.[].bgp.peer_as") | String | Required | | | BGP AS <1-4294967295> or AS number in asdot notation "<1-65535>.<0-65535>".
For asdot notation in YAML inputs, the value must be put in quotes, to prevent it from being interpreted as a float number. | + | [                ipv4_prefix_list_in](## ".node_groups.[].nodes.[].l3_interfaces.[].bgp.ipv4_prefix_list_in") | String | | | | Prefix List Name. Accept routes for only these prefixes from the peer.
Required for wan interfaces. | + | [                ipv4_prefix_list_out](## ".node_groups.[].nodes.[].l3_interfaces.[].bgp.ipv4_prefix_list_out") | String | | | | Prefix List Name. Advertise routes for only these prefixes.
If not specified, nothing would be advertised. | + | [              ipv4_acl_in](## ".node_groups.[].nodes.[].l3_interfaces.[].ipv4_acl_in") | String | | | | Name of the IPv4 access-list to be assigned in the ingress direction.
The access-list must be defined under `ipv4_acls` and supports field substitution for "interface_ip" and "peer_ip".
Required for all WAN interfaces (`wan_carrier` is set) unless the carrier is marked as 'trusted' under `wan_carriers`. | + | [              ipv4_acl_out](## ".node_groups.[].nodes.[].l3_interfaces.[].ipv4_acl_out") | String | | | | Name of the IPv4 Access-list to be assigned in the egress direction.
The access-list must be defined under `ipv4_acls` and supports field substitution for "interface_ip" and "peer_ip". | | [              static_routes](## ".node_groups.[].nodes.[].l3_interfaces.[].static_routes") | List, items: Dictionary | | | Min Length: 1 | Configure IPv4 static routes pointing to `peer_ip`. | - | [                - prefix](## ".node_groups.[].nodes.[].l3_interfaces.[].static_routes.[].prefix") | String | Required | | | IPv4_network/Mask | + | [                - prefix](## ".node_groups.[].nodes.[].l3_interfaces.[].static_routes.[].prefix") | String | Required | | | IPv4_network/Mask. | | [              qos_profile](## ".node_groups.[].nodes.[].l3_interfaces.[].qos_profile") | String | | | | QOS service profile. | | [              wan_carrier](## ".node_groups.[].nodes.[].l3_interfaces.[].wan_carrier") | String | | | | The WAN carrier this interface is connected to.
This is used to infer the path-groups in which this interface should be configured.
Unless the carrier is marked as 'trusted' under `wan_carriers`, `ipv4_acl_in` is also required on all WAN interfaces. | | [              wan_circuit_id](## ".node_groups.[].nodes.[].l3_interfaces.[].wan_circuit_id") | String | | | | The WAN circuit ID for this interface.
This is not rendered in the configuration but used for WAN designs. | | [              connected_to_pathfinder](## ".node_groups.[].nodes.[].l3_interfaces.[].connected_to_pathfinder") | Boolean | | `True` | | For a WAN interface (`wan_carrier` is set), allow to disable the static tunnel towards Pathfinders. | + | [              cv_pathfinder_internet_exit](## ".node_groups.[].nodes.[].l3_interfaces.[].cv_pathfinder_internet_exit") | Dictionary | | | | PREVIEW: This key is in preview mode | + | [                policies](## ".node_groups.[].nodes.[].l3_interfaces.[].cv_pathfinder_internet_exit.policies") | List, items: Dictionary | | | | List of Internet-exit policies using this interface as exit. | + | [                  - name](## ".node_groups.[].nodes.[].l3_interfaces.[].cv_pathfinder_internet_exit.policies.[].name") | String | Required, Unique | | | Internet-exit policy name. | + | [                    tunnel_interface_numbers](## ".node_groups.[].nodes.[].l3_interfaces.[].cv_pathfinder_internet_exit.policies.[].tunnel_interface_numbers") | String | | | | Number range to use for Tunnel interfaces to an internet-exit service provider using this local interface.
Examples: '1-3' or '100,200,300' | | [              raw_eos_cli](## ".node_groups.[].nodes.[].l3_interfaces.[].raw_eos_cli") | String | | | | EOS CLI rendered directly on the interface in the final EOS configuration. | + | [              flow_tracking](## ".node_groups.[].nodes.[].l3_interfaces.[].flow_tracking") | Dictionary | | | | Configures flow-tracking on the interface. Overrides `fabric_flow_tracking.l3_interfaces` setting. | + | [                enabled](## ".node_groups.[].nodes.[].l3_interfaces.[].flow_tracking.enabled") | Boolean | | | | | + | [                name](## ".node_groups.[].nodes.[].l3_interfaces.[].flow_tracking.name") | String | | | | Flow tracker name as defined in flow_tracking_settings. | | [              structured_config](## ".node_groups.[].nodes.[].l3_interfaces.[].structured_config") | Dictionary | | | | Custom structured config for the Ethernet interface. | | [      l3_interfaces](## ".node_groups.[].l3_interfaces") | List, items: Dictionary | | | | L3 Interfaces to configure on the node.
Used to define the node for WAN interfaces when `wan_carrier` is set. | | [        - profile](## ".node_groups.[].l3_interfaces.[].profile") | String | | | | L3 interface profile name. Profile defined under `l3_interface_profiles`.
| - | [          name](## ".node_groups.[].l3_interfaces.[].name") | String | Required, Unique | | Pattern: Ethernet[\d/]+(.[\d]+)? | Ethernet interface name like 'Ethernet2' or subinterface name like 'Ethernet2.42'
For a subinterface, the parent physical interface is automatically created. | - | [          description](## ".node_groups.[].l3_interfaces.[].description") | String | | | | Interface description.
If not set a default description will be configured with '[[ ]]' | + | [          name](## ".node_groups.[].l3_interfaces.[].name") | String | Required, Unique | | Pattern: Ethernet[\d/]+(.[\d]+)? | Ethernet interface name like 'Ethernet2' or subinterface name like 'Ethernet2.42'.
For a subinterface, the parent physical interface is automatically created. | + | [          description](## ".node_groups.[].l3_interfaces.[].description") | String | | | | Interface description.
If not set a default description will be configured with '[[ ]]'. | | [          ip_address](## ".node_groups.[].l3_interfaces.[].ip_address") | String | | | | Node IPv4 address/Mask or 'dhcp'. | | [          dhcp_ip](## ".node_groups.[].l3_interfaces.[].dhcp_ip") | String | | | | When the `ip_address` is `dhcp`, this optional field allows to indicate the expected
IPv4 address (without mask) to be allocated on the interface if known.
This is not rendered in the configuration but can be used for substitution of 'interface_ip' in the Access-list
set under `ipv4_acl_in` and `ipv4_acl_out`. | | [          public_ip](## ".node_groups.[].l3_interfaces.[].public_ip") | String | | | | Node IPv4 address (no mask).

This is used to get the public IP (if known) when the device is behind NAT.
This is only used for `wan_rr` routers (AutoVPN RRs and Pathfinders) to determine the Public IP
with the following preference:
`wan_route_servers.path_groups.interfaces.ip_address`
-> `l3_interfaces.public_ip`
-> `l3_interfaces.ip_address`

The determined Public IP is used by WAN routers when peering with this interface. | @@ -72,25 +94,36 @@ | [          dhcp_accept_default_route](## ".node_groups.[].l3_interfaces.[].dhcp_accept_default_route") | Boolean | | `True` | | Accept a default route from DHCP if `ip_address` is set to `dhcp`. | | [          enabled](## ".node_groups.[].l3_interfaces.[].enabled") | Boolean | | `True` | | Enable or Shutdown the interface. | | [          speed](## ".node_groups.[].l3_interfaces.[].speed") | String | | | | Speed should be set in the format `` or `forced ` or `auto `. | - | [          peer](## ".node_groups.[].l3_interfaces.[].peer") | String | | | | The peer device name. Used for description and documentation | - | [          peer_interface](## ".node_groups.[].l3_interfaces.[].peer_interface") | String | | | | The peer device interface. Used for description and documentation | + | [          peer](## ".node_groups.[].l3_interfaces.[].peer") | String | | | | The peer device name. Used for description and documentation. | + | [          peer_interface](## ".node_groups.[].l3_interfaces.[].peer_interface") | String | | | | The peer device interface. Used for description and documentation. | | [          peer_ip](## ".node_groups.[].l3_interfaces.[].peer_ip") | String | | | | The peer device IPv4 address (no mask). Used as default route gateway if `set_default_route` is true and `ip` is an IP address. | - | [          ipv4_acl_in](## ".node_groups.[].l3_interfaces.[].ipv4_acl_in") | String | | | | Name of the IPv4 access-list to be assigned in the ingress direction.
The access-list must be defined under `ipv4_acls`.
Required for all WAN interfaces (`wan_carrier` is set) unless the carrier is marked as 'trusted' under `wan_carriers`. | - | [          ipv4_acl_out](## ".node_groups.[].l3_interfaces.[].ipv4_acl_out") | String | | | | Name of the IPv4 Access-list to be assigned in the egress direction.
The access-list must be defined under `ipv4_acls`. | + | [          bgp](## ".node_groups.[].l3_interfaces.[].bgp") | Dictionary | | | | Enforce IPv4 BGP peering for the peer | + | [            peer_as](## ".node_groups.[].l3_interfaces.[].bgp.peer_as") | String | Required | | | BGP AS <1-4294967295> or AS number in asdot notation "<1-65535>.<0-65535>".
For asdot notation in YAML inputs, the value must be put in quotes, to prevent it from being interpreted as a float number. | + | [            ipv4_prefix_list_in](## ".node_groups.[].l3_interfaces.[].bgp.ipv4_prefix_list_in") | String | | | | Prefix List Name. Accept routes for only these prefixes from the peer.
Required for wan interfaces. | + | [            ipv4_prefix_list_out](## ".node_groups.[].l3_interfaces.[].bgp.ipv4_prefix_list_out") | String | | | | Prefix List Name. Advertise routes for only these prefixes.
If not specified, nothing would be advertised. | + | [          ipv4_acl_in](## ".node_groups.[].l3_interfaces.[].ipv4_acl_in") | String | | | | Name of the IPv4 access-list to be assigned in the ingress direction.
The access-list must be defined under `ipv4_acls` and supports field substitution for "interface_ip" and "peer_ip".
Required for all WAN interfaces (`wan_carrier` is set) unless the carrier is marked as 'trusted' under `wan_carriers`. | + | [          ipv4_acl_out](## ".node_groups.[].l3_interfaces.[].ipv4_acl_out") | String | | | | Name of the IPv4 Access-list to be assigned in the egress direction.
The access-list must be defined under `ipv4_acls` and supports field substitution for "interface_ip" and "peer_ip". | | [          static_routes](## ".node_groups.[].l3_interfaces.[].static_routes") | List, items: Dictionary | | | Min Length: 1 | Configure IPv4 static routes pointing to `peer_ip`. | - | [            - prefix](## ".node_groups.[].l3_interfaces.[].static_routes.[].prefix") | String | Required | | | IPv4_network/Mask | + | [            - prefix](## ".node_groups.[].l3_interfaces.[].static_routes.[].prefix") | String | Required | | | IPv4_network/Mask. | | [          qos_profile](## ".node_groups.[].l3_interfaces.[].qos_profile") | String | | | | QOS service profile. | | [          wan_carrier](## ".node_groups.[].l3_interfaces.[].wan_carrier") | String | | | | The WAN carrier this interface is connected to.
This is used to infer the path-groups in which this interface should be configured.
Unless the carrier is marked as 'trusted' under `wan_carriers`, `ipv4_acl_in` is also required on all WAN interfaces. | | [          wan_circuit_id](## ".node_groups.[].l3_interfaces.[].wan_circuit_id") | String | | | | The WAN circuit ID for this interface.
This is not rendered in the configuration but used for WAN designs. | | [          connected_to_pathfinder](## ".node_groups.[].l3_interfaces.[].connected_to_pathfinder") | Boolean | | `True` | | For a WAN interface (`wan_carrier` is set), allow to disable the static tunnel towards Pathfinders. | + | [          cv_pathfinder_internet_exit](## ".node_groups.[].l3_interfaces.[].cv_pathfinder_internet_exit") | Dictionary | | | | PREVIEW: This key is in preview mode | + | [            policies](## ".node_groups.[].l3_interfaces.[].cv_pathfinder_internet_exit.policies") | List, items: Dictionary | | | | List of Internet-exit policies using this interface as exit. | + | [              - name](## ".node_groups.[].l3_interfaces.[].cv_pathfinder_internet_exit.policies.[].name") | String | Required, Unique | | | Internet-exit policy name. | + | [                tunnel_interface_numbers](## ".node_groups.[].l3_interfaces.[].cv_pathfinder_internet_exit.policies.[].tunnel_interface_numbers") | String | | | | Number range to use for Tunnel interfaces to an internet-exit service provider using this local interface.
Examples: '1-3' or '100,200,300' | | [          raw_eos_cli](## ".node_groups.[].l3_interfaces.[].raw_eos_cli") | String | | | | EOS CLI rendered directly on the interface in the final EOS configuration. | + | [          flow_tracking](## ".node_groups.[].l3_interfaces.[].flow_tracking") | Dictionary | | | | Configures flow-tracking on the interface. Overrides `fabric_flow_tracking.l3_interfaces` setting. | + | [            enabled](## ".node_groups.[].l3_interfaces.[].flow_tracking.enabled") | Boolean | | | | | + | [            name](## ".node_groups.[].l3_interfaces.[].flow_tracking.name") | String | | | | Flow tracker name as defined in flow_tracking_settings. | | [          structured_config](## ".node_groups.[].l3_interfaces.[].structured_config") | Dictionary | | | | Custom structured config for the Ethernet interface. | | [  nodes](## ".nodes") | List, items: Dictionary | | | | Define variables per node. | | [    - name](## ".nodes.[].name") | String | Required, Unique | | | The Node Name is used as "hostname". | | [      l3_interfaces](## ".nodes.[].l3_interfaces") | List, items: Dictionary | | | | L3 Interfaces to configure on the node.
Used to define the node for WAN interfaces when `wan_carrier` is set. | | [        - profile](## ".nodes.[].l3_interfaces.[].profile") | String | | | | L3 interface profile name. Profile defined under `l3_interface_profiles`.
| - | [          name](## ".nodes.[].l3_interfaces.[].name") | String | Required, Unique | | Pattern: Ethernet[\d/]+(.[\d]+)? | Ethernet interface name like 'Ethernet2' or subinterface name like 'Ethernet2.42'
For a subinterface, the parent physical interface is automatically created. | - | [          description](## ".nodes.[].l3_interfaces.[].description") | String | | | | Interface description.
If not set a default description will be configured with '[[ ]]' | + | [          name](## ".nodes.[].l3_interfaces.[].name") | String | Required, Unique | | Pattern: Ethernet[\d/]+(.[\d]+)? | Ethernet interface name like 'Ethernet2' or subinterface name like 'Ethernet2.42'.
For a subinterface, the parent physical interface is automatically created. | + | [          description](## ".nodes.[].l3_interfaces.[].description") | String | | | | Interface description.
If not set a default description will be configured with '[[ ]]'. | | [          ip_address](## ".nodes.[].l3_interfaces.[].ip_address") | String | | | | Node IPv4 address/Mask or 'dhcp'. | | [          dhcp_ip](## ".nodes.[].l3_interfaces.[].dhcp_ip") | String | | | | When the `ip_address` is `dhcp`, this optional field allows to indicate the expected
IPv4 address (without mask) to be allocated on the interface if known.
This is not rendered in the configuration but can be used for substitution of 'interface_ip' in the Access-list
set under `ipv4_acl_in` and `ipv4_acl_out`. | | [          public_ip](## ".nodes.[].l3_interfaces.[].public_ip") | String | | | | Node IPv4 address (no mask).

This is used to get the public IP (if known) when the device is behind NAT.
This is only used for `wan_rr` routers (AutoVPN RRs and Pathfinders) to determine the Public IP
with the following preference:
`wan_route_servers.path_groups.interfaces.ip_address`
-> `l3_interfaces.public_ip`
-> `l3_interfaces.ip_address`

The determined Public IP is used by WAN routers when peering with this interface. | @@ -98,23 +131,34 @@ | [          dhcp_accept_default_route](## ".nodes.[].l3_interfaces.[].dhcp_accept_default_route") | Boolean | | `True` | | Accept a default route from DHCP if `ip_address` is set to `dhcp`. | | [          enabled](## ".nodes.[].l3_interfaces.[].enabled") | Boolean | | `True` | | Enable or Shutdown the interface. | | [          speed](## ".nodes.[].l3_interfaces.[].speed") | String | | | | Speed should be set in the format `` or `forced ` or `auto `. | - | [          peer](## ".nodes.[].l3_interfaces.[].peer") | String | | | | The peer device name. Used for description and documentation | - | [          peer_interface](## ".nodes.[].l3_interfaces.[].peer_interface") | String | | | | The peer device interface. Used for description and documentation | + | [          peer](## ".nodes.[].l3_interfaces.[].peer") | String | | | | The peer device name. Used for description and documentation. | + | [          peer_interface](## ".nodes.[].l3_interfaces.[].peer_interface") | String | | | | The peer device interface. Used for description and documentation. | | [          peer_ip](## ".nodes.[].l3_interfaces.[].peer_ip") | String | | | | The peer device IPv4 address (no mask). Used as default route gateway if `set_default_route` is true and `ip` is an IP address. | - | [          ipv4_acl_in](## ".nodes.[].l3_interfaces.[].ipv4_acl_in") | String | | | | Name of the IPv4 access-list to be assigned in the ingress direction.
The access-list must be defined under `ipv4_acls`.
Required for all WAN interfaces (`wan_carrier` is set) unless the carrier is marked as 'trusted' under `wan_carriers`. | - | [          ipv4_acl_out](## ".nodes.[].l3_interfaces.[].ipv4_acl_out") | String | | | | Name of the IPv4 Access-list to be assigned in the egress direction.
The access-list must be defined under `ipv4_acls`. | + | [          bgp](## ".nodes.[].l3_interfaces.[].bgp") | Dictionary | | | | Enforce IPv4 BGP peering for the peer | + | [            peer_as](## ".nodes.[].l3_interfaces.[].bgp.peer_as") | String | Required | | | BGP AS <1-4294967295> or AS number in asdot notation "<1-65535>.<0-65535>".
For asdot notation in YAML inputs, the value must be put in quotes, to prevent it from being interpreted as a float number. | + | [            ipv4_prefix_list_in](## ".nodes.[].l3_interfaces.[].bgp.ipv4_prefix_list_in") | String | | | | Prefix List Name. Accept routes for only these prefixes from the peer.
Required for wan interfaces. | + | [            ipv4_prefix_list_out](## ".nodes.[].l3_interfaces.[].bgp.ipv4_prefix_list_out") | String | | | | Prefix List Name. Advertise routes for only these prefixes.
If not specified, nothing would be advertised. | + | [          ipv4_acl_in](## ".nodes.[].l3_interfaces.[].ipv4_acl_in") | String | | | | Name of the IPv4 access-list to be assigned in the ingress direction.
The access-list must be defined under `ipv4_acls` and supports field substitution for "interface_ip" and "peer_ip".
Required for all WAN interfaces (`wan_carrier` is set) unless the carrier is marked as 'trusted' under `wan_carriers`. | + | [          ipv4_acl_out](## ".nodes.[].l3_interfaces.[].ipv4_acl_out") | String | | | | Name of the IPv4 Access-list to be assigned in the egress direction.
The access-list must be defined under `ipv4_acls` and supports field substitution for "interface_ip" and "peer_ip". | | [          static_routes](## ".nodes.[].l3_interfaces.[].static_routes") | List, items: Dictionary | | | Min Length: 1 | Configure IPv4 static routes pointing to `peer_ip`. | - | [            - prefix](## ".nodes.[].l3_interfaces.[].static_routes.[].prefix") | String | Required | | | IPv4_network/Mask | + | [            - prefix](## ".nodes.[].l3_interfaces.[].static_routes.[].prefix") | String | Required | | | IPv4_network/Mask. | | [          qos_profile](## ".nodes.[].l3_interfaces.[].qos_profile") | String | | | | QOS service profile. | | [          wan_carrier](## ".nodes.[].l3_interfaces.[].wan_carrier") | String | | | | The WAN carrier this interface is connected to.
This is used to infer the path-groups in which this interface should be configured.
Unless the carrier is marked as 'trusted' under `wan_carriers`, `ipv4_acl_in` is also required on all WAN interfaces. | | [          wan_circuit_id](## ".nodes.[].l3_interfaces.[].wan_circuit_id") | String | | | | The WAN circuit ID for this interface.
This is not rendered in the configuration but used for WAN designs. | | [          connected_to_pathfinder](## ".nodes.[].l3_interfaces.[].connected_to_pathfinder") | Boolean | | `True` | | For a WAN interface (`wan_carrier` is set), allow to disable the static tunnel towards Pathfinders. | + | [          cv_pathfinder_internet_exit](## ".nodes.[].l3_interfaces.[].cv_pathfinder_internet_exit") | Dictionary | | | | PREVIEW: This key is in preview mode | + | [            policies](## ".nodes.[].l3_interfaces.[].cv_pathfinder_internet_exit.policies") | List, items: Dictionary | | | | List of Internet-exit policies using this interface as exit. | + | [              - name](## ".nodes.[].l3_interfaces.[].cv_pathfinder_internet_exit.policies.[].name") | String | Required, Unique | | | Internet-exit policy name. | + | [                tunnel_interface_numbers](## ".nodes.[].l3_interfaces.[].cv_pathfinder_internet_exit.policies.[].tunnel_interface_numbers") | String | | | | Number range to use for Tunnel interfaces to an internet-exit service provider using this local interface.
Examples: '1-3' or '100,200,300' | | [          raw_eos_cli](## ".nodes.[].l3_interfaces.[].raw_eos_cli") | String | | | | EOS CLI rendered directly on the interface in the final EOS configuration. | + | [          flow_tracking](## ".nodes.[].l3_interfaces.[].flow_tracking") | Dictionary | | | | Configures flow-tracking on the interface. Overrides `fabric_flow_tracking.l3_interfaces` setting. | + | [            enabled](## ".nodes.[].l3_interfaces.[].flow_tracking.enabled") | Boolean | | | | | + | [            name](## ".nodes.[].l3_interfaces.[].flow_tracking.name") | String | | | | Flow tracker name as defined in flow_tracking_settings. | | [          structured_config](## ".nodes.[].l3_interfaces.[].structured_config") | Dictionary | | | | Custom structured config for the Ethernet interface. | | [l3_interface_profiles](## "l3_interface_profiles") | List, items: Dictionary | | | | Profiles to inherit common settings for l3_interfaces defined under the node type key.
These profiles will *not* work for `l3_interfaces` defined under `vrfs`. | | [  - profile](## "l3_interface_profiles.[].profile") | String | Required, Unique | | | L3 interface profile name. Any variable supported under `l3_interfaces` can be inherited from a profile. | - | [    name](## "l3_interface_profiles.[].name") | String | | | Pattern: Ethernet[\d/]+(.[\d]+)? | Ethernet interface name like 'Ethernet2' or subinterface name like 'Ethernet2.42'
For a subinterface, the parent physical interface is automatically created. | - | [    description](## "l3_interface_profiles.[].description") | String | | | | Interface description.
If not set a default description will be configured with '[[ ]]' | + | [    name](## "l3_interface_profiles.[].name") | String | | | Pattern: Ethernet[\d/]+(.[\d]+)? | Ethernet interface name like 'Ethernet2' or subinterface name like 'Ethernet2.42'.
For a subinterface, the parent physical interface is automatically created. | + | [    description](## "l3_interface_profiles.[].description") | String | | | | Interface description.
If not set a default description will be configured with '[[ ]]'. | | [    ip_address](## "l3_interface_profiles.[].ip_address") | String | | | | Node IPv4 address/Mask or 'dhcp'. | | [    dhcp_ip](## "l3_interface_profiles.[].dhcp_ip") | String | | | | When the `ip_address` is `dhcp`, this optional field allows to indicate the expected
IPv4 address (without mask) to be allocated on the interface if known.
This is not rendered in the configuration but can be used for substitution of 'interface_ip' in the Access-list
set under `ipv4_acl_in` and `ipv4_acl_out`. | | [    public_ip](## "l3_interface_profiles.[].public_ip") | String | | | | Node IPv4 address (no mask).

This is used to get the public IP (if known) when the device is behind NAT.
This is only used for `wan_rr` routers (AutoVPN RRs and Pathfinders) to determine the Public IP
with the following preference:
`wan_route_servers.path_groups.interfaces.ip_address`
-> `l3_interfaces.public_ip`
-> `l3_interfaces.ip_address`

The determined Public IP is used by WAN routers when peering with this interface. | @@ -122,18 +166,29 @@ | [    dhcp_accept_default_route](## "l3_interface_profiles.[].dhcp_accept_default_route") | Boolean | | `True` | | Accept a default route from DHCP if `ip_address` is set to `dhcp`. | | [    enabled](## "l3_interface_profiles.[].enabled") | Boolean | | `True` | | Enable or Shutdown the interface. | | [    speed](## "l3_interface_profiles.[].speed") | String | | | | Speed should be set in the format `` or `forced ` or `auto `. | - | [    peer](## "l3_interface_profiles.[].peer") | String | | | | The peer device name. Used for description and documentation | - | [    peer_interface](## "l3_interface_profiles.[].peer_interface") | String | | | | The peer device interface. Used for description and documentation | + | [    peer](## "l3_interface_profiles.[].peer") | String | | | | The peer device name. Used for description and documentation. | + | [    peer_interface](## "l3_interface_profiles.[].peer_interface") | String | | | | The peer device interface. Used for description and documentation. | | [    peer_ip](## "l3_interface_profiles.[].peer_ip") | String | | | | The peer device IPv4 address (no mask). Used as default route gateway if `set_default_route` is true and `ip` is an IP address. | - | [    ipv4_acl_in](## "l3_interface_profiles.[].ipv4_acl_in") | String | | | | Name of the IPv4 access-list to be assigned in the ingress direction.
The access-list must be defined under `ipv4_acls`.
Required for all WAN interfaces (`wan_carrier` is set) unless the carrier is marked as 'trusted' under `wan_carriers`. | - | [    ipv4_acl_out](## "l3_interface_profiles.[].ipv4_acl_out") | String | | | | Name of the IPv4 Access-list to be assigned in the egress direction.
The access-list must be defined under `ipv4_acls`. | + | [    bgp](## "l3_interface_profiles.[].bgp") | Dictionary | | | | Enforce IPv4 BGP peering for the peer | + | [      peer_as](## "l3_interface_profiles.[].bgp.peer_as") | String | Required | | | BGP AS <1-4294967295> or AS number in asdot notation "<1-65535>.<0-65535>".
For asdot notation in YAML inputs, the value must be put in quotes, to prevent it from being interpreted as a float number. | + | [      ipv4_prefix_list_in](## "l3_interface_profiles.[].bgp.ipv4_prefix_list_in") | String | | | | Prefix List Name. Accept routes for only these prefixes from the peer.
Required for wan interfaces. | + | [      ipv4_prefix_list_out](## "l3_interface_profiles.[].bgp.ipv4_prefix_list_out") | String | | | | Prefix List Name. Advertise routes for only these prefixes.
If not specified, nothing would be advertised. | + | [    ipv4_acl_in](## "l3_interface_profiles.[].ipv4_acl_in") | String | | | | Name of the IPv4 access-list to be assigned in the ingress direction.
The access-list must be defined under `ipv4_acls` and supports field substitution for "interface_ip" and "peer_ip".
Required for all WAN interfaces (`wan_carrier` is set) unless the carrier is marked as 'trusted' under `wan_carriers`. | + | [    ipv4_acl_out](## "l3_interface_profiles.[].ipv4_acl_out") | String | | | | Name of the IPv4 Access-list to be assigned in the egress direction.
The access-list must be defined under `ipv4_acls` and supports field substitution for "interface_ip" and "peer_ip". | | [    static_routes](## "l3_interface_profiles.[].static_routes") | List, items: Dictionary | | | Min Length: 1 | Configure IPv4 static routes pointing to `peer_ip`. | - | [      - prefix](## "l3_interface_profiles.[].static_routes.[].prefix") | String | Required | | | IPv4_network/Mask | + | [      - prefix](## "l3_interface_profiles.[].static_routes.[].prefix") | String | Required | | | IPv4_network/Mask. | | [    qos_profile](## "l3_interface_profiles.[].qos_profile") | String | | | | QOS service profile. | | [    wan_carrier](## "l3_interface_profiles.[].wan_carrier") | String | | | | The WAN carrier this interface is connected to.
This is used to infer the path-groups in which this interface should be configured.
Unless the carrier is marked as 'trusted' under `wan_carriers`, `ipv4_acl_in` is also required on all WAN interfaces. | | [    wan_circuit_id](## "l3_interface_profiles.[].wan_circuit_id") | String | | | | The WAN circuit ID for this interface.
This is not rendered in the configuration but used for WAN designs. | | [    connected_to_pathfinder](## "l3_interface_profiles.[].connected_to_pathfinder") | Boolean | | `True` | | For a WAN interface (`wan_carrier` is set), allow to disable the static tunnel towards Pathfinders. | + | [    cv_pathfinder_internet_exit](## "l3_interface_profiles.[].cv_pathfinder_internet_exit") | Dictionary | | | | PREVIEW: This key is in preview mode | + | [      policies](## "l3_interface_profiles.[].cv_pathfinder_internet_exit.policies") | List, items: Dictionary | | | | List of Internet-exit policies using this interface as exit. | + | [        - name](## "l3_interface_profiles.[].cv_pathfinder_internet_exit.policies.[].name") | String | Required, Unique | | | Internet-exit policy name. | + | [          tunnel_interface_numbers](## "l3_interface_profiles.[].cv_pathfinder_internet_exit.policies.[].tunnel_interface_numbers") | String | | | | Number range to use for Tunnel interfaces to an internet-exit service provider using this local interface.
Examples: '1-3' or '100,200,300' | | [    raw_eos_cli](## "l3_interface_profiles.[].raw_eos_cli") | String | | | | EOS CLI rendered directly on the interface in the final EOS configuration. | + | [    flow_tracking](## "l3_interface_profiles.[].flow_tracking") | Dictionary | | | | Configures flow-tracking on the interface. Overrides `fabric_flow_tracking.l3_interfaces` setting. | + | [      enabled](## "l3_interface_profiles.[].flow_tracking.enabled") | Boolean | | | | | + | [      name](## "l3_interface_profiles.[].flow_tracking.name") | String | | | | Flow tracker name as defined in flow_tracking_settings. | | [    structured_config](## "l3_interface_profiles.[].structured_config") | Dictionary | | | | Custom structured config for the Ethernet interface. | === "YAML" @@ -151,12 +206,12 @@ # L3 interface profile name. Profile defined under `l3_interface_profiles`. - profile: - # Ethernet interface name like 'Ethernet2' or subinterface name like 'Ethernet2.42' + # Ethernet interface name like 'Ethernet2' or subinterface name like 'Ethernet2.42'. # For a subinterface, the parent physical interface is automatically created. name: # Interface description. - # If not set a default description will be configured with '[[ ]]' + # If not set a default description will be configured with '[[ ]]'. description: # Node IPv4 address/Mask or 'dhcp'. @@ -192,28 +247,43 @@ # Speed should be set in the format `` or `forced ` or `auto `. speed: - # The peer device name. Used for description and documentation + # The peer device name. Used for description and documentation. peer: - # The peer device interface. Used for description and documentation + # The peer device interface. Used for description and documentation. peer_interface: # The peer device IPv4 address (no mask). Used as default route gateway if `set_default_route` is true and `ip` is an IP address. peer_ip: + # Enforce IPv4 BGP peering for the peer + bgp: + + # BGP AS <1-4294967295> or AS number in asdot notation "<1-65535>.<0-65535>". + # For asdot notation in YAML inputs, the value must be put in quotes, to prevent it from being interpreted as a float number. + peer_as: + + # Prefix List Name. Accept routes for only these prefixes from the peer. + # Required for wan interfaces. + ipv4_prefix_list_in: + + # Prefix List Name. Advertise routes for only these prefixes. + # If not specified, nothing would be advertised. + ipv4_prefix_list_out: + # Name of the IPv4 access-list to be assigned in the ingress direction. - # The access-list must be defined under `ipv4_acls`. + # The access-list must be defined under `ipv4_acls` and supports field substitution for "interface_ip" and "peer_ip". # Required for all WAN interfaces (`wan_carrier` is set) unless the carrier is marked as 'trusted' under `wan_carriers`. ipv4_acl_in: # Name of the IPv4 Access-list to be assigned in the egress direction. - # The access-list must be defined under `ipv4_acls`. + # The access-list must be defined under `ipv4_acls` and supports field substitution for "interface_ip" and "peer_ip". ipv4_acl_out: # Configure IPv4 static routes pointing to `peer_ip`. static_routes: # >=1 items - # IPv4_network/Mask + # IPv4_network/Mask. - prefix: # QOS service profile. @@ -231,9 +301,29 @@ # For a WAN interface (`wan_carrier` is set), allow to disable the static tunnel towards Pathfinders. connected_to_pathfinder: + # PREVIEW: This key is in preview mode + cv_pathfinder_internet_exit: + + # List of Internet-exit policies using this interface as exit. + policies: + + # Internet-exit policy name. + - name: + + # Number range to use for Tunnel interfaces to an internet-exit service provider using this local interface. + # Examples: '1-3' or '100,200,300' + tunnel_interface_numbers: + # EOS CLI rendered directly on the interface in the final EOS configuration. raw_eos_cli: + # Configures flow-tracking on the interface. Overrides `fabric_flow_tracking.l3_interfaces` setting. + flow_tracking: + enabled: + + # Flow tracker name as defined in flow_tracking_settings. + name: + # Custom structured config for the Ethernet interface. structured_config: @@ -257,12 +347,12 @@ # L3 interface profile name. Profile defined under `l3_interface_profiles`. - profile: - # Ethernet interface name like 'Ethernet2' or subinterface name like 'Ethernet2.42' + # Ethernet interface name like 'Ethernet2' or subinterface name like 'Ethernet2.42'. # For a subinterface, the parent physical interface is automatically created. name: # Interface description. - # If not set a default description will be configured with '[[ ]]' + # If not set a default description will be configured with '[[ ]]'. description: # Node IPv4 address/Mask or 'dhcp'. @@ -298,28 +388,43 @@ # Speed should be set in the format `` or `forced ` or `auto `. speed: - # The peer device name. Used for description and documentation + # The peer device name. Used for description and documentation. peer: - # The peer device interface. Used for description and documentation + # The peer device interface. Used for description and documentation. peer_interface: # The peer device IPv4 address (no mask). Used as default route gateway if `set_default_route` is true and `ip` is an IP address. peer_ip: + # Enforce IPv4 BGP peering for the peer + bgp: + + # BGP AS <1-4294967295> or AS number in asdot notation "<1-65535>.<0-65535>". + # For asdot notation in YAML inputs, the value must be put in quotes, to prevent it from being interpreted as a float number. + peer_as: + + # Prefix List Name. Accept routes for only these prefixes from the peer. + # Required for wan interfaces. + ipv4_prefix_list_in: + + # Prefix List Name. Advertise routes for only these prefixes. + # If not specified, nothing would be advertised. + ipv4_prefix_list_out: + # Name of the IPv4 access-list to be assigned in the ingress direction. - # The access-list must be defined under `ipv4_acls`. + # The access-list must be defined under `ipv4_acls` and supports field substitution for "interface_ip" and "peer_ip". # Required for all WAN interfaces (`wan_carrier` is set) unless the carrier is marked as 'trusted' under `wan_carriers`. ipv4_acl_in: # Name of the IPv4 Access-list to be assigned in the egress direction. - # The access-list must be defined under `ipv4_acls`. + # The access-list must be defined under `ipv4_acls` and supports field substitution for "interface_ip" and "peer_ip". ipv4_acl_out: # Configure IPv4 static routes pointing to `peer_ip`. static_routes: # >=1 items - # IPv4_network/Mask + # IPv4_network/Mask. - prefix: # QOS service profile. @@ -337,9 +442,29 @@ # For a WAN interface (`wan_carrier` is set), allow to disable the static tunnel towards Pathfinders. connected_to_pathfinder: + # PREVIEW: This key is in preview mode + cv_pathfinder_internet_exit: + + # List of Internet-exit policies using this interface as exit. + policies: + + # Internet-exit policy name. + - name: + + # Number range to use for Tunnel interfaces to an internet-exit service provider using this local interface. + # Examples: '1-3' or '100,200,300' + tunnel_interface_numbers: + # EOS CLI rendered directly on the interface in the final EOS configuration. raw_eos_cli: + # Configures flow-tracking on the interface. Overrides `fabric_flow_tracking.l3_interfaces` setting. + flow_tracking: + enabled: + + # Flow tracker name as defined in flow_tracking_settings. + name: + # Custom structured config for the Ethernet interface. structured_config: @@ -350,12 +475,12 @@ # L3 interface profile name. Profile defined under `l3_interface_profiles`. - profile: - # Ethernet interface name like 'Ethernet2' or subinterface name like 'Ethernet2.42' + # Ethernet interface name like 'Ethernet2' or subinterface name like 'Ethernet2.42'. # For a subinterface, the parent physical interface is automatically created. name: # Interface description. - # If not set a default description will be configured with '[[ ]]' + # If not set a default description will be configured with '[[ ]]'. description: # Node IPv4 address/Mask or 'dhcp'. @@ -391,28 +516,43 @@ # Speed should be set in the format `` or `forced ` or `auto `. speed: - # The peer device name. Used for description and documentation + # The peer device name. Used for description and documentation. peer: - # The peer device interface. Used for description and documentation + # The peer device interface. Used for description and documentation. peer_interface: # The peer device IPv4 address (no mask). Used as default route gateway if `set_default_route` is true and `ip` is an IP address. peer_ip: + # Enforce IPv4 BGP peering for the peer + bgp: + + # BGP AS <1-4294967295> or AS number in asdot notation "<1-65535>.<0-65535>". + # For asdot notation in YAML inputs, the value must be put in quotes, to prevent it from being interpreted as a float number. + peer_as: + + # Prefix List Name. Accept routes for only these prefixes from the peer. + # Required for wan interfaces. + ipv4_prefix_list_in: + + # Prefix List Name. Advertise routes for only these prefixes. + # If not specified, nothing would be advertised. + ipv4_prefix_list_out: + # Name of the IPv4 access-list to be assigned in the ingress direction. - # The access-list must be defined under `ipv4_acls`. + # The access-list must be defined under `ipv4_acls` and supports field substitution for "interface_ip" and "peer_ip". # Required for all WAN interfaces (`wan_carrier` is set) unless the carrier is marked as 'trusted' under `wan_carriers`. ipv4_acl_in: # Name of the IPv4 Access-list to be assigned in the egress direction. - # The access-list must be defined under `ipv4_acls`. + # The access-list must be defined under `ipv4_acls` and supports field substitution for "interface_ip" and "peer_ip". ipv4_acl_out: # Configure IPv4 static routes pointing to `peer_ip`. static_routes: # >=1 items - # IPv4_network/Mask + # IPv4_network/Mask. - prefix: # QOS service profile. @@ -430,9 +570,29 @@ # For a WAN interface (`wan_carrier` is set), allow to disable the static tunnel towards Pathfinders. connected_to_pathfinder: + # PREVIEW: This key is in preview mode + cv_pathfinder_internet_exit: + + # List of Internet-exit policies using this interface as exit. + policies: + + # Internet-exit policy name. + - name: + + # Number range to use for Tunnel interfaces to an internet-exit service provider using this local interface. + # Examples: '1-3' or '100,200,300' + tunnel_interface_numbers: + # EOS CLI rendered directly on the interface in the final EOS configuration. raw_eos_cli: + # Configures flow-tracking on the interface. Overrides `fabric_flow_tracking.l3_interfaces` setting. + flow_tracking: + enabled: + + # Flow tracker name as defined in flow_tracking_settings. + name: + # Custom structured config for the Ethernet interface. structured_config: @@ -449,12 +609,12 @@ # L3 interface profile name. Profile defined under `l3_interface_profiles`. - profile: - # Ethernet interface name like 'Ethernet2' or subinterface name like 'Ethernet2.42' + # Ethernet interface name like 'Ethernet2' or subinterface name like 'Ethernet2.42'. # For a subinterface, the parent physical interface is automatically created. name: # Interface description. - # If not set a default description will be configured with '[[ ]]' + # If not set a default description will be configured with '[[ ]]'. description: # Node IPv4 address/Mask or 'dhcp'. @@ -490,28 +650,43 @@ # Speed should be set in the format `` or `forced ` or `auto `. speed: - # The peer device name. Used for description and documentation + # The peer device name. Used for description and documentation. peer: - # The peer device interface. Used for description and documentation + # The peer device interface. Used for description and documentation. peer_interface: # The peer device IPv4 address (no mask). Used as default route gateway if `set_default_route` is true and `ip` is an IP address. peer_ip: + # Enforce IPv4 BGP peering for the peer + bgp: + + # BGP AS <1-4294967295> or AS number in asdot notation "<1-65535>.<0-65535>". + # For asdot notation in YAML inputs, the value must be put in quotes, to prevent it from being interpreted as a float number. + peer_as: + + # Prefix List Name. Accept routes for only these prefixes from the peer. + # Required for wan interfaces. + ipv4_prefix_list_in: + + # Prefix List Name. Advertise routes for only these prefixes. + # If not specified, nothing would be advertised. + ipv4_prefix_list_out: + # Name of the IPv4 access-list to be assigned in the ingress direction. - # The access-list must be defined under `ipv4_acls`. + # The access-list must be defined under `ipv4_acls` and supports field substitution for "interface_ip" and "peer_ip". # Required for all WAN interfaces (`wan_carrier` is set) unless the carrier is marked as 'trusted' under `wan_carriers`. ipv4_acl_in: # Name of the IPv4 Access-list to be assigned in the egress direction. - # The access-list must be defined under `ipv4_acls`. + # The access-list must be defined under `ipv4_acls` and supports field substitution for "interface_ip" and "peer_ip". ipv4_acl_out: # Configure IPv4 static routes pointing to `peer_ip`. static_routes: # >=1 items - # IPv4_network/Mask + # IPv4_network/Mask. - prefix: # QOS service profile. @@ -529,9 +704,29 @@ # For a WAN interface (`wan_carrier` is set), allow to disable the static tunnel towards Pathfinders. connected_to_pathfinder: + # PREVIEW: This key is in preview mode + cv_pathfinder_internet_exit: + + # List of Internet-exit policies using this interface as exit. + policies: + + # Internet-exit policy name. + - name: + + # Number range to use for Tunnel interfaces to an internet-exit service provider using this local interface. + # Examples: '1-3' or '100,200,300' + tunnel_interface_numbers: + # EOS CLI rendered directly on the interface in the final EOS configuration. raw_eos_cli: + # Configures flow-tracking on the interface. Overrides `fabric_flow_tracking.l3_interfaces` setting. + flow_tracking: + enabled: + + # Flow tracker name as defined in flow_tracking_settings. + name: + # Custom structured config for the Ethernet interface. structured_config: @@ -542,12 +737,12 @@ # L3 interface profile name. Any variable supported under `l3_interfaces` can be inherited from a profile. - profile: - # Ethernet interface name like 'Ethernet2' or subinterface name like 'Ethernet2.42' + # Ethernet interface name like 'Ethernet2' or subinterface name like 'Ethernet2.42'. # For a subinterface, the parent physical interface is automatically created. name: # Interface description. - # If not set a default description will be configured with '[[ ]]' + # If not set a default description will be configured with '[[ ]]'. description: # Node IPv4 address/Mask or 'dhcp'. @@ -583,28 +778,43 @@ # Speed should be set in the format `` or `forced ` or `auto `. speed: - # The peer device name. Used for description and documentation + # The peer device name. Used for description and documentation. peer: - # The peer device interface. Used for description and documentation + # The peer device interface. Used for description and documentation. peer_interface: # The peer device IPv4 address (no mask). Used as default route gateway if `set_default_route` is true and `ip` is an IP address. peer_ip: + # Enforce IPv4 BGP peering for the peer + bgp: + + # BGP AS <1-4294967295> or AS number in asdot notation "<1-65535>.<0-65535>". + # For asdot notation in YAML inputs, the value must be put in quotes, to prevent it from being interpreted as a float number. + peer_as: + + # Prefix List Name. Accept routes for only these prefixes from the peer. + # Required for wan interfaces. + ipv4_prefix_list_in: + + # Prefix List Name. Advertise routes for only these prefixes. + # If not specified, nothing would be advertised. + ipv4_prefix_list_out: + # Name of the IPv4 access-list to be assigned in the ingress direction. - # The access-list must be defined under `ipv4_acls`. + # The access-list must be defined under `ipv4_acls` and supports field substitution for "interface_ip" and "peer_ip". # Required for all WAN interfaces (`wan_carrier` is set) unless the carrier is marked as 'trusted' under `wan_carriers`. ipv4_acl_in: # Name of the IPv4 Access-list to be assigned in the egress direction. - # The access-list must be defined under `ipv4_acls`. + # The access-list must be defined under `ipv4_acls` and supports field substitution for "interface_ip" and "peer_ip". ipv4_acl_out: # Configure IPv4 static routes pointing to `peer_ip`. static_routes: # >=1 items - # IPv4_network/Mask + # IPv4_network/Mask. - prefix: # QOS service profile. @@ -622,9 +832,29 @@ # For a WAN interface (`wan_carrier` is set), allow to disable the static tunnel towards Pathfinders. connected_to_pathfinder: + # PREVIEW: This key is in preview mode + cv_pathfinder_internet_exit: + + # List of Internet-exit policies using this interface as exit. + policies: + + # Internet-exit policy name. + - name: + + # Number range to use for Tunnel interfaces to an internet-exit service provider using this local interface. + # Examples: '1-3' or '100,200,300' + tunnel_interface_numbers: + # EOS CLI rendered directly on the interface in the final EOS configuration. raw_eos_cli: + # Configures flow-tracking on the interface. Overrides `fabric_flow_tracking.l3_interfaces` setting. + flow_tracking: + enabled: + + # Flow tracker name as defined in flow_tracking_settings. + name: + # Custom structured config for the Ethernet interface. structured_config: ``` diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/node-type-structure.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/node-type-structure.md index d5f35750e4b..dff31017527 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/node-type-structure.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/node-type-structure.md @@ -9,12 +9,24 @@ | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [<node_type_keys.key>](## "") | Dictionary | | | | | | [  defaults](## ".defaults") | Dictionary | | | | Define variables for all nodes of this type. | + | [    mgmt_gateway](## ".defaults.mgmt_gateway") | String | | | | This key sets the management gateway for the device. It takes precedence over the global `mgmt_gateway`. | + | [    ipv6_mgmt_gateway](## ".defaults.ipv6_mgmt_gateway") | String | | | | This key sets the ipv6 management gateway for the device. It takes precedence over the global `ipv6_mgmt_gateway`. | + | [    flow_tracker_type](## ".defaults.flow_tracker_type") | String | | | Valid Values:
- sampled
- hardware | Set the flow tracker type.
Override the `default_flow_tracker_type`` set at the `node_type_key` level.
`default_flow_tracker_type` default value is `sampled`. | | [  node_groups](## ".node_groups") | List, items: Dictionary | | | | Define variables related to all nodes part of this group. | | [    - group](## ".node_groups.[].group") | String | Required, Unique | | | The Node Group Name is used for MLAG domain unless set with 'mlag_domain_id'.
The Node Group Name is also used for peer description on downstream switches' uplinks.
| | [      nodes](## ".node_groups.[].nodes") | List, items: Dictionary | | | | Define variables per node. | | [        - name](## ".node_groups.[].nodes.[].name") | String | Required, Unique | | | The Node Name is used as "hostname". | + | [          mgmt_gateway](## ".node_groups.[].nodes.[].mgmt_gateway") | String | | | | This key sets the management gateway for the device. It takes precedence over the global `mgmt_gateway`. | + | [          ipv6_mgmt_gateway](## ".node_groups.[].nodes.[].ipv6_mgmt_gateway") | String | | | | This key sets the ipv6 management gateway for the device. It takes precedence over the global `ipv6_mgmt_gateway`. | + | [          flow_tracker_type](## ".node_groups.[].nodes.[].flow_tracker_type") | String | | | Valid Values:
- sampled
- hardware | Set the flow tracker type.
Override the `default_flow_tracker_type`` set at the `node_type_key` level.
`default_flow_tracker_type` default value is `sampled`. | + | [      mgmt_gateway](## ".node_groups.[].mgmt_gateway") | String | | | | This key sets the management gateway for the device. It takes precedence over the global `mgmt_gateway`. | + | [      ipv6_mgmt_gateway](## ".node_groups.[].ipv6_mgmt_gateway") | String | | | | This key sets the ipv6 management gateway for the device. It takes precedence over the global `ipv6_mgmt_gateway`. | + | [      flow_tracker_type](## ".node_groups.[].flow_tracker_type") | String | | | Valid Values:
- sampled
- hardware | Set the flow tracker type.
Override the `default_flow_tracker_type`` set at the `node_type_key` level.
`default_flow_tracker_type` default value is `sampled`. | | [  nodes](## ".nodes") | List, items: Dictionary | | | | Define variables per node. | | [    - name](## ".nodes.[].name") | String | Required, Unique | | | The Node Name is used as "hostname". | + | [      mgmt_gateway](## ".nodes.[].mgmt_gateway") | String | | | | This key sets the management gateway for the device. It takes precedence over the global `mgmt_gateway`. | + | [      ipv6_mgmt_gateway](## ".nodes.[].ipv6_mgmt_gateway") | String | | | | This key sets the ipv6 management gateway for the device. It takes precedence over the global `ipv6_mgmt_gateway`. | + | [      flow_tracker_type](## ".nodes.[].flow_tracker_type") | String | | | Valid Values:
- sampled
- hardware | Set the flow tracker type.
Override the `default_flow_tracker_type`` set at the `node_type_key` level.
`default_flow_tracker_type` default value is `sampled`. | === "YAML" @@ -24,6 +36,17 @@ # Define variables for all nodes of this type. defaults: + # This key sets the management gateway for the device. It takes precedence over the global `mgmt_gateway`. + mgmt_gateway: + + # This key sets the ipv6 management gateway for the device. It takes precedence over the global `ipv6_mgmt_gateway`. + ipv6_mgmt_gateway: + + # Set the flow tracker type. + # Override the `default_flow_tracker_type`` set at the `node_type_key` level. + # `default_flow_tracker_type` default value is `sampled`. + flow_tracker_type: + # Define variables related to all nodes part of this group. node_groups: @@ -37,9 +60,42 @@ # The Node Name is used as "hostname". - name: + # This key sets the management gateway for the device. It takes precedence over the global `mgmt_gateway`. + mgmt_gateway: + + # This key sets the ipv6 management gateway for the device. It takes precedence over the global `ipv6_mgmt_gateway`. + ipv6_mgmt_gateway: + + # Set the flow tracker type. + # Override the `default_flow_tracker_type`` set at the `node_type_key` level. + # `default_flow_tracker_type` default value is `sampled`. + flow_tracker_type: + + # This key sets the management gateway for the device. It takes precedence over the global `mgmt_gateway`. + mgmt_gateway: + + # This key sets the ipv6 management gateway for the device. It takes precedence over the global `ipv6_mgmt_gateway`. + ipv6_mgmt_gateway: + + # Set the flow tracker type. + # Override the `default_flow_tracker_type`` set at the `node_type_key` level. + # `default_flow_tracker_type` default value is `sampled`. + flow_tracker_type: + # Define variables per node. nodes: # The Node Name is used as "hostname". - name: + + # This key sets the management gateway for the device. It takes precedence over the global `mgmt_gateway`. + mgmt_gateway: + + # This key sets the ipv6 management gateway for the device. It takes precedence over the global `ipv6_mgmt_gateway`. + ipv6_mgmt_gateway: + + # Set the flow tracker type. + # Override the `default_flow_tracker_type`` set at the `node_type_key` level. + # `default_flow_tracker_type` default value is `sampled`. + flow_tracker_type: ``` diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/node-type-uplink-configuration.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/node-type-uplink-configuration.md index 955e009d0e0..96f3d568da9 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/node-type-uplink-configuration.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/node-type-uplink-configuration.md @@ -17,7 +17,7 @@ | [          links_minimum](## ".defaults.link_tracking.groups.[].links_minimum") | Integer | | | Min: 1
Max: 100000 | | | [    uplink_type](## ".defaults.uplink_type") | String | | `p2p` | Valid Values:
- p2p
- port-channel
- p2p-vrfs
- lan | Override the default `uplink_type` set at the `node_type_key` level.
`uplink_type` must be "p2p" if `vtep` or `underlay_router` is true for the `node_type_key` definition. | | [    uplink_ipv4_pool](## ".defaults.uplink_ipv4_pool") | String | | | Format: ipv4_cidr | IPv4 subnet to use to connect to uplink switches. | - | [    uplink_interfaces](## ".defaults.uplink_interfaces") | List, items: String | | | | Local uplink interfaces
Each list item supports range syntax that can be expanded into a list of interfaces.
If uplink_interfaces is not defined, platform-specific defaults (defined under default_interfaces) will be used instead.
Please note that default_interfaces are not defined by default, you should define these yourself.
| + | [    uplink_interfaces](## ".defaults.uplink_interfaces") | List, items: String | | | | Local uplink interfaces.
Each list item supports range syntax that can be expanded into a list of interfaces.
If uplink_interfaces is not defined, platform-specific defaults (defined under default_interfaces) will be used instead.
Please note that default_interfaces are not defined by default, you should define these yourself.
| | [      - <str>](## ".defaults.uplink_interfaces.[]") | String | | | Pattern: Ethernet[\d/]+ | | | [    uplink_switch_interfaces](## ".defaults.uplink_switch_interfaces") | List, items: String | | | | Interfaces located on uplink switches. | | [      - <str>](## ".defaults.uplink_switch_interfaces.[]") | String | | | Pattern: Ethernet[\d/]+ | | @@ -25,6 +25,7 @@ | [      - <str>](## ".defaults.uplink_switches.[]") | String | Required | | | Hostname of uplink switch.
If parallel uplinks are in use, update max_parallel_uplinks below and specify each uplink switch multiple times.
e.g. uplink_switches: [ 'DC1-SPINE1', 'DC1-SPINE1', 'DC1-SPINE2', 'DC1-SPINE2' ].
| | [    uplink_interface_speed](## ".defaults.uplink_interface_speed") | String | | | | Set point-to-Point interface speed and will apply to uplink interfaces on both ends.
(Uplink switch interface speed can be overridden with `uplink_switch_interface_speed`).
Speed should be set in the format `` or `forced ` or `auto `.
| | [    uplink_switch_interface_speed](## ".defaults.uplink_switch_interface_speed") | String | | | | Set point-to-Point interface speed for the uplink switch interface only.
Speed should be set in the format `` or `forced ` or `auto `.
| + | [    uplink_mtu](## ".defaults.uplink_mtu") | Integer | | | Min: 68
Max: 65535 | Point-to-Point uplinks MTU in bytes. This setting overrides the `p2p_uplinks_mtu` setting. | | [    max_uplink_switches](## ".defaults.max_uplink_switches") | Integer | | | | Maximum number of uplink switches.
Changing this value may change IP Addressing on uplinks.
Can be used to reserve IP space for future expansions.
| | [    max_parallel_uplinks](## ".defaults.max_parallel_uplinks") | Integer | | | | Number of parallel links towards uplink switches.
Changing this value may change interface naming on uplinks (and corresponding downlinks).
Can be used to reserve interfaces for future parallel uplinks.
| | [    uplink_bfd](## ".defaults.uplink_bfd") | Boolean | | `False` | | Enable bfd on uplink interfaces. | @@ -53,7 +54,7 @@ | [                links_minimum](## ".node_groups.[].nodes.[].link_tracking.groups.[].links_minimum") | Integer | | | Min: 1
Max: 100000 | | | [          uplink_type](## ".node_groups.[].nodes.[].uplink_type") | String | | `p2p` | Valid Values:
- p2p
- port-channel
- p2p-vrfs
- lan | Override the default `uplink_type` set at the `node_type_key` level.
`uplink_type` must be "p2p" if `vtep` or `underlay_router` is true for the `node_type_key` definition. | | [          uplink_ipv4_pool](## ".node_groups.[].nodes.[].uplink_ipv4_pool") | String | | | Format: ipv4_cidr | IPv4 subnet to use to connect to uplink switches. | - | [          uplink_interfaces](## ".node_groups.[].nodes.[].uplink_interfaces") | List, items: String | | | | Local uplink interfaces
Each list item supports range syntax that can be expanded into a list of interfaces.
If uplink_interfaces is not defined, platform-specific defaults (defined under default_interfaces) will be used instead.
Please note that default_interfaces are not defined by default, you should define these yourself.
| + | [          uplink_interfaces](## ".node_groups.[].nodes.[].uplink_interfaces") | List, items: String | | | | Local uplink interfaces.
Each list item supports range syntax that can be expanded into a list of interfaces.
If uplink_interfaces is not defined, platform-specific defaults (defined under default_interfaces) will be used instead.
Please note that default_interfaces are not defined by default, you should define these yourself.
| | [            - <str>](## ".node_groups.[].nodes.[].uplink_interfaces.[]") | String | | | Pattern: Ethernet[\d/]+ | | | [          uplink_switch_interfaces](## ".node_groups.[].nodes.[].uplink_switch_interfaces") | List, items: String | | | | Interfaces located on uplink switches. | | [            - <str>](## ".node_groups.[].nodes.[].uplink_switch_interfaces.[]") | String | | | Pattern: Ethernet[\d/]+ | | @@ -61,6 +62,7 @@ | [            - <str>](## ".node_groups.[].nodes.[].uplink_switches.[]") | String | Required | | | Hostname of uplink switch.
If parallel uplinks are in use, update max_parallel_uplinks below and specify each uplink switch multiple times.
e.g. uplink_switches: [ 'DC1-SPINE1', 'DC1-SPINE1', 'DC1-SPINE2', 'DC1-SPINE2' ].
| | [          uplink_interface_speed](## ".node_groups.[].nodes.[].uplink_interface_speed") | String | | | | Set point-to-Point interface speed and will apply to uplink interfaces on both ends.
(Uplink switch interface speed can be overridden with `uplink_switch_interface_speed`).
Speed should be set in the format `` or `forced ` or `auto `.
| | [          uplink_switch_interface_speed](## ".node_groups.[].nodes.[].uplink_switch_interface_speed") | String | | | | Set point-to-Point interface speed for the uplink switch interface only.
Speed should be set in the format `` or `forced ` or `auto `.
| + | [          uplink_mtu](## ".node_groups.[].nodes.[].uplink_mtu") | Integer | | | Min: 68
Max: 65535 | Point-to-Point uplinks MTU in bytes. This setting overrides the `p2p_uplinks_mtu` setting. | | [          max_uplink_switches](## ".node_groups.[].nodes.[].max_uplink_switches") | Integer | | | | Maximum number of uplink switches.
Changing this value may change IP Addressing on uplinks.
Can be used to reserve IP space for future expansions.
| | [          max_parallel_uplinks](## ".node_groups.[].nodes.[].max_parallel_uplinks") | Integer | | | | Number of parallel links towards uplink switches.
Changing this value may change interface naming on uplinks (and corresponding downlinks).
Can be used to reserve interfaces for future parallel uplinks.
| | [          uplink_bfd](## ".node_groups.[].nodes.[].uplink_bfd") | Boolean | | `False` | | Enable bfd on uplink interfaces. | @@ -81,7 +83,7 @@ | [            links_minimum](## ".node_groups.[].link_tracking.groups.[].links_minimum") | Integer | | | Min: 1
Max: 100000 | | | [      uplink_type](## ".node_groups.[].uplink_type") | String | | `p2p` | Valid Values:
- p2p
- port-channel
- p2p-vrfs
- lan | Override the default `uplink_type` set at the `node_type_key` level.
`uplink_type` must be "p2p" if `vtep` or `underlay_router` is true for the `node_type_key` definition. | | [      uplink_ipv4_pool](## ".node_groups.[].uplink_ipv4_pool") | String | | | Format: ipv4_cidr | IPv4 subnet to use to connect to uplink switches. | - | [      uplink_interfaces](## ".node_groups.[].uplink_interfaces") | List, items: String | | | | Local uplink interfaces
Each list item supports range syntax that can be expanded into a list of interfaces.
If uplink_interfaces is not defined, platform-specific defaults (defined under default_interfaces) will be used instead.
Please note that default_interfaces are not defined by default, you should define these yourself.
| + | [      uplink_interfaces](## ".node_groups.[].uplink_interfaces") | List, items: String | | | | Local uplink interfaces.
Each list item supports range syntax that can be expanded into a list of interfaces.
If uplink_interfaces is not defined, platform-specific defaults (defined under default_interfaces) will be used instead.
Please note that default_interfaces are not defined by default, you should define these yourself.
| | [        - <str>](## ".node_groups.[].uplink_interfaces.[]") | String | | | Pattern: Ethernet[\d/]+ | | | [      uplink_switch_interfaces](## ".node_groups.[].uplink_switch_interfaces") | List, items: String | | | | Interfaces located on uplink switches. | | [        - <str>](## ".node_groups.[].uplink_switch_interfaces.[]") | String | | | Pattern: Ethernet[\d/]+ | | @@ -89,6 +91,7 @@ | [        - <str>](## ".node_groups.[].uplink_switches.[]") | String | Required | | | Hostname of uplink switch.
If parallel uplinks are in use, update max_parallel_uplinks below and specify each uplink switch multiple times.
e.g. uplink_switches: [ 'DC1-SPINE1', 'DC1-SPINE1', 'DC1-SPINE2', 'DC1-SPINE2' ].
| | [      uplink_interface_speed](## ".node_groups.[].uplink_interface_speed") | String | | | | Set point-to-Point interface speed and will apply to uplink interfaces on both ends.
(Uplink switch interface speed can be overridden with `uplink_switch_interface_speed`).
Speed should be set in the format `` or `forced ` or `auto `.
| | [      uplink_switch_interface_speed](## ".node_groups.[].uplink_switch_interface_speed") | String | | | | Set point-to-Point interface speed for the uplink switch interface only.
Speed should be set in the format `` or `forced ` or `auto `.
| + | [      uplink_mtu](## ".node_groups.[].uplink_mtu") | Integer | | | Min: 68
Max: 65535 | Point-to-Point uplinks MTU in bytes. This setting overrides the `p2p_uplinks_mtu` setting. | | [      max_uplink_switches](## ".node_groups.[].max_uplink_switches") | Integer | | | | Maximum number of uplink switches.
Changing this value may change IP Addressing on uplinks.
Can be used to reserve IP space for future expansions.
| | [      max_parallel_uplinks](## ".node_groups.[].max_parallel_uplinks") | Integer | | | | Number of parallel links towards uplink switches.
Changing this value may change interface naming on uplinks (and corresponding downlinks).
Can be used to reserve interfaces for future parallel uplinks.
| | [      uplink_bfd](## ".node_groups.[].uplink_bfd") | Boolean | | `False` | | Enable bfd on uplink interfaces. | @@ -115,7 +118,7 @@ | [            links_minimum](## ".nodes.[].link_tracking.groups.[].links_minimum") | Integer | | | Min: 1
Max: 100000 | | | [      uplink_type](## ".nodes.[].uplink_type") | String | | `p2p` | Valid Values:
- p2p
- port-channel
- p2p-vrfs
- lan | Override the default `uplink_type` set at the `node_type_key` level.
`uplink_type` must be "p2p" if `vtep` or `underlay_router` is true for the `node_type_key` definition. | | [      uplink_ipv4_pool](## ".nodes.[].uplink_ipv4_pool") | String | | | Format: ipv4_cidr | IPv4 subnet to use to connect to uplink switches. | - | [      uplink_interfaces](## ".nodes.[].uplink_interfaces") | List, items: String | | | | Local uplink interfaces
Each list item supports range syntax that can be expanded into a list of interfaces.
If uplink_interfaces is not defined, platform-specific defaults (defined under default_interfaces) will be used instead.
Please note that default_interfaces are not defined by default, you should define these yourself.
| + | [      uplink_interfaces](## ".nodes.[].uplink_interfaces") | List, items: String | | | | Local uplink interfaces.
Each list item supports range syntax that can be expanded into a list of interfaces.
If uplink_interfaces is not defined, platform-specific defaults (defined under default_interfaces) will be used instead.
Please note that default_interfaces are not defined by default, you should define these yourself.
| | [        - <str>](## ".nodes.[].uplink_interfaces.[]") | String | | | Pattern: Ethernet[\d/]+ | | | [      uplink_switch_interfaces](## ".nodes.[].uplink_switch_interfaces") | List, items: String | | | | Interfaces located on uplink switches. | | [        - <str>](## ".nodes.[].uplink_switch_interfaces.[]") | String | | | Pattern: Ethernet[\d/]+ | | @@ -123,6 +126,7 @@ | [        - <str>](## ".nodes.[].uplink_switches.[]") | String | Required | | | Hostname of uplink switch.
If parallel uplinks are in use, update max_parallel_uplinks below and specify each uplink switch multiple times.
e.g. uplink_switches: [ 'DC1-SPINE1', 'DC1-SPINE1', 'DC1-SPINE2', 'DC1-SPINE2' ].
| | [      uplink_interface_speed](## ".nodes.[].uplink_interface_speed") | String | | | | Set point-to-Point interface speed and will apply to uplink interfaces on both ends.
(Uplink switch interface speed can be overridden with `uplink_switch_interface_speed`).
Speed should be set in the format `` or `forced ` or `auto `.
| | [      uplink_switch_interface_speed](## ".nodes.[].uplink_switch_interface_speed") | String | | | | Set point-to-Point interface speed for the uplink switch interface only.
Speed should be set in the format `` or `forced ` or `auto `.
| + | [      uplink_mtu](## ".nodes.[].uplink_mtu") | Integer | | | Min: 68
Max: 65535 | Point-to-Point uplinks MTU in bytes. This setting overrides the `p2p_uplinks_mtu` setting. | | [      max_uplink_switches](## ".nodes.[].max_uplink_switches") | Integer | | | | Maximum number of uplink switches.
Changing this value may change IP Addressing on uplinks.
Can be used to reserve IP space for future expansions.
| | [      max_parallel_uplinks](## ".nodes.[].max_parallel_uplinks") | Integer | | | | Number of parallel links towards uplink switches.
Changing this value may change interface naming on uplinks (and corresponding downlinks).
Can be used to reserve interfaces for future parallel uplinks.
| | [      uplink_bfd](## ".nodes.[].uplink_bfd") | Boolean | | `False` | | Enable bfd on uplink interfaces. | @@ -168,7 +172,7 @@ # IPv4 subnet to use to connect to uplink switches. uplink_ipv4_pool: - # Local uplink interfaces + # Local uplink interfaces. # Each list item supports range syntax that can be expanded into a list of interfaces. # If uplink_interfaces is not defined, platform-specific defaults (defined under default_interfaces) will be used instead. # Please note that default_interfaces are not defined by default, you should define these yourself. @@ -194,6 +198,9 @@ # Speed should be set in the format `` or `forced ` or `auto `. uplink_switch_interface_speed: + # Point-to-Point uplinks MTU in bytes. This setting overrides the `p2p_uplinks_mtu` setting. + uplink_mtu: + # Maximum number of uplink switches. # Changing this value may change IP Addressing on uplinks. # Can be used to reserve IP space for future expansions. @@ -301,7 +308,7 @@ # IPv4 subnet to use to connect to uplink switches. uplink_ipv4_pool: - # Local uplink interfaces + # Local uplink interfaces. # Each list item supports range syntax that can be expanded into a list of interfaces. # If uplink_interfaces is not defined, platform-specific defaults (defined under default_interfaces) will be used instead. # Please note that default_interfaces are not defined by default, you should define these yourself. @@ -327,6 +334,9 @@ # Speed should be set in the format `` or `forced ` or `auto `. uplink_switch_interface_speed: + # Point-to-Point uplinks MTU in bytes. This setting overrides the `p2p_uplinks_mtu` setting. + uplink_mtu: + # Maximum number of uplink switches. # Changing this value may change IP Addressing on uplinks. # Can be used to reserve IP space for future expansions. @@ -411,7 +421,7 @@ # IPv4 subnet to use to connect to uplink switches. uplink_ipv4_pool: - # Local uplink interfaces + # Local uplink interfaces. # Each list item supports range syntax that can be expanded into a list of interfaces. # If uplink_interfaces is not defined, platform-specific defaults (defined under default_interfaces) will be used instead. # Please note that default_interfaces are not defined by default, you should define these yourself. @@ -437,6 +447,9 @@ # Speed should be set in the format `` or `forced ` or `auto `. uplink_switch_interface_speed: + # Point-to-Point uplinks MTU in bytes. This setting overrides the `p2p_uplinks_mtu` setting. + uplink_mtu: + # Maximum number of uplink switches. # Changing this value may change IP Addressing on uplinks. # Can be used to reserve IP space for future expansions. @@ -537,7 +550,7 @@ # IPv4 subnet to use to connect to uplink switches. uplink_ipv4_pool: - # Local uplink interfaces + # Local uplink interfaces. # Each list item supports range syntax that can be expanded into a list of interfaces. # If uplink_interfaces is not defined, platform-specific defaults (defined under default_interfaces) will be used instead. # Please note that default_interfaces are not defined by default, you should define these yourself. @@ -563,6 +576,9 @@ # Speed should be set in the format `` or `forced ` or `auto `. uplink_switch_interface_speed: + # Point-to-Point uplinks MTU in bytes. This setting overrides the `p2p_uplinks_mtu` setting. + uplink_mtu: + # Maximum number of uplink switches. # Changing this value may change IP Addressing on uplinks. # Can be used to reserve IP space for future expansions. diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/node-type-wan-configuration.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/node-type-wan-configuration.md index 9696a22c530..f2c37540acb 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/node-type-wan-configuration.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/node-type-wan-configuration.md @@ -12,10 +12,17 @@ | [    wan_role](## ".defaults.wan_role") | String | | | Valid Values:
- client
- server | Override the default WAN role.

This is used both for AutoVPN and Pathfinder designs.
That means if `wan_mode` root key is set to `autovpn` or `cv-pathfinder`.
`server` indicates that the router is a route-reflector.

Only supported if `overlay_routing_protocol` is set to `ibgp`. | | [    cv_pathfinder_transit_mode](## ".defaults.cv_pathfinder_transit_mode") | String | | | Valid Values:
- region
- zone | Configure the transit mode for a WAN client for CV Pathfinder designs
only when the `wan_mode` root key is set to `cv_pathfinder`.

'zone' is currently not supported. | | [    cv_pathfinder_region](## ".defaults.cv_pathfinder_region") | String | | | | The CV Pathfinder region name.
This key is required for WAN routers but optional for pathfinders.
The region name must be defined under 'cv_pathfinder_regions'. | - | [    cv_pathfinder_site](## ".defaults.cv_pathfinder_site") | String | | | | The CV Pathfinder site name.
This key is required for WAN routers but ignored for pathfinders.
The site name must be defined for the relevant region under 'cv_pathfinder_regions'. | + | [    cv_pathfinder_site](## ".defaults.cv_pathfinder_site") | String | | | | The CV Pathfinder site name.
This key is required for WAN routers but optional for pathfinders.
For WAN routers and pathfinders with `cv_pathfinder_region`, the site name must be defined for the relevant region under 'cv_pathfinder_regions'.
For pathfinders without `cv_pathfinder_region` set, the site must be defined under `cv_pathfinder_global_sites`. | | [    wan_ha](## ".defaults.wan_ha") | Dictionary | | | | PREVIEW: This key is currently not supported

The key is supported only if `wan_mode` == `cv-pathfinder`.
AutoVPN support is still to be determined.

Maximum 2 devices supported by group for HA. | | [      enabled](## ".defaults.wan_ha.enabled") | Boolean | | `True` | | Enable / Disable auto CV-Pathfinder HA, when two nodes are defined in the same node_group. | | [      ipsec](## ".defaults.wan_ha.ipsec") | Boolean | | `True` | | Enable / Disable IPsec over HA path-group when HA is enabled. | + | [      ha_interfaces](## ".defaults.wan_ha.ha_interfaces") | List, items: String | | | | Local WAN HA interfaces
Overwrite the default behavior which is to pick all the `uplink_interfaces`.
Can be used to filter uplink interfaces when there are multiple uplinks.
Limitations:
Either all interfaces must be uplinks or all interfaces must not be uplinks.
Only one interface is supported for non uplinks. | + | [        - <str>](## ".defaults.wan_ha.ha_interfaces.[]") | String | | | Pattern: Ethernet[\d/]+ | | + | [      ha_ipv4_pool](## ".defaults.wan_ha.ha_ipv4_pool") | String | | | Format: ipv4_cidr | IP address pool used for WAN HA connectivity.
IP is derived from the node ID.
Not used for uplink interfaces. | + | [      max_ha_interfaces](## ".defaults.wan_ha.max_ha_interfaces") | Integer | | | | Number of parallel links towards HA switches.
Can be used to reserve IP addresses for future parallel HA links. | + | [      flow_tracking](## ".defaults.wan_ha.flow_tracking") | Dictionary | | | | Configures flow-tracking on the HA interfaces. Overrides `fabric_flow_tracking.wan_ha_links` setting. | + | [        enabled](## ".defaults.wan_ha.flow_tracking.enabled") | Boolean | | | | | + | [        name](## ".defaults.wan_ha.flow_tracking.name") | String | | | | Flow tracker name as defined in flow_tracking_settings. | | [    dps_mss_ipv4](## ".defaults.dps_mss_ipv4") | String | | `auto` | | IPv4 MSS value configured under "router path-selection" on WAN Devices. | | [  node_groups](## ".node_groups") | List, items: Dictionary | | | | Define variables related to all nodes part of this group. | | [    - group](## ".node_groups.[].group") | String | Required, Unique | | | The Node Group Name is used for MLAG domain unless set with 'mlag_domain_id'.
The Node Group Name is also used for peer description on downstream switches' uplinks.
| @@ -24,28 +31,49 @@ | [          wan_role](## ".node_groups.[].nodes.[].wan_role") | String | | | Valid Values:
- client
- server | Override the default WAN role.

This is used both for AutoVPN and Pathfinder designs.
That means if `wan_mode` root key is set to `autovpn` or `cv-pathfinder`.
`server` indicates that the router is a route-reflector.

Only supported if `overlay_routing_protocol` is set to `ibgp`. | | [          cv_pathfinder_transit_mode](## ".node_groups.[].nodes.[].cv_pathfinder_transit_mode") | String | | | Valid Values:
- region
- zone | Configure the transit mode for a WAN client for CV Pathfinder designs
only when the `wan_mode` root key is set to `cv_pathfinder`.

'zone' is currently not supported. | | [          cv_pathfinder_region](## ".node_groups.[].nodes.[].cv_pathfinder_region") | String | | | | The CV Pathfinder region name.
This key is required for WAN routers but optional for pathfinders.
The region name must be defined under 'cv_pathfinder_regions'. | - | [          cv_pathfinder_site](## ".node_groups.[].nodes.[].cv_pathfinder_site") | String | | | | The CV Pathfinder site name.
This key is required for WAN routers but ignored for pathfinders.
The site name must be defined for the relevant region under 'cv_pathfinder_regions'. | + | [          cv_pathfinder_site](## ".node_groups.[].nodes.[].cv_pathfinder_site") | String | | | | The CV Pathfinder site name.
This key is required for WAN routers but optional for pathfinders.
For WAN routers and pathfinders with `cv_pathfinder_region`, the site name must be defined for the relevant region under 'cv_pathfinder_regions'.
For pathfinders without `cv_pathfinder_region` set, the site must be defined under `cv_pathfinder_global_sites`. | | [          wan_ha](## ".node_groups.[].nodes.[].wan_ha") | Dictionary | | | | PREVIEW: This key is currently not supported

The key is supported only if `wan_mode` == `cv-pathfinder`.
AutoVPN support is still to be determined.

Maximum 2 devices supported by group for HA. | | [            enabled](## ".node_groups.[].nodes.[].wan_ha.enabled") | Boolean | | `True` | | Enable / Disable auto CV-Pathfinder HA, when two nodes are defined in the same node_group. | | [            ipsec](## ".node_groups.[].nodes.[].wan_ha.ipsec") | Boolean | | `True` | | Enable / Disable IPsec over HA path-group when HA is enabled. | + | [            ha_interfaces](## ".node_groups.[].nodes.[].wan_ha.ha_interfaces") | List, items: String | | | | Local WAN HA interfaces
Overwrite the default behavior which is to pick all the `uplink_interfaces`.
Can be used to filter uplink interfaces when there are multiple uplinks.
Limitations:
Either all interfaces must be uplinks or all interfaces must not be uplinks.
Only one interface is supported for non uplinks. | + | [              - <str>](## ".node_groups.[].nodes.[].wan_ha.ha_interfaces.[]") | String | | | Pattern: Ethernet[\d/]+ | | + | [            ha_ipv4_pool](## ".node_groups.[].nodes.[].wan_ha.ha_ipv4_pool") | String | | | Format: ipv4_cidr | IP address pool used for WAN HA connectivity.
IP is derived from the node ID.
Not used for uplink interfaces. | + | [            max_ha_interfaces](## ".node_groups.[].nodes.[].wan_ha.max_ha_interfaces") | Integer | | | | Number of parallel links towards HA switches.
Can be used to reserve IP addresses for future parallel HA links. | + | [            flow_tracking](## ".node_groups.[].nodes.[].wan_ha.flow_tracking") | Dictionary | | | | Configures flow-tracking on the HA interfaces. Overrides `fabric_flow_tracking.wan_ha_links` setting. | + | [              enabled](## ".node_groups.[].nodes.[].wan_ha.flow_tracking.enabled") | Boolean | | | | | + | [              name](## ".node_groups.[].nodes.[].wan_ha.flow_tracking.name") | String | | | | Flow tracker name as defined in flow_tracking_settings. | | [          dps_mss_ipv4](## ".node_groups.[].nodes.[].dps_mss_ipv4") | String | | `auto` | | IPv4 MSS value configured under "router path-selection" on WAN Devices. | | [      wan_role](## ".node_groups.[].wan_role") | String | | | Valid Values:
- client
- server | Override the default WAN role.

This is used both for AutoVPN and Pathfinder designs.
That means if `wan_mode` root key is set to `autovpn` or `cv-pathfinder`.
`server` indicates that the router is a route-reflector.

Only supported if `overlay_routing_protocol` is set to `ibgp`. | | [      cv_pathfinder_transit_mode](## ".node_groups.[].cv_pathfinder_transit_mode") | String | | | Valid Values:
- region
- zone | Configure the transit mode for a WAN client for CV Pathfinder designs
only when the `wan_mode` root key is set to `cv_pathfinder`.

'zone' is currently not supported. | | [      cv_pathfinder_region](## ".node_groups.[].cv_pathfinder_region") | String | | | | The CV Pathfinder region name.
This key is required for WAN routers but optional for pathfinders.
The region name must be defined under 'cv_pathfinder_regions'. | - | [      cv_pathfinder_site](## ".node_groups.[].cv_pathfinder_site") | String | | | | The CV Pathfinder site name.
This key is required for WAN routers but ignored for pathfinders.
The site name must be defined for the relevant region under 'cv_pathfinder_regions'. | + | [      cv_pathfinder_site](## ".node_groups.[].cv_pathfinder_site") | String | | | | The CV Pathfinder site name.
This key is required for WAN routers but optional for pathfinders.
For WAN routers and pathfinders with `cv_pathfinder_region`, the site name must be defined for the relevant region under 'cv_pathfinder_regions'.
For pathfinders without `cv_pathfinder_region` set, the site must be defined under `cv_pathfinder_global_sites`. | | [      wan_ha](## ".node_groups.[].wan_ha") | Dictionary | | | | PREVIEW: This key is currently not supported

The key is supported only if `wan_mode` == `cv-pathfinder`.
AutoVPN support is still to be determined.

Maximum 2 devices supported by group for HA. | | [        enabled](## ".node_groups.[].wan_ha.enabled") | Boolean | | `True` | | Enable / Disable auto CV-Pathfinder HA, when two nodes are defined in the same node_group. | | [        ipsec](## ".node_groups.[].wan_ha.ipsec") | Boolean | | `True` | | Enable / Disable IPsec over HA path-group when HA is enabled. | + | [        ha_interfaces](## ".node_groups.[].wan_ha.ha_interfaces") | List, items: String | | | | Local WAN HA interfaces
Overwrite the default behavior which is to pick all the `uplink_interfaces`.
Can be used to filter uplink interfaces when there are multiple uplinks.
Limitations:
Either all interfaces must be uplinks or all interfaces must not be uplinks.
Only one interface is supported for non uplinks. | + | [          - <str>](## ".node_groups.[].wan_ha.ha_interfaces.[]") | String | | | Pattern: Ethernet[\d/]+ | | + | [        ha_ipv4_pool](## ".node_groups.[].wan_ha.ha_ipv4_pool") | String | | | Format: ipv4_cidr | IP address pool used for WAN HA connectivity.
IP is derived from the node ID.
Not used for uplink interfaces. | + | [        max_ha_interfaces](## ".node_groups.[].wan_ha.max_ha_interfaces") | Integer | | | | Number of parallel links towards HA switches.
Can be used to reserve IP addresses for future parallel HA links. | + | [        flow_tracking](## ".node_groups.[].wan_ha.flow_tracking") | Dictionary | | | | Configures flow-tracking on the HA interfaces. Overrides `fabric_flow_tracking.wan_ha_links` setting. | + | [          enabled](## ".node_groups.[].wan_ha.flow_tracking.enabled") | Boolean | | | | | + | [          name](## ".node_groups.[].wan_ha.flow_tracking.name") | String | | | | Flow tracker name as defined in flow_tracking_settings. | | [      dps_mss_ipv4](## ".node_groups.[].dps_mss_ipv4") | String | | `auto` | | IPv4 MSS value configured under "router path-selection" on WAN Devices. | | [  nodes](## ".nodes") | List, items: Dictionary | | | | Define variables per node. | | [    - name](## ".nodes.[].name") | String | Required, Unique | | | The Node Name is used as "hostname". | | [      wan_role](## ".nodes.[].wan_role") | String | | | Valid Values:
- client
- server | Override the default WAN role.

This is used both for AutoVPN and Pathfinder designs.
That means if `wan_mode` root key is set to `autovpn` or `cv-pathfinder`.
`server` indicates that the router is a route-reflector.

Only supported if `overlay_routing_protocol` is set to `ibgp`. | | [      cv_pathfinder_transit_mode](## ".nodes.[].cv_pathfinder_transit_mode") | String | | | Valid Values:
- region
- zone | Configure the transit mode for a WAN client for CV Pathfinder designs
only when the `wan_mode` root key is set to `cv_pathfinder`.

'zone' is currently not supported. | | [      cv_pathfinder_region](## ".nodes.[].cv_pathfinder_region") | String | | | | The CV Pathfinder region name.
This key is required for WAN routers but optional for pathfinders.
The region name must be defined under 'cv_pathfinder_regions'. | - | [      cv_pathfinder_site](## ".nodes.[].cv_pathfinder_site") | String | | | | The CV Pathfinder site name.
This key is required for WAN routers but ignored for pathfinders.
The site name must be defined for the relevant region under 'cv_pathfinder_regions'. | + | [      cv_pathfinder_site](## ".nodes.[].cv_pathfinder_site") | String | | | | The CV Pathfinder site name.
This key is required for WAN routers but optional for pathfinders.
For WAN routers and pathfinders with `cv_pathfinder_region`, the site name must be defined for the relevant region under 'cv_pathfinder_regions'.
For pathfinders without `cv_pathfinder_region` set, the site must be defined under `cv_pathfinder_global_sites`. | | [      wan_ha](## ".nodes.[].wan_ha") | Dictionary | | | | PREVIEW: This key is currently not supported

The key is supported only if `wan_mode` == `cv-pathfinder`.
AutoVPN support is still to be determined.

Maximum 2 devices supported by group for HA. | | [        enabled](## ".nodes.[].wan_ha.enabled") | Boolean | | `True` | | Enable / Disable auto CV-Pathfinder HA, when two nodes are defined in the same node_group. | | [        ipsec](## ".nodes.[].wan_ha.ipsec") | Boolean | | `True` | | Enable / Disable IPsec over HA path-group when HA is enabled. | + | [        ha_interfaces](## ".nodes.[].wan_ha.ha_interfaces") | List, items: String | | | | Local WAN HA interfaces
Overwrite the default behavior which is to pick all the `uplink_interfaces`.
Can be used to filter uplink interfaces when there are multiple uplinks.
Limitations:
Either all interfaces must be uplinks or all interfaces must not be uplinks.
Only one interface is supported for non uplinks. | + | [          - <str>](## ".nodes.[].wan_ha.ha_interfaces.[]") | String | | | Pattern: Ethernet[\d/]+ | | + | [        ha_ipv4_pool](## ".nodes.[].wan_ha.ha_ipv4_pool") | String | | | Format: ipv4_cidr | IP address pool used for WAN HA connectivity.
IP is derived from the node ID.
Not used for uplink interfaces. | + | [        max_ha_interfaces](## ".nodes.[].wan_ha.max_ha_interfaces") | Integer | | | | Number of parallel links towards HA switches.
Can be used to reserve IP addresses for future parallel HA links. | + | [        flow_tracking](## ".nodes.[].wan_ha.flow_tracking") | Dictionary | | | | Configures flow-tracking on the HA interfaces. Overrides `fabric_flow_tracking.wan_ha_links` setting. | + | [          enabled](## ".nodes.[].wan_ha.flow_tracking.enabled") | Boolean | | | | | + | [          name](## ".nodes.[].wan_ha.flow_tracking.name") | String | | | | Flow tracker name as defined in flow_tracking_settings. | | [      dps_mss_ipv4](## ".nodes.[].dps_mss_ipv4") | String | | `auto` | | IPv4 MSS value configured under "router path-selection" on WAN Devices. | === "YAML" @@ -77,8 +105,9 @@ cv_pathfinder_region: # The CV Pathfinder site name. - # This key is required for WAN routers but ignored for pathfinders. - # The site name must be defined for the relevant region under 'cv_pathfinder_regions'. + # This key is required for WAN routers but optional for pathfinders. + # For WAN routers and pathfinders with `cv_pathfinder_region`, the site name must be defined for the relevant region under 'cv_pathfinder_regions'. + # For pathfinders without `cv_pathfinder_region` set, the site must be defined under `cv_pathfinder_global_sites`. cv_pathfinder_site: # PREVIEW: This key is currently not supported @@ -95,6 +124,31 @@ # Enable / Disable IPsec over HA path-group when HA is enabled. ipsec: + # Local WAN HA interfaces + # Overwrite the default behavior which is to pick all the `uplink_interfaces`. + # Can be used to filter uplink interfaces when there are multiple uplinks. + # Limitations: + # Either all interfaces must be uplinks or all interfaces must not be uplinks. + # Only one interface is supported for non uplinks. + ha_interfaces: + - + + # IP address pool used for WAN HA connectivity. + # IP is derived from the node ID. + # Not used for uplink interfaces. + ha_ipv4_pool: + + # Number of parallel links towards HA switches. + # Can be used to reserve IP addresses for future parallel HA links. + max_ha_interfaces: + + # Configures flow-tracking on the HA interfaces. Overrides `fabric_flow_tracking.wan_ha_links` setting. + flow_tracking: + enabled: + + # Flow tracker name as defined in flow_tracking_settings. + name: + # IPv4 MSS value configured under "router path-selection" on WAN Devices. dps_mss_ipv4: @@ -132,8 +186,9 @@ cv_pathfinder_region: # The CV Pathfinder site name. - # This key is required for WAN routers but ignored for pathfinders. - # The site name must be defined for the relevant region under 'cv_pathfinder_regions'. + # This key is required for WAN routers but optional for pathfinders. + # For WAN routers and pathfinders with `cv_pathfinder_region`, the site name must be defined for the relevant region under 'cv_pathfinder_regions'. + # For pathfinders without `cv_pathfinder_region` set, the site must be defined under `cv_pathfinder_global_sites`. cv_pathfinder_site: # PREVIEW: This key is currently not supported @@ -150,6 +205,31 @@ # Enable / Disable IPsec over HA path-group when HA is enabled. ipsec: + # Local WAN HA interfaces + # Overwrite the default behavior which is to pick all the `uplink_interfaces`. + # Can be used to filter uplink interfaces when there are multiple uplinks. + # Limitations: + # Either all interfaces must be uplinks or all interfaces must not be uplinks. + # Only one interface is supported for non uplinks. + ha_interfaces: + - + + # IP address pool used for WAN HA connectivity. + # IP is derived from the node ID. + # Not used for uplink interfaces. + ha_ipv4_pool: + + # Number of parallel links towards HA switches. + # Can be used to reserve IP addresses for future parallel HA links. + max_ha_interfaces: + + # Configures flow-tracking on the HA interfaces. Overrides `fabric_flow_tracking.wan_ha_links` setting. + flow_tracking: + enabled: + + # Flow tracker name as defined in flow_tracking_settings. + name: + # IPv4 MSS value configured under "router path-selection" on WAN Devices. dps_mss_ipv4: @@ -174,8 +254,9 @@ cv_pathfinder_region: # The CV Pathfinder site name. - # This key is required for WAN routers but ignored for pathfinders. - # The site name must be defined for the relevant region under 'cv_pathfinder_regions'. + # This key is required for WAN routers but optional for pathfinders. + # For WAN routers and pathfinders with `cv_pathfinder_region`, the site name must be defined for the relevant region under 'cv_pathfinder_regions'. + # For pathfinders without `cv_pathfinder_region` set, the site must be defined under `cv_pathfinder_global_sites`. cv_pathfinder_site: # PREVIEW: This key is currently not supported @@ -192,6 +273,31 @@ # Enable / Disable IPsec over HA path-group when HA is enabled. ipsec: + # Local WAN HA interfaces + # Overwrite the default behavior which is to pick all the `uplink_interfaces`. + # Can be used to filter uplink interfaces when there are multiple uplinks. + # Limitations: + # Either all interfaces must be uplinks or all interfaces must not be uplinks. + # Only one interface is supported for non uplinks. + ha_interfaces: + - + + # IP address pool used for WAN HA connectivity. + # IP is derived from the node ID. + # Not used for uplink interfaces. + ha_ipv4_pool: + + # Number of parallel links towards HA switches. + # Can be used to reserve IP addresses for future parallel HA links. + max_ha_interfaces: + + # Configures flow-tracking on the HA interfaces. Overrides `fabric_flow_tracking.wan_ha_links` setting. + flow_tracking: + enabled: + + # Flow tracker name as defined in flow_tracking_settings. + name: + # IPv4 MSS value configured under "router path-selection" on WAN Devices. dps_mss_ipv4: @@ -222,8 +328,9 @@ cv_pathfinder_region: # The CV Pathfinder site name. - # This key is required for WAN routers but ignored for pathfinders. - # The site name must be defined for the relevant region under 'cv_pathfinder_regions'. + # This key is required for WAN routers but optional for pathfinders. + # For WAN routers and pathfinders with `cv_pathfinder_region`, the site name must be defined for the relevant region under 'cv_pathfinder_regions'. + # For pathfinders without `cv_pathfinder_region` set, the site must be defined under `cv_pathfinder_global_sites`. cv_pathfinder_site: # PREVIEW: This key is currently not supported @@ -240,6 +347,31 @@ # Enable / Disable IPsec over HA path-group when HA is enabled. ipsec: + # Local WAN HA interfaces + # Overwrite the default behavior which is to pick all the `uplink_interfaces`. + # Can be used to filter uplink interfaces when there are multiple uplinks. + # Limitations: + # Either all interfaces must be uplinks or all interfaces must not be uplinks. + # Only one interface is supported for non uplinks. + ha_interfaces: + - + + # IP address pool used for WAN HA connectivity. + # IP is derived from the node ID. + # Not used for uplink interfaces. + ha_ipv4_pool: + + # Number of parallel links towards HA switches. + # Can be used to reserve IP addresses for future parallel HA links. + max_ha_interfaces: + + # Configures flow-tracking on the HA interfaces. Overrides `fabric_flow_tracking.wan_ha_links` setting. + flow_tracking: + enabled: + + # Flow tracker name as defined in flow_tracking_settings. + name: + # IPv4 MSS value configured under "router path-selection" on WAN Devices. dps_mss_ipv4: ``` diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/overlay-settings.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/overlay-settings.md index 9de743f5ad0..f348ef9ffa0 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/overlay-settings.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/overlay-settings.md @@ -8,10 +8,8 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [bgp_mesh_pes](## "bgp_mesh_pes") | Boolean | | `False` | | Configure an iBGP full mesh between PEs, either because there is no RR used or other reasons.
Only supported in combination with MPLS overlay.
| - | [mlag_ibgp_peering_vrfs](## "mlag_ibgp_peering_vrfs") | Dictionary | | | | On mlag leafs, an SVI interface is defined per vrf, to establish iBGP peering (required when there are MLAG leafs in topology).
The SVI id will be derived from the base vlan defined: mlag_ibgp_peering_vrfs.base_vlan + (vrf_id or vrf_vni) - 1.
Depending on the values of vrf_id / vrf_vni it may be required to adjust the base_vlan to avoid overlaps or invalid vlan ids.
The SVI ip address derived from mlag_l3_peer_ipv4_pool is re-used across all iBGP peerings.
| - | [  base_vlan](## "mlag_ibgp_peering_vrfs.base_vlan") | Integer | | `3000` | Min: 1
Max: 4093 | | | [overlay_cvx_servers](## "overlay_cvx_servers") | List, items: String | | | | List of CVX vxlan overlay controllers.
Required if overlay_routing_protocol == CVX.
CVX servers (VMs) are peering using their management interface, so mgmt_ip must be set for all CVX servers.
| - | [  - <str>](## "overlay_cvx_servers.[]") | String | | | | 'inventory_hostname' of CVX server
| + | [  - <str>](## "overlay_cvx_servers.[]") | String | | | | 'inventory_hostname' of CVX server.
| | [overlay_her_flood_list_per_vni](## "overlay_her_flood_list_per_vni") | Boolean | | `False` | | When using Head-End Replication, configure flood-lists per VNI.
By default HER will be configured with a common flood-list containing all VTEPs.
This behavior can be changed to per-VNI flood-lists by setting `overlay_her_flood_list_per_vni: true`.
This will make `eos_designs` consider configured VLANs per VTEP, and only include the relevant VTEPs to each VNI's flood-list.
| | [overlay_her_flood_list_scope](## "overlay_her_flood_list_scope") | String | | `fabric` | Valid Values:
- fabric
- dc | When using Head-End Replication, set the scope of flood-lists to Fabric or DC.
By default all VTEPs in the Fabric (part of the inventory group referenced by "fabric_name") are added to the flood-lists.
This can be changed to all VTEPs in the DC (sharing the same "dc_name" value).
This is useful if Border Leaf switches are dividing the VXLAN overlay into separate domains.
| | [overlay_loopback_description](## "overlay_loopback_description") | String | | | | Customize the description on overlay interface Loopback0. | @@ -37,19 +35,12 @@ # Only supported in combination with MPLS overlay. bgp_mesh_pes: - # On mlag leafs, an SVI interface is defined per vrf, to establish iBGP peering (required when there are MLAG leafs in topology). - # The SVI id will be derived from the base vlan defined: mlag_ibgp_peering_vrfs.base_vlan + (vrf_id or vrf_vni) - 1. - # Depending on the values of vrf_id / vrf_vni it may be required to adjust the base_vlan to avoid overlaps or invalid vlan ids. - # The SVI ip address derived from mlag_l3_peer_ipv4_pool is re-used across all iBGP peerings. - mlag_ibgp_peering_vrfs: - base_vlan: - # List of CVX vxlan overlay controllers. # Required if overlay_routing_protocol == CVX. # CVX servers (VMs) are peering using their management interface, so mgmt_ip must be set for all CVX servers. overlay_cvx_servers: - # 'inventory_hostname' of CVX server + # 'inventory_hostname' of CVX server. - # When using Head-End Replication, configure flood-lists per VNI. diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/platform-settings.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/platform-settings.md index 26376473dc1..d6babc2f87d 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/platform-settings.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/platform-settings.md @@ -25,6 +25,11 @@ | [      bgp_update_wait_install](## "platform_settings.[].feature_support.bgp_update_wait_install") | Boolean | | `True` | | Disables FIB updates and route advertisement when the BGP instance is initiated until the BGP convergence state is reached.
Can be overridden by setting "bgp_update_wait_install" host/group_vars.
| | [      bgp_update_wait_for_convergence](## "platform_settings.[].feature_support.bgp_update_wait_for_convergence") | Boolean | | `True` | | Do not advertise reachability to a prefix until that prefix has been installed in hardware.
This will eliminate any temporary black holes due to a BGP speaker advertising reachability to a prefix that may not yet be installed into the forwarding plane.
Can be overridden by setting "bgp_update_wait_for_convergence" host/group_vars.
| | [    management_interface](## "platform_settings.[].management_interface") | String | | `Management1` | | | + | [    security_entropy_sources](## "platform_settings.[].security_entropy_sources") | Dictionary | | | | Entropy source improves the randomness of the numbers used to generate MACsec's cryptographic keys. | + | [      hardware](## "platform_settings.[].security_entropy_sources.hardware") | Boolean | | | | Use a hardware based source. | + | [      haveged](## "platform_settings.[].security_entropy_sources.haveged") | Boolean | | | | Use the HAVEGE algorithm. | + | [      cpu_jitter](## "platform_settings.[].security_entropy_sources.cpu_jitter") | Boolean | | | | Use the Jitter RNG algorithm of a CPU based source. | + | [      hardware_exclusive](## "platform_settings.[].security_entropy_sources.hardware_exclusive") | Boolean | | | | Only use entropy from the hardware source. | | [    structured_config](## "platform_settings.[].structured_config") | Dictionary | | | | Custom structured config for eos_cli_config_gen. | | [    raw_eos_cli](## "platform_settings.[].raw_eos_cli") | String | | | | EOS CLI rendered directly on the root level of the final EOS configuration. | | [platform_speed_groups](## "platform_speed_groups") | List, items: Dictionary | | | | Set Hardware Speed Groups per Platform. | @@ -76,6 +81,21 @@ bgp_update_wait_for_convergence: management_interface: + # Entropy source improves the randomness of the numbers used to generate MACsec's cryptographic keys. + security_entropy_sources: + + # Use a hardware based source. + hardware: + + # Use the HAVEGE algorithm. + haveged: + + # Use the Jitter RNG algorithm of a CPU based source. + cpu_jitter: + + # Only use entropy from the hardware source. + hardware_exclusive: + # Custom structured config for eos_cli_config_gen. structured_config: @@ -142,6 +162,14 @@ reload_delay: mlag: 300 non_mlag: 330 + - feature_support: + per_interface_mtu: false + queue_monitor_length_notify: false + platforms: + - 7010TX + reload_delay: + mlag: 300 + non_mlag: 330 - lag_hardware_only: true platforms: - 7280R @@ -224,4 +252,24 @@ reload_delay: mlag: 300 non_mlag: 330 + - feature_support: + bgp_update_wait_for_convergence: true + bgp_update_wait_install: false + interface_storm_control: false + queue_monitor_length_notify: false + management_interface: Management1/1 + platforms: + - AWE-5310 + - AWE-5510 + - AWE-7250R + - AWE-7230R + - feature_support: + bgp_update_wait_for_convergence: true + bgp_update_wait_install: false + interface_storm_control: false + poe: true + queue_monitor_length_notify: false + management_interface: Management1 + platforms: + - AWE-7220R ``` diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/port-profiles.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/port-profiles.md index 80ba511cccf..f7e05121d74 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/port-profiles.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/port-profiles.md @@ -11,12 +11,12 @@ | [  - profile](## "port_profiles.[].profile") | String | Required, Unique | | | Port profile name. | | [    parent_profile](## "port_profiles.[].parent_profile") | String | | | | Parent profile is optional.
Port_profiles can refer to another port_profile to inherit settings in up to two levels (adapter->profile->parent_profile).
| | [    speed](## "port_profiles.[].speed") | String | | | | Set adapter speed in the format `` or `forced ` or `auto `.
If not specified speed will be auto.
| - | [    description](## "port_profiles.[].description") | String | | | | By default the description is built leveraging `_`.
When set this key will overide the default value on the physical ports.
| + | [    description](## "port_profiles.[].description") | String | | | | By default the description is built leveraging `_`.
When set this key will override the default value on the physical ports.
| | [    enabled](## "port_profiles.[].enabled") | Boolean | | `True` | | Administrative state, setting to false will set the port to 'shutdown' in the intended configuration.
| | [    mode](## "port_profiles.[].mode") | String | | | Valid Values:
- access
- dot1q-tunnel
- trunk
- trunk phone | Interface mode. | | [    mtu](## "port_profiles.[].mtu") | Integer | | | Min: 68
Max: 65535 | | - | [    l2_mtu](## "port_profiles.[].l2_mtu") | Integer | | | Min: 68
Max: 65535 | "l2_mtu" should only be defined for platforms supporting the "l2 mtu" CLI
| - | [    l2_mru](## "port_profiles.[].l2_mru") | Integer | | | Min: 68
Max: 65535 | "l2_mru" should only be defined for platforms supporting the "l2 mru" CLI
| + | [    l2_mtu](## "port_profiles.[].l2_mtu") | Integer | | | Min: 68
Max: 65535 | "l2_mtu" should only be defined for platforms supporting the "l2 mtu" CLI.
| + | [    l2_mru](## "port_profiles.[].l2_mru") | Integer | | | Min: 68
Max: 65535 | "l2_mru" should only be defined for platforms supporting the "l2 mru" CLI.
| | [    native_vlan](## "port_profiles.[].native_vlan") | Integer | | | Min: 1
Max: 4094 | Native VLAN for a trunk port.
If both `native_vlan` and `native_vlan_tag`, `native_vlan_tag` takes precedence.
| | [    native_vlan_tag](## "port_profiles.[].native_vlan_tag") | Boolean | | `False` | | If both `native_vlan` and `native_vlan_tag`, `native_vlan_tag` takes precedence. | | [    phone_vlan](## "port_profiles.[].phone_vlan") | Integer | | | Min: 1
Max: 4094 | Phone VLAN for a mode `trunk phone` port.
Requires `mode: trunk phone` to be set. | @@ -29,12 +29,15 @@ | [    spanning_tree_bpduguard](## "port_profiles.[].spanning_tree_bpduguard") | String | | | Valid Values:
- enabled
- disabled
- True
- False
- true
- false | | | [    flowcontrol](## "port_profiles.[].flowcontrol") | Dictionary | | | | | | [      received](## "port_profiles.[].flowcontrol.received") | String | | | Valid Values:
- received
- send
- on | | - | [    qos_profile](## "port_profiles.[].qos_profile") | String | | | | QOS profile name | + | [    qos_profile](## "port_profiles.[].qos_profile") | String | | | | QOS profile name. | | [    ptp](## "port_profiles.[].ptp") | Dictionary | | | | The global PTP profile parameters will be applied to all connected endpoints where `ptp` is manually enabled.
`ptp role master` is set to ensure control over the PTP topology.
| | [      enabled](## "port_profiles.[].ptp.enabled") | Boolean | | `False` | | | | [      endpoint_role](## "port_profiles.[].ptp.endpoint_role") | String | | `follower` | Valid Values:
- bmca
- default
- follower | | | [      profile](## "port_profiles.[].ptp.profile") | String | | `aes67-r16-2016` | Valid Values:
- aes67
- aes67-r16-2016
- smpte2059-2 | | - | [    sflow](## "port_profiles.[].sflow") | Boolean | | | | Configures sFlow on the interface. Overrides `fabric_sflow` setting.
| + | [    sflow](## "port_profiles.[].sflow") | Boolean | | | | Configures sFlow on the interface. Overrides `fabric_sflow.endpoints` setting. | + | [    flow_tracking](## "port_profiles.[].flow_tracking") | Dictionary | | | | Configures flow-tracking on the interface. Overrides `fabric_flow_tracking.endpoints` setting. | + | [      enabled](## "port_profiles.[].flow_tracking.enabled") | Boolean | | | | | + | [      name](## "port_profiles.[].flow_tracking.name") | String | | | | Flow tracker name as defined in flow_tracking_settings. | | [    link_tracking](## "port_profiles.[].link_tracking") | Dictionary | | | | Configure the downstream interfaces of a respective Link Tracking Group.
If `port_channel` is defined in an adapter, then the port-channel interface is configured to be the downstream.
Else all the ethernet interfaces will be configured as downstream -> to configure single-active EVPN multihomed networks.
| | [      enabled](## "port_profiles.[].link_tracking.enabled") | Boolean | | | | | | [      name](## "port_profiles.[].link_tracking.name") | String | | | | Tracking group name.
The default group name is taken from fabric variable of the switch, `link_tracking.groups[0].name` with default value being "LT_GROUP1".
Optional if default link_tracking settings are configured on the node.
| @@ -66,18 +69,18 @@ | [        native_vlan_membership_egress](## "port_profiles.[].dot1x.unauthorized.native_vlan_membership_egress") | Boolean | | | | | | [    poe](## "port_profiles.[].poe") | Dictionary | | | | Power Over Ethernet settings applied on port. Only configured if platform supports PoE. | | [      disabled](## "port_profiles.[].poe.disabled") | Boolean | | `False` | | Disable PoE on a POE capable port. PoE is enabled on all ports that support it by default in EOS. | - | [      priority](## "port_profiles.[].poe.priority") | String | | | Valid Values:
- critical
- high
- medium
- low | Prioritize a port's power in the event that one of the switch's power supplies loses power | - | [      reboot](## "port_profiles.[].poe.reboot") | Dictionary | | | | Set the PoE power behavior for a PoE port when the system is rebooted | - | [        action](## "port_profiles.[].poe.reboot.action") | String | | | Valid Values:
- maintain
- power-off | PoE action for interface | - | [      link_down](## "port_profiles.[].poe.link_down") | Dictionary | | | | Set the PoE power behavior for a PoE port when the port goes down | - | [        action](## "port_profiles.[].poe.link_down.action") | String | | | Valid Values:
- maintain
- power-off | PoE action for interface | + | [      priority](## "port_profiles.[].poe.priority") | String | | | Valid Values:
- critical
- high
- medium
- low | Prioritize a port's power in the event that one of the switch's power supplies loses power. | + | [      reboot](## "port_profiles.[].poe.reboot") | Dictionary | | | | Set the PoE power behavior for a PoE port when the system is rebooted. | + | [        action](## "port_profiles.[].poe.reboot.action") | String | | | Valid Values:
- maintain
- power-off | PoE action for interface. | + | [      link_down](## "port_profiles.[].poe.link_down") | Dictionary | | | | Set the PoE power behavior for a PoE port when the port goes down. | + | [        action](## "port_profiles.[].poe.link_down.action") | String | | | Valid Values:
- maintain
- power-off | PoE action for interface. | | [        power_off_delay](## "port_profiles.[].poe.link_down.power_off_delay") | Integer | | | Min: 1
Max: 86400 | Number of seconds to delay shutting the power off after a link down event occurs. Default value is 5 seconds in EOS. | - | [      shutdown](## "port_profiles.[].poe.shutdown") | Dictionary | | | | Set the PoE power behavior for a PoE port when the port is admin down | - | [        action](## "port_profiles.[].poe.shutdown.action") | String | | | Valid Values:
- maintain
- power-off | PoE action for interface | + | [      shutdown](## "port_profiles.[].poe.shutdown") | Dictionary | | | | Set the PoE power behavior for a PoE port when the port is admin down. | + | [        action](## "port_profiles.[].poe.shutdown.action") | String | | | Valid Values:
- maintain
- power-off | PoE action for interface. | | [      limit](## "port_profiles.[].poe.limit") | Dictionary | | | | Override the hardware-negotiated power limit using either wattage or a power class. Note that if using a power class, AVD will automatically convert the class value to the wattage value corresponding to that power class. | | [        class](## "port_profiles.[].poe.limit.class") | Integer | | | Min: 0
Max: 8 | | | [        watts](## "port_profiles.[].poe.limit.watts") | String | | | | | - | [        fixed](## "port_profiles.[].poe.limit.fixed") | Boolean | | | | Set to ignore hardware classification | + | [        fixed](## "port_profiles.[].poe.limit.fixed") | Boolean | | | | Set to ignore hardware classification. | | [      negotiation_lldp](## "port_profiles.[].poe.negotiation_lldp") | Boolean | | | | Disable to prevent port from negotiating power with powered devices over LLDP. Enabled by default in EOS. | | [      legacy_detect](## "port_profiles.[].poe.legacy_detect") | Boolean | | | | Allow a subset of legacy devices to work with the PoE switch. Disabled by default in EOS because it can cause false positive detections. | | [    storm_control](## "port_profiles.[].storm_control") | Dictionary | | | | Storm control settings applied on port toward the endpoint. | @@ -113,7 +116,7 @@ | [          sample](## "port_profiles.[].monitor_sessions.[].session_settings.sample") | Integer | | | | | | [          truncate](## "port_profiles.[].monitor_sessions.[].session_settings.truncate") | Dictionary | | | | | | [            enabled](## "port_profiles.[].monitor_sessions.[].session_settings.truncate.enabled") | Boolean | | | | | - | [            size](## "port_profiles.[].monitor_sessions.[].session_settings.truncate.size") | Integer | | | | Size in bytes | + | [            size](## "port_profiles.[].monitor_sessions.[].session_settings.truncate.size") | Integer | | | | Size in bytes. | | [    ethernet_segment](## "port_profiles.[].ethernet_segment") | Dictionary | | | | Settings for all or single-active EVPN multihoming. | | [      short_esi](## "port_profiles.[].ethernet_segment.short_esi") | String | Required | | | In format xxxx:xxxx:xxxx or "auto".
Define a manual short-esi (be careful using this on profiles) or set the value to "auto" to automatically generate the value.
Please see the notes under "EVPN A/A ESI dual and single-attached endpoint scenarios" before setting `short_esi: auto`.
| | [      redundancy](## "port_profiles.[].ethernet_segment.redundancy") | String | | | Valid Values:
- all-active
- single-active | If omitted, Port-Channels use the EOS default of all-active.
If omitted, Ethernet interfaces are configured as single-active.
| @@ -126,6 +129,7 @@ | [      channel_id](## "port_profiles.[].port_channel.channel_id") | Integer | | | | Port-Channel ID.
If no channel_id is specified, an id is generated from the first switch port in the port channel.
| | [      description](## "port_profiles.[].port_channel.description") | String | | | | By default the description is built leveraging `` name or `adapter.description` when defined.
When this key is defined, it will append its content to the physical port description.
| | [      enabled](## "port_profiles.[].port_channel.enabled") | Boolean | | `True` | | Port-Channel administrative state.
Setting to false will set port to 'shutdown' in intended configuration.
| + | [      ptp_mpass](## "port_profiles.[].port_channel.ptp_mpass") | Boolean | | `False` | | When MPASS is enabled on an MLAG port-channel, MLAG peers coordinate to function as a single PTP logical device.
Arista PTP enabled devices always place PTP messages on the same physical link within the port-channel.
Hence, MPASS is needed only on MLAG port-channels connected to non-Arista devices. | | [      esi](## "port_profiles.[].port_channel.esi") removed | String | | | | Format xxxx:xxxx:xxxx.This key was removed. Support was removed in AVD version 4.0.0. Use short_esi instead. | | [      short_esi](## "port_profiles.[].port_channel.short_esi") deprecated | String | | | | In format xxxx:xxxx:xxxx or "auto".This key is deprecated. Support will be removed in AVD version 5.0.0. Use ethernet_segment.short_esi instead. | | [      lacp_fallback](## "port_profiles.[].port_channel.lacp_fallback") | Dictionary | | | | LACP fallback configuration. | @@ -137,8 +141,8 @@ | [        mode](## "port_profiles.[].port_channel.lacp_timer.mode") | String | | | Valid Values:
- normal
- fast | LACP mode for interface members. | | [        multiplier](## "port_profiles.[].port_channel.lacp_timer.multiplier") | Integer | | | | Number of LACP BPDUs lost before deeming the peer down. EOS default is 3. | | [      subinterfaces](## "port_profiles.[].port_channel.subinterfaces") | List, items: Dictionary | | | | Port-Channel L2 Subinterfaces
Subinterfaces are only supported on routed port-channels, which means they cannot be configured on MLAG port-channels.
Setting short_esi: auto generates the short_esi automatically using a hash of configuration elements.
Please see the notes under "EVPN A/A ESI dual-attached endpoint scenario" before setting short_esi: auto.
| - | [        - number](## "port_profiles.[].port_channel.subinterfaces.[].number") | Integer | | | | Subinterface number | - | [          short_esi](## "port_profiles.[].port_channel.subinterfaces.[].short_esi") | String | | | | In format xxxx:xxxx:xxxx or "auto"
Required for multihomed port-channels with subinterfaces
| + | [        - number](## "port_profiles.[].port_channel.subinterfaces.[].number") | Integer | | | | Subinterface number. | + | [          short_esi](## "port_profiles.[].port_channel.subinterfaces.[].short_esi") | String | | | | In format xxxx:xxxx:xxxx or "auto".
Required for multihomed port-channels with subinterfaces.
| | [          vlan_id](## "port_profiles.[].port_channel.subinterfaces.[].vlan_id") | Integer | | | Min: 1
Max: 4094 | VLAN ID to bridge.
Default is subinterface number.
| | [          encapsulation_vlan](## "port_profiles.[].port_channel.subinterfaces.[].encapsulation_vlan") | Dictionary | | | | Client VLAN ID encapsulation.
Default is subinterface number.
| | [            client_dot1q](## "port_profiles.[].port_channel.subinterfaces.[].encapsulation_vlan.client_dot1q") | Integer | | | Min: 1
Max: 4094 | | @@ -167,7 +171,7 @@ speed: # By default the description is built leveraging `_`. - # When set this key will overide the default value on the physical ports. + # When set this key will override the default value on the physical ports. description: # Administrative state, setting to false will set the port to 'shutdown' in the intended configuration. @@ -177,10 +181,10 @@ mode: mtu: - # "l2_mtu" should only be defined for platforms supporting the "l2 mtu" CLI + # "l2_mtu" should only be defined for platforms supporting the "l2 mtu" CLI. l2_mtu: - # "l2_mru" should only be defined for platforms supporting the "l2 mru" CLI + # "l2_mru" should only be defined for platforms supporting the "l2 mru" CLI. l2_mru: # Native VLAN for a trunk port. @@ -211,7 +215,7 @@ flowcontrol: received: - # QOS profile name + # QOS profile name. qos_profile: # The global PTP profile parameters will be applied to all connected endpoints where `ptp` is manually enabled. @@ -221,9 +225,16 @@ endpoint_role: profile: - # Configures sFlow on the interface. Overrides `fabric_sflow` setting. + # Configures sFlow on the interface. Overrides `fabric_sflow.endpoints` setting. sflow: + # Configures flow-tracking on the interface. Overrides `fabric_flow_tracking.endpoints` setting. + flow_tracking: + enabled: + + # Flow tracker name as defined in flow_tracking_settings. + name: + # Configure the downstream interfaces of a respective Link Tracking Group. # If `port_channel` is defined in an adapter, then the port-channel interface is configured to be the downstream. # Else all the ethernet interfaces will be configured as downstream -> to configure single-active EVPN multihomed networks. @@ -271,28 +282,28 @@ # Disable PoE on a POE capable port. PoE is enabled on all ports that support it by default in EOS. disabled: - # Prioritize a port's power in the event that one of the switch's power supplies loses power + # Prioritize a port's power in the event that one of the switch's power supplies loses power. priority: - # Set the PoE power behavior for a PoE port when the system is rebooted + # Set the PoE power behavior for a PoE port when the system is rebooted. reboot: - # PoE action for interface + # PoE action for interface. action: - # Set the PoE power behavior for a PoE port when the port goes down + # Set the PoE power behavior for a PoE port when the port goes down. link_down: - # PoE action for interface + # PoE action for interface. action: # Number of seconds to delay shutting the power off after a link down event occurs. Default value is 5 seconds in EOS. power_off_delay: - # Set the PoE power behavior for a PoE port when the port is admin down + # Set the PoE power behavior for a PoE port when the port is admin down. shutdown: - # PoE action for interface + # PoE action for interface. action: # Override the hardware-negotiated power limit using either wattage or a power class. Note that if using a power class, AVD will automatically convert the class value to the wattage value corresponding to that power class. @@ -300,7 +311,7 @@ class: watts: - # Set to ignore hardware classification + # Set to ignore hardware classification. fixed: # Disable to prevent port from negotiating power with powered devices over LLDP. Enabled by default in EOS. @@ -385,7 +396,7 @@ truncate: enabled: - # Size in bytes + # Size in bytes. size: # Settings for all or single-active EVPN multihoming. @@ -434,6 +445,11 @@ # Setting to false will set port to 'shutdown' in intended configuration. enabled: + # When MPASS is enabled on an MLAG port-channel, MLAG peers coordinate to function as a single PTP logical device. + # Arista PTP enabled devices always place PTP messages on the same physical link within the port-channel. + # Hence, MPASS is needed only on MLAG port-channels connected to non-Arista devices. + ptp_mpass: + # In format xxxx:xxxx:xxxx or "auto". # This key is deprecated. # Support will be removed in AVD version 5.0.0. @@ -471,11 +487,11 @@ # Please see the notes under "EVPN A/A ESI dual-attached endpoint scenario" before setting short_esi: auto. subinterfaces: - # Subinterface number + # Subinterface number. - number: - # In format xxxx:xxxx:xxxx or "auto" - # Required for multihomed port-channels with subinterfaces + # In format xxxx:xxxx:xxxx or "auto". + # Required for multihomed port-channels with subinterfaces. short_esi: # VLAN ID to bridge. diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/role-input-validation.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/role-input-validation.md index be15e16d7a9..9cf132d557b 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/role-input-validation.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/role-input-validation.md @@ -7,7 +7,7 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | - | [avd_data_conversion_mode](## "avd_data_conversion_mode") | String | | `debug` | Valid Values:
- disabled
- error
- warning
- info
- debug
- quiet | Conversion Mode for AVD input data conversion.
Input data conversion will perform type conversion of input variables as defined in the schema.
The type conversion is intended to help the user to identify minor issues with the input data, while still allowing the data to be validated.
During conversion, messages will generated with information about the host(s) and key(s) which required conversion.
"disabled" means that conversion will not run - avoid this since conversion is also handling data deprecation and upgrade.
"error" will produce error messages and fail the task.
"warning" will produce warning messages.
"info" will produce regular log messages.
"debug" will produce hidden debug messages viewable with -v.
"quiet" will not produce any messages
| + | [avd_data_conversion_mode](## "avd_data_conversion_mode") | String | | `debug` | Valid Values:
- disabled
- error
- warning
- info
- debug
- quiet | Conversion Mode for AVD input data conversion.
Input data conversion will perform type conversion of input variables as defined in the schema.
The type conversion is intended to help the user to identify minor issues with the input data, while still allowing the data to be validated.
During conversion, messages will generated with information about the host(s) and key(s) which required conversion.
"disabled" means that conversion will not run - avoid this since conversion is also handling data deprecation and upgrade.
"error" will produce error messages and fail the task.
"warning" will produce warning messages.
"info" will produce regular log messages.
"debug" will produce hidden debug messages viewable with -v.
"quiet" will not produce any messages.
| | [avd_data_validation_mode](## "avd_data_validation_mode") | String | | `warning` | Valid Values:
- disabled
- error
- warning
- info
- debug | Validation Mode for AVD input data validation.
Input data validation will validate the input variables according to the schema.
During validation, messages will generated with information about the host(s) and key(s) which failed validation.
"disabled" means that validation will not run.
"error" will produce error messages and fail the task.
"warning" will produce warning messages.
"info" will produce regular log messages.
"debug" will produce hidden debug messages viewable with -v.
| === "YAML" @@ -22,7 +22,7 @@ # "warning" will produce warning messages. # "info" will produce regular log messages. # "debug" will produce hidden debug messages viewable with -v. - # "quiet" will not produce any messages + # "quiet" will not produce any messages. avd_data_conversion_mode: # Validation Mode for AVD input data validation. diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/svi-profiles.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/svi-profiles.md index 4cbd6a4637b..7f1ce01b825 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/svi-profiles.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/svi-profiles.md @@ -8,73 +8,77 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | | [svi_profiles](## "svi_profiles") | List, items: Dictionary | | | | Profiles to share common settings for SVIs under `.[].vrfs.svis`.
Keys are the same used under SVIs. Keys defined under SVIs take precedence.
Note: structured configuration is not merged recursively and will be taken directly from the most specific level in the following order:
1. svi.nodes[inventory_hostname].structured_config
2. svi_profile.nodes[inventory_hostname].structured_config
3. svi_parent_profile.nodes[inventory_hostname].structured_config
4. svi.structured_config
5. svi_profile.structured_config
6. svi_parent_profile.structured_config
| - | [  - profile](## "svi_profiles.[].profile") | String | Required, Unique | | | Profile name | + | [  - profile](## "svi_profiles.[].profile") | String | Required, Unique | | | Profile name. | | [    parent_profile](## "svi_profiles.[].parent_profile") | String | | | | Parent SVI profile name to apply.
svi_profiles can refer to another svi_profile to inherit settings in up to two levels (svi -> svi_profile -> svi_parent_profile).
| | [    nodes](## "svi_profiles.[].nodes") | List, items: Dictionary | | | | Define node specific configuration, such as unique IP addresses.
Any keys set here will be merged onto the SVI config, except `structured_config` keys which will replace the `structured_config` set on SVI level.
| - | [      - node](## "svi_profiles.[].nodes.[].node") | String | Required, Unique | | | l3_leaf inventory hostname | - | [        name](## "svi_profiles.[].nodes.[].name") | String | | | | VLAN name | - | [        enabled](## "svi_profiles.[].nodes.[].enabled") | Boolean | | | | Enable or disable interface | + | [      - node](## "svi_profiles.[].nodes.[].node") | String | Required, Unique | | | l3_leaf inventory hostname. | + | [        name](## "svi_profiles.[].nodes.[].name") | String | | | | VLAN name. | + | [        enabled](## "svi_profiles.[].nodes.[].enabled") | Boolean | | | | Enable or disable interface. | | [        description](## "svi_profiles.[].nodes.[].description") | String | | | | SVI description. By default set to VLAN name.
| | [        ip_address](## "svi_profiles.[].nodes.[].ip_address") | String | | | | IPv4_address/Mask. Usually set under "nodes" to have unique IPv4 addresses per node. | | [        ipv6_address](## "svi_profiles.[].nodes.[].ipv6_address") | String | | | | IPv6_address/Mask. Usually set under "nodes" to have unique IPv6 addresses per node. | | [        ipv6_enable](## "svi_profiles.[].nodes.[].ipv6_enable") | Boolean | | | | Explicitly enable/disable link-local IPv6 addressing. | - | [        ip_address_virtual](## "svi_profiles.[].nodes.[].ip_address_virtual") | String | | | | IPv4_address/Mask
IPv4 VXLAN Anycast IP address
Conserves IP addresses in VXLAN deployments as it doesn't require unique IP addresses on each node.
| - | [        ipv6_address_virtual](## "svi_profiles.[].nodes.[].ipv6_address_virtual") deprecated | String | | | | IPv6_address/Mask
ipv6 address virtuals to configure VXLAN Anycast IP address (Optional)
If both "ipv6_address_virtual" and "ipv6_address_virtuals" are set, all addresses will be configured
This key is deprecated. Support will be removed in AVD version 5.0.0. Use ipv6_address_virtuals instead. | - | [        ipv6_address_virtuals](## "svi_profiles.[].nodes.[].ipv6_address_virtuals") | List, items: String | | | | IPv6 VXLAN Anycast IP addresses
Conserves IPv6 addresses in VXLAN deployments as it doesn't require unique IPv6 addresses on each node.
| - | [          - <str>](## "svi_profiles.[].nodes.[].ipv6_address_virtuals.[]") | String | | | | IPv6_address/Mask | - | [        ip_address_virtual_secondaries](## "svi_profiles.[].nodes.[].ip_address_virtual_secondaries") | List, items: String | | | | Secondary IPv4 VXLAN Anycast IP addresses | - | [          - <str>](## "svi_profiles.[].nodes.[].ip_address_virtual_secondaries.[]") | String | | | | IPv4_address/Mask | + | [        ip_address_virtual](## "svi_profiles.[].nodes.[].ip_address_virtual") | String | | | | IPv4_address/Mask.
IPv4 VXLAN Anycast IP address.
Conserves IP addresses in VXLAN deployments as it doesn't require unique IP addresses on each node.
| + | [        ipv6_address_virtual](## "svi_profiles.[].nodes.[].ipv6_address_virtual") deprecated | String | | | | IPv6_address/Mask.
ipv6 address virtuals to configure VXLAN Anycast IP address (Optional).
If both "ipv6_address_virtual" and "ipv6_address_virtuals" are set, all addresses will be configured.
This key is deprecated. Support will be removed in AVD version 5.0.0. Use ipv6_address_virtuals instead. | + | [        ipv6_address_virtuals](## "svi_profiles.[].nodes.[].ipv6_address_virtuals") | List, items: String | | | | IPv6 VXLAN Anycast IP addresses.
Conserves IPv6 addresses in VXLAN deployments as it doesn't require unique IPv6 addresses on each node.
| + | [          - <str>](## "svi_profiles.[].nodes.[].ipv6_address_virtuals.[]") | String | | | | IPv6_address/Mask. | + | [        ip_address_virtual_secondaries](## "svi_profiles.[].nodes.[].ip_address_virtual_secondaries") | List, items: String | | | | Secondary IPv4 VXLAN Anycast IP addresses. | + | [          - <str>](## "svi_profiles.[].nodes.[].ip_address_virtual_secondaries.[]") | String | | | | IPv4_address/Mask. | | [        ip_virtual_router_addresses](## "svi_profiles.[].nodes.[].ip_virtual_router_addresses") | List, items: String | | | | IPv4 VARP addresses.
Requires an IP address to be configured on the SVI.
If ip_address_virtual is also set, ip_virtual_router_addresses will take precedence
_if_ there is an ip_address configured for the node.
| - | [          - <str>](## "svi_profiles.[].nodes.[].ip_virtual_router_addresses.[]") | String | | | | IPv4_address/Mask or IPv4_address
IPv4_address/Mask will also configure a static route to the SVI per best practice.
| + | [          - <str>](## "svi_profiles.[].nodes.[].ip_virtual_router_addresses.[]") | String | | | | IPv4_address/Mask or IPv4_address.
IPv4_address/Mask will also configure a static route to the SVI per best practice.
| | [        ipv6_virtual_router_addresses](## "svi_profiles.[].nodes.[].ipv6_virtual_router_addresses") | List, items: String | | | | IPv6 VARP addresses.
Requires an IPv6 address to be configured on the SVI.
If ipv6_address_virtuals is also set, ipv6_virtual_router_addresses will take precedence
_if_ there is an ipv6_address configured for the node.
| - | [          - <str>](## "svi_profiles.[].nodes.[].ipv6_virtual_router_addresses.[]") | String | | | | IPv6_address | - | [        ip_helpers](## "svi_profiles.[].nodes.[].ip_helpers") | List, items: Dictionary | | | | IP helper for DHCP relay | - | [          - ip_helper](## "svi_profiles.[].nodes.[].ip_helpers.[].ip_helper") | String | Required, Unique | | | IPv4 DHCP server IP | + | [          - <str>](## "svi_profiles.[].nodes.[].ipv6_virtual_router_addresses.[]") | String | | | | IPv6_address. | + | [        ipv4_acl_in](## "svi_profiles.[].nodes.[].ipv4_acl_in") | String | | | | Name of the IPv4 access-list to be assigned in the ingress direction.
The access-list must be defined under `ipv4_acls` and supports substitution of the field "interface_ip". | + | [        ipv4_acl_out](## "svi_profiles.[].nodes.[].ipv4_acl_out") | String | | | | Name of the IPv4 Access-list to be assigned in the egress direction.
The access-list must be defined under `ipv4_acls` and supports substitution of the field "interface_ip". | + | [        ip_helpers](## "svi_profiles.[].nodes.[].ip_helpers") | List, items: Dictionary | | | | IP helper for DHCP relay. | + | [          - ip_helper](## "svi_profiles.[].nodes.[].ip_helpers.[].ip_helper") | String | Required, Unique | | | IPv4 DHCP server IP. | | [            source_interface](## "svi_profiles.[].nodes.[].ip_helpers.[].source_interface") | String | | | | Interface name to originate DHCP relay packets to DHCP server. | | [            source_vrf](## "svi_profiles.[].nodes.[].ip_helpers.[].source_vrf") | String | | | | VRF to originate DHCP relay packets to DHCP server. If not set, EOS uses the VRF on the SVI. | | [        vni_override](## "svi_profiles.[].nodes.[].vni_override") | Integer | | | Min: 1
Max: 16777215 | By default the VNI will be derived from "mac_vrf_vni_base".
The vni_override allows us to override this value and statically define it (optional).
| - | [        rt_override](## "svi_profiles.[].nodes.[].rt_override") | String | | | | By default the MAC VRF RT will be derived from mac_vrf_id_base + vlan_id.
The rt_override allows us to override this value and statically define it.
rt_override will default to vni_override if set.

rt_override supports two formats:
- A single number which will be used in the RT fields instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rt_type' for details).
- A full RT string with colon seperator which will override the full RT.
| - | [        rd_override](## "svi_profiles.[].nodes.[].rd_override") | String | | | | By default the MAC VRF RD will be derived from mac_vrf_id_base + vlan_id.
The rt_override allows us to override this value and statically define it.
rd_override will default to rt_override or vni_override if set.

rd_override supports two formats:
- A single number which will be used in the RD assigned number field instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rd_type' for details).
- A full RD string with colon seperator which will override the full RD.
| + | [        rt_override](## "svi_profiles.[].nodes.[].rt_override") | String | | | | By default the MAC VRF RT will be derived from mac_vrf_id_base + vlan_id.
The rt_override allows us to override this value and statically define it.
rt_override will default to vni_override if set.

rt_override supports two formats:
- A single number which will be used in the RT fields instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rt_type' for details).
- A full RT string with colon separator which will override the full RT.
| + | [        rd_override](## "svi_profiles.[].nodes.[].rd_override") | String | | | | By default the MAC VRF RD will be derived from mac_vrf_id_base + vlan_id.
The rt_override allows us to override this value and statically define it.
rd_override will default to rt_override or vni_override if set.

rd_override supports two formats:
- A single number which will be used in the RD assigned number field instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rd_type' for details).
- A full RD string with colon separator which will override the full RD.
| | [        trunk_groups](## "svi_profiles.[].nodes.[].trunk_groups") | List, items: String | | | | | | [          - <str>](## "svi_profiles.[].nodes.[].trunk_groups.[]") | String | | | | Trunk groups are used for limiting vlans to trunk ports assigned to the same trunk group.
Requires "enable_trunk_groups: true".
| | [        vxlan](## "svi_profiles.[].nodes.[].vxlan") | Boolean | | `True` | | Extend this SVI over VXLAN. | | [        spanning_tree_priority](## "svi_profiles.[].nodes.[].spanning_tree_priority") | Integer | | | | Setting spanning-tree priority per VLAN is only supported with `spanning_tree_mode: rapid-pvst` under node type settings.
The default priority for rapid-PVST is set under the node type settings with `spanning_tree_priority` (default=32768). | | [        mtu](## "svi_profiles.[].nodes.[].mtu") | Integer | | | | Interface MTU. | | [        bgp](## "svi_profiles.[].nodes.[].bgp") | Dictionary | | | | | - | [          structured_config](## "svi_profiles.[].nodes.[].bgp.structured_config") | Dictionary | | | | Structured configuration and EOS CLI commands rendered on router_bgp.vlans.[id=]
This configuration will not be applied to vlan aware bundles
| + | [          structured_config](## "svi_profiles.[].nodes.[].bgp.structured_config") | Dictionary | | | | Structured configuration and EOS CLI commands rendered on router_bgp.vlans.[id=].
This configuration will not be applied to vlan aware bundles.
| | [          raw_eos_cli](## "svi_profiles.[].nodes.[].bgp.raw_eos_cli") | String | | | | EOS CLI rendered directly on the Router BGP, VLAN definition in the final EOS configuration.
| | [        raw_eos_cli](## "svi_profiles.[].nodes.[].raw_eos_cli") | String | | | | EOS CLI rendered directly on the VLAN interface in the final EOS configuration.
| | [        structured_config](## "svi_profiles.[].nodes.[].structured_config") | Dictionary | | | | Custom structured config added under vlan_interfaces.[name=] for eos_cli_config_gen.
| - | [    name](## "svi_profiles.[].name") | String | | | | VLAN name | - | [    enabled](## "svi_profiles.[].enabled") | Boolean | | | | Enable or disable interface | + | [    name](## "svi_profiles.[].name") | String | | | | VLAN name. | + | [    enabled](## "svi_profiles.[].enabled") | Boolean | | | | Enable or disable interface. | | [    description](## "svi_profiles.[].description") | String | | | | SVI description. By default set to VLAN name.
| | [    ip_address](## "svi_profiles.[].ip_address") | String | | | | IPv4_address/Mask. Usually set under "nodes" to have unique IPv4 addresses per node. | | [    ipv6_address](## "svi_profiles.[].ipv6_address") | String | | | | IPv6_address/Mask. Usually set under "nodes" to have unique IPv6 addresses per node. | | [    ipv6_enable](## "svi_profiles.[].ipv6_enable") | Boolean | | | | Explicitly enable/disable link-local IPv6 addressing. | - | [    ip_address_virtual](## "svi_profiles.[].ip_address_virtual") | String | | | | IPv4_address/Mask
IPv4 VXLAN Anycast IP address
Conserves IP addresses in VXLAN deployments as it doesn't require unique IP addresses on each node.
| - | [    ipv6_address_virtual](## "svi_profiles.[].ipv6_address_virtual") deprecated | String | | | | IPv6_address/Mask
ipv6 address virtuals to configure VXLAN Anycast IP address (Optional)
If both "ipv6_address_virtual" and "ipv6_address_virtuals" are set, all addresses will be configured
This key is deprecated. Support will be removed in AVD version 5.0.0. Use ipv6_address_virtuals instead. | - | [    ipv6_address_virtuals](## "svi_profiles.[].ipv6_address_virtuals") | List, items: String | | | | IPv6 VXLAN Anycast IP addresses
Conserves IPv6 addresses in VXLAN deployments as it doesn't require unique IPv6 addresses on each node.
| - | [      - <str>](## "svi_profiles.[].ipv6_address_virtuals.[]") | String | | | | IPv6_address/Mask | - | [    ip_address_virtual_secondaries](## "svi_profiles.[].ip_address_virtual_secondaries") | List, items: String | | | | Secondary IPv4 VXLAN Anycast IP addresses | - | [      - <str>](## "svi_profiles.[].ip_address_virtual_secondaries.[]") | String | | | | IPv4_address/Mask | + | [    ip_address_virtual](## "svi_profiles.[].ip_address_virtual") | String | | | | IPv4_address/Mask.
IPv4 VXLAN Anycast IP address.
Conserves IP addresses in VXLAN deployments as it doesn't require unique IP addresses on each node.
| + | [    ipv6_address_virtual](## "svi_profiles.[].ipv6_address_virtual") deprecated | String | | | | IPv6_address/Mask.
ipv6 address virtuals to configure VXLAN Anycast IP address (Optional).
If both "ipv6_address_virtual" and "ipv6_address_virtuals" are set, all addresses will be configured.
This key is deprecated. Support will be removed in AVD version 5.0.0. Use ipv6_address_virtuals instead. | + | [    ipv6_address_virtuals](## "svi_profiles.[].ipv6_address_virtuals") | List, items: String | | | | IPv6 VXLAN Anycast IP addresses.
Conserves IPv6 addresses in VXLAN deployments as it doesn't require unique IPv6 addresses on each node.
| + | [      - <str>](## "svi_profiles.[].ipv6_address_virtuals.[]") | String | | | | IPv6_address/Mask. | + | [    ip_address_virtual_secondaries](## "svi_profiles.[].ip_address_virtual_secondaries") | List, items: String | | | | Secondary IPv4 VXLAN Anycast IP addresses. | + | [      - <str>](## "svi_profiles.[].ip_address_virtual_secondaries.[]") | String | | | | IPv4_address/Mask. | | [    ip_virtual_router_addresses](## "svi_profiles.[].ip_virtual_router_addresses") | List, items: String | | | | IPv4 VARP addresses.
Requires an IP address to be configured on the SVI.
If ip_address_virtual is also set, ip_virtual_router_addresses will take precedence
_if_ there is an ip_address configured for the node.
| - | [      - <str>](## "svi_profiles.[].ip_virtual_router_addresses.[]") | String | | | | IPv4_address/Mask or IPv4_address
IPv4_address/Mask will also configure a static route to the SVI per best practice.
| + | [      - <str>](## "svi_profiles.[].ip_virtual_router_addresses.[]") | String | | | | IPv4_address/Mask or IPv4_address.
IPv4_address/Mask will also configure a static route to the SVI per best practice.
| | [    ipv6_virtual_router_addresses](## "svi_profiles.[].ipv6_virtual_router_addresses") | List, items: String | | | | IPv6 VARP addresses.
Requires an IPv6 address to be configured on the SVI.
If ipv6_address_virtuals is also set, ipv6_virtual_router_addresses will take precedence
_if_ there is an ipv6_address configured for the node.
| - | [      - <str>](## "svi_profiles.[].ipv6_virtual_router_addresses.[]") | String | | | | IPv6_address | - | [    ip_helpers](## "svi_profiles.[].ip_helpers") | List, items: Dictionary | | | | IP helper for DHCP relay | - | [      - ip_helper](## "svi_profiles.[].ip_helpers.[].ip_helper") | String | Required, Unique | | | IPv4 DHCP server IP | + | [      - <str>](## "svi_profiles.[].ipv6_virtual_router_addresses.[]") | String | | | | IPv6_address. | + | [    ipv4_acl_in](## "svi_profiles.[].ipv4_acl_in") | String | | | | Name of the IPv4 access-list to be assigned in the ingress direction.
The access-list must be defined under `ipv4_acls` and supports substitution of the field "interface_ip". | + | [    ipv4_acl_out](## "svi_profiles.[].ipv4_acl_out") | String | | | | Name of the IPv4 Access-list to be assigned in the egress direction.
The access-list must be defined under `ipv4_acls` and supports substitution of the field "interface_ip". | + | [    ip_helpers](## "svi_profiles.[].ip_helpers") | List, items: Dictionary | | | | IP helper for DHCP relay. | + | [      - ip_helper](## "svi_profiles.[].ip_helpers.[].ip_helper") | String | Required, Unique | | | IPv4 DHCP server IP. | | [        source_interface](## "svi_profiles.[].ip_helpers.[].source_interface") | String | | | | Interface name to originate DHCP relay packets to DHCP server. | | [        source_vrf](## "svi_profiles.[].ip_helpers.[].source_vrf") | String | | | | VRF to originate DHCP relay packets to DHCP server. If not set, EOS uses the VRF on the SVI. | | [    vni_override](## "svi_profiles.[].vni_override") | Integer | | | Min: 1
Max: 16777215 | By default the VNI will be derived from "mac_vrf_vni_base".
The vni_override allows us to override this value and statically define it (optional).
| - | [    rt_override](## "svi_profiles.[].rt_override") | String | | | | By default the MAC VRF RT will be derived from mac_vrf_id_base + vlan_id.
The rt_override allows us to override this value and statically define it.
rt_override will default to vni_override if set.

rt_override supports two formats:
- A single number which will be used in the RT fields instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rt_type' for details).
- A full RT string with colon seperator which will override the full RT.
| - | [    rd_override](## "svi_profiles.[].rd_override") | String | | | | By default the MAC VRF RD will be derived from mac_vrf_id_base + vlan_id.
The rt_override allows us to override this value and statically define it.
rd_override will default to rt_override or vni_override if set.

rd_override supports two formats:
- A single number which will be used in the RD assigned number field instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rd_type' for details).
- A full RD string with colon seperator which will override the full RD.
| + | [    rt_override](## "svi_profiles.[].rt_override") | String | | | | By default the MAC VRF RT will be derived from mac_vrf_id_base + vlan_id.
The rt_override allows us to override this value and statically define it.
rt_override will default to vni_override if set.

rt_override supports two formats:
- A single number which will be used in the RT fields instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rt_type' for details).
- A full RT string with colon separator which will override the full RT.
| + | [    rd_override](## "svi_profiles.[].rd_override") | String | | | | By default the MAC VRF RD will be derived from mac_vrf_id_base + vlan_id.
The rt_override allows us to override this value and statically define it.
rd_override will default to rt_override or vni_override if set.

rd_override supports two formats:
- A single number which will be used in the RD assigned number field instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rd_type' for details).
- A full RD string with colon separator which will override the full RD.
| | [    trunk_groups](## "svi_profiles.[].trunk_groups") | List, items: String | | | | | | [      - <str>](## "svi_profiles.[].trunk_groups.[]") | String | | | | Trunk groups are used for limiting vlans to trunk ports assigned to the same trunk group.
Requires "enable_trunk_groups: true".
| | [    vxlan](## "svi_profiles.[].vxlan") | Boolean | | `True` | | Extend this SVI over VXLAN. | | [    spanning_tree_priority](## "svi_profiles.[].spanning_tree_priority") | Integer | | | | Setting spanning-tree priority per VLAN is only supported with `spanning_tree_mode: rapid-pvst` under node type settings.
The default priority for rapid-PVST is set under the node type settings with `spanning_tree_priority` (default=32768). | | [    mtu](## "svi_profiles.[].mtu") | Integer | | | | Interface MTU. | | [    bgp](## "svi_profiles.[].bgp") | Dictionary | | | | | - | [      structured_config](## "svi_profiles.[].bgp.structured_config") | Dictionary | | | | Structured configuration and EOS CLI commands rendered on router_bgp.vlans.[id=]
This configuration will not be applied to vlan aware bundles
| + | [      structured_config](## "svi_profiles.[].bgp.structured_config") | Dictionary | | | | Structured configuration and EOS CLI commands rendered on router_bgp.vlans.[id=].
This configuration will not be applied to vlan aware bundles.
| | [      raw_eos_cli](## "svi_profiles.[].bgp.raw_eos_cli") | String | | | | EOS CLI rendered directly on the Router BGP, VLAN definition in the final EOS configuration.
| | [    raw_eos_cli](## "svi_profiles.[].raw_eos_cli") | String | | | | EOS CLI rendered directly on the VLAN interface in the final EOS configuration.
| | [    structured_config](## "svi_profiles.[].structured_config") | Dictionary | | | | Custom structured config added under vlan_interfaces.[name=] for eos_cli_config_gen.
| @@ -93,7 +97,7 @@ # 6. svi_parent_profile.structured_config svi_profiles: - # Profile name + # Profile name. - profile: # Parent SVI profile name to apply. @@ -104,13 +108,13 @@ # Any keys set here will be merged onto the SVI config, except `structured_config` keys which will replace the `structured_config` set on SVI level. nodes: - # l3_leaf inventory hostname + # l3_leaf inventory hostname. - node: - # VLAN name + # VLAN name. name: - # Enable or disable interface + # Enable or disable interface. enabled: # SVI description. By default set to VLAN name. @@ -125,30 +129,30 @@ # Explicitly enable/disable link-local IPv6 addressing. ipv6_enable: - # IPv4_address/Mask - # IPv4 VXLAN Anycast IP address + # IPv4_address/Mask. + # IPv4 VXLAN Anycast IP address. # Conserves IP addresses in VXLAN deployments as it doesn't require unique IP addresses on each node. ip_address_virtual: - # IPv6_address/Mask - # ipv6 address virtuals to configure VXLAN Anycast IP address (Optional) - # If both "ipv6_address_virtual" and "ipv6_address_virtuals" are set, all addresses will be configured + # IPv6_address/Mask. + # ipv6 address virtuals to configure VXLAN Anycast IP address (Optional). + # If both "ipv6_address_virtual" and "ipv6_address_virtuals" are set, all addresses will be configured. # This key is deprecated. # Support will be removed in AVD version 5.0.0. # Use ipv6_address_virtuals instead. ipv6_address_virtual: - # IPv6 VXLAN Anycast IP addresses + # IPv6 VXLAN Anycast IP addresses. # Conserves IPv6 addresses in VXLAN deployments as it doesn't require unique IPv6 addresses on each node. ipv6_address_virtuals: - # IPv6_address/Mask + # IPv6_address/Mask. - - # Secondary IPv4 VXLAN Anycast IP addresses + # Secondary IPv4 VXLAN Anycast IP addresses. ip_address_virtual_secondaries: - # IPv4_address/Mask + # IPv4_address/Mask. - # IPv4 VARP addresses. @@ -157,7 +161,7 @@ # _if_ there is an ip_address configured for the node. ip_virtual_router_addresses: - # IPv4_address/Mask or IPv4_address + # IPv4_address/Mask or IPv4_address. # IPv4_address/Mask will also configure a static route to the SVI per best practice. - @@ -167,13 +171,21 @@ # _if_ there is an ipv6_address configured for the node. ipv6_virtual_router_addresses: - # IPv6_address + # IPv6_address. - - # IP helper for DHCP relay + # Name of the IPv4 access-list to be assigned in the ingress direction. + # The access-list must be defined under `ipv4_acls` and supports substitution of the field "interface_ip". + ipv4_acl_in: + + # Name of the IPv4 Access-list to be assigned in the egress direction. + # The access-list must be defined under `ipv4_acls` and supports substitution of the field "interface_ip". + ipv4_acl_out: + + # IP helper for DHCP relay. ip_helpers: - # IPv4 DHCP server IP + # IPv4 DHCP server IP. - ip_helper: # Interface name to originate DHCP relay packets to DHCP server. @@ -192,7 +204,7 @@ # # rt_override supports two formats: # - A single number which will be used in the RT fields instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rt_type' for details). - # - A full RT string with colon seperator which will override the full RT. + # - A full RT string with colon separator which will override the full RT. rt_override: # By default the MAC VRF RD will be derived from mac_vrf_id_base + vlan_id. @@ -201,7 +213,7 @@ # # rd_override supports two formats: # - A single number which will be used in the RD assigned number field instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rd_type' for details). - # - A full RD string with colon seperator which will override the full RD. + # - A full RD string with colon separator which will override the full RD. rd_override: trunk_groups: @@ -220,8 +232,8 @@ mtu: bgp: - # Structured configuration and EOS CLI commands rendered on router_bgp.vlans.[id=] - # This configuration will not be applied to vlan aware bundles + # Structured configuration and EOS CLI commands rendered on router_bgp.vlans.[id=]. + # This configuration will not be applied to vlan aware bundles. structured_config: # EOS CLI rendered directly on the Router BGP, VLAN definition in the final EOS configuration. @@ -233,10 +245,10 @@ # Custom structured config added under vlan_interfaces.[name=] for eos_cli_config_gen. structured_config: - # VLAN name + # VLAN name. name: - # Enable or disable interface + # Enable or disable interface. enabled: # SVI description. By default set to VLAN name. @@ -251,30 +263,30 @@ # Explicitly enable/disable link-local IPv6 addressing. ipv6_enable: - # IPv4_address/Mask - # IPv4 VXLAN Anycast IP address + # IPv4_address/Mask. + # IPv4 VXLAN Anycast IP address. # Conserves IP addresses in VXLAN deployments as it doesn't require unique IP addresses on each node. ip_address_virtual: - # IPv6_address/Mask - # ipv6 address virtuals to configure VXLAN Anycast IP address (Optional) - # If both "ipv6_address_virtual" and "ipv6_address_virtuals" are set, all addresses will be configured + # IPv6_address/Mask. + # ipv6 address virtuals to configure VXLAN Anycast IP address (Optional). + # If both "ipv6_address_virtual" and "ipv6_address_virtuals" are set, all addresses will be configured. # This key is deprecated. # Support will be removed in AVD version 5.0.0. # Use ipv6_address_virtuals instead. ipv6_address_virtual: - # IPv6 VXLAN Anycast IP addresses + # IPv6 VXLAN Anycast IP addresses. # Conserves IPv6 addresses in VXLAN deployments as it doesn't require unique IPv6 addresses on each node. ipv6_address_virtuals: - # IPv6_address/Mask + # IPv6_address/Mask. - - # Secondary IPv4 VXLAN Anycast IP addresses + # Secondary IPv4 VXLAN Anycast IP addresses. ip_address_virtual_secondaries: - # IPv4_address/Mask + # IPv4_address/Mask. - # IPv4 VARP addresses. @@ -283,7 +295,7 @@ # _if_ there is an ip_address configured for the node. ip_virtual_router_addresses: - # IPv4_address/Mask or IPv4_address + # IPv4_address/Mask or IPv4_address. # IPv4_address/Mask will also configure a static route to the SVI per best practice. - @@ -293,13 +305,21 @@ # _if_ there is an ipv6_address configured for the node. ipv6_virtual_router_addresses: - # IPv6_address + # IPv6_address. - - # IP helper for DHCP relay + # Name of the IPv4 access-list to be assigned in the ingress direction. + # The access-list must be defined under `ipv4_acls` and supports substitution of the field "interface_ip". + ipv4_acl_in: + + # Name of the IPv4 Access-list to be assigned in the egress direction. + # The access-list must be defined under `ipv4_acls` and supports substitution of the field "interface_ip". + ipv4_acl_out: + + # IP helper for DHCP relay. ip_helpers: - # IPv4 DHCP server IP + # IPv4 DHCP server IP. - ip_helper: # Interface name to originate DHCP relay packets to DHCP server. @@ -318,7 +338,7 @@ # # rt_override supports two formats: # - A single number which will be used in the RT fields instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rt_type' for details). - # - A full RT string with colon seperator which will override the full RT. + # - A full RT string with colon separator which will override the full RT. rt_override: # By default the MAC VRF RD will be derived from mac_vrf_id_base + vlan_id. @@ -327,7 +347,7 @@ # # rd_override supports two formats: # - A single number which will be used in the RD assigned number field instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rd_type' for details). - # - A full RD string with colon seperator which will override the full RD. + # - A full RD string with colon separator which will override the full RD. rd_override: trunk_groups: @@ -346,8 +366,8 @@ mtu: bgp: - # Structured configuration and EOS CLI commands rendered on router_bgp.vlans.[id=] - # This configuration will not be applied to vlan aware bundles + # Structured configuration and EOS CLI commands rendered on router_bgp.vlans.[id=]. + # This configuration will not be applied to vlan aware bundles. structured_config: # EOS CLI rendered directly on the Router BGP, VLAN definition in the final EOS configuration. diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/system-settings.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/system-settings.md index 2ad927beaad..ac204eb11e1 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/system-settings.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/system-settings.md @@ -20,13 +20,13 @@ | [    - name](## ".nodes.[].name") | String | Required, Unique | | | The Node Name is used as "hostname". | | [      data_plane_cpu_allocation_max](## ".nodes.[].data_plane_cpu_allocation_max") | Integer | | | Min: 1
Max: 128 | Set the maximum number of CPU used for the data plane.
This setting is useful on virtual Route Reflectors and Pathfinders where more CPU cores should be allocated for control plane. | | [default_igmp_snooping_enabled](## "default_igmp_snooping_enabled") | Boolean | | `True` | | When set to false, disables IGMP snooping at fabric level and overrides per vlan settings.
| - | [default_interface_mtu](## "default_interface_mtu") | Integer | | | Min: 68
Max: 65535 | Default interface MTU configured on EOS under "interface defaults".
Can be overriden per platform under platform settings.
| + | [default_interface_mtu](## "default_interface_mtu") | Integer | | | Min: 68
Max: 65535 | Default interface MTU configured on EOS under "interface defaults".
Can be overridden per platform under platform settings.
| | [hardware_counters](## "hardware_counters") | Dictionary | | | | | - | [  features](## "hardware_counters.features") | List, items: Dictionary | | | | This data model allows to configure the list of hardware counters feature
available on Arista platforms.

The `name` key accepts a list of valid_values which MUST be updated to support
new feature as they are released in EOS.

The available values of the different keys like 'direction' or 'address_type'
are feature and hardware dependent and this model DOES NOT validate that the
combinations are valid. It is the responsability of the user of this data model
to make sure that the rendered CLI is accepted by the targeted device.

Examples:

* Use:
```yaml
hardware_counters:
features:
- name: ip
direction: out
layer3: true
units_packets: true
```

to render:
```eos
hardware counter feature ip out layer3 units packets
```
* Use:
```yaml
hardware_counters:
features:
- name: route
address_type: ipv4
vrf: test
prefix: 192.168.0.0/24
```

to render:
```eos
hardware counter feature route ipv4 vrf test 192.168.0.0/24
```
| - | [    - name](## "hardware_counters.features.[].name") | String | | | Valid Values:
- acl
- decap-group
- directflow
- ecn
- flow-spec
- gre tunnel interface
- ip
- mpls interface
- mpls lfib
- mpls tunnel
- multicast
- nexthop
- pbr
- pdp
- policing interface
- qos
- qos dual-rate-policer
- route
- routed-port
- subinterface
- tapagg
- traffic-class
- traffic-policy
- vlan
- vlan-interface
- vni decap
- vni encap
- vtep decap
- vtep encap | | + | [  features](## "hardware_counters.features") | List, items: Dictionary | | | | This data model allows to configure the list of hardware counters feature
available on Arista platforms.

The `name` key accepts a list of valid_values which MUST be updated to support
new feature as they are released in EOS.

The available values of the different keys like 'direction' or 'address_type'
are feature and hardware dependent and this model DOES NOT validate that the
combinations are valid. It is the responsibility of the user of this data model
to make sure that the rendered CLI is accepted by the targeted device.

Examples:

* Use:
```yaml
hardware_counters:
features:
- name: ip
direction: out
layer3: true
units_packets: true
```

to render:
```eos
hardware counter feature ip out layer3 units packets
```
* Use:
```yaml
hardware_counters:
features:
- name: route
address_type: ipv4
vrf: test
prefix: 192.168.0.0/24
```

to render:
```eos
hardware counter feature route ipv4 vrf test 192.168.0.0/24
```
| + | [    - name](## "hardware_counters.features.[].name") | String | | | Valid Values:
- acl
- decap-group
- directflow
- ecn
- flow-spec
- gre tunnel interface
- ip
- mpls interface
- mpls lfib
- mpls tunnel
- multicast
- nexthop
- pbr
- pdp
- policing interface
- qos
- qos dual-rate-policer
- route
- routed-port
- segment-security
- subinterface
- tapagg
- traffic-class
- traffic-policy
- vlan
- vlan-interface
- vni decap
- vni encap
- vtep decap
- vtep encap | | | [      direction](## "hardware_counters.features.[].direction") | String | | | Valid Values:
- in
- out
- cpu | Most features support only 'in' and 'out'. Some like traffic-policy support 'cpu'.
Some features DO NOT have any direction.
This validation IS NOT made by the schemas.
| | [      address_type](## "hardware_counters.features.[].address_type") | String | | | Valid Values:
- ipv4
- ipv6
- mac | Supported only for the following features:
- acl: [ipv4, ipv6, mac] if direction is 'out'
- multicast: [ipv4, ipv6]
- route: [ipv4, ipv6]
This validation IS NOT made by the schemas.
| - | [      layer3](## "hardware_counters.features.[].layer3") | Boolean | | | | Supported only for the 'ip' feature
| + | [      layer3](## "hardware_counters.features.[].layer3") | Boolean | | | | Supported only for the 'ip' feature.
| | [      vrf](## "hardware_counters.features.[].vrf") | String | | | | Supported only for the 'route' feature.
This validation IS NOT made by the schemas.
| | [      prefix](## "hardware_counters.features.[].prefix") | String | | | | Supported only for the 'route' feature.
Mandatory for the 'route' feature.
This validation IS NOT made by the schemas.
| | [      units_packets](## "hardware_counters.features.[].units_packets") | Boolean | | | | | @@ -43,12 +43,12 @@ | [  default_thresholds](## "queue_monitor_length.default_thresholds") | Dictionary | | | | | | [    high](## "queue_monitor_length.default_thresholds.high") | Integer | Required | | | Default high threshold for Ethernet Interfaces.
| | [    low](## "queue_monitor_length.default_thresholds.low") | Integer | | | | Default low threshold for Ethernet Interfaces.
Low threshold support is platform dependent.
| - | [  log](## "queue_monitor_length.log") | Integer | | | | Logging interval in seconds | + | [  log](## "queue_monitor_length.log") | Integer | | | | Logging interval in seconds. | | [  cpu](## "queue_monitor_length.cpu") | Dictionary | | | | | | [    thresholds](## "queue_monitor_length.cpu.thresholds") | Dictionary | | | | | | [      high](## "queue_monitor_length.cpu.thresholds.high") | Integer | Required | | | | | [      low](## "queue_monitor_length.cpu.thresholds.low") | Integer | | | | | - | [  tx_latency](## "queue_monitor_length.tx_latency") | Boolean | | | | Enable tx-latency mode | + | [  tx_latency](## "queue_monitor_length.tx_latency") | Boolean | | | | Enable tx-latency mode. | | [redundancy](## "redundancy") | Dictionary | | | | Redundancy for chassis platforms with dual supervisors | Optional. | | [  protocol](## "redundancy.protocol") | String | | | Valid Values:
- sso
- rpr | | | [serial_number](## "serial_number") | String | | | | Serial Number of the device.
Used for documentation purpose in the fabric documentation as can also be used by the 'eos_config_deploy_cvp' role.
"serial_number" can also be set directly under node type settings.
If both are set, the value under node type settings takes precedence.
| @@ -101,7 +101,7 @@ default_igmp_snooping_enabled: # Default interface MTU configured on EOS under "interface defaults". - # Can be overriden per platform under platform settings. + # Can be overridden per platform under platform settings. default_interface_mtu: hardware_counters: @@ -113,7 +113,7 @@ # # The available values of the different keys like 'direction' or 'address_type' # are feature and hardware dependent and this model DOES NOT validate that the - # combinations are valid. It is the responsability of the user of this data model + # combinations are valid. It is the responsibility of the user of this data model # to make sure that the rendered CLI is accepted by the targeted device. # # Examples: @@ -147,7 +147,7 @@ # hardware counter feature route ipv4 vrf test 192.168.0.0/24 # ``` features: - - name: + - name: # Most features support only 'in' and 'out'. Some like traffic-policy support 'cpu'. # Some features DO NOT have any direction. @@ -161,7 +161,7 @@ # This validation IS NOT made by the schemas. address_type: - # Supported only for the 'ip' feature + # Supported only for the 'ip' feature. layer3: # Supported only for the 'route' feature. @@ -207,14 +207,14 @@ # Low threshold support is platform dependent. low: - # Logging interval in seconds + # Logging interval in seconds. log: cpu: thresholds: high: low: - # Enable tx-latency mode + # Enable tx-latency mode. tx_latency: # Redundancy for chassis platforms with dual supervisors | Optional. diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/wan-cv-pathfinder-regions.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/wan-cv-pathfinder-regions.md index ea541fb910f..ae942b1ff5b 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/wan-cv-pathfinder-regions.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/wan-cv-pathfinder-regions.md @@ -7,28 +7,41 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | + | [cv_pathfinder_global_sites](## "cv_pathfinder_global_sites") | List, items: Dictionary | | | | Define sites that are outside of the CV Pathfinder hierarchy.
This is used to arrange pathfinders in the CloudVision topology layout. | + | [  - name](## "cv_pathfinder_global_sites.[].name") | String | Required, Unique | | | The site name. | + | [    description](## "cv_pathfinder_global_sites.[].description") | String | | | | | + | [    location](## "cv_pathfinder_global_sites.[].location") | String | | | | Location as a string is resolved on Cloudvision. | | [cv_pathfinder_regions](## "cv_pathfinder_regions") | List, items: Dictionary | | | | Define the CV Pathfinder hierarchy. | - | [  - name](## "cv_pathfinder_regions.[].name") | String | Required, Unique | | | The region name. | + | [  - name](## "cv_pathfinder_regions.[].name") | String | Required, Unique | | Min Length: 1
Max Length: 128
Pattern: ^[A-Za-z0-9_.:{}\[\]-]+$ | | | [    description](## "cv_pathfinder_regions.[].description") | String | | | | | | [    id](## "cv_pathfinder_regions.[].id") | Integer | Required | | Min: 1
Max: 255 | The region ID must be unique for the whole WAN deployment. | | [    sites](## "cv_pathfinder_regions.[].sites") | List, items: Dictionary | | | | All sites are placed in a default zone "-ZONE" with ID 1. | - | [      - name](## "cv_pathfinder_regions.[].sites.[].name") | String | Required, Unique | | | The site name. | + | [      - name](## "cv_pathfinder_regions.[].sites.[].name") | String | Required, Unique | | Min Length: 1
Max Length: 128
Pattern: ^[A-Za-z0-9_.:{}\[\]-]+$ | The site name. | | [        description](## "cv_pathfinder_regions.[].sites.[].description") | String | | | | | | [        id](## "cv_pathfinder_regions.[].sites.[].id") | Integer | Required | | Min: 1
Max: 10000 | The site ID must be unique within a zone.
Given that all the sites are placed in a zone named after the region, the site ID must be unique within a region. | - | [        location](## "cv_pathfinder_regions.[].sites.[].location") | String | | | | Location as a sring is resolved on Cloudvision. | + | [        location](## "cv_pathfinder_regions.[].sites.[].location") | String | | | | Location as a string is resolved on Cloudvision. | | [        site_contact](## "cv_pathfinder_regions.[].sites.[].site_contact") | String | | | | | | [        site_after_hours_contact](## "cv_pathfinder_regions.[].sites.[].site_after_hours_contact") | String | | | | | === "YAML" ```yaml - # Define the CV Pathfinder hierarchy. - cv_pathfinder_regions: + # Define sites that are outside of the CV Pathfinder hierarchy. + # This is used to arrange pathfinders in the CloudVision topology layout. + cv_pathfinder_global_sites: - # The region name. + # The site name. - name: description: + # Location as a string is resolved on Cloudvision. + location: + + # Define the CV Pathfinder hierarchy. + cv_pathfinder_regions: + - name: + description: + # The region ID must be unique for the whole WAN deployment. id: @@ -36,14 +49,14 @@ sites: # The site name. - - name: + - name: description: # The site ID must be unique within a zone. # Given that all the sites are placed in a zone named after the region, the site ID must be unique within a region. id: - # Location as a sring is resolved on Cloudvision. + # Location as a string is resolved on Cloudvision. location: site_contact: site_after_hours_contact: diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/wan-cv-pathfinder-zscaler-integration.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/wan-cv-pathfinder-zscaler-integration.md new file mode 100644 index 00000000000..4f6a8a21e36 --- /dev/null +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/wan-cv-pathfinder-zscaler-integration.md @@ -0,0 +1,31 @@ + +=== "Table" + + | Variable | Type | Required | Default | Value Restrictions | Description | + | -------- | ---- | -------- | ------- | ------------------ | ----------- | + | [cv_server](## "cv_server") | String | | | | PREVIEW: These keys are in preview mode.

Hostname or IP address of CloudVision host. Ex. "www.arista.io" for CVaaS.
For `eos_designs` this variable is only used for the WAN Internet-exit integration with Zscaler.
The same variable name is also used by the `cv_deploy` role, and will override the value of `ansible_host` on inventory 'cloudvision' host.
Make sure to set it in a common group_vars file. | + | [cv_token](## "cv_token") | String | | | | PREVIEW: These keys are in preview mode.

Service account token as defined on CloudVision. This value should be using Ansible Vault.
For `eos_designs` this variable is only used for the WAN Internet-exit integration with Zscaler.
The same variable name is also used by the `cv_deploy` role, and will override the value of `ansible_password` on inventory 'cloudvision' host.
Make sure to set it in a common group_vars file. | + +=== "YAML" + + ```yaml + # PREVIEW: These keys are in preview mode. + # + # Hostname or IP address of CloudVision host. Ex. "www.arista.io" for CVaaS. + # For `eos_designs` this variable is only used for the WAN Internet-exit integration with Zscaler. + # The same variable name is also used by the `cv_deploy` role, and will override the value of `ansible_host` on inventory 'cloudvision' host. + # Make sure to set it in a common group_vars file. + cv_server: + + # PREVIEW: These keys are in preview mode. + # + # Service account token as defined on CloudVision. This value should be using Ansible Vault. + # For `eos_designs` this variable is only used for the WAN Internet-exit integration with Zscaler. + # The same variable name is also used by the `cv_deploy` role, and will override the value of `ansible_password` on inventory 'cloudvision' host. + # Make sure to set it in a common group_vars file. + cv_token: + ``` diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/wan-path-groups-and-carriers.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/wan-path-groups-and-carriers.md index e2b21fdda07..2be528225ff 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/wan-path-groups-and-carriers.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/wan-path-groups-and-carriers.md @@ -25,7 +25,7 @@ | [    default_preference](## "wan_path_groups.[].default_preference") | String | | `preferred` | | Preference value used when a preference is not given for a path-group in the `wan_virtual_topologies.policies` input or when
the path-group is used in an auto generated policy except if `excluded_from_default_policy` is set to `true.

Valid values are 1-65535 | "preferred" | "alternate".

`preferred` is converted to priority 1.
`alternate` is converted to priority 2. | | [    excluded_from_default_policy](## "wan_path_groups.[].excluded_from_default_policy") | Boolean | | `False` | | When set to `true`, the path-group is excluded from AVD auto generated policies. | | [    dps_keepalive](## "wan_path_groups.[].dps_keepalive") | Dictionary | | | | Period between the transmission of consecutive keepalive messages, and failure threshold. | - | [      interval](## "wan_path_groups.[].dps_keepalive.interval") | String | | | | Interval in milliseconds. Valid values are 50-60000 | "auto"

When auto, the interval and failure_threshold are automatically determined based on
path state. | + | [      interval](## "wan_path_groups.[].dps_keepalive.interval") | String | | | | Interval in milliseconds. Valid values are 50-60000 | "auto".

When auto, the interval and failure_threshold are automatically determined based on
path state. | | [      failure_threshold](## "wan_path_groups.[].dps_keepalive.failure_threshold") | Integer | | `5` | Min: 2
Max: 100 | Failure threshold in number of lost keep-alive messages. | === "YAML" @@ -93,7 +93,7 @@ # Period between the transmission of consecutive keepalive messages, and failure threshold. dps_keepalive: - # Interval in milliseconds. Valid values are 50-60000 | "auto" + # Interval in milliseconds. Valid values are 50-60000 | "auto". # # When auto, the interval and failure_threshold are automatically determined based on # path state. diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/wan-settings.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/wan-settings.md index f65781a33b0..854b4be0c49 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/wan-settings.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/wan-settings.md @@ -7,7 +7,7 @@ | Variable | Type | Required | Default | Value Restrictions | Description | | -------- | ---- | -------- | ------- | ------------------ | ----------- | - | [wan_ha](## "wan_ha") | Dictionary | | | | PREVIEW: The `wan_ha` key is currently not supported | + | [wan_ha](## "wan_ha") | Dictionary | | | | PREVIEW: The `wan_ha` key is currently not supported. | | [  lan_ha_path_group_name](## "wan_ha.lan_ha_path_group_name") | String | | `LAN_HA` | | When WAN HA is enabled for a site if `wan_mode: cv-pathfinder`, a default path-group is injected to form DPS tunnels over LAN.
This key allows to overwrite the default LAN HA path-group name. | | [wan_ipsec_profiles](## "wan_ipsec_profiles") | Dictionary | | | | Define IPsec profiles parameters for WAN configuration. | | [  control_plane](## "wan_ipsec_profiles.control_plane") | Dictionary | Required | | | | @@ -27,7 +27,7 @@ === "YAML" ```yaml - # PREVIEW: The `wan_ha` key is currently not supported + # PREVIEW: The `wan_ha` key is currently not supported. wan_ha: # When WAN HA is enabled for a site if `wan_mode: cv-pathfinder`, a default path-group is injected to form DPS tunnels over LAN. diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/wan-virtual-topologies.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/wan-virtual-topologies.md index a4dc276cdb9..1acdf9d58ab 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/wan-virtual-topologies.md +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/wan-virtual-topologies.md @@ -26,6 +26,8 @@ | [      - names](## "wan_virtual_topologies.control_plane_virtual_topology.path_groups.[].names") | List, items: String | Required | | Min Length: 1 | List of path-group names. | | [          - <str>](## "wan_virtual_topologies.control_plane_virtual_topology.path_groups.[].names.[]") | String | | | | | | [        preference](## "wan_virtual_topologies.control_plane_virtual_topology.path_groups.[].preference") | String | | | | Valid values are 1-65535 | "preferred" | "alternate".

"preferred" is converted to priority 1.
"alternate" is converted to priority 2.

If not set, each path-group in `names` will be attributed its `default_preference`. | + | [    internet_exit](## "wan_virtual_topologies.control_plane_virtual_topology.internet_exit") | Dictionary | | | | | + | [      policy](## "wan_virtual_topologies.control_plane_virtual_topology.internet_exit.policy") | String | | | | PREVIEW: This key is in preview mode.

Internet-exit policy name associated with this virtual_topology.
The policy must be defined under `cv_pathfinder_internet_exit_policies`. | | [  policies](## "wan_virtual_topologies.policies") | List, items: Dictionary | | | | List of virtual toplogies policies.

For AutoVPN, each item in the list creates:
* one policy with:
* one `match` entry per `application_virtual_topologies` item
they are indexed using `10 * ` where `list_index` starts at `1`.
* one `default-match`
* one load-balance policy per `application_virtual_topologies` and one for the `default_virtual_topology`.
* if the policy is associated with the default VRF, a special control-plane rule is injected
in the policy with index `1` referring to a control-plane load-balance policy as defined under
`control_plane_virtual_topology` or if not set, the default one.

For CV Pathfinder, each item in the list creates:
* one policy with:
* one `match` entry per `application_virtual_topologies` item ordered as in the data.
* one last match entry for the `default` application-profile using `default_virtual_topology` information.
* one profile per `application_virtual_topologies` item.
* one profile for the `default_virtual_topology`.
* one load-balance policy per `application_virtual_topologies`.
* one load_balance policy for the `default_virtual_topology`.
* if the policy is associated with the default VRF, a special control-plane profile is configured
and injected first in the policy assigned to the `default` VRF. This profile points to a
control-plane load-balance policy as defined under `control_plane_virtual_topology` or if not set, the default one. | | [    - name](## "wan_virtual_topologies.policies.[].name") | String | Required, Unique | | | Name of the AVT policy. | | [      application_virtual_topologies](## "wan_virtual_topologies.policies.[].application_virtual_topologies") | List, items: Dictionary | | | | List of application specific virtual topologies. | @@ -43,6 +45,8 @@ | [            - names](## "wan_virtual_topologies.policies.[].application_virtual_topologies.[].path_groups.[].names") | List, items: String | Required | | Min Length: 1 | List of path-group names. | | [                - <str>](## "wan_virtual_topologies.policies.[].application_virtual_topologies.[].path_groups.[].names.[]") | String | | | | | | [              preference](## "wan_virtual_topologies.policies.[].application_virtual_topologies.[].path_groups.[].preference") | String | | | | Valid values are 1-65535 | "preferred" | "alternate".

"preferred" is converted to priority 1.
"alternate" is converted to priority 2.

If not set, each path-group in `names` will be attributed its `default_preference`. | + | [          internet_exit](## "wan_virtual_topologies.policies.[].application_virtual_topologies.[].internet_exit") | Dictionary | | | | | + | [            policy](## "wan_virtual_topologies.policies.[].application_virtual_topologies.[].internet_exit.policy") | String | | | | PREVIEW: This key is in preview mode.

Internet-exit policy name associated with this virtual_topology.
The policy must be defined under `cv_pathfinder_internet_exit_policies`. | | [      default_virtual_topology](## "wan_virtual_topologies.policies.[].default_virtual_topology") | Dictionary | Required | | | Default match for the policy.
If no default match should be configured, set `drop_unmatched` to `true`.
Otherwise, in CV Pathfinder mode, a default AVT profile will be configured with ID 1. | | [        name](## "wan_virtual_topologies.policies.[].default_virtual_topology.name") | String | | | | Optional name, if not set `-DEFAULT` is used. | | [        drop_unmatched](## "wan_virtual_topologies.policies.[].default_virtual_topology.drop_unmatched") | Boolean | | `False` | | When set, no `catch-all` match is configured for the policy and unmatched traffic is dropped. | @@ -57,6 +61,8 @@ | [          - names](## "wan_virtual_topologies.policies.[].default_virtual_topology.path_groups.[].names") | List, items: String | Required | | Min Length: 1 | List of path-group names. | | [              - <str>](## "wan_virtual_topologies.policies.[].default_virtual_topology.path_groups.[].names.[]") | String | | | | | | [            preference](## "wan_virtual_topologies.policies.[].default_virtual_topology.path_groups.[].preference") | String | | | | Valid values are 1-65535 | "preferred" | "alternate".

"preferred" is converted to priority 1.
"alternate" is converted to priority 2.

If not set, each path-group in `names` will be attributed its `default_preference`. | + | [        internet_exit](## "wan_virtual_topologies.policies.[].default_virtual_topology.internet_exit") | Dictionary | | | | | + | [          policy](## "wan_virtual_topologies.policies.[].default_virtual_topology.internet_exit.policy") | String | | | | PREVIEW: This key is in preview mode.

Internet-exit policy name associated with this virtual_topology.
The policy must be defined under `cv_pathfinder_internet_exit_policies`. | === "YAML" @@ -138,6 +144,13 @@ # # If not set, each path-group in `names` will be attributed its `default_preference`. preference: + internet_exit: + + # PREVIEW: This key is in preview mode. + # + # Internet-exit policy name associated with this virtual_topology. + # The policy must be defined under `cv_pathfinder_internet_exit_policies`. + policy: # List of virtual toplogies policies. # @@ -216,6 +229,13 @@ # # If not set, each path-group in `names` will be attributed its `default_preference`. preference: + internet_exit: + + # PREVIEW: This key is in preview mode. + # + # Internet-exit policy name associated with this virtual_topology. + # The policy must be defined under `cv_pathfinder_internet_exit_policies`. + policy: # Default match for the policy. # If no default match should be configured, set `drop_unmatched` to `true`. @@ -261,4 +281,11 @@ # # If not set, each path-group in `names` will be attributed its `default_preference`. preference: + internet_exit: + + # PREVIEW: This key is in preview mode. + # + # Internet-exit policy name associated with this virtual_topology. + # The policy must be defined under `cv_pathfinder_internet_exit_policies`. + policy: ``` diff --git a/ansible_collections/arista/avd/roles/eos_designs/docs/tables/zscaler-endpoints.md b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/zscaler-endpoints.md new file mode 100644 index 00000000000..58e33fa55ca --- /dev/null +++ b/ansible_collections/arista/avd/roles/eos_designs/docs/tables/zscaler-endpoints.md @@ -0,0 +1,76 @@ + +=== "Table" + + | Variable | Type | Required | Default | Value Restrictions | Description | + | -------- | ---- | -------- | ------- | ------------------ | ----------- | + | [zscaler_endpoints](## "zscaler_endpoints") | Dictionary | | | | PREVIEW: These keys are in preview mode.

Special data model used for testing the WAN internet-exit integration with Zscaler.
The model is supposed to be autofilled per-device by `eos_designs`.
Manually setting this model will take precedence and prevent `eos_designs` from trying to contact CloudVision.
This can be useful for offline testing or if CloudVision is not available or not configured for Zscaler integration. | + | [  primary](## "zscaler_endpoints.primary") | Dictionary | Required | | | | + | [    ip_address](## "zscaler_endpoints.primary.ip_address") | String | Required | | | | + | [    datacenter](## "zscaler_endpoints.primary.datacenter") | String | Required | | | | + | [    city](## "zscaler_endpoints.primary.city") | String | Required | | | | + | [    country](## "zscaler_endpoints.primary.country") | String | Required | | | | + | [    latitude](## "zscaler_endpoints.primary.latitude") | String | Required | | | | + | [    longitude](## "zscaler_endpoints.primary.longitude") | String | Required | | | | + | [  secondary](## "zscaler_endpoints.secondary") | Dictionary | | | | | + | [    ip_address](## "zscaler_endpoints.secondary.ip_address") | String | Required | | | | + | [    datacenter](## "zscaler_endpoints.secondary.datacenter") | String | Required | | | | + | [    city](## "zscaler_endpoints.secondary.city") | String | Required | | | | + | [    country](## "zscaler_endpoints.secondary.country") | String | Required | | | | + | [    latitude](## "zscaler_endpoints.secondary.latitude") | String | Required | | | | + | [    longitude](## "zscaler_endpoints.secondary.longitude") | String | Required | | | | + | [  tertiary](## "zscaler_endpoints.tertiary") | Dictionary | | | | | + | [    ip_address](## "zscaler_endpoints.tertiary.ip_address") | String | Required | | | | + | [    datacenter](## "zscaler_endpoints.tertiary.datacenter") | String | Required | | | | + | [    city](## "zscaler_endpoints.tertiary.city") | String | Required | | | | + | [    country](## "zscaler_endpoints.tertiary.country") | String | Required | | | | + | [    latitude](## "zscaler_endpoints.tertiary.latitude") | String | Required | | | | + | [    longitude](## "zscaler_endpoints.tertiary.longitude") | String | Required | | | | + | [  cloud_name](## "zscaler_endpoints.cloud_name") | String | Required | | | The name of the Zscaler cloud the CloudVision cluster is integrated with like 'zscaler1' or 'zscalerbeta'. | + | [  device_location](## "zscaler_endpoints.device_location") | Dictionary | Required | | | The location of the calling device after being resolved by Zscaler location APIs. This is required since Zscaler only accepts their own variants of City and Country. | + | [    city](## "zscaler_endpoints.device_location.city") | String | Required | | | | + | [    country](## "zscaler_endpoints.device_location.country") | String | Required | | | | + +=== "YAML" + + ```yaml + # PREVIEW: These keys are in preview mode. + # + # Special data model used for testing the WAN internet-exit integration with Zscaler. + # The model is supposed to be autofilled per-device by `eos_designs`. + # Manually setting this model will take precedence and prevent `eos_designs` from trying to contact CloudVision. + # This can be useful for offline testing or if CloudVision is not available or not configured for Zscaler integration. + zscaler_endpoints: + primary: # required + ip_address: + datacenter: + city: + country: + latitude: + longitude: + secondary: + ip_address: + datacenter: + city: + country: + latitude: + longitude: + tertiary: + ip_address: + datacenter: + city: + country: + latitude: + longitude: + + # The name of the Zscaler cloud the CloudVision cluster is integrated with like 'zscaler1' or 'zscalerbeta'. + cloud_name: + + # The location of the calling device after being resolved by Zscaler location APIs. This is required since Zscaler only accepts their own variants of City and Country. + device_location: # required + city: + country: + ``` diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/MOVED_TO_PYAVD.txt b/ansible_collections/arista/avd/roles/eos_designs/python_modules/MOVED_TO_PYAVD.txt new file mode 100644 index 00000000000..b48ae49ac62 --- /dev/null +++ b/ansible_collections/arista/avd/roles/eos_designs/python_modules/MOVED_TO_PYAVD.txt @@ -0,0 +1 @@ +All Python modules have been moved to PyAVD in the folder /python-avd/pyavd/_eos_designs/structured_config/ diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/base/__init__.py b/ansible_collections/arista/avd/roles/eos_designs/python_modules/base/__init__.py deleted file mode 100644 index c1beaa89fa8..00000000000 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/base/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -from .avdstructuredconfig import AvdStructuredConfigBase - -__all__ = ["AvdStructuredConfigBase"] diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/connected_endpoints/__init__.py b/ansible_collections/arista/avd/roles/eos_designs/python_modules/connected_endpoints/__init__.py deleted file mode 100644 index 22bb3e5f9de..00000000000 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/connected_endpoints/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -from .avdstructuredconfig import AvdStructuredConfigConnectedEndpoints - -__all__ = ["AvdStructuredConfigConnectedEndpoints"] diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/core_interfaces_and_l3_edge/__init__.py b/ansible_collections/arista/avd/roles/eos_designs/python_modules/core_interfaces_and_l3_edge/__init__.py deleted file mode 100644 index 78376b19054..00000000000 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/core_interfaces_and_l3_edge/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -from .avdstructuredconfig import AvdStructuredConfigCoreInterfacesAndL3Edge - -__all__ = ["AvdStructuredConfigCoreInterfacesAndL3Edge"] diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/custom_structured_configuration/__init__.py b/ansible_collections/arista/avd/roles/eos_designs/python_modules/custom_structured_configuration/__init__.py deleted file mode 100644 index cac30e1c99a..00000000000 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/custom_structured_configuration/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -from .avdstructuredconfig import AvdStructuredConfigCustomStructuredConfiguration - -__all__ = ["AvdStructuredConfigCustomStructuredConfiguration"] diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/flows/__init__.py b/ansible_collections/arista/avd/roles/eos_designs/python_modules/flows/__init__.py deleted file mode 100644 index 25ad0425934..00000000000 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/flows/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -from .avdstructuredconfig import AvdStructuredConfigFlows - -__all__ = ["AvdStructuredConfigFlows"] diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/get_structured_config/__init__.py b/ansible_collections/arista/avd/roles/eos_designs/python_modules/get_structured_config/__init__.py deleted file mode 100644 index b30b27207fa..00000000000 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/get_structured_config/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -from .get_structured_config import get_structured_config - -__all__ = ["get_structured_config"] diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/inband_management/__init__.py b/ansible_collections/arista/avd/roles/eos_designs/python_modules/inband_management/__init__.py deleted file mode 100644 index 742da52c029..00000000000 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/inband_management/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -from .avdstructuredconfig import AvdStructuredConfigInbandManagement - -__all__ = ["AvdStructuredConfigInbandManagement"] diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/interface_descriptions/__init__.py b/ansible_collections/arista/avd/roles/eos_designs/python_modules/interface_descriptions/__init__.py index ae34148fc1d..360d52c3978 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/interface_descriptions/__init__.py +++ b/ansible_collections/arista/avd/roles/eos_designs/python_modules/interface_descriptions/__init__.py @@ -1,7 +1,20 @@ # Copyright (c) 2023-2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. -from .avdinterfacedescriptions import AvdInterfaceDescriptions -from .models import InterfaceDescriptionData +from ansible.errors import AnsibleActionFail + +from ansible_collections.arista.avd.plugins.plugin_utils.pyavd_wrappers import RaiseOnUse + +try: + from pyavd._eos_designs.interface_descriptions import AvdInterfaceDescriptions + from pyavd._eos_designs.interface_descriptions.models import InterfaceDescriptionData +except ImportError as e: + AvdInterfaceDescriptions = InterfaceDescriptionData = RaiseOnUse( + AnsibleActionFail( + "The 'arista.avd.eos_designs' collection requires the 'pyavd' Python library. Got import error", + orig_exc=e, + ) + ) + __all__ = ["AvdInterfaceDescriptions", "InterfaceDescriptionData"] diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/ip_addressing/__init__.py b/ansible_collections/arista/avd/roles/eos_designs/python_modules/ip_addressing/__init__.py index 60387bb6cf5..36dee1d7bcd 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/ip_addressing/__init__.py +++ b/ansible_collections/arista/avd/roles/eos_designs/python_modules/ip_addressing/__init__.py @@ -1,6 +1,19 @@ # Copyright (c) 2023-2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. -from .avdipaddressing import AvdIpAddressing +from ansible.errors import AnsibleActionFail + +from ansible_collections.arista.avd.plugins.plugin_utils.pyavd_wrappers import RaiseOnUse + +try: + from pyavd._eos_designs.ip_addressing import AvdIpAddressing +except ImportError as e: + AvdIpAddressing = RaiseOnUse( + AnsibleActionFail( + "The 'arista.avd.eos_designs' collection requires the 'pyavd' Python library. Got import error", + orig_exc=e, + ) + ) + __all__ = ["AvdIpAddressing"] diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/metadata/__init__.py b/ansible_collections/arista/avd/roles/eos_designs/python_modules/metadata/__init__.py deleted file mode 100644 index 2b901c71692..00000000000 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/metadata/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -from .avdstructuredconfig import AvdStructuredConfigMetadata - -__all__ = ["AvdStructuredConfigMetadata"] diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/mlag/__init__.py b/ansible_collections/arista/avd/roles/eos_designs/python_modules/mlag/__init__.py deleted file mode 100644 index 1ba0488ce1e..00000000000 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/mlag/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -from .avdstructuredconfig import AvdStructuredConfigMlag - -__all__ = ["AvdStructuredConfigMlag"] diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/__init__.py b/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/__init__.py deleted file mode 100644 index 518d60dbb70..00000000000 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -from .avdstructuredconfig import AvdStructuredConfigNetworkServices - -__all__ = ["AvdStructuredConfigNetworkServices"] diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/__init__.py b/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/__init__.py deleted file mode 100644 index 2019fdfa5c5..00000000000 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -from .avdstructuredconfig import AvdStructuredConfigOverlay - -__all__ = ["AvdStructuredConfigOverlay"] diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/flow_tracking.py b/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/flow_tracking.py deleted file mode 100644 index 4ff62dfaffc..00000000000 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/flow_tracking.py +++ /dev/null @@ -1,46 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -from __future__ import annotations - -from functools import cached_property - -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get - -from .utils import UtilsMixin - - -class FlowTrackingMixin(UtilsMixin): - """ - Mixin Class used to generate structured config for one key. - Class should only be used as Mixin to a AvdStructuredConfig class - """ - - @cached_property - def flow_tracking(self) -> dict | None: - """ - Return structured config for flow_tracking - """ - if not self.shared_utils.is_cv_pathfinder_router: - return None - - flow_tracking = get(self._hostvars, "flow_tracking_settings", default={}) - exporter_name = get(flow_tracking, "exporter.name", default="CV-TELEMETRY") - template_interval = get(flow_tracking, "exporter.template_interval", default=3600000) - on_inactive_timeout = get(flow_tracking, "record_export.on_inactive_timeout", default=70000) - on_interval = get(flow_tracking, "record_export.on_interval", default=300000) - - return { - "hardware": { - "trackers": [ - { - "name": self.shared_utils.wan_flow_tracker_name, - "record_export": {"on_inactive_timeout": on_inactive_timeout, "on_interval": on_interval}, - "exporters": [ - {"name": exporter_name, "collector": {"host": "127.0.0.1"}, "local_interface": "Loopback0", "template_interval": template_interval} - ], - } - ], - "shutdown": False, - }, - } diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/__init__.py b/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/__init__.py deleted file mode 100644 index db7257ea459..00000000000 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -from .avdstructuredconfig import AvdStructuredConfigUnderlay - -__all__ = ["AvdStructuredConfigUnderlay"] diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/MOVED_TO_PYAVD.txt b/ansible_collections/arista/avd/roles/eos_designs/schemas/MOVED_TO_PYAVD.txt new file mode 100644 index 00000000000..8e5ddf0312f --- /dev/null +++ b/ansible_collections/arista/avd/roles/eos_designs/schemas/MOVED_TO_PYAVD.txt @@ -0,0 +1 @@ +The schemas have been moved to PyAVD in the folder /python-avd/pyavd/_eos_designs/schema/ diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/flow_tracking_settings.schema.yml b/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/flow_tracking_settings.schema.yml deleted file mode 100644 index a1a6a2aa2e3..00000000000 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/flow_tracking_settings.schema.yml +++ /dev/null @@ -1,53 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -# yaml-language-server: $schema=../../../../plugins/plugin_utils/schema/avd_meta_schema.json -# Line above is used by RedHat's YAML Schema vscode extension -# Use Ctrl + Space to get suggestions for every field. Autocomplete will pop up after typing 2 letters. -type: dict -keys: - flow_tracking_settings: - description: |- - PREVIEW: This key is currently not supported - - Define the flow tracking parameters for this topology. - type: dict - keys: - flow_tracker_name: - type: str - default: FLOW-TRACKER - description: Flow Tracker Name. - record_export: - type: dict - keys: - on_inactive_timeout: - description: Flow record inactive export timeout in milliseconds. - type: int - convert_types: - - str - min: 3000 - max: 900000 - default: 70000 - on_interval: - type: int - convert_types: - - str - min: 1000 - max: 36000000 - default: 300000 - description: Flow record export interval in milliseconds. - exporter: - type: dict - keys: - name: - type: str - default: CV-TELEMETRY - description: Exporter Name. - template_interval: - description: Template interval in milliseconds. - type: int - convert_types: - - str - min: 5000 - max: 3600000 - default: 3600000 diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/ipv4_prefix_lists.schema.yml b/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/ipv4_prefix_lists.schema.yml new file mode 100644 index 00000000000..9e12e333d9f --- /dev/null +++ b/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/ipv4_prefix_lists.schema.yml @@ -0,0 +1,41 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +# yaml-language-server: $schema=../../../../plugins/plugin_utils/schema/avd_meta_schema.json +# Line above is used by RedHat's YAML Schema vscode extension +# Use Ctrl + Space to get suggestions for every field. Autocomplete will pop up after typing 2 letters. +type: dict +keys: + ipv4_prefix_list_catalog: + type: list + primary_key: name + description: IPv4 prefix-list catalog. + convert_types: + - dict + items: + type: dict + keys: + name: + type: str + description: Prefix-list Name. + sequence_numbers: + type: list + primary_key: sequence + required: true + convert_types: + - dict + items: + type: dict + keys: + sequence: + type: int + required: true + description: Sequence ID. + convert_types: + - str + action: + type: str + required: true + description: |- + Action as string. + Example: "permit 10.255.0.0/27 eq 32" diff --git a/ansible_collections/arista/avd/roles/eos_snapshot/README.md b/ansible_collections/arista/avd/roles/eos_snapshot/README.md index 7299f04a06a..7a5387089ec 100644 --- a/ansible_collections/arista/avd/roles/eos_snapshot/README.md +++ b/ansible_collections/arista/avd/roles/eos_snapshot/README.md @@ -74,7 +74,7 @@ commands_list: ## Requirements -Requirements are located here: [avd-requirements](../../README.md#Requirements) +Requirements are located here: [avd-requirements](../../docs/installation/collection-installation.md#additional-python-libraries-required) ## Example Playbook diff --git a/ansible_collections/arista/avd/roles/eos_validate_state/README.md b/ansible_collections/arista/avd/roles/eos_validate_state/README.md index a891e464ca4..8801dd66409 100644 --- a/ansible_collections/arista/avd/roles/eos_validate_state/README.md +++ b/ansible_collections/arista/avd/roles/eos_validate_state/README.md @@ -73,7 +73,7 @@ Figure 1 below provides a visualization of the role's inputs, outputs, and tasks The following default variables are defined and can be modified as desired: ```yaml -# configure playbook to ingnore errors and continue testing. +# configure playbook to ignore errors and continue testing. eos_validate_state_validation_mode_loose: true # Format for path to r/w reports. Sync with default values configured in arista.avd.build_output_folders @@ -124,7 +124,7 @@ The variable validation_role.only_failed_tests is used to limit the number of te ## Requirements -Requirements are located here: [avd-requirements](../../README.md#Requirements) +Requirements are located here: [avd-requirements](../../docs/installation/collection-installation.md#additional-python-libraries-required) ## Example Playbook diff --git a/ansible_collections/arista/avd/roles/eos_validate_state/ANTA-Preview.md b/ansible_collections/arista/avd/roles/eos_validate_state/anta_integration.md similarity index 54% rename from ansible_collections/arista/avd/roles/eos_validate_state/ANTA-Preview.md rename to ansible_collections/arista/avd/roles/eos_validate_state/anta_integration.md index ef66eca59d0..cc48076bafe 100644 --- a/ansible_collections/arista/avd/roles/eos_validate_state/ANTA-Preview.md +++ b/ansible_collections/arista/avd/roles/eos_validate_state/anta_integration.md @@ -1,6 +1,6 @@ --- # This title is used for search results -title: Ansible Collection Role eos_validate_state - Preview Integration with ANTA +title: Ansible Collection Role eos_validate_state - Integration with ANTA --- -# eos_validate_state - Preview Integration with ANTA +# eos_validate_state - Integration with ANTA -!!! warning - eos_validate_state integration with ANTA is in preview. Everything is subject to change. - If you have any questions, please leverage the GitHub [discussions board](https://github.com/aristanetworks/avd/discussions) - -!!! warning - ANTA version has been bumped to **0.13.0**. Please make sure you are running this exact version! For more details, please see the [installation section](#how-to-run-eos_validate_state-in-anta-mode). +!!! note + [ANTA](https://anta.arista.com/stable/) will be the future default framework leveraged by AVD for network testing and validation. Since it introduces small [breaking changes](#breaking-changes), you have to opt-in to leverage ANTA with `eos_validate_state` by configuring: `use_anta: true`. # Overview @@ -28,27 +24,30 @@ title: Ansible Collection Role eos_validate_state - Preview Integration with ANT - Compares the actual states against the desired state. - Generates CSV and Markdown reports of the results. -## Known limitations +## Breaking changes - Loose mode to ignore playbook errors is no longer supported in ANTA mode. - ANTA mode exclusively supports the newer "list-of-dicts" data models in the structured configuration file input. For further details, consult the AVD 4.x.x [porting guides](https://avd.sh/en/stable/docs/porting-guides/4.x.x.html#data-model-changes-from-dict-of-dicts-to-list-of-dicts). +- Inputs for hardware tests have been updated. See [Input variables](#input-variables) below. +- Changes to CSV and Markdown reports: + - Hardware tests are now collapsed. + - Sorting of test results is now done per device as opposed to per category. + - Test categories, descriptions and inputs have been improved to follow ANTA. + - CSV report headers updated from `test_id,node,test_category,test_description,test,result,failure_reason` to `id,dut,categories,test,description,inputs,result,messages` ## Roadmap !!! note Subject to change. No commitments implied. -- Add more tests generated from the structured configuration +- Add more ANTA tests generated from the structured configuration !!! tip - You can now provide your own custom ANTA catalogs to the AVD `eos_validate_state` role! Please refer to the [Custom ANTA catalog](#custom-anta-catalog) section for more details. + You can provide your own custom ANTA catalogs using any of the available [ANTA tests](https://anta.arista.com/stable/api/tests/) to the AVD `eos_validate_state` role. Please refer to the [Custom ANTA catalog](#custom-anta-catalog) section for more details. ## Expected changes - You should expect faster execution, and if not please report on the GitHub [discussions board](https://github.com/aristanetworks/avd/discussions) -- Hardware tests are now collapsed. -- Some description of tests have been updated to be more precise. -- Sorting of the test results is now done per device as opposed to per category. - Tests skipped by ANTA will be marked as `SKIPPED` in the final reports. - All tests will be removed from the catalog for a device flagged as undeployed using the host level variable [`is_deployed: false`](https://avd.sh/en/stable/roles/eos_designs/docs/input-variables.html#flagging-a-device-as-not-deployed). Additionally, all tests take into account the `is_deployed` variable value and remove tests accordingly. @@ -64,13 +63,7 @@ title: Ansible Collection Role eos_validate_state - Preview Integration with ANT ## How to run eos_validate_state in ANTA mode -- Install the "anta" Python package (this is *not* part of the `requirements.txt`): - - ```shell - pip3 install ' - --8<-- "roles/eos_validate_state/preview_requirements.txt:4:4" - ' - ``` +- The "anta" Python package is now part of the `requirements.txt` file. Please refer to the [AVD Additional Python Libraries required](https://avd.sh/en/stable/docs/installation/collection-installation.html#required-python-libraries) section to proceed. - Run eos_validate_state playbook by setting the variable `use_anta=true`. @@ -98,9 +91,9 @@ title: Ansible Collection Role eos_validate_state - Preview Integration with ANT ``` !!! info - ANTA mode also supports other functionnalities. For more details, please refer to the [input variables](#input-variables) below. + ANTA mode also supports other functionalities. For more details, please refer to the [input variables](#input-variables) below. -## Test Categories +## Test categories !!! note New tests are marked with the (New) string. @@ -148,89 +141,103 @@ title: Ansible Collection Role eos_validate_state - Preview Integration with ANT - AvdTestReloadCause (Ansible tags: `reload_cause`, `optional`, `never`) - VerifyReloadCause: Validate last reload cause. (Optional) -- (New) AvdTestAPIHttpsSSL (No Ansible tags, use the new `skipped_tests` variable instead) +- (New) AvdTestAPIHttpsSSL (No Ansible tags, use the new `skip_tests` variable instead) - VerifyAPIHttpsSSL: Validate eAPI HTTPS SSL profile status. -## Input variables - -```yaml -# Root directory -root_dir: "{{ inventory_dir }}" - -# AVD configurations output -# Main output directory -output_dir_name: "intended" -output_dir: "{{ root_dir }}/{{ output_dir_name }}" - -# Output for test catalog YAML files if save_catalog is set to true -test_catalogs_dir_name: "test_catalogs" -test_catalogs_dir: "{{ output_dir }}/{{ test_catalogs_dir_name }}" - -# Output directory for eos_validate_state reports -eos_validate_state_name: "reports" -eos_validate_state_dir: "{{ root_dir }}/{{ eos_validate_state_name }}" - -# Output for test results JSON files if save_results is set to true -test_results_dir_name: "test_results" -test_results_dir: "{{ eos_validate_state_dir }}/{{ test_results_dir_name }}" - -# Fabric name used in the reports name -fabric_name: "all" - -# Reports name -eos_validate_state_md_report_path: "{{ eos_validate_state_dir }}/{{ fabric_name }}-state.md" -eos_validate_state_csv_report_path: "{{ eos_validate_state_dir }}/{{ fabric_name }}-state.csv" +- (New) AvdTestIPSecurity (No Ansible tags, use the new `skip_tests` variable instead) + - VerifySpecificIPSecConn: Validates the establishment of IP security connections for a peer within the default VRF. In its current state, the test validates only IPsec connections defined as static peers under the `router path-selection` section of the configuration. -# Input directory for custom ANTA catalogs: -custom_anta_catalogs_dir_name: "custom_anta_catalogs" -custom_anta_catalogs_dir: "{{ root_dir }}/{{ custom_anta_catalogs_dir_name }}" +- (New) AvdTestStun (No Ansible tags, use the new `skip_tests` variable instead) + - VerifyStunClient: Validates the presence of a STUN client translation for a given source IPv4 address and port for WAN scenarios. The list of expected translations for each device is built by searching local interfaces in each path-group. -# Allow different manufacturers -accepted_xcvr_manufacturers: "{{ validation_role.xcvr_own_manufacturers | arista.avd.default(['Arastra, Inc.', 'Arista Networks']) }}" - -# Allow different states for power supplies -accepted_pwr_supply_states: "{{ validation_role.pwr_supply_states | arista.avd.default(['ok']) }}" - -# Allow different states for fans -accepted_fan_states: "{{ validation_role.fan_states | arista.avd.default(['ok']) }}" - -# Generate CSV results file -validation_report_csv: "{{ validation_role.validation_report_csv | arista.avd.default(true) }}" - -# Generate MD results file -validation_report_md: "{{ validation_role.validation_report_md | arista.avd.default(true) }}" - -# Print only FAILED tests -only_failed_tests: "{{ validation_role.only_failed_tests | arista.avd.default(false) }}" - - -# Variable to enable ANTA eos_validate_state -# Defaults to false as ANTA is currently in preview -use_anta: false - -# Save each device test catalog to 'test_catalogs_dir'. Defaults to false. -save_catalog: false - -# Logging level for the ANTA libraries. Defaults to "WARNING". -logging_level: "WARNING" - -# The variable `skipped_tests` can be used for running/skipping test categories -skipped_tests: - - category: AvdTestHardware +## Input variables -# You can also decide to skip specific subtests (ANTA test name) for more granularity -skipped_tests: - - category: AvdTestBGP - tests: - - VerifyRoutingProtocolModel - - category: AvdTestHardware +```yaml +# Root directory. +root_dir: + +# Output directory. +output_dir_name: +output_dir: + +# Output for test catalog YAML files if save_catalog is set to true. +test_catalogs_dir_name: " +test_catalogs_dir: + +# Output directory for eos_validate_state reports. +eos_validate_state_name: +eos_validate_state_dir: + +# Output for test results JSON files if save_results is set to true. +test_results_dir_name: +test_results_dir: + +# Reports name. +eos_validate_state_md_report_path: +eos_validate_state_csv_report_path: + +# Input directory for structured configuration files. +structured_dir_name: +structured_dir: + +# Structured configuration files format. +avd_structured_config_file_format: "yml" + +# Input directory for custom ANTA catalogs. +custom_anta_catalogs_dir_name: +custom_anta_catalogs_dir: + +# Allow different manufacturers. +accepted_xcvr_manufacturers: + +# Allow different states for power supplies. +accepted_pwr_supply_states: + +# Allow different states for fans. +accepted_fan_states: + +# Generate CSV results file. +validation_report_csv: + +# Generate MD results file. +validation_report_md: + +# Print only FAILED tests. +only_failed_tests: + +# Variable to enable ANTA eos_validate_state. +use_anta: + +# Save each device test catalog to 'test_catalogs_dir'. +save_catalog: + +# Logging level for the ANTA libraries. +logging_level: + +# The variable `skip_tests` can be used for running/skipping test categories. +# Examples +# skip_tests: +# - category: AvdTestHardware +# +# or to skip specific tests (ANTA test names) in a given category for more granularity: +# skip_tests: +# - category: AvdTestHardware +# tests: +# - VerifyEnvironmentCooling +# - VerifyTemperature +# - category: AvdTestBGP +# tests: +# - VerifyBGPSpecificPeers +skip_tests: + - category: + # Optional tests tests: - - VerifyEnvironmentCooling + - ``` ## Custom ANTA catalog -You can now provide custom ANTA catalogs to the AVD `eos_validate_state` role. By default, AVD will search for catalog YAML files in the `custom_anta_catalogs` directory and incorporate these tests into the existing dynamically created catalog from AVD. The custom catalog files must be named as follows: +You can provide custom ANTA catalogs to the AVD `eos_validate_state` role. By default, AVD will search for catalog YAML files in the `custom_anta_catalogs` directory and incorporate these tests into the existing dynamically created catalog from AVD. The custom catalog files must be named as follows: - `.yml` or `.yaml` - `.yml` or `.yaml` @@ -238,12 +245,12 @@ You can now provide custom ANTA catalogs to the AVD `eos_validate_state` role. B When specifying a group, it must be a group from the Ansible inventory. The custom tests will then be added to all devices that are part of this group. You can also use the `all` group to target all the devices in your inventory. The directory where the custom catalogs are stored can be changed with the `custom_anta_catalogs_dir` variable. !!! warning - The `skipped_tests` variable will ONLY skip the dynamically generated tests from the AVD validate state role. It will **not** skip tests added from custom catalogs. + The `skip_tests` variable will ONLY skip the dynamically generated tests from the AVD validate state role. It will **not** skip tests added from custom catalogs. !!! info - The final catalog will be validated by ANTA before running the tests on your network. Duplicate tests with the same inputs will be automatically removed. Therefore, dynamically generated tests by AVD will never be overwritten. To overwrite them, you should first skip them using the `skipped_tests` variable and provide your own tests with inputs via a custom catalog. + The final catalog will be validated by ANTA before running the tests on your network. Duplicate tests with the same inputs will be automatically removed. Therefore, dynamically generated tests by AVD will never be overwritten. To overwrite them, you should first skip them using the `skip_tests` variable and provide your own tests with inputs via a custom catalog. -## Example Playbook +## Example playbook ```yaml --- @@ -260,3 +267,7 @@ When specifying a group, it must be a group from the Ansible inventory. The cust # To save catalogs save_catalog: true ``` + +## Known issues + +- `[__NSCFConstantString initialize] may have been in progress in another thread when fork() was called.` This issue affects OSX users only and is covered in Ansible documentation: https://docs.ansible.com/ansible/latest/reference_appendices/faq.html#running-on-macos-as-a-control-node. diff --git a/ansible_collections/arista/avd/roles/eos_validate_state/defaults/main.yml b/ansible_collections/arista/avd/roles/eos_validate_state/defaults/main.yml index c83e908de33..f21a33af2a3 100644 --- a/ansible_collections/arista/avd/roles/eos_validate_state/defaults/main.yml +++ b/ansible_collections/arista/avd/roles/eos_validate_state/defaults/main.yml @@ -60,5 +60,4 @@ only_failed_tests: "{{ validation_role.only_failed_tests | arista.avd.default(fa avd_structured_config_file_format: "yml" # Variable to enable ANTA eos_validate_state -# Defaults to false as ANTA is currently preview use_anta: false diff --git a/ansible_collections/arista/avd/roles/eos_validate_state/preview_requirements.txt b/ansible_collections/arista/avd/roles/eos_validate_state/preview_requirements.txt deleted file mode 100644 index a4205a6c4cc..00000000000 --- a/ansible_collections/arista/avd/roles/eos_validate_state/preview_requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -# Temporary requirements while ANTA integration is in preview state. -# Once the integration is final, this file can be removed and the regular requirements can include ANTA. --r ../../requirements.txt -anta==0.13.0 diff --git a/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/bgp_constants.py b/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/bgp_constants.py new file mode 100644 index 00000000000..7b2cd146116 --- /dev/null +++ b/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/bgp_constants.py @@ -0,0 +1,17 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. + +BGP_ADDRESS_FAMILIES = [ + {"afi": "evpn", "safi": None, "description": "EVPN", "avd_key": "address_family_evpn"}, + {"afi": "path-selection", "safi": None, "description": "Path-Selection", "avd_key": "address_family_path_selection"}, + {"afi": "link-state", "safi": None, "description": "Link-State", "avd_key": "address_family_link_state"}, + {"afi": "ipv4", "safi": "unicast", "description": "IPv4 Unicast", "avd_key": "address_family_ipv4"}, + {"afi": "ipv6", "safi": "unicast", "description": "IPv6 Unicast", "avd_key": "address_family_ipv6"}, + {"afi": "ipv4", "safi": "sr-te", "description": "IPv4 SR-TE", "avd_key": "address_family_ipv4_sr_te"}, + {"afi": "ipv6", "safi": "sr-te", "description": "IPv6 SR-TE", "avd_key": "address_family_ipv6_sr_te"}, +] +""" +List of dictionaries that map the BGP address family identifier (AFI) and the subsequent address family identifier (SAFI) for validation, +description as formatted input messages in the report and avd_key to access address families in structured config. +""" diff --git a/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/constants.py b/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/constants.py index 76b70b30396..83a6f6da125 100644 --- a/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/constants.py +++ b/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/constants.py @@ -9,6 +9,7 @@ AvdTestHardware, AvdTestInbandReachability, AvdTestInterfacesState, + AvdTestIPSecurity, AvdTestLLDPTopology, AvdTestLoopback0Reachability, AvdTestMLAG, @@ -16,9 +17,10 @@ AvdTestP2PIPReachability, AvdTestReloadCause, AvdTestRoutingTable, + AvdTestStun, ) -ACRONYM_CATEGORIES: set[str] = {"aaa", "mlag", "snmp", "bgp", "ospf", "vxlan", "stp", "igmp", "ip", "lldp", "ntp", "bfd"} +ACRONYM_CATEGORIES: set[str] = {"aaa", "mlag", "snmp", "bgp", "ospf", "vxlan", "stp", "igmp", "ip", "lldp", "ntp", "bfd", "ptp", "lanz", "stun", "vlan"} """ A set of network protocol or feature acronyms that should be represented in uppercase in the eos_validate_state report. """ @@ -36,6 +38,8 @@ AvdTestInbandReachability: {"legacy_ansible_tags": ["loopback_reachability", "loopback0_reachability", "optional"]}, AvdTestLoopback0Reachability: {"legacy_ansible_tags": ["loopback_reachability", "loopback0_reachability"]}, AvdTestAPIHttpsSSL: {}, + AvdTestIPSecurity: {}, + AvdTestStun: {}, } """ A dict of all AVD eos_validate_state test classes with their equivalent legacy Ansible tags. diff --git a/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/__init__.py b/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/__init__.py index 7568818b6ff..19ecb642c46 100644 --- a/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/__init__.py +++ b/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/__init__.py @@ -6,7 +6,8 @@ from .avdtestinterfaces import AvdTestInterfacesState from .avdtestmlag import AvdTestMLAG from .avdtestrouting import AvdTestBGP, AvdTestRoutingTable -from .avdtestsecurity import AvdTestAPIHttpsSSL +from .avdtestsecurity import AvdTestAPIHttpsSSL, AvdTestIPSecurity +from .avdteststun import AvdTestStun from .avdtestsystem import AvdTestNTP, AvdTestReloadCause __all__ = [ @@ -22,4 +23,6 @@ "AvdTestRoutingTable", "AvdTestBGP", "AvdTestAPIHttpsSSL", + "AvdTestStun", + "AvdTestIPSecurity", ] diff --git a/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtestconnectivity.py b/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtestconnectivity.py index e85f43910a6..467d813734e 100644 --- a/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtestconnectivity.py +++ b/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtestconnectivity.py @@ -131,7 +131,14 @@ def test_definition(self) -> dict | None: """ anta_tests = [] - if not self.validate_data(type="l3leaf"): + # Skip the test if the host is not a VTEP (no VXLAN interface) + if get(self.structured_config, "vxlan_interface") is None: + LOGGER.info("Host is not a VTEP since it doesn't have a VXLAN interface. %s is skipped.", self.__class__.__name__) + return None + + # TODO: For now, we exclude WAN VTEPs from testing + if "Dps" in get(self.structured_config, "vxlan_interface.Vxlan1.vxlan.source_interface"): + LOGGER.info("Host is a VTEP with a DPS source interface for VXLAN. For now, WAN VTEPs are excluded. %s is skipped.", self.__class__.__name__) return None if (loopback0_ip := self.get_interface_ip(interface_model="loopback_interfaces", interface_name="Loopback0")) is None: diff --git a/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtesthardware.py b/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtesthardware.py index ab085f1c24f..9b324407c7c 100644 --- a/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtesthardware.py +++ b/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtesthardware.py @@ -29,9 +29,9 @@ def test_definition(self) -> dict: Returns: test_definition (dict): ANTA test definition. """ - pwr_supply_states = get(self.structured_config, "validation_role.pwr_supply_states", ["ok"]) - fan_states = get(self.structured_config, "validation_role.fan_states", ["ok"]) - xcvr_manufacturers = get(self.structured_config, "validation_role.xcvr_own_manufacturers", ["Arista Networks", "Arastra, Inc."]) + pwr_supply_states = get(self.structured_config, "accepted_pwr_supply_states", ["ok"]) + fan_states = get(self.structured_config, "accepted_fan_states", ["ok"]) + xcvr_manufacturers = get(self.structured_config, "accepted_xcvr_manufacturers", ["Arista Networks", "Arastra, Inc."]) xcvr_manufacturers.append("Not Present") anta_tests = [ diff --git a/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtestinterfaces.py b/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtestinterfaces.py index fda4533b8cd..f2798f5c050 100644 --- a/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtestinterfaces.py +++ b/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtestinterfaces.py @@ -7,7 +7,7 @@ from functools import cached_property from ansible_collections.arista.avd.plugins.plugin_utils.eos_validate_state_utils.avdtestbase import AvdTestBase -from ansible_collections.arista.avd.plugins.plugin_utils.utils.get import get +from ansible_collections.arista.avd.plugins.plugin_utils.utils import get LOGGER = logging.getLogger(__name__) diff --git a/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtestrouting.py b/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtestrouting.py index 849978c4def..52bd17817e7 100644 --- a/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtestrouting.py +++ b/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtestrouting.py @@ -9,6 +9,8 @@ from ansible_collections.arista.avd.plugins.plugin_utils.eos_validate_state_utils.avdtestbase import AvdTestBase from ansible_collections.arista.avd.plugins.plugin_utils.utils import get +from ..bgp_constants import BGP_ADDRESS_FAMILIES + LOGGER = logging.getLogger(__name__) @@ -53,12 +55,21 @@ def add_test(mapping: list) -> None: ) processed_ips.add(ip) - if not self.validate_data(type="l3leaf"): + # Skip the test if the host is not a VTEP (no VXLAN interface) + if get(self.structured_config, "vxlan_interface") is None: + LOGGER.info("Host is not a VTEP since it doesn't have a VXLAN interface. %s is skipped.", self.__class__.__name__) + return None + + vtep_interface = get(self.structured_config, "vxlan_interface.Vxlan1.vxlan.source_interface") + + # TODO: For now, we exclude WAN VTEPs from testing + if "Dps" in vtep_interface: + LOGGER.info("Host is a VTEP with a DPS source interface for VXLAN. For now, WAN VTEPs are excluded. %s is skipped.", self.__class__.__name__) return None add_test(mapping=self.loopback0_mapping) - if get(self.structured_config, "vxlan_interface.Vxlan1.vxlan.source_interface") is not None: + if vtep_interface is not None: add_test(mapping=self.vtep_mapping) return {self.anta_module: anta_tests} if anta_tests else None @@ -67,17 +78,15 @@ def add_test(mapping: list) -> None: class AvdTestBGP(AvdTestBase): """AvdTestBGP class for BGP tests. - Supports IPv4, IPv6 and EVPN address families. + Supports IPv4, IPv6, Path-Selection, Link-State and EVPN address families. """ anta_module = "anta.tests.routing" anta_tests = {} - def add_test(self, afi: str, bgp_neighbor_ip: str, bgp_peer: str, safi: str | None = None) -> dict: + def add_test(self, afi: str, bgp_neighbor_ip: str, bgp_peer: str, description: str, safi: str | None = None) -> dict: """Add a BGP test definition with the proper input parameters.""" - formatted_afi = "IPv4" if afi.lower() == "ipv4" else "IPv6" if afi.lower() == "ipv6" else afi.upper() - formatted_safi = f" {safi.capitalize()}" if safi else "" - custom_field = f"BGP {formatted_afi}{formatted_safi} Peer: {bgp_peer} (IP: {bgp_neighbor_ip})" + custom_field = f"BGP {description} Peer: {''.join([bgp_peer, ' (IP: ', bgp_neighbor_ip, ')']) if bgp_peer is not None else bgp_neighbor_ip}" address_family = {"afi": afi, "peers": [bgp_neighbor_ip]} if safi: @@ -92,13 +101,19 @@ def add_test(self, afi: str, bgp_neighbor_ip: str, bgp_peer: str, safi: str | No }, ) - def create_tests(self, afi: str, safi: str | None = None) -> None: + def create_tests( + self, + afi: str, + description: str, + avd_key: str, + safi: str | None = None, + ) -> None: """Create BGP tests for the given AFI and SAFI.""" bgp_neighbors = get(self.structured_config, "router_bgp.neighbors", []) # Retrieve peer groups and direct neighbors. - peer_groups = get(self.structured_config, f"router_bgp.address_family_{afi}.peer_groups", []) - direct_neighbors = get(self.structured_config, f"router_bgp.address_family_{afi}.neighbors", []) + peer_groups = get(self.structured_config, f"router_bgp.{avd_key}.peer_groups", []) + direct_neighbors = get(self.structured_config, f"router_bgp.{avd_key}.neighbors", []) # Only explicitly activated neighbors and peer groups are tested. filtered_peer_groups = [peer_group["name"] for peer_group in peer_groups if peer_group.get("activate")] @@ -116,7 +131,7 @@ def create_tests(self, afi: str, safi: str | None = None) -> None: # Check peer availability if the 'peer' key exists. Otherwise, still include the test for potential BGP external peers. if peer is not None and not self.is_peer_available(peer): continue - self.add_test(afi=afi, safi=safi, bgp_neighbor_ip=str(ip), bgp_peer=peer) + self.add_test(afi=afi, safi=safi, bgp_neighbor_ip=str(ip), bgp_peer=peer, description=description) @cached_property def test_definition(self) -> dict | None: @@ -143,8 +158,8 @@ def test_definition(self) -> dict | None: }, }, ) - # Create tests for IPv4, IPv6 and EVPN address families - for afi, safi in [("evpn", None), ("ipv4", "unicast"), ("ipv6", "unicast")]: - self.create_tests(afi=afi, safi=safi) + # Create tests for IPv4, IPv6, Path-Selection, Link-State and EVPN address families + for family in BGP_ADDRESS_FAMILIES: + self.create_tests(**family) return self.anta_tests if self.anta_tests.get(f"{self.anta_module}.bgp") else None diff --git a/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtestsecurity.py b/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtestsecurity.py index b25ca698d7e..37b2a0a5195 100644 --- a/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtestsecurity.py +++ b/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdtestsecurity.py @@ -36,3 +36,54 @@ def test_definition(self) -> dict | None: anta_tests.append({"VerifyAPIHttpsSSL": {"profile": profile, "result_overwrite": {"custom_field": f"eAPI HTTPS SSL Profile: {profile}"}}}) return {self.anta_module: anta_tests} + + +class AvdTestIPSecurity(AvdTestBase): + """ + AvdTestIPSecurity class for IP security connection tests. + It validates the state of IPv4 security connections for a specified peer, ensuring they are established. + It specifically focuses on IPv4 security connections within the default VRF. + In its current state, the test validates only IPsec connections defined as static peers under the `router path-selection` section of the configuration. + + """ + + anta_module = "anta.tests.security" + + @cached_property + def test_definition(self) -> dict | None: + """ + Generates the proper ANTA test definition for all IP security connection tests. + + Returns: + test_definition (dict): ANTA test definition. + """ + anta_tests = [] + + # Check if there are any path groups with static peers + if (path_groups := get(self.structured_config, "router_path_selection.path_groups")) is None: + LOGGER.info("No router path-group configured to collect the static peer. %s is skipped.", self.__class__.__name__) + return None + + added_peers = set() + for group_idx, path_group in enumerate(path_groups): + if not self.validate_data(data=path_group, data_path=f"router_path_selection.path_groups.[{group_idx}]", required_keys="static_peers"): + continue + + for peer_idx, peer in enumerate(path_group["static_peers"]): + if self.validate_data( + data=peer, data_path=f"router_path_selection.path_groups.[{group_idx}].static_peers.[{peer_idx}]", required_keys="router_ip" + ): + peer_address = peer["router_ip"] + vrf = "default" # TODO: Keeping the vrf name static for now. We may need to change later on. + if (peer_address, vrf) not in added_peers: + anta_tests.append( + { + "VerifySpecificIPSecConn": { + "ip_security_connections": [{"peer": peer_address, "vrf": vrf}], + "result_overwrite": {"custom_field": f"IPv4 Peer: {peer_address} VRF: {vrf}"}, + } + } + ) + added_peers.add((peer_address, vrf)) + + return {self.anta_module: anta_tests} if anta_tests else None diff --git a/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdteststun.py b/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdteststun.py new file mode 100644 index 00000000000..fcb1b99a6c2 --- /dev/null +++ b/ansible_collections/arista/avd/roles/eos_validate_state/python_modules/tests/avdteststun.py @@ -0,0 +1,72 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import annotations + +import logging +from functools import cached_property +from ipaddress import ip_interface + +from ansible_collections.arista.avd.plugins.plugin_utils.eos_validate_state_utils.avdtestbase import AvdTestBase +from ansible_collections.arista.avd.plugins.plugin_utils.utils import get + +LOGGER = logging.getLogger(__name__) + + +class AvdTestStun(AvdTestBase): + """ + AvdTestStun class for STUN tests. + Validates the presence of a STUN client translation for a given source IPv4 address and port for WAN scenarios. + The list of expected translations for each device is built by searching through router_path_selection.path_groups.local_interfaces. + """ + + anta_module = "anta.tests.stun" + + @cached_property + def test_definition(self) -> dict | None: + """ + Generates the proper ANTA test definition for all STUN tests. + + Returns: + test_definition (dict): ANTA test definition. + """ + anta_tests = [] + + # Check if there are any path groups with STUN configuration + if (path_groups := get(self.structured_config, "router_path_selection.path_groups")) is None: + LOGGER.info("Path groups are not configured to collect STUN interfaces information. %s is skipped.", self.__class__.__name__) + return None + + # Get the interfaces with STUN configuration + stun_interfaces = [ + local_interfaces["name"] + for group_idx, path_group in enumerate(path_groups) + if self.validate_data(data=path_group, data_path=f"router_path_selection.path_groups.[{group_idx}]", required_keys="local_interfaces") + for interface_idx, local_interfaces in enumerate(path_group["local_interfaces"]) + if self.validate_data( + data=local_interfaces, + data_path=f"router_path_selection.path_groups.[{group_idx}].local_interfaces.[{interface_idx}]", + required_keys="stun.server_profiles", + ) + ] + if not stun_interfaces: + LOGGER.info("No local interface found with STUN configuration. %s is skipped.", self.__class__.__name__) + return None + + # Generate the ANTA tests for each identified local interface. + for source_interface in stun_interfaces: + if (ip_address := self.get_interface_ip("ethernet_interfaces", source_interface)) is None: + continue + source_address = str(ip_interface(ip_address).ip) + source_port = 4500 + anta_tests.append( + { + "VerifyStunClient": { + "stun_clients": [{"source_address": source_address, "source_port": source_port}], + "result_overwrite": {"custom_field": f"Source IPv4 Address: {source_address} Source Port: {source_port}"}, + } + } + ) + + # Return the ANTA tests as a dictionary + return {self.anta_module: anta_tests} if anta_tests else None diff --git a/ansible_collections/arista/avd/roles/eos_validate_state/tasks/anta_tests.yml b/ansible_collections/arista/avd/roles/eos_validate_state/tasks/anta_tests.yml index fa5b982b49a..b858354b09d 100644 --- a/ansible_collections/arista/avd/roles/eos_validate_state/tasks/anta_tests.yml +++ b/ansible_collections/arista/avd/roles/eos_validate_state/tasks/anta_tests.yml @@ -9,7 +9,7 @@ - name: Run eos_validate_state_runner leveraging ANTA arista.avd.eos_validate_state_runner: logging_level: "{{ logging_level | arista.avd.default('WARNING') }}" - skipped_tests: "{{ skipped_tests | arista.avd.default([]) }}" + skip_tests: "{{ skip_tests | arista.avd.default([]) }}" save_catalog: "{{ save_catalog | arista.avd.default(false) }}" device_catalog_path: "{{ test_catalogs_dir }}/{{ inventory_hostname }}-catalog.yml" test_results_dir: "{{ test_results_dir }}" diff --git a/ansible_collections/arista/avd/tests/integration/targets/cv_zscaler_endpoints/tasks/main.yml b/ansible_collections/arista/avd/tests/integration/targets/cv_zscaler_endpoints/tasks/main.yml new file mode 100644 index 00000000000..19797c0b9dd --- /dev/null +++ b/ansible_collections/arista/avd/tests/integration/targets/cv_zscaler_endpoints/tasks/main.yml @@ -0,0 +1,62 @@ +--- +- name: Test cv_zscaler_endpoints lookup plugin + tags: [always] + delegate_to: localhost + when: cv_token is arista.avd.defined + vars: + # This is not working with ansible-test, so adjust for manual testing. + cv_token: "{{ lookup(ansible.builtin.env, 'CV_TOKEN') }}" + cv_server: "www.cv-play.corp.arista.io" + serial_number: ABCD1234 + fabric_name: Test + type: wan_router + wan_router: + nodes: + - name: testhost + cv_pathfinder_region: REGION1 + cv_pathfinder_site: SITE1 + cv_pathfinder_regions: + - name: REGION1 + id: 1 + sites: + - name: SITE1 + id: 1 + location: Copenhagen, Denmark + expected_output: + cloud_name: zscalerbeta + device_location: + city: "" + country: "" + latitude: 55.67531204223633 + longitude: 12.569733619689941 + primary: + city: Frankfurt + country: Germany + datacenter: FRA4 + ip_address: 165.225.72.39 + latitude: 50.0 + longitude: 9.0 + secondary: + city: Washington, DC + country: United States + datacenter: WAS1 + ip_address: 104.129.194.39 + latitude: 39.0 + longitude: -77.0 + tertiary: + city: Fremont, CA + country: United States + datacenter: FMT1 + ip_address: 199.168.148.132 + latitude: 37.0 + longitude: -121.0 + + block: + - name: Print output + ansible.builtin.debug: + msg: "{{ lookup('arista.avd.cv_zscaler_endpoints') }}" + + - name: Assert output + ansible.builtin.assert: + that: + - lookup('arista.avd.cv_zscaler_endpoints') == expected_output diff --git a/ansible_collections/arista/avd/tests/sanity/ignore-2.15.txt b/ansible_collections/arista/avd/tests/sanity/ignore-2.15.txt index 2f2e54593ac..612c268cc12 100644 --- a/ansible_collections/arista/avd/tests/sanity/ignore-2.15.txt +++ b/ansible_collections/arista/avd/tests/sanity/ignore-2.15.txt @@ -11,3 +11,4 @@ plugins/vars/global_vars.py validate-modules:missing-gplv3-license plugins/modules/eos_validate_state_runner.py validate-modules:missing-gplv3-license plugins/modules/eos_validate_state_reports.py validate-modules:missing-gplv3-license plugins/modules/cv_workflow.py validate-modules:missing-gplv3-license +plugins/modules/eos_cli_config_gen.py validate-modules:missing-gplv3-license diff --git a/ansible_collections/arista/avd/tests/sanity/ignore-2.16.txt b/ansible_collections/arista/avd/tests/sanity/ignore-2.16.txt index 2f2e54593ac..612c268cc12 100644 --- a/ansible_collections/arista/avd/tests/sanity/ignore-2.16.txt +++ b/ansible_collections/arista/avd/tests/sanity/ignore-2.16.txt @@ -11,3 +11,4 @@ plugins/vars/global_vars.py validate-modules:missing-gplv3-license plugins/modules/eos_validate_state_runner.py validate-modules:missing-gplv3-license plugins/modules/eos_validate_state_reports.py validate-modules:missing-gplv3-license plugins/modules/cv_workflow.py validate-modules:missing-gplv3-license +plugins/modules/eos_cli_config_gen.py validate-modules:missing-gplv3-license diff --git a/ansible_collections/arista/avd/tests/sanity/ignore-2.14.txt b/ansible_collections/arista/avd/tests/sanity/ignore-2.17.txt similarity index 92% rename from ansible_collections/arista/avd/tests/sanity/ignore-2.14.txt rename to ansible_collections/arista/avd/tests/sanity/ignore-2.17.txt index 2f2e54593ac..612c268cc12 100644 --- a/ansible_collections/arista/avd/tests/sanity/ignore-2.14.txt +++ b/ansible_collections/arista/avd/tests/sanity/ignore-2.17.txt @@ -11,3 +11,4 @@ plugins/vars/global_vars.py validate-modules:missing-gplv3-license plugins/modules/eos_validate_state_runner.py validate-modules:missing-gplv3-license plugins/modules/eos_validate_state_reports.py validate-modules:missing-gplv3-license plugins/modules/cv_workflow.py validate-modules:missing-gplv3-license +plugins/modules/eos_cli_config_gen.py validate-modules:missing-gplv3-license diff --git a/ansible_collections/arista/avd/tests/unit/action/test_verify_requirements.py b/ansible_collections/arista/avd/tests/unit/action/test_verify_requirements.py index d3ee9f01260..6ae40de6036 100644 --- a/ansible_collections/arista/avd/tests/unit/action/test_verify_requirements.py +++ b/ansible_collections/arista/avd/tests/unit/action/test_verify_requirements.py @@ -106,7 +106,7 @@ def test__validate_python_requirements(n_reqs, mocked_version, requirement_versi Running with n_reqs requirements TODO - check the results - - not testing for wrongly formated requirements + - not testing for wrongly formatted requirements """ result = {} requirements = [f"test-dep>={requirement_version}" for _ in range(n_reqs)] # pylint: disable=disallowed-name @@ -122,13 +122,13 @@ def test__validate_python_requirements(n_reqs, mocked_version, requirement_versi "mocked_running_version, deprecated_version, expected_return", [ pytest.param( - "2.14", + "2.16", False, True, id="valid ansible version", ), pytest.param( - "2.11.0", + "2.14.0", True, False, id="invalid ansible version", @@ -199,7 +199,7 @@ def test__validate_ansible_collections(n_reqs, mocked_version, requirement_versi Running with n_reqs requirements TODO - check the results - - not testing for wrongly formated collection.yml file + - not testing for wrongly formatted collection.yml file """ result = {} diff --git a/ansible_collections/arista/avd/tests/unit/filters/filter_utils.py b/ansible_collections/arista/avd/tests/unit/filters/filter_utils.py deleted file mode 100644 index f5f5fd3e0b6..00000000000 --- a/ansible_collections/arista/avd/tests/unit/filters/filter_utils.py +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -from __future__ import absolute_import, division, print_function - -__metaclass__ = type - -import re - -from natsort import os_sorted - - -def convert_esi_short_to_route_target_format(esi_short): - if esi_short is None or esi_short == "": - return None - esi = esi_short.replace(":", "") - return ":".join(re.findall("..", esi)) - - -def natural_sort(item_to_natural_sort): - return os_sorted(item_to_natural_sort) diff --git a/ansible_collections/arista/avd/tests/unit/filters/test_add_md_toc.py b/ansible_collections/arista/avd/tests/unit/filters/test_add_md_toc.py deleted file mode 100644 index 9ac1a058ec3..00000000000 --- a/ansible_collections/arista/avd/tests/unit/filters/test_add_md_toc.py +++ /dev/null @@ -1,73 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -from __future__ import absolute_import, division, print_function - -__metaclass__ = type - -import os -import re - -import md_toc -import pytest -from jinja2.runtime import Undefined - -from ansible_collections.arista.avd.plugins.filter.add_md_toc import add_md_toc - -DIR_PATH = os.path.dirname(os.path.realpath(__file__)) + "/toc_files" -MD_INPUTS = [None, DIR_PATH + "/valid_file.md"] -MD_INPUT_INVALID = DIR_PATH + "/invalid_file.md" -EXPECTED_TOC = DIR_PATH + "/expected_toc.md" -TOC_MARKER = "" -SKIP_LINES_LIST = [0, 1, 2] -TOC_LEVELS = [1, 2, 3] -INVALID_TOC_LEVEL = 0 - - -class TestAddMdTocFilter: - @pytest.mark.parametrize("MD_INPUT", MD_INPUTS) - @pytest.mark.parametrize("TOC_LEVEL", TOC_LEVELS) - @pytest.mark.parametrize("SKIP_LINES", SKIP_LINES_LIST) - def test_add_md_toc(self, MD_INPUT, TOC_LEVEL, SKIP_LINES): - if MD_INPUT is None or isinstance(MD_INPUT, Undefined): - resp = add_md_toc(MD_INPUT) - assert resp is None - else: - # Extract the TOC from the response - with open(MD_INPUT, "r", encoding="UTF-8") as input_file: - resp = add_md_toc(input_file.read(), skip_lines=SKIP_LINES, toc_levels=TOC_LEVEL, toc_marker=TOC_MARKER) - m = re.compile(r"()([\S\s]*?)()") - toc_output = m.search(resp).group(2) - - # Generate TOC for input file - try: - # Try using new md_toc api when md-toc>=9.0.0. - toc_input = md_toc.api.build_toc(MD_INPUT, list_marker="-", keep_header_levels=TOC_LEVEL, skip_lines=SKIP_LINES) - except AttributeError: - # If that fails, use the previous version md-toc>=7.1.0,<9.0.0 - toc_input = md_toc.build_toc(MD_INPUT, list_marker="-", keep_header_levels=TOC_LEVEL, skip_lines=SKIP_LINES) - - assert toc_output.strip() == toc_input.strip() - - @pytest.mark.parametrize("MD_INPUT", MD_INPUTS) - def test_add_md_toc_invalid_toc_level(self, MD_INPUT): - if MD_INPUT is not None: - with open(MD_INPUT, "r", encoding="UTF-8") as input_file: - with pytest.raises(ValueError): - add_md_toc(input_file.read(), toc_levels=INVALID_TOC_LEVEL) - - def test_add_md_toc_invalid(self): - with open(MD_INPUT_INVALID, "r", encoding="UTF-8") as md_input_toc_invalid: - resp = add_md_toc(md_input_toc_invalid.read()) - - with open(EXPECTED_TOC, "r", encoding="UTF-8") as input_file: - expected_toc = input_file.read() - - assert resp.strip() != expected_toc.strip() - - def test_add_md_toc_btw_specific_markers(self): - with open(DIR_PATH + "/markers_at_bottom.md", "r", encoding="UTF-8") as input_file: - resp = add_md_toc(input_file.read(), skip_lines=0, toc_levels=2, toc_marker=TOC_MARKER) - - with open(DIR_PATH + "/expected_output_toc_at_bottom.md", "r", encoding="UTF-8") as expected_output: - assert resp == expected_output.read() diff --git a/ansible_collections/arista/avd/tests/unit/filters/test_convert_dicts.py b/ansible_collections/arista/avd/tests/unit/filters/test_convert_dicts.py deleted file mode 100644 index 33916b20287..00000000000 --- a/ansible_collections/arista/avd/tests/unit/filters/test_convert_dicts.py +++ /dev/null @@ -1,114 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -from __future__ import absolute_import, division, print_function - -__metaclass__ = type - -from ansible_collections.arista.avd.plugins.filter.convert_dicts import FilterModule, convert_dicts - -nested_list_of_dict = { - "TEST1": [{"type": "permit", "extcommunities": "65000:65000"}, {"type": "deny", "extcommunities": "65002:65002"}], - "TEST2": [{"type": "deny", "extcommunities": "65001:65001"}], -} -nested_dict = {"TEST1": {"action": "permit 1000:1000"}, "TEST2": {"action": "permit 2000:3000"}} -list = ["Test1", "Test2", "Test3"] -list_of_dict = [{"type": "permit"}, {"extcommunities": "65000:65000"}] -dict_with_string = {"dict": "test_string"} - -f = FilterModule() - - -class TestConvertDicts: - def test_convert_dicts_with_nested_dict_default(self): - resp = convert_dicts(nested_dict) - assert resp == [{"action": "permit 1000:1000", "name": "TEST1"}, {"action": "permit 2000:3000", "name": "TEST2"}] - - def test_convert_dicts_with_nested_dict_primary_key(self): - resp = convert_dicts(nested_dict, "id") - assert resp == [{"action": "permit 1000:1000", "id": "TEST1"}, {"action": "permit 2000:3000", "id": "TEST2"}] - - def test_convert_dicts_with_nested_dict_secondary_key(self): - resp = convert_dicts(nested_dict, secondary_key="types") - assert resp == [{"name": "TEST1", "types": {"action": "permit 1000:1000"}}, {"name": "TEST2", "types": {"action": "permit 2000:3000"}}] - - def test_convert_dicts_with_nested_dict_primary_and_secondary_key(self): - resp = convert_dicts(nested_dict, "id", "types") - assert resp == [{"id": "TEST1", "types": {"action": "permit 1000:1000"}}, {"id": "TEST2", "types": {"action": "permit 2000:3000"}}] - - def test_convert_dicts_with_listofdict_default(self): - resp = convert_dicts(nested_list_of_dict) - assert resp == [{"name": "TEST1"}, {"name": "TEST2"}] - - def test_convert_dicts_with_listofdict_primary_key(self): - resp = convert_dicts(nested_list_of_dict, "test") - assert resp == [{"test": "TEST1"}, {"test": "TEST2"}] - - def test_convert_dicts_with_listofdict_secondary_key(self): - resp = convert_dicts(nested_list_of_dict, secondary_key="types") - assert resp == [ - {"name": "TEST1", "types": [{"type": "permit", "extcommunities": "65000:65000"}, {"type": "deny", "extcommunities": "65002:65002"}]}, - {"name": "TEST2", "types": [{"type": "deny", "extcommunities": "65001:65001"}]}, - ] - - def test_convert_dicts_with_listofdict_primary_and_secondary_key(self): - resp = convert_dicts(nested_list_of_dict, "id", "types") - assert resp == [ - {"id": "TEST1", "types": [{"type": "permit", "extcommunities": "65000:65000"}, {"type": "deny", "extcommunities": "65002:65002"}]}, - {"id": "TEST2", "types": [{"type": "deny", "extcommunities": "65001:65001"}]}, - ] - - def test_convert_dicts_with_list_default(self): - resp = convert_dicts(list) - assert resp == [{"name": "Test1"}, {"name": "Test2"}, {"name": "Test3"}] - - def test_convert_dicts_with_list_primary_key(self): - resp = convert_dicts(list, "test") - assert resp == [{"test": "Test1"}, {"test": "Test2"}, {"test": "Test3"}] - - def test_convert_dicts_with_list_secondary_key(self): - resp = convert_dicts(list, secondary_key="id") - assert resp == [{"name": "Test1"}, {"name": "Test2"}, {"name": "Test3"}] - - def test_convert_dicts_with_list_primary_and_secondary_key(self): - resp = convert_dicts(list, "test", "types") - assert resp == [{"test": "Test1"}, {"test": "Test2"}, {"test": "Test3"}] - - def test_convert_dicts_with_string_value_default(self): - resp = convert_dicts(dict_with_string) - assert resp == [{"name": "dict"}] - - def test_convert_dicts_with_string_value_primary_key(self): - resp = convert_dicts(dict_with_string, "test") - assert resp == [{"test": "dict"}] - - def test_convert_dicts_with_string_value_secondary_key(self): - resp = convert_dicts(dict_with_string, secondary_key="str") - assert resp == [{"name": "dict", "str": "test_string"}] - - def test_convert_dicts_with_string_value_primary_key_and_secondary_key(self): - resp = convert_dicts(dict_with_string, "test", "str") - assert resp == [{"test": "dict", "str": "test_string"}] - - def test_convert_dicts_with_list_of_dict_default(self): - resp = convert_dicts(list_of_dict) - assert resp == list_of_dict - - def test_convert_dicts_with_list_of_dict_primary_key(self): - resp = convert_dicts(list_of_dict, "test") - assert resp == list_of_dict - - def test_convert_dicts_with_list_of_dict_secondary_key(self): - # We convert a list-of-dict input if primary_key is found in element and secondary_key is set - resp = convert_dicts(list_of_dict, secondary_key="id") - assert resp == [{"name": "type", "id": "permit"}, {"name": "extcommunities", "id": "65000:65000"}] - - def test_convert_dicts_with_list_of_dict_primary_key_and_secondary_key(self): - # We convert a list-of-dict input if primary_key is found in element and secondary_key is set - resp = convert_dicts(list_of_dict, "test", "id") - assert resp == [{"test": "type", "id": "permit"}, {"test": "extcommunities", "id": "65000:65000"}] - - def test_convert_dicts_filter(self): - resp = f.filters() - assert isinstance(resp, dict) - assert "convert_dicts" in resp.keys() diff --git a/ansible_collections/arista/avd/tests/unit/filters/test_default.py b/ansible_collections/arista/avd/tests/unit/filters/test_default.py deleted file mode 100644 index a13426186f4..00000000000 --- a/ansible_collections/arista/avd/tests/unit/filters/test_default.py +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -from __future__ import absolute_import, division, print_function - -__metaclass__ = type - -import pytest -from jinja2.runtime import Undefined - -from ansible_collections.arista.avd.plugins.filter.default import FilterModule, default - -PRIMARY_VALUE_LIST = [1, "ABC", None, Undefined, {}, {"key": "value"}, [1, 2]] -DEFAULT_VALUE_LIST = [["default"], [None, 1], [None, "abc"], [None, None, "2"], [{"key": "value"}]] - -f = FilterModule() - - -class TestDefaultFilter: - @pytest.mark.parametrize("PRIMARY_VALUE", PRIMARY_VALUE_LIST) - @pytest.mark.parametrize("DEFAULT_VALUE", DEFAULT_VALUE_LIST) - def test_default(self, PRIMARY_VALUE, DEFAULT_VALUE): - resp = default(PRIMARY_VALUE, *DEFAULT_VALUE) - if isinstance(PRIMARY_VALUE, Undefined) or PRIMARY_VALUE is None and len(DEFAULT_VALUE_LIST) >= 1: - for i in DEFAULT_VALUE: - if isinstance(i, Undefined) or i is None or i == "": - continue - assert i == resp - else: - assert resp == PRIMARY_VALUE - - def test_default_filter(self): - resp = f.filters() - assert isinstance(resp, dict) - assert "default" in resp.keys() diff --git a/ansible_collections/arista/avd/tests/unit/filters/test_esi_management.py b/ansible_collections/arista/avd/tests/unit/filters/test_esi_management.py deleted file mode 100644 index 9f9cd72ecf2..00000000000 --- a/ansible_collections/arista/avd/tests/unit/filters/test_esi_management.py +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -from __future__ import absolute_import, division, print_function - -__metaclass__ = type - -from ansible_collections.arista.avd.plugins.filter.generate_esi import generate_esi -from ansible_collections.arista.avd.plugins.filter.generate_lacp_id import generate_lacp_id -from ansible_collections.arista.avd.plugins.filter.generate_route_target import generate_route_target -from ansible_collections.arista.avd.tests.unit.filters.filter_utils import convert_esi_short_to_route_target_format - -ESI_SHORT = "0303:0202:0101" -ESI_PREFIX = "1111:1111" -ESI_SHORT_1 = "0404:0202:0101" - - -class TestEsiManagementFilter: - def test_generate_esi_without_prefix(self): - resp = generate_esi(ESI_SHORT) - assert resp == "0000:0000:" + ESI_SHORT - - def test_generate_esi_with_prefix(self): - assert ESI_PREFIX is not None and ESI_PREFIX != "" - resp = generate_esi(ESI_SHORT, ESI_PREFIX) - assert resp == ESI_PREFIX + ESI_SHORT - - def test_lacp_id(self): - assert ESI_SHORT_1 is not None and ESI_SHORT_1 != "" - resp = generate_lacp_id(ESI_SHORT_1) - assert ":" not in resp - assert "." in resp - - def test_generate_route_target(self): - route_target_format_esi = convert_esi_short_to_route_target_format(ESI_SHORT) - resp = generate_route_target(ESI_SHORT) - assert resp == route_target_format_esi - resp1 = generate_route_target(None) - assert resp1 is None diff --git a/ansible_collections/arista/avd/tests/unit/filters/test_list_compress.py b/ansible_collections/arista/avd/tests/unit/filters/test_list_compress.py deleted file mode 100644 index 2db7efbc31d..00000000000 --- a/ansible_collections/arista/avd/tests/unit/filters/test_list_compress.py +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -from __future__ import absolute_import, division, print_function - -__metaclass__ = type - -import pytest - -from ansible_collections.arista.avd.plugins.filter.list_compress import AnsibleFilterError, FilterModule, list_compress - -LIST_TO_COMPRESS_INVALID_VALUES = ["1-3", {"key": "value"}, 33] -LIST_TO_COMPRESS_VALID_VALUES = [[1, 2, 3, 4], [1, 2, 3, 7, 8]] -EXPECTED_RESULT_VALID_VALUES = ["1-4", "1-3,7-8"] - - -f = FilterModule() - - -class TestListCompressFilter: - @pytest.mark.parametrize("LIST_TO_COMPRESS_INVALID", LIST_TO_COMPRESS_INVALID_VALUES) - def test_list_compress_invalid(self, LIST_TO_COMPRESS_INVALID): - with pytest.raises(AnsibleFilterError) as exc_info: - list_compress(LIST_TO_COMPRESS_INVALID) - assert str(exc_info.value) == f"value must be of type list, got {type(LIST_TO_COMPRESS_INVALID)}" - - @pytest.mark.parametrize("LIST_TO_COMPRESS_VALID", LIST_TO_COMPRESS_VALID_VALUES) - def test_list_compress_valid(self, LIST_TO_COMPRESS_VALID): - resp = list_compress(LIST_TO_COMPRESS_VALID) - assert resp in EXPECTED_RESULT_VALID_VALUES - - def test_list_compress_filter(self): - resp = f.filters() - assert isinstance(resp, dict) - assert "list_compress" in resp.keys() diff --git a/ansible_collections/arista/avd/tests/unit/filters/test_markdown_rendering.py b/ansible_collections/arista/avd/tests/unit/filters/test_markdown_rendering.py deleted file mode 100644 index 81980752d61..00000000000 --- a/ansible_collections/arista/avd/tests/unit/filters/test_markdown_rendering.py +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -from __future__ import absolute_import, division, print_function - -__metaclass__ = type - -import pytest - -from ansible_collections.arista.avd.plugins.filter.markdown_rendering import FilterModule - -STATE_STRINGS = ["PASS", "FAIL"] -RENDERING_VALID = "github" -RENDERING_INVALID = "test" - -GH_CODE = {} -# Github MD code for Emoji checked box -GH_CODE["PASS"] = ":white_check_mark:" -# GH MD code for Emoji Fail -GH_CODE["FAIL"] = ":x:" - -f = FilterModule() - - -class TestMarkdownRenderingFilter: - @pytest.mark.parametrize("STATE_STRING", STATE_STRINGS) - def test_status_render_valid(self, STATE_STRING): - resp = f.status_render(STATE_STRING, RENDERING_VALID) - assert resp == GH_CODE[STATE_STRING] - - @pytest.mark.parametrize("STATE_STRING", STATE_STRINGS) - def test_status_render_invalid(self, STATE_STRING): - resp = f.status_render(STATE_STRING, RENDERING_INVALID) - assert resp == STATE_STRING - - def test_markdown_rendering_filter(self): - resp = f.filters() - assert isinstance(resp, dict) - assert "status_render" in resp.keys() diff --git a/ansible_collections/arista/avd/tests/unit/filters/test_natural_sort.py b/ansible_collections/arista/avd/tests/unit/filters/test_natural_sort.py deleted file mode 100644 index 5d7f4223833..00000000000 --- a/ansible_collections/arista/avd/tests/unit/filters/test_natural_sort.py +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -from __future__ import absolute_import, division, print_function - -__metaclass__ = type - -import pytest -from jinja2.runtime import Undefined - -from ansible_collections.arista.avd.plugins.filter.natural_sort import FilterModule, convert -from ansible_collections.arista.avd.plugins.filter.natural_sort import natural_sort as _natural_sort -from ansible_collections.arista.avd.tests.unit.filters.filter_utils import natural_sort - -f = FilterModule() - -STRINGS_VALID = ["100", "200", "ABC"] -ITEMS_TO_NATURAL_SORT = [None, [], {}, "", ["1,2,3,4", "11,2,3,4", "5.6.7.8"], {"a1": 123, "a2": 2, "a10": 333, "a11": 4456}] - - -class TestNaturalSortFilter: - @pytest.mark.parametrize("STRING_VALID", STRINGS_VALID) - def test_convert_function(self, STRING_VALID): - resp = convert(STRING_VALID) - if STRING_VALID.isdigit(): - assert resp == int(STRING_VALID) - else: - assert resp == STRING_VALID.lower() - - @pytest.mark.parametrize("ITEM_TO_NATURAL_SORT", ITEMS_TO_NATURAL_SORT) - def test_natural_sort_invalid(self, ITEM_TO_NATURAL_SORT): - resp = _natural_sort(ITEM_TO_NATURAL_SORT) - if ITEM_TO_NATURAL_SORT is None or isinstance(ITEM_TO_NATURAL_SORT, Undefined): - resp == [] - else: - resp_natsort = natural_sort(ITEM_TO_NATURAL_SORT) - assert resp == resp_natsort - - def test_natural_sort_filter(self): - resp = f.filters() - assert isinstance(resp, dict) - assert "natural_sort" in resp.keys() diff --git a/ansible_collections/arista/avd/tests/unit/filters/test_snmp_hash.py b/ansible_collections/arista/avd/tests/unit/filters/test_snmp_hash.py deleted file mode 100644 index 1755a9d4131..00000000000 --- a/ansible_collections/arista/avd/tests/unit/filters/test_snmp_hash.py +++ /dev/null @@ -1,196 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -from __future__ import absolute_import, division, print_function - -__metaclass__ = type - -from contextlib import nullcontext as does_not_raise - -import pytest -from ansible.errors import AnsibleFilterError - -from ansible_collections.arista.avd.plugins.filter.snmp_hash import PRIV_KEY_LENGTH, FilterModule, get_hash_object, key_from_passphrase, localize_passphrase - -f = FilterModule() - - -class TestSNMPHashFilter: - @pytest.mark.parametrize( - "auth_type, result, expectation", - [ - ("md5", "md5", does_not_raise()), - ("sha", "sha1", does_not_raise()), - ("sha256", "sha256", does_not_raise()), - ("sha384", "sha384", does_not_raise()), - ("sha512", "sha512", does_not_raise()), - ("toto", None, pytest.raises(AnsibleFilterError)), - ], - ) - def test_get_hash_object(self, auth_type, result, expectation): - with expectation: - assert get_hash_object(auth_type).name == result - - @pytest.mark.parametrize( - "passphrase, auth_type, result, expectation", - [ - ("testauth", "md5", "7a3d6867d36341fcc49c7d6dd0182078", does_not_raise()), - ( - "testauth", - "sha", - "d6997cbe7ffa9efa756721303e367478d0a9a61b", - does_not_raise(), - ), - ( - "testauth", - "sha224", - "b4cdc03923d5fa37bb20ca665bf2e971b9d7521c3cc311a7d29bfed2", - does_not_raise(), - ), - ( - "testauth", - "sha256", - "bd7b6e2a86527e0b93b65ad3d67d1fc870a420c49d53b4d652364d81e954f704", - does_not_raise(), - ), - ( - "testauth", - "sha384", - "bf8300efa68bb5d99945fef87fafb9b564ebaccd9c371bb8184fdba1df95eaa5d05b5f0fcaacfb0a3906b6e37693c6dd", - does_not_raise(), - ), - ( - "testauth", - "sha512", - "c005b901a9a29e140e2749bb5d51789bba97f614c3c8060a1c080d775f12494ba6d968dc22526bb06532e96e2e4d3bd0e746f2696439a4a034d040e1c7de0aaa", - does_not_raise(), - ), - ("testauth", "toto", None, pytest.raises(AnsibleFilterError)), - ], - ) - def test_key_from_passphrase(self, passphrase, auth_type, result, expectation): - with expectation: - assert key_from_passphrase(passphrase, auth_type) == result - - @pytest.mark.parametrize( - "passphrase, auth_type, engine_id, priv_type, result, expectation", - [ - ( - "testauth", - "md5", - "424242424242424242", - None, - "a487532d40f65644034ba50bec29bd90", - does_not_raise(), - ), - ( - "testauth", - "sha", - "424242424242424242", - None, - "14c3e7d55a9d67b7341e0dafba817bd33d3eb2e4", - does_not_raise(), - ), - ( - "testauth", - "sha224", - "424242424242424242", - None, - "b74ddba450a2b8a2b7f1823df22b4a1efa984071c5afcefadd72cc3f", - does_not_raise(), - ), - ( - "testauth", - "sha256", - "424242424242424242", - None, - "ca08c9b519c910b678faf598bc33e118272f37fd9a1522d5b4b764fea26fd9ca", - does_not_raise(), - ), - ( - "testauth", - "sha384", - "424242424242424242", - None, - "84e53e90d79c258426a67a229759cfe46058339d2d9db41e12ba29fe671ecf8085c4d45049b419ea23ae2e1fa0773bff", - does_not_raise(), - ), - ( - "testauth", - "sha512", - "424242424242424242", - None, - "bccbd436115c60540422ad8e98b8373dee507fd9e77730372f03dcf8e8a074a43d9f04bd6b7be64eb806bdbaeff43ccd1ca93c4606ab46eb797720e4c59abcc7", - does_not_raise(), - ), - ( - "testauth", - "toto", - "424242424242424242", - None, - None, - pytest.raises(AnsibleFilterError), - ), - # only testing priv with one auth algorithm, the longest, to verify key length - ( - "testpriv", - "sha512", - "424242424242424242", - "des", - "ca5e54b5c49e7addba0046c591f8f541", - does_not_raise(), - ), - ( - "testpriv", - "sha512", - "424242424242424242", - "aes", - "ca5e54b5c49e7addba0046c591f8f541", - does_not_raise(), - ), - ( - "testpriv", - "sha512", - "424242424242424242", - "aes192", - "ca5e54b5c49e7addba0046c591f8f5417338cdc1043068ab", - does_not_raise(), - ), - ( - "testpriv", - "sha512", - "424242424242424242", - "aes256", - "ca5e54b5c49e7addba0046c591f8f5417338cdc1043068abf8c2a7ab751f13dc", - does_not_raise(), - ), - ( - "testpriv", - "sha512", - "424242424242424242", - "toto", - None, - pytest.raises(AnsibleFilterError), - ), - # non hex engine_id - ( - "testpriv", - "sha512", - "zzzzzzzzzzzz", - "toto", - None, - pytest.raises(AnsibleFilterError), - ), - ], - ) - def test_localize_passphrase(self, passphrase, auth_type, engine_id, priv_type, result, expectation): - with expectation: - localized_passphrase = localize_passphrase(passphrase, auth_type, engine_id, priv_type=priv_type) - assert localized_passphrase == result - if priv_type: - assert len(localized_passphrase) * 4 == PRIV_KEY_LENGTH[priv_type] - - def test_snmp_hash_filter(self): - resp = f.filters() - assert isinstance(resp, dict) - assert "snmp_hash" in resp.keys() diff --git a/ansible_collections/arista/avd/tests/unit/plugins/filter/test_hide_passwords.py b/ansible_collections/arista/avd/tests/unit/plugins/filter/test_hide_passwords.py deleted file mode 100644 index 942c8fd8946..00000000000 --- a/ansible_collections/arista/avd/tests/unit/plugins/filter/test_hide_passwords.py +++ /dev/null @@ -1,41 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -from __future__ import absolute_import, division, print_function - -__metaclass__ = type - -from contextlib import nullcontext as does_not_raise - -import pytest - -from ansible_collections.arista.avd.plugins.filter.hide_passwords import FilterModule, hide_passwords -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError - -f = FilterModule() - -INPUT_HIDE_PASSWORDS = [ - pytest.param("dummy", False, "dummy", does_not_raise(), id="Not Removed"), - pytest.param("dummy", True, "", does_not_raise(), id="Removed"), - pytest.param("dummy", "wrong-type", None, pytest.raises(AristaAvdError), id="Removed"), -] - - -@pytest.mark.parametrize("value, hide_passwords_flag, expected, raise_context", INPUT_HIDE_PASSWORDS) -def test_hide_passwords(value, hide_passwords_flag, expected, raise_context): - """ - Test hide_passwords - """ - with raise_context: - assert hide_passwords(value, hide_passwords_flag) == expected - - -def test_hide_passwords_module(): - """ - Assert: - * hide_passwords - filters are part of the module - """ - resp = f.filters() - assert isinstance(resp, dict) - assert "hide_passwords" in resp.keys() diff --git a/containers/dev/.devcontainer/entrypoint.sh b/containers/dev/.devcontainer/entrypoint.sh index 4771f1fefbe..5bae915c88e 100644 --- a/containers/dev/.devcontainer/entrypoint.sh +++ b/containers/dev/.devcontainer/entrypoint.sh @@ -1,39 +1,23 @@ #!/bin/bash USERNAME=$(whoami) -AVD_COLLECTION_PATH="${HOME}/.ansible/collections/ansible_collections/arista/avd" CONTAINER_WORKSPACE=$(git rev-parse --show-toplevel) CONTAINER_WSF_AVD_PATH=${CONTAINER_WORKSPACE}/ansible_collections/arista/avd # only install collections if ansible binary is missing if [ -z "$(command -v ansible)" ]; then - # if collection is already mounted, it will be used to install the requirements - # there is no need to install AVD collection for this case as it's already mounted to the correct location - if [ -f ${AVD_COLLECTION_PATH}/requirements.txt ] && [ -f ${AVD_COLLECTION_PATH}/requirements-dev.txt ] ; then - sudo chown -R ${USERNAME} ${HOME}/.ansible # make sure mounted path is owned by container user and not root - ANSIBLE_CORE_VERSION=$(cat ${AVD_COLLECTION_PATH}/requirements-dev.txt | grep ansible-core) # if env variables are set - use git - elif ! [ -z "${AVD_GITHUB_REPO}" ] && ! [ -z "${AVD_BRANCH_NAME}" ]; then - ANSIBLE_CORE_VERSION=$(curl -s https://raw.githubusercontent.com/${AVD_GITHUB_REPO}/${AVD_BRANCH_NAME}/ansible_collections/arista/avd/requirements-dev.txt | grep ansible-core) + if ! [ -z "${AVD_GITHUB_REPO}" ] && ! [ -z "${AVD_BRANCH_NAME}" ]; then AVD_INSTALL_PATH="git+https://github.com/${AVD_GITHUB_REPO}.git#/ansible_collections/arista/avd/,${AVD_BRANCH_NAME}" - # In some cases AVD can not be correctly mounted, for ex. when running dev container as Codespace - # In that case if collection is available in the container workspace, it will be installed from there + PYAVD_INSTALL_LOCATION="git+https://github.com/${AVD_GITHUB_REPO}.git@${AVD_BRANCH_NAME}#subdirectory=python-avd" + pip install "pyavd[ansible] @ ${PYAVD_INSTALL_LOCATION}" + ansible-galaxy collection install --force ${AVD_INSTALL_PATH} + # otherwise install requirements and collection from container workspace elif [ -f ${CONTAINER_WSF_AVD_PATH}/requirements.txt ] && [ -f ${CONTAINER_WSF_AVD_PATH}/requirements-dev.txt ] ; then - ANSIBLE_CORE_VERSION=$(cat ${CONTAINER_WSF_AVD_PATH}/requirements-dev.txt | grep ansible-core) - AVD_INSTALL_PATH="${CONTAINER_WSF_AVD_PATH}/" - fi - - # install ansible core and requirements - if ! [ -z "${ANSIBLE_CORE_VERSION}" ]; then - pip3 install "${ANSIBLE_CORE_VERSION}" - if ! [ -z "${AVD_INSTALL_PATH}" ]; then - ansible-galaxy collection install --force ${AVD_INSTALL_PATH} - else - # if collection was mounted and not installed - add requirements - ansible-galaxy collection install -r ${AVD_COLLECTION_PATH}/collections.yml - fi - pip3 install -r ${AVD_COLLECTION_PATH}/requirements.txt -r ${AVD_COLLECTION_PATH}/requirements-dev.txt + # use editable install for requirements + pip install -r ${CONTAINER_WSF_AVD_PATH}/requirements-dev.txt -r ${CONTAINER_WSF_AVD_PATH}/requirements.txt + ansible-galaxy collection install --force ${CONTAINER_WSF_AVD_PATH} fi # if ansible installation failed for whatever reason - raise an error diff --git a/containers/universal/.devcontainer/Dockerfile b/containers/universal/.devcontainer/Dockerfile index 1ede90bc49e..4d3e7428700 100644 --- a/containers/universal/.devcontainer/Dockerfile +++ b/containers/universal/.devcontainer/Dockerfile @@ -3,7 +3,7 @@ ARG FROM_VARIANT FROM ${FROM_IMAGE}:${FROM_VARIANT} -ARG ANSIBLE_CORE_VERSION +ARG PYAVD_INSTALL_LOCATION ARG ANSIBLE_INSTALL_LOCATION ARG USERNAME @@ -11,8 +11,7 @@ ARG USERNAME USER ${USERNAME} ENV PATH=$PATH:/home/${USERNAME}/.local/bin # Install Ansible AVD collection. -RUN pip3 install "${ANSIBLE_CORE_VERSION}" \ +RUN pip install "pyavd[ansible] @ ${PYAVD_INSTALL_LOCATION}" \ && ansible-galaxy collection install ${ANSIBLE_INSTALL_LOCATION} \ - && pip3 install -r /home/${USERNAME}/.ansible/collections/ansible_collections/arista/avd/requirements.txt \ # install community.general to support callback plugins in ansible.cfg, etc. && ansible-galaxy collection install community.general diff --git a/containers/universal/.devcontainer/devcontainer.json b/containers/universal/.devcontainer/devcontainer.json index a7a51b83d12..a75560286db 100644 --- a/containers/universal/.devcontainer/devcontainer.json +++ b/containers/universal/.devcontainer/devcontainer.json @@ -8,6 +8,7 @@ "FROM_IMAGE": "${localEnv:FROM_IMAGE}", "FROM_VARIANT": "${localEnv:FROM_VARIANT}", "ANSIBLE_INSTALL_LOCATION": "${localEnv:ANSIBLE_INSTALL_LOCATION}", + "PYAVD_INSTALL_LOCATION": "${localEnv:PYAVD_INSTALL_LOCATION}", "ANSIBLE_CORE_VERSION": "${localEnv:ANSIBLE_CORE_VERSION}", "USERNAME": "${localEnv:USERNAME}" } diff --git a/development/Makefile b/development/Makefile deleted file mode 100644 index 8b56a7f7bdf..00000000000 --- a/development/Makefile +++ /dev/null @@ -1,145 +0,0 @@ -# Force BASH as default Makefile shell -# Required to use soruce -SHELL := /bin/bash -# AVD Shell container information -CONTAINER_NAME = avdteam/base -DOCKER_TAG ?= 3.8-v2.0 -CONTAINER = $(CONTAINER_NAME):$(DOCKER_TAG) -# Vscode container information -VSCODE_CONTAINER_NAME ?= avdteam/vscode -VSCODE_DOCKER_TAG ?= latest -VSCODE_CONTAINER = $(VSCODE_CONTAINER_NAME):$(VSCODE_DOCKER_TAG) -# VScode listen port exposed on host. -# To change it: make vscode VSCODE_PORT= -VSCODE_PORT ?= 8080 -# Path to compose stack -- should not be changed -COMPOSE_FILE ?= avd/development/docker-compose.yml -COMPOSE_ENV_FILE ?= avd/development/docker-stack.env -# Option to pass custom requirements and custom ansible version to provision in container -PIP_REQ ?= -ANSIBLE_VERSION ?= -# Current position -HOME_DIR = $(shell pwd) -# User ID to allow easy file share between container and host -UID ?= $(shell id -u) -# GID is unset by default as most of users are on Macos with a GID already used in container (20) -# If need to be set: make run GID=< GID of your user > -GID ?= -# User configured on container side -DOCKER_USER ?= avd -# Git Information to use with container to configure remote user -GIT_USERNAME ?= $(shell git config --get user.name) -GIT_EMAIL ?= $(shell git config --get user.email) -MUFFET_TIMEOUT ?= 60 -# Container name to -WEBDOC_ID ?= avd - -.PHONY: help -help: ## Display help message - @grep -E '^[0-9a-zA-Z_-]+\.*[0-9a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' - -############################################################################### -# docker containers target # -############################################################################### - -.PHONY: update -update: ## Get latest version of AVD runner and MKDOCs server - docker pull $(CONTAINER_NAME):$(DOCKER_TAG) && \ - docker-compose -f avd/development/docker-compose.yml pull - -.PHONY: run -run: ## Run avd container - docker pull $(CONTAINER) && \ - docker run --rm -it \ - -e AVD_REQUIREMENTS=$(PIP_REQ) \ - -e AVD_ANSIBLE=$(ANSIBLE_VERSION) \ - -e AVD_UID=$(UID) \ - -e AVD_GID=$(GID) \ - -e AVD_GIT_USER="$(GIT_USERNAME)" \ - -e AVD_GIT_EMAIL="$(GIT_EMAIL)" \ - -v /var/run/docker.sock:/var/run/docker.sock \ - -v $(HOME_DIR)/:/projects \ - -v $(HOME)/.ssh:/home/avd/.ssh/ \ - -v /etc/hosts:/etc/hosts $(CONTAINER) - -.PHONY: vscode -vscode: ## Run a VSCODE container - docker run --rm -it -d \ - -e AVD_GIT_USER="$(GIT_USERNAME)" \ - -e AVD_GIT_EMAIL="$(GIT_EMAIL)" \ - -v ${PWD}/:/home/avd/arista-ansible \ - -v /var/run/docker.sock:/var/run/docker.sock \ - -v $(HOME)/.ssh:/home/avd/.ssh/ \ - -p $(VSCODE_PORT):8080 \ - $(VSCODE_CONTAINER) - @echo "---------------" - @echo " INFORMATION" - @echo "---------------" - @echo "VScode for AVD: http://127.0.0.1:$(VSCODE_PORT)/?folder=/home/avd/arista-ansible" - -.PHONY: clean -clean: ## Remove avd image from local repository - docker rmi $(CONTAINER_NAME):$(DOCKER_TAG) - -.PHONY: start -start: ## Start docker compose stack to develop with AVD and CVP collection - set -a && \ - source $(COMPOSE_ENV_FILE) && \ - docker-compose -f $(COMPOSE_FILE) pull && \ - docker-compose -f $(COMPOSE_FILE) up -d - @echo "---------------" - @echo " INFORMATION" - @echo "---------------" - @echo " * Webserver for AVD: http://127.0.0.1:8000" - @echo " * Webserver for CVP: http://127.0.0.1:8001" - @echo " * Ansible shell: make shell" - @echo "---------------" - docker-compose -f $(COMPOSE_FILE) exec -u $(DOCKER_USER) ansible zsh - -.PHONY: stop -stop: ## Stop docker-compose stack - docker-compose -f $(COMPOSE_FILE) kill && docker-compose -f $(COMPOSE_FILE) rm -f - -.PHONY: shell -shell: ## Run a shell attached to ansible container - docker-compose -f $(COMPOSE_FILE) exec -u $(DOCKER_USER) ansible zsh - -.PHONY: ansible-upgrade -ansible-upgrade: ## Run a shell attached to ansible container - docker-compose -f $(COMPOSE_FILE) exec -u $(DOCKER_USER) ansible pip install --user --upgrade ansible==$(ANSIBLE_VERSION) - -.PHONY: restart -restart: stop start ## Stop and Start docker-compose stack - -.PHONY: reload -reload: ## Reload HTTP container available in docker-compose stack - docker-compose -f $(COMPOSE_FILE) restart webdoc_$(WEBDOC_ID) - -.PHONY: reload-all -reload-all: ## Reload HTTP container available in docker-compose stack - docker-compose -f $(COMPOSE_FILE) restart webdoc_avd - docker-compose -f $(COMPOSE_FILE) restart webdoc_cvp - -############################################################################### -# Documentation target # -############################################################################### - -.PHONY: check-404 -check-404: check-avd-404 check-cvp-404 ## Check local 404 links in both AVD and CVP documentation - -.PHONY: check-avd-404 -check-avd-404: ## Check local 404 links for AVD documentation - docker run --rm --network container:webdoc_avd raviqqe/muffet:1.5.7 http://127.0.0.1:8000 -e ".*fonts.gstatic.com.*" -e ".*edit.*" -f --limit-redirections=3 --timeout=$(MUFFET_TIMEOUT) - -.PHONY: check-cvp-404 -check-cvp-404: ## Check local 404 links for AVD documentation - docker run --rm --network container:webdoc_cvp raviqqe/muffet:1.5.7 http://127.0.0.1:8000 -e ".*fonts.gstatic.com.*" -e ".*edit.*" -f --limit-redirections=3 --timeout=$(MUFFET_TIMEOUT) - -############################################################################### -# Misc Target # -############################################################################### - -.PHONY: refresh -refresh: ## Refresh Makefile with new version from AVD - cp avd/development/Makefile Makefile - @echo "Makefile updated from AVD repository" diff --git a/development/README.md b/development/README.md deleted file mode 100644 index 9b47eebafb8..00000000000 --- a/development/README.md +++ /dev/null @@ -1,7 +0,0 @@ - - -Current page has moved to [documentation website](https://www.avd.sh/en/latest/docs/contributing/) diff --git a/development/docker-compose.yml b/development/docker-compose.yml index 9300bc2123e..c85c2638164 100644 --- a/development/docker-compose.yml +++ b/development/docker-compose.yml @@ -1,18 +1,5 @@ version: "3" services: - ansible: - image: avdteam/base:3.8-v2.0 - container_name: ansible_avd - environment: - - AVD_UID=${AVD_UID} - - AVD_GIT_USER=${GIT_USER} - - AVD_GIT_EMAIL=${GIT_EMAIL} - volumes: - - ./../../:/projects:delegated - - /var/run/docker.sock:/var/run/docker.sock - - ${HOME}/.gitconfig:/home/avd/.gitconfig - - ${HOME}/.ssh:/home/avd/.ssh/ - command: [ "/bin/sh", "-c", "while true; do sleep 30; done;" ] webdoc_avd: image: python:3.11.0-alpine3.17 diff --git a/development/docker-stack.env b/development/docker-stack.env deleted file mode 100644 index 2b18758e007..00000000000 --- a/development/docker-stack.env +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash -export AVD_UID=$(id -u) -export GIT_USER=$(git config --get user.name) -export GIT_EMAIL=$(git config --get user.email) diff --git a/development/install.sh b/development/install.sh deleted file mode 100755 index 7a8749a331e..00000000000 --- a/development/install.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -# Arista Validated Design installation script -# -# See https://www.avd.sh for the installation steps. -# -# This script is meant for quick & easy install via: -# $ curl -fsSL https://get.avd.sh -o get-avd.sh -# $ sh get-avd.sh -# -# NOTE: Make sure to verify the contents of the script -# you downloaded matches the contents of install.sh -# located at https://github.com/arista-netdevops-community/avd-install -# before executing. -# - -echo "Script has moved to https://get.avd.sh" -echo "to install AVD, please use: curl -fsSL https://get.avd.sh | sh" diff --git a/development/requirements-dev.txt b/development/requirements-dev.txt deleted file mode 120000 index bcfc958b660..00000000000 --- a/development/requirements-dev.txt +++ /dev/null @@ -1 +0,0 @@ -../ansible_collections/arista/avd/requirements-dev.txt \ No newline at end of file diff --git a/development/requirements.txt b/development/requirements.txt deleted file mode 120000 index 430d6855142..00000000000 --- a/development/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -../ansible_collections/arista/avd/requirements.txt \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index 490b146ea8f..2dad5612b3e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -3,6 +3,9 @@ site_name: Arista AVD site_author: Arista Ansible Team site_description: Arista Validated Designs documentation copyright: Copyright © 2019 - 2023 Arista Networks +strict: true +exclude_docs: | + /README.md # Repository information repo_name: AVD on Github @@ -128,7 +131,7 @@ markdown_extensions: # TOC docs_dir: ansible_collections/arista/avd/ nav: - - Home: README.md + - Home: index.md - Getting Started: - Introduction to Ansible and AVD: docs/getting-started/intro-to-ansible-and-avd.md - Examples: @@ -164,7 +167,7 @@ nav: - eos_config_deploy_eapi: roles/eos_config_deploy_eapi/README.md - eos_validate_state: - Overview: roles/eos_validate_state/README.md - - ANTA Preview: roles/eos_validate_state/ANTA-Preview.md + - ANTA Integration: roles/eos_validate_state/anta_integration.md - eos_snapshot: roles/eos_snapshot/README.md - dhcp_provisioner: roles/dhcp_provisioner/README.md - build_output_folders: roles/build_output_folders/README.md @@ -172,11 +175,8 @@ nav: - Ansible Collection Plugins: docs/plugins/ - Contributing to AVD: - Overview: docs/contribution/overview.md - - Setup Environment: docs/contribution/setup-environment.md - - Git Installation: docs/contribution/setup-git.md - - Getting Started: docs/contribution/getting-started.md + - Development Tooling: docs/contribution/development-tooling.md - Code Style: docs/contribution/style-guide.md - - Development Tips & Tricks: docs/contribution/development.md - Validation of Input Variables: docs/contribution/input-variable-validation.md - EOS Designs internal notes: docs/contribution/eos_designs_internal_notes.md - External Resources: @@ -185,6 +185,7 @@ nav: - Release Notes: docs/release-notes/4.x.x.md - Porting Guide: docs/porting-guides/4.x.x.md - PyAVD: docs/pyavd.md + - Versioning: docs/semantic-versioning.md - AVD Dev Containers: - Overview: docs/containers/overview.md - About: diff --git a/pylintrc b/pylintrc index e59f227123b..164564b0dc7 100644 --- a/pylintrc +++ b/pylintrc @@ -1,131 +1,34 @@ -# Configuration applied to collection by ansible-test -# https://github.com/ansible/ansible/blob/devel/test/lib/ansible_test/_data/sanity/pylint/config/collection.cfg - [MASTER] ignore-paths= + # We will Pylint for ansible_collections separately since it uses it's own pylintrc in the collection root. + ansible_collections, # The cv_client api is generated from proto files, so it should not be linted. - ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/ + python-avd/pyavd/_cv/api [MESSAGES CONTROL] disable= - abstract-method, - access-member-before-definition, - arguments-differ, - assignment-from-no-return, - assignment-from-none, attribute-defined-outside-init, - bad-indentation, - bad-mcs-classmethod-argument, - broad-except, - c-extension-no-member, - cell-var-from-loop, - chained-comparison, - comparison-with-callable, - consider-iterating-dictionary, - consider-merging-isinstance, - consider-using-dict-comprehension, - consider-using-enumerate, - consider-using-get, - consider-using-in, - consider-using-set-comprehension, - consider-using-ternary, - deprecated-method, - deprecated-module, - eval-used, - exec-used, expression-not-assigned, fixme, - function-redefined, global-statement, - global-variable-undefined, import-error, - import-self, inconsistent-return-statements, - invalid-envvar-default, invalid-name, - invalid-sequence-index, - keyword-arg-before-vararg, - len-as-condition, line-too-long, - literal-comparison, - locally-disabled, - method-hidden, missing-docstring, - no-else-raise, - no-else-return, no-member, - no-name-in-module, - no-value-for-parameter, - non-iterator-returned, - not-a-mapping, - not-an-iterable, - not-callable, - pointless-statement, pointless-string-statement, - possibly-unused-variable, protected-access, - redefined-argument-from-local, redefined-builtin, redefined-outer-name, - reimported, - relative-beyond-top-level, # https://github.com/PyCQA/pylint/issues/2967 - signature-differs, - simplifiable-if-expression, - simplifiable-if-statement, - subprocess-popen-preexec-fn, - super-init-not-called, - superfluous-parens, too-few-public-methods, too-many-ancestors, too-many-arguments, - too-many-boolean-expressions, too-many-branches, - too-many-function-args, too-many-instance-attributes, - too-many-lines, too-many-locals, too-many-nested-blocks, too-many-public-methods, too-many-return-statements, too-many-statements, - trailing-comma-tuple, - trailing-comma-tuple, - try-except-raise, - unbalanced-tuple-unpacking, - undefined-loop-variable, - unexpected-keyword-arg, - ungrouped-imports, - unidiomatic-typecheck, - unnecessary-pass, - unsubscriptable-object, - unsupported-assignment-operation, - unsupported-delete-operation, - unsupported-membership-test, - unused-argument, - unused-import, - unused-variable, - used-before-assignment, - useless-object-inheritance, - useless-return, - useless-super-delegation, - wrong-import-order, wrong-import-position, - -[BASIC] -bad-names=foo, - bar, - baz, - toto, - tutu, - tata, - _, - -good-names=i, - j, - k, - ex, - Run, - -[TYPECHECK] -ignored-modules= - _MovedItems, diff --git a/pyproject.toml b/pyproject.toml index ba5da727276..eb07b591e09 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,12 +1,12 @@ [tool.black] line-length = 160 -force-exclude = '''ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/.*''' +force-exclude = '''python-avd/pyavd/_cv/api/.*''' [tool.isort] extend_skip_glob = [ - "ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/**/*" + "python-avd/pyavd/_cv/api/**/*" ] profile = "black" diff --git a/python-avd/.gitignore b/python-avd/.gitignore index 781f84d2652..d44ae8b1621 100644 --- a/python-avd/.gitignore +++ b/python-avd/.gitignore @@ -6,9 +6,6 @@ __pycache__/ /tests/artifacts/ /pyavd.egg-info/ /pyavd/eos_cli_config_gen.templates.zip -/pyavd/j2cache/ -/pyavd/LICENSE -/pyavd/vendor/ -/pyavd/version.py *.prof /site/ +/pyavd/_eos_cli_config_gen/j2templates/compiled_templates diff --git a/python-avd/Makefile b/python-avd/Makefile index d1611d1a951..a232b12158d 100644 --- a/python-avd/Makefile +++ b/python-avd/Makefile @@ -1,16 +1,8 @@ CURRENT_DIR = $(shell pwd) -PACKAGE_DIR = pyavd ANSIBLE_AVD_DIR ?= .. -VENDOR = vendor -VENDOR_DIR = $(PACKAGE_DIR)/$(VENDOR) -VENDOR_IMPORT = $(PACKAGE_DIR).$(VENDOR) -J2_DIR = $(VENDOR_DIR)/j2 TESTS_ARTIFACTS = $(CURRENT_DIR)/tests/pyavd/artifacts -TOOLS_DIR = $(PACKAGE_DIR)/tools SCRIPTS_DIR = $(CURRENT_DIR)/scripts -EOS_CLI_CONFIG_GEN_TEMPLATE_DIR = $(VENDOR_DIR)/templates -SCHEMAS_DIR = $(VENDOR_DIR)/schemas -EOS_DESIGNS_MODULES_DIR = $(VENDOR_DIR)/eos_designs + # export PYTHONPATH=$(CURRENT_DIR) # Uncomment to test from source .PHONY: help @@ -18,15 +10,11 @@ help: ## Display help message @grep -E '^[0-9a-zA-Z_-]+\.*[0-9a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' .PHONY: dep -dep: copy-libs fix-libs ## Copy and Fix Ansible AVD python files +dep: compile-templates compile-schemas ## compile Jinja templates & AVD schemas .PHONY: test-dep test-dep: copy-test-data ## Copy and Fix Ansible AVD test files -.PHONY: clean -clean: ## Delete vendor dir - rm -rf $(VENDOR_DIR) - .PHONY: build build: ## Build pyavd package pip3 install build @@ -42,55 +30,10 @@ publish: ## Publish pyavd package to PyPI (build first) .PHONY: compile-schemas compile-schemas: - -.PHONY: copy-libs -copy-libs: ## Copy files from Ansible AVD collection - rm -rf $(VENDOR_DIR) - mkdir -p $(VENDOR_DIR) - mkdir -p $(J2_DIR) - mkdir -p $(SCHEMAS_DIR) - mkdir -p $(EOS_CLI_CONFIG_GEN_TEMPLATE_DIR) - mkdir -p $(EOS_DESIGNS_MODULES_DIR) - - cp $(ANSIBLE_AVD_DIR)/LICENSE $(PACKAGE_DIR)/LICENSE - cp -r $(ANSIBLE_AVD_DIR)/ansible_collections/arista/avd/plugins/plugin_utils/* $(VENDOR_DIR) - cp -r $(ANSIBLE_AVD_DIR)/ansible_collections/arista/avd/plugins/module_utils/* $(VENDOR_DIR) - cp -r $(ANSIBLE_AVD_DIR)/ansible_collections/arista/avd/plugins/filter $(J2_DIR) - cp -r $(ANSIBLE_AVD_DIR)/ansible_collections/arista/avd/plugins/test $(J2_DIR) - cp -r $(ANSIBLE_AVD_DIR)/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/* $(EOS_CLI_CONFIG_GEN_TEMPLATE_DIR) - rm -f $(EOS_CLI_CONFIG_GEN_TEMPLATE_DIR)/avd_schema_documentation.j2 - - cp -r $(ANSIBLE_AVD_DIR)/ansible_collections/arista/avd/roles/eos_designs/python_modules/* $(EOS_DESIGNS_MODULES_DIR)/ - mv $(VENDOR_DIR)/eos_designs_* $(EOS_DESIGNS_MODULES_DIR)/ - $(SCRIPTS_DIR)/build-schemas.py - cp $(ANSIBLE_AVD_DIR)/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/eos_cli_config_gen.schema.pickle $(SCHEMAS_DIR)/ - cp -r $(ANSIBLE_AVD_DIR)/ansible_collections/arista/avd/roles/eos_designs/schemas/eos_designs.schema.pickle $(SCHEMAS_DIR)/ - cp -r $(ANSIBLE_AVD_DIR)/ansible_collections/arista/avd/plugins/plugin_utils/schema/avd_meta_schema.pickle $(SCHEMAS_DIR)/ - -.PHONY: fix-libs -fix-libs: ## Fix/remove various Ansible specifics things from python files - rm -f $(VENDOR_DIR)/schema/avdschematools.py - rm -f $(VENDOR_DIR)/utils/yaml_dumper.py - rm -f $(VENDOR_DIR)/utils/yaml_loader.py - sed -i -e '/Yaml/d' $(VENDOR_DIR)/utils/__init__.py - find $(PACKAGE_DIR) -name '__pycache__' -exec rm -rf {} + - find $(PACKAGE_DIR) -name '*.py' -exec sed -i -e 's/^from __future__ import.*/from __future__ import annotations/g' {} + - find $(PACKAGE_DIR) -name '*.py' -exec sed -i -e '/^__metaclass__ = type/d' {} + - find $(PACKAGE_DIR) -name '*.py' -exec sed -i -e 's/from ansible.errors import /from $(VENDOR_IMPORT).errors import /g' {} + - find $(PACKAGE_DIR) -name '*.py' -exec sed -i -e 's/AnsibleFilterError/AristaAvdError/g' {} + - find $(PACKAGE_DIR) -name '*.py' -exec sed -i -e 's/AnsibleError/AristaAvdError/g' {} + - find $(PACKAGE_DIR) -name '*.py' -exec sed -i -e 's/AnsibleActionFail/AristaAvdError/g' {} + - find $(PACKAGE_DIR) -name '*.py' -exec sed -i -e 's/ansible_collections\.arista\.avd\.plugins\.plugin_utils\.schema\.avdschematools/pyavd.avd_schema_tools/g' {} + - find $(PACKAGE_DIR) -name '*.py' -exec sed -i -e 's/ansible_collections\.arista\.avd\.plugins\.plugin_utils\.eos_designs_shared_utils/$(VENDOR_IMPORT)\.eos_designs\.eos_designs_shared_utils/g' {} + - find $(PACKAGE_DIR) -name '*.py' -exec sed -i -e 's/ansible_collections\.arista\.avd\.plugins\.plugin_utils/$(VENDOR_IMPORT)/g' {} + - find $(PACKAGE_DIR) -name '*.py' -exec sed -i -e 's/ansible_collections\.arista\.avd\.plugins\.module_utils/$(VENDOR_IMPORT)/g' {} + - find $(PACKAGE_DIR) -name '*.py' -exec sed -i -e 's/ansible_collections\.arista\.avd\.plugins\.filter/$(VENDOR_IMPORT)\.j2\.filter/g' {} + - find $(PACKAGE_DIR) -name '*.py' -exec sed -i -e 's/ansible_collections\.arista\.avd\.roles\.eos_designs\.python_modules/$(VENDOR_IMPORT)\.eos_designs/g' {} + - find $(PACKAGE_DIR) -name '*.py' -exec sed -i -e 's/from ansible\.utils\.display/from $(VENDOR_IMPORT)\.utils\.display/g' {} + - - cp -r $(CURRENT_DIR)/vendor_overrides/* $(VENDOR_DIR)/ +.PHONY: compile-templates +compile-templates: $(SCRIPTS_DIR)/compile_templates.py .PHONY: copy-test-data @@ -105,7 +48,7 @@ copy-test-data: ## Copy inventory files from AVD collection Molecule scenario. ## Excluding prompt because the unsafe marker is lost during the export of hostvars. ## Excluding custom-templates since there is no jinja support in pyavd - ANSIBLE_COLLECTIONS_PATHS="..:/usr/share/ansible/collections" ansible-playbook \ + ANSIBLE_COLLECTIONS_PATH="..:/usr/share/ansible/collections" ansible-playbook \ --limit 'all:!prompt:!custom-templates' \ -i $(ANSIBLE_AVD_DIR)/ansible_collections/arista/avd/molecule/eos_cli_config_gen/inventory/hosts.ini \ $(SCRIPTS_DIR)/export_test_vars.yml \ @@ -120,7 +63,7 @@ copy-test-data: ## Copy inventory files from AVD collection Molecule scenario. ## EOS_DESIGNS - ANSIBLE_COLLECTIONS_PATHS="..:/usr/share/ansible/collections" ansible-playbook \ + ANSIBLE_COLLECTIONS_PATH="..:/usr/share/ansible/collections" ansible-playbook \ -i $(ANSIBLE_AVD_DIR)/ansible_collections/arista/avd/molecule/eos_designs_unit_tests/inventory/hosts.yml $(SCRIPTS_DIR)/export_test_vars.yml \ -e testdir=eos_designs_unit_tests \ -f 10 diff --git a/python-avd/pyavd/LICENSE b/python-avd/pyavd/LICENSE new file mode 100644 index 00000000000..4bb5ebb00f8 --- /dev/null +++ b/python-avd/pyavd/LICENSE @@ -0,0 +1,200 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2019 Arista Networks + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/python-avd/pyavd/__init__.py b/python-avd/pyavd/__init__.py index b44472dbc0b..ce3bef5959e 100644 --- a/python-avd/pyavd/__init__.py +++ b/python-avd/pyavd/__init__.py @@ -17,7 +17,7 @@ __author__ = "Arista Networks" __copyright__ = "Copyright 2023-2024 Arista Networks" __license__ = "Apache 2.0" -__version__ = "4.8.0.dev0" +__version__ = "4.10.0.dev0" __all__ = [ "get_avd_facts", diff --git a/python-avd/pyavd/_cv/Makefile b/python-avd/pyavd/_cv/Makefile new file mode 100644 index 00000000000..c095b949d36 --- /dev/null +++ b/python-avd/pyavd/_cv/Makefile @@ -0,0 +1,38 @@ +# Example to add experimental protos: +# EXTRA_EXTRA_DIRS="-I ~/go/src/arista/resources" EXTRA_EXTRA_PROTOS="~/go/src/arista/resources/arista/configlet.v1/configlet.proto ~/go/src/arista/resources/arista/configlet.v1/services.gen.proto" make +VENDORPATH=cloudvision-apis +EXTRA_PROTOS=${PWD}/extra_cv_protos/arista/swg.v1/swg.proto ${PWD}/extra_cv_protos/arista/swg.v1/services.gen.proto +EXTRA_DIRS=-I ${PWD}/extra_cv_protos +EXTRA_EXTRA_DIRS?= +EXTRA_EXTRA_PROTOS?= +DUMMY := $(shell \ + rm -rf $(VENDORPATH); \ + git clone --single-branch --branch trunk https://github.com/aristanetworks/cloudvision-apis.git $(VENDORPATH); \ +) + +APIPATH=api + +PYTHON ?= python3 + +ALL_PROTOS=$(shell find $(VENDORPATH) -name "*.proto") + +default: api + +.PHONY: help +help: ## Display help message + @grep -E '^[0-9a-zA-Z_-]+\.*[0-9a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' + +api-dir: + mkdir -p api + rm -rf ./api/* + touch ./api/__init__.py + +api-models: api-dir + $(PYTHON) -m grpc_tools.protoc -I $(VENDORPATH) $(EXTRA_DIRS) $(EXTRA_EXTRA_DIRS) --python_aristaproto_out=$(APIPATH) $(ALL_PROTOS) $(EXTRA_PROTOS) $(EXTRA_EXTRA_PROTOS) + +api: api-dir api-models ## Build/refresh gRPC bindings in ./api + @rm -rf $(VENDORPATH) + @pre-commit run insert-license --files $(shell find $(APIPATH)/ -name "*.py") || true + @echo "--- done" + @echo "If you got here, everything went well." + @echo "All the output above is just because we use pre-commit to insert licenses into the generated files." diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/README.txt b/python-avd/pyavd/_cv/README.txt similarity index 59% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/README.txt rename to python-avd/pyavd/_cv/README.txt index 881993b1c23..1d25d15a23a 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/README.txt +++ b/python-avd/pyavd/_cv/README.txt @@ -3,7 +3,6 @@ For now we will maintain it here, as only AVD components rely on it. ./api/ gRPC client bindings for CloudVision Resource APIs using aristaproto (pip3 install aristaproto[compiler]). ./client/ Mid level abstraction of the CloudVision API, to hide some of the suboptimal APIs. -./workflows/ High level workflow abstrations to be moved to pyavd once pyavd becomes a dependency of Ansible-AVD. +./extra_cv_protos/ Extra proto files inserted into the api during compilation. The APIs here are only supported for use by AVD. +./workflows/ High level workflow abstractions. Makefile Makefile to rebuild the ./api/ -mocked_classes.py Mocked aristaproto and grpclib. Required to pass ansible sanity tests. - Once things move away from the ansible collection this can be removed again. diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/__init__.py b/python-avd/pyavd/_cv/__init__.py similarity index 100% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/__init__.py rename to python-avd/pyavd/_cv/__init__.py diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/configstatus/__init__.py b/python-avd/pyavd/_cv/api/__init__.py similarity index 68% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/configstatus/__init__.py rename to python-avd/pyavd/_cv/api/__init__.py index e772bee41fe..b17ca7c745d 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/configstatus/__init__.py +++ b/python-avd/pyavd/_cv/api/__init__.py @@ -1,3 +1,3 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. +# Copyright (c) 2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/changecontrol/__init__.py b/python-avd/pyavd/_cv/api/arista/__init__.py similarity index 68% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/changecontrol/__init__.py rename to python-avd/pyavd/_cv/api/arista/__init__.py index e772bee41fe..b17ca7c745d 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/changecontrol/__init__.py +++ b/python-avd/pyavd/_cv/api/arista/__init__.py @@ -1,3 +1,3 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. +# Copyright (c) 2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/bugexposure/__init__.py b/python-avd/pyavd/_cv/api/arista/alert/__init__.py similarity index 68% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/bugexposure/__init__.py rename to python-avd/pyavd/_cv/api/arista/alert/__init__.py index e772bee41fe..b17ca7c745d 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/bugexposure/__init__.py +++ b/python-avd/pyavd/_cv/api/arista/alert/__init__.py @@ -1,3 +1,3 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. +# Copyright (c) 2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/alert/v1/__init__.py b/python-avd/pyavd/_cv/api/arista/alert/v1/__init__.py similarity index 63% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/alert/v1/__init__.py rename to python-avd/pyavd/_cv/api/arista/alert/v1/__init__.py index aaf429b42e7..155ddae5b4f 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/alert/v1/__init__.py +++ b/python-avd/pyavd/_cv/api/arista/alert/v1/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. +# Copyright (c) 2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. # Generated by the protocol buffer compiler. DO NOT EDIT! @@ -7,7 +7,10 @@ # This file has been @generated from dataclasses import dataclass -from datetime import datetime +from datetime import ( + datetime, + timedelta, +) from typing import ( TYPE_CHECKING, AsyncIterator, @@ -16,17 +19,9 @@ Optional, ) -try: - import aristaproto - import grpclib - from aristaproto.grpc.grpclib_server import ServiceBase -except ImportError: - HAS_ARISTAPROTO = False - from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_aristaproto as aristaproto - from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_grpclib as grpclib - ServiceBase = object -else: - HAS_ARISTAPROTO = True +import aristaproto +import grpclib +from aristaproto.grpc.grpclib_server import ServiceBase from .... import fmp as ___fmp__ from ... import ( @@ -330,6 +325,58 @@ class TemplateType(aristaproto.Enum): TEMPLATE_TYPE_ZOOM_MESSAGE is the key of the message template for sent Zoom messages """ + EMAIL_SINGLE_HTML = 14 + """ + TEMPLATE_TYPE_EMAIL_SINGLE_HTML is the key of the html template for sent emails when the + single alert per email option is selected + """ + + EMAIL_SINGLE_TEXT = 15 + """ + TEMPLATE_TYPE_EMAIL_SINGLE_TEXT is the key of the text template for sent emails when the + single alert per email option is selected + """ + + EMAIL_SINGLE_SUBJECT = 16 + """ + TEMPLATE_TYPE_EMAIL_SINGLE_SUBJECT is the key of the subject line template of a sent email + when the single alert per email option is selected + """ + + WEBHOOK_SINGLE = 17 + """ + TEMPLATE_TYPE_WEBHOOK_SINGLE is the key of the template for webhook message body when the + single_alert option is true + """ + + WEBHOOK_MULTIPLE = 18 + """ + TEMPLATE_TYPE_WEBHOOK_MULTIPLE is the key of the template for webhook message body when the + single_alert option is false + """ + + +class TemplateOutput(aristaproto.Enum): + """ + TemplateOutput is an enum of all of the possible output formats for templates + """ + + UNSPECIFIED = 0 + """TEMPLATE_OUTPUT_UNSPECIFIED is the unspecfied value.""" + + TEXT = 1 + """TEMPLATE_OUTPUT_TEXT indicates the the template outputs plain text.""" + + JSON = 2 + """TEMPLATE_OUTPUT_JSON indicates the the template outputs JSON.""" + + HTML = 3 + """ + TEMPLATE_OUTPUT_HTML indicates the the template outputs HTML. + This also indicates that "html/templates" will be used instead of "text/templates" so that + html characters are automatically escaped from input. + """ + @dataclass(eq=False, repr=False) class AlertConfig(aristaproto.Message): @@ -844,6 +891,16 @@ class SnmpSettings(aristaproto.Message): auth: "SnmpAuth" = aristaproto.message_field(5) """auth is optional authentication settings""" + engine_id: Optional[str] = aristaproto.message_field( + 6, wraps=aristaproto.TYPE_STRING + ) + """ + engine_id is the engine ID that will be used by the Alerter + This should be a hexadecimal string, colon separators between bytes will be accepted when + writing, but will be absent when reading + optional: if excluded or left blank, this will be automatically generated + """ + @dataclass(eq=False, repr=False) class SnmpAuth(aristaproto.Message): @@ -1076,6 +1133,11 @@ class Rule(aristaproto.Message): comment: Optional[str] = aristaproto.message_field(4, wraps=aristaproto.TYPE_STRING) """comment is a comment to include that will be displayed in the alert""" + suppress_for: timedelta = aristaproto.message_field(5) + """ + suppress_for is a time duration that a rule will be debounced for after being called + """ + @dataclass(eq=False, repr=False) class Matches(aristaproto.Message): @@ -1089,7 +1151,7 @@ class Matches(aristaproto.Message): """ severities is a list of severities to filter on, if an event does not have one of these severities, it will not match - Valid values are INFO, WARNING, ERROR and CRITICAL + Valid values are DEBUG, INFO, WARNING, ERROR and CRITICAL """ devices: "___fmp__.RepeatedString" = aristaproto.message_field(2) @@ -1766,6 +1828,62 @@ class DefaultTemplate(aristaproto.Message): Templates must not fail for any valid input """ + multi_alert: Optional[bool] = aristaproto.message_field( + 3, wraps=aristaproto.TYPE_BOOL + ) + """ + multi_alert is true if this template uses a multiple alert context and false if a single + alert context is used. + """ + + description: Optional[str] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_STRING + ) + """description is a description of the template.""" + + external_documentation: Optional[str] = aristaproto.message_field( + 5, wraps=aristaproto.TYPE_STRING + ) + """ + external_documentation is a url to any relevant external documentation, or "" if there is no + relevant documentation. + """ + + output_format: "TemplateOutput" = aristaproto.enum_field(6) + """ + output_format is the expected output format of this template + Any submitted template will be expected to output text with valid formatting for any input or + may fail validation. + """ + + display_name: Optional[str] = aristaproto.message_field( + 7, wraps=aristaproto.TYPE_STRING + ) + """ + display_name is the name that can be displayed to the user for this particular template type + """ + + +@dataclass(eq=False, repr=False) +class MetaResponse(aristaproto.Message): + time: datetime = aristaproto.message_field(1) + """ + Time holds the timestamp of the last item included in the metadata calculation. + """ + + type: "__subscriptions__.Operation" = aristaproto.enum_field(2) + """ + Operation indicates how the value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + count: Optional[int] = aristaproto.message_field(3, wraps=aristaproto.TYPE_UINT32) + """ + Count is the number of items present under the conditions of the request. + """ + @dataclass(eq=False, repr=False) class AlertRequest(aristaproto.Message): @@ -1836,6 +1954,48 @@ class AlertStreamResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class AlertBatchedStreamRequest(aristaproto.Message): + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each Alert at end. + * Each Alert response is fully-specified (all fields set). + * start: Returns the state of each Alert at start, followed by updates until now. + * Each Alert response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each Alert at start, followed by updates + until end. + * Each Alert response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class AlertBatchedStreamResponse(aristaproto.Message): + responses: List["AlertStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + @dataclass(eq=False, repr=False) class AlertConfigRequest(aristaproto.Message): time: datetime = aristaproto.message_field(2) @@ -1905,6 +2065,48 @@ class AlertConfigStreamResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class AlertConfigBatchedStreamRequest(aristaproto.Message): + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each AlertConfig at end. + * Each AlertConfig response is fully-specified (all fields set). + * start: Returns the state of each AlertConfig at start, followed by updates until now. + * Each AlertConfig response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each AlertConfig at start, followed by updates + until end. + * Each AlertConfig response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class AlertConfigBatchedStreamResponse(aristaproto.Message): + responses: List["AlertConfigStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + @dataclass(eq=False, repr=False) class AlertConfigSetRequest(aristaproto.Message): value: "AlertConfig" = aristaproto.message_field(1) @@ -1933,10 +2135,10 @@ class AlertConfigSetResponse(aristaproto.Message): @dataclass(eq=False, repr=False) -class TemplateConfigRequest(aristaproto.Message): +class DefaultTemplateRequest(aristaproto.Message): key: "TemplateKey" = aristaproto.message_field(1) """ - Key uniquely identifies a TemplateConfig instance to retrieve. + Key uniquely identifies a DefaultTemplate instance to retrieve. This value must be populated. """ @@ -1948,8 +2150,8 @@ class TemplateConfigRequest(aristaproto.Message): @dataclass(eq=False, repr=False) -class TemplateConfigResponse(aristaproto.Message): - value: "TemplateConfig" = aristaproto.message_field(1) +class DefaultTemplateResponse(aristaproto.Message): + value: "DefaultTemplate" = aristaproto.message_field(1) """ Value is the value requested. This structure will be fully-populated as it exists in the datastore. If @@ -1960,12 +2162,41 @@ class TemplateConfigResponse(aristaproto.Message): time: datetime = aristaproto.message_field(2) """ Time carries the (UTC) timestamp of the last-modification of the - TemplateConfig instance in this response. + DefaultTemplate instance in this response. """ @dataclass(eq=False, repr=False) -class TemplateConfigStreamRequest(aristaproto.Message): +class DefaultTemplateSomeRequest(aristaproto.Message): + keys: List["TemplateKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class DefaultTemplateSomeResponse(aristaproto.Message): + value: "DefaultTemplate" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + +@dataclass(eq=False, repr=False) +class DefaultTemplateStreamRequest(aristaproto.Message): time: "__time__.TimeBounds" = aristaproto.message_field(3) """ TimeRange allows limiting response data to within a specified time window. @@ -1973,13 +2204,13 @@ class TemplateConfigStreamRequest(aristaproto.Message): For GetAll, the fields start and end can be used as follows: - * end: Returns the state of each TemplateConfig at end. - * Each TemplateConfig response is fully-specified (all fields set). - * start: Returns the state of each TemplateConfig at start, followed by updates until now. - * Each TemplateConfig response at start is fully-specified, but updates may be partial. - * start and end: Returns the state of each TemplateConfig at start, followed by updates + * end: Returns the state of each DefaultTemplate at end. + * Each DefaultTemplate response is fully-specified (all fields set). + * start: Returns the state of each DefaultTemplate at start, followed by updates until now. + * Each DefaultTemplate response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each DefaultTemplate at start, followed by updates until end. - * Each TemplateConfig response at start is fully-specified, but updates until end may + * Each DefaultTemplate response at start is fully-specified, but updates until end may be partial. This field is not allowed in the Subscribe RPC. @@ -1987,8 +2218,8 @@ class TemplateConfigStreamRequest(aristaproto.Message): @dataclass(eq=False, repr=False) -class TemplateConfigStreamResponse(aristaproto.Message): - value: "TemplateConfig" = aristaproto.message_field(1) +class DefaultTemplateStreamResponse(aristaproto.Message): + value: "DefaultTemplate" = aristaproto.message_field(1) """ Value is a value deemed relevant to the initiating request. This structure will always have its key-field populated. Which other fields are @@ -1996,11 +2227,13 @@ class TemplateConfigStreamResponse(aristaproto.Message): """ time: datetime = aristaproto.message_field(2) - """Time holds the timestamp of this TemplateConfig's last modification.""" + """ + Time holds the timestamp of this DefaultTemplate's last modification. + """ type: "__subscriptions__.Operation" = aristaproto.enum_field(3) """ - Operation indicates how the TemplateConfig value in this response should be considered. + Operation indicates how the DefaultTemplate value in this response should be considered. Under non-subscribe requests, this value should always be INITIAL. In a subscription, once all initial data is streamed and the client begins to receive modification updates, you should not see INITIAL again. @@ -2008,89 +2241,296 @@ class TemplateConfigStreamResponse(aristaproto.Message): @dataclass(eq=False, repr=False) -class TemplateConfigSetRequest(aristaproto.Message): - value: "TemplateConfig" = aristaproto.message_field(1) - """ - TemplateConfig carries the value to set into the datastore. - See the documentation on the TemplateConfig struct for which fields are required. +class DefaultTemplateBatchedStreamRequest(aristaproto.Message): + time: "__time__.TimeBounds" = aristaproto.message_field(3) """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + For GetAll, the fields start and end can be used as follows: -@dataclass(eq=False, repr=False) -class TemplateConfigSetResponse(aristaproto.Message): - value: "TemplateConfig" = aristaproto.message_field(1) - """ - Value carries all the values given in the TemplateConfigSetRequest as well - as any server-generated values. - """ + * end: Returns the state of each DefaultTemplate at end. + * Each DefaultTemplate response is fully-specified (all fields set). + * start: Returns the state of each DefaultTemplate at start, followed by updates until now. + * Each DefaultTemplate response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each DefaultTemplate at start, followed by updates + until end. + * Each DefaultTemplate response at start is fully-specified, but updates until end may + be partial. - time: datetime = aristaproto.message_field(2) + This field is not allowed in the Subscribe RPC. """ - Time indicates the (UTC) timestamp at which the system recognizes the - creation. The only guarantees made about this timestamp are: - - it is after the time the request was received - - a time-ranged query with StartTime==CreatedAt will include this instance. + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. """ @dataclass(eq=False, repr=False) -class TemplateConfigSetSomeRequest(aristaproto.Message): - values: List["TemplateConfig"] = aristaproto.message_field(1) +class DefaultTemplateBatchedStreamResponse(aristaproto.Message): + responses: List["DefaultTemplateStreamResponse"] = aristaproto.message_field(1) """ - value contains a list of TemplateConfig values to write. - It is possible to provide more values than can fit within either: - - the maxiumum send size of the client - - the maximum receive size of the server - If this error occurs you must reduce the number of values sent. - See gRPC "maximum message size" documentation for more information. + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). """ @dataclass(eq=False, repr=False) -class TemplateConfigSetSomeResponse(aristaproto.Message): +class TemplateConfigRequest(aristaproto.Message): key: "TemplateKey" = aristaproto.message_field(1) - error: str = aristaproto.string_field(2) - + """ + Key uniquely identifies a TemplateConfig instance to retrieve. + This value must be populated. + """ -@dataclass(eq=False, repr=False) -class TemplateConfigDeleteRequest(aristaproto.Message): - key: "TemplateKey" = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) """ - Key indicates which TemplateConfig instance to remove. - This field must always be set. + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. """ @dataclass(eq=False, repr=False) -class TemplateConfigDeleteResponse(aristaproto.Message): - key: "TemplateKey" = aristaproto.message_field(1) - """Key echoes back the key of the deleted TemplateConfig instance.""" +class TemplateConfigResponse(aristaproto.Message): + value: "TemplateConfig" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ time: datetime = aristaproto.message_field(2) """ - Time indicates the (UTC) timestamp at which the system recognizes the - deletion. The only guarantees made about this timestamp are: - - - it is after the time the request was received - - a time-ranged query with StartTime==DeletedAt will not include this instance. + Time carries the (UTC) timestamp of the last-modification of the + TemplateConfig instance in this response. """ @dataclass(eq=False, repr=False) -class TemplateConfigDeleteAllRequest(aristaproto.Message): - pass +class TemplateConfigSomeRequest(aristaproto.Message): + keys: List["TemplateKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ @dataclass(eq=False, repr=False) -class TemplateConfigDeleteAllResponse(aristaproto.Message): - type: "___fmp__.DeleteError" = aristaproto.enum_field(1) - """This describes the class of delete error.""" +class TemplateConfigSomeResponse(aristaproto.Message): + value: "TemplateConfig" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) - """This indicates the error message from the delete failure.""" - - key: "TemplateKey" = aristaproto.message_field(3) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + +@dataclass(eq=False, repr=False) +class TemplateConfigStreamRequest(aristaproto.Message): + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each TemplateConfig at end. + * Each TemplateConfig response is fully-specified (all fields set). + * start: Returns the state of each TemplateConfig at start, followed by updates until now. + * Each TemplateConfig response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each TemplateConfig at start, followed by updates + until end. + * Each TemplateConfig response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + +@dataclass(eq=False, repr=False) +class TemplateConfigStreamResponse(aristaproto.Message): + value: "TemplateConfig" = aristaproto.message_field(1) + """ + Value is a value deemed relevant to the initiating request. + This structure will always have its key-field populated. Which other fields are + populated, and why, depends on the value of Operation and what triggered this notification. + """ + + time: datetime = aristaproto.message_field(2) + """Time holds the timestamp of this TemplateConfig's last modification.""" + + type: "__subscriptions__.Operation" = aristaproto.enum_field(3) + """ + Operation indicates how the TemplateConfig value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + +@dataclass(eq=False, repr=False) +class TemplateConfigBatchedStreamRequest(aristaproto.Message): + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each TemplateConfig at end. + * Each TemplateConfig response is fully-specified (all fields set). + * start: Returns the state of each TemplateConfig at start, followed by updates until now. + * Each TemplateConfig response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each TemplateConfig at start, followed by updates + until end. + * Each TemplateConfig response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class TemplateConfigBatchedStreamResponse(aristaproto.Message): + responses: List["TemplateConfigStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + +@dataclass(eq=False, repr=False) +class TemplateConfigSetRequest(aristaproto.Message): + value: "TemplateConfig" = aristaproto.message_field(1) + """ + TemplateConfig carries the value to set into the datastore. + See the documentation on the TemplateConfig struct for which fields are required. + """ + + +@dataclass(eq=False, repr=False) +class TemplateConfigSetResponse(aristaproto.Message): + value: "TemplateConfig" = aristaproto.message_field(1) + """ + Value carries all the values given in the TemplateConfigSetRequest as well + as any server-generated values. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the (UTC) timestamp at which the system recognizes the + creation. The only guarantees made about this timestamp are: + + - it is after the time the request was received + - a time-ranged query with StartTime==CreatedAt will include this instance. + """ + + +@dataclass(eq=False, repr=False) +class TemplateConfigSetSomeRequest(aristaproto.Message): + values: List["TemplateConfig"] = aristaproto.message_field(1) + """ + value contains a list of TemplateConfig values to write. + It is possible to provide more values than can fit within either: + - the maxiumum send size of the client + - the maximum receive size of the server + If this error occurs you must reduce the number of values sent. + See gRPC "maximum message size" documentation for more information. + """ + + +@dataclass(eq=False, repr=False) +class TemplateConfigSetSomeResponse(aristaproto.Message): + key: "TemplateKey" = aristaproto.message_field(1) + error: str = aristaproto.string_field(2) + + +@dataclass(eq=False, repr=False) +class TemplateConfigDeleteRequest(aristaproto.Message): + key: "TemplateKey" = aristaproto.message_field(1) + """ + Key indicates which TemplateConfig instance to remove. + This field must always be set. + """ + + +@dataclass(eq=False, repr=False) +class TemplateConfigDeleteResponse(aristaproto.Message): + key: "TemplateKey" = aristaproto.message_field(1) + """Key echoes back the key of the deleted TemplateConfig instance.""" + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the (UTC) timestamp at which the system recognizes the + deletion. The only guarantees made about this timestamp are: + + - it is after the time the request was received + - a time-ranged query with StartTime==DeletedAt will not include this instance. + """ + + +@dataclass(eq=False, repr=False) +class TemplateConfigDeleteSomeRequest(aristaproto.Message): + keys: List["TemplateKey"] = aristaproto.message_field(1) + """key contains a list of TemplateConfig keys to delete""" + + +@dataclass(eq=False, repr=False) +class TemplateConfigDeleteSomeResponse(aristaproto.Message): + """ + TemplateConfigDeleteSomeResponse is only sent when there is an error. + """ + + key: "TemplateKey" = aristaproto.message_field(1) + error: str = aristaproto.string_field(2) + + +@dataclass(eq=False, repr=False) +class TemplateConfigDeleteAllRequest(aristaproto.Message): + pass + + +@dataclass(eq=False, repr=False) +class TemplateConfigDeleteAllResponse(aristaproto.Message): + type: "___fmp__.DeleteError" = aristaproto.enum_field(1) + """ + This describes the class of delete error. + A DeleteAllResponse is only sent when there is an error. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """This indicates the error message from the delete failure.""" + + key: "TemplateKey" = aristaproto.message_field(3) """ This is the key of the TemplateConfig instance that failed to be deleted. """ @@ -2117,6 +2557,24 @@ async def get_one( metadata=metadata, ) + async def get_all( + self, + alert_stream_request: "AlertStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["AlertStreamResponse"]: + async for response in self._unary_stream( + "/arista.alert.v1.AlertService/GetAll", + alert_stream_request, + AlertStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def subscribe( self, alert_stream_request: "AlertStreamRequest", @@ -2135,6 +2593,60 @@ async def subscribe( ): yield response + async def subscribe_meta( + self, + alert_stream_request: "AlertStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.alert.v1.AlertService/SubscribeMeta", + alert_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all_batched( + self, + alert_batched_stream_request: "AlertBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["AlertBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.alert.v1.AlertService/GetAllBatched", + alert_batched_stream_request, + AlertBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + alert_batched_stream_request: "AlertBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["AlertBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.alert.v1.AlertService/SubscribeBatched", + alert_batched_stream_request, + AlertBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + class AlertConfigServiceStub(aristaproto.ServiceStub): async def get_one( @@ -2154,6 +2666,24 @@ async def get_one( metadata=metadata, ) + async def get_all( + self, + alert_config_stream_request: "AlertConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["AlertConfigStreamResponse"]: + async for response in self._unary_stream( + "/arista.alert.v1.AlertConfigService/GetAll", + alert_config_stream_request, + AlertConfigStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def subscribe( self, alert_config_stream_request: "AlertConfigStreamRequest", @@ -2172,6 +2702,24 @@ async def subscribe( ): yield response + async def subscribe_meta( + self, + alert_config_stream_request: "AlertConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.alert.v1.AlertConfigService/SubscribeMeta", + alert_config_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def set( self, alert_config_set_request: "AlertConfigSetRequest", @@ -2189,6 +2737,186 @@ async def set( metadata=metadata, ) + async def get_all_batched( + self, + alert_config_batched_stream_request: "AlertConfigBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["AlertConfigBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.alert.v1.AlertConfigService/GetAllBatched", + alert_config_batched_stream_request, + AlertConfigBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + alert_config_batched_stream_request: "AlertConfigBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["AlertConfigBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.alert.v1.AlertConfigService/SubscribeBatched", + alert_config_batched_stream_request, + AlertConfigBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + +class DefaultTemplateServiceStub(aristaproto.ServiceStub): + async def get_one( + self, + default_template_request: "DefaultTemplateRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "DefaultTemplateResponse": + return await self._unary_unary( + "/arista.alert.v1.DefaultTemplateService/GetOne", + default_template_request, + DefaultTemplateResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def get_some( + self, + default_template_some_request: "DefaultTemplateSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DefaultTemplateSomeResponse"]: + async for response in self._unary_stream( + "/arista.alert.v1.DefaultTemplateService/GetSome", + default_template_some_request, + DefaultTemplateSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all( + self, + default_template_stream_request: "DefaultTemplateStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DefaultTemplateStreamResponse"]: + async for response in self._unary_stream( + "/arista.alert.v1.DefaultTemplateService/GetAll", + default_template_stream_request, + DefaultTemplateStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe( + self, + default_template_stream_request: "DefaultTemplateStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DefaultTemplateStreamResponse"]: + async for response in self._unary_stream( + "/arista.alert.v1.DefaultTemplateService/Subscribe", + default_template_stream_request, + DefaultTemplateStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_meta( + self, + default_template_stream_request: "DefaultTemplateStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.alert.v1.DefaultTemplateService/GetMeta", + default_template_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + default_template_stream_request: "DefaultTemplateStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.alert.v1.DefaultTemplateService/SubscribeMeta", + default_template_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all_batched( + self, + default_template_batched_stream_request: "DefaultTemplateBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DefaultTemplateBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.alert.v1.DefaultTemplateService/GetAllBatched", + default_template_batched_stream_request, + DefaultTemplateBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + default_template_batched_stream_request: "DefaultTemplateBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DefaultTemplateBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.alert.v1.DefaultTemplateService/SubscribeBatched", + default_template_batched_stream_request, + DefaultTemplateBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + class TemplateConfigServiceStub(aristaproto.ServiceStub): async def get_one( @@ -2208,6 +2936,24 @@ async def get_one( metadata=metadata, ) + async def get_some( + self, + template_config_some_request: "TemplateConfigSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["TemplateConfigSomeResponse"]: + async for response in self._unary_stream( + "/arista.alert.v1.TemplateConfigService/GetSome", + template_config_some_request, + TemplateConfigSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def get_all( self, template_config_stream_request: "TemplateConfigStreamRequest", @@ -2244,6 +2990,41 @@ async def subscribe( ): yield response + async def get_meta( + self, + template_config_stream_request: "TemplateConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.alert.v1.TemplateConfigService/GetMeta", + template_config_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + template_config_stream_request: "TemplateConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.alert.v1.TemplateConfigService/SubscribeMeta", + template_config_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def set( self, template_config_set_request: "TemplateConfigSetRequest", @@ -2296,6 +3077,24 @@ async def delete( metadata=metadata, ) + async def delete_some( + self, + template_config_delete_some_request: "TemplateConfigDeleteSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["TemplateConfigDeleteSomeResponse"]: + async for response in self._unary_stream( + "/arista.alert.v1.TemplateConfigService/DeleteSome", + template_config_delete_some_request, + TemplateConfigDeleteSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def delete_all( self, template_config_delete_all_request: "TemplateConfigDeleteAllRequest", @@ -2314,16 +3113,73 @@ async def delete_all( ): yield response + async def get_all_batched( + self, + template_config_batched_stream_request: "TemplateConfigBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["TemplateConfigBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.alert.v1.TemplateConfigService/GetAllBatched", + template_config_batched_stream_request, + TemplateConfigBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + template_config_batched_stream_request: "TemplateConfigBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["TemplateConfigBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.alert.v1.TemplateConfigService/SubscribeBatched", + template_config_batched_stream_request, + TemplateConfigBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + class AlertServiceBase(ServiceBase): + async def get_one(self, alert_request: "AlertRequest") -> "AlertResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_all( + self, alert_stream_request: "AlertStreamRequest" + ) -> AsyncIterator["AlertStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def subscribe( self, alert_stream_request: "AlertStreamRequest" ) -> AsyncIterator["AlertStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def subscribe_meta( + self, alert_stream_request: "AlertStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all_batched( + self, alert_batched_stream_request: "AlertBatchedStreamRequest" + ) -> AsyncIterator["AlertBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, alert_batched_stream_request: "AlertBatchedStreamRequest" + ) -> AsyncIterator["AlertBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def __rpc_get_one( self, stream: "grpclib.server.Stream[AlertRequest, AlertResponse]" ) -> None: @@ -2331,12 +3187,54 @@ async def __rpc_get_one( response = await self.get_one(request) await stream.send_message(response) + async def __rpc_get_all( + self, stream: "grpclib.server.Stream[AlertStreamRequest, AlertStreamResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all, + stream, + request, + ) + async def __rpc_subscribe( self, stream: "grpclib.server.Stream[AlertStreamRequest, AlertStreamResponse]" ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( - self.subscribe, + self.subscribe, + stream, + request, + ) + + async def __rpc_subscribe_meta( + self, stream: "grpclib.server.Stream[AlertStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[AlertBatchedStreamRequest, AlertBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[AlertBatchedStreamRequest, AlertBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, stream, request, ) @@ -2349,31 +3247,76 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: AlertRequest, AlertResponse, ), + "/arista.alert.v1.AlertService/GetAll": grpclib.const.Handler( + self.__rpc_get_all, + grpclib.const.Cardinality.UNARY_STREAM, + AlertStreamRequest, + AlertStreamResponse, + ), "/arista.alert.v1.AlertService/Subscribe": grpclib.const.Handler( self.__rpc_subscribe, grpclib.const.Cardinality.UNARY_STREAM, AlertStreamRequest, AlertStreamResponse, ), + "/arista.alert.v1.AlertService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + AlertStreamRequest, + MetaResponse, + ), + "/arista.alert.v1.AlertService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + AlertBatchedStreamRequest, + AlertBatchedStreamResponse, + ), + "/arista.alert.v1.AlertService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + AlertBatchedStreamRequest, + AlertBatchedStreamResponse, + ), } class AlertConfigServiceBase(ServiceBase): + async def get_one( self, alert_config_request: "AlertConfigRequest" ) -> "AlertConfigResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_all( + self, alert_config_stream_request: "AlertConfigStreamRequest" + ) -> AsyncIterator["AlertConfigStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def subscribe( self, alert_config_stream_request: "AlertConfigStreamRequest" ) -> AsyncIterator["AlertConfigStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def subscribe_meta( + self, alert_config_stream_request: "AlertConfigStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def set( self, alert_config_set_request: "AlertConfigSetRequest" ) -> "AlertConfigSetResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_all_batched( + self, alert_config_batched_stream_request: "AlertConfigBatchedStreamRequest" + ) -> AsyncIterator["AlertConfigBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, alert_config_batched_stream_request: "AlertConfigBatchedStreamRequest" + ) -> AsyncIterator["AlertConfigBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def __rpc_get_one( self, stream: "grpclib.server.Stream[AlertConfigRequest, AlertConfigResponse]" ) -> None: @@ -2381,6 +3324,17 @@ async def __rpc_get_one( response = await self.get_one(request) await stream.send_message(response) + async def __rpc_get_all( + self, + stream: "grpclib.server.Stream[AlertConfigStreamRequest, AlertConfigStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all, + stream, + request, + ) + async def __rpc_subscribe( self, stream: "grpclib.server.Stream[AlertConfigStreamRequest, AlertConfigStreamResponse]", @@ -2392,6 +3346,16 @@ async def __rpc_subscribe( request, ) + async def __rpc_subscribe_meta( + self, stream: "grpclib.server.Stream[AlertConfigStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + async def __rpc_set( self, stream: "grpclib.server.Stream[AlertConfigSetRequest, AlertConfigSetResponse]", @@ -2400,6 +3364,28 @@ async def __rpc_set( response = await self.set(request) await stream.send_message(response) + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[AlertConfigBatchedStreamRequest, AlertConfigBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[AlertConfigBatchedStreamRequest, AlertConfigBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: return { "/arista.alert.v1.AlertConfigService/GetOne": grpclib.const.Handler( @@ -2408,27 +3394,236 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: AlertConfigRequest, AlertConfigResponse, ), + "/arista.alert.v1.AlertConfigService/GetAll": grpclib.const.Handler( + self.__rpc_get_all, + grpclib.const.Cardinality.UNARY_STREAM, + AlertConfigStreamRequest, + AlertConfigStreamResponse, + ), "/arista.alert.v1.AlertConfigService/Subscribe": grpclib.const.Handler( self.__rpc_subscribe, grpclib.const.Cardinality.UNARY_STREAM, AlertConfigStreamRequest, AlertConfigStreamResponse, ), + "/arista.alert.v1.AlertConfigService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + AlertConfigStreamRequest, + MetaResponse, + ), "/arista.alert.v1.AlertConfigService/Set": grpclib.const.Handler( self.__rpc_set, grpclib.const.Cardinality.UNARY_UNARY, AlertConfigSetRequest, AlertConfigSetResponse, ), + "/arista.alert.v1.AlertConfigService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + AlertConfigBatchedStreamRequest, + AlertConfigBatchedStreamResponse, + ), + "/arista.alert.v1.AlertConfigService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + AlertConfigBatchedStreamRequest, + AlertConfigBatchedStreamResponse, + ), + } + + +class DefaultTemplateServiceBase(ServiceBase): + + async def get_one( + self, default_template_request: "DefaultTemplateRequest" + ) -> "DefaultTemplateResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_some( + self, default_template_some_request: "DefaultTemplateSomeRequest" + ) -> AsyncIterator["DefaultTemplateSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all( + self, default_template_stream_request: "DefaultTemplateStreamRequest" + ) -> AsyncIterator["DefaultTemplateStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe( + self, default_template_stream_request: "DefaultTemplateStreamRequest" + ) -> AsyncIterator["DefaultTemplateStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_meta( + self, default_template_stream_request: "DefaultTemplateStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, default_template_stream_request: "DefaultTemplateStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all_batched( + self, + default_template_batched_stream_request: "DefaultTemplateBatchedStreamRequest", + ) -> AsyncIterator["DefaultTemplateBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, + default_template_batched_stream_request: "DefaultTemplateBatchedStreamRequest", + ) -> AsyncIterator["DefaultTemplateBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def __rpc_get_one( + self, + stream: "grpclib.server.Stream[DefaultTemplateRequest, DefaultTemplateResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.get_one(request) + await stream.send_message(response) + + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[DefaultTemplateSomeRequest, DefaultTemplateSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + + async def __rpc_get_all( + self, + stream: "grpclib.server.Stream[DefaultTemplateStreamRequest, DefaultTemplateStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all, + stream, + request, + ) + + async def __rpc_subscribe( + self, + stream: "grpclib.server.Stream[DefaultTemplateStreamRequest, DefaultTemplateStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe, + stream, + request, + ) + + async def __rpc_get_meta( + self, + stream: "grpclib.server.Stream[DefaultTemplateStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, + stream: "grpclib.server.Stream[DefaultTemplateStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[DefaultTemplateBatchedStreamRequest, DefaultTemplateBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[DefaultTemplateBatchedStreamRequest, DefaultTemplateBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: + return { + "/arista.alert.v1.DefaultTemplateService/GetOne": grpclib.const.Handler( + self.__rpc_get_one, + grpclib.const.Cardinality.UNARY_UNARY, + DefaultTemplateRequest, + DefaultTemplateResponse, + ), + "/arista.alert.v1.DefaultTemplateService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + DefaultTemplateSomeRequest, + DefaultTemplateSomeResponse, + ), + "/arista.alert.v1.DefaultTemplateService/GetAll": grpclib.const.Handler( + self.__rpc_get_all, + grpclib.const.Cardinality.UNARY_STREAM, + DefaultTemplateStreamRequest, + DefaultTemplateStreamResponse, + ), + "/arista.alert.v1.DefaultTemplateService/Subscribe": grpclib.const.Handler( + self.__rpc_subscribe, + grpclib.const.Cardinality.UNARY_STREAM, + DefaultTemplateStreamRequest, + DefaultTemplateStreamResponse, + ), + "/arista.alert.v1.DefaultTemplateService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + DefaultTemplateStreamRequest, + MetaResponse, + ), + "/arista.alert.v1.DefaultTemplateService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + DefaultTemplateStreamRequest, + MetaResponse, + ), + "/arista.alert.v1.DefaultTemplateService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + DefaultTemplateBatchedStreamRequest, + DefaultTemplateBatchedStreamResponse, + ), + "/arista.alert.v1.DefaultTemplateService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + DefaultTemplateBatchedStreamRequest, + DefaultTemplateBatchedStreamResponse, + ), } class TemplateConfigServiceBase(ServiceBase): + async def get_one( self, template_config_request: "TemplateConfigRequest" ) -> "TemplateConfigResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_some( + self, template_config_some_request: "TemplateConfigSomeRequest" + ) -> AsyncIterator["TemplateConfigSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_all( self, template_config_stream_request: "TemplateConfigStreamRequest" ) -> AsyncIterator["TemplateConfigStreamResponse"]: @@ -2439,6 +3634,16 @@ async def subscribe( ) -> AsyncIterator["TemplateConfigStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_meta( + self, template_config_stream_request: "TemplateConfigStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, template_config_stream_request: "TemplateConfigStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def set( self, template_config_set_request: "TemplateConfigSetRequest" ) -> "TemplateConfigSetResponse": @@ -2454,11 +3659,28 @@ async def delete( ) -> "TemplateConfigDeleteResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def delete_some( + self, template_config_delete_some_request: "TemplateConfigDeleteSomeRequest" + ) -> AsyncIterator["TemplateConfigDeleteSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def delete_all( self, template_config_delete_all_request: "TemplateConfigDeleteAllRequest" ) -> AsyncIterator["TemplateConfigDeleteAllResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_all_batched( + self, + template_config_batched_stream_request: "TemplateConfigBatchedStreamRequest", + ) -> AsyncIterator["TemplateConfigBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, + template_config_batched_stream_request: "TemplateConfigBatchedStreamRequest", + ) -> AsyncIterator["TemplateConfigBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def __rpc_get_one( self, stream: "grpclib.server.Stream[TemplateConfigRequest, TemplateConfigResponse]", @@ -2467,6 +3689,17 @@ async def __rpc_get_one( response = await self.get_one(request) await stream.send_message(response) + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[TemplateConfigSomeRequest, TemplateConfigSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + async def __rpc_get_all( self, stream: "grpclib.server.Stream[TemplateConfigStreamRequest, TemplateConfigStreamResponse]", @@ -2489,6 +3722,23 @@ async def __rpc_subscribe( request, ) + async def __rpc_get_meta( + self, stream: "grpclib.server.Stream[TemplateConfigStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, stream: "grpclib.server.Stream[TemplateConfigStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + async def __rpc_set( self, stream: "grpclib.server.Stream[TemplateConfigSetRequest, TemplateConfigSetResponse]", @@ -2516,6 +3766,17 @@ async def __rpc_delete( response = await self.delete(request) await stream.send_message(response) + async def __rpc_delete_some( + self, + stream: "grpclib.server.Stream[TemplateConfigDeleteSomeRequest, TemplateConfigDeleteSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.delete_some, + stream, + request, + ) + async def __rpc_delete_all( self, stream: "grpclib.server.Stream[TemplateConfigDeleteAllRequest, TemplateConfigDeleteAllResponse]", @@ -2527,6 +3788,28 @@ async def __rpc_delete_all( request, ) + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[TemplateConfigBatchedStreamRequest, TemplateConfigBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[TemplateConfigBatchedStreamRequest, TemplateConfigBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: return { "/arista.alert.v1.TemplateConfigService/GetOne": grpclib.const.Handler( @@ -2535,6 +3818,12 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: TemplateConfigRequest, TemplateConfigResponse, ), + "/arista.alert.v1.TemplateConfigService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + TemplateConfigSomeRequest, + TemplateConfigSomeResponse, + ), "/arista.alert.v1.TemplateConfigService/GetAll": grpclib.const.Handler( self.__rpc_get_all, grpclib.const.Cardinality.UNARY_STREAM, @@ -2547,6 +3836,18 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: TemplateConfigStreamRequest, TemplateConfigStreamResponse, ), + "/arista.alert.v1.TemplateConfigService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + TemplateConfigStreamRequest, + MetaResponse, + ), + "/arista.alert.v1.TemplateConfigService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + TemplateConfigStreamRequest, + MetaResponse, + ), "/arista.alert.v1.TemplateConfigService/Set": grpclib.const.Handler( self.__rpc_set, grpclib.const.Cardinality.UNARY_UNARY, @@ -2565,10 +3866,28 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: TemplateConfigDeleteRequest, TemplateConfigDeleteResponse, ), + "/arista.alert.v1.TemplateConfigService/DeleteSome": grpclib.const.Handler( + self.__rpc_delete_some, + grpclib.const.Cardinality.UNARY_STREAM, + TemplateConfigDeleteSomeRequest, + TemplateConfigDeleteSomeResponse, + ), "/arista.alert.v1.TemplateConfigService/DeleteAll": grpclib.const.Handler( self.__rpc_delete_all, grpclib.const.Cardinality.UNARY_STREAM, TemplateConfigDeleteAllRequest, TemplateConfigDeleteAllResponse, ), + "/arista.alert.v1.TemplateConfigService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + TemplateConfigBatchedStreamRequest, + TemplateConfigBatchedStreamResponse, + ), + "/arista.alert.v1.TemplateConfigService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + TemplateConfigBatchedStreamRequest, + TemplateConfigBatchedStreamResponse, + ), } diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/configlet/__init__.py b/python-avd/pyavd/_cv/api/arista/bugexposure/__init__.py similarity index 68% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/configlet/__init__.py rename to python-avd/pyavd/_cv/api/arista/bugexposure/__init__.py index e772bee41fe..b17ca7c745d 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/configlet/__init__.py +++ b/python-avd/pyavd/_cv/api/arista/bugexposure/__init__.py @@ -1,3 +1,3 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. +# Copyright (c) 2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/bugexposure/v1/__init__.py b/python-avd/pyavd/_cv/api/arista/bugexposure/v1/__init__.py similarity index 96% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/bugexposure/v1/__init__.py rename to python-avd/pyavd/_cv/api/arista/bugexposure/v1/__init__.py index 9e734d8dd34..9954e1e4e1b 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/bugexposure/v1/__init__.py +++ b/python-avd/pyavd/_cv/api/arista/bugexposure/v1/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. +# Copyright (c) 2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. # Generated by the protocol buffer compiler. DO NOT EDIT! @@ -16,17 +16,9 @@ Optional, ) -try: - import aristaproto - import grpclib - from aristaproto.grpc.grpclib_server import ServiceBase -except ImportError: - HAS_ARISTAPROTO = False - from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_aristaproto as aristaproto - from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_grpclib as grpclib - ServiceBase = object -else: - HAS_ARISTAPROTO = True +import aristaproto +import grpclib +from aristaproto.grpc.grpclib_server import ServiceBase from .... import fmp as ___fmp__ from ... import ( @@ -352,6 +344,7 @@ async def subscribe_meta( class BugExposureServiceBase(ServiceBase): + async def get_one( self, bug_exposure_request: "BugExposureRequest" ) -> "BugExposureResponse": diff --git a/python-avd/pyavd/_cv/api/arista/changecontrol/__init__.py b/python-avd/pyavd/_cv/api/arista/changecontrol/__init__.py new file mode 100644 index 00000000000..b17ca7c745d --- /dev/null +++ b/python-avd/pyavd/_cv/api/arista/changecontrol/__init__.py @@ -0,0 +1,3 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/changecontrol/v1/__init__.py b/python-avd/pyavd/_cv/api/arista/changecontrol/v1/__init__.py similarity index 52% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/changecontrol/v1/__init__.py rename to python-avd/pyavd/_cv/api/arista/changecontrol/v1/__init__.py index 0d1e07cdc54..7896f101710 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/changecontrol/v1/__init__.py +++ b/python-avd/pyavd/_cv/api/arista/changecontrol/v1/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. +# Copyright (c) 2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. # Generated by the protocol buffer compiler. DO NOT EDIT! @@ -16,17 +16,9 @@ Optional, ) -try: - import aristaproto - import grpclib - from aristaproto.grpc.grpclib_server import ServiceBase -except ImportError: - HAS_ARISTAPROTO = False - from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_aristaproto as aristaproto - from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_grpclib as grpclib - ServiceBase = object -else: - HAS_ARISTAPROTO = True +import aristaproto +import grpclib +from aristaproto.grpc.grpclib_server import ServiceBase from .... import fmp as ___fmp__ from ... import ( @@ -56,6 +48,9 @@ class StageStatus(aristaproto.Enum): error implies success and some error implies failure. """ + NOT_STARTED = 3 + """STAGE_STATUS_NOT_STARTED means the stage has not been started.""" + class ChangeControlStatus(aristaproto.Enum): """ @@ -87,6 +82,12 @@ class ChangeControlStatus(aristaproto.Enum): control reporting the details of the failure. """ + NOT_STARTED = 4 + """ + CHANGE_CONTROL_STATUS_NOT_STARTED means the change control has not been + started. This would include approved and not approved change controls. + """ + @dataclass(eq=False, repr=False) class RepeatedRepeatedString(aristaproto.Message): @@ -311,6 +312,12 @@ class Stage(aristaproto.Message): of the stage. """ + start_time: datetime = aristaproto.message_field(6) + """start_time is the time when status change to Running""" + + end_time: datetime = aristaproto.message_field(7) + """end_time is the time when status change to Completed""" + @dataclass(eq=False, repr=False) class StageMap(aristaproto.Message): @@ -482,6 +489,27 @@ class ApproveConfig(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class MetaResponse(aristaproto.Message): + time: datetime = aristaproto.message_field(1) + """ + Time holds the timestamp of the last item included in the metadata calculation. + """ + + type: "__subscriptions__.Operation" = aristaproto.enum_field(2) + """ + Operation indicates how the value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + count: Optional[int] = aristaproto.message_field(3, wraps=aristaproto.TYPE_UINT32) + """ + Count is the number of items present under the conditions of the request. + """ + + @dataclass(eq=False, repr=False) class ApproveConfigRequest(aristaproto.Message): key: "ChangeControlKey" = aristaproto.message_field(1) @@ -514,6 +542,35 @@ class ApproveConfigResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class ApproveConfigSomeRequest(aristaproto.Message): + keys: List["ChangeControlKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class ApproveConfigSomeResponse(aristaproto.Message): + value: "ApproveConfig" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + @dataclass(eq=False, repr=False) class ApproveConfigStreamRequest(aristaproto.Message): partial_eq_filter: List["ApproveConfig"] = aristaproto.message_field(1) @@ -530,6 +587,17 @@ class ApproveConfigStreamRequest(aristaproto.Message): TimeRange allows limiting response data to within a specified time window. If this field is populated, at least one of the two time fields are required. + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each ApproveConfig at end. + * Each ApproveConfig response is fully-specified (all fields set). + * start: Returns the state of each ApproveConfig at start, followed by updates until now. + * Each ApproveConfig response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each ApproveConfig at start, followed by updates + until end. + * Each ApproveConfig response at start is fully-specified, but updates until end may + be partial. + This field is not allowed in the Subscribe RPC. """ @@ -555,6 +623,57 @@ class ApproveConfigStreamResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class ApproveConfigBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["ApproveConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each ApproveConfig at end. + * Each ApproveConfig response is fully-specified (all fields set). + * start: Returns the state of each ApproveConfig at start, followed by updates until now. + * Each ApproveConfig response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each ApproveConfig at start, followed by updates + until end. + * Each ApproveConfig response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class ApproveConfigBatchedStreamResponse(aristaproto.Message): + responses: List["ApproveConfigStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + @dataclass(eq=False, repr=False) class ApproveConfigSetRequest(aristaproto.Message): value: "ApproveConfig" = aristaproto.message_field(1) @@ -582,6 +701,25 @@ class ApproveConfigSetResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class ApproveConfigSetSomeRequest(aristaproto.Message): + values: List["ApproveConfig"] = aristaproto.message_field(1) + """ + value contains a list of ApproveConfig values to write. + It is possible to provide more values than can fit within either: + - the maxiumum send size of the client + - the maximum receive size of the server + If this error occurs you must reduce the number of values sent. + See gRPC "maximum message size" documentation for more information. + """ + + +@dataclass(eq=False, repr=False) +class ApproveConfigSetSomeResponse(aristaproto.Message): + key: "ChangeControlKey" = aristaproto.message_field(1) + error: str = aristaproto.string_field(2) + + @dataclass(eq=False, repr=False) class ApproveConfigDeleteRequest(aristaproto.Message): key: "ChangeControlKey" = aristaproto.message_field(1) @@ -606,15 +744,37 @@ class ApproveConfigDeleteResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class ApproveConfigDeleteSomeRequest(aristaproto.Message): + keys: List["ChangeControlKey"] = aristaproto.message_field(1) + """key contains a list of ApproveConfig keys to delete""" + + +@dataclass(eq=False, repr=False) +class ApproveConfigDeleteSomeResponse(aristaproto.Message): + """ApproveConfigDeleteSomeResponse is only sent when there is an error.""" + + key: "ChangeControlKey" = aristaproto.message_field(1) + error: str = aristaproto.string_field(2) + + @dataclass(eq=False, repr=False) class ApproveConfigDeleteAllRequest(aristaproto.Message): - pass + partial_eq_filter: List["ApproveConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a DeleteAll. + This requires all provided fields to be equal to the response. + A filtered DeleteAll will use GetAll with filter to find things to delete. + """ @dataclass(eq=False, repr=False) class ApproveConfigDeleteAllResponse(aristaproto.Message): type: "___fmp__.DeleteError" = aristaproto.enum_field(1) - """This describes the class of delete error.""" + """ + This describes the class of delete error. + A DeleteAllResponse is only sent when there is an error. + """ error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) """This indicates the error message from the delete failure.""" @@ -660,6 +820,35 @@ class ChangeControlResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class ChangeControlSomeRequest(aristaproto.Message): + keys: List["ChangeControlKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class ChangeControlSomeResponse(aristaproto.Message): + value: "ChangeControl" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + @dataclass(eq=False, repr=False) class ChangeControlStreamRequest(aristaproto.Message): partial_eq_filter: List["ChangeControl"] = aristaproto.message_field(1) @@ -683,6 +872,17 @@ class ChangeControlStreamRequest(aristaproto.Message): TimeRange allows limiting response data to within a specified time window. If this field is populated, at least one of the two time fields are required. + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each ChangeControl at end. + * Each ChangeControl response is fully-specified (all fields set). + * start: Returns the state of each ChangeControl at start, followed by updates until now. + * Each ChangeControl response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each ChangeControl at start, followed by updates + until end. + * Each ChangeControl response at start is fully-specified, but updates until end may + be partial. + This field is not allowed in the Subscribe RPC. """ @@ -708,6 +908,64 @@ class ChangeControlStreamResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class ChangeControlBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["ChangeControl"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + filter: "Filter" = aristaproto.message_field(2) + """ + For each ChangeControl in the list, all populated fields are considered ANDed together + as a filtering operation. Similarly, the list itself is ORed such that any individual + filter that matches a given ChangeControl is streamed to the user. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each ChangeControl at end. + * Each ChangeControl response is fully-specified (all fields set). + * start: Returns the state of each ChangeControl at start, followed by updates until now. + * Each ChangeControl response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each ChangeControl at start, followed by updates + until end. + * Each ChangeControl response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class ChangeControlBatchedStreamResponse(aristaproto.Message): + responses: List["ChangeControlStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + @dataclass(eq=False, repr=False) class ChangeControlConfigRequest(aristaproto.Message): key: "ChangeControlKey" = aristaproto.message_field(1) @@ -740,6 +998,35 @@ class ChangeControlConfigResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class ChangeControlConfigSomeRequest(aristaproto.Message): + keys: List["ChangeControlKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class ChangeControlConfigSomeResponse(aristaproto.Message): + value: "ChangeControlConfig" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + @dataclass(eq=False, repr=False) class ChangeControlConfigStreamRequest(aristaproto.Message): partial_eq_filter: List["ChangeControlConfig"] = aristaproto.message_field(1) @@ -756,6 +1043,17 @@ class ChangeControlConfigStreamRequest(aristaproto.Message): TimeRange allows limiting response data to within a specified time window. If this field is populated, at least one of the two time fields are required. + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each ChangeControlConfig at end. + * Each ChangeControlConfig response is fully-specified (all fields set). + * start: Returns the state of each ChangeControlConfig at start, followed by updates until now. + * Each ChangeControlConfig response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each ChangeControlConfig at start, followed by updates + until end. + * Each ChangeControlConfig response at start is fully-specified, but updates until end may + be partial. + This field is not allowed in the Subscribe RPC. """ @@ -783,6 +1081,57 @@ class ChangeControlConfigStreamResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class ChangeControlConfigBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["ChangeControlConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each ChangeControlConfig at end. + * Each ChangeControlConfig response is fully-specified (all fields set). + * start: Returns the state of each ChangeControlConfig at start, followed by updates until now. + * Each ChangeControlConfig response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each ChangeControlConfig at start, followed by updates + until end. + * Each ChangeControlConfig response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class ChangeControlConfigBatchedStreamResponse(aristaproto.Message): + responses: List["ChangeControlConfigStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + @dataclass(eq=False, repr=False) class ChangeControlConfigSetRequest(aristaproto.Message): value: "ChangeControlConfig" = aristaproto.message_field(1) @@ -810,6 +1159,25 @@ class ChangeControlConfigSetResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class ChangeControlConfigSetSomeRequest(aristaproto.Message): + values: List["ChangeControlConfig"] = aristaproto.message_field(1) + """ + value contains a list of ChangeControlConfig values to write. + It is possible to provide more values than can fit within either: + - the maxiumum send size of the client + - the maximum receive size of the server + If this error occurs you must reduce the number of values sent. + See gRPC "maximum message size" documentation for more information. + """ + + +@dataclass(eq=False, repr=False) +class ChangeControlConfigSetSomeResponse(aristaproto.Message): + key: "ChangeControlKey" = aristaproto.message_field(1) + error: str = aristaproto.string_field(2) + + @dataclass(eq=False, repr=False) class ChangeControlConfigDeleteRequest(aristaproto.Message): key: "ChangeControlKey" = aristaproto.message_field(1) @@ -834,15 +1202,39 @@ class ChangeControlConfigDeleteResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class ChangeControlConfigDeleteSomeRequest(aristaproto.Message): + keys: List["ChangeControlKey"] = aristaproto.message_field(1) + """key contains a list of ChangeControlConfig keys to delete""" + + +@dataclass(eq=False, repr=False) +class ChangeControlConfigDeleteSomeResponse(aristaproto.Message): + """ + ChangeControlConfigDeleteSomeResponse is only sent when there is an error. + """ + + key: "ChangeControlKey" = aristaproto.message_field(1) + error: str = aristaproto.string_field(2) + + @dataclass(eq=False, repr=False) class ChangeControlConfigDeleteAllRequest(aristaproto.Message): - pass + partial_eq_filter: List["ChangeControlConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a DeleteAll. + This requires all provided fields to be equal to the response. + A filtered DeleteAll will use GetAll with filter to find things to delete. + """ @dataclass(eq=False, repr=False) class ChangeControlConfigDeleteAllResponse(aristaproto.Message): type: "___fmp__.DeleteError" = aristaproto.enum_field(1) - """This describes the class of delete error.""" + """ + This describes the class of delete error. + A DeleteAllResponse is only sent when there is an error. + """ error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) """This indicates the error message from the delete failure.""" @@ -874,6 +1266,24 @@ async def get_one( metadata=metadata, ) + async def get_some( + self, + approve_config_some_request: "ApproveConfigSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ApproveConfigSomeResponse"]: + async for response in self._unary_stream( + "/arista.changecontrol.v1.ApproveConfigService/GetSome", + approve_config_some_request, + ApproveConfigSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def get_all( self, approve_config_stream_request: "ApproveConfigStreamRequest", @@ -910,7 +1320,42 @@ async def subscribe( ): yield response - async def set( + async def get_meta( + self, + approve_config_stream_request: "ApproveConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.changecontrol.v1.ApproveConfigService/GetMeta", + approve_config_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + approve_config_stream_request: "ApproveConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.changecontrol.v1.ApproveConfigService/SubscribeMeta", + approve_config_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def set( self, approve_config_set_request: "ApproveConfigSetRequest", *, @@ -927,6 +1372,24 @@ async def set( metadata=metadata, ) + async def set_some( + self, + approve_config_set_some_request: "ApproveConfigSetSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ApproveConfigSetSomeResponse"]: + async for response in self._unary_stream( + "/arista.changecontrol.v1.ApproveConfigService/SetSome", + approve_config_set_some_request, + ApproveConfigSetSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def delete( self, approve_config_delete_request: "ApproveConfigDeleteRequest", @@ -944,6 +1407,24 @@ async def delete( metadata=metadata, ) + async def delete_some( + self, + approve_config_delete_some_request: "ApproveConfigDeleteSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ApproveConfigDeleteSomeResponse"]: + async for response in self._unary_stream( + "/arista.changecontrol.v1.ApproveConfigService/DeleteSome", + approve_config_delete_some_request, + ApproveConfigDeleteSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def delete_all( self, approve_config_delete_all_request: "ApproveConfigDeleteAllRequest", @@ -962,6 +1443,42 @@ async def delete_all( ): yield response + async def get_all_batched( + self, + approve_config_batched_stream_request: "ApproveConfigBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ApproveConfigBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.changecontrol.v1.ApproveConfigService/GetAllBatched", + approve_config_batched_stream_request, + ApproveConfigBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + approve_config_batched_stream_request: "ApproveConfigBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ApproveConfigBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.changecontrol.v1.ApproveConfigService/SubscribeBatched", + approve_config_batched_stream_request, + ApproveConfigBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + class ChangeControlServiceStub(aristaproto.ServiceStub): async def get_one( @@ -981,6 +1498,24 @@ async def get_one( metadata=metadata, ) + async def get_some( + self, + change_control_some_request: "ChangeControlSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ChangeControlSomeResponse"]: + async for response in self._unary_stream( + "/arista.changecontrol.v1.ChangeControlService/GetSome", + change_control_some_request, + ChangeControlSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def get_all( self, change_control_stream_request: "ChangeControlStreamRequest", @@ -1017,6 +1552,77 @@ async def subscribe( ): yield response + async def get_meta( + self, + change_control_stream_request: "ChangeControlStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.changecontrol.v1.ChangeControlService/GetMeta", + change_control_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + change_control_stream_request: "ChangeControlStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.changecontrol.v1.ChangeControlService/SubscribeMeta", + change_control_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all_batched( + self, + change_control_batched_stream_request: "ChangeControlBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ChangeControlBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.changecontrol.v1.ChangeControlService/GetAllBatched", + change_control_batched_stream_request, + ChangeControlBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + change_control_batched_stream_request: "ChangeControlBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ChangeControlBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.changecontrol.v1.ChangeControlService/SubscribeBatched", + change_control_batched_stream_request, + ChangeControlBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + class ChangeControlConfigServiceStub(aristaproto.ServiceStub): async def get_one( @@ -1036,6 +1642,24 @@ async def get_one( metadata=metadata, ) + async def get_some( + self, + change_control_config_some_request: "ChangeControlConfigSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ChangeControlConfigSomeResponse"]: + async for response in self._unary_stream( + "/arista.changecontrol.v1.ChangeControlConfigService/GetSome", + change_control_config_some_request, + ChangeControlConfigSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def get_all( self, change_control_config_stream_request: "ChangeControlConfigStreamRequest", @@ -1072,6 +1696,41 @@ async def subscribe( ): yield response + async def get_meta( + self, + change_control_config_stream_request: "ChangeControlConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.changecontrol.v1.ChangeControlConfigService/GetMeta", + change_control_config_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + change_control_config_stream_request: "ChangeControlConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.changecontrol.v1.ChangeControlConfigService/SubscribeMeta", + change_control_config_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def set( self, change_control_config_set_request: "ChangeControlConfigSetRequest", @@ -1089,6 +1748,24 @@ async def set( metadata=metadata, ) + async def set_some( + self, + change_control_config_set_some_request: "ChangeControlConfigSetSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ChangeControlConfigSetSomeResponse"]: + async for response in self._unary_stream( + "/arista.changecontrol.v1.ChangeControlConfigService/SetSome", + change_control_config_set_some_request, + ChangeControlConfigSetSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def delete( self, change_control_config_delete_request: "ChangeControlConfigDeleteRequest", @@ -1106,6 +1783,24 @@ async def delete( metadata=metadata, ) + async def delete_some( + self, + change_control_config_delete_some_request: "ChangeControlConfigDeleteSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ChangeControlConfigDeleteSomeResponse"]: + async for response in self._unary_stream( + "/arista.changecontrol.v1.ChangeControlConfigService/DeleteSome", + change_control_config_delete_some_request, + ChangeControlConfigDeleteSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def delete_all( self, change_control_config_delete_all_request: "ChangeControlConfigDeleteAllRequest", @@ -1124,13 +1819,55 @@ async def delete_all( ): yield response + async def get_all_batched( + self, + change_control_config_batched_stream_request: "ChangeControlConfigBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ChangeControlConfigBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.changecontrol.v1.ChangeControlConfigService/GetAllBatched", + change_control_config_batched_stream_request, + ChangeControlConfigBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + change_control_config_batched_stream_request: "ChangeControlConfigBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ChangeControlConfigBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.changecontrol.v1.ChangeControlConfigService/SubscribeBatched", + change_control_config_batched_stream_request, + ChangeControlConfigBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + class ApproveConfigServiceBase(ServiceBase): + async def get_one( self, approve_config_request: "ApproveConfigRequest" ) -> "ApproveConfigResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_some( + self, approve_config_some_request: "ApproveConfigSomeRequest" + ) -> AsyncIterator["ApproveConfigSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_all( self, approve_config_stream_request: "ApproveConfigStreamRequest" ) -> AsyncIterator["ApproveConfigStreamResponse"]: @@ -1141,21 +1878,51 @@ async def subscribe( ) -> AsyncIterator["ApproveConfigStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_meta( + self, approve_config_stream_request: "ApproveConfigStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, approve_config_stream_request: "ApproveConfigStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def set( self, approve_config_set_request: "ApproveConfigSetRequest" ) -> "ApproveConfigSetResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def set_some( + self, approve_config_set_some_request: "ApproveConfigSetSomeRequest" + ) -> AsyncIterator["ApproveConfigSetSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def delete( self, approve_config_delete_request: "ApproveConfigDeleteRequest" ) -> "ApproveConfigDeleteResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def delete_some( + self, approve_config_delete_some_request: "ApproveConfigDeleteSomeRequest" + ) -> AsyncIterator["ApproveConfigDeleteSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def delete_all( self, approve_config_delete_all_request: "ApproveConfigDeleteAllRequest" ) -> AsyncIterator["ApproveConfigDeleteAllResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_all_batched( + self, approve_config_batched_stream_request: "ApproveConfigBatchedStreamRequest" + ) -> AsyncIterator["ApproveConfigBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, approve_config_batched_stream_request: "ApproveConfigBatchedStreamRequest" + ) -> AsyncIterator["ApproveConfigBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def __rpc_get_one( self, stream: "grpclib.server.Stream[ApproveConfigRequest, ApproveConfigResponse]", @@ -1164,6 +1931,17 @@ async def __rpc_get_one( response = await self.get_one(request) await stream.send_message(response) + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[ApproveConfigSomeRequest, ApproveConfigSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + async def __rpc_get_all( self, stream: "grpclib.server.Stream[ApproveConfigStreamRequest, ApproveConfigStreamResponse]", @@ -1186,6 +1964,23 @@ async def __rpc_subscribe( request, ) + async def __rpc_get_meta( + self, stream: "grpclib.server.Stream[ApproveConfigStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, stream: "grpclib.server.Stream[ApproveConfigStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + async def __rpc_set( self, stream: "grpclib.server.Stream[ApproveConfigSetRequest, ApproveConfigSetResponse]", @@ -1194,6 +1989,17 @@ async def __rpc_set( response = await self.set(request) await stream.send_message(response) + async def __rpc_set_some( + self, + stream: "grpclib.server.Stream[ApproveConfigSetSomeRequest, ApproveConfigSetSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.set_some, + stream, + request, + ) + async def __rpc_delete( self, stream: "grpclib.server.Stream[ApproveConfigDeleteRequest, ApproveConfigDeleteResponse]", @@ -1202,6 +2008,17 @@ async def __rpc_delete( response = await self.delete(request) await stream.send_message(response) + async def __rpc_delete_some( + self, + stream: "grpclib.server.Stream[ApproveConfigDeleteSomeRequest, ApproveConfigDeleteSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.delete_some, + stream, + request, + ) + async def __rpc_delete_all( self, stream: "grpclib.server.Stream[ApproveConfigDeleteAllRequest, ApproveConfigDeleteAllResponse]", @@ -1213,6 +2030,28 @@ async def __rpc_delete_all( request, ) + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[ApproveConfigBatchedStreamRequest, ApproveConfigBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[ApproveConfigBatchedStreamRequest, ApproveConfigBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: return { "/arista.changecontrol.v1.ApproveConfigService/GetOne": grpclib.const.Handler( @@ -1221,6 +2060,12 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: ApproveConfigRequest, ApproveConfigResponse, ), + "/arista.changecontrol.v1.ApproveConfigService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + ApproveConfigSomeRequest, + ApproveConfigSomeResponse, + ), "/arista.changecontrol.v1.ApproveConfigService/GetAll": grpclib.const.Handler( self.__rpc_get_all, grpclib.const.Cardinality.UNARY_STREAM, @@ -1233,33 +2078,75 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: ApproveConfigStreamRequest, ApproveConfigStreamResponse, ), + "/arista.changecontrol.v1.ApproveConfigService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + ApproveConfigStreamRequest, + MetaResponse, + ), + "/arista.changecontrol.v1.ApproveConfigService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + ApproveConfigStreamRequest, + MetaResponse, + ), "/arista.changecontrol.v1.ApproveConfigService/Set": grpclib.const.Handler( self.__rpc_set, grpclib.const.Cardinality.UNARY_UNARY, ApproveConfigSetRequest, ApproveConfigSetResponse, ), + "/arista.changecontrol.v1.ApproveConfigService/SetSome": grpclib.const.Handler( + self.__rpc_set_some, + grpclib.const.Cardinality.UNARY_STREAM, + ApproveConfigSetSomeRequest, + ApproveConfigSetSomeResponse, + ), "/arista.changecontrol.v1.ApproveConfigService/Delete": grpclib.const.Handler( self.__rpc_delete, grpclib.const.Cardinality.UNARY_UNARY, ApproveConfigDeleteRequest, ApproveConfigDeleteResponse, ), + "/arista.changecontrol.v1.ApproveConfigService/DeleteSome": grpclib.const.Handler( + self.__rpc_delete_some, + grpclib.const.Cardinality.UNARY_STREAM, + ApproveConfigDeleteSomeRequest, + ApproveConfigDeleteSomeResponse, + ), "/arista.changecontrol.v1.ApproveConfigService/DeleteAll": grpclib.const.Handler( self.__rpc_delete_all, grpclib.const.Cardinality.UNARY_STREAM, ApproveConfigDeleteAllRequest, ApproveConfigDeleteAllResponse, ), + "/arista.changecontrol.v1.ApproveConfigService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + ApproveConfigBatchedStreamRequest, + ApproveConfigBatchedStreamResponse, + ), + "/arista.changecontrol.v1.ApproveConfigService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + ApproveConfigBatchedStreamRequest, + ApproveConfigBatchedStreamResponse, + ), } class ChangeControlServiceBase(ServiceBase): + async def get_one( self, change_control_request: "ChangeControlRequest" ) -> "ChangeControlResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_some( + self, change_control_some_request: "ChangeControlSomeRequest" + ) -> AsyncIterator["ChangeControlSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_all( self, change_control_stream_request: "ChangeControlStreamRequest" ) -> AsyncIterator["ChangeControlStreamResponse"]: @@ -1270,6 +2157,26 @@ async def subscribe( ) -> AsyncIterator["ChangeControlStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_meta( + self, change_control_stream_request: "ChangeControlStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, change_control_stream_request: "ChangeControlStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all_batched( + self, change_control_batched_stream_request: "ChangeControlBatchedStreamRequest" + ) -> AsyncIterator["ChangeControlBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, change_control_batched_stream_request: "ChangeControlBatchedStreamRequest" + ) -> AsyncIterator["ChangeControlBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def __rpc_get_one( self, stream: "grpclib.server.Stream[ChangeControlRequest, ChangeControlResponse]", @@ -1278,6 +2185,17 @@ async def __rpc_get_one( response = await self.get_one(request) await stream.send_message(response) + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[ChangeControlSomeRequest, ChangeControlSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + async def __rpc_get_all( self, stream: "grpclib.server.Stream[ChangeControlStreamRequest, ChangeControlStreamResponse]", @@ -1300,6 +2218,45 @@ async def __rpc_subscribe( request, ) + async def __rpc_get_meta( + self, stream: "grpclib.server.Stream[ChangeControlStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, stream: "grpclib.server.Stream[ChangeControlStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[ChangeControlBatchedStreamRequest, ChangeControlBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[ChangeControlBatchedStreamRequest, ChangeControlBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: return { "/arista.changecontrol.v1.ChangeControlService/GetOne": grpclib.const.Handler( @@ -1308,6 +2265,12 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: ChangeControlRequest, ChangeControlResponse, ), + "/arista.changecontrol.v1.ChangeControlService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + ChangeControlSomeRequest, + ChangeControlSomeResponse, + ), "/arista.changecontrol.v1.ChangeControlService/GetAll": grpclib.const.Handler( self.__rpc_get_all, grpclib.const.Cardinality.UNARY_STREAM, @@ -1320,15 +2283,45 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: ChangeControlStreamRequest, ChangeControlStreamResponse, ), + "/arista.changecontrol.v1.ChangeControlService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + ChangeControlStreamRequest, + MetaResponse, + ), + "/arista.changecontrol.v1.ChangeControlService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + ChangeControlStreamRequest, + MetaResponse, + ), + "/arista.changecontrol.v1.ChangeControlService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + ChangeControlBatchedStreamRequest, + ChangeControlBatchedStreamResponse, + ), + "/arista.changecontrol.v1.ChangeControlService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + ChangeControlBatchedStreamRequest, + ChangeControlBatchedStreamResponse, + ), } class ChangeControlConfigServiceBase(ServiceBase): + async def get_one( self, change_control_config_request: "ChangeControlConfigRequest" ) -> "ChangeControlConfigResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_some( + self, change_control_config_some_request: "ChangeControlConfigSomeRequest" + ) -> AsyncIterator["ChangeControlConfigSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_all( self, change_control_config_stream_request: "ChangeControlConfigStreamRequest" ) -> AsyncIterator["ChangeControlConfigStreamResponse"]: @@ -1339,22 +2332,56 @@ async def subscribe( ) -> AsyncIterator["ChangeControlConfigStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_meta( + self, change_control_config_stream_request: "ChangeControlConfigStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, change_control_config_stream_request: "ChangeControlConfigStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def set( self, change_control_config_set_request: "ChangeControlConfigSetRequest" ) -> "ChangeControlConfigSetResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def set_some( + self, + change_control_config_set_some_request: "ChangeControlConfigSetSomeRequest", + ) -> AsyncIterator["ChangeControlConfigSetSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def delete( self, change_control_config_delete_request: "ChangeControlConfigDeleteRequest" ) -> "ChangeControlConfigDeleteResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def delete_some( + self, + change_control_config_delete_some_request: "ChangeControlConfigDeleteSomeRequest", + ) -> AsyncIterator["ChangeControlConfigDeleteSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def delete_all( self, change_control_config_delete_all_request: "ChangeControlConfigDeleteAllRequest", ) -> AsyncIterator["ChangeControlConfigDeleteAllResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_all_batched( + self, + change_control_config_batched_stream_request: "ChangeControlConfigBatchedStreamRequest", + ) -> AsyncIterator["ChangeControlConfigBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, + change_control_config_batched_stream_request: "ChangeControlConfigBatchedStreamRequest", + ) -> AsyncIterator["ChangeControlConfigBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def __rpc_get_one( self, stream: "grpclib.server.Stream[ChangeControlConfigRequest, ChangeControlConfigResponse]", @@ -1363,6 +2390,17 @@ async def __rpc_get_one( response = await self.get_one(request) await stream.send_message(response) + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[ChangeControlConfigSomeRequest, ChangeControlConfigSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + async def __rpc_get_all( self, stream: "grpclib.server.Stream[ChangeControlConfigStreamRequest, ChangeControlConfigStreamResponse]", @@ -1385,6 +2423,25 @@ async def __rpc_subscribe( request, ) + async def __rpc_get_meta( + self, + stream: "grpclib.server.Stream[ChangeControlConfigStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, + stream: "grpclib.server.Stream[ChangeControlConfigStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + async def __rpc_set( self, stream: "grpclib.server.Stream[ChangeControlConfigSetRequest, ChangeControlConfigSetResponse]", @@ -1393,6 +2450,17 @@ async def __rpc_set( response = await self.set(request) await stream.send_message(response) + async def __rpc_set_some( + self, + stream: "grpclib.server.Stream[ChangeControlConfigSetSomeRequest, ChangeControlConfigSetSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.set_some, + stream, + request, + ) + async def __rpc_delete( self, stream: "grpclib.server.Stream[ChangeControlConfigDeleteRequest, ChangeControlConfigDeleteResponse]", @@ -1401,6 +2469,17 @@ async def __rpc_delete( response = await self.delete(request) await stream.send_message(response) + async def __rpc_delete_some( + self, + stream: "grpclib.server.Stream[ChangeControlConfigDeleteSomeRequest, ChangeControlConfigDeleteSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.delete_some, + stream, + request, + ) + async def __rpc_delete_all( self, stream: "grpclib.server.Stream[ChangeControlConfigDeleteAllRequest, ChangeControlConfigDeleteAllResponse]", @@ -1412,6 +2491,28 @@ async def __rpc_delete_all( request, ) + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[ChangeControlConfigBatchedStreamRequest, ChangeControlConfigBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[ChangeControlConfigBatchedStreamRequest, ChangeControlConfigBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: return { "/arista.changecontrol.v1.ChangeControlConfigService/GetOne": grpclib.const.Handler( @@ -1420,6 +2521,12 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: ChangeControlConfigRequest, ChangeControlConfigResponse, ), + "/arista.changecontrol.v1.ChangeControlConfigService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + ChangeControlConfigSomeRequest, + ChangeControlConfigSomeResponse, + ), "/arista.changecontrol.v1.ChangeControlConfigService/GetAll": grpclib.const.Handler( self.__rpc_get_all, grpclib.const.Cardinality.UNARY_STREAM, @@ -1432,22 +2539,58 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: ChangeControlConfigStreamRequest, ChangeControlConfigStreamResponse, ), + "/arista.changecontrol.v1.ChangeControlConfigService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + ChangeControlConfigStreamRequest, + MetaResponse, + ), + "/arista.changecontrol.v1.ChangeControlConfigService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + ChangeControlConfigStreamRequest, + MetaResponse, + ), "/arista.changecontrol.v1.ChangeControlConfigService/Set": grpclib.const.Handler( self.__rpc_set, grpclib.const.Cardinality.UNARY_UNARY, ChangeControlConfigSetRequest, ChangeControlConfigSetResponse, ), + "/arista.changecontrol.v1.ChangeControlConfigService/SetSome": grpclib.const.Handler( + self.__rpc_set_some, + grpclib.const.Cardinality.UNARY_STREAM, + ChangeControlConfigSetSomeRequest, + ChangeControlConfigSetSomeResponse, + ), "/arista.changecontrol.v1.ChangeControlConfigService/Delete": grpclib.const.Handler( self.__rpc_delete, grpclib.const.Cardinality.UNARY_UNARY, ChangeControlConfigDeleteRequest, ChangeControlConfigDeleteResponse, ), + "/arista.changecontrol.v1.ChangeControlConfigService/DeleteSome": grpclib.const.Handler( + self.__rpc_delete_some, + grpclib.const.Cardinality.UNARY_STREAM, + ChangeControlConfigDeleteSomeRequest, + ChangeControlConfigDeleteSomeResponse, + ), "/arista.changecontrol.v1.ChangeControlConfigService/DeleteAll": grpclib.const.Handler( self.__rpc_delete_all, grpclib.const.Cardinality.UNARY_STREAM, ChangeControlConfigDeleteAllRequest, ChangeControlConfigDeleteAllResponse, ), + "/arista.changecontrol.v1.ChangeControlConfigService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + ChangeControlConfigBatchedStreamRequest, + ChangeControlConfigBatchedStreamResponse, + ), + "/arista.changecontrol.v1.ChangeControlConfigService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + ChangeControlConfigBatchedStreamRequest, + ChangeControlConfigBatchedStreamResponse, + ), } diff --git a/python-avd/pyavd/_cv/api/arista/configlet/__init__.py b/python-avd/pyavd/_cv/api/arista/configlet/__init__.py new file mode 100644 index 00000000000..b17ca7c745d --- /dev/null +++ b/python-avd/pyavd/_cv/api/arista/configlet/__init__.py @@ -0,0 +1,3 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/configlet/v1/__init__.py b/python-avd/pyavd/_cv/api/arista/configlet/v1/__init__.py similarity index 78% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/configlet/v1/__init__.py rename to python-avd/pyavd/_cv/api/arista/configlet/v1/__init__.py index af60e1d647f..5023b4e4425 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/configlet/v1/__init__.py +++ b/python-avd/pyavd/_cv/api/arista/configlet/v1/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. +# Copyright (c) 2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. # Generated by the protocol buffer compiler. DO NOT EDIT! @@ -16,17 +16,9 @@ Optional, ) -try: - import aristaproto - import grpclib - from aristaproto.grpc.grpclib_server import ServiceBase -except ImportError: - HAS_ARISTAPROTO = False - from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_aristaproto as aristaproto - from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_grpclib as grpclib - ServiceBase = object -else: - HAS_ARISTAPROTO = True +import aristaproto +import grpclib +from aristaproto.grpc.grpclib_server import ServiceBase from .... import fmp as ___fmp__ from ... import ( @@ -133,6 +125,14 @@ class Configlet(aristaproto.Message): ) """last_modified_by is the user who last modified the Configlet.""" + digest: Optional[str] = aristaproto.message_field(10, wraps=aristaproto.TYPE_STRING) + """ + digest is the sha256 hash of the configlet body encoded in hexadecimal. + """ + + size: Optional[int] = aristaproto.message_field(11, wraps=aristaproto.TYPE_INT64) + """size of configlet body in bytes.""" + @dataclass(eq=False, repr=False) class ConfigletConfig(aristaproto.Message): @@ -416,6 +416,57 @@ class ConfigletStreamResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class ConfigletBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["Configlet"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each Configlet at end. + * Each Configlet response is fully-specified (all fields set). + * start: Returns the state of each Configlet at start, followed by updates until now. + * Each Configlet response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each Configlet at start, followed by updates + until end. + * Each Configlet response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class ConfigletBatchedStreamResponse(aristaproto.Message): + responses: List["ConfigletStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + @dataclass(eq=False, repr=False) class ConfigletAssignmentRequest(aristaproto.Message): key: "ConfigletAssignmentKey" = aristaproto.message_field(1) @@ -531,6 +582,57 @@ class ConfigletAssignmentStreamResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class ConfigletAssignmentBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["ConfigletAssignment"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each ConfigletAssignment at end. + * Each ConfigletAssignment response is fully-specified (all fields set). + * start: Returns the state of each ConfigletAssignment at start, followed by updates until now. + * Each ConfigletAssignment response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each ConfigletAssignment at start, followed by updates + until end. + * Each ConfigletAssignment response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class ConfigletAssignmentBatchedStreamResponse(aristaproto.Message): + responses: List["ConfigletAssignmentStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + @dataclass(eq=False, repr=False) class ConfigletAssignmentConfigRequest(aristaproto.Message): key: "ConfigletAssignmentKey" = aristaproto.message_field(1) @@ -646,6 +748,59 @@ class ConfigletAssignmentConfigStreamResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class ConfigletAssignmentConfigBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["ConfigletAssignmentConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each ConfigletAssignmentConfig at end. + * Each ConfigletAssignmentConfig response is fully-specified (all fields set). + * start: Returns the state of each ConfigletAssignmentConfig at start, followed by updates until now. + * Each ConfigletAssignmentConfig response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each ConfigletAssignmentConfig at start, followed by updates + until end. + * Each ConfigletAssignmentConfig response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class ConfigletAssignmentConfigBatchedStreamResponse(aristaproto.Message): + responses: List["ConfigletAssignmentConfigStreamResponse"] = ( + aristaproto.message_field(1) + ) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + @dataclass(eq=False, repr=False) class ConfigletAssignmentConfigSetRequest(aristaproto.Message): value: "ConfigletAssignmentConfig" = aristaproto.message_field(1) @@ -736,13 +891,21 @@ class ConfigletAssignmentConfigDeleteSomeResponse(aristaproto.Message): @dataclass(eq=False, repr=False) class ConfigletAssignmentConfigDeleteAllRequest(aristaproto.Message): - pass + partial_eq_filter: List["ConfigletAssignmentConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a DeleteAll. + This requires all provided fields to be equal to the response. + A filtered DeleteAll will use GetAll with filter to find things to delete. + """ @dataclass(eq=False, repr=False) class ConfigletAssignmentConfigDeleteAllResponse(aristaproto.Message): type: "___fmp__.DeleteError" = aristaproto.enum_field(1) - """This describes the class of delete error.""" + """ + This describes the class of delete error. + A DeleteAllResponse is only sent when there is an error. + """ error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) """This indicates the error message from the delete failure.""" @@ -871,6 +1034,57 @@ class ConfigletConfigStreamResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class ConfigletConfigBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["ConfigletConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each ConfigletConfig at end. + * Each ConfigletConfig response is fully-specified (all fields set). + * start: Returns the state of each ConfigletConfig at start, followed by updates until now. + * Each ConfigletConfig response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each ConfigletConfig at start, followed by updates + until end. + * Each ConfigletConfig response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class ConfigletConfigBatchedStreamResponse(aristaproto.Message): + responses: List["ConfigletConfigStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + @dataclass(eq=False, repr=False) class ConfigletConfigSetRequest(aristaproto.Message): value: "ConfigletConfig" = aristaproto.message_field(1) @@ -959,13 +1173,21 @@ class ConfigletConfigDeleteSomeResponse(aristaproto.Message): @dataclass(eq=False, repr=False) class ConfigletConfigDeleteAllRequest(aristaproto.Message): - pass + partial_eq_filter: List["ConfigletConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a DeleteAll. + This requires all provided fields to be equal to the response. + A filtered DeleteAll will use GetAll with filter to find things to delete. + """ @dataclass(eq=False, repr=False) class ConfigletConfigDeleteAllResponse(aristaproto.Message): type: "___fmp__.DeleteError" = aristaproto.enum_field(1) - """This describes the class of delete error.""" + """ + This describes the class of delete error. + A DeleteAllResponse is only sent when there is an error. + """ error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) """This indicates the error message from the delete failure.""" @@ -1086,6 +1308,42 @@ async def subscribe_meta( ): yield response + async def get_all_batched( + self, + configlet_batched_stream_request: "ConfigletBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ConfigletBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.configlet.v1.ConfigletService/GetAllBatched", + configlet_batched_stream_request, + ConfigletBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + configlet_batched_stream_request: "ConfigletBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ConfigletBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.configlet.v1.ConfigletService/SubscribeBatched", + configlet_batched_stream_request, + ConfigletBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + class ConfigletAssignmentServiceStub(aristaproto.ServiceStub): async def get_one( @@ -1194,6 +1452,42 @@ async def subscribe_meta( ): yield response + async def get_all_batched( + self, + configlet_assignment_batched_stream_request: "ConfigletAssignmentBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ConfigletAssignmentBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.configlet.v1.ConfigletAssignmentService/GetAllBatched", + configlet_assignment_batched_stream_request, + ConfigletAssignmentBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + configlet_assignment_batched_stream_request: "ConfigletAssignmentBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ConfigletAssignmentBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.configlet.v1.ConfigletAssignmentService/SubscribeBatched", + configlet_assignment_batched_stream_request, + ConfigletAssignmentBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + class ConfigletAssignmentConfigServiceStub(aristaproto.ServiceStub): async def get_one( @@ -1390,6 +1684,42 @@ async def delete_all( ): yield response + async def get_all_batched( + self, + configlet_assignment_config_batched_stream_request: "ConfigletAssignmentConfigBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ConfigletAssignmentConfigBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.configlet.v1.ConfigletAssignmentConfigService/GetAllBatched", + configlet_assignment_config_batched_stream_request, + ConfigletAssignmentConfigBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + configlet_assignment_config_batched_stream_request: "ConfigletAssignmentConfigBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ConfigletAssignmentConfigBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.configlet.v1.ConfigletAssignmentConfigService/SubscribeBatched", + configlet_assignment_config_batched_stream_request, + ConfigletAssignmentConfigBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + class ConfigletConfigServiceStub(aristaproto.ServiceStub): async def get_one( @@ -1586,8 +1916,45 @@ async def delete_all( ): yield response + async def get_all_batched( + self, + configlet_config_batched_stream_request: "ConfigletConfigBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ConfigletConfigBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.configlet.v1.ConfigletConfigService/GetAllBatched", + configlet_config_batched_stream_request, + ConfigletConfigBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + configlet_config_batched_stream_request: "ConfigletConfigBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ConfigletConfigBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.configlet.v1.ConfigletConfigService/SubscribeBatched", + configlet_config_batched_stream_request, + ConfigletConfigBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + class ConfigletServiceBase(ServiceBase): + async def get_one( self, configlet_request: "ConfigletRequest" ) -> "ConfigletResponse": @@ -1618,6 +1985,16 @@ async def subscribe_meta( ) -> AsyncIterator["MetaResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_all_batched( + self, configlet_batched_stream_request: "ConfigletBatchedStreamRequest" + ) -> AsyncIterator["ConfigletBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, configlet_batched_stream_request: "ConfigletBatchedStreamRequest" + ) -> AsyncIterator["ConfigletBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def __rpc_get_one( self, stream: "grpclib.server.Stream[ConfigletRequest, ConfigletResponse]" ) -> None: @@ -1675,6 +2052,28 @@ async def __rpc_subscribe_meta( request, ) + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[ConfigletBatchedStreamRequest, ConfigletBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[ConfigletBatchedStreamRequest, ConfigletBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: return { "/arista.configlet.v1.ConfigletService/GetOne": grpclib.const.Handler( @@ -1713,10 +2112,23 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: ConfigletStreamRequest, MetaResponse, ), + "/arista.configlet.v1.ConfigletService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + ConfigletBatchedStreamRequest, + ConfigletBatchedStreamResponse, + ), + "/arista.configlet.v1.ConfigletService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + ConfigletBatchedStreamRequest, + ConfigletBatchedStreamResponse, + ), } class ConfigletAssignmentServiceBase(ServiceBase): + async def get_one( self, configlet_assignment_request: "ConfigletAssignmentRequest" ) -> "ConfigletAssignmentResponse": @@ -1747,6 +2159,18 @@ async def subscribe_meta( ) -> AsyncIterator["MetaResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_all_batched( + self, + configlet_assignment_batched_stream_request: "ConfigletAssignmentBatchedStreamRequest", + ) -> AsyncIterator["ConfigletAssignmentBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, + configlet_assignment_batched_stream_request: "ConfigletAssignmentBatchedStreamRequest", + ) -> AsyncIterator["ConfigletAssignmentBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def __rpc_get_one( self, stream: "grpclib.server.Stream[ConfigletAssignmentRequest, ConfigletAssignmentResponse]", @@ -1807,6 +2231,28 @@ async def __rpc_subscribe_meta( request, ) + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[ConfigletAssignmentBatchedStreamRequest, ConfigletAssignmentBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[ConfigletAssignmentBatchedStreamRequest, ConfigletAssignmentBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: return { "/arista.configlet.v1.ConfigletAssignmentService/GetOne": grpclib.const.Handler( @@ -1845,10 +2291,23 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: ConfigletAssignmentStreamRequest, MetaResponse, ), + "/arista.configlet.v1.ConfigletAssignmentService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + ConfigletAssignmentBatchedStreamRequest, + ConfigletAssignmentBatchedStreamResponse, + ), + "/arista.configlet.v1.ConfigletAssignmentService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + ConfigletAssignmentBatchedStreamRequest, + ConfigletAssignmentBatchedStreamResponse, + ), } class ConfigletAssignmentConfigServiceBase(ServiceBase): + async def get_one( self, configlet_assignment_config_request: "ConfigletAssignmentConfigRequest" ) -> "ConfigletAssignmentConfigResponse": @@ -1914,6 +2373,18 @@ async def delete_all( ) -> AsyncIterator["ConfigletAssignmentConfigDeleteAllResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_all_batched( + self, + configlet_assignment_config_batched_stream_request: "ConfigletAssignmentConfigBatchedStreamRequest", + ) -> AsyncIterator["ConfigletAssignmentConfigBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, + configlet_assignment_config_batched_stream_request: "ConfigletAssignmentConfigBatchedStreamRequest", + ) -> AsyncIterator["ConfigletAssignmentConfigBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def __rpc_get_one( self, stream: "grpclib.server.Stream[ConfigletAssignmentConfigRequest, ConfigletAssignmentConfigResponse]", @@ -2023,6 +2494,28 @@ async def __rpc_delete_all( request, ) + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[ConfigletAssignmentConfigBatchedStreamRequest, ConfigletAssignmentConfigBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[ConfigletAssignmentConfigBatchedStreamRequest, ConfigletAssignmentConfigBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: return { "/arista.configlet.v1.ConfigletAssignmentConfigService/GetOne": grpclib.const.Handler( @@ -2091,10 +2584,23 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: ConfigletAssignmentConfigDeleteAllRequest, ConfigletAssignmentConfigDeleteAllResponse, ), + "/arista.configlet.v1.ConfigletAssignmentConfigService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + ConfigletAssignmentConfigBatchedStreamRequest, + ConfigletAssignmentConfigBatchedStreamResponse, + ), + "/arista.configlet.v1.ConfigletAssignmentConfigService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + ConfigletAssignmentConfigBatchedStreamRequest, + ConfigletAssignmentConfigBatchedStreamResponse, + ), } class ConfigletConfigServiceBase(ServiceBase): + async def get_one( self, configlet_config_request: "ConfigletConfigRequest" ) -> "ConfigletConfigResponse": @@ -2150,6 +2656,18 @@ async def delete_all( ) -> AsyncIterator["ConfigletConfigDeleteAllResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_all_batched( + self, + configlet_config_batched_stream_request: "ConfigletConfigBatchedStreamRequest", + ) -> AsyncIterator["ConfigletConfigBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, + configlet_config_batched_stream_request: "ConfigletConfigBatchedStreamRequest", + ) -> AsyncIterator["ConfigletConfigBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def __rpc_get_one( self, stream: "grpclib.server.Stream[ConfigletConfigRequest, ConfigletConfigResponse]", @@ -2259,6 +2777,28 @@ async def __rpc_delete_all( request, ) + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[ConfigletConfigBatchedStreamRequest, ConfigletConfigBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[ConfigletConfigBatchedStreamRequest, ConfigletConfigBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: return { "/arista.configlet.v1.ConfigletConfigService/GetOne": grpclib.const.Handler( @@ -2327,4 +2867,16 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: ConfigletConfigDeleteAllRequest, ConfigletConfigDeleteAllResponse, ), + "/arista.configlet.v1.ConfigletConfigService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + ConfigletConfigBatchedStreamRequest, + ConfigletConfigBatchedStreamResponse, + ), + "/arista.configlet.v1.ConfigletConfigService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + ConfigletConfigBatchedStreamRequest, + ConfigletConfigBatchedStreamResponse, + ), } diff --git a/python-avd/pyavd/_cv/api/arista/configstatus/__init__.py b/python-avd/pyavd/_cv/api/arista/configstatus/__init__.py new file mode 100644 index 00000000000..b17ca7c745d --- /dev/null +++ b/python-avd/pyavd/_cv/api/arista/configstatus/__init__.py @@ -0,0 +1,3 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. diff --git a/python-avd/pyavd/_cv/api/arista/configstatus/v1/__init__.py b/python-avd/pyavd/_cv/api/arista/configstatus/v1/__init__.py new file mode 100644 index 00000000000..cfa3b305e6a --- /dev/null +++ b/python-avd/pyavd/_cv/api/arista/configstatus/v1/__init__.py @@ -0,0 +1,3421 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +# Generated by the protocol buffer compiler. DO NOT EDIT! +# sources: arista/configstatus.v1/configstatus.proto, arista/configstatus.v1/services.gen.proto +# plugin: python-aristaproto +# This file has been @generated + +from dataclasses import dataclass +from datetime import datetime +from typing import ( + TYPE_CHECKING, + AsyncIterator, + Dict, + List, + Optional, +) + +import aristaproto +import grpclib +from aristaproto.grpc.grpclib_server import ServiceBase + +from ... import ( + subscriptions as __subscriptions__, + time as __time__, +) + + +if TYPE_CHECKING: + import grpclib.server + from aristaproto.grpc.grpclib_client import MetadataLike + from grpclib.metadata import Deadline + + +class ErrorCode(aristaproto.Enum): + """ + ErrorCode indicates warnings and errors produced during computing config + """ + + UNSPECIFIED = 0 + DEVICE_WARNING = 1 + """DEVICE_WARNING indicates device warning""" + + DEVICE_ERROR = 2 + """DEVICE_ERROR indicates device error""" + + UNREACHABLE_DEVICE = 3 + """UNREACHABLE_DEVICE indicates the device cannot be reached""" + + CONFIG_FILTER_ERROR = 4 + """ + CONFIG_FILTER_ERROR indicates error from partial config management filters + """ + + INTERNAL = 5 + """INTERNAL indicates internal errors""" + + +class DiffOp(aristaproto.Enum): + """ + DiffOp is the operation to a line from one side of diff to get to another + """ + + UNSPECIFIED = 0 + NOP = 1 + """NOP indicates no change. A and B are identical at this line""" + + IGNORE = 2 + """ + IGNORE indicates a line that's ignored in either A or B. + One of a_line_num or b_line_num will be -1 + """ + + ADD = 3 + """ADD is an addition of a line from A""" + + DELETE = 4 + """DELETE is deletion of a line from B""" + + CHANGE = 5 + """CHANGE is a modification to a line in A""" + + +class ConfigFilterCode(aristaproto.Enum): + """ConfigFilterCode indicates if a config line matches PCM filter(s)""" + + UNSPECIFIED = 0 + """ + UNSPECIFIED indicates config line did not match any partial config management (PCM) filter + """ + + MANAGED_LINE = 1 + """ + MANAGED_LINE indicates config line matches managed PCM filter hence is managed + """ + + UNMANAGED_LINE = 2 + """ + UNMANAGED_LINE indicates config line matches unmanaged PCM filter hence is not managed + """ + + +class ConfigSyncCode(aristaproto.Enum): + """ConfigSyncCode indicates config synchronization status""" + + UNSPECIFIED = 0 + IN_SYNC = 1 + """IN_SYNC indicates designed config and running config are identical""" + + OUT_OF_SYNC = 2 + """ + OUT_OF_SYNC indicates designed config and running config are not identical + """ + + +class ConfigSourceType(aristaproto.Enum): + """ + ConfigSourceType indicates the type of source for the proposed/designed configuration + for the device + """ + + UNSPECIFIED = 0 + NETWORK_PROVISIONING_CONFIGLET = 1 + """ + CONFIG_SOURCE_TYPE_NETWORK_PROVISIONING_CONFIGLET - configlet created from + the network provisioning workflow. + """ + + STUDIO = 2 + """CONFIG_SOURCE_TYPE_STUDIO - config generated from a regular studio""" + + STUDIO_STATIC = 3 + """ + SCONFIG_SOURCE_TYPE_STUDIO_STATIC - static config from studios framework + """ + + +class ConfigType(aristaproto.Enum): + UNSPECIFIED = 0 + RUNNING_CONFIG = 1 + DESIGNED_CONFIG = 2 + + +@dataclass(eq=False, repr=False) +class ConfigError(aristaproto.Message): + """ + ConfigError represents errors reported by CVP when handling device configuration + """ + + error_code: "ErrorCode" = aristaproto.enum_field(1) + error_msg: Optional[str] = aristaproto.message_field( + 2, wraps=aristaproto.TYPE_STRING + ) + line_num: Optional[int] = aristaproto.message_field(3, wraps=aristaproto.TYPE_INT32) + """Line_num represents line number, if any""" + + configlet_name: Optional[str] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_STRING + ) + """ + Configlet_name represents the originating configlet name. Configlet_name + and line_num point to the line where config warning or config error originate. + """ + + +@dataclass(eq=False, repr=False) +class ConfigErrors(aristaproto.Message): + values: List["ConfigError"] = aristaproto.message_field(1) + + +@dataclass(eq=False, repr=False) +class DiffEntry(aristaproto.Message): + """DiffEntry represents one entry in a Diff""" + + op: "DiffOp" = aristaproto.enum_field(1) + a_line_num: Optional[int] = aristaproto.message_field( + 2, wraps=aristaproto.TYPE_INT32 + ) + """line number in A this diff applies to""" + + b_line_num: Optional[int] = aristaproto.message_field( + 3, wraps=aristaproto.TYPE_INT32 + ) + """line number in B this diff applies to""" + + b_parent_line_num: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_INT32 + ) + """line number of the parent command in B""" + + a_line: Optional[str] = aristaproto.message_field(5, wraps=aristaproto.TYPE_STRING) + """content of config line in A""" + + b_line: Optional[str] = aristaproto.message_field(6, wraps=aristaproto.TYPE_STRING) + """content of config line in B""" + + a_filter_code: "ConfigFilterCode" = aristaproto.enum_field(7) + """Config filter code of the line in A""" + + b_filter_code: "ConfigFilterCode" = aristaproto.enum_field(8) + """Config filter code of the line in B""" + + a_parent_line_num: Optional[int] = aristaproto.message_field( + 9, wraps=aristaproto.TYPE_INT32 + ) + """line number of the parent command in A""" + + +@dataclass(eq=False, repr=False) +class DiffEntries(aristaproto.Message): + """DiffEntries indicates potential multiple lines of config diff""" + + values: List["DiffEntry"] = aristaproto.message_field(1) + + +@dataclass(eq=False, repr=False) +class ConfigSource(aristaproto.Message): + """ + ConfigSource describes an individual source of the proposed/designed config + """ + + source_type: "ConfigSourceType" = aristaproto.enum_field(1) + source_id: Optional[str] = aristaproto.message_field( + 2, wraps=aristaproto.TYPE_STRING + ) + """ + source_id identifier to distinguish between multiple instances of the source type + source_id is : + configlet name for CONFIG_SOURCE_TYPE_NETWORK_PROVISIONING_CONFIGLET + studio id for CONFIG_SOURCE_TYPE_STUDIO + configlet id for CONFIG_SOURCE_TYPE_STUDIO_STATIC + """ + + +@dataclass(eq=False, repr=False) +class ConfigSources(aristaproto.Message): + """ConfigSources is the list of sources of the proposed/designed config""" + + values: List["ConfigSource"] = aristaproto.message_field(1) + + +@dataclass(eq=False, repr=False) +class ConfigSummary(aristaproto.Message): + """ConfigSummary represents device configuration summary.""" + + sync: "ConfigSyncCode" = aristaproto.enum_field(1) + nop_lines: Optional[int] = aristaproto.message_field( + 2, wraps=aristaproto.TYPE_INT32 + ) + """Number of lines with code no-operation""" + + ignored_lines: Optional[int] = aristaproto.message_field( + 3, wraps=aristaproto.TYPE_INT32 + ) + """Number of lines with code IGNORE""" + + added_lines: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_INT32 + ) + """Number of lines with code ADD""" + + deleted_lines: Optional[int] = aristaproto.message_field( + 5, wraps=aristaproto.TYPE_INT32 + ) + """Number of lines with code DELETE""" + + changed_lines: Optional[int] = aristaproto.message_field( + 6, wraps=aristaproto.TYPE_INT32 + ) + """Number of lines with code CHANGE""" + + designed_config_errors: Optional[int] = aristaproto.message_field( + 7, wraps=aristaproto.TYPE_INT32 + ) + """Number of designed config errors""" + + designed_config_warnings: Optional[int] = aristaproto.message_field( + 8, wraps=aristaproto.TYPE_INT32 + ) + """Number of designed config warnings""" + + running_config_update_time: datetime = aristaproto.message_field(9) + """Timestamp at which running config is updated""" + + designed_config_update_time: datetime = aristaproto.message_field(10) + """Timestamp at which designed config is updated""" + + running_config_uri: Optional[str] = aristaproto.message_field( + 11, wraps=aristaproto.TYPE_STRING + ) + """ + The HTTP URI client can use to GET running config and associated errors + """ + + designed_config_uri: Optional[str] = aristaproto.message_field( + 12, wraps=aristaproto.TYPE_STRING + ) + """ + The HTTP URI client can use to GET designed config and associated errors + """ + + diff_uri: Optional[str] = aristaproto.message_field( + 13, wraps=aristaproto.TYPE_STRING + ) + """The HTTP URI client can use to GET config diff and associated errors""" + + digest: Optional[str] = aristaproto.message_field(14, wraps=aristaproto.TYPE_STRING) + """Digest (SHA-256) of the config diff.""" + + +@dataclass(eq=False, repr=False) +class ConfigKey(aristaproto.Message): + """ConfigKey uniquely identifies a config request.""" + + device_id: Optional[str] = aristaproto.message_field( + 1, wraps=aristaproto.TYPE_STRING + ) + """Device_id is the serial number of the device""" + + type: "ConfigType" = aristaproto.enum_field(2) + """Type describes the config type""" + + +@dataclass(eq=False, repr=False) +class Configuration(aristaproto.Message): + """Configuration represents device's CLI configuration""" + + key: "ConfigKey" = aristaproto.message_field(1) + uri: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Uri represents the HTTP URI client can use to GET config body and associated errors + """ + + +@dataclass(eq=False, repr=False) +class ConfigDiffKey(aristaproto.Message): + """ConfigDiffKey uniquely identifies a configuration diff request""" + + a_device_id: Optional[str] = aristaproto.message_field( + 1, wraps=aristaproto.TYPE_STRING + ) + """ + A_device_id is the serial number of the device on A side (left hand side) + """ + + a_type: "ConfigType" = aristaproto.enum_field(2) + """A_type is the config type on A side (left hand side)""" + + a_time: datetime = aristaproto.message_field(3) + """ + A_time is the time at which to fetch config on A side (left hand side) + """ + + b_device_id: Optional[str] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_STRING + ) + """ + B_device_id is the serial number of the device on B side (right hand side) + """ + + b_type: "ConfigType" = aristaproto.enum_field(5) + """B_type is the config type on B side (right hand side)""" + + b_time: datetime = aristaproto.message_field(6) + """ + B_time is the time at which to fetch config on B side (right hand side) + """ + + +@dataclass(eq=False, repr=False) +class ConfigDiff(aristaproto.Message): + key: "ConfigDiffKey" = aristaproto.message_field(1) + """Key represents config diff key""" + + uri: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Uri represents the HTTP URI client can use to GET config diff and associated errors + """ + + +@dataclass(eq=False, repr=False) +class SummaryKey(aristaproto.Message): + """SummaryKey uniquely identifies a device summary request""" + + device_id: Optional[str] = aristaproto.message_field( + 1, wraps=aristaproto.TYPE_STRING + ) + """Device_id is the serial number of the device""" + + +@dataclass(eq=False, repr=False) +class Summary(aristaproto.Message): + key: "SummaryKey" = aristaproto.message_field(1) + summary: "ConfigSummary" = aristaproto.message_field(2) + + +@dataclass(eq=False, repr=False) +class SecurityProfile(aristaproto.Message): + """ + SecurityProfile holds the EOS configuration for the security profile. + """ + + key: "ConfigKey" = aristaproto.message_field(1) + """key uniquely identifies the configuration""" + + config: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """config describes the security profile config body""" + + +@dataclass(eq=False, repr=False) +class SecurityProfileComplianceSummary(aristaproto.Message): + """ + SecurityProfileComplianceSummary holds the compliance summary for + security profile configuration. + """ + + sync: "ConfigSyncCode" = aristaproto.enum_field(1) + nop_lines: Optional[int] = aristaproto.message_field( + 2, wraps=aristaproto.TYPE_INT32 + ) + """nop_lines is the number of lines with code no-operation""" + + ignored_lines: Optional[int] = aristaproto.message_field( + 3, wraps=aristaproto.TYPE_INT32 + ) + """ignored_lines is the number of lines with code IGNORE""" + + added_lines: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_INT32 + ) + """added_lines is the number of lines with code ADD""" + + deleted_lines: Optional[int] = aristaproto.message_field( + 5, wraps=aristaproto.TYPE_INT32 + ) + """deleted_lines is the number of lines with code DELETE""" + + changed_lines: Optional[int] = aristaproto.message_field( + 6, wraps=aristaproto.TYPE_INT32 + ) + """changed_lines is the Number of lines with code CHANGE""" + + digest: Optional[str] = aristaproto.message_field(7, wraps=aristaproto.TYPE_STRING) + """ + digest is the digest (SHA-256 hash) of the security profile configuration diff + """ + + running_config_update_time: datetime = aristaproto.message_field(8) + """ + running_config_update_time is the timestamp at which running security profile + or running config is updated + """ + + designed_config_update_time: datetime = aristaproto.message_field(9) + """ + designed_config_update_time is the timestamp at which designed security profile or + designed config is updated + """ + + +@dataclass(eq=False, repr=False) +class SecurityProfileDiffSummary(aristaproto.Message): + """ + SecurityProfileDiffSummary holds device compliance summary w.r.t security profile. + """ + + key: "SummaryKey" = aristaproto.message_field(1) + """key uniquely identifies the Summary""" + + summary: "SecurityProfileComplianceSummary" = aristaproto.message_field(2) + """summary is the security profile configuration compliance summary""" + + +@dataclass(eq=False, repr=False) +class SecurityProfileDiff(aristaproto.Message): + """SecurityProfileDiff holds the security profile configuration diff.""" + + key: "ConfigDiffKey" = aristaproto.message_field(1) + """key represents security profile config diff key""" + + diff: "DiffEntries" = aristaproto.message_field(2) + """diff represents diff entries""" + + +@dataclass(eq=False, repr=False) +class MetaResponse(aristaproto.Message): + time: datetime = aristaproto.message_field(1) + """ + Time holds the timestamp of the last item included in the metadata calculation. + """ + + type: "__subscriptions__.Operation" = aristaproto.enum_field(2) + """ + Operation indicates how the value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + count: Optional[int] = aristaproto.message_field(3, wraps=aristaproto.TYPE_UINT32) + """ + Count is the number of items present under the conditions of the request. + """ + + +@dataclass(eq=False, repr=False) +class ConfigDiffRequest(aristaproto.Message): + key: "ConfigDiffKey" = aristaproto.message_field(1) + """ + Key uniquely identifies a ConfigDiff instance to retrieve. + This value must be populated. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class ConfigDiffResponse(aristaproto.Message): + value: "ConfigDiff" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time carries the (UTC) timestamp of the last-modification of the + ConfigDiff instance in this response. + """ + + +@dataclass(eq=False, repr=False) +class ConfigDiffSomeRequest(aristaproto.Message): + keys: List["ConfigDiffKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class ConfigDiffSomeResponse(aristaproto.Message): + value: "ConfigDiff" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + +@dataclass(eq=False, repr=False) +class ConfigDiffStreamRequest(aristaproto.Message): + partial_eq_filter: List["ConfigDiff"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each ConfigDiff at end. + * Each ConfigDiff response is fully-specified (all fields set). + * start: Returns the state of each ConfigDiff at start, followed by updates until now. + * Each ConfigDiff response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each ConfigDiff at start, followed by updates + until end. + * Each ConfigDiff response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + +@dataclass(eq=False, repr=False) +class ConfigDiffStreamResponse(aristaproto.Message): + value: "ConfigDiff" = aristaproto.message_field(1) + """ + Value is a value deemed relevant to the initiating request. + This structure will always have its key-field populated. Which other fields are + populated, and why, depends on the value of Operation and what triggered this notification. + """ + + time: datetime = aristaproto.message_field(2) + """Time holds the timestamp of this ConfigDiff's last modification.""" + + type: "__subscriptions__.Operation" = aristaproto.enum_field(3) + """ + Operation indicates how the ConfigDiff value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + +@dataclass(eq=False, repr=False) +class ConfigDiffBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["ConfigDiff"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each ConfigDiff at end. + * Each ConfigDiff response is fully-specified (all fields set). + * start: Returns the state of each ConfigDiff at start, followed by updates until now. + * Each ConfigDiff response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each ConfigDiff at start, followed by updates + until end. + * Each ConfigDiff response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class ConfigDiffBatchedStreamResponse(aristaproto.Message): + responses: List["ConfigDiffStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + +@dataclass(eq=False, repr=False) +class ConfigurationRequest(aristaproto.Message): + key: "ConfigKey" = aristaproto.message_field(1) + """ + Key uniquely identifies a Configuration instance to retrieve. + This value must be populated. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class ConfigurationResponse(aristaproto.Message): + value: "Configuration" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time carries the (UTC) timestamp of the last-modification of the + Configuration instance in this response. + """ + + +@dataclass(eq=False, repr=False) +class ConfigurationSomeRequest(aristaproto.Message): + keys: List["ConfigKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class ConfigurationSomeResponse(aristaproto.Message): + value: "Configuration" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + +@dataclass(eq=False, repr=False) +class ConfigurationStreamRequest(aristaproto.Message): + partial_eq_filter: List["Configuration"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each Configuration at end. + * Each Configuration response is fully-specified (all fields set). + * start: Returns the state of each Configuration at start, followed by updates until now. + * Each Configuration response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each Configuration at start, followed by updates + until end. + * Each Configuration response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + +@dataclass(eq=False, repr=False) +class ConfigurationStreamResponse(aristaproto.Message): + value: "Configuration" = aristaproto.message_field(1) + """ + Value is a value deemed relevant to the initiating request. + This structure will always have its key-field populated. Which other fields are + populated, and why, depends on the value of Operation and what triggered this notification. + """ + + time: datetime = aristaproto.message_field(2) + """Time holds the timestamp of this Configuration's last modification.""" + + type: "__subscriptions__.Operation" = aristaproto.enum_field(3) + """ + Operation indicates how the Configuration value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + +@dataclass(eq=False, repr=False) +class ConfigurationBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["Configuration"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each Configuration at end. + * Each Configuration response is fully-specified (all fields set). + * start: Returns the state of each Configuration at start, followed by updates until now. + * Each Configuration response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each Configuration at start, followed by updates + until end. + * Each Configuration response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class ConfigurationBatchedStreamResponse(aristaproto.Message): + responses: List["ConfigurationStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + +@dataclass(eq=False, repr=False) +class SecurityProfileRequest(aristaproto.Message): + key: "ConfigKey" = aristaproto.message_field(1) + """ + Key uniquely identifies a SecurityProfile instance to retrieve. + This value must be populated. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class SecurityProfileResponse(aristaproto.Message): + value: "SecurityProfile" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time carries the (UTC) timestamp of the last-modification of the + SecurityProfile instance in this response. + """ + + +@dataclass(eq=False, repr=False) +class SecurityProfileSomeRequest(aristaproto.Message): + keys: List["ConfigKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class SecurityProfileSomeResponse(aristaproto.Message): + value: "SecurityProfile" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + +@dataclass(eq=False, repr=False) +class SecurityProfileStreamRequest(aristaproto.Message): + partial_eq_filter: List["SecurityProfile"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each SecurityProfile at end. + * Each SecurityProfile response is fully-specified (all fields set). + * start: Returns the state of each SecurityProfile at start, followed by updates until now. + * Each SecurityProfile response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each SecurityProfile at start, followed by updates + until end. + * Each SecurityProfile response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + +@dataclass(eq=False, repr=False) +class SecurityProfileStreamResponse(aristaproto.Message): + value: "SecurityProfile" = aristaproto.message_field(1) + """ + Value is a value deemed relevant to the initiating request. + This structure will always have its key-field populated. Which other fields are + populated, and why, depends on the value of Operation and what triggered this notification. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time holds the timestamp of this SecurityProfile's last modification. + """ + + type: "__subscriptions__.Operation" = aristaproto.enum_field(3) + """ + Operation indicates how the SecurityProfile value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + +@dataclass(eq=False, repr=False) +class SecurityProfileBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["SecurityProfile"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each SecurityProfile at end. + * Each SecurityProfile response is fully-specified (all fields set). + * start: Returns the state of each SecurityProfile at start, followed by updates until now. + * Each SecurityProfile response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each SecurityProfile at start, followed by updates + until end. + * Each SecurityProfile response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class SecurityProfileBatchedStreamResponse(aristaproto.Message): + responses: List["SecurityProfileStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + +@dataclass(eq=False, repr=False) +class SecurityProfileDiffRequest(aristaproto.Message): + key: "ConfigDiffKey" = aristaproto.message_field(1) + """ + Key uniquely identifies a SecurityProfileDiff instance to retrieve. + This value must be populated. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class SecurityProfileDiffResponse(aristaproto.Message): + value: "SecurityProfileDiff" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time carries the (UTC) timestamp of the last-modification of the + SecurityProfileDiff instance in this response. + """ + + +@dataclass(eq=False, repr=False) +class SecurityProfileDiffSomeRequest(aristaproto.Message): + keys: List["ConfigDiffKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class SecurityProfileDiffSomeResponse(aristaproto.Message): + value: "SecurityProfileDiff" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + +@dataclass(eq=False, repr=False) +class SecurityProfileDiffStreamRequest(aristaproto.Message): + partial_eq_filter: List["SecurityProfileDiff"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each SecurityProfileDiff at end. + * Each SecurityProfileDiff response is fully-specified (all fields set). + * start: Returns the state of each SecurityProfileDiff at start, followed by updates until now. + * Each SecurityProfileDiff response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each SecurityProfileDiff at start, followed by updates + until end. + * Each SecurityProfileDiff response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + +@dataclass(eq=False, repr=False) +class SecurityProfileDiffStreamResponse(aristaproto.Message): + value: "SecurityProfileDiff" = aristaproto.message_field(1) + """ + Value is a value deemed relevant to the initiating request. + This structure will always have its key-field populated. Which other fields are + populated, and why, depends on the value of Operation and what triggered this notification. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time holds the timestamp of this SecurityProfileDiff's last modification. + """ + + type: "__subscriptions__.Operation" = aristaproto.enum_field(3) + """ + Operation indicates how the SecurityProfileDiff value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + +@dataclass(eq=False, repr=False) +class SecurityProfileDiffBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["SecurityProfileDiff"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each SecurityProfileDiff at end. + * Each SecurityProfileDiff response is fully-specified (all fields set). + * start: Returns the state of each SecurityProfileDiff at start, followed by updates until now. + * Each SecurityProfileDiff response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each SecurityProfileDiff at start, followed by updates + until end. + * Each SecurityProfileDiff response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class SecurityProfileDiffBatchedStreamResponse(aristaproto.Message): + responses: List["SecurityProfileDiffStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + +@dataclass(eq=False, repr=False) +class SecurityProfileDiffSummaryRequest(aristaproto.Message): + key: "SummaryKey" = aristaproto.message_field(1) + """ + Key uniquely identifies a SecurityProfileDiffSummary instance to retrieve. + This value must be populated. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class SecurityProfileDiffSummaryResponse(aristaproto.Message): + value: "SecurityProfileDiffSummary" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time carries the (UTC) timestamp of the last-modification of the + SecurityProfileDiffSummary instance in this response. + """ + + +@dataclass(eq=False, repr=False) +class SecurityProfileDiffSummarySomeRequest(aristaproto.Message): + keys: List["SummaryKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class SecurityProfileDiffSummarySomeResponse(aristaproto.Message): + value: "SecurityProfileDiffSummary" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + +@dataclass(eq=False, repr=False) +class SecurityProfileDiffSummaryStreamRequest(aristaproto.Message): + partial_eq_filter: List["SecurityProfileDiffSummary"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each SecurityProfileDiffSummary at end. + * Each SecurityProfileDiffSummary response is fully-specified (all fields set). + * start: Returns the state of each SecurityProfileDiffSummary at start, followed by updates until now. + * Each SecurityProfileDiffSummary response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each SecurityProfileDiffSummary at start, followed by updates + until end. + * Each SecurityProfileDiffSummary response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + +@dataclass(eq=False, repr=False) +class SecurityProfileDiffSummaryStreamResponse(aristaproto.Message): + value: "SecurityProfileDiffSummary" = aristaproto.message_field(1) + """ + Value is a value deemed relevant to the initiating request. + This structure will always have its key-field populated. Which other fields are + populated, and why, depends on the value of Operation and what triggered this notification. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time holds the timestamp of this SecurityProfileDiffSummary's last modification. + """ + + type: "__subscriptions__.Operation" = aristaproto.enum_field(3) + """ + Operation indicates how the SecurityProfileDiffSummary value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + +@dataclass(eq=False, repr=False) +class SecurityProfileDiffSummaryBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["SecurityProfileDiffSummary"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each SecurityProfileDiffSummary at end. + * Each SecurityProfileDiffSummary response is fully-specified (all fields set). + * start: Returns the state of each SecurityProfileDiffSummary at start, followed by updates until now. + * Each SecurityProfileDiffSummary response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each SecurityProfileDiffSummary at start, followed by updates + until end. + * Each SecurityProfileDiffSummary response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class SecurityProfileDiffSummaryBatchedStreamResponse(aristaproto.Message): + responses: List["SecurityProfileDiffSummaryStreamResponse"] = ( + aristaproto.message_field(1) + ) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + +@dataclass(eq=False, repr=False) +class SummaryRequest(aristaproto.Message): + key: "SummaryKey" = aristaproto.message_field(1) + """ + Key uniquely identifies a Summary instance to retrieve. + This value must be populated. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class SummaryResponse(aristaproto.Message): + value: "Summary" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time carries the (UTC) timestamp of the last-modification of the + Summary instance in this response. + """ + + +@dataclass(eq=False, repr=False) +class SummarySomeRequest(aristaproto.Message): + keys: List["SummaryKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class SummarySomeResponse(aristaproto.Message): + value: "Summary" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + +@dataclass(eq=False, repr=False) +class SummaryStreamRequest(aristaproto.Message): + partial_eq_filter: List["Summary"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each Summary at end. + * Each Summary response is fully-specified (all fields set). + * start: Returns the state of each Summary at start, followed by updates until now. + * Each Summary response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each Summary at start, followed by updates + until end. + * Each Summary response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + +@dataclass(eq=False, repr=False) +class SummaryStreamResponse(aristaproto.Message): + value: "Summary" = aristaproto.message_field(1) + """ + Value is a value deemed relevant to the initiating request. + This structure will always have its key-field populated. Which other fields are + populated, and why, depends on the value of Operation and what triggered this notification. + """ + + time: datetime = aristaproto.message_field(2) + """Time holds the timestamp of this Summary's last modification.""" + + type: "__subscriptions__.Operation" = aristaproto.enum_field(3) + """ + Operation indicates how the Summary value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + +@dataclass(eq=False, repr=False) +class SummaryBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["Summary"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each Summary at end. + * Each Summary response is fully-specified (all fields set). + * start: Returns the state of each Summary at start, followed by updates until now. + * Each Summary response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each Summary at start, followed by updates + until end. + * Each Summary response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class SummaryBatchedStreamResponse(aristaproto.Message): + responses: List["SummaryStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + +class ConfigDiffServiceStub(aristaproto.ServiceStub): + async def get_one( + self, + config_diff_request: "ConfigDiffRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "ConfigDiffResponse": + return await self._unary_unary( + "/arista.configstatus.v1.ConfigDiffService/GetOne", + config_diff_request, + ConfigDiffResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def get_some( + self, + config_diff_some_request: "ConfigDiffSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ConfigDiffSomeResponse"]: + async for response in self._unary_stream( + "/arista.configstatus.v1.ConfigDiffService/GetSome", + config_diff_some_request, + ConfigDiffSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all( + self, + config_diff_stream_request: "ConfigDiffStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ConfigDiffStreamResponse"]: + async for response in self._unary_stream( + "/arista.configstatus.v1.ConfigDiffService/GetAll", + config_diff_stream_request, + ConfigDiffStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe( + self, + config_diff_stream_request: "ConfigDiffStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ConfigDiffStreamResponse"]: + async for response in self._unary_stream( + "/arista.configstatus.v1.ConfigDiffService/Subscribe", + config_diff_stream_request, + ConfigDiffStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_meta( + self, + config_diff_stream_request: "ConfigDiffStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.configstatus.v1.ConfigDiffService/GetMeta", + config_diff_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + config_diff_stream_request: "ConfigDiffStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.configstatus.v1.ConfigDiffService/SubscribeMeta", + config_diff_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all_batched( + self, + config_diff_batched_stream_request: "ConfigDiffBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ConfigDiffBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.configstatus.v1.ConfigDiffService/GetAllBatched", + config_diff_batched_stream_request, + ConfigDiffBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + config_diff_batched_stream_request: "ConfigDiffBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ConfigDiffBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.configstatus.v1.ConfigDiffService/SubscribeBatched", + config_diff_batched_stream_request, + ConfigDiffBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + +class ConfigurationServiceStub(aristaproto.ServiceStub): + async def get_one( + self, + configuration_request: "ConfigurationRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "ConfigurationResponse": + return await self._unary_unary( + "/arista.configstatus.v1.ConfigurationService/GetOne", + configuration_request, + ConfigurationResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def get_some( + self, + configuration_some_request: "ConfigurationSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ConfigurationSomeResponse"]: + async for response in self._unary_stream( + "/arista.configstatus.v1.ConfigurationService/GetSome", + configuration_some_request, + ConfigurationSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all( + self, + configuration_stream_request: "ConfigurationStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ConfigurationStreamResponse"]: + async for response in self._unary_stream( + "/arista.configstatus.v1.ConfigurationService/GetAll", + configuration_stream_request, + ConfigurationStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe( + self, + configuration_stream_request: "ConfigurationStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ConfigurationStreamResponse"]: + async for response in self._unary_stream( + "/arista.configstatus.v1.ConfigurationService/Subscribe", + configuration_stream_request, + ConfigurationStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_meta( + self, + configuration_stream_request: "ConfigurationStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.configstatus.v1.ConfigurationService/GetMeta", + configuration_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + configuration_stream_request: "ConfigurationStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.configstatus.v1.ConfigurationService/SubscribeMeta", + configuration_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all_batched( + self, + configuration_batched_stream_request: "ConfigurationBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ConfigurationBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.configstatus.v1.ConfigurationService/GetAllBatched", + configuration_batched_stream_request, + ConfigurationBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + configuration_batched_stream_request: "ConfigurationBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ConfigurationBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.configstatus.v1.ConfigurationService/SubscribeBatched", + configuration_batched_stream_request, + ConfigurationBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + +class SecurityProfileServiceStub(aristaproto.ServiceStub): + async def get_one( + self, + security_profile_request: "SecurityProfileRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "SecurityProfileResponse": + return await self._unary_unary( + "/arista.configstatus.v1.SecurityProfileService/GetOne", + security_profile_request, + SecurityProfileResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def get_some( + self, + security_profile_some_request: "SecurityProfileSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["SecurityProfileSomeResponse"]: + async for response in self._unary_stream( + "/arista.configstatus.v1.SecurityProfileService/GetSome", + security_profile_some_request, + SecurityProfileSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all( + self, + security_profile_stream_request: "SecurityProfileStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["SecurityProfileStreamResponse"]: + async for response in self._unary_stream( + "/arista.configstatus.v1.SecurityProfileService/GetAll", + security_profile_stream_request, + SecurityProfileStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe( + self, + security_profile_stream_request: "SecurityProfileStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["SecurityProfileStreamResponse"]: + async for response in self._unary_stream( + "/arista.configstatus.v1.SecurityProfileService/Subscribe", + security_profile_stream_request, + SecurityProfileStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_meta( + self, + security_profile_stream_request: "SecurityProfileStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.configstatus.v1.SecurityProfileService/GetMeta", + security_profile_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + security_profile_stream_request: "SecurityProfileStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.configstatus.v1.SecurityProfileService/SubscribeMeta", + security_profile_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all_batched( + self, + security_profile_batched_stream_request: "SecurityProfileBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["SecurityProfileBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.configstatus.v1.SecurityProfileService/GetAllBatched", + security_profile_batched_stream_request, + SecurityProfileBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + security_profile_batched_stream_request: "SecurityProfileBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["SecurityProfileBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.configstatus.v1.SecurityProfileService/SubscribeBatched", + security_profile_batched_stream_request, + SecurityProfileBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + +class SecurityProfileDiffServiceStub(aristaproto.ServiceStub): + async def get_one( + self, + security_profile_diff_request: "SecurityProfileDiffRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "SecurityProfileDiffResponse": + return await self._unary_unary( + "/arista.configstatus.v1.SecurityProfileDiffService/GetOne", + security_profile_diff_request, + SecurityProfileDiffResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def get_some( + self, + security_profile_diff_some_request: "SecurityProfileDiffSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["SecurityProfileDiffSomeResponse"]: + async for response in self._unary_stream( + "/arista.configstatus.v1.SecurityProfileDiffService/GetSome", + security_profile_diff_some_request, + SecurityProfileDiffSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all( + self, + security_profile_diff_stream_request: "SecurityProfileDiffStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["SecurityProfileDiffStreamResponse"]: + async for response in self._unary_stream( + "/arista.configstatus.v1.SecurityProfileDiffService/GetAll", + security_profile_diff_stream_request, + SecurityProfileDiffStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe( + self, + security_profile_diff_stream_request: "SecurityProfileDiffStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["SecurityProfileDiffStreamResponse"]: + async for response in self._unary_stream( + "/arista.configstatus.v1.SecurityProfileDiffService/Subscribe", + security_profile_diff_stream_request, + SecurityProfileDiffStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_meta( + self, + security_profile_diff_stream_request: "SecurityProfileDiffStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.configstatus.v1.SecurityProfileDiffService/GetMeta", + security_profile_diff_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + security_profile_diff_stream_request: "SecurityProfileDiffStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.configstatus.v1.SecurityProfileDiffService/SubscribeMeta", + security_profile_diff_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all_batched( + self, + security_profile_diff_batched_stream_request: "SecurityProfileDiffBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["SecurityProfileDiffBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.configstatus.v1.SecurityProfileDiffService/GetAllBatched", + security_profile_diff_batched_stream_request, + SecurityProfileDiffBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + security_profile_diff_batched_stream_request: "SecurityProfileDiffBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["SecurityProfileDiffBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.configstatus.v1.SecurityProfileDiffService/SubscribeBatched", + security_profile_diff_batched_stream_request, + SecurityProfileDiffBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + +class SecurityProfileDiffSummaryServiceStub(aristaproto.ServiceStub): + async def get_one( + self, + security_profile_diff_summary_request: "SecurityProfileDiffSummaryRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "SecurityProfileDiffSummaryResponse": + return await self._unary_unary( + "/arista.configstatus.v1.SecurityProfileDiffSummaryService/GetOne", + security_profile_diff_summary_request, + SecurityProfileDiffSummaryResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def get_some( + self, + security_profile_diff_summary_some_request: "SecurityProfileDiffSummarySomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["SecurityProfileDiffSummarySomeResponse"]: + async for response in self._unary_stream( + "/arista.configstatus.v1.SecurityProfileDiffSummaryService/GetSome", + security_profile_diff_summary_some_request, + SecurityProfileDiffSummarySomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all( + self, + security_profile_diff_summary_stream_request: "SecurityProfileDiffSummaryStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["SecurityProfileDiffSummaryStreamResponse"]: + async for response in self._unary_stream( + "/arista.configstatus.v1.SecurityProfileDiffSummaryService/GetAll", + security_profile_diff_summary_stream_request, + SecurityProfileDiffSummaryStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe( + self, + security_profile_diff_summary_stream_request: "SecurityProfileDiffSummaryStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["SecurityProfileDiffSummaryStreamResponse"]: + async for response in self._unary_stream( + "/arista.configstatus.v1.SecurityProfileDiffSummaryService/Subscribe", + security_profile_diff_summary_stream_request, + SecurityProfileDiffSummaryStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_meta( + self, + security_profile_diff_summary_stream_request: "SecurityProfileDiffSummaryStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.configstatus.v1.SecurityProfileDiffSummaryService/GetMeta", + security_profile_diff_summary_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + security_profile_diff_summary_stream_request: "SecurityProfileDiffSummaryStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.configstatus.v1.SecurityProfileDiffSummaryService/SubscribeMeta", + security_profile_diff_summary_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all_batched( + self, + security_profile_diff_summary_batched_stream_request: "SecurityProfileDiffSummaryBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["SecurityProfileDiffSummaryBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.configstatus.v1.SecurityProfileDiffSummaryService/GetAllBatched", + security_profile_diff_summary_batched_stream_request, + SecurityProfileDiffSummaryBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + security_profile_diff_summary_batched_stream_request: "SecurityProfileDiffSummaryBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["SecurityProfileDiffSummaryBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.configstatus.v1.SecurityProfileDiffSummaryService/SubscribeBatched", + security_profile_diff_summary_batched_stream_request, + SecurityProfileDiffSummaryBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + +class SummaryServiceStub(aristaproto.ServiceStub): + async def get_one( + self, + summary_request: "SummaryRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "SummaryResponse": + return await self._unary_unary( + "/arista.configstatus.v1.SummaryService/GetOne", + summary_request, + SummaryResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def get_some( + self, + summary_some_request: "SummarySomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["SummarySomeResponse"]: + async for response in self._unary_stream( + "/arista.configstatus.v1.SummaryService/GetSome", + summary_some_request, + SummarySomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all( + self, + summary_stream_request: "SummaryStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["SummaryStreamResponse"]: + async for response in self._unary_stream( + "/arista.configstatus.v1.SummaryService/GetAll", + summary_stream_request, + SummaryStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe( + self, + summary_stream_request: "SummaryStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["SummaryStreamResponse"]: + async for response in self._unary_stream( + "/arista.configstatus.v1.SummaryService/Subscribe", + summary_stream_request, + SummaryStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_meta( + self, + summary_stream_request: "SummaryStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.configstatus.v1.SummaryService/GetMeta", + summary_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + summary_stream_request: "SummaryStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.configstatus.v1.SummaryService/SubscribeMeta", + summary_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all_batched( + self, + summary_batched_stream_request: "SummaryBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["SummaryBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.configstatus.v1.SummaryService/GetAllBatched", + summary_batched_stream_request, + SummaryBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + summary_batched_stream_request: "SummaryBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["SummaryBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.configstatus.v1.SummaryService/SubscribeBatched", + summary_batched_stream_request, + SummaryBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + +class ConfigDiffServiceBase(ServiceBase): + + async def get_one( + self, config_diff_request: "ConfigDiffRequest" + ) -> "ConfigDiffResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_some( + self, config_diff_some_request: "ConfigDiffSomeRequest" + ) -> AsyncIterator["ConfigDiffSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all( + self, config_diff_stream_request: "ConfigDiffStreamRequest" + ) -> AsyncIterator["ConfigDiffStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe( + self, config_diff_stream_request: "ConfigDiffStreamRequest" + ) -> AsyncIterator["ConfigDiffStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_meta( + self, config_diff_stream_request: "ConfigDiffStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, config_diff_stream_request: "ConfigDiffStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all_batched( + self, config_diff_batched_stream_request: "ConfigDiffBatchedStreamRequest" + ) -> AsyncIterator["ConfigDiffBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, config_diff_batched_stream_request: "ConfigDiffBatchedStreamRequest" + ) -> AsyncIterator["ConfigDiffBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def __rpc_get_one( + self, stream: "grpclib.server.Stream[ConfigDiffRequest, ConfigDiffResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_one(request) + await stream.send_message(response) + + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[ConfigDiffSomeRequest, ConfigDiffSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + + async def __rpc_get_all( + self, + stream: "grpclib.server.Stream[ConfigDiffStreamRequest, ConfigDiffStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all, + stream, + request, + ) + + async def __rpc_subscribe( + self, + stream: "grpclib.server.Stream[ConfigDiffStreamRequest, ConfigDiffStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe, + stream, + request, + ) + + async def __rpc_get_meta( + self, stream: "grpclib.server.Stream[ConfigDiffStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, stream: "grpclib.server.Stream[ConfigDiffStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[ConfigDiffBatchedStreamRequest, ConfigDiffBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[ConfigDiffBatchedStreamRequest, ConfigDiffBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: + return { + "/arista.configstatus.v1.ConfigDiffService/GetOne": grpclib.const.Handler( + self.__rpc_get_one, + grpclib.const.Cardinality.UNARY_UNARY, + ConfigDiffRequest, + ConfigDiffResponse, + ), + "/arista.configstatus.v1.ConfigDiffService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + ConfigDiffSomeRequest, + ConfigDiffSomeResponse, + ), + "/arista.configstatus.v1.ConfigDiffService/GetAll": grpclib.const.Handler( + self.__rpc_get_all, + grpclib.const.Cardinality.UNARY_STREAM, + ConfigDiffStreamRequest, + ConfigDiffStreamResponse, + ), + "/arista.configstatus.v1.ConfigDiffService/Subscribe": grpclib.const.Handler( + self.__rpc_subscribe, + grpclib.const.Cardinality.UNARY_STREAM, + ConfigDiffStreamRequest, + ConfigDiffStreamResponse, + ), + "/arista.configstatus.v1.ConfigDiffService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + ConfigDiffStreamRequest, + MetaResponse, + ), + "/arista.configstatus.v1.ConfigDiffService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + ConfigDiffStreamRequest, + MetaResponse, + ), + "/arista.configstatus.v1.ConfigDiffService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + ConfigDiffBatchedStreamRequest, + ConfigDiffBatchedStreamResponse, + ), + "/arista.configstatus.v1.ConfigDiffService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + ConfigDiffBatchedStreamRequest, + ConfigDiffBatchedStreamResponse, + ), + } + + +class ConfigurationServiceBase(ServiceBase): + + async def get_one( + self, configuration_request: "ConfigurationRequest" + ) -> "ConfigurationResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_some( + self, configuration_some_request: "ConfigurationSomeRequest" + ) -> AsyncIterator["ConfigurationSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all( + self, configuration_stream_request: "ConfigurationStreamRequest" + ) -> AsyncIterator["ConfigurationStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe( + self, configuration_stream_request: "ConfigurationStreamRequest" + ) -> AsyncIterator["ConfigurationStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_meta( + self, configuration_stream_request: "ConfigurationStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, configuration_stream_request: "ConfigurationStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all_batched( + self, configuration_batched_stream_request: "ConfigurationBatchedStreamRequest" + ) -> AsyncIterator["ConfigurationBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, configuration_batched_stream_request: "ConfigurationBatchedStreamRequest" + ) -> AsyncIterator["ConfigurationBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def __rpc_get_one( + self, + stream: "grpclib.server.Stream[ConfigurationRequest, ConfigurationResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.get_one(request) + await stream.send_message(response) + + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[ConfigurationSomeRequest, ConfigurationSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + + async def __rpc_get_all( + self, + stream: "grpclib.server.Stream[ConfigurationStreamRequest, ConfigurationStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all, + stream, + request, + ) + + async def __rpc_subscribe( + self, + stream: "grpclib.server.Stream[ConfigurationStreamRequest, ConfigurationStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe, + stream, + request, + ) + + async def __rpc_get_meta( + self, stream: "grpclib.server.Stream[ConfigurationStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, stream: "grpclib.server.Stream[ConfigurationStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[ConfigurationBatchedStreamRequest, ConfigurationBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[ConfigurationBatchedStreamRequest, ConfigurationBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: + return { + "/arista.configstatus.v1.ConfigurationService/GetOne": grpclib.const.Handler( + self.__rpc_get_one, + grpclib.const.Cardinality.UNARY_UNARY, + ConfigurationRequest, + ConfigurationResponse, + ), + "/arista.configstatus.v1.ConfigurationService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + ConfigurationSomeRequest, + ConfigurationSomeResponse, + ), + "/arista.configstatus.v1.ConfigurationService/GetAll": grpclib.const.Handler( + self.__rpc_get_all, + grpclib.const.Cardinality.UNARY_STREAM, + ConfigurationStreamRequest, + ConfigurationStreamResponse, + ), + "/arista.configstatus.v1.ConfigurationService/Subscribe": grpclib.const.Handler( + self.__rpc_subscribe, + grpclib.const.Cardinality.UNARY_STREAM, + ConfigurationStreamRequest, + ConfigurationStreamResponse, + ), + "/arista.configstatus.v1.ConfigurationService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + ConfigurationStreamRequest, + MetaResponse, + ), + "/arista.configstatus.v1.ConfigurationService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + ConfigurationStreamRequest, + MetaResponse, + ), + "/arista.configstatus.v1.ConfigurationService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + ConfigurationBatchedStreamRequest, + ConfigurationBatchedStreamResponse, + ), + "/arista.configstatus.v1.ConfigurationService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + ConfigurationBatchedStreamRequest, + ConfigurationBatchedStreamResponse, + ), + } + + +class SecurityProfileServiceBase(ServiceBase): + + async def get_one( + self, security_profile_request: "SecurityProfileRequest" + ) -> "SecurityProfileResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_some( + self, security_profile_some_request: "SecurityProfileSomeRequest" + ) -> AsyncIterator["SecurityProfileSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all( + self, security_profile_stream_request: "SecurityProfileStreamRequest" + ) -> AsyncIterator["SecurityProfileStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe( + self, security_profile_stream_request: "SecurityProfileStreamRequest" + ) -> AsyncIterator["SecurityProfileStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_meta( + self, security_profile_stream_request: "SecurityProfileStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, security_profile_stream_request: "SecurityProfileStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all_batched( + self, + security_profile_batched_stream_request: "SecurityProfileBatchedStreamRequest", + ) -> AsyncIterator["SecurityProfileBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, + security_profile_batched_stream_request: "SecurityProfileBatchedStreamRequest", + ) -> AsyncIterator["SecurityProfileBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def __rpc_get_one( + self, + stream: "grpclib.server.Stream[SecurityProfileRequest, SecurityProfileResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.get_one(request) + await stream.send_message(response) + + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[SecurityProfileSomeRequest, SecurityProfileSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + + async def __rpc_get_all( + self, + stream: "grpclib.server.Stream[SecurityProfileStreamRequest, SecurityProfileStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all, + stream, + request, + ) + + async def __rpc_subscribe( + self, + stream: "grpclib.server.Stream[SecurityProfileStreamRequest, SecurityProfileStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe, + stream, + request, + ) + + async def __rpc_get_meta( + self, + stream: "grpclib.server.Stream[SecurityProfileStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, + stream: "grpclib.server.Stream[SecurityProfileStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[SecurityProfileBatchedStreamRequest, SecurityProfileBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[SecurityProfileBatchedStreamRequest, SecurityProfileBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: + return { + "/arista.configstatus.v1.SecurityProfileService/GetOne": grpclib.const.Handler( + self.__rpc_get_one, + grpclib.const.Cardinality.UNARY_UNARY, + SecurityProfileRequest, + SecurityProfileResponse, + ), + "/arista.configstatus.v1.SecurityProfileService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + SecurityProfileSomeRequest, + SecurityProfileSomeResponse, + ), + "/arista.configstatus.v1.SecurityProfileService/GetAll": grpclib.const.Handler( + self.__rpc_get_all, + grpclib.const.Cardinality.UNARY_STREAM, + SecurityProfileStreamRequest, + SecurityProfileStreamResponse, + ), + "/arista.configstatus.v1.SecurityProfileService/Subscribe": grpclib.const.Handler( + self.__rpc_subscribe, + grpclib.const.Cardinality.UNARY_STREAM, + SecurityProfileStreamRequest, + SecurityProfileStreamResponse, + ), + "/arista.configstatus.v1.SecurityProfileService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + SecurityProfileStreamRequest, + MetaResponse, + ), + "/arista.configstatus.v1.SecurityProfileService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + SecurityProfileStreamRequest, + MetaResponse, + ), + "/arista.configstatus.v1.SecurityProfileService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + SecurityProfileBatchedStreamRequest, + SecurityProfileBatchedStreamResponse, + ), + "/arista.configstatus.v1.SecurityProfileService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + SecurityProfileBatchedStreamRequest, + SecurityProfileBatchedStreamResponse, + ), + } + + +class SecurityProfileDiffServiceBase(ServiceBase): + + async def get_one( + self, security_profile_diff_request: "SecurityProfileDiffRequest" + ) -> "SecurityProfileDiffResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_some( + self, security_profile_diff_some_request: "SecurityProfileDiffSomeRequest" + ) -> AsyncIterator["SecurityProfileDiffSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all( + self, security_profile_diff_stream_request: "SecurityProfileDiffStreamRequest" + ) -> AsyncIterator["SecurityProfileDiffStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe( + self, security_profile_diff_stream_request: "SecurityProfileDiffStreamRequest" + ) -> AsyncIterator["SecurityProfileDiffStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_meta( + self, security_profile_diff_stream_request: "SecurityProfileDiffStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, security_profile_diff_stream_request: "SecurityProfileDiffStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all_batched( + self, + security_profile_diff_batched_stream_request: "SecurityProfileDiffBatchedStreamRequest", + ) -> AsyncIterator["SecurityProfileDiffBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, + security_profile_diff_batched_stream_request: "SecurityProfileDiffBatchedStreamRequest", + ) -> AsyncIterator["SecurityProfileDiffBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def __rpc_get_one( + self, + stream: "grpclib.server.Stream[SecurityProfileDiffRequest, SecurityProfileDiffResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.get_one(request) + await stream.send_message(response) + + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[SecurityProfileDiffSomeRequest, SecurityProfileDiffSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + + async def __rpc_get_all( + self, + stream: "grpclib.server.Stream[SecurityProfileDiffStreamRequest, SecurityProfileDiffStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all, + stream, + request, + ) + + async def __rpc_subscribe( + self, + stream: "grpclib.server.Stream[SecurityProfileDiffStreamRequest, SecurityProfileDiffStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe, + stream, + request, + ) + + async def __rpc_get_meta( + self, + stream: "grpclib.server.Stream[SecurityProfileDiffStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, + stream: "grpclib.server.Stream[SecurityProfileDiffStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[SecurityProfileDiffBatchedStreamRequest, SecurityProfileDiffBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[SecurityProfileDiffBatchedStreamRequest, SecurityProfileDiffBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: + return { + "/arista.configstatus.v1.SecurityProfileDiffService/GetOne": grpclib.const.Handler( + self.__rpc_get_one, + grpclib.const.Cardinality.UNARY_UNARY, + SecurityProfileDiffRequest, + SecurityProfileDiffResponse, + ), + "/arista.configstatus.v1.SecurityProfileDiffService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + SecurityProfileDiffSomeRequest, + SecurityProfileDiffSomeResponse, + ), + "/arista.configstatus.v1.SecurityProfileDiffService/GetAll": grpclib.const.Handler( + self.__rpc_get_all, + grpclib.const.Cardinality.UNARY_STREAM, + SecurityProfileDiffStreamRequest, + SecurityProfileDiffStreamResponse, + ), + "/arista.configstatus.v1.SecurityProfileDiffService/Subscribe": grpclib.const.Handler( + self.__rpc_subscribe, + grpclib.const.Cardinality.UNARY_STREAM, + SecurityProfileDiffStreamRequest, + SecurityProfileDiffStreamResponse, + ), + "/arista.configstatus.v1.SecurityProfileDiffService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + SecurityProfileDiffStreamRequest, + MetaResponse, + ), + "/arista.configstatus.v1.SecurityProfileDiffService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + SecurityProfileDiffStreamRequest, + MetaResponse, + ), + "/arista.configstatus.v1.SecurityProfileDiffService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + SecurityProfileDiffBatchedStreamRequest, + SecurityProfileDiffBatchedStreamResponse, + ), + "/arista.configstatus.v1.SecurityProfileDiffService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + SecurityProfileDiffBatchedStreamRequest, + SecurityProfileDiffBatchedStreamResponse, + ), + } + + +class SecurityProfileDiffSummaryServiceBase(ServiceBase): + + async def get_one( + self, security_profile_diff_summary_request: "SecurityProfileDiffSummaryRequest" + ) -> "SecurityProfileDiffSummaryResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_some( + self, + security_profile_diff_summary_some_request: "SecurityProfileDiffSummarySomeRequest", + ) -> AsyncIterator["SecurityProfileDiffSummarySomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all( + self, + security_profile_diff_summary_stream_request: "SecurityProfileDiffSummaryStreamRequest", + ) -> AsyncIterator["SecurityProfileDiffSummaryStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe( + self, + security_profile_diff_summary_stream_request: "SecurityProfileDiffSummaryStreamRequest", + ) -> AsyncIterator["SecurityProfileDiffSummaryStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_meta( + self, + security_profile_diff_summary_stream_request: "SecurityProfileDiffSummaryStreamRequest", + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, + security_profile_diff_summary_stream_request: "SecurityProfileDiffSummaryStreamRequest", + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all_batched( + self, + security_profile_diff_summary_batched_stream_request: "SecurityProfileDiffSummaryBatchedStreamRequest", + ) -> AsyncIterator["SecurityProfileDiffSummaryBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, + security_profile_diff_summary_batched_stream_request: "SecurityProfileDiffSummaryBatchedStreamRequest", + ) -> AsyncIterator["SecurityProfileDiffSummaryBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def __rpc_get_one( + self, + stream: "grpclib.server.Stream[SecurityProfileDiffSummaryRequest, SecurityProfileDiffSummaryResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.get_one(request) + await stream.send_message(response) + + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[SecurityProfileDiffSummarySomeRequest, SecurityProfileDiffSummarySomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + + async def __rpc_get_all( + self, + stream: "grpclib.server.Stream[SecurityProfileDiffSummaryStreamRequest, SecurityProfileDiffSummaryStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all, + stream, + request, + ) + + async def __rpc_subscribe( + self, + stream: "grpclib.server.Stream[SecurityProfileDiffSummaryStreamRequest, SecurityProfileDiffSummaryStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe, + stream, + request, + ) + + async def __rpc_get_meta( + self, + stream: "grpclib.server.Stream[SecurityProfileDiffSummaryStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, + stream: "grpclib.server.Stream[SecurityProfileDiffSummaryStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[SecurityProfileDiffSummaryBatchedStreamRequest, SecurityProfileDiffSummaryBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[SecurityProfileDiffSummaryBatchedStreamRequest, SecurityProfileDiffSummaryBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: + return { + "/arista.configstatus.v1.SecurityProfileDiffSummaryService/GetOne": grpclib.const.Handler( + self.__rpc_get_one, + grpclib.const.Cardinality.UNARY_UNARY, + SecurityProfileDiffSummaryRequest, + SecurityProfileDiffSummaryResponse, + ), + "/arista.configstatus.v1.SecurityProfileDiffSummaryService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + SecurityProfileDiffSummarySomeRequest, + SecurityProfileDiffSummarySomeResponse, + ), + "/arista.configstatus.v1.SecurityProfileDiffSummaryService/GetAll": grpclib.const.Handler( + self.__rpc_get_all, + grpclib.const.Cardinality.UNARY_STREAM, + SecurityProfileDiffSummaryStreamRequest, + SecurityProfileDiffSummaryStreamResponse, + ), + "/arista.configstatus.v1.SecurityProfileDiffSummaryService/Subscribe": grpclib.const.Handler( + self.__rpc_subscribe, + grpclib.const.Cardinality.UNARY_STREAM, + SecurityProfileDiffSummaryStreamRequest, + SecurityProfileDiffSummaryStreamResponse, + ), + "/arista.configstatus.v1.SecurityProfileDiffSummaryService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + SecurityProfileDiffSummaryStreamRequest, + MetaResponse, + ), + "/arista.configstatus.v1.SecurityProfileDiffSummaryService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + SecurityProfileDiffSummaryStreamRequest, + MetaResponse, + ), + "/arista.configstatus.v1.SecurityProfileDiffSummaryService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + SecurityProfileDiffSummaryBatchedStreamRequest, + SecurityProfileDiffSummaryBatchedStreamResponse, + ), + "/arista.configstatus.v1.SecurityProfileDiffSummaryService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + SecurityProfileDiffSummaryBatchedStreamRequest, + SecurityProfileDiffSummaryBatchedStreamResponse, + ), + } + + +class SummaryServiceBase(ServiceBase): + + async def get_one(self, summary_request: "SummaryRequest") -> "SummaryResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_some( + self, summary_some_request: "SummarySomeRequest" + ) -> AsyncIterator["SummarySomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all( + self, summary_stream_request: "SummaryStreamRequest" + ) -> AsyncIterator["SummaryStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe( + self, summary_stream_request: "SummaryStreamRequest" + ) -> AsyncIterator["SummaryStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_meta( + self, summary_stream_request: "SummaryStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, summary_stream_request: "SummaryStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all_batched( + self, summary_batched_stream_request: "SummaryBatchedStreamRequest" + ) -> AsyncIterator["SummaryBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, summary_batched_stream_request: "SummaryBatchedStreamRequest" + ) -> AsyncIterator["SummaryBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def __rpc_get_one( + self, stream: "grpclib.server.Stream[SummaryRequest, SummaryResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_one(request) + await stream.send_message(response) + + async def __rpc_get_some( + self, stream: "grpclib.server.Stream[SummarySomeRequest, SummarySomeResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + + async def __rpc_get_all( + self, + stream: "grpclib.server.Stream[SummaryStreamRequest, SummaryStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all, + stream, + request, + ) + + async def __rpc_subscribe( + self, + stream: "grpclib.server.Stream[SummaryStreamRequest, SummaryStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe, + stream, + request, + ) + + async def __rpc_get_meta( + self, stream: "grpclib.server.Stream[SummaryStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, stream: "grpclib.server.Stream[SummaryStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[SummaryBatchedStreamRequest, SummaryBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[SummaryBatchedStreamRequest, SummaryBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: + return { + "/arista.configstatus.v1.SummaryService/GetOne": grpclib.const.Handler( + self.__rpc_get_one, + grpclib.const.Cardinality.UNARY_UNARY, + SummaryRequest, + SummaryResponse, + ), + "/arista.configstatus.v1.SummaryService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + SummarySomeRequest, + SummarySomeResponse, + ), + "/arista.configstatus.v1.SummaryService/GetAll": grpclib.const.Handler( + self.__rpc_get_all, + grpclib.const.Cardinality.UNARY_STREAM, + SummaryStreamRequest, + SummaryStreamResponse, + ), + "/arista.configstatus.v1.SummaryService/Subscribe": grpclib.const.Handler( + self.__rpc_subscribe, + grpclib.const.Cardinality.UNARY_STREAM, + SummaryStreamRequest, + SummaryStreamResponse, + ), + "/arista.configstatus.v1.SummaryService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + SummaryStreamRequest, + MetaResponse, + ), + "/arista.configstatus.v1.SummaryService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + SummaryStreamRequest, + MetaResponse, + ), + "/arista.configstatus.v1.SummaryService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + SummaryBatchedStreamRequest, + SummaryBatchedStreamResponse, + ), + "/arista.configstatus.v1.SummaryService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + SummaryBatchedStreamRequest, + SummaryBatchedStreamResponse, + ), + } diff --git a/python-avd/pyavd/_cv/api/arista/connectivitymonitor/__init__.py b/python-avd/pyavd/_cv/api/arista/connectivitymonitor/__init__.py new file mode 100644 index 00000000000..b17ca7c745d --- /dev/null +++ b/python-avd/pyavd/_cv/api/arista/connectivitymonitor/__init__.py @@ -0,0 +1,3 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. diff --git a/python-avd/pyavd/_cv/api/arista/connectivitymonitor/v1/__init__.py b/python-avd/pyavd/_cv/api/arista/connectivitymonitor/v1/__init__.py new file mode 100644 index 00000000000..cc7ca2ba651 --- /dev/null +++ b/python-avd/pyavd/_cv/api/arista/connectivitymonitor/v1/__init__.py @@ -0,0 +1,1125 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +# Generated by the protocol buffer compiler. DO NOT EDIT! +# sources: arista/connectivitymonitor.v1/connectivitymonitor.proto, arista/connectivitymonitor.v1/services.gen.proto +# plugin: python-aristaproto +# This file has been @generated + +from dataclasses import dataclass +from datetime import datetime +from typing import ( + TYPE_CHECKING, + AsyncIterator, + Dict, + List, + Optional, +) + +import aristaproto +import grpclib +from aristaproto.grpc.grpclib_server import ServiceBase + +from ... import ( + subscriptions as __subscriptions__, + time as __time__, +) + + +if TYPE_CHECKING: + import grpclib.server + from aristaproto.grpc.grpclib_client import MetadataLike + from grpclib.metadata import Deadline + + +@dataclass(eq=False, repr=False) +class ProbeKey(aristaproto.Message): + """ProbeKey uniquely identifies a connectivity monitor probe.""" + + device_id: Optional[str] = aristaproto.message_field( + 1, wraps=aristaproto.TYPE_STRING + ) + """device_id is the id of the device in the probe.""" + + host: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """host is the hostname used in the probe.""" + + vrf: Optional[str] = aristaproto.message_field(3, wraps=aristaproto.TYPE_STRING) + """vrf is the name of the VRF in the probe.""" + + +@dataclass(eq=False, repr=False) +class ProbeStatsKey(aristaproto.Message): + """ + ProbeStatsKey uniquely identifies a connectivity monitor probe's statistics, + per source interface. + """ + + device_id: Optional[str] = aristaproto.message_field( + 1, wraps=aristaproto.TYPE_STRING + ) + """device_id is the id of the device in the probe.""" + + host: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """host is the hostname used in the probe.""" + + vrf: Optional[str] = aristaproto.message_field(3, wraps=aristaproto.TYPE_STRING) + """vrf is the name of the VRF in the probe.""" + + source_intf: Optional[str] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_STRING + ) + """source_intf is the name of the interface in the probe.""" + + +@dataclass(eq=False, repr=False) +class Probe(aristaproto.Message): + """ + Probe is identifying information of a connectivity monitor probe. + It is used to retrieve probe information without getting the corresponding stats so that + probe information can be displayed without streaming all related data, such as in the UI. + """ + + key: "ProbeKey" = aristaproto.message_field(1) + """key uniquely identifies the connectivity monitor probe.""" + + ip_addr: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ip_addr is the IP Address of the probe.""" + + host_name: Optional[str] = aristaproto.message_field( + 3, wraps=aristaproto.TYPE_STRING + ) + """host_name is the name of the host of the probe.""" + + description: Optional[str] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_STRING + ) + """description is the description of the probe.""" + + +@dataclass(eq=False, repr=False) +class ProbeStats(aristaproto.Message): + """ + ProbeStats is the connectivity monitor statistics related to the specified probe. + """ + + key: "ProbeStatsKey" = aristaproto.message_field(1) + """key uniquely identifies the connectivity monitor probe.""" + + latency_millis: Optional[float] = aristaproto.message_field( + 2, wraps=aristaproto.TYPE_DOUBLE + ) + """ + latency_millis is the latency between the device interface and the host. + Value is in milliseconds. + """ + + jitter_millis: Optional[float] = aristaproto.message_field( + 3, wraps=aristaproto.TYPE_DOUBLE + ) + """ + jitter_millis is the amount of jitter experienced by requests + between the device interface and host. + Value is in milliseconds. + """ + + http_response_time_millis: Optional[float] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_DOUBLE + ) + """ + http_response_time_millis is the amount of time taken to respond to a http + request between the device interface and the host. + Value is in milliseconds. + """ + + packet_loss_percent: Optional[int] = aristaproto.message_field( + 5, wraps=aristaproto.TYPE_INT64 + ) + """ + packet_loss_percent is the amount of packet loss experienced + by requests between the device interface and host. + Value is a percentage. + """ + + error: Optional[str] = aristaproto.message_field(6, wraps=aristaproto.TYPE_STRING) + """error is the error reported on the connection.""" + + +@dataclass(eq=False, repr=False) +class MetaResponse(aristaproto.Message): + time: datetime = aristaproto.message_field(1) + """ + Time holds the timestamp of the last item included in the metadata calculation. + """ + + type: "__subscriptions__.Operation" = aristaproto.enum_field(2) + """ + Operation indicates how the value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + count: Optional[int] = aristaproto.message_field(3, wraps=aristaproto.TYPE_UINT32) + """ + Count is the number of items present under the conditions of the request. + """ + + +@dataclass(eq=False, repr=False) +class ProbeRequest(aristaproto.Message): + key: "ProbeKey" = aristaproto.message_field(1) + """ + Key uniquely identifies a Probe instance to retrieve. + This value must be populated. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class ProbeResponse(aristaproto.Message): + value: "Probe" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time carries the (UTC) timestamp of the last-modification of the + Probe instance in this response. + """ + + +@dataclass(eq=False, repr=False) +class ProbeSomeRequest(aristaproto.Message): + keys: List["ProbeKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class ProbeSomeResponse(aristaproto.Message): + value: "Probe" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + +@dataclass(eq=False, repr=False) +class ProbeStreamRequest(aristaproto.Message): + partial_eq_filter: List["Probe"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each Probe at end. + * Each Probe response is fully-specified (all fields set). + * start: Returns the state of each Probe at start, followed by updates until now. + * Each Probe response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each Probe at start, followed by updates + until end. + * Each Probe response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + +@dataclass(eq=False, repr=False) +class ProbeStreamResponse(aristaproto.Message): + value: "Probe" = aristaproto.message_field(1) + """ + Value is a value deemed relevant to the initiating request. + This structure will always have its key-field populated. Which other fields are + populated, and why, depends on the value of Operation and what triggered this notification. + """ + + time: datetime = aristaproto.message_field(2) + """Time holds the timestamp of this Probe's last modification.""" + + type: "__subscriptions__.Operation" = aristaproto.enum_field(3) + """ + Operation indicates how the Probe value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + +@dataclass(eq=False, repr=False) +class ProbeBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["Probe"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each Probe at end. + * Each Probe response is fully-specified (all fields set). + * start: Returns the state of each Probe at start, followed by updates until now. + * Each Probe response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each Probe at start, followed by updates + until end. + * Each Probe response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class ProbeBatchedStreamResponse(aristaproto.Message): + responses: List["ProbeStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + +@dataclass(eq=False, repr=False) +class ProbeStatsRequest(aristaproto.Message): + key: "ProbeStatsKey" = aristaproto.message_field(1) + """ + Key uniquely identifies a ProbeStats instance to retrieve. + This value must be populated. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class ProbeStatsResponse(aristaproto.Message): + value: "ProbeStats" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time carries the (UTC) timestamp of the last-modification of the + ProbeStats instance in this response. + """ + + +@dataclass(eq=False, repr=False) +class ProbeStatsSomeRequest(aristaproto.Message): + keys: List["ProbeStatsKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class ProbeStatsSomeResponse(aristaproto.Message): + value: "ProbeStats" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + +@dataclass(eq=False, repr=False) +class ProbeStatsStreamRequest(aristaproto.Message): + partial_eq_filter: List["ProbeStats"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each ProbeStats at end. + * Each ProbeStats response is fully-specified (all fields set). + * start: Returns the state of each ProbeStats at start, followed by updates until now. + * Each ProbeStats response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each ProbeStats at start, followed by updates + until end. + * Each ProbeStats response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + +@dataclass(eq=False, repr=False) +class ProbeStatsStreamResponse(aristaproto.Message): + value: "ProbeStats" = aristaproto.message_field(1) + """ + Value is a value deemed relevant to the initiating request. + This structure will always have its key-field populated. Which other fields are + populated, and why, depends on the value of Operation and what triggered this notification. + """ + + time: datetime = aristaproto.message_field(2) + """Time holds the timestamp of this ProbeStats's last modification.""" + + type: "__subscriptions__.Operation" = aristaproto.enum_field(3) + """ + Operation indicates how the ProbeStats value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + +@dataclass(eq=False, repr=False) +class ProbeStatsBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["ProbeStats"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each ProbeStats at end. + * Each ProbeStats response is fully-specified (all fields set). + * start: Returns the state of each ProbeStats at start, followed by updates until now. + * Each ProbeStats response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each ProbeStats at start, followed by updates + until end. + * Each ProbeStats response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class ProbeStatsBatchedStreamResponse(aristaproto.Message): + responses: List["ProbeStatsStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + +class ProbeServiceStub(aristaproto.ServiceStub): + async def get_one( + self, + probe_request: "ProbeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "ProbeResponse": + return await self._unary_unary( + "/arista.connectivitymonitor.v1.ProbeService/GetOne", + probe_request, + ProbeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def get_some( + self, + probe_some_request: "ProbeSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ProbeSomeResponse"]: + async for response in self._unary_stream( + "/arista.connectivitymonitor.v1.ProbeService/GetSome", + probe_some_request, + ProbeSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all( + self, + probe_stream_request: "ProbeStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ProbeStreamResponse"]: + async for response in self._unary_stream( + "/arista.connectivitymonitor.v1.ProbeService/GetAll", + probe_stream_request, + ProbeStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe( + self, + probe_stream_request: "ProbeStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ProbeStreamResponse"]: + async for response in self._unary_stream( + "/arista.connectivitymonitor.v1.ProbeService/Subscribe", + probe_stream_request, + ProbeStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_meta( + self, + probe_stream_request: "ProbeStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.connectivitymonitor.v1.ProbeService/GetMeta", + probe_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + probe_stream_request: "ProbeStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.connectivitymonitor.v1.ProbeService/SubscribeMeta", + probe_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all_batched( + self, + probe_batched_stream_request: "ProbeBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ProbeBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.connectivitymonitor.v1.ProbeService/GetAllBatched", + probe_batched_stream_request, + ProbeBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + probe_batched_stream_request: "ProbeBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ProbeBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.connectivitymonitor.v1.ProbeService/SubscribeBatched", + probe_batched_stream_request, + ProbeBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + +class ProbeStatsServiceStub(aristaproto.ServiceStub): + async def get_one( + self, + probe_stats_request: "ProbeStatsRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "ProbeStatsResponse": + return await self._unary_unary( + "/arista.connectivitymonitor.v1.ProbeStatsService/GetOne", + probe_stats_request, + ProbeStatsResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def get_some( + self, + probe_stats_some_request: "ProbeStatsSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ProbeStatsSomeResponse"]: + async for response in self._unary_stream( + "/arista.connectivitymonitor.v1.ProbeStatsService/GetSome", + probe_stats_some_request, + ProbeStatsSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all( + self, + probe_stats_stream_request: "ProbeStatsStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ProbeStatsStreamResponse"]: + async for response in self._unary_stream( + "/arista.connectivitymonitor.v1.ProbeStatsService/GetAll", + probe_stats_stream_request, + ProbeStatsStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe( + self, + probe_stats_stream_request: "ProbeStatsStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ProbeStatsStreamResponse"]: + async for response in self._unary_stream( + "/arista.connectivitymonitor.v1.ProbeStatsService/Subscribe", + probe_stats_stream_request, + ProbeStatsStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_meta( + self, + probe_stats_stream_request: "ProbeStatsStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.connectivitymonitor.v1.ProbeStatsService/GetMeta", + probe_stats_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + probe_stats_stream_request: "ProbeStatsStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.connectivitymonitor.v1.ProbeStatsService/SubscribeMeta", + probe_stats_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all_batched( + self, + probe_stats_batched_stream_request: "ProbeStatsBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ProbeStatsBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.connectivitymonitor.v1.ProbeStatsService/GetAllBatched", + probe_stats_batched_stream_request, + ProbeStatsBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + probe_stats_batched_stream_request: "ProbeStatsBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ProbeStatsBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.connectivitymonitor.v1.ProbeStatsService/SubscribeBatched", + probe_stats_batched_stream_request, + ProbeStatsBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + +class ProbeServiceBase(ServiceBase): + + async def get_one(self, probe_request: "ProbeRequest") -> "ProbeResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_some( + self, probe_some_request: "ProbeSomeRequest" + ) -> AsyncIterator["ProbeSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all( + self, probe_stream_request: "ProbeStreamRequest" + ) -> AsyncIterator["ProbeStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe( + self, probe_stream_request: "ProbeStreamRequest" + ) -> AsyncIterator["ProbeStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_meta( + self, probe_stream_request: "ProbeStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, probe_stream_request: "ProbeStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all_batched( + self, probe_batched_stream_request: "ProbeBatchedStreamRequest" + ) -> AsyncIterator["ProbeBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, probe_batched_stream_request: "ProbeBatchedStreamRequest" + ) -> AsyncIterator["ProbeBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def __rpc_get_one( + self, stream: "grpclib.server.Stream[ProbeRequest, ProbeResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_one(request) + await stream.send_message(response) + + async def __rpc_get_some( + self, stream: "grpclib.server.Stream[ProbeSomeRequest, ProbeSomeResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + + async def __rpc_get_all( + self, stream: "grpclib.server.Stream[ProbeStreamRequest, ProbeStreamResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all, + stream, + request, + ) + + async def __rpc_subscribe( + self, stream: "grpclib.server.Stream[ProbeStreamRequest, ProbeStreamResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe, + stream, + request, + ) + + async def __rpc_get_meta( + self, stream: "grpclib.server.Stream[ProbeStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, stream: "grpclib.server.Stream[ProbeStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[ProbeBatchedStreamRequest, ProbeBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[ProbeBatchedStreamRequest, ProbeBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: + return { + "/arista.connectivitymonitor.v1.ProbeService/GetOne": grpclib.const.Handler( + self.__rpc_get_one, + grpclib.const.Cardinality.UNARY_UNARY, + ProbeRequest, + ProbeResponse, + ), + "/arista.connectivitymonitor.v1.ProbeService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + ProbeSomeRequest, + ProbeSomeResponse, + ), + "/arista.connectivitymonitor.v1.ProbeService/GetAll": grpclib.const.Handler( + self.__rpc_get_all, + grpclib.const.Cardinality.UNARY_STREAM, + ProbeStreamRequest, + ProbeStreamResponse, + ), + "/arista.connectivitymonitor.v1.ProbeService/Subscribe": grpclib.const.Handler( + self.__rpc_subscribe, + grpclib.const.Cardinality.UNARY_STREAM, + ProbeStreamRequest, + ProbeStreamResponse, + ), + "/arista.connectivitymonitor.v1.ProbeService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + ProbeStreamRequest, + MetaResponse, + ), + "/arista.connectivitymonitor.v1.ProbeService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + ProbeStreamRequest, + MetaResponse, + ), + "/arista.connectivitymonitor.v1.ProbeService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + ProbeBatchedStreamRequest, + ProbeBatchedStreamResponse, + ), + "/arista.connectivitymonitor.v1.ProbeService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + ProbeBatchedStreamRequest, + ProbeBatchedStreamResponse, + ), + } + + +class ProbeStatsServiceBase(ServiceBase): + + async def get_one( + self, probe_stats_request: "ProbeStatsRequest" + ) -> "ProbeStatsResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_some( + self, probe_stats_some_request: "ProbeStatsSomeRequest" + ) -> AsyncIterator["ProbeStatsSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all( + self, probe_stats_stream_request: "ProbeStatsStreamRequest" + ) -> AsyncIterator["ProbeStatsStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe( + self, probe_stats_stream_request: "ProbeStatsStreamRequest" + ) -> AsyncIterator["ProbeStatsStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_meta( + self, probe_stats_stream_request: "ProbeStatsStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, probe_stats_stream_request: "ProbeStatsStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all_batched( + self, probe_stats_batched_stream_request: "ProbeStatsBatchedStreamRequest" + ) -> AsyncIterator["ProbeStatsBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, probe_stats_batched_stream_request: "ProbeStatsBatchedStreamRequest" + ) -> AsyncIterator["ProbeStatsBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def __rpc_get_one( + self, stream: "grpclib.server.Stream[ProbeStatsRequest, ProbeStatsResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_one(request) + await stream.send_message(response) + + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[ProbeStatsSomeRequest, ProbeStatsSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + + async def __rpc_get_all( + self, + stream: "grpclib.server.Stream[ProbeStatsStreamRequest, ProbeStatsStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all, + stream, + request, + ) + + async def __rpc_subscribe( + self, + stream: "grpclib.server.Stream[ProbeStatsStreamRequest, ProbeStatsStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe, + stream, + request, + ) + + async def __rpc_get_meta( + self, stream: "grpclib.server.Stream[ProbeStatsStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, stream: "grpclib.server.Stream[ProbeStatsStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[ProbeStatsBatchedStreamRequest, ProbeStatsBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[ProbeStatsBatchedStreamRequest, ProbeStatsBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: + return { + "/arista.connectivitymonitor.v1.ProbeStatsService/GetOne": grpclib.const.Handler( + self.__rpc_get_one, + grpclib.const.Cardinality.UNARY_UNARY, + ProbeStatsRequest, + ProbeStatsResponse, + ), + "/arista.connectivitymonitor.v1.ProbeStatsService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + ProbeStatsSomeRequest, + ProbeStatsSomeResponse, + ), + "/arista.connectivitymonitor.v1.ProbeStatsService/GetAll": grpclib.const.Handler( + self.__rpc_get_all, + grpclib.const.Cardinality.UNARY_STREAM, + ProbeStatsStreamRequest, + ProbeStatsStreamResponse, + ), + "/arista.connectivitymonitor.v1.ProbeStatsService/Subscribe": grpclib.const.Handler( + self.__rpc_subscribe, + grpclib.const.Cardinality.UNARY_STREAM, + ProbeStatsStreamRequest, + ProbeStatsStreamResponse, + ), + "/arista.connectivitymonitor.v1.ProbeStatsService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + ProbeStatsStreamRequest, + MetaResponse, + ), + "/arista.connectivitymonitor.v1.ProbeStatsService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + ProbeStatsStreamRequest, + MetaResponse, + ), + "/arista.connectivitymonitor.v1.ProbeStatsService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + ProbeStatsBatchedStreamRequest, + ProbeStatsBatchedStreamResponse, + ), + "/arista.connectivitymonitor.v1.ProbeStatsService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + ProbeStatsBatchedStreamRequest, + ProbeStatsBatchedStreamResponse, + ), + } diff --git a/python-avd/pyavd/_cv/api/arista/dashboard/__init__.py b/python-avd/pyavd/_cv/api/arista/dashboard/__init__.py new file mode 100644 index 00000000000..b17ca7c745d --- /dev/null +++ b/python-avd/pyavd/_cv/api/arista/dashboard/__init__.py @@ -0,0 +1,3 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/dashboard/v1/__init__.py b/python-avd/pyavd/_cv/api/arista/dashboard/v1/__init__.py similarity index 56% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/dashboard/v1/__init__.py rename to python-avd/pyavd/_cv/api/arista/dashboard/v1/__init__.py index 5f9e189f973..cbeb4b5df7c 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/dashboard/v1/__init__.py +++ b/python-avd/pyavd/_cv/api/arista/dashboard/v1/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. +# Copyright (c) 2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. # Generated by the protocol buffer compiler. DO NOT EDIT! @@ -16,17 +16,9 @@ Optional, ) -try: - import aristaproto - import grpclib - from aristaproto.grpc.grpclib_server import ServiceBase -except ImportError: - HAS_ARISTAPROTO = False - from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_aristaproto as aristaproto - from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_grpclib as grpclib - ServiceBase = object -else: - HAS_ARISTAPROTO = True +import aristaproto +import grpclib +from aristaproto.grpc.grpclib_server import ServiceBase from .... import fmp as ___fmp__ from ... import ( @@ -297,6 +289,27 @@ class GlobalDashboardConfig(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class MetaResponse(aristaproto.Message): + time: datetime = aristaproto.message_field(1) + """ + Time holds the timestamp of the last item included in the metadata calculation. + """ + + type: "__subscriptions__.Operation" = aristaproto.enum_field(2) + """ + Operation indicates how the value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + count: Optional[int] = aristaproto.message_field(3, wraps=aristaproto.TYPE_UINT32) + """ + Count is the number of items present under the conditions of the request. + """ + + @dataclass(eq=False, repr=False) class DashboardRequest(aristaproto.Message): key: "DashboardKey" = aristaproto.message_field(1) @@ -329,6 +342,35 @@ class DashboardResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class DashboardSomeRequest(aristaproto.Message): + keys: List["DashboardKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class DashboardSomeResponse(aristaproto.Message): + value: "Dashboard" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + @dataclass(eq=False, repr=False) class DashboardStreamRequest(aristaproto.Message): partial_eq_filter: List["Dashboard"] = aristaproto.message_field(1) @@ -388,6 +430,64 @@ class DashboardStreamResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class DashboardBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["Dashboard"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + filter: List["Filter"] = aristaproto.message_field(2) + """ + For each Dashboard in the list, all populated fields are considered ANDed together + as a filtering operation. Similarly, the list itself is ORed such that any individual + filter that matches a given Dashboard is streamed to the user. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each Dashboard at end. + * Each Dashboard response is fully-specified (all fields set). + * start: Returns the state of each Dashboard at start, followed by updates until now. + * Each Dashboard response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each Dashboard at start, followed by updates + until end. + * Each Dashboard response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class DashboardBatchedStreamResponse(aristaproto.Message): + responses: List["DashboardStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + @dataclass(eq=False, repr=False) class DashboardConfigRequest(aristaproto.Message): key: "DashboardKey" = aristaproto.message_field(1) @@ -420,6 +520,35 @@ class DashboardConfigResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class DashboardConfigSomeRequest(aristaproto.Message): + keys: List["DashboardKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class DashboardConfigSomeResponse(aristaproto.Message): + value: "DashboardConfig" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + @dataclass(eq=False, repr=False) class DashboardConfigStreamRequest(aristaproto.Message): partial_eq_filter: List["DashboardConfig"] = aristaproto.message_field(1) @@ -474,6 +603,57 @@ class DashboardConfigStreamResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class DashboardConfigBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["DashboardConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each DashboardConfig at end. + * Each DashboardConfig response is fully-specified (all fields set). + * start: Returns the state of each DashboardConfig at start, followed by updates until now. + * Each DashboardConfig response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each DashboardConfig at start, followed by updates + until end. + * Each DashboardConfig response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class DashboardConfigBatchedStreamResponse(aristaproto.Message): + responses: List["DashboardConfigStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + @dataclass(eq=False, repr=False) class DashboardConfigSetRequest(aristaproto.Message): value: "DashboardConfig" = aristaproto.message_field(1) @@ -544,15 +724,39 @@ class DashboardConfigDeleteResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class DashboardConfigDeleteSomeRequest(aristaproto.Message): + keys: List["DashboardKey"] = aristaproto.message_field(1) + """key contains a list of DashboardConfig keys to delete""" + + +@dataclass(eq=False, repr=False) +class DashboardConfigDeleteSomeResponse(aristaproto.Message): + """ + DashboardConfigDeleteSomeResponse is only sent when there is an error. + """ + + key: "DashboardKey" = aristaproto.message_field(1) + error: str = aristaproto.string_field(2) + + @dataclass(eq=False, repr=False) class DashboardConfigDeleteAllRequest(aristaproto.Message): - pass + partial_eq_filter: List["DashboardConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a DeleteAll. + This requires all provided fields to be equal to the response. + A filtered DeleteAll will use GetAll with filter to find things to delete. + """ @dataclass(eq=False, repr=False) class DashboardConfigDeleteAllResponse(aristaproto.Message): type: "___fmp__.DeleteError" = aristaproto.enum_field(1) - """This describes the class of delete error.""" + """ + This describes the class of delete error. + A DeleteAllResponse is only sent when there is an error. + """ error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) """This indicates the error message from the delete failure.""" @@ -646,6 +850,59 @@ class GlobalDashboardConfigStreamResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class GlobalDashboardConfigBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["GlobalDashboardConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each GlobalDashboardConfig at end. + * Each GlobalDashboardConfig response is fully-specified (all fields set). + * start: Returns the state of each GlobalDashboardConfig at start, followed by updates until now. + * Each GlobalDashboardConfig response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each GlobalDashboardConfig at start, followed by updates + until end. + * Each GlobalDashboardConfig response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class GlobalDashboardConfigBatchedStreamResponse(aristaproto.Message): + responses: List["GlobalDashboardConfigStreamResponse"] = aristaproto.message_field( + 1 + ) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + @dataclass(eq=False, repr=False) class GlobalDashboardConfigSetRequest(aristaproto.Message): value: "GlobalDashboardConfig" = aristaproto.message_field(1) @@ -691,6 +948,24 @@ async def get_one( metadata=metadata, ) + async def get_some( + self, + dashboard_some_request: "DashboardSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DashboardSomeResponse"]: + async for response in self._unary_stream( + "/arista.dashboard.v1.DashboardService/GetSome", + dashboard_some_request, + DashboardSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def get_all( self, dashboard_stream_request: "DashboardStreamRequest", @@ -727,79 +1002,203 @@ async def subscribe( ): yield response - -class DashboardConfigServiceStub(aristaproto.ServiceStub): - async def get_one( + async def get_meta( self, - dashboard_config_request: "DashboardConfigRequest", + dashboard_stream_request: "DashboardStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> "DashboardConfigResponse": + ) -> "MetaResponse": return await self._unary_unary( - "/arista.dashboard.v1.DashboardConfigService/GetOne", - dashboard_config_request, - DashboardConfigResponse, + "/arista.dashboard.v1.DashboardService/GetMeta", + dashboard_stream_request, + MetaResponse, timeout=timeout, deadline=deadline, metadata=metadata, ) - async def get_all( + async def subscribe_meta( self, - dashboard_config_stream_request: "DashboardConfigStreamRequest", + dashboard_stream_request: "DashboardStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["DashboardConfigStreamResponse"]: + ) -> AsyncIterator["MetaResponse"]: async for response in self._unary_stream( - "/arista.dashboard.v1.DashboardConfigService/GetAll", - dashboard_config_stream_request, - DashboardConfigStreamResponse, + "/arista.dashboard.v1.DashboardService/SubscribeMeta", + dashboard_stream_request, + MetaResponse, timeout=timeout, deadline=deadline, metadata=metadata, ): yield response - async def subscribe( + async def get_all_batched( self, - dashboard_config_stream_request: "DashboardConfigStreamRequest", + dashboard_batched_stream_request: "DashboardBatchedStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["DashboardConfigStreamResponse"]: + ) -> AsyncIterator["DashboardBatchedStreamResponse"]: async for response in self._unary_stream( - "/arista.dashboard.v1.DashboardConfigService/Subscribe", - dashboard_config_stream_request, - DashboardConfigStreamResponse, + "/arista.dashboard.v1.DashboardService/GetAllBatched", + dashboard_batched_stream_request, + DashboardBatchedStreamResponse, timeout=timeout, deadline=deadline, metadata=metadata, ): yield response - async def set( + async def subscribe_batched( self, - dashboard_config_set_request: "DashboardConfigSetRequest", + dashboard_batched_stream_request: "DashboardBatchedStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> "DashboardConfigSetResponse": - return await self._unary_unary( - "/arista.dashboard.v1.DashboardConfigService/Set", - dashboard_config_set_request, - DashboardConfigSetResponse, + ) -> AsyncIterator["DashboardBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.dashboard.v1.DashboardService/SubscribeBatched", + dashboard_batched_stream_request, + DashboardBatchedStreamResponse, timeout=timeout, deadline=deadline, metadata=metadata, - ) + ): + yield response - async def set_some( + +class DashboardConfigServiceStub(aristaproto.ServiceStub): + async def get_one( + self, + dashboard_config_request: "DashboardConfigRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "DashboardConfigResponse": + return await self._unary_unary( + "/arista.dashboard.v1.DashboardConfigService/GetOne", + dashboard_config_request, + DashboardConfigResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def get_some( + self, + dashboard_config_some_request: "DashboardConfigSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DashboardConfigSomeResponse"]: + async for response in self._unary_stream( + "/arista.dashboard.v1.DashboardConfigService/GetSome", + dashboard_config_some_request, + DashboardConfigSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all( + self, + dashboard_config_stream_request: "DashboardConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DashboardConfigStreamResponse"]: + async for response in self._unary_stream( + "/arista.dashboard.v1.DashboardConfigService/GetAll", + dashboard_config_stream_request, + DashboardConfigStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe( + self, + dashboard_config_stream_request: "DashboardConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DashboardConfigStreamResponse"]: + async for response in self._unary_stream( + "/arista.dashboard.v1.DashboardConfigService/Subscribe", + dashboard_config_stream_request, + DashboardConfigStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_meta( + self, + dashboard_config_stream_request: "DashboardConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.dashboard.v1.DashboardConfigService/GetMeta", + dashboard_config_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + dashboard_config_stream_request: "DashboardConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.dashboard.v1.DashboardConfigService/SubscribeMeta", + dashboard_config_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def set( + self, + dashboard_config_set_request: "DashboardConfigSetRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "DashboardConfigSetResponse": + return await self._unary_unary( + "/arista.dashboard.v1.DashboardConfigService/Set", + dashboard_config_set_request, + DashboardConfigSetResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def set_some( self, dashboard_config_set_some_request: "DashboardConfigSetSomeRequest", *, @@ -834,6 +1233,24 @@ async def delete( metadata=metadata, ) + async def delete_some( + self, + dashboard_config_delete_some_request: "DashboardConfigDeleteSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DashboardConfigDeleteSomeResponse"]: + async for response in self._unary_stream( + "/arista.dashboard.v1.DashboardConfigService/DeleteSome", + dashboard_config_delete_some_request, + DashboardConfigDeleteSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def delete_all( self, dashboard_config_delete_all_request: "DashboardConfigDeleteAllRequest", @@ -852,6 +1269,42 @@ async def delete_all( ): yield response + async def get_all_batched( + self, + dashboard_config_batched_stream_request: "DashboardConfigBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DashboardConfigBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.dashboard.v1.DashboardConfigService/GetAllBatched", + dashboard_config_batched_stream_request, + DashboardConfigBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + dashboard_config_batched_stream_request: "DashboardConfigBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DashboardConfigBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.dashboard.v1.DashboardConfigService/SubscribeBatched", + dashboard_config_batched_stream_request, + DashboardConfigBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + class GlobalDashboardConfigServiceStub(aristaproto.ServiceStub): async def get_one( @@ -871,6 +1324,24 @@ async def get_one( metadata=metadata, ) + async def get_all( + self, + global_dashboard_config_stream_request: "GlobalDashboardConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["GlobalDashboardConfigStreamResponse"]: + async for response in self._unary_stream( + "/arista.dashboard.v1.GlobalDashboardConfigService/GetAll", + global_dashboard_config_stream_request, + GlobalDashboardConfigStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def subscribe( self, global_dashboard_config_stream_request: "GlobalDashboardConfigStreamRequest", @@ -889,6 +1360,24 @@ async def subscribe( ): yield response + async def subscribe_meta( + self, + global_dashboard_config_stream_request: "GlobalDashboardConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.dashboard.v1.GlobalDashboardConfigService/SubscribeMeta", + global_dashboard_config_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def set( self, global_dashboard_config_set_request: "GlobalDashboardConfigSetRequest", @@ -906,13 +1395,55 @@ async def set( metadata=metadata, ) + async def get_all_batched( + self, + global_dashboard_config_batched_stream_request: "GlobalDashboardConfigBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["GlobalDashboardConfigBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.dashboard.v1.GlobalDashboardConfigService/GetAllBatched", + global_dashboard_config_batched_stream_request, + GlobalDashboardConfigBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + global_dashboard_config_batched_stream_request: "GlobalDashboardConfigBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["GlobalDashboardConfigBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.dashboard.v1.GlobalDashboardConfigService/SubscribeBatched", + global_dashboard_config_batched_stream_request, + GlobalDashboardConfigBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + class DashboardServiceBase(ServiceBase): + async def get_one( self, dashboard_request: "DashboardRequest" ) -> "DashboardResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_some( + self, dashboard_some_request: "DashboardSomeRequest" + ) -> AsyncIterator["DashboardSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_all( self, dashboard_stream_request: "DashboardStreamRequest" ) -> AsyncIterator["DashboardStreamResponse"]: @@ -923,6 +1454,26 @@ async def subscribe( ) -> AsyncIterator["DashboardStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_meta( + self, dashboard_stream_request: "DashboardStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, dashboard_stream_request: "DashboardStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all_batched( + self, dashboard_batched_stream_request: "DashboardBatchedStreamRequest" + ) -> AsyncIterator["DashboardBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, dashboard_batched_stream_request: "DashboardBatchedStreamRequest" + ) -> AsyncIterator["DashboardBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def __rpc_get_one( self, stream: "grpclib.server.Stream[DashboardRequest, DashboardResponse]" ) -> None: @@ -930,6 +1481,17 @@ async def __rpc_get_one( response = await self.get_one(request) await stream.send_message(response) + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[DashboardSomeRequest, DashboardSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + async def __rpc_get_all( self, stream: "grpclib.server.Stream[DashboardStreamRequest, DashboardStreamResponse]", @@ -952,6 +1514,45 @@ async def __rpc_subscribe( request, ) + async def __rpc_get_meta( + self, stream: "grpclib.server.Stream[DashboardStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, stream: "grpclib.server.Stream[DashboardStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[DashboardBatchedStreamRequest, DashboardBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[DashboardBatchedStreamRequest, DashboardBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: return { "/arista.dashboard.v1.DashboardService/GetOne": grpclib.const.Handler( @@ -960,6 +1561,12 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: DashboardRequest, DashboardResponse, ), + "/arista.dashboard.v1.DashboardService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + DashboardSomeRequest, + DashboardSomeResponse, + ), "/arista.dashboard.v1.DashboardService/GetAll": grpclib.const.Handler( self.__rpc_get_all, grpclib.const.Cardinality.UNARY_STREAM, @@ -972,15 +1579,45 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: DashboardStreamRequest, DashboardStreamResponse, ), + "/arista.dashboard.v1.DashboardService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + DashboardStreamRequest, + MetaResponse, + ), + "/arista.dashboard.v1.DashboardService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + DashboardStreamRequest, + MetaResponse, + ), + "/arista.dashboard.v1.DashboardService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + DashboardBatchedStreamRequest, + DashboardBatchedStreamResponse, + ), + "/arista.dashboard.v1.DashboardService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + DashboardBatchedStreamRequest, + DashboardBatchedStreamResponse, + ), } class DashboardConfigServiceBase(ServiceBase): + async def get_one( self, dashboard_config_request: "DashboardConfigRequest" ) -> "DashboardConfigResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_some( + self, dashboard_config_some_request: "DashboardConfigSomeRequest" + ) -> AsyncIterator["DashboardConfigSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_all( self, dashboard_config_stream_request: "DashboardConfigStreamRequest" ) -> AsyncIterator["DashboardConfigStreamResponse"]: @@ -991,6 +1628,16 @@ async def subscribe( ) -> AsyncIterator["DashboardConfigStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_meta( + self, dashboard_config_stream_request: "DashboardConfigStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, dashboard_config_stream_request: "DashboardConfigStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def set( self, dashboard_config_set_request: "DashboardConfigSetRequest" ) -> "DashboardConfigSetResponse": @@ -1006,11 +1653,28 @@ async def delete( ) -> "DashboardConfigDeleteResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def delete_some( + self, dashboard_config_delete_some_request: "DashboardConfigDeleteSomeRequest" + ) -> AsyncIterator["DashboardConfigDeleteSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def delete_all( self, dashboard_config_delete_all_request: "DashboardConfigDeleteAllRequest" ) -> AsyncIterator["DashboardConfigDeleteAllResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_all_batched( + self, + dashboard_config_batched_stream_request: "DashboardConfigBatchedStreamRequest", + ) -> AsyncIterator["DashboardConfigBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, + dashboard_config_batched_stream_request: "DashboardConfigBatchedStreamRequest", + ) -> AsyncIterator["DashboardConfigBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def __rpc_get_one( self, stream: "grpclib.server.Stream[DashboardConfigRequest, DashboardConfigResponse]", @@ -1019,6 +1683,17 @@ async def __rpc_get_one( response = await self.get_one(request) await stream.send_message(response) + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[DashboardConfigSomeRequest, DashboardConfigSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + async def __rpc_get_all( self, stream: "grpclib.server.Stream[DashboardConfigStreamRequest, DashboardConfigStreamResponse]", @@ -1041,6 +1716,25 @@ async def __rpc_subscribe( request, ) + async def __rpc_get_meta( + self, + stream: "grpclib.server.Stream[DashboardConfigStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, + stream: "grpclib.server.Stream[DashboardConfigStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + async def __rpc_set( self, stream: "grpclib.server.Stream[DashboardConfigSetRequest, DashboardConfigSetResponse]", @@ -1068,6 +1762,17 @@ async def __rpc_delete( response = await self.delete(request) await stream.send_message(response) + async def __rpc_delete_some( + self, + stream: "grpclib.server.Stream[DashboardConfigDeleteSomeRequest, DashboardConfigDeleteSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.delete_some, + stream, + request, + ) + async def __rpc_delete_all( self, stream: "grpclib.server.Stream[DashboardConfigDeleteAllRequest, DashboardConfigDeleteAllResponse]", @@ -1079,6 +1784,28 @@ async def __rpc_delete_all( request, ) + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[DashboardConfigBatchedStreamRequest, DashboardConfigBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[DashboardConfigBatchedStreamRequest, DashboardConfigBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: return { "/arista.dashboard.v1.DashboardConfigService/GetOne": grpclib.const.Handler( @@ -1087,6 +1814,12 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: DashboardConfigRequest, DashboardConfigResponse, ), + "/arista.dashboard.v1.DashboardConfigService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + DashboardConfigSomeRequest, + DashboardConfigSomeResponse, + ), "/arista.dashboard.v1.DashboardConfigService/GetAll": grpclib.const.Handler( self.__rpc_get_all, grpclib.const.Cardinality.UNARY_STREAM, @@ -1099,6 +1832,18 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: DashboardConfigStreamRequest, DashboardConfigStreamResponse, ), + "/arista.dashboard.v1.DashboardConfigService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + DashboardConfigStreamRequest, + MetaResponse, + ), + "/arista.dashboard.v1.DashboardConfigService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + DashboardConfigStreamRequest, + MetaResponse, + ), "/arista.dashboard.v1.DashboardConfigService/Set": grpclib.const.Handler( self.__rpc_set, grpclib.const.Cardinality.UNARY_UNARY, @@ -1117,32 +1862,75 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: DashboardConfigDeleteRequest, DashboardConfigDeleteResponse, ), + "/arista.dashboard.v1.DashboardConfigService/DeleteSome": grpclib.const.Handler( + self.__rpc_delete_some, + grpclib.const.Cardinality.UNARY_STREAM, + DashboardConfigDeleteSomeRequest, + DashboardConfigDeleteSomeResponse, + ), "/arista.dashboard.v1.DashboardConfigService/DeleteAll": grpclib.const.Handler( self.__rpc_delete_all, grpclib.const.Cardinality.UNARY_STREAM, DashboardConfigDeleteAllRequest, DashboardConfigDeleteAllResponse, ), + "/arista.dashboard.v1.DashboardConfigService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + DashboardConfigBatchedStreamRequest, + DashboardConfigBatchedStreamResponse, + ), + "/arista.dashboard.v1.DashboardConfigService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + DashboardConfigBatchedStreamRequest, + DashboardConfigBatchedStreamResponse, + ), } class GlobalDashboardConfigServiceBase(ServiceBase): + async def get_one( self, global_dashboard_config_request: "GlobalDashboardConfigRequest" ) -> "GlobalDashboardConfigResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_all( + self, + global_dashboard_config_stream_request: "GlobalDashboardConfigStreamRequest", + ) -> AsyncIterator["GlobalDashboardConfigStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def subscribe( self, global_dashboard_config_stream_request: "GlobalDashboardConfigStreamRequest", ) -> AsyncIterator["GlobalDashboardConfigStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def subscribe_meta( + self, + global_dashboard_config_stream_request: "GlobalDashboardConfigStreamRequest", + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def set( self, global_dashboard_config_set_request: "GlobalDashboardConfigSetRequest" ) -> "GlobalDashboardConfigSetResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_all_batched( + self, + global_dashboard_config_batched_stream_request: "GlobalDashboardConfigBatchedStreamRequest", + ) -> AsyncIterator["GlobalDashboardConfigBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, + global_dashboard_config_batched_stream_request: "GlobalDashboardConfigBatchedStreamRequest", + ) -> AsyncIterator["GlobalDashboardConfigBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def __rpc_get_one( self, stream: "grpclib.server.Stream[GlobalDashboardConfigRequest, GlobalDashboardConfigResponse]", @@ -1151,6 +1939,17 @@ async def __rpc_get_one( response = await self.get_one(request) await stream.send_message(response) + async def __rpc_get_all( + self, + stream: "grpclib.server.Stream[GlobalDashboardConfigStreamRequest, GlobalDashboardConfigStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all, + stream, + request, + ) + async def __rpc_subscribe( self, stream: "grpclib.server.Stream[GlobalDashboardConfigStreamRequest, GlobalDashboardConfigStreamResponse]", @@ -1162,6 +1961,17 @@ async def __rpc_subscribe( request, ) + async def __rpc_subscribe_meta( + self, + stream: "grpclib.server.Stream[GlobalDashboardConfigStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + async def __rpc_set( self, stream: "grpclib.server.Stream[GlobalDashboardConfigSetRequest, GlobalDashboardConfigSetResponse]", @@ -1170,6 +1980,28 @@ async def __rpc_set( response = await self.set(request) await stream.send_message(response) + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[GlobalDashboardConfigBatchedStreamRequest, GlobalDashboardConfigBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[GlobalDashboardConfigBatchedStreamRequest, GlobalDashboardConfigBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: return { "/arista.dashboard.v1.GlobalDashboardConfigService/GetOne": grpclib.const.Handler( @@ -1178,16 +2010,40 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: GlobalDashboardConfigRequest, GlobalDashboardConfigResponse, ), + "/arista.dashboard.v1.GlobalDashboardConfigService/GetAll": grpclib.const.Handler( + self.__rpc_get_all, + grpclib.const.Cardinality.UNARY_STREAM, + GlobalDashboardConfigStreamRequest, + GlobalDashboardConfigStreamResponse, + ), "/arista.dashboard.v1.GlobalDashboardConfigService/Subscribe": grpclib.const.Handler( self.__rpc_subscribe, grpclib.const.Cardinality.UNARY_STREAM, GlobalDashboardConfigStreamRequest, GlobalDashboardConfigStreamResponse, ), + "/arista.dashboard.v1.GlobalDashboardConfigService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + GlobalDashboardConfigStreamRequest, + MetaResponse, + ), "/arista.dashboard.v1.GlobalDashboardConfigService/Set": grpclib.const.Handler( self.__rpc_set, grpclib.const.Cardinality.UNARY_UNARY, GlobalDashboardConfigSetRequest, GlobalDashboardConfigSetResponse, ), + "/arista.dashboard.v1.GlobalDashboardConfigService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + GlobalDashboardConfigBatchedStreamRequest, + GlobalDashboardConfigBatchedStreamResponse, + ), + "/arista.dashboard.v1.GlobalDashboardConfigService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + GlobalDashboardConfigBatchedStreamRequest, + GlobalDashboardConfigBatchedStreamResponse, + ), } diff --git a/python-avd/pyavd/_cv/api/arista/endpointlocation/__init__.py b/python-avd/pyavd/_cv/api/arista/endpointlocation/__init__.py new file mode 100644 index 00000000000..b17ca7c745d --- /dev/null +++ b/python-avd/pyavd/_cv/api/arista/endpointlocation/__init__.py @@ -0,0 +1,3 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/endpointlocation/v1/__init__.py b/python-avd/pyavd/_cv/api/arista/endpointlocation/v1/__init__.py similarity index 67% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/endpointlocation/v1/__init__.py rename to python-avd/pyavd/_cv/api/arista/endpointlocation/v1/__init__.py index 1f9c2d62dc6..599b8d6614a 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/endpointlocation/v1/__init__.py +++ b/python-avd/pyavd/_cv/api/arista/endpointlocation/v1/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. +# Copyright (c) 2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. # Generated by the protocol buffer compiler. DO NOT EDIT! @@ -16,17 +16,9 @@ Optional, ) -try: - import aristaproto - import grpclib - from aristaproto.grpc.grpclib_server import ServiceBase -except ImportError: - HAS_ARISTAPROTO = False - from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_aristaproto as aristaproto - from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_grpclib as grpclib - ServiceBase = object -else: - HAS_ARISTAPROTO = True +import aristaproto +import grpclib +from aristaproto.grpc.grpclib_server import ServiceBase from .... import fmp as ___fmp__ from ... import ( @@ -324,6 +316,9 @@ class Explanation(aristaproto.Enum): point in the device inventory to a wireless client. """ + ACCESS_PORT = 11 + """EXPLANATION_ACCESS_PORT indicates that a location is an access port.""" + class DeviceType(aristaproto.Enum): """ @@ -596,6 +591,27 @@ class EndpointLocation(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class MetaResponse(aristaproto.Message): + time: datetime = aristaproto.message_field(1) + """ + Time holds the timestamp of the last item included in the metadata calculation. + """ + + type: "__subscriptions__.Operation" = aristaproto.enum_field(2) + """ + Operation indicates how the value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + count: Optional[int] = aristaproto.message_field(3, wraps=aristaproto.TYPE_UINT32) + """ + Count is the number of items present under the conditions of the request. + """ + + @dataclass(eq=False, repr=False) class EndpointLocationRequest(aristaproto.Message): key: "EndpointLocationKey" = aristaproto.message_field(1) @@ -628,6 +644,35 @@ class EndpointLocationResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class EndpointLocationSomeRequest(aristaproto.Message): + keys: List["EndpointLocationKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class EndpointLocationSomeResponse(aristaproto.Message): + value: "EndpointLocation" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + @dataclass(eq=False, repr=False) class EndpointLocationStreamRequest(aristaproto.Message): partial_eq_filter: List["EndpointLocation"] = aristaproto.message_field(1) @@ -682,6 +727,57 @@ class EndpointLocationStreamResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class EndpointLocationBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["EndpointLocation"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each EndpointLocation at end. + * Each EndpointLocation response is fully-specified (all fields set). + * start: Returns the state of each EndpointLocation at start, followed by updates until now. + * Each EndpointLocation response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each EndpointLocation at start, followed by updates + until end. + * Each EndpointLocation response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class EndpointLocationBatchedStreamResponse(aristaproto.Message): + responses: List["EndpointLocationStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + class EndpointLocationServiceStub(aristaproto.ServiceStub): async def get_one( self, @@ -700,6 +796,24 @@ async def get_one( metadata=metadata, ) + async def get_some( + self, + endpoint_location_some_request: "EndpointLocationSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["EndpointLocationSomeResponse"]: + async for response in self._unary_stream( + "/arista.endpointlocation.v1.EndpointLocationService/GetSome", + endpoint_location_some_request, + EndpointLocationSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def get_all( self, endpoint_location_stream_request: "EndpointLocationStreamRequest", @@ -736,13 +850,90 @@ async def subscribe( ): yield response + async def get_meta( + self, + endpoint_location_stream_request: "EndpointLocationStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.endpointlocation.v1.EndpointLocationService/GetMeta", + endpoint_location_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + endpoint_location_stream_request: "EndpointLocationStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.endpointlocation.v1.EndpointLocationService/SubscribeMeta", + endpoint_location_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all_batched( + self, + endpoint_location_batched_stream_request: "EndpointLocationBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["EndpointLocationBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.endpointlocation.v1.EndpointLocationService/GetAllBatched", + endpoint_location_batched_stream_request, + EndpointLocationBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + endpoint_location_batched_stream_request: "EndpointLocationBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["EndpointLocationBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.endpointlocation.v1.EndpointLocationService/SubscribeBatched", + endpoint_location_batched_stream_request, + EndpointLocationBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + class EndpointLocationServiceBase(ServiceBase): + async def get_one( self, endpoint_location_request: "EndpointLocationRequest" ) -> "EndpointLocationResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_some( + self, endpoint_location_some_request: "EndpointLocationSomeRequest" + ) -> AsyncIterator["EndpointLocationSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_all( self, endpoint_location_stream_request: "EndpointLocationStreamRequest" ) -> AsyncIterator["EndpointLocationStreamResponse"]: @@ -753,6 +944,28 @@ async def subscribe( ) -> AsyncIterator["EndpointLocationStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_meta( + self, endpoint_location_stream_request: "EndpointLocationStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, endpoint_location_stream_request: "EndpointLocationStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all_batched( + self, + endpoint_location_batched_stream_request: "EndpointLocationBatchedStreamRequest", + ) -> AsyncIterator["EndpointLocationBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, + endpoint_location_batched_stream_request: "EndpointLocationBatchedStreamRequest", + ) -> AsyncIterator["EndpointLocationBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def __rpc_get_one( self, stream: "grpclib.server.Stream[EndpointLocationRequest, EndpointLocationResponse]", @@ -761,6 +974,17 @@ async def __rpc_get_one( response = await self.get_one(request) await stream.send_message(response) + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[EndpointLocationSomeRequest, EndpointLocationSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + async def __rpc_get_all( self, stream: "grpclib.server.Stream[EndpointLocationStreamRequest, EndpointLocationStreamResponse]", @@ -783,6 +1007,47 @@ async def __rpc_subscribe( request, ) + async def __rpc_get_meta( + self, + stream: "grpclib.server.Stream[EndpointLocationStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, + stream: "grpclib.server.Stream[EndpointLocationStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[EndpointLocationBatchedStreamRequest, EndpointLocationBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[EndpointLocationBatchedStreamRequest, EndpointLocationBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: return { "/arista.endpointlocation.v1.EndpointLocationService/GetOne": grpclib.const.Handler( @@ -791,6 +1056,12 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: EndpointLocationRequest, EndpointLocationResponse, ), + "/arista.endpointlocation.v1.EndpointLocationService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + EndpointLocationSomeRequest, + EndpointLocationSomeResponse, + ), "/arista.endpointlocation.v1.EndpointLocationService/GetAll": grpclib.const.Handler( self.__rpc_get_all, grpclib.const.Cardinality.UNARY_STREAM, @@ -803,4 +1074,28 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: EndpointLocationStreamRequest, EndpointLocationStreamResponse, ), + "/arista.endpointlocation.v1.EndpointLocationService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + EndpointLocationStreamRequest, + MetaResponse, + ), + "/arista.endpointlocation.v1.EndpointLocationService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + EndpointLocationStreamRequest, + MetaResponse, + ), + "/arista.endpointlocation.v1.EndpointLocationService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + EndpointLocationBatchedStreamRequest, + EndpointLocationBatchedStreamResponse, + ), + "/arista.endpointlocation.v1.EndpointLocationService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + EndpointLocationBatchedStreamRequest, + EndpointLocationBatchedStreamResponse, + ), } diff --git a/python-avd/pyavd/_cv/api/arista/event/__init__.py b/python-avd/pyavd/_cv/api/arista/event/__init__.py new file mode 100644 index 00000000000..b17ca7c745d --- /dev/null +++ b/python-avd/pyavd/_cv/api/arista/event/__init__.py @@ -0,0 +1,3 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. diff --git a/python-avd/pyavd/_cv/api/arista/event/v1/__init__.py b/python-avd/pyavd/_cv/api/arista/event/v1/__init__.py new file mode 100644 index 00000000000..c7036d0a3b5 --- /dev/null +++ b/python-avd/pyavd/_cv/api/arista/event/v1/__init__.py @@ -0,0 +1,2078 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +# Generated by the protocol buffer compiler. DO NOT EDIT! +# sources: arista/event.v1/event.proto, arista/event.v1/services.gen.proto +# plugin: python-aristaproto +# This file has been @generated + +from dataclasses import dataclass +from datetime import datetime +from typing import ( + TYPE_CHECKING, + AsyncIterator, + Dict, + List, + Optional, +) + +import aristaproto +import grpclib +from aristaproto.grpc.grpclib_server import ServiceBase + +from .... import fmp as ___fmp__ +from ... import ( + subscriptions as __subscriptions__, + time as __time__, +) + + +if TYPE_CHECKING: + import grpclib.server + from aristaproto.grpc.grpclib_client import MetadataLike + from grpclib.metadata import Deadline + + +class EventSeverity(aristaproto.Enum): + """EventSeverity is the severity level of the event""" + + UNSPECIFIED = 0 + """ + EVENT_SEVERITY_UNSPECIFIED is the default value, if the severity is not specified. + """ + + INFO = 1 + """EVENT_SEVERITY_INFO is used for generally useful information.""" + + WARNING = 2 + """EVENT_SEVERITY_WARNING is used for potentially harmful conditions.""" + + ERROR = 3 + """ + EVENT_SEVERITY_ERROR is used for errors events that may allow for continued functioning. + """ + + CRITICAL = 4 + """ + EVENT_SEVERITY_CRITICAL is used to designate severe errors that impede functioning. + """ + + DEBUG = 5 + """EVENT_SEVERITY_DEBUG is used for debugging useful information.""" + + +class ComponentType(aristaproto.Enum): + """ + ComponentType describes the type of entity on which the event occurred + """ + + UNSPECIFIED = 0 + """ + COMPONENT_TYPE_UNSPECIFIED is the default value, if the type is not specified. + """ + + DEVICE = 1 + """COMPONENT_TYPE_DEVICE is used for device events.""" + + INTERFACE = 2 + """COMPONENT_TYPE_INTERFACE is used for device interface events.""" + + TURBINE = 3 + """ + COMPONENT_TYPE_TURBINE is used for events on the internal CVP turbine + components. A turbine is an internal CV streaming analytics backend process. + """ + + VDS = 4 + """ + COMPONENT_TYPE_VDS is used for VDS events. + A vSphere Distributed Switch provides centralized management and + monitoring of the networking configuration of all workload servers that are + associated with the switch. + """ + + VDS_INTERFACE = 5 + """COMPONENT_TYPE_VDS_INTERFACE is used for VDS interface events.""" + + VM = 6 + """ + COMPONENT_TYPE_VM is used for VM events. + A VM is a software computer that, like a physical computer, runs an + operating system and applications. + """ + + VM_INTERFACE = 7 + """COMPONENT_TYPE_VM_INTERFACE is used for VM interface events.""" + + WORKLOAD_SERVER = 8 + """ + COMPONENT_TYPE_WORKLOAD_SERVER is used for workload server events. + A workload server is a server/data storage device on which the hypervisor is installed. + """ + + WORKLOAD_SERVER_INTERFACE = 9 + """ + COMPONENT_TYPE_WORKLOAD_SERVER_INTERFACE is used for workload server interface events. + """ + + APPLICATION = 10 + """COMPONENT_TYPE_APPLICATION is used for application-service events.""" + + CVP_NODE = 11 + """COMPONENT_TYPE_CVP_NODE is used for CVP node events.""" + + +@dataclass(eq=False, repr=False) +class EventComponent(aristaproto.Message): + """EventComponent describes an entity on which the event occurred""" + + type: "ComponentType" = aristaproto.enum_field(1) + """type is the type of component""" + + components: Dict[str, str] = aristaproto.map_field( + 2, aristaproto.TYPE_STRING, aristaproto.TYPE_STRING + ) + """components identifies the entity on which the event occurred""" + + +@dataclass(eq=False, repr=False) +class EventComponents(aristaproto.Message): + """EventComponents contains entities on which an event occurred""" + + components: List["EventComponent"] = aristaproto.message_field(1) + """components describes the components on which an event occurred""" + + +@dataclass(eq=False, repr=False) +class EventAck(aristaproto.Message): + """EventAck contains acknowledgement information of an event""" + + ack: Optional[bool] = aristaproto.message_field(1, wraps=aristaproto.TYPE_BOOL) + """ack is the acknowledgement state of an event""" + + acker: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """acker is the user that acknowledged the event""" + + ack_time: datetime = aristaproto.message_field(3) + """ack_time is the time of acknowledgement""" + + +@dataclass(eq=False, repr=False) +class EventRead(aristaproto.Message): + """EventRead contains read information of an event""" + + read: Optional[bool] = aristaproto.message_field(1, wraps=aristaproto.TYPE_BOOL) + """read is the read state of an event""" + + reader: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """reader is the user that read the event""" + + read_time: datetime = aristaproto.message_field(3) + """read_time is the time of read""" + + +@dataclass(eq=False, repr=False) +class EventNoteConfig(aristaproto.Message): + """ + EventNoteConfig configures a note + + NOTE: note is required when used as an argument + to Set. + """ + + note: Optional[str] = aristaproto.message_field(1, wraps=aristaproto.TYPE_STRING) + """note is the text of the note""" + + +@dataclass(eq=False, repr=False) +class EventNote(aristaproto.Message): + """EventNote is the state of a note""" + + note: Optional[str] = aristaproto.message_field(1, wraps=aristaproto.TYPE_STRING) + """note is the text of the note""" + + note_creator: Optional[str] = aristaproto.message_field( + 2, wraps=aristaproto.TYPE_STRING + ) + """note_creator is the creator of the note""" + + +@dataclass(eq=False, repr=False) +class EventKey(aristaproto.Message): + """ + EventKey uniquely identifies an event + + NOTE: All fields are required when used as an argument + to GetOne, Set or Delete. + """ + + key: Optional[str] = aristaproto.message_field(1, wraps=aristaproto.TYPE_STRING) + """key is the event data identifier""" + + timestamp: datetime = aristaproto.message_field(2) + """timestamp is the time the event occurred""" + + +@dataclass(eq=False, repr=False) +class EventData(aristaproto.Message): + """EventData is additional event data""" + + data: Dict[str, str] = aristaproto.map_field( + 1, aristaproto.TYPE_STRING, aristaproto.TYPE_STRING + ) + """data is event data specific to the type of this event""" + + +@dataclass(eq=False, repr=False) +class EventNotesConfig(aristaproto.Message): + """ + EventNotesConfig configures the notes of an event + + NOTE: notes is required when used as an argument + to Set. + """ + + notes: Dict[int, "EventNoteConfig"] = aristaproto.map_field( + 1, aristaproto.TYPE_INT64, aristaproto.TYPE_MESSAGE + ) + """notes is keyed by desired note time in Unix time, in milliseconds""" + + +@dataclass(eq=False, repr=False) +class EventAnnotationConfig(aristaproto.Message): + """ + EventAnnotationConfig configures an event annotation + + NOTE: Either 1) key and ack or 2) key and notes or 3) key and read are + required when used as an argument to Set. + """ + + key: "EventKey" = aristaproto.message_field(1) + """key is the event instance identifier""" + + ack: Optional[bool] = aristaproto.message_field(2, wraps=aristaproto.TYPE_BOOL) + """ack is the acknowledgement state of an event""" + + notes: "EventNotesConfig" = aristaproto.message_field(3) + """notes is the notes on an event""" + + read: Optional[bool] = aristaproto.message_field(4, wraps=aristaproto.TYPE_BOOL) + """ + read is the read state of an event. Setting this implies that an event has been read by a user + """ + + +@dataclass(eq=False, repr=False) +class EventNotes(aristaproto.Message): + """EventNotes is the notes of an event state""" + + notes: Dict[int, "EventNote"] = aristaproto.map_field( + 1, aristaproto.TYPE_INT64, aristaproto.TYPE_MESSAGE + ) + """notes is keyed by the time desired""" + + +@dataclass(eq=False, repr=False) +class Event(aristaproto.Message): + """Event is a telemetry event""" + + key: "EventKey" = aristaproto.message_field(1) + """key is the event instance identifier""" + + severity: "EventSeverity" = aristaproto.enum_field(2) + """severity is the severity of the event""" + + title: Optional[str] = aristaproto.message_field(3, wraps=aristaproto.TYPE_STRING) + """title is the title of the event""" + + description: Optional[str] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_STRING + ) + """description is the description of the event""" + + event_type: Optional[str] = aristaproto.message_field( + 5, wraps=aristaproto.TYPE_STRING + ) + """event_type is the type of the event""" + + data: "EventData" = aristaproto.message_field(6) + """data is the data of the event""" + + components: "EventComponents" = aristaproto.message_field(7) + """components is the components on which the event occurred""" + + ack: "EventAck" = aristaproto.message_field(8) + """ack is the acknowledgement status of the event""" + + notes: "EventNotes" = aristaproto.message_field(9) + """notes is the notes of the event""" + + last_updated_time: datetime = aristaproto.message_field(10) + """last_updated_time is the time of the most recent update to the event""" + + read: "EventRead" = aristaproto.message_field(11) + """read is the read status of the event""" + + rule_id: Optional[str] = aristaproto.message_field( + 12, wraps=aristaproto.TYPE_STRING + ) + """rule_id is the label of the rule associated with the event""" + + +@dataclass(eq=False, repr=False) +class UserEventCreationKey(aristaproto.Message): + """UserEventCreationKey uniquely identifies a user event request.""" + + key: Optional[str] = aristaproto.message_field(1, wraps=aristaproto.TYPE_STRING) + """key is a unique string identifier""" + + +@dataclass(eq=False, repr=False) +class UserEventCreationConfig(aristaproto.Message): + """ + UserEventCreationConfig is the basis for the manual creation of new events. + + NOTE: Set is the only valid operation. + Objects are immediately deleted upon event creation. + All fields are required to create a well-formed event. + """ + + key: "UserEventCreationKey" = aristaproto.message_field(1) + """key is the event instance identifier""" + + severity: "EventSeverity" = aristaproto.enum_field(2) + """severity is the severity of the event""" + + title: Optional[str] = aristaproto.message_field(3, wraps=aristaproto.TYPE_STRING) + """title is the title of the event""" + + description: Optional[str] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_STRING + ) + """description is the description of the event""" + + rule_id: Optional[str] = aristaproto.message_field(6, wraps=aristaproto.TYPE_STRING) + """rule_id is the label of the rule associated with the event""" + + components: "EventComponents" = aristaproto.message_field(7) + """components is the components on which the event occurred""" + + start_time: datetime = aristaproto.message_field(8) + """start_time is the time point at which the event occurred""" + + +@dataclass(eq=False, repr=False) +class MetaResponse(aristaproto.Message): + time: datetime = aristaproto.message_field(1) + """ + Time holds the timestamp of the last item included in the metadata calculation. + """ + + type: "__subscriptions__.Operation" = aristaproto.enum_field(2) + """ + Operation indicates how the value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + count: Optional[int] = aristaproto.message_field(3, wraps=aristaproto.TYPE_UINT32) + """ + Count is the number of items present under the conditions of the request. + """ + + +@dataclass(eq=False, repr=False) +class EventRequest(aristaproto.Message): + key: "EventKey" = aristaproto.message_field(1) + """ + Key uniquely identifies a Event instance to retrieve. + This value must be populated. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class EventResponse(aristaproto.Message): + value: "Event" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time carries the (UTC) timestamp of the last-modification of the + Event instance in this response. + """ + + +@dataclass(eq=False, repr=False) +class EventSomeRequest(aristaproto.Message): + keys: List["EventKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class EventSomeResponse(aristaproto.Message): + value: "Event" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + +@dataclass(eq=False, repr=False) +class EventStreamRequest(aristaproto.Message): + partial_eq_filter: List["Event"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each Event at end. + * Each Event response is fully-specified (all fields set). + * start: Returns the state of each Event at start, followed by updates until now. + * Each Event response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each Event at start, followed by updates + until end. + * Each Event response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + +@dataclass(eq=False, repr=False) +class EventStreamResponse(aristaproto.Message): + value: "Event" = aristaproto.message_field(1) + """ + Value is a value deemed relevant to the initiating request. + This structure will always have its key-field populated. Which other fields are + populated, and why, depends on the value of Operation and what triggered this notification. + """ + + time: datetime = aristaproto.message_field(2) + """Time holds the timestamp of this Event's last modification.""" + + type: "__subscriptions__.Operation" = aristaproto.enum_field(3) + """ + Operation indicates how the Event value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + +@dataclass(eq=False, repr=False) +class EventAnnotationConfigRequest(aristaproto.Message): + key: "EventKey" = aristaproto.message_field(1) + """ + Key uniquely identifies a EventAnnotationConfig instance to retrieve. + This value must be populated. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class EventAnnotationConfigResponse(aristaproto.Message): + value: "EventAnnotationConfig" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time carries the (UTC) timestamp of the last-modification of the + EventAnnotationConfig instance in this response. + """ + + +@dataclass(eq=False, repr=False) +class EventAnnotationConfigSomeRequest(aristaproto.Message): + keys: List["EventKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class EventAnnotationConfigSomeResponse(aristaproto.Message): + value: "EventAnnotationConfig" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + +@dataclass(eq=False, repr=False) +class EventAnnotationConfigStreamRequest(aristaproto.Message): + partial_eq_filter: List["EventAnnotationConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each EventAnnotationConfig at end. + * Each EventAnnotationConfig response is fully-specified (all fields set). + * start: Returns the state of each EventAnnotationConfig at start, followed by updates until now. + * Each EventAnnotationConfig response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each EventAnnotationConfig at start, followed by updates + until end. + * Each EventAnnotationConfig response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + +@dataclass(eq=False, repr=False) +class EventAnnotationConfigStreamResponse(aristaproto.Message): + value: "EventAnnotationConfig" = aristaproto.message_field(1) + """ + Value is a value deemed relevant to the initiating request. + This structure will always have its key-field populated. Which other fields are + populated, and why, depends on the value of Operation and what triggered this notification. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time holds the timestamp of this EventAnnotationConfig's last modification. + """ + + type: "__subscriptions__.Operation" = aristaproto.enum_field(3) + """ + Operation indicates how the EventAnnotationConfig value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + +@dataclass(eq=False, repr=False) +class EventAnnotationConfigSetRequest(aristaproto.Message): + value: "EventAnnotationConfig" = aristaproto.message_field(1) + """ + EventAnnotationConfig carries the value to set into the datastore. + See the documentation on the EventAnnotationConfig struct for which fields are required. + """ + + +@dataclass(eq=False, repr=False) +class EventAnnotationConfigSetResponse(aristaproto.Message): + value: "EventAnnotationConfig" = aristaproto.message_field(1) + """ + Value carries all the values given in the EventAnnotationConfigSetRequest as well + as any server-generated values. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the (UTC) timestamp at which the system recognizes the + creation. The only guarantees made about this timestamp are: + + - it is after the time the request was received + - a time-ranged query with StartTime==CreatedAt will include this instance. + """ + + +@dataclass(eq=False, repr=False) +class EventAnnotationConfigSetSomeRequest(aristaproto.Message): + values: List["EventAnnotationConfig"] = aristaproto.message_field(1) + """ + value contains a list of EventAnnotationConfig values to write. + It is possible to provide more values than can fit within either: + - the maxiumum send size of the client + - the maximum receive size of the server + If this error occurs you must reduce the number of values sent. + See gRPC "maximum message size" documentation for more information. + """ + + +@dataclass(eq=False, repr=False) +class EventAnnotationConfigSetSomeResponse(aristaproto.Message): + key: "EventKey" = aristaproto.message_field(1) + error: str = aristaproto.string_field(2) + + +@dataclass(eq=False, repr=False) +class EventAnnotationConfigDeleteRequest(aristaproto.Message): + key: "EventKey" = aristaproto.message_field(1) + """ + Key indicates which EventAnnotationConfig instance to remove. + This field must always be set. + """ + + +@dataclass(eq=False, repr=False) +class EventAnnotationConfigDeleteResponse(aristaproto.Message): + key: "EventKey" = aristaproto.message_field(1) + """ + Key echoes back the key of the deleted EventAnnotationConfig instance. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the (UTC) timestamp at which the system recognizes the + deletion. The only guarantees made about this timestamp are: + + - it is after the time the request was received + - a time-ranged query with StartTime==DeletedAt will not include this instance. + """ + + +@dataclass(eq=False, repr=False) +class EventAnnotationConfigDeleteSomeRequest(aristaproto.Message): + keys: List["EventKey"] = aristaproto.message_field(1) + """key contains a list of EventAnnotationConfig keys to delete""" + + +@dataclass(eq=False, repr=False) +class EventAnnotationConfigDeleteSomeResponse(aristaproto.Message): + """ + EventAnnotationConfigDeleteSomeResponse is only sent when there is an error. + """ + + key: "EventKey" = aristaproto.message_field(1) + error: str = aristaproto.string_field(2) + + +@dataclass(eq=False, repr=False) +class EventAnnotationConfigDeleteAllRequest(aristaproto.Message): + partial_eq_filter: List["EventAnnotationConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a DeleteAll. + This requires all provided fields to be equal to the response. + A filtered DeleteAll will use GetAll with filter to find things to delete. + """ + + +@dataclass(eq=False, repr=False) +class EventAnnotationConfigDeleteAllResponse(aristaproto.Message): + type: "___fmp__.DeleteError" = aristaproto.enum_field(1) + """ + This describes the class of delete error. + A DeleteAllResponse is only sent when there is an error. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """This indicates the error message from the delete failure.""" + + key: "EventKey" = aristaproto.message_field(3) + """ + This is the key of the EventAnnotationConfig instance that failed to be deleted. + """ + + time: datetime = aristaproto.message_field(4) + """Time indicates the (UTC) timestamp when the key was being deleted.""" + + +@dataclass(eq=False, repr=False) +class UserEventCreationConfigRequest(aristaproto.Message): + key: "UserEventCreationKey" = aristaproto.message_field(1) + """ + Key uniquely identifies a UserEventCreationConfig instance to retrieve. + This value must be populated. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class UserEventCreationConfigResponse(aristaproto.Message): + value: "UserEventCreationConfig" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time carries the (UTC) timestamp of the last-modification of the + UserEventCreationConfig instance in this response. + """ + + +@dataclass(eq=False, repr=False) +class UserEventCreationConfigSomeRequest(aristaproto.Message): + keys: List["UserEventCreationKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class UserEventCreationConfigSomeResponse(aristaproto.Message): + value: "UserEventCreationConfig" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + +@dataclass(eq=False, repr=False) +class UserEventCreationConfigStreamRequest(aristaproto.Message): + partial_eq_filter: List["UserEventCreationConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each UserEventCreationConfig at end. + * Each UserEventCreationConfig response is fully-specified (all fields set). + * start: Returns the state of each UserEventCreationConfig at start, followed by updates until now. + * Each UserEventCreationConfig response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each UserEventCreationConfig at start, followed by updates + until end. + * Each UserEventCreationConfig response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + +@dataclass(eq=False, repr=False) +class UserEventCreationConfigStreamResponse(aristaproto.Message): + value: "UserEventCreationConfig" = aristaproto.message_field(1) + """ + Value is a value deemed relevant to the initiating request. + This structure will always have its key-field populated. Which other fields are + populated, and why, depends on the value of Operation and what triggered this notification. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time holds the timestamp of this UserEventCreationConfig's last modification. + """ + + type: "__subscriptions__.Operation" = aristaproto.enum_field(3) + """ + Operation indicates how the UserEventCreationConfig value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + +@dataclass(eq=False, repr=False) +class UserEventCreationConfigSetRequest(aristaproto.Message): + value: "UserEventCreationConfig" = aristaproto.message_field(1) + """ + UserEventCreationConfig carries the value to set into the datastore. + See the documentation on the UserEventCreationConfig struct for which fields are required. + """ + + +@dataclass(eq=False, repr=False) +class UserEventCreationConfigSetResponse(aristaproto.Message): + value: "UserEventCreationConfig" = aristaproto.message_field(1) + """ + Value carries all the values given in the UserEventCreationConfigSetRequest as well + as any server-generated values. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the (UTC) timestamp at which the system recognizes the + creation. The only guarantees made about this timestamp are: + + - it is after the time the request was received + - a time-ranged query with StartTime==CreatedAt will include this instance. + """ + + +@dataclass(eq=False, repr=False) +class UserEventCreationConfigSetSomeRequest(aristaproto.Message): + values: List["UserEventCreationConfig"] = aristaproto.message_field(1) + """ + value contains a list of UserEventCreationConfig values to write. + It is possible to provide more values than can fit within either: + - the maxiumum send size of the client + - the maximum receive size of the server + If this error occurs you must reduce the number of values sent. + See gRPC "maximum message size" documentation for more information. + """ + + +@dataclass(eq=False, repr=False) +class UserEventCreationConfigSetSomeResponse(aristaproto.Message): + key: "UserEventCreationKey" = aristaproto.message_field(1) + error: str = aristaproto.string_field(2) + + +@dataclass(eq=False, repr=False) +class UserEventCreationConfigDeleteRequest(aristaproto.Message): + key: "UserEventCreationKey" = aristaproto.message_field(1) + """ + Key indicates which UserEventCreationConfig instance to remove. + This field must always be set. + """ + + +@dataclass(eq=False, repr=False) +class UserEventCreationConfigDeleteResponse(aristaproto.Message): + key: "UserEventCreationKey" = aristaproto.message_field(1) + """ + Key echoes back the key of the deleted UserEventCreationConfig instance. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the (UTC) timestamp at which the system recognizes the + deletion. The only guarantees made about this timestamp are: + + - it is after the time the request was received + - a time-ranged query with StartTime==DeletedAt will not include this instance. + """ + + +@dataclass(eq=False, repr=False) +class UserEventCreationConfigDeleteSomeRequest(aristaproto.Message): + keys: List["UserEventCreationKey"] = aristaproto.message_field(1) + """key contains a list of UserEventCreationConfig keys to delete""" + + +@dataclass(eq=False, repr=False) +class UserEventCreationConfigDeleteSomeResponse(aristaproto.Message): + """ + UserEventCreationConfigDeleteSomeResponse is only sent when there is an error. + """ + + key: "UserEventCreationKey" = aristaproto.message_field(1) + error: str = aristaproto.string_field(2) + + +@dataclass(eq=False, repr=False) +class UserEventCreationConfigDeleteAllRequest(aristaproto.Message): + partial_eq_filter: List["UserEventCreationConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a DeleteAll. + This requires all provided fields to be equal to the response. + A filtered DeleteAll will use GetAll with filter to find things to delete. + """ + + +@dataclass(eq=False, repr=False) +class UserEventCreationConfigDeleteAllResponse(aristaproto.Message): + type: "___fmp__.DeleteError" = aristaproto.enum_field(1) + """ + This describes the class of delete error. + A DeleteAllResponse is only sent when there is an error. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """This indicates the error message from the delete failure.""" + + key: "UserEventCreationKey" = aristaproto.message_field(3) + """ + This is the key of the UserEventCreationConfig instance that failed to be deleted. + """ + + time: datetime = aristaproto.message_field(4) + """Time indicates the (UTC) timestamp when the key was being deleted.""" + + +class EventServiceStub(aristaproto.ServiceStub): + async def get_one( + self, + event_request: "EventRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "EventResponse": + return await self._unary_unary( + "/arista.event.v1.EventService/GetOne", + event_request, + EventResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def get_some( + self, + event_some_request: "EventSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["EventSomeResponse"]: + async for response in self._unary_stream( + "/arista.event.v1.EventService/GetSome", + event_some_request, + EventSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all( + self, + event_stream_request: "EventStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["EventStreamResponse"]: + async for response in self._unary_stream( + "/arista.event.v1.EventService/GetAll", + event_stream_request, + EventStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe( + self, + event_stream_request: "EventStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["EventStreamResponse"]: + async for response in self._unary_stream( + "/arista.event.v1.EventService/Subscribe", + event_stream_request, + EventStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_meta( + self, + event_stream_request: "EventStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.event.v1.EventService/GetMeta", + event_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + event_stream_request: "EventStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.event.v1.EventService/SubscribeMeta", + event_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + +class EventAnnotationConfigServiceStub(aristaproto.ServiceStub): + async def get_one( + self, + event_annotation_config_request: "EventAnnotationConfigRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "EventAnnotationConfigResponse": + return await self._unary_unary( + "/arista.event.v1.EventAnnotationConfigService/GetOne", + event_annotation_config_request, + EventAnnotationConfigResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def get_some( + self, + event_annotation_config_some_request: "EventAnnotationConfigSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["EventAnnotationConfigSomeResponse"]: + async for response in self._unary_stream( + "/arista.event.v1.EventAnnotationConfigService/GetSome", + event_annotation_config_some_request, + EventAnnotationConfigSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all( + self, + event_annotation_config_stream_request: "EventAnnotationConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["EventAnnotationConfigStreamResponse"]: + async for response in self._unary_stream( + "/arista.event.v1.EventAnnotationConfigService/GetAll", + event_annotation_config_stream_request, + EventAnnotationConfigStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe( + self, + event_annotation_config_stream_request: "EventAnnotationConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["EventAnnotationConfigStreamResponse"]: + async for response in self._unary_stream( + "/arista.event.v1.EventAnnotationConfigService/Subscribe", + event_annotation_config_stream_request, + EventAnnotationConfigStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_meta( + self, + event_annotation_config_stream_request: "EventAnnotationConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.event.v1.EventAnnotationConfigService/GetMeta", + event_annotation_config_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + event_annotation_config_stream_request: "EventAnnotationConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.event.v1.EventAnnotationConfigService/SubscribeMeta", + event_annotation_config_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def set( + self, + event_annotation_config_set_request: "EventAnnotationConfigSetRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "EventAnnotationConfigSetResponse": + return await self._unary_unary( + "/arista.event.v1.EventAnnotationConfigService/Set", + event_annotation_config_set_request, + EventAnnotationConfigSetResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def set_some( + self, + event_annotation_config_set_some_request: "EventAnnotationConfigSetSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["EventAnnotationConfigSetSomeResponse"]: + async for response in self._unary_stream( + "/arista.event.v1.EventAnnotationConfigService/SetSome", + event_annotation_config_set_some_request, + EventAnnotationConfigSetSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def delete( + self, + event_annotation_config_delete_request: "EventAnnotationConfigDeleteRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "EventAnnotationConfigDeleteResponse": + return await self._unary_unary( + "/arista.event.v1.EventAnnotationConfigService/Delete", + event_annotation_config_delete_request, + EventAnnotationConfigDeleteResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def delete_some( + self, + event_annotation_config_delete_some_request: "EventAnnotationConfigDeleteSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["EventAnnotationConfigDeleteSomeResponse"]: + async for response in self._unary_stream( + "/arista.event.v1.EventAnnotationConfigService/DeleteSome", + event_annotation_config_delete_some_request, + EventAnnotationConfigDeleteSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def delete_all( + self, + event_annotation_config_delete_all_request: "EventAnnotationConfigDeleteAllRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["EventAnnotationConfigDeleteAllResponse"]: + async for response in self._unary_stream( + "/arista.event.v1.EventAnnotationConfigService/DeleteAll", + event_annotation_config_delete_all_request, + EventAnnotationConfigDeleteAllResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + +class UserEventCreationConfigServiceStub(aristaproto.ServiceStub): + async def get_one( + self, + user_event_creation_config_request: "UserEventCreationConfigRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "UserEventCreationConfigResponse": + return await self._unary_unary( + "/arista.event.v1.UserEventCreationConfigService/GetOne", + user_event_creation_config_request, + UserEventCreationConfigResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def get_some( + self, + user_event_creation_config_some_request: "UserEventCreationConfigSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["UserEventCreationConfigSomeResponse"]: + async for response in self._unary_stream( + "/arista.event.v1.UserEventCreationConfigService/GetSome", + user_event_creation_config_some_request, + UserEventCreationConfigSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all( + self, + user_event_creation_config_stream_request: "UserEventCreationConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["UserEventCreationConfigStreamResponse"]: + async for response in self._unary_stream( + "/arista.event.v1.UserEventCreationConfigService/GetAll", + user_event_creation_config_stream_request, + UserEventCreationConfigStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe( + self, + user_event_creation_config_stream_request: "UserEventCreationConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["UserEventCreationConfigStreamResponse"]: + async for response in self._unary_stream( + "/arista.event.v1.UserEventCreationConfigService/Subscribe", + user_event_creation_config_stream_request, + UserEventCreationConfigStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_meta( + self, + user_event_creation_config_stream_request: "UserEventCreationConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.event.v1.UserEventCreationConfigService/GetMeta", + user_event_creation_config_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + user_event_creation_config_stream_request: "UserEventCreationConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.event.v1.UserEventCreationConfigService/SubscribeMeta", + user_event_creation_config_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def set( + self, + user_event_creation_config_set_request: "UserEventCreationConfigSetRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "UserEventCreationConfigSetResponse": + return await self._unary_unary( + "/arista.event.v1.UserEventCreationConfigService/Set", + user_event_creation_config_set_request, + UserEventCreationConfigSetResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def set_some( + self, + user_event_creation_config_set_some_request: "UserEventCreationConfigSetSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["UserEventCreationConfigSetSomeResponse"]: + async for response in self._unary_stream( + "/arista.event.v1.UserEventCreationConfigService/SetSome", + user_event_creation_config_set_some_request, + UserEventCreationConfigSetSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def delete( + self, + user_event_creation_config_delete_request: "UserEventCreationConfigDeleteRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "UserEventCreationConfigDeleteResponse": + return await self._unary_unary( + "/arista.event.v1.UserEventCreationConfigService/Delete", + user_event_creation_config_delete_request, + UserEventCreationConfigDeleteResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def delete_some( + self, + user_event_creation_config_delete_some_request: "UserEventCreationConfigDeleteSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["UserEventCreationConfigDeleteSomeResponse"]: + async for response in self._unary_stream( + "/arista.event.v1.UserEventCreationConfigService/DeleteSome", + user_event_creation_config_delete_some_request, + UserEventCreationConfigDeleteSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def delete_all( + self, + user_event_creation_config_delete_all_request: "UserEventCreationConfigDeleteAllRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["UserEventCreationConfigDeleteAllResponse"]: + async for response in self._unary_stream( + "/arista.event.v1.UserEventCreationConfigService/DeleteAll", + user_event_creation_config_delete_all_request, + UserEventCreationConfigDeleteAllResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + +class EventServiceBase(ServiceBase): + + async def get_one(self, event_request: "EventRequest") -> "EventResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_some( + self, event_some_request: "EventSomeRequest" + ) -> AsyncIterator["EventSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all( + self, event_stream_request: "EventStreamRequest" + ) -> AsyncIterator["EventStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe( + self, event_stream_request: "EventStreamRequest" + ) -> AsyncIterator["EventStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_meta( + self, event_stream_request: "EventStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, event_stream_request: "EventStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def __rpc_get_one( + self, stream: "grpclib.server.Stream[EventRequest, EventResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_one(request) + await stream.send_message(response) + + async def __rpc_get_some( + self, stream: "grpclib.server.Stream[EventSomeRequest, EventSomeResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + + async def __rpc_get_all( + self, stream: "grpclib.server.Stream[EventStreamRequest, EventStreamResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all, + stream, + request, + ) + + async def __rpc_subscribe( + self, stream: "grpclib.server.Stream[EventStreamRequest, EventStreamResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe, + stream, + request, + ) + + async def __rpc_get_meta( + self, stream: "grpclib.server.Stream[EventStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, stream: "grpclib.server.Stream[EventStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: + return { + "/arista.event.v1.EventService/GetOne": grpclib.const.Handler( + self.__rpc_get_one, + grpclib.const.Cardinality.UNARY_UNARY, + EventRequest, + EventResponse, + ), + "/arista.event.v1.EventService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + EventSomeRequest, + EventSomeResponse, + ), + "/arista.event.v1.EventService/GetAll": grpclib.const.Handler( + self.__rpc_get_all, + grpclib.const.Cardinality.UNARY_STREAM, + EventStreamRequest, + EventStreamResponse, + ), + "/arista.event.v1.EventService/Subscribe": grpclib.const.Handler( + self.__rpc_subscribe, + grpclib.const.Cardinality.UNARY_STREAM, + EventStreamRequest, + EventStreamResponse, + ), + "/arista.event.v1.EventService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + EventStreamRequest, + MetaResponse, + ), + "/arista.event.v1.EventService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + EventStreamRequest, + MetaResponse, + ), + } + + +class EventAnnotationConfigServiceBase(ServiceBase): + + async def get_one( + self, event_annotation_config_request: "EventAnnotationConfigRequest" + ) -> "EventAnnotationConfigResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_some( + self, event_annotation_config_some_request: "EventAnnotationConfigSomeRequest" + ) -> AsyncIterator["EventAnnotationConfigSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all( + self, + event_annotation_config_stream_request: "EventAnnotationConfigStreamRequest", + ) -> AsyncIterator["EventAnnotationConfigStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe( + self, + event_annotation_config_stream_request: "EventAnnotationConfigStreamRequest", + ) -> AsyncIterator["EventAnnotationConfigStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_meta( + self, + event_annotation_config_stream_request: "EventAnnotationConfigStreamRequest", + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, + event_annotation_config_stream_request: "EventAnnotationConfigStreamRequest", + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def set( + self, event_annotation_config_set_request: "EventAnnotationConfigSetRequest" + ) -> "EventAnnotationConfigSetResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def set_some( + self, + event_annotation_config_set_some_request: "EventAnnotationConfigSetSomeRequest", + ) -> AsyncIterator["EventAnnotationConfigSetSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def delete( + self, + event_annotation_config_delete_request: "EventAnnotationConfigDeleteRequest", + ) -> "EventAnnotationConfigDeleteResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def delete_some( + self, + event_annotation_config_delete_some_request: "EventAnnotationConfigDeleteSomeRequest", + ) -> AsyncIterator["EventAnnotationConfigDeleteSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def delete_all( + self, + event_annotation_config_delete_all_request: "EventAnnotationConfigDeleteAllRequest", + ) -> AsyncIterator["EventAnnotationConfigDeleteAllResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def __rpc_get_one( + self, + stream: "grpclib.server.Stream[EventAnnotationConfigRequest, EventAnnotationConfigResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.get_one(request) + await stream.send_message(response) + + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[EventAnnotationConfigSomeRequest, EventAnnotationConfigSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + + async def __rpc_get_all( + self, + stream: "grpclib.server.Stream[EventAnnotationConfigStreamRequest, EventAnnotationConfigStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all, + stream, + request, + ) + + async def __rpc_subscribe( + self, + stream: "grpclib.server.Stream[EventAnnotationConfigStreamRequest, EventAnnotationConfigStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe, + stream, + request, + ) + + async def __rpc_get_meta( + self, + stream: "grpclib.server.Stream[EventAnnotationConfigStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, + stream: "grpclib.server.Stream[EventAnnotationConfigStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + + async def __rpc_set( + self, + stream: "grpclib.server.Stream[EventAnnotationConfigSetRequest, EventAnnotationConfigSetResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.set(request) + await stream.send_message(response) + + async def __rpc_set_some( + self, + stream: "grpclib.server.Stream[EventAnnotationConfigSetSomeRequest, EventAnnotationConfigSetSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.set_some, + stream, + request, + ) + + async def __rpc_delete( + self, + stream: "grpclib.server.Stream[EventAnnotationConfigDeleteRequest, EventAnnotationConfigDeleteResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.delete(request) + await stream.send_message(response) + + async def __rpc_delete_some( + self, + stream: "grpclib.server.Stream[EventAnnotationConfigDeleteSomeRequest, EventAnnotationConfigDeleteSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.delete_some, + stream, + request, + ) + + async def __rpc_delete_all( + self, + stream: "grpclib.server.Stream[EventAnnotationConfigDeleteAllRequest, EventAnnotationConfigDeleteAllResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.delete_all, + stream, + request, + ) + + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: + return { + "/arista.event.v1.EventAnnotationConfigService/GetOne": grpclib.const.Handler( + self.__rpc_get_one, + grpclib.const.Cardinality.UNARY_UNARY, + EventAnnotationConfigRequest, + EventAnnotationConfigResponse, + ), + "/arista.event.v1.EventAnnotationConfigService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + EventAnnotationConfigSomeRequest, + EventAnnotationConfigSomeResponse, + ), + "/arista.event.v1.EventAnnotationConfigService/GetAll": grpclib.const.Handler( + self.__rpc_get_all, + grpclib.const.Cardinality.UNARY_STREAM, + EventAnnotationConfigStreamRequest, + EventAnnotationConfigStreamResponse, + ), + "/arista.event.v1.EventAnnotationConfigService/Subscribe": grpclib.const.Handler( + self.__rpc_subscribe, + grpclib.const.Cardinality.UNARY_STREAM, + EventAnnotationConfigStreamRequest, + EventAnnotationConfigStreamResponse, + ), + "/arista.event.v1.EventAnnotationConfigService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + EventAnnotationConfigStreamRequest, + MetaResponse, + ), + "/arista.event.v1.EventAnnotationConfigService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + EventAnnotationConfigStreamRequest, + MetaResponse, + ), + "/arista.event.v1.EventAnnotationConfigService/Set": grpclib.const.Handler( + self.__rpc_set, + grpclib.const.Cardinality.UNARY_UNARY, + EventAnnotationConfigSetRequest, + EventAnnotationConfigSetResponse, + ), + "/arista.event.v1.EventAnnotationConfigService/SetSome": grpclib.const.Handler( + self.__rpc_set_some, + grpclib.const.Cardinality.UNARY_STREAM, + EventAnnotationConfigSetSomeRequest, + EventAnnotationConfigSetSomeResponse, + ), + "/arista.event.v1.EventAnnotationConfigService/Delete": grpclib.const.Handler( + self.__rpc_delete, + grpclib.const.Cardinality.UNARY_UNARY, + EventAnnotationConfigDeleteRequest, + EventAnnotationConfigDeleteResponse, + ), + "/arista.event.v1.EventAnnotationConfigService/DeleteSome": grpclib.const.Handler( + self.__rpc_delete_some, + grpclib.const.Cardinality.UNARY_STREAM, + EventAnnotationConfigDeleteSomeRequest, + EventAnnotationConfigDeleteSomeResponse, + ), + "/arista.event.v1.EventAnnotationConfigService/DeleteAll": grpclib.const.Handler( + self.__rpc_delete_all, + grpclib.const.Cardinality.UNARY_STREAM, + EventAnnotationConfigDeleteAllRequest, + EventAnnotationConfigDeleteAllResponse, + ), + } + + +class UserEventCreationConfigServiceBase(ServiceBase): + + async def get_one( + self, user_event_creation_config_request: "UserEventCreationConfigRequest" + ) -> "UserEventCreationConfigResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_some( + self, + user_event_creation_config_some_request: "UserEventCreationConfigSomeRequest", + ) -> AsyncIterator["UserEventCreationConfigSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all( + self, + user_event_creation_config_stream_request: "UserEventCreationConfigStreamRequest", + ) -> AsyncIterator["UserEventCreationConfigStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe( + self, + user_event_creation_config_stream_request: "UserEventCreationConfigStreamRequest", + ) -> AsyncIterator["UserEventCreationConfigStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_meta( + self, + user_event_creation_config_stream_request: "UserEventCreationConfigStreamRequest", + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, + user_event_creation_config_stream_request: "UserEventCreationConfigStreamRequest", + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def set( + self, + user_event_creation_config_set_request: "UserEventCreationConfigSetRequest", + ) -> "UserEventCreationConfigSetResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def set_some( + self, + user_event_creation_config_set_some_request: "UserEventCreationConfigSetSomeRequest", + ) -> AsyncIterator["UserEventCreationConfigSetSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def delete( + self, + user_event_creation_config_delete_request: "UserEventCreationConfigDeleteRequest", + ) -> "UserEventCreationConfigDeleteResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def delete_some( + self, + user_event_creation_config_delete_some_request: "UserEventCreationConfigDeleteSomeRequest", + ) -> AsyncIterator["UserEventCreationConfigDeleteSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def delete_all( + self, + user_event_creation_config_delete_all_request: "UserEventCreationConfigDeleteAllRequest", + ) -> AsyncIterator["UserEventCreationConfigDeleteAllResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def __rpc_get_one( + self, + stream: "grpclib.server.Stream[UserEventCreationConfigRequest, UserEventCreationConfigResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.get_one(request) + await stream.send_message(response) + + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[UserEventCreationConfigSomeRequest, UserEventCreationConfigSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + + async def __rpc_get_all( + self, + stream: "grpclib.server.Stream[UserEventCreationConfigStreamRequest, UserEventCreationConfigStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all, + stream, + request, + ) + + async def __rpc_subscribe( + self, + stream: "grpclib.server.Stream[UserEventCreationConfigStreamRequest, UserEventCreationConfigStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe, + stream, + request, + ) + + async def __rpc_get_meta( + self, + stream: "grpclib.server.Stream[UserEventCreationConfigStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, + stream: "grpclib.server.Stream[UserEventCreationConfigStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + + async def __rpc_set( + self, + stream: "grpclib.server.Stream[UserEventCreationConfigSetRequest, UserEventCreationConfigSetResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.set(request) + await stream.send_message(response) + + async def __rpc_set_some( + self, + stream: "grpclib.server.Stream[UserEventCreationConfigSetSomeRequest, UserEventCreationConfigSetSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.set_some, + stream, + request, + ) + + async def __rpc_delete( + self, + stream: "grpclib.server.Stream[UserEventCreationConfigDeleteRequest, UserEventCreationConfigDeleteResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.delete(request) + await stream.send_message(response) + + async def __rpc_delete_some( + self, + stream: "grpclib.server.Stream[UserEventCreationConfigDeleteSomeRequest, UserEventCreationConfigDeleteSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.delete_some, + stream, + request, + ) + + async def __rpc_delete_all( + self, + stream: "grpclib.server.Stream[UserEventCreationConfigDeleteAllRequest, UserEventCreationConfigDeleteAllResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.delete_all, + stream, + request, + ) + + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: + return { + "/arista.event.v1.UserEventCreationConfigService/GetOne": grpclib.const.Handler( + self.__rpc_get_one, + grpclib.const.Cardinality.UNARY_UNARY, + UserEventCreationConfigRequest, + UserEventCreationConfigResponse, + ), + "/arista.event.v1.UserEventCreationConfigService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + UserEventCreationConfigSomeRequest, + UserEventCreationConfigSomeResponse, + ), + "/arista.event.v1.UserEventCreationConfigService/GetAll": grpclib.const.Handler( + self.__rpc_get_all, + grpclib.const.Cardinality.UNARY_STREAM, + UserEventCreationConfigStreamRequest, + UserEventCreationConfigStreamResponse, + ), + "/arista.event.v1.UserEventCreationConfigService/Subscribe": grpclib.const.Handler( + self.__rpc_subscribe, + grpclib.const.Cardinality.UNARY_STREAM, + UserEventCreationConfigStreamRequest, + UserEventCreationConfigStreamResponse, + ), + "/arista.event.v1.UserEventCreationConfigService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + UserEventCreationConfigStreamRequest, + MetaResponse, + ), + "/arista.event.v1.UserEventCreationConfigService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + UserEventCreationConfigStreamRequest, + MetaResponse, + ), + "/arista.event.v1.UserEventCreationConfigService/Set": grpclib.const.Handler( + self.__rpc_set, + grpclib.const.Cardinality.UNARY_UNARY, + UserEventCreationConfigSetRequest, + UserEventCreationConfigSetResponse, + ), + "/arista.event.v1.UserEventCreationConfigService/SetSome": grpclib.const.Handler( + self.__rpc_set_some, + grpclib.const.Cardinality.UNARY_STREAM, + UserEventCreationConfigSetSomeRequest, + UserEventCreationConfigSetSomeResponse, + ), + "/arista.event.v1.UserEventCreationConfigService/Delete": grpclib.const.Handler( + self.__rpc_delete, + grpclib.const.Cardinality.UNARY_UNARY, + UserEventCreationConfigDeleteRequest, + UserEventCreationConfigDeleteResponse, + ), + "/arista.event.v1.UserEventCreationConfigService/DeleteSome": grpclib.const.Handler( + self.__rpc_delete_some, + grpclib.const.Cardinality.UNARY_STREAM, + UserEventCreationConfigDeleteSomeRequest, + UserEventCreationConfigDeleteSomeResponse, + ), + "/arista.event.v1.UserEventCreationConfigService/DeleteAll": grpclib.const.Handler( + self.__rpc_delete_all, + grpclib.const.Cardinality.UNARY_STREAM, + UserEventCreationConfigDeleteAllRequest, + UserEventCreationConfigDeleteAllResponse, + ), + } diff --git a/python-avd/pyavd/_cv/api/arista/identityprovider/__init__.py b/python-avd/pyavd/_cv/api/arista/identityprovider/__init__.py new file mode 100644 index 00000000000..b17ca7c745d --- /dev/null +++ b/python-avd/pyavd/_cv/api/arista/identityprovider/__init__.py @@ -0,0 +1,3 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/identityprovider/v1/__init__.py b/python-avd/pyavd/_cv/api/arista/identityprovider/v1/__init__.py similarity index 58% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/identityprovider/v1/__init__.py rename to python-avd/pyavd/_cv/api/arista/identityprovider/v1/__init__.py index 32f2048f919..d7814b1f6a0 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/identityprovider/v1/__init__.py +++ b/python-avd/pyavd/_cv/api/arista/identityprovider/v1/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. +# Copyright (c) 2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. # Generated by the protocol buffer compiler. DO NOT EDIT! @@ -16,17 +16,9 @@ Optional, ) -try: - import aristaproto - import grpclib - from aristaproto.grpc.grpclib_server import ServiceBase -except ImportError: - HAS_ARISTAPROTO = False - from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_aristaproto as aristaproto - from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_grpclib as grpclib - ServiceBase = object -else: - HAS_ARISTAPROTO = True +import aristaproto +import grpclib +from aristaproto.grpc.grpclib_server import ServiceBase from .... import fmp as ___fmp__ from ... import ( @@ -136,23 +128,34 @@ class OAuthConfig(aristaproto.Message): 9, wraps=aristaproto.TYPE_STRING ) """ - roles_scope_name is the name for a custom scope that includes a custom claim - that holds CloudVision roles in ID Token. - CloudVision appends this value to scope query parameter in the authorization - request URL. This is an optional field. If not set, CloudVision determines that - mapping roles from the provider is disabled. + roles_scope_name is the name for a scope tied to a claim that holds + CloudVision roles in ID Token. CloudVision uses scope values to specify + what access privileges are being requested for id token. CloudVision + appends this value to `scope` query parameter in the authorization request URL. + This is an optional field. If not set, CloudVision determines that + mapping roles from the provider is disabled. If it's set, roles_claim_name + also needs to be set. """ bearer_token_introspection_endpoint: Optional[str] = aristaproto.message_field( 10, wraps=aristaproto.TYPE_STRING ) """ - bearer_token_introspection_endpoint is the provider instrospection endpoint used in - Bearer Token based login support for CloudVision. This endpoint will be used to verify - the bearer token received when an external application is logging in. This is an - optional field. CloudVision will only support this feature for a single provider per - org, hence only one provider is allowed to have this field set. If not set for any - providers, CloudVision determines that Bearer Token based login support is disabled. + bearer_token_introspection_endpoint is the provider instrospection endpoint used + in Bearer Token based login support for CloudVision. This is an optional field. + If specified, this endpoint will be used to verify bearer tokens generated via + the provider to log in automated user accounts. + """ + + roles_claim_name: Optional[str] = aristaproto.message_field( + 11, wraps=aristaproto.TYPE_STRING + ) + """ + roles_claim_name is the name for a claim that holds CloudVision roles in ID Token. + CloudVision uses this value to look up roles in the ID Token. + This is an optional field. If not set, CloudVision determines that + mapping roles from the provider is disabled. If it's set, roles_scope_name + also needs to be set. """ @@ -253,6 +256,36 @@ class SamlConfig(aristaproto.Message): is not specified. """ + username_attrname: Optional[str] = aristaproto.message_field( + 11, wraps=aristaproto.TYPE_STRING + ) + """ + username_attrname specifies Attribute name for CloudVision users' username in the + Assertion of SAMLResponse. This is an optional field as long as mapping roles from + provider is not enabled. Once enabled, this field becomes mandatory. + """ + + +@dataclass(eq=False, repr=False) +class MetaResponse(aristaproto.Message): + time: datetime = aristaproto.message_field(1) + """ + Time holds the timestamp of the last item included in the metadata calculation. + """ + + type: "__subscriptions__.Operation" = aristaproto.enum_field(2) + """ + Operation indicates how the value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + count: Optional[int] = aristaproto.message_field(3, wraps=aristaproto.TYPE_UINT32) + """ + Count is the number of items present under the conditions of the request. + """ + @dataclass(eq=False, repr=False) class OAuthConfigRequest(aristaproto.Message): @@ -286,6 +319,35 @@ class OAuthConfigResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class OAuthConfigSomeRequest(aristaproto.Message): + keys: List["OAuthKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class OAuthConfigSomeResponse(aristaproto.Message): + value: "OAuthConfig" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + @dataclass(eq=False, repr=False) class OAuthConfigStreamRequest(aristaproto.Message): partial_eq_filter: List["OAuthConfig"] = aristaproto.message_field(1) @@ -338,6 +400,57 @@ class OAuthConfigStreamResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class OAuthConfigBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["OAuthConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each OAuthConfig at end. + * Each OAuthConfig response is fully-specified (all fields set). + * start: Returns the state of each OAuthConfig at start, followed by updates until now. + * Each OAuthConfig response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each OAuthConfig at start, followed by updates + until end. + * Each OAuthConfig response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class OAuthConfigBatchedStreamResponse(aristaproto.Message): + responses: List["OAuthConfigStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + @dataclass(eq=False, repr=False) class OAuthConfigSetRequest(aristaproto.Message): value: "OAuthConfig" = aristaproto.message_field(1) @@ -408,15 +521,37 @@ class OAuthConfigDeleteResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class OAuthConfigDeleteSomeRequest(aristaproto.Message): + keys: List["OAuthKey"] = aristaproto.message_field(1) + """key contains a list of OAuthConfig keys to delete""" + + +@dataclass(eq=False, repr=False) +class OAuthConfigDeleteSomeResponse(aristaproto.Message): + """OAuthConfigDeleteSomeResponse is only sent when there is an error.""" + + key: "OAuthKey" = aristaproto.message_field(1) + error: str = aristaproto.string_field(2) + + @dataclass(eq=False, repr=False) class OAuthConfigDeleteAllRequest(aristaproto.Message): - pass + partial_eq_filter: List["OAuthConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a DeleteAll. + This requires all provided fields to be equal to the response. + A filtered DeleteAll will use GetAll with filter to find things to delete. + """ @dataclass(eq=False, repr=False) class OAuthConfigDeleteAllResponse(aristaproto.Message): type: "___fmp__.DeleteError" = aristaproto.enum_field(1) - """This describes the class of delete error.""" + """ + This describes the class of delete error. + A DeleteAllResponse is only sent when there is an error. + """ error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) """This indicates the error message from the delete failure.""" @@ -462,6 +597,35 @@ class SamlConfigResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class SamlConfigSomeRequest(aristaproto.Message): + keys: List["SamlKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class SamlConfigSomeResponse(aristaproto.Message): + value: "SamlConfig" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + @dataclass(eq=False, repr=False) class SamlConfigStreamRequest(aristaproto.Message): partial_eq_filter: List["SamlConfig"] = aristaproto.message_field(1) @@ -514,6 +678,57 @@ class SamlConfigStreamResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class SamlConfigBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["SamlConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each SAMLConfig at end. + * Each SAMLConfig response is fully-specified (all fields set). + * start: Returns the state of each SAMLConfig at start, followed by updates until now. + * Each SAMLConfig response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each SAMLConfig at start, followed by updates + until end. + * Each SAMLConfig response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class SamlConfigBatchedStreamResponse(aristaproto.Message): + responses: List["SamlConfigStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + @dataclass(eq=False, repr=False) class SamlConfigSetRequest(aristaproto.Message): value: "SamlConfig" = aristaproto.message_field(1) @@ -584,15 +799,37 @@ class SamlConfigDeleteResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class SamlConfigDeleteSomeRequest(aristaproto.Message): + keys: List["SamlKey"] = aristaproto.message_field(1) + """key contains a list of SAMLConfig keys to delete""" + + +@dataclass(eq=False, repr=False) +class SamlConfigDeleteSomeResponse(aristaproto.Message): + """SAMLConfigDeleteSomeResponse is only sent when there is an error.""" + + key: "SamlKey" = aristaproto.message_field(1) + error: str = aristaproto.string_field(2) + + @dataclass(eq=False, repr=False) class SamlConfigDeleteAllRequest(aristaproto.Message): - pass + partial_eq_filter: List["SamlConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a DeleteAll. + This requires all provided fields to be equal to the response. + A filtered DeleteAll will use GetAll with filter to find things to delete. + """ @dataclass(eq=False, repr=False) class SamlConfigDeleteAllResponse(aristaproto.Message): type: "___fmp__.DeleteError" = aristaproto.enum_field(1) - """This describes the class of delete error.""" + """ + This describes the class of delete error. + A DeleteAllResponse is only sent when there is an error. + """ error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) """This indicates the error message from the delete failure.""" @@ -624,6 +861,24 @@ async def get_one( metadata=metadata, ) + async def get_some( + self, + o_auth_config_some_request: "OAuthConfigSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["OAuthConfigSomeResponse"]: + async for response in self._unary_stream( + "/arista.identityprovider.v1.OAuthConfigService/GetSome", + o_auth_config_some_request, + OAuthConfigSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def get_all( self, o_auth_config_stream_request: "OAuthConfigStreamRequest", @@ -660,6 +915,41 @@ async def subscribe( ): yield response + async def get_meta( + self, + o_auth_config_stream_request: "OAuthConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.identityprovider.v1.OAuthConfigService/GetMeta", + o_auth_config_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + o_auth_config_stream_request: "OAuthConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.identityprovider.v1.OAuthConfigService/SubscribeMeta", + o_auth_config_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def set( self, o_auth_config_set_request: "OAuthConfigSetRequest", @@ -712,6 +1002,24 @@ async def delete( metadata=metadata, ) + async def delete_some( + self, + o_auth_config_delete_some_request: "OAuthConfigDeleteSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["OAuthConfigDeleteSomeResponse"]: + async for response in self._unary_stream( + "/arista.identityprovider.v1.OAuthConfigService/DeleteSome", + o_auth_config_delete_some_request, + OAuthConfigDeleteSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def delete_all( self, o_auth_config_delete_all_request: "OAuthConfigDeleteAllRequest", @@ -730,6 +1038,42 @@ async def delete_all( ): yield response + async def get_all_batched( + self, + o_auth_config_batched_stream_request: "OAuthConfigBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["OAuthConfigBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.identityprovider.v1.OAuthConfigService/GetAllBatched", + o_auth_config_batched_stream_request, + OAuthConfigBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + o_auth_config_batched_stream_request: "OAuthConfigBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["OAuthConfigBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.identityprovider.v1.OAuthConfigService/SubscribeBatched", + o_auth_config_batched_stream_request, + OAuthConfigBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + class SamlConfigServiceStub(aristaproto.ServiceStub): async def get_one( @@ -749,6 +1093,24 @@ async def get_one( metadata=metadata, ) + async def get_some( + self, + saml_config_some_request: "SamlConfigSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["SamlConfigSomeResponse"]: + async for response in self._unary_stream( + "/arista.identityprovider.v1.SAMLConfigService/GetSome", + saml_config_some_request, + SamlConfigSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def get_all( self, saml_config_stream_request: "SamlConfigStreamRequest", @@ -785,6 +1147,41 @@ async def subscribe( ): yield response + async def get_meta( + self, + saml_config_stream_request: "SamlConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.identityprovider.v1.SAMLConfigService/GetMeta", + saml_config_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + saml_config_stream_request: "SamlConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.identityprovider.v1.SAMLConfigService/SubscribeMeta", + saml_config_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def set( self, saml_config_set_request: "SamlConfigSetRequest", @@ -837,6 +1234,24 @@ async def delete( metadata=metadata, ) + async def delete_some( + self, + saml_config_delete_some_request: "SamlConfigDeleteSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["SamlConfigDeleteSomeResponse"]: + async for response in self._unary_stream( + "/arista.identityprovider.v1.SAMLConfigService/DeleteSome", + saml_config_delete_some_request, + SamlConfigDeleteSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def delete_all( self, saml_config_delete_all_request: "SamlConfigDeleteAllRequest", @@ -855,13 +1270,55 @@ async def delete_all( ): yield response + async def get_all_batched( + self, + saml_config_batched_stream_request: "SamlConfigBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["SamlConfigBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.identityprovider.v1.SAMLConfigService/GetAllBatched", + saml_config_batched_stream_request, + SamlConfigBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + saml_config_batched_stream_request: "SamlConfigBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["SamlConfigBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.identityprovider.v1.SAMLConfigService/SubscribeBatched", + saml_config_batched_stream_request, + SamlConfigBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + class OAuthConfigServiceBase(ServiceBase): + async def get_one( self, o_auth_config_request: "OAuthConfigRequest" ) -> "OAuthConfigResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_some( + self, o_auth_config_some_request: "OAuthConfigSomeRequest" + ) -> AsyncIterator["OAuthConfigSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_all( self, o_auth_config_stream_request: "OAuthConfigStreamRequest" ) -> AsyncIterator["OAuthConfigStreamResponse"]: @@ -872,6 +1329,16 @@ async def subscribe( ) -> AsyncIterator["OAuthConfigStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_meta( + self, o_auth_config_stream_request: "OAuthConfigStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, o_auth_config_stream_request: "OAuthConfigStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def set( self, o_auth_config_set_request: "OAuthConfigSetRequest" ) -> "OAuthConfigSetResponse": @@ -887,11 +1354,26 @@ async def delete( ) -> "OAuthConfigDeleteResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def delete_some( + self, o_auth_config_delete_some_request: "OAuthConfigDeleteSomeRequest" + ) -> AsyncIterator["OAuthConfigDeleteSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def delete_all( self, o_auth_config_delete_all_request: "OAuthConfigDeleteAllRequest" ) -> AsyncIterator["OAuthConfigDeleteAllResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_all_batched( + self, o_auth_config_batched_stream_request: "OAuthConfigBatchedStreamRequest" + ) -> AsyncIterator["OAuthConfigBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, o_auth_config_batched_stream_request: "OAuthConfigBatchedStreamRequest" + ) -> AsyncIterator["OAuthConfigBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def __rpc_get_one( self, stream: "grpclib.server.Stream[OAuthConfigRequest, OAuthConfigResponse]" ) -> None: @@ -899,6 +1381,17 @@ async def __rpc_get_one( response = await self.get_one(request) await stream.send_message(response) + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[OAuthConfigSomeRequest, OAuthConfigSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + async def __rpc_get_all( self, stream: "grpclib.server.Stream[OAuthConfigStreamRequest, OAuthConfigStreamResponse]", @@ -921,6 +1414,23 @@ async def __rpc_subscribe( request, ) + async def __rpc_get_meta( + self, stream: "grpclib.server.Stream[OAuthConfigStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, stream: "grpclib.server.Stream[OAuthConfigStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + async def __rpc_set( self, stream: "grpclib.server.Stream[OAuthConfigSetRequest, OAuthConfigSetResponse]", @@ -948,6 +1458,17 @@ async def __rpc_delete( response = await self.delete(request) await stream.send_message(response) + async def __rpc_delete_some( + self, + stream: "grpclib.server.Stream[OAuthConfigDeleteSomeRequest, OAuthConfigDeleteSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.delete_some, + stream, + request, + ) + async def __rpc_delete_all( self, stream: "grpclib.server.Stream[OAuthConfigDeleteAllRequest, OAuthConfigDeleteAllResponse]", @@ -959,6 +1480,28 @@ async def __rpc_delete_all( request, ) + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[OAuthConfigBatchedStreamRequest, OAuthConfigBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[OAuthConfigBatchedStreamRequest, OAuthConfigBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: return { "/arista.identityprovider.v1.OAuthConfigService/GetOne": grpclib.const.Handler( @@ -967,6 +1510,12 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: OAuthConfigRequest, OAuthConfigResponse, ), + "/arista.identityprovider.v1.OAuthConfigService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + OAuthConfigSomeRequest, + OAuthConfigSomeResponse, + ), "/arista.identityprovider.v1.OAuthConfigService/GetAll": grpclib.const.Handler( self.__rpc_get_all, grpclib.const.Cardinality.UNARY_STREAM, @@ -979,6 +1528,18 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: OAuthConfigStreamRequest, OAuthConfigStreamResponse, ), + "/arista.identityprovider.v1.OAuthConfigService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + OAuthConfigStreamRequest, + MetaResponse, + ), + "/arista.identityprovider.v1.OAuthConfigService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + OAuthConfigStreamRequest, + MetaResponse, + ), "/arista.identityprovider.v1.OAuthConfigService/Set": grpclib.const.Handler( self.__rpc_set, grpclib.const.Cardinality.UNARY_UNARY, @@ -997,21 +1558,45 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: OAuthConfigDeleteRequest, OAuthConfigDeleteResponse, ), + "/arista.identityprovider.v1.OAuthConfigService/DeleteSome": grpclib.const.Handler( + self.__rpc_delete_some, + grpclib.const.Cardinality.UNARY_STREAM, + OAuthConfigDeleteSomeRequest, + OAuthConfigDeleteSomeResponse, + ), "/arista.identityprovider.v1.OAuthConfigService/DeleteAll": grpclib.const.Handler( self.__rpc_delete_all, grpclib.const.Cardinality.UNARY_STREAM, OAuthConfigDeleteAllRequest, OAuthConfigDeleteAllResponse, ), + "/arista.identityprovider.v1.OAuthConfigService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + OAuthConfigBatchedStreamRequest, + OAuthConfigBatchedStreamResponse, + ), + "/arista.identityprovider.v1.OAuthConfigService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + OAuthConfigBatchedStreamRequest, + OAuthConfigBatchedStreamResponse, + ), } class SamlConfigServiceBase(ServiceBase): + async def get_one( self, saml_config_request: "SamlConfigRequest" ) -> "SamlConfigResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_some( + self, saml_config_some_request: "SamlConfigSomeRequest" + ) -> AsyncIterator["SamlConfigSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_all( self, saml_config_stream_request: "SamlConfigStreamRequest" ) -> AsyncIterator["SamlConfigStreamResponse"]: @@ -1022,6 +1607,16 @@ async def subscribe( ) -> AsyncIterator["SamlConfigStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_meta( + self, saml_config_stream_request: "SamlConfigStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, saml_config_stream_request: "SamlConfigStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def set( self, saml_config_set_request: "SamlConfigSetRequest" ) -> "SamlConfigSetResponse": @@ -1037,11 +1632,26 @@ async def delete( ) -> "SamlConfigDeleteResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def delete_some( + self, saml_config_delete_some_request: "SamlConfigDeleteSomeRequest" + ) -> AsyncIterator["SamlConfigDeleteSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def delete_all( self, saml_config_delete_all_request: "SamlConfigDeleteAllRequest" ) -> AsyncIterator["SamlConfigDeleteAllResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_all_batched( + self, saml_config_batched_stream_request: "SamlConfigBatchedStreamRequest" + ) -> AsyncIterator["SamlConfigBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, saml_config_batched_stream_request: "SamlConfigBatchedStreamRequest" + ) -> AsyncIterator["SamlConfigBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def __rpc_get_one( self, stream: "grpclib.server.Stream[SamlConfigRequest, SamlConfigResponse]" ) -> None: @@ -1049,6 +1659,17 @@ async def __rpc_get_one( response = await self.get_one(request) await stream.send_message(response) + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[SamlConfigSomeRequest, SamlConfigSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + async def __rpc_get_all( self, stream: "grpclib.server.Stream[SamlConfigStreamRequest, SamlConfigStreamResponse]", @@ -1071,6 +1692,23 @@ async def __rpc_subscribe( request, ) + async def __rpc_get_meta( + self, stream: "grpclib.server.Stream[SamlConfigStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, stream: "grpclib.server.Stream[SamlConfigStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + async def __rpc_set( self, stream: "grpclib.server.Stream[SamlConfigSetRequest, SamlConfigSetResponse]", @@ -1098,6 +1736,17 @@ async def __rpc_delete( response = await self.delete(request) await stream.send_message(response) + async def __rpc_delete_some( + self, + stream: "grpclib.server.Stream[SamlConfigDeleteSomeRequest, SamlConfigDeleteSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.delete_some, + stream, + request, + ) + async def __rpc_delete_all( self, stream: "grpclib.server.Stream[SamlConfigDeleteAllRequest, SamlConfigDeleteAllResponse]", @@ -1109,6 +1758,28 @@ async def __rpc_delete_all( request, ) + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[SamlConfigBatchedStreamRequest, SamlConfigBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[SamlConfigBatchedStreamRequest, SamlConfigBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: return { "/arista.identityprovider.v1.SAMLConfigService/GetOne": grpclib.const.Handler( @@ -1117,6 +1788,12 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: SamlConfigRequest, SamlConfigResponse, ), + "/arista.identityprovider.v1.SAMLConfigService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + SamlConfigSomeRequest, + SamlConfigSomeResponse, + ), "/arista.identityprovider.v1.SAMLConfigService/GetAll": grpclib.const.Handler( self.__rpc_get_all, grpclib.const.Cardinality.UNARY_STREAM, @@ -1129,6 +1806,18 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: SamlConfigStreamRequest, SamlConfigStreamResponse, ), + "/arista.identityprovider.v1.SAMLConfigService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + SamlConfigStreamRequest, + MetaResponse, + ), + "/arista.identityprovider.v1.SAMLConfigService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + SamlConfigStreamRequest, + MetaResponse, + ), "/arista.identityprovider.v1.SAMLConfigService/Set": grpclib.const.Handler( self.__rpc_set, grpclib.const.Cardinality.UNARY_UNARY, @@ -1147,10 +1836,28 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: SamlConfigDeleteRequest, SamlConfigDeleteResponse, ), + "/arista.identityprovider.v1.SAMLConfigService/DeleteSome": grpclib.const.Handler( + self.__rpc_delete_some, + grpclib.const.Cardinality.UNARY_STREAM, + SamlConfigDeleteSomeRequest, + SamlConfigDeleteSomeResponse, + ), "/arista.identityprovider.v1.SAMLConfigService/DeleteAll": grpclib.const.Handler( self.__rpc_delete_all, grpclib.const.Cardinality.UNARY_STREAM, SamlConfigDeleteAllRequest, SamlConfigDeleteAllResponse, ), + "/arista.identityprovider.v1.SAMLConfigService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + SamlConfigBatchedStreamRequest, + SamlConfigBatchedStreamResponse, + ), + "/arista.identityprovider.v1.SAMLConfigService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + SamlConfigBatchedStreamRequest, + SamlConfigBatchedStreamResponse, + ), } diff --git a/python-avd/pyavd/_cv/api/arista/imagestatus/__init__.py b/python-avd/pyavd/_cv/api/arista/imagestatus/__init__.py new file mode 100644 index 00000000000..b17ca7c745d --- /dev/null +++ b/python-avd/pyavd/_cv/api/arista/imagestatus/__init__.py @@ -0,0 +1,3 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/imagestatus/v1/__init__.py b/python-avd/pyavd/_cv/api/arista/imagestatus/v1/__init__.py similarity index 70% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/imagestatus/v1/__init__.py rename to python-avd/pyavd/_cv/api/arista/imagestatus/v1/__init__.py index d3071668f8e..9c0ba368577 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/imagestatus/v1/__init__.py +++ b/python-avd/pyavd/_cv/api/arista/imagestatus/v1/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. +# Copyright (c) 2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. # Generated by the protocol buffer compiler. DO NOT EDIT! @@ -16,17 +16,9 @@ Optional, ) -try: - import aristaproto - import grpclib - from aristaproto.grpc.grpclib_server import ServiceBase -except ImportError: - HAS_ARISTAPROTO = False - from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_aristaproto as aristaproto - from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_grpclib as grpclib - ServiceBase = object -else: - HAS_ARISTAPROTO = True +import aristaproto +import grpclib +from aristaproto.grpc.grpclib_server import ServiceBase from ... import ( subscriptions as __subscriptions__, @@ -197,6 +189,18 @@ class ErrorCode(aristaproto.Enum): does not support the given EOS type. """ + TA_EMBEDDEDEXT_INCOMPATIBLE = 14 + """ + ERROR_CODE_TA_EMBEDDEDEXT_INCOMPATIBLE represents the case where the extension TerminAttr + version is lower than the embedded TerminAttr version in SWI. + """ + + DEVICE_EOS_2GB_INCOMPATIBLE = 15 + """ + ERROR_CODE_DEVICE_EOS_2GB_INCOMPATIBLE represents the case where a 2GB-device is incompatible + with a non-2GB EOS or a non-2GB device is incompatible with a 2GB-EOS. + """ + class WarningCode(aristaproto.Enum): """WarningCode indicates warnings produced during image validations.""" @@ -282,6 +286,24 @@ class WarningCode(aristaproto.Enum): supports the SKUs. """ + RUNNING_TA_BELOW_MIN_SUPPORTED_VERSION = 14 + """ + WARNING_CODE_RUNNING_TA_BELOW_MIN_SUPPORTED_VERSION represents cases where the running + TerminAttr version is below CloudVision's minimum supported version. + """ + + TA_STUDIO_INCOMPATIBLE = 15 + """ + WARNING_CODE_TA_STUDIO_INCOMPATIBLE represents cases where the TerminAttr is incompatible + with Software Management Studio. + """ + + BUGALERTS_DATA_MISSING = 16 + """ + WARNING_CODE_BUGALERTS_DATA_MISSING represents cases where some of the BugAlerts data + under Aeris analytics dataset is missing. + """ + @dataclass(eq=False, repr=False) class SoftwareImage(aristaproto.Message): @@ -681,6 +703,27 @@ class ImageWarnings(aristaproto.Message): """values is a list of image warnings.""" +@dataclass(eq=False, repr=False) +class MetaResponse(aristaproto.Message): + time: datetime = aristaproto.message_field(1) + """ + Time holds the timestamp of the last item included in the metadata calculation. + """ + + type: "__subscriptions__.Operation" = aristaproto.enum_field(2) + """ + Operation indicates how the value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + count: Optional[int] = aristaproto.message_field(3, wraps=aristaproto.TYPE_UINT32) + """ + Count is the number of items present under the conditions of the request. + """ + + @dataclass(eq=False, repr=False) class SummaryRequest(aristaproto.Message): key: "SummaryKey" = aristaproto.message_field(1) @@ -713,6 +756,35 @@ class SummaryResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class SummarySomeRequest(aristaproto.Message): + keys: List["SummaryKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class SummarySomeResponse(aristaproto.Message): + value: "Summary" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + @dataclass(eq=False, repr=False) class SummaryStreamRequest(aristaproto.Message): partial_eq_filter: List["Summary"] = aristaproto.message_field(1) @@ -765,6 +837,57 @@ class SummaryStreamResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class SummaryBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["Summary"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each Summary at end. + * Each Summary response is fully-specified (all fields set). + * start: Returns the state of each Summary at start, followed by updates until now. + * Each Summary response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each Summary at start, followed by updates + until end. + * Each Summary response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class SummaryBatchedStreamResponse(aristaproto.Message): + responses: List["SummaryStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + class SummaryServiceStub(aristaproto.ServiceStub): async def get_one( self, @@ -783,6 +906,24 @@ async def get_one( metadata=metadata, ) + async def get_some( + self, + summary_some_request: "SummarySomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["SummarySomeResponse"]: + async for response in self._unary_stream( + "/arista.imagestatus.v1.SummaryService/GetSome", + summary_some_request, + SummarySomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def get_all( self, summary_stream_request: "SummaryStreamRequest", @@ -819,11 +960,88 @@ async def subscribe( ): yield response + async def get_meta( + self, + summary_stream_request: "SummaryStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.imagestatus.v1.SummaryService/GetMeta", + summary_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + summary_stream_request: "SummaryStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.imagestatus.v1.SummaryService/SubscribeMeta", + summary_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all_batched( + self, + summary_batched_stream_request: "SummaryBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["SummaryBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.imagestatus.v1.SummaryService/GetAllBatched", + summary_batched_stream_request, + SummaryBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + summary_batched_stream_request: "SummaryBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["SummaryBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.imagestatus.v1.SummaryService/SubscribeBatched", + summary_batched_stream_request, + SummaryBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + class SummaryServiceBase(ServiceBase): + async def get_one(self, summary_request: "SummaryRequest") -> "SummaryResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_some( + self, summary_some_request: "SummarySomeRequest" + ) -> AsyncIterator["SummarySomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_all( self, summary_stream_request: "SummaryStreamRequest" ) -> AsyncIterator["SummaryStreamResponse"]: @@ -834,6 +1052,26 @@ async def subscribe( ) -> AsyncIterator["SummaryStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_meta( + self, summary_stream_request: "SummaryStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, summary_stream_request: "SummaryStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all_batched( + self, summary_batched_stream_request: "SummaryBatchedStreamRequest" + ) -> AsyncIterator["SummaryBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, summary_batched_stream_request: "SummaryBatchedStreamRequest" + ) -> AsyncIterator["SummaryBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def __rpc_get_one( self, stream: "grpclib.server.Stream[SummaryRequest, SummaryResponse]" ) -> None: @@ -841,6 +1079,16 @@ async def __rpc_get_one( response = await self.get_one(request) await stream.send_message(response) + async def __rpc_get_some( + self, stream: "grpclib.server.Stream[SummarySomeRequest, SummarySomeResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + async def __rpc_get_all( self, stream: "grpclib.server.Stream[SummaryStreamRequest, SummaryStreamResponse]", @@ -863,6 +1111,45 @@ async def __rpc_subscribe( request, ) + async def __rpc_get_meta( + self, stream: "grpclib.server.Stream[SummaryStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, stream: "grpclib.server.Stream[SummaryStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[SummaryBatchedStreamRequest, SummaryBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[SummaryBatchedStreamRequest, SummaryBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: return { "/arista.imagestatus.v1.SummaryService/GetOne": grpclib.const.Handler( @@ -871,6 +1158,12 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: SummaryRequest, SummaryResponse, ), + "/arista.imagestatus.v1.SummaryService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + SummarySomeRequest, + SummarySomeResponse, + ), "/arista.imagestatus.v1.SummaryService/GetAll": grpclib.const.Handler( self.__rpc_get_all, grpclib.const.Cardinality.UNARY_STREAM, @@ -883,4 +1176,28 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: SummaryStreamRequest, SummaryStreamResponse, ), + "/arista.imagestatus.v1.SummaryService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + SummaryStreamRequest, + MetaResponse, + ), + "/arista.imagestatus.v1.SummaryService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + SummaryStreamRequest, + MetaResponse, + ), + "/arista.imagestatus.v1.SummaryService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + SummaryBatchedStreamRequest, + SummaryBatchedStreamResponse, + ), + "/arista.imagestatus.v1.SummaryService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + SummaryBatchedStreamRequest, + SummaryBatchedStreamResponse, + ), } diff --git a/python-avd/pyavd/_cv/api/arista/inventory/__init__.py b/python-avd/pyavd/_cv/api/arista/inventory/__init__.py new file mode 100644 index 00000000000..b17ca7c745d --- /dev/null +++ b/python-avd/pyavd/_cv/api/arista/inventory/__init__.py @@ -0,0 +1,3 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. diff --git a/python-avd/pyavd/_cv/api/arista/inventory/v1/__init__.py b/python-avd/pyavd/_cv/api/arista/inventory/v1/__init__.py new file mode 100644 index 00000000000..6d792dc8925 --- /dev/null +++ b/python-avd/pyavd/_cv/api/arista/inventory/v1/__init__.py @@ -0,0 +1,3994 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +# Generated by the protocol buffer compiler. DO NOT EDIT! +# sources: arista/inventory.v1/inventory.proto, arista/inventory.v1/services.gen.proto +# plugin: python-aristaproto +# This file has been @generated + +from dataclasses import dataclass +from datetime import datetime +from typing import ( + TYPE_CHECKING, + AsyncIterator, + Dict, + List, + Optional, +) + +import aristaproto +import grpclib +from aristaproto.grpc.grpclib_server import ServiceBase + +from .... import fmp as ___fmp__ +from ... import ( + subscriptions as __subscriptions__, + time as __time__, +) + + +if TYPE_CHECKING: + import grpclib.server + from aristaproto.grpc.grpclib_client import MetadataLike + from grpclib.metadata import Deadline + + +class StreamingStatus(aristaproto.Enum): + """ + StreamingStatus defines the status of telemetry streaming for a device. + """ + + UNSPECIFIED = 0 + INACTIVE = 1 + """ + STREAMING_STATUS_INACTIVE indicates the device is not streaming telemetry. + """ + + ACTIVE = 2 + """STREAMING_STATUS_ACTIVE indicates the device is streaming telemetry.""" + + +class OnboardingStatus(aristaproto.Enum): + """ + OnboardingStatus defines the set of possible states in the onboarding process + for a device. + """ + + UNSPECIFIED = 0 + IN_PROGRESS = 1 + """ONBOARDING_STATUS_IN_PROGRESS indicates onboarding is in progress.""" + + FAILURE = 2 + """ONBOARDING_STATUS_FAILURE indicates onboarding failed.""" + + SUCCESS = 3 + """ONBOARDING_STATUS_SUCCESS indicates onboarding succeeded.""" + + +class DecommissioningStatus(aristaproto.Enum): + """ + DecommissioningStatus defines the set of possible states in the decommissioning + process for a device. + """ + + UNSPECIFIED = 0 + IN_PROGRESS = 1 + """ + DECOMMISSIONING_STATUS_IN_PROGRESS indicates decommissioning is in progress. + """ + + FAILURE = 2 + """DECOMMISSIONING_STATUS_FAILURE indicates decommissioning failed.""" + + SUCCESS = 3 + """DECOMMISSIONING_STATUS_SUCCESS indicates decommissioning succeeded.""" + + +class ProvisioningStatus(aristaproto.Enum): + """ + ProvisioningStatus defines the set of possible states in the provisioning + process for a device. + """ + + UNSPECIFIED = 0 + IN_PROGRESS = 1 + """ + PROVISIONING_STATUS_IN_PROGRESS indicates provisioning is in progress. + """ + + FAILURE = 2 + """PROVISIONING_STATUS_FAILURE indicates provisioning failed.""" + + SUCCESS = 3 + """PROVISIONING_STATUS_SUCCESS indicates provisioning succeeded.""" + + +@dataclass(eq=False, repr=False) +class ExtendedAttributes(aristaproto.Message): + """ + ExtendedAttributes wraps any additional, potentially non-standard, features + or attributes the device reports. + """ + + feature_enabled: Dict[str, bool] = aristaproto.map_field( + 1, aristaproto.TYPE_STRING, aristaproto.TYPE_BOOL + ) + """ + feature_enabled is a map of feature name to enabled status. + If a feature is missing from this map it can be assumed off. + """ + + +@dataclass(eq=False, repr=False) +class DeviceKey(aristaproto.Message): + """DeviceKey uniquely identifies a single device.""" + + device_id: Optional[str] = aristaproto.message_field( + 1, wraps=aristaproto.TYPE_STRING + ) + """device_id is the unique identifier of the device.""" + + +@dataclass(eq=False, repr=False) +class DeviceConfiguration(aristaproto.Message): + """ + DeviceConfiguration holds the device-specific configuration for a third-party + device, as defined in https://github.com/aristanetworks/cloudvision-go. + """ + + options: Dict[str, str] = aristaproto.map_field( + 1, aristaproto.TYPE_STRING, aristaproto.TYPE_STRING + ) + """ + options is a map from device option to value. + + E.g., for an SNMP device, this could be the following: + + "address": "my_snmp_hostname", + "community": "public" + """ + + +@dataclass(eq=False, repr=False) +class UuidKey(aristaproto.Message): + """ + UUIDKey is a key that holds a UUID for an onboarding or decommissioning request. + """ + + request_id: Optional[str] = aristaproto.message_field( + 1, wraps=aristaproto.TYPE_STRING + ) + """request_id should be a UUID for the request.""" + + +@dataclass(eq=False, repr=False) +class DeviceOnboardingConfig(aristaproto.Message): + """ + DeviceOnboardingConfig describes a device onboarding request. "Onboarding" + refers to the process of initiating device streaming to CloudVision and + adding the streaming device to CloudVision's inventory. + + The request flow works as follows: + + 1. Set on DeviceOnboardingConfig sends an onboarding request with a UUID + that the user is responsible for generating. + 2. Once the server receives the request, it validates and records it. + 3. Then, the server processes it, initiating the onboarding procedure and + tracking the status of the onboarding attempt. + 4. The user may do a GetOne or Subscribe on DeviceOnboarding using the same + UUID to see the status of the request. + """ + + key: "UuidKey" = aristaproto.message_field(1) + """key identifies the request to onboard the device at hostname_or_ip.""" + + hostname_or_ip: Optional[str] = aristaproto.message_field( + 2, wraps=aristaproto.TYPE_STRING + ) + """ + hostname_or_ip is a hostname or an IP at which the device can be reached. + """ + + device_type: Optional[str] = aristaproto.message_field( + 3, wraps=aristaproto.TYPE_STRING + ) + """ + device_type describes the method by which to retrieve information for the + device. The value should be "eos" for eos devices. For third-party devices, + supported values are: "openconfig", "snmp", "cvp", "mwm", and "vCenter". + """ + + device_config: "DeviceConfiguration" = aristaproto.message_field(4) + """device_config is the configuration for a third-party device.""" + + +@dataclass(eq=False, repr=False) +class DeviceOnboarding(aristaproto.Message): + """DeviceOnboarding describes the status of an onboarding process.""" + + key: "UuidKey" = aristaproto.message_field(1) + """ + key identifies the request for which to retrieve an onboarding status. + """ + + device_id: Optional[str] = aristaproto.message_field( + 2, wraps=aristaproto.TYPE_STRING + ) + """device_id is the unique device ID that is discovered via onboarding.""" + + status: "OnboardingStatus" = aristaproto.enum_field(3) + """status describes the onboarding status of the device.""" + + error: Optional[str] = aristaproto.message_field(4, wraps=aristaproto.TYPE_STRING) + """ + error is the error that caused status to become ONBOARDING_STATUS_FAILURE. + """ + + status_message: Optional[str] = aristaproto.message_field( + 5, wraps=aristaproto.TYPE_STRING + ) + """ + status_message contains information on the status of the onboarding attempt, + if any. This is generally an unstructured log message that is for display + purposes only (its structure and contents may change). + """ + + +@dataclass(eq=False, repr=False) +class DeviceDecommissioningConfig(aristaproto.Message): + """ + DeviceDecommissioningConfig describes a device decommissioning request. + "Decommissioning" refers to the process of stopping device streaming to + CloudVision and removing it from CloudVision's inventory. + + The request flow works as follows: + + 1. Set on DeviceDecommissioningConfig sends a decommissioning request with + a UUID that the user is responsible for generating. + 2. Once the server receives the request, it validates and records it. + 3. Then, the server processes it, initiating the decommissioning procedure + and tracking the status of the decommissioning attempt. + 4. The user may do a GetOne or Subscribe on DeviceDecommissioning using the + same UUID to see the status of the request. + """ + + key: "UuidKey" = aristaproto.message_field(1) + """key identifies the request to decommission the device.""" + + device_id: Optional[str] = aristaproto.message_field( + 2, wraps=aristaproto.TYPE_STRING + ) + """ + device_id is the unique device ID that was discovered via onboarding. + """ + + force: Optional[bool] = aristaproto.message_field(3, wraps=aristaproto.TYPE_BOOL) + """ + force is a flag that indicates if the decommission is to be forced. + Normally, if there are pending or in-progress tasks associated with the device + the decommission would fail. In case of a forced decommission, such blocking + tasks would be ignored and decommissioning will be continued. + """ + + +@dataclass(eq=False, repr=False) +class DeviceDecommissioning(aristaproto.Message): + """DeviceOnboarding describes the status of a decommissioning process.""" + + key: "UuidKey" = aristaproto.message_field(1) + """ + key identifies the request for which to retrieve a decommissioning status. + """ + + status: "DecommissioningStatus" = aristaproto.enum_field(2) + """status describes the decommissioning status of the device.""" + + error: Optional[str] = aristaproto.message_field(3, wraps=aristaproto.TYPE_STRING) + """ + error is the error that caused status to become DECOMMISSIONING_STATUS_FAILURE. + """ + + status_message: Optional[str] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_STRING + ) + """ + status_message contains information on the status of the decommissioning attempt, + if any. This is generally an unstructured log message that is for display + purposes only (its structure and contents may change). + """ + + +@dataclass(eq=False, repr=False) +class Device(aristaproto.Message): + """Device describes an onboarded device.""" + + key: "DeviceKey" = aristaproto.message_field(1) + """key uniquely identifies the device.""" + + software_version: Optional[str] = aristaproto.message_field( + 2, wraps=aristaproto.TYPE_STRING + ) + """ + software_version gives the currently running device software version. + """ + + model_name: Optional[str] = aristaproto.message_field( + 3, wraps=aristaproto.TYPE_STRING + ) + """model_name describes the hardware model of this device.""" + + hardware_revision: Optional[str] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_STRING + ) + """hardware_revision describes any revisional data to the model name.""" + + fqdn: Optional[str] = aristaproto.message_field(10, wraps=aristaproto.TYPE_STRING) + """fqdn gives the device's fully qualified domain name.""" + + hostname: Optional[str] = aristaproto.message_field( + 11, wraps=aristaproto.TYPE_STRING + ) + """hostname is the hostname as reported on the device.""" + + domain_name: Optional[str] = aristaproto.message_field( + 12, wraps=aristaproto.TYPE_STRING + ) + """ + domain_name provides the domain name on which the device is registered. + """ + + system_mac_address: Optional[str] = aristaproto.message_field( + 13, wraps=aristaproto.TYPE_STRING + ) + """system_mac_address provides the MAC address of the management port.""" + + boot_time: datetime = aristaproto.message_field(20) + """boot_time indicates when the device was last booted.""" + + streaming_status: "StreamingStatus" = aristaproto.enum_field(30) + """ + streaming_status is the status of telemetry streaming for this device. + """ + + extended_attributes: "ExtendedAttributes" = aristaproto.message_field(31) + """ + extended_attributes wraps any additional, potentially non-standard, features + or attributes that the device reports. + """ + + +@dataclass(eq=False, repr=False) +class ProvisionedDevice(aristaproto.Message): + """ + ProvisionedDevice describes the provisioning status of an onboarded device + if the onboarded device is configured for provisioning. + """ + + key: "DeviceKey" = aristaproto.message_field(1) + """key uniquely identifies the device.""" + + status: "ProvisioningStatus" = aristaproto.enum_field(2) + """status describes the onboarded device's provisioning status.""" + + error: Optional[str] = aristaproto.message_field(3, wraps=aristaproto.TYPE_STRING) + """ + error is the error that caused status to become PROVISIONING_STATUS_FAILURE. + """ + + ztp_mode: Optional[bool] = aristaproto.message_field(4, wraps=aristaproto.TYPE_BOOL) + """ztp_mode indicates whether the device is in ZTP mode.""" + + ip_address: "___fmp__.IpAddress" = aristaproto.message_field(5) + """ + ip_address is the current (post-provisioning) IP address of the device. + """ + + provisioning_group_name: Optional[str] = aristaproto.message_field( + 6, wraps=aristaproto.TYPE_STRING + ) + """ + provisioning_group_name is the name of the group (also known as a container) + to which the device belongs. Any provisioning operation performed on this + group will also be performed on this device. If the device is not yet provisioned, + this will not be set. Once it is provisioned, this will be set to "undefined_container" + which indicates that the device does not yet belong to a group. At this point, + a user may set it to an existing group. + """ + + +@dataclass(eq=False, repr=False) +class MetaResponse(aristaproto.Message): + time: datetime = aristaproto.message_field(1) + """ + Time holds the timestamp of the last item included in the metadata calculation. + """ + + type: "__subscriptions__.Operation" = aristaproto.enum_field(2) + """ + Operation indicates how the value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + count: Optional[int] = aristaproto.message_field(3, wraps=aristaproto.TYPE_UINT32) + """ + Count is the number of items present under the conditions of the request. + """ + + +@dataclass(eq=False, repr=False) +class DeviceRequest(aristaproto.Message): + key: "DeviceKey" = aristaproto.message_field(1) + """ + Key uniquely identifies a Device instance to retrieve. + This value must be populated. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class DeviceResponse(aristaproto.Message): + value: "Device" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time carries the (UTC) timestamp of the last-modification of the + Device instance in this response. + """ + + +@dataclass(eq=False, repr=False) +class DeviceSomeRequest(aristaproto.Message): + keys: List["DeviceKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class DeviceSomeResponse(aristaproto.Message): + value: "Device" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + +@dataclass(eq=False, repr=False) +class DeviceStreamRequest(aristaproto.Message): + partial_eq_filter: List["Device"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each Device at end. + * Each Device response is fully-specified (all fields set). + * start: Returns the state of each Device at start, followed by updates until now. + * Each Device response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each Device at start, followed by updates + until end. + * Each Device response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + +@dataclass(eq=False, repr=False) +class DeviceStreamResponse(aristaproto.Message): + value: "Device" = aristaproto.message_field(1) + """ + Value is a value deemed relevant to the initiating request. + This structure will always have its key-field populated. Which other fields are + populated, and why, depends on the value of Operation and what triggered this notification. + """ + + time: datetime = aristaproto.message_field(2) + """Time holds the timestamp of this Device's last modification.""" + + type: "__subscriptions__.Operation" = aristaproto.enum_field(3) + """ + Operation indicates how the Device value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + +@dataclass(eq=False, repr=False) +class DeviceBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["Device"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each Device at end. + * Each Device response is fully-specified (all fields set). + * start: Returns the state of each Device at start, followed by updates until now. + * Each Device response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each Device at start, followed by updates + until end. + * Each Device response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class DeviceBatchedStreamResponse(aristaproto.Message): + responses: List["DeviceStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + +@dataclass(eq=False, repr=False) +class DeviceDecommissioningRequest(aristaproto.Message): + key: "UuidKey" = aristaproto.message_field(1) + """ + Key uniquely identifies a DeviceDecommissioning instance to retrieve. + This value must be populated. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class DeviceDecommissioningResponse(aristaproto.Message): + value: "DeviceDecommissioning" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time carries the (UTC) timestamp of the last-modification of the + DeviceDecommissioning instance in this response. + """ + + +@dataclass(eq=False, repr=False) +class DeviceDecommissioningSomeRequest(aristaproto.Message): + keys: List["UuidKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class DeviceDecommissioningSomeResponse(aristaproto.Message): + value: "DeviceDecommissioning" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + +@dataclass(eq=False, repr=False) +class DeviceDecommissioningStreamRequest(aristaproto.Message): + partial_eq_filter: List["DeviceDecommissioning"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each DeviceDecommissioning at end. + * Each DeviceDecommissioning response is fully-specified (all fields set). + * start: Returns the state of each DeviceDecommissioning at start, followed by updates until now. + * Each DeviceDecommissioning response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each DeviceDecommissioning at start, followed by updates + until end. + * Each DeviceDecommissioning response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + +@dataclass(eq=False, repr=False) +class DeviceDecommissioningStreamResponse(aristaproto.Message): + value: "DeviceDecommissioning" = aristaproto.message_field(1) + """ + Value is a value deemed relevant to the initiating request. + This structure will always have its key-field populated. Which other fields are + populated, and why, depends on the value of Operation and what triggered this notification. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time holds the timestamp of this DeviceDecommissioning's last modification. + """ + + type: "__subscriptions__.Operation" = aristaproto.enum_field(3) + """ + Operation indicates how the DeviceDecommissioning value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + +@dataclass(eq=False, repr=False) +class DeviceDecommissioningBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["DeviceDecommissioning"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each DeviceDecommissioning at end. + * Each DeviceDecommissioning response is fully-specified (all fields set). + * start: Returns the state of each DeviceDecommissioning at start, followed by updates until now. + * Each DeviceDecommissioning response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each DeviceDecommissioning at start, followed by updates + until end. + * Each DeviceDecommissioning response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class DeviceDecommissioningBatchedStreamResponse(aristaproto.Message): + responses: List["DeviceDecommissioningStreamResponse"] = aristaproto.message_field( + 1 + ) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + +@dataclass(eq=False, repr=False) +class DeviceDecommissioningConfigRequest(aristaproto.Message): + key: "UuidKey" = aristaproto.message_field(1) + """ + Key uniquely identifies a DeviceDecommissioningConfig instance to retrieve. + This value must be populated. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class DeviceDecommissioningConfigResponse(aristaproto.Message): + value: "DeviceDecommissioningConfig" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time carries the (UTC) timestamp of the last-modification of the + DeviceDecommissioningConfig instance in this response. + """ + + +@dataclass(eq=False, repr=False) +class DeviceDecommissioningConfigSomeRequest(aristaproto.Message): + keys: List["UuidKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class DeviceDecommissioningConfigSomeResponse(aristaproto.Message): + value: "DeviceDecommissioningConfig" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + +@dataclass(eq=False, repr=False) +class DeviceDecommissioningConfigStreamRequest(aristaproto.Message): + partial_eq_filter: List["DeviceDecommissioningConfig"] = aristaproto.message_field( + 1 + ) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each DeviceDecommissioningConfig at end. + * Each DeviceDecommissioningConfig response is fully-specified (all fields set). + * start: Returns the state of each DeviceDecommissioningConfig at start, followed by updates until now. + * Each DeviceDecommissioningConfig response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each DeviceDecommissioningConfig at start, followed by updates + until end. + * Each DeviceDecommissioningConfig response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + +@dataclass(eq=False, repr=False) +class DeviceDecommissioningConfigStreamResponse(aristaproto.Message): + value: "DeviceDecommissioningConfig" = aristaproto.message_field(1) + """ + Value is a value deemed relevant to the initiating request. + This structure will always have its key-field populated. Which other fields are + populated, and why, depends on the value of Operation and what triggered this notification. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time holds the timestamp of this DeviceDecommissioningConfig's last modification. + """ + + type: "__subscriptions__.Operation" = aristaproto.enum_field(3) + """ + Operation indicates how the DeviceDecommissioningConfig value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + +@dataclass(eq=False, repr=False) +class DeviceDecommissioningConfigBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["DeviceDecommissioningConfig"] = aristaproto.message_field( + 1 + ) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each DeviceDecommissioningConfig at end. + * Each DeviceDecommissioningConfig response is fully-specified (all fields set). + * start: Returns the state of each DeviceDecommissioningConfig at start, followed by updates until now. + * Each DeviceDecommissioningConfig response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each DeviceDecommissioningConfig at start, followed by updates + until end. + * Each DeviceDecommissioningConfig response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class DeviceDecommissioningConfigBatchedStreamResponse(aristaproto.Message): + responses: List["DeviceDecommissioningConfigStreamResponse"] = ( + aristaproto.message_field(1) + ) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + +@dataclass(eq=False, repr=False) +class DeviceDecommissioningConfigSetRequest(aristaproto.Message): + value: "DeviceDecommissioningConfig" = aristaproto.message_field(1) + """ + DeviceDecommissioningConfig carries the value to set into the datastore. + See the documentation on the DeviceDecommissioningConfig struct for which fields are required. + """ + + +@dataclass(eq=False, repr=False) +class DeviceDecommissioningConfigSetResponse(aristaproto.Message): + value: "DeviceDecommissioningConfig" = aristaproto.message_field(1) + """ + Value carries all the values given in the DeviceDecommissioningConfigSetRequest as well + as any server-generated values. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the (UTC) timestamp at which the system recognizes the + creation. The only guarantees made about this timestamp are: + + - it is after the time the request was received + - a time-ranged query with StartTime==CreatedAt will include this instance. + """ + + +@dataclass(eq=False, repr=False) +class DeviceDecommissioningConfigSetSomeRequest(aristaproto.Message): + values: List["DeviceDecommissioningConfig"] = aristaproto.message_field(1) + """ + value contains a list of DeviceDecommissioningConfig values to write. + It is possible to provide more values than can fit within either: + - the maxiumum send size of the client + - the maximum receive size of the server + If this error occurs you must reduce the number of values sent. + See gRPC "maximum message size" documentation for more information. + """ + + +@dataclass(eq=False, repr=False) +class DeviceDecommissioningConfigSetSomeResponse(aristaproto.Message): + key: "UuidKey" = aristaproto.message_field(1) + error: str = aristaproto.string_field(2) + + +@dataclass(eq=False, repr=False) +class DeviceDecommissioningConfigDeleteRequest(aristaproto.Message): + key: "UuidKey" = aristaproto.message_field(1) + """ + Key indicates which DeviceDecommissioningConfig instance to remove. + This field must always be set. + """ + + +@dataclass(eq=False, repr=False) +class DeviceDecommissioningConfigDeleteResponse(aristaproto.Message): + key: "UuidKey" = aristaproto.message_field(1) + """ + Key echoes back the key of the deleted DeviceDecommissioningConfig instance. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the (UTC) timestamp at which the system recognizes the + deletion. The only guarantees made about this timestamp are: + + - it is after the time the request was received + - a time-ranged query with StartTime==DeletedAt will not include this instance. + """ + + +@dataclass(eq=False, repr=False) +class DeviceDecommissioningConfigDeleteSomeRequest(aristaproto.Message): + keys: List["UuidKey"] = aristaproto.message_field(1) + """key contains a list of DeviceDecommissioningConfig keys to delete""" + + +@dataclass(eq=False, repr=False) +class DeviceDecommissioningConfigDeleteSomeResponse(aristaproto.Message): + """ + DeviceDecommissioningConfigDeleteSomeResponse is only sent when there is an error. + """ + + key: "UuidKey" = aristaproto.message_field(1) + error: str = aristaproto.string_field(2) + + +@dataclass(eq=False, repr=False) +class DeviceDecommissioningConfigDeleteAllRequest(aristaproto.Message): + partial_eq_filter: List["DeviceDecommissioningConfig"] = aristaproto.message_field( + 1 + ) + """ + PartialEqFilter provides a way to server-side filter a DeleteAll. + This requires all provided fields to be equal to the response. + A filtered DeleteAll will use GetAll with filter to find things to delete. + """ + + +@dataclass(eq=False, repr=False) +class DeviceDecommissioningConfigDeleteAllResponse(aristaproto.Message): + type: "___fmp__.DeleteError" = aristaproto.enum_field(1) + """ + This describes the class of delete error. + A DeleteAllResponse is only sent when there is an error. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """This indicates the error message from the delete failure.""" + + key: "UuidKey" = aristaproto.message_field(3) + """ + This is the key of the DeviceDecommissioningConfig instance that failed to be deleted. + """ + + time: datetime = aristaproto.message_field(4) + """Time indicates the (UTC) timestamp when the key was being deleted.""" + + +@dataclass(eq=False, repr=False) +class DeviceOnboardingRequest(aristaproto.Message): + key: "UuidKey" = aristaproto.message_field(1) + """ + Key uniquely identifies a DeviceOnboarding instance to retrieve. + This value must be populated. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class DeviceOnboardingResponse(aristaproto.Message): + value: "DeviceOnboarding" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time carries the (UTC) timestamp of the last-modification of the + DeviceOnboarding instance in this response. + """ + + +@dataclass(eq=False, repr=False) +class DeviceOnboardingSomeRequest(aristaproto.Message): + keys: List["UuidKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class DeviceOnboardingSomeResponse(aristaproto.Message): + value: "DeviceOnboarding" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + +@dataclass(eq=False, repr=False) +class DeviceOnboardingStreamRequest(aristaproto.Message): + partial_eq_filter: List["DeviceOnboarding"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each DeviceOnboarding at end. + * Each DeviceOnboarding response is fully-specified (all fields set). + * start: Returns the state of each DeviceOnboarding at start, followed by updates until now. + * Each DeviceOnboarding response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each DeviceOnboarding at start, followed by updates + until end. + * Each DeviceOnboarding response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + +@dataclass(eq=False, repr=False) +class DeviceOnboardingStreamResponse(aristaproto.Message): + value: "DeviceOnboarding" = aristaproto.message_field(1) + """ + Value is a value deemed relevant to the initiating request. + This structure will always have its key-field populated. Which other fields are + populated, and why, depends on the value of Operation and what triggered this notification. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time holds the timestamp of this DeviceOnboarding's last modification. + """ + + type: "__subscriptions__.Operation" = aristaproto.enum_field(3) + """ + Operation indicates how the DeviceOnboarding value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + +@dataclass(eq=False, repr=False) +class DeviceOnboardingBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["DeviceOnboarding"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each DeviceOnboarding at end. + * Each DeviceOnboarding response is fully-specified (all fields set). + * start: Returns the state of each DeviceOnboarding at start, followed by updates until now. + * Each DeviceOnboarding response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each DeviceOnboarding at start, followed by updates + until end. + * Each DeviceOnboarding response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class DeviceOnboardingBatchedStreamResponse(aristaproto.Message): + responses: List["DeviceOnboardingStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + +@dataclass(eq=False, repr=False) +class DeviceOnboardingConfigRequest(aristaproto.Message): + key: "UuidKey" = aristaproto.message_field(1) + """ + Key uniquely identifies a DeviceOnboardingConfig instance to retrieve. + This value must be populated. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class DeviceOnboardingConfigResponse(aristaproto.Message): + value: "DeviceOnboardingConfig" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time carries the (UTC) timestamp of the last-modification of the + DeviceOnboardingConfig instance in this response. + """ + + +@dataclass(eq=False, repr=False) +class DeviceOnboardingConfigSomeRequest(aristaproto.Message): + keys: List["UuidKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class DeviceOnboardingConfigSomeResponse(aristaproto.Message): + value: "DeviceOnboardingConfig" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + +@dataclass(eq=False, repr=False) +class DeviceOnboardingConfigStreamRequest(aristaproto.Message): + partial_eq_filter: List["DeviceOnboardingConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each DeviceOnboardingConfig at end. + * Each DeviceOnboardingConfig response is fully-specified (all fields set). + * start: Returns the state of each DeviceOnboardingConfig at start, followed by updates until now. + * Each DeviceOnboardingConfig response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each DeviceOnboardingConfig at start, followed by updates + until end. + * Each DeviceOnboardingConfig response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + +@dataclass(eq=False, repr=False) +class DeviceOnboardingConfigStreamResponse(aristaproto.Message): + value: "DeviceOnboardingConfig" = aristaproto.message_field(1) + """ + Value is a value deemed relevant to the initiating request. + This structure will always have its key-field populated. Which other fields are + populated, and why, depends on the value of Operation and what triggered this notification. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time holds the timestamp of this DeviceOnboardingConfig's last modification. + """ + + type: "__subscriptions__.Operation" = aristaproto.enum_field(3) + """ + Operation indicates how the DeviceOnboardingConfig value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + +@dataclass(eq=False, repr=False) +class DeviceOnboardingConfigBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["DeviceOnboardingConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each DeviceOnboardingConfig at end. + * Each DeviceOnboardingConfig response is fully-specified (all fields set). + * start: Returns the state of each DeviceOnboardingConfig at start, followed by updates until now. + * Each DeviceOnboardingConfig response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each DeviceOnboardingConfig at start, followed by updates + until end. + * Each DeviceOnboardingConfig response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class DeviceOnboardingConfigBatchedStreamResponse(aristaproto.Message): + responses: List["DeviceOnboardingConfigStreamResponse"] = aristaproto.message_field( + 1 + ) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + +@dataclass(eq=False, repr=False) +class DeviceOnboardingConfigSetRequest(aristaproto.Message): + value: "DeviceOnboardingConfig" = aristaproto.message_field(1) + """ + DeviceOnboardingConfig carries the value to set into the datastore. + See the documentation on the DeviceOnboardingConfig struct for which fields are required. + """ + + +@dataclass(eq=False, repr=False) +class DeviceOnboardingConfigSetResponse(aristaproto.Message): + value: "DeviceOnboardingConfig" = aristaproto.message_field(1) + """ + Value carries all the values given in the DeviceOnboardingConfigSetRequest as well + as any server-generated values. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the (UTC) timestamp at which the system recognizes the + creation. The only guarantees made about this timestamp are: + + - it is after the time the request was received + - a time-ranged query with StartTime==CreatedAt will include this instance. + """ + + +@dataclass(eq=False, repr=False) +class DeviceOnboardingConfigSetSomeRequest(aristaproto.Message): + values: List["DeviceOnboardingConfig"] = aristaproto.message_field(1) + """ + value contains a list of DeviceOnboardingConfig values to write. + It is possible to provide more values than can fit within either: + - the maxiumum send size of the client + - the maximum receive size of the server + If this error occurs you must reduce the number of values sent. + See gRPC "maximum message size" documentation for more information. + """ + + +@dataclass(eq=False, repr=False) +class DeviceOnboardingConfigSetSomeResponse(aristaproto.Message): + key: "UuidKey" = aristaproto.message_field(1) + error: str = aristaproto.string_field(2) + + +@dataclass(eq=False, repr=False) +class DeviceOnboardingConfigDeleteRequest(aristaproto.Message): + key: "UuidKey" = aristaproto.message_field(1) + """ + Key indicates which DeviceOnboardingConfig instance to remove. + This field must always be set. + """ + + +@dataclass(eq=False, repr=False) +class DeviceOnboardingConfigDeleteResponse(aristaproto.Message): + key: "UuidKey" = aristaproto.message_field(1) + """ + Key echoes back the key of the deleted DeviceOnboardingConfig instance. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the (UTC) timestamp at which the system recognizes the + deletion. The only guarantees made about this timestamp are: + + - it is after the time the request was received + - a time-ranged query with StartTime==DeletedAt will not include this instance. + """ + + +@dataclass(eq=False, repr=False) +class DeviceOnboardingConfigDeleteSomeRequest(aristaproto.Message): + keys: List["UuidKey"] = aristaproto.message_field(1) + """key contains a list of DeviceOnboardingConfig keys to delete""" + + +@dataclass(eq=False, repr=False) +class DeviceOnboardingConfigDeleteSomeResponse(aristaproto.Message): + """ + DeviceOnboardingConfigDeleteSomeResponse is only sent when there is an error. + """ + + key: "UuidKey" = aristaproto.message_field(1) + error: str = aristaproto.string_field(2) + + +@dataclass(eq=False, repr=False) +class DeviceOnboardingConfigDeleteAllRequest(aristaproto.Message): + partial_eq_filter: List["DeviceOnboardingConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a DeleteAll. + This requires all provided fields to be equal to the response. + A filtered DeleteAll will use GetAll with filter to find things to delete. + """ + + +@dataclass(eq=False, repr=False) +class DeviceOnboardingConfigDeleteAllResponse(aristaproto.Message): + type: "___fmp__.DeleteError" = aristaproto.enum_field(1) + """ + This describes the class of delete error. + A DeleteAllResponse is only sent when there is an error. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """This indicates the error message from the delete failure.""" + + key: "UuidKey" = aristaproto.message_field(3) + """ + This is the key of the DeviceOnboardingConfig instance that failed to be deleted. + """ + + time: datetime = aristaproto.message_field(4) + """Time indicates the (UTC) timestamp when the key was being deleted.""" + + +@dataclass(eq=False, repr=False) +class ProvisionedDeviceRequest(aristaproto.Message): + key: "DeviceKey" = aristaproto.message_field(1) + """ + Key uniquely identifies a ProvisionedDevice instance to retrieve. + This value must be populated. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class ProvisionedDeviceResponse(aristaproto.Message): + value: "ProvisionedDevice" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time carries the (UTC) timestamp of the last-modification of the + ProvisionedDevice instance in this response. + """ + + +@dataclass(eq=False, repr=False) +class ProvisionedDeviceSomeRequest(aristaproto.Message): + keys: List["DeviceKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class ProvisionedDeviceSomeResponse(aristaproto.Message): + value: "ProvisionedDevice" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + +@dataclass(eq=False, repr=False) +class ProvisionedDeviceStreamRequest(aristaproto.Message): + partial_eq_filter: List["ProvisionedDevice"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each ProvisionedDevice at end. + * Each ProvisionedDevice response is fully-specified (all fields set). + * start: Returns the state of each ProvisionedDevice at start, followed by updates until now. + * Each ProvisionedDevice response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each ProvisionedDevice at start, followed by updates + until end. + * Each ProvisionedDevice response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + +@dataclass(eq=False, repr=False) +class ProvisionedDeviceStreamResponse(aristaproto.Message): + value: "ProvisionedDevice" = aristaproto.message_field(1) + """ + Value is a value deemed relevant to the initiating request. + This structure will always have its key-field populated. Which other fields are + populated, and why, depends on the value of Operation and what triggered this notification. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time holds the timestamp of this ProvisionedDevice's last modification. + """ + + type: "__subscriptions__.Operation" = aristaproto.enum_field(3) + """ + Operation indicates how the ProvisionedDevice value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + +@dataclass(eq=False, repr=False) +class ProvisionedDeviceBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["ProvisionedDevice"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each ProvisionedDevice at end. + * Each ProvisionedDevice response is fully-specified (all fields set). + * start: Returns the state of each ProvisionedDevice at start, followed by updates until now. + * Each ProvisionedDevice response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each ProvisionedDevice at start, followed by updates + until end. + * Each ProvisionedDevice response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class ProvisionedDeviceBatchedStreamResponse(aristaproto.Message): + responses: List["ProvisionedDeviceStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + +class DeviceServiceStub(aristaproto.ServiceStub): + async def get_one( + self, + device_request: "DeviceRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "DeviceResponse": + return await self._unary_unary( + "/arista.inventory.v1.DeviceService/GetOne", + device_request, + DeviceResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def get_some( + self, + device_some_request: "DeviceSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DeviceSomeResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.DeviceService/GetSome", + device_some_request, + DeviceSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all( + self, + device_stream_request: "DeviceStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DeviceStreamResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.DeviceService/GetAll", + device_stream_request, + DeviceStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe( + self, + device_stream_request: "DeviceStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DeviceStreamResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.DeviceService/Subscribe", + device_stream_request, + DeviceStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_meta( + self, + device_stream_request: "DeviceStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.inventory.v1.DeviceService/GetMeta", + device_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + device_stream_request: "DeviceStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.DeviceService/SubscribeMeta", + device_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all_batched( + self, + device_batched_stream_request: "DeviceBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DeviceBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.DeviceService/GetAllBatched", + device_batched_stream_request, + DeviceBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + device_batched_stream_request: "DeviceBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DeviceBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.DeviceService/SubscribeBatched", + device_batched_stream_request, + DeviceBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + +class DeviceDecommissioningServiceStub(aristaproto.ServiceStub): + async def get_one( + self, + device_decommissioning_request: "DeviceDecommissioningRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "DeviceDecommissioningResponse": + return await self._unary_unary( + "/arista.inventory.v1.DeviceDecommissioningService/GetOne", + device_decommissioning_request, + DeviceDecommissioningResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def get_some( + self, + device_decommissioning_some_request: "DeviceDecommissioningSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DeviceDecommissioningSomeResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.DeviceDecommissioningService/GetSome", + device_decommissioning_some_request, + DeviceDecommissioningSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all( + self, + device_decommissioning_stream_request: "DeviceDecommissioningStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DeviceDecommissioningStreamResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.DeviceDecommissioningService/GetAll", + device_decommissioning_stream_request, + DeviceDecommissioningStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe( + self, + device_decommissioning_stream_request: "DeviceDecommissioningStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DeviceDecommissioningStreamResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.DeviceDecommissioningService/Subscribe", + device_decommissioning_stream_request, + DeviceDecommissioningStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_meta( + self, + device_decommissioning_stream_request: "DeviceDecommissioningStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.inventory.v1.DeviceDecommissioningService/GetMeta", + device_decommissioning_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + device_decommissioning_stream_request: "DeviceDecommissioningStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.DeviceDecommissioningService/SubscribeMeta", + device_decommissioning_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all_batched( + self, + device_decommissioning_batched_stream_request: "DeviceDecommissioningBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DeviceDecommissioningBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.DeviceDecommissioningService/GetAllBatched", + device_decommissioning_batched_stream_request, + DeviceDecommissioningBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + device_decommissioning_batched_stream_request: "DeviceDecommissioningBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DeviceDecommissioningBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.DeviceDecommissioningService/SubscribeBatched", + device_decommissioning_batched_stream_request, + DeviceDecommissioningBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + +class DeviceDecommissioningConfigServiceStub(aristaproto.ServiceStub): + async def get_one( + self, + device_decommissioning_config_request: "DeviceDecommissioningConfigRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "DeviceDecommissioningConfigResponse": + return await self._unary_unary( + "/arista.inventory.v1.DeviceDecommissioningConfigService/GetOne", + device_decommissioning_config_request, + DeviceDecommissioningConfigResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def get_some( + self, + device_decommissioning_config_some_request: "DeviceDecommissioningConfigSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DeviceDecommissioningConfigSomeResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.DeviceDecommissioningConfigService/GetSome", + device_decommissioning_config_some_request, + DeviceDecommissioningConfigSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all( + self, + device_decommissioning_config_stream_request: "DeviceDecommissioningConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DeviceDecommissioningConfigStreamResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.DeviceDecommissioningConfigService/GetAll", + device_decommissioning_config_stream_request, + DeviceDecommissioningConfigStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe( + self, + device_decommissioning_config_stream_request: "DeviceDecommissioningConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DeviceDecommissioningConfigStreamResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.DeviceDecommissioningConfigService/Subscribe", + device_decommissioning_config_stream_request, + DeviceDecommissioningConfigStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_meta( + self, + device_decommissioning_config_stream_request: "DeviceDecommissioningConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.inventory.v1.DeviceDecommissioningConfigService/GetMeta", + device_decommissioning_config_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + device_decommissioning_config_stream_request: "DeviceDecommissioningConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.DeviceDecommissioningConfigService/SubscribeMeta", + device_decommissioning_config_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def set( + self, + device_decommissioning_config_set_request: "DeviceDecommissioningConfigSetRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "DeviceDecommissioningConfigSetResponse": + return await self._unary_unary( + "/arista.inventory.v1.DeviceDecommissioningConfigService/Set", + device_decommissioning_config_set_request, + DeviceDecommissioningConfigSetResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def set_some( + self, + device_decommissioning_config_set_some_request: "DeviceDecommissioningConfigSetSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DeviceDecommissioningConfigSetSomeResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.DeviceDecommissioningConfigService/SetSome", + device_decommissioning_config_set_some_request, + DeviceDecommissioningConfigSetSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def delete( + self, + device_decommissioning_config_delete_request: "DeviceDecommissioningConfigDeleteRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "DeviceDecommissioningConfigDeleteResponse": + return await self._unary_unary( + "/arista.inventory.v1.DeviceDecommissioningConfigService/Delete", + device_decommissioning_config_delete_request, + DeviceDecommissioningConfigDeleteResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def delete_some( + self, + device_decommissioning_config_delete_some_request: "DeviceDecommissioningConfigDeleteSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DeviceDecommissioningConfigDeleteSomeResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.DeviceDecommissioningConfigService/DeleteSome", + device_decommissioning_config_delete_some_request, + DeviceDecommissioningConfigDeleteSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def delete_all( + self, + device_decommissioning_config_delete_all_request: "DeviceDecommissioningConfigDeleteAllRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DeviceDecommissioningConfigDeleteAllResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.DeviceDecommissioningConfigService/DeleteAll", + device_decommissioning_config_delete_all_request, + DeviceDecommissioningConfigDeleteAllResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all_batched( + self, + device_decommissioning_config_batched_stream_request: "DeviceDecommissioningConfigBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DeviceDecommissioningConfigBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.DeviceDecommissioningConfigService/GetAllBatched", + device_decommissioning_config_batched_stream_request, + DeviceDecommissioningConfigBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + device_decommissioning_config_batched_stream_request: "DeviceDecommissioningConfigBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DeviceDecommissioningConfigBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.DeviceDecommissioningConfigService/SubscribeBatched", + device_decommissioning_config_batched_stream_request, + DeviceDecommissioningConfigBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + +class DeviceOnboardingServiceStub(aristaproto.ServiceStub): + async def get_one( + self, + device_onboarding_request: "DeviceOnboardingRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "DeviceOnboardingResponse": + return await self._unary_unary( + "/arista.inventory.v1.DeviceOnboardingService/GetOne", + device_onboarding_request, + DeviceOnboardingResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def get_some( + self, + device_onboarding_some_request: "DeviceOnboardingSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DeviceOnboardingSomeResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.DeviceOnboardingService/GetSome", + device_onboarding_some_request, + DeviceOnboardingSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all( + self, + device_onboarding_stream_request: "DeviceOnboardingStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DeviceOnboardingStreamResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.DeviceOnboardingService/GetAll", + device_onboarding_stream_request, + DeviceOnboardingStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe( + self, + device_onboarding_stream_request: "DeviceOnboardingStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DeviceOnboardingStreamResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.DeviceOnboardingService/Subscribe", + device_onboarding_stream_request, + DeviceOnboardingStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_meta( + self, + device_onboarding_stream_request: "DeviceOnboardingStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.inventory.v1.DeviceOnboardingService/GetMeta", + device_onboarding_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + device_onboarding_stream_request: "DeviceOnboardingStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.DeviceOnboardingService/SubscribeMeta", + device_onboarding_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all_batched( + self, + device_onboarding_batched_stream_request: "DeviceOnboardingBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DeviceOnboardingBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.DeviceOnboardingService/GetAllBatched", + device_onboarding_batched_stream_request, + DeviceOnboardingBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + device_onboarding_batched_stream_request: "DeviceOnboardingBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DeviceOnboardingBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.DeviceOnboardingService/SubscribeBatched", + device_onboarding_batched_stream_request, + DeviceOnboardingBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + +class DeviceOnboardingConfigServiceStub(aristaproto.ServiceStub): + async def get_one( + self, + device_onboarding_config_request: "DeviceOnboardingConfigRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "DeviceOnboardingConfigResponse": + return await self._unary_unary( + "/arista.inventory.v1.DeviceOnboardingConfigService/GetOne", + device_onboarding_config_request, + DeviceOnboardingConfigResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def get_some( + self, + device_onboarding_config_some_request: "DeviceOnboardingConfigSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DeviceOnboardingConfigSomeResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.DeviceOnboardingConfigService/GetSome", + device_onboarding_config_some_request, + DeviceOnboardingConfigSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all( + self, + device_onboarding_config_stream_request: "DeviceOnboardingConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DeviceOnboardingConfigStreamResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.DeviceOnboardingConfigService/GetAll", + device_onboarding_config_stream_request, + DeviceOnboardingConfigStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe( + self, + device_onboarding_config_stream_request: "DeviceOnboardingConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DeviceOnboardingConfigStreamResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.DeviceOnboardingConfigService/Subscribe", + device_onboarding_config_stream_request, + DeviceOnboardingConfigStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_meta( + self, + device_onboarding_config_stream_request: "DeviceOnboardingConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.inventory.v1.DeviceOnboardingConfigService/GetMeta", + device_onboarding_config_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + device_onboarding_config_stream_request: "DeviceOnboardingConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.DeviceOnboardingConfigService/SubscribeMeta", + device_onboarding_config_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def set( + self, + device_onboarding_config_set_request: "DeviceOnboardingConfigSetRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "DeviceOnboardingConfigSetResponse": + return await self._unary_unary( + "/arista.inventory.v1.DeviceOnboardingConfigService/Set", + device_onboarding_config_set_request, + DeviceOnboardingConfigSetResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def set_some( + self, + device_onboarding_config_set_some_request: "DeviceOnboardingConfigSetSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DeviceOnboardingConfigSetSomeResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.DeviceOnboardingConfigService/SetSome", + device_onboarding_config_set_some_request, + DeviceOnboardingConfigSetSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def delete( + self, + device_onboarding_config_delete_request: "DeviceOnboardingConfigDeleteRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "DeviceOnboardingConfigDeleteResponse": + return await self._unary_unary( + "/arista.inventory.v1.DeviceOnboardingConfigService/Delete", + device_onboarding_config_delete_request, + DeviceOnboardingConfigDeleteResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def delete_some( + self, + device_onboarding_config_delete_some_request: "DeviceOnboardingConfigDeleteSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DeviceOnboardingConfigDeleteSomeResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.DeviceOnboardingConfigService/DeleteSome", + device_onboarding_config_delete_some_request, + DeviceOnboardingConfigDeleteSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def delete_all( + self, + device_onboarding_config_delete_all_request: "DeviceOnboardingConfigDeleteAllRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DeviceOnboardingConfigDeleteAllResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.DeviceOnboardingConfigService/DeleteAll", + device_onboarding_config_delete_all_request, + DeviceOnboardingConfigDeleteAllResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all_batched( + self, + device_onboarding_config_batched_stream_request: "DeviceOnboardingConfigBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DeviceOnboardingConfigBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.DeviceOnboardingConfigService/GetAllBatched", + device_onboarding_config_batched_stream_request, + DeviceOnboardingConfigBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + device_onboarding_config_batched_stream_request: "DeviceOnboardingConfigBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["DeviceOnboardingConfigBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.DeviceOnboardingConfigService/SubscribeBatched", + device_onboarding_config_batched_stream_request, + DeviceOnboardingConfigBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + +class ProvisionedDeviceServiceStub(aristaproto.ServiceStub): + async def get_one( + self, + provisioned_device_request: "ProvisionedDeviceRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "ProvisionedDeviceResponse": + return await self._unary_unary( + "/arista.inventory.v1.ProvisionedDeviceService/GetOne", + provisioned_device_request, + ProvisionedDeviceResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def get_some( + self, + provisioned_device_some_request: "ProvisionedDeviceSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ProvisionedDeviceSomeResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.ProvisionedDeviceService/GetSome", + provisioned_device_some_request, + ProvisionedDeviceSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all( + self, + provisioned_device_stream_request: "ProvisionedDeviceStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ProvisionedDeviceStreamResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.ProvisionedDeviceService/GetAll", + provisioned_device_stream_request, + ProvisionedDeviceStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe( + self, + provisioned_device_stream_request: "ProvisionedDeviceStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ProvisionedDeviceStreamResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.ProvisionedDeviceService/Subscribe", + provisioned_device_stream_request, + ProvisionedDeviceStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_meta( + self, + provisioned_device_stream_request: "ProvisionedDeviceStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.inventory.v1.ProvisionedDeviceService/GetMeta", + provisioned_device_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + provisioned_device_stream_request: "ProvisionedDeviceStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.ProvisionedDeviceService/SubscribeMeta", + provisioned_device_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all_batched( + self, + provisioned_device_batched_stream_request: "ProvisionedDeviceBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ProvisionedDeviceBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.ProvisionedDeviceService/GetAllBatched", + provisioned_device_batched_stream_request, + ProvisionedDeviceBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + provisioned_device_batched_stream_request: "ProvisionedDeviceBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["ProvisionedDeviceBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.inventory.v1.ProvisionedDeviceService/SubscribeBatched", + provisioned_device_batched_stream_request, + ProvisionedDeviceBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + +class DeviceServiceBase(ServiceBase): + + async def get_one(self, device_request: "DeviceRequest") -> "DeviceResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_some( + self, device_some_request: "DeviceSomeRequest" + ) -> AsyncIterator["DeviceSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all( + self, device_stream_request: "DeviceStreamRequest" + ) -> AsyncIterator["DeviceStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe( + self, device_stream_request: "DeviceStreamRequest" + ) -> AsyncIterator["DeviceStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_meta( + self, device_stream_request: "DeviceStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, device_stream_request: "DeviceStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all_batched( + self, device_batched_stream_request: "DeviceBatchedStreamRequest" + ) -> AsyncIterator["DeviceBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, device_batched_stream_request: "DeviceBatchedStreamRequest" + ) -> AsyncIterator["DeviceBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def __rpc_get_one( + self, stream: "grpclib.server.Stream[DeviceRequest, DeviceResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_one(request) + await stream.send_message(response) + + async def __rpc_get_some( + self, stream: "grpclib.server.Stream[DeviceSomeRequest, DeviceSomeResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + + async def __rpc_get_all( + self, stream: "grpclib.server.Stream[DeviceStreamRequest, DeviceStreamResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all, + stream, + request, + ) + + async def __rpc_subscribe( + self, stream: "grpclib.server.Stream[DeviceStreamRequest, DeviceStreamResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe, + stream, + request, + ) + + async def __rpc_get_meta( + self, stream: "grpclib.server.Stream[DeviceStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, stream: "grpclib.server.Stream[DeviceStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[DeviceBatchedStreamRequest, DeviceBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[DeviceBatchedStreamRequest, DeviceBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: + return { + "/arista.inventory.v1.DeviceService/GetOne": grpclib.const.Handler( + self.__rpc_get_one, + grpclib.const.Cardinality.UNARY_UNARY, + DeviceRequest, + DeviceResponse, + ), + "/arista.inventory.v1.DeviceService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + DeviceSomeRequest, + DeviceSomeResponse, + ), + "/arista.inventory.v1.DeviceService/GetAll": grpclib.const.Handler( + self.__rpc_get_all, + grpclib.const.Cardinality.UNARY_STREAM, + DeviceStreamRequest, + DeviceStreamResponse, + ), + "/arista.inventory.v1.DeviceService/Subscribe": grpclib.const.Handler( + self.__rpc_subscribe, + grpclib.const.Cardinality.UNARY_STREAM, + DeviceStreamRequest, + DeviceStreamResponse, + ), + "/arista.inventory.v1.DeviceService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + DeviceStreamRequest, + MetaResponse, + ), + "/arista.inventory.v1.DeviceService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + DeviceStreamRequest, + MetaResponse, + ), + "/arista.inventory.v1.DeviceService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + DeviceBatchedStreamRequest, + DeviceBatchedStreamResponse, + ), + "/arista.inventory.v1.DeviceService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + DeviceBatchedStreamRequest, + DeviceBatchedStreamResponse, + ), + } + + +class DeviceDecommissioningServiceBase(ServiceBase): + + async def get_one( + self, device_decommissioning_request: "DeviceDecommissioningRequest" + ) -> "DeviceDecommissioningResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_some( + self, device_decommissioning_some_request: "DeviceDecommissioningSomeRequest" + ) -> AsyncIterator["DeviceDecommissioningSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all( + self, + device_decommissioning_stream_request: "DeviceDecommissioningStreamRequest", + ) -> AsyncIterator["DeviceDecommissioningStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe( + self, + device_decommissioning_stream_request: "DeviceDecommissioningStreamRequest", + ) -> AsyncIterator["DeviceDecommissioningStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_meta( + self, + device_decommissioning_stream_request: "DeviceDecommissioningStreamRequest", + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, + device_decommissioning_stream_request: "DeviceDecommissioningStreamRequest", + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all_batched( + self, + device_decommissioning_batched_stream_request: "DeviceDecommissioningBatchedStreamRequest", + ) -> AsyncIterator["DeviceDecommissioningBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, + device_decommissioning_batched_stream_request: "DeviceDecommissioningBatchedStreamRequest", + ) -> AsyncIterator["DeviceDecommissioningBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def __rpc_get_one( + self, + stream: "grpclib.server.Stream[DeviceDecommissioningRequest, DeviceDecommissioningResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.get_one(request) + await stream.send_message(response) + + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[DeviceDecommissioningSomeRequest, DeviceDecommissioningSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + + async def __rpc_get_all( + self, + stream: "grpclib.server.Stream[DeviceDecommissioningStreamRequest, DeviceDecommissioningStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all, + stream, + request, + ) + + async def __rpc_subscribe( + self, + stream: "grpclib.server.Stream[DeviceDecommissioningStreamRequest, DeviceDecommissioningStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe, + stream, + request, + ) + + async def __rpc_get_meta( + self, + stream: "grpclib.server.Stream[DeviceDecommissioningStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, + stream: "grpclib.server.Stream[DeviceDecommissioningStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[DeviceDecommissioningBatchedStreamRequest, DeviceDecommissioningBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[DeviceDecommissioningBatchedStreamRequest, DeviceDecommissioningBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: + return { + "/arista.inventory.v1.DeviceDecommissioningService/GetOne": grpclib.const.Handler( + self.__rpc_get_one, + grpclib.const.Cardinality.UNARY_UNARY, + DeviceDecommissioningRequest, + DeviceDecommissioningResponse, + ), + "/arista.inventory.v1.DeviceDecommissioningService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + DeviceDecommissioningSomeRequest, + DeviceDecommissioningSomeResponse, + ), + "/arista.inventory.v1.DeviceDecommissioningService/GetAll": grpclib.const.Handler( + self.__rpc_get_all, + grpclib.const.Cardinality.UNARY_STREAM, + DeviceDecommissioningStreamRequest, + DeviceDecommissioningStreamResponse, + ), + "/arista.inventory.v1.DeviceDecommissioningService/Subscribe": grpclib.const.Handler( + self.__rpc_subscribe, + grpclib.const.Cardinality.UNARY_STREAM, + DeviceDecommissioningStreamRequest, + DeviceDecommissioningStreamResponse, + ), + "/arista.inventory.v1.DeviceDecommissioningService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + DeviceDecommissioningStreamRequest, + MetaResponse, + ), + "/arista.inventory.v1.DeviceDecommissioningService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + DeviceDecommissioningStreamRequest, + MetaResponse, + ), + "/arista.inventory.v1.DeviceDecommissioningService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + DeviceDecommissioningBatchedStreamRequest, + DeviceDecommissioningBatchedStreamResponse, + ), + "/arista.inventory.v1.DeviceDecommissioningService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + DeviceDecommissioningBatchedStreamRequest, + DeviceDecommissioningBatchedStreamResponse, + ), + } + + +class DeviceDecommissioningConfigServiceBase(ServiceBase): + + async def get_one( + self, + device_decommissioning_config_request: "DeviceDecommissioningConfigRequest", + ) -> "DeviceDecommissioningConfigResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_some( + self, + device_decommissioning_config_some_request: "DeviceDecommissioningConfigSomeRequest", + ) -> AsyncIterator["DeviceDecommissioningConfigSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all( + self, + device_decommissioning_config_stream_request: "DeviceDecommissioningConfigStreamRequest", + ) -> AsyncIterator["DeviceDecommissioningConfigStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe( + self, + device_decommissioning_config_stream_request: "DeviceDecommissioningConfigStreamRequest", + ) -> AsyncIterator["DeviceDecommissioningConfigStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_meta( + self, + device_decommissioning_config_stream_request: "DeviceDecommissioningConfigStreamRequest", + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, + device_decommissioning_config_stream_request: "DeviceDecommissioningConfigStreamRequest", + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def set( + self, + device_decommissioning_config_set_request: "DeviceDecommissioningConfigSetRequest", + ) -> "DeviceDecommissioningConfigSetResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def set_some( + self, + device_decommissioning_config_set_some_request: "DeviceDecommissioningConfigSetSomeRequest", + ) -> AsyncIterator["DeviceDecommissioningConfigSetSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def delete( + self, + device_decommissioning_config_delete_request: "DeviceDecommissioningConfigDeleteRequest", + ) -> "DeviceDecommissioningConfigDeleteResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def delete_some( + self, + device_decommissioning_config_delete_some_request: "DeviceDecommissioningConfigDeleteSomeRequest", + ) -> AsyncIterator["DeviceDecommissioningConfigDeleteSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def delete_all( + self, + device_decommissioning_config_delete_all_request: "DeviceDecommissioningConfigDeleteAllRequest", + ) -> AsyncIterator["DeviceDecommissioningConfigDeleteAllResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all_batched( + self, + device_decommissioning_config_batched_stream_request: "DeviceDecommissioningConfigBatchedStreamRequest", + ) -> AsyncIterator["DeviceDecommissioningConfigBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, + device_decommissioning_config_batched_stream_request: "DeviceDecommissioningConfigBatchedStreamRequest", + ) -> AsyncIterator["DeviceDecommissioningConfigBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def __rpc_get_one( + self, + stream: "grpclib.server.Stream[DeviceDecommissioningConfigRequest, DeviceDecommissioningConfigResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.get_one(request) + await stream.send_message(response) + + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[DeviceDecommissioningConfigSomeRequest, DeviceDecommissioningConfigSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + + async def __rpc_get_all( + self, + stream: "grpclib.server.Stream[DeviceDecommissioningConfigStreamRequest, DeviceDecommissioningConfigStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all, + stream, + request, + ) + + async def __rpc_subscribe( + self, + stream: "grpclib.server.Stream[DeviceDecommissioningConfigStreamRequest, DeviceDecommissioningConfigStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe, + stream, + request, + ) + + async def __rpc_get_meta( + self, + stream: "grpclib.server.Stream[DeviceDecommissioningConfigStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, + stream: "grpclib.server.Stream[DeviceDecommissioningConfigStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + + async def __rpc_set( + self, + stream: "grpclib.server.Stream[DeviceDecommissioningConfigSetRequest, DeviceDecommissioningConfigSetResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.set(request) + await stream.send_message(response) + + async def __rpc_set_some( + self, + stream: "grpclib.server.Stream[DeviceDecommissioningConfigSetSomeRequest, DeviceDecommissioningConfigSetSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.set_some, + stream, + request, + ) + + async def __rpc_delete( + self, + stream: "grpclib.server.Stream[DeviceDecommissioningConfigDeleteRequest, DeviceDecommissioningConfigDeleteResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.delete(request) + await stream.send_message(response) + + async def __rpc_delete_some( + self, + stream: "grpclib.server.Stream[DeviceDecommissioningConfigDeleteSomeRequest, DeviceDecommissioningConfigDeleteSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.delete_some, + stream, + request, + ) + + async def __rpc_delete_all( + self, + stream: "grpclib.server.Stream[DeviceDecommissioningConfigDeleteAllRequest, DeviceDecommissioningConfigDeleteAllResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.delete_all, + stream, + request, + ) + + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[DeviceDecommissioningConfigBatchedStreamRequest, DeviceDecommissioningConfigBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[DeviceDecommissioningConfigBatchedStreamRequest, DeviceDecommissioningConfigBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: + return { + "/arista.inventory.v1.DeviceDecommissioningConfigService/GetOne": grpclib.const.Handler( + self.__rpc_get_one, + grpclib.const.Cardinality.UNARY_UNARY, + DeviceDecommissioningConfigRequest, + DeviceDecommissioningConfigResponse, + ), + "/arista.inventory.v1.DeviceDecommissioningConfigService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + DeviceDecommissioningConfigSomeRequest, + DeviceDecommissioningConfigSomeResponse, + ), + "/arista.inventory.v1.DeviceDecommissioningConfigService/GetAll": grpclib.const.Handler( + self.__rpc_get_all, + grpclib.const.Cardinality.UNARY_STREAM, + DeviceDecommissioningConfigStreamRequest, + DeviceDecommissioningConfigStreamResponse, + ), + "/arista.inventory.v1.DeviceDecommissioningConfigService/Subscribe": grpclib.const.Handler( + self.__rpc_subscribe, + grpclib.const.Cardinality.UNARY_STREAM, + DeviceDecommissioningConfigStreamRequest, + DeviceDecommissioningConfigStreamResponse, + ), + "/arista.inventory.v1.DeviceDecommissioningConfigService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + DeviceDecommissioningConfigStreamRequest, + MetaResponse, + ), + "/arista.inventory.v1.DeviceDecommissioningConfigService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + DeviceDecommissioningConfigStreamRequest, + MetaResponse, + ), + "/arista.inventory.v1.DeviceDecommissioningConfigService/Set": grpclib.const.Handler( + self.__rpc_set, + grpclib.const.Cardinality.UNARY_UNARY, + DeviceDecommissioningConfigSetRequest, + DeviceDecommissioningConfigSetResponse, + ), + "/arista.inventory.v1.DeviceDecommissioningConfigService/SetSome": grpclib.const.Handler( + self.__rpc_set_some, + grpclib.const.Cardinality.UNARY_STREAM, + DeviceDecommissioningConfigSetSomeRequest, + DeviceDecommissioningConfigSetSomeResponse, + ), + "/arista.inventory.v1.DeviceDecommissioningConfigService/Delete": grpclib.const.Handler( + self.__rpc_delete, + grpclib.const.Cardinality.UNARY_UNARY, + DeviceDecommissioningConfigDeleteRequest, + DeviceDecommissioningConfigDeleteResponse, + ), + "/arista.inventory.v1.DeviceDecommissioningConfigService/DeleteSome": grpclib.const.Handler( + self.__rpc_delete_some, + grpclib.const.Cardinality.UNARY_STREAM, + DeviceDecommissioningConfigDeleteSomeRequest, + DeviceDecommissioningConfigDeleteSomeResponse, + ), + "/arista.inventory.v1.DeviceDecommissioningConfigService/DeleteAll": grpclib.const.Handler( + self.__rpc_delete_all, + grpclib.const.Cardinality.UNARY_STREAM, + DeviceDecommissioningConfigDeleteAllRequest, + DeviceDecommissioningConfigDeleteAllResponse, + ), + "/arista.inventory.v1.DeviceDecommissioningConfigService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + DeviceDecommissioningConfigBatchedStreamRequest, + DeviceDecommissioningConfigBatchedStreamResponse, + ), + "/arista.inventory.v1.DeviceDecommissioningConfigService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + DeviceDecommissioningConfigBatchedStreamRequest, + DeviceDecommissioningConfigBatchedStreamResponse, + ), + } + + +class DeviceOnboardingServiceBase(ServiceBase): + + async def get_one( + self, device_onboarding_request: "DeviceOnboardingRequest" + ) -> "DeviceOnboardingResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_some( + self, device_onboarding_some_request: "DeviceOnboardingSomeRequest" + ) -> AsyncIterator["DeviceOnboardingSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all( + self, device_onboarding_stream_request: "DeviceOnboardingStreamRequest" + ) -> AsyncIterator["DeviceOnboardingStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe( + self, device_onboarding_stream_request: "DeviceOnboardingStreamRequest" + ) -> AsyncIterator["DeviceOnboardingStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_meta( + self, device_onboarding_stream_request: "DeviceOnboardingStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, device_onboarding_stream_request: "DeviceOnboardingStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all_batched( + self, + device_onboarding_batched_stream_request: "DeviceOnboardingBatchedStreamRequest", + ) -> AsyncIterator["DeviceOnboardingBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, + device_onboarding_batched_stream_request: "DeviceOnboardingBatchedStreamRequest", + ) -> AsyncIterator["DeviceOnboardingBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def __rpc_get_one( + self, + stream: "grpclib.server.Stream[DeviceOnboardingRequest, DeviceOnboardingResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.get_one(request) + await stream.send_message(response) + + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[DeviceOnboardingSomeRequest, DeviceOnboardingSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + + async def __rpc_get_all( + self, + stream: "grpclib.server.Stream[DeviceOnboardingStreamRequest, DeviceOnboardingStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all, + stream, + request, + ) + + async def __rpc_subscribe( + self, + stream: "grpclib.server.Stream[DeviceOnboardingStreamRequest, DeviceOnboardingStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe, + stream, + request, + ) + + async def __rpc_get_meta( + self, + stream: "grpclib.server.Stream[DeviceOnboardingStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, + stream: "grpclib.server.Stream[DeviceOnboardingStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[DeviceOnboardingBatchedStreamRequest, DeviceOnboardingBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[DeviceOnboardingBatchedStreamRequest, DeviceOnboardingBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: + return { + "/arista.inventory.v1.DeviceOnboardingService/GetOne": grpclib.const.Handler( + self.__rpc_get_one, + grpclib.const.Cardinality.UNARY_UNARY, + DeviceOnboardingRequest, + DeviceOnboardingResponse, + ), + "/arista.inventory.v1.DeviceOnboardingService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + DeviceOnboardingSomeRequest, + DeviceOnboardingSomeResponse, + ), + "/arista.inventory.v1.DeviceOnboardingService/GetAll": grpclib.const.Handler( + self.__rpc_get_all, + grpclib.const.Cardinality.UNARY_STREAM, + DeviceOnboardingStreamRequest, + DeviceOnboardingStreamResponse, + ), + "/arista.inventory.v1.DeviceOnboardingService/Subscribe": grpclib.const.Handler( + self.__rpc_subscribe, + grpclib.const.Cardinality.UNARY_STREAM, + DeviceOnboardingStreamRequest, + DeviceOnboardingStreamResponse, + ), + "/arista.inventory.v1.DeviceOnboardingService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + DeviceOnboardingStreamRequest, + MetaResponse, + ), + "/arista.inventory.v1.DeviceOnboardingService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + DeviceOnboardingStreamRequest, + MetaResponse, + ), + "/arista.inventory.v1.DeviceOnboardingService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + DeviceOnboardingBatchedStreamRequest, + DeviceOnboardingBatchedStreamResponse, + ), + "/arista.inventory.v1.DeviceOnboardingService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + DeviceOnboardingBatchedStreamRequest, + DeviceOnboardingBatchedStreamResponse, + ), + } + + +class DeviceOnboardingConfigServiceBase(ServiceBase): + + async def get_one( + self, device_onboarding_config_request: "DeviceOnboardingConfigRequest" + ) -> "DeviceOnboardingConfigResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_some( + self, device_onboarding_config_some_request: "DeviceOnboardingConfigSomeRequest" + ) -> AsyncIterator["DeviceOnboardingConfigSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all( + self, + device_onboarding_config_stream_request: "DeviceOnboardingConfigStreamRequest", + ) -> AsyncIterator["DeviceOnboardingConfigStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe( + self, + device_onboarding_config_stream_request: "DeviceOnboardingConfigStreamRequest", + ) -> AsyncIterator["DeviceOnboardingConfigStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_meta( + self, + device_onboarding_config_stream_request: "DeviceOnboardingConfigStreamRequest", + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, + device_onboarding_config_stream_request: "DeviceOnboardingConfigStreamRequest", + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def set( + self, device_onboarding_config_set_request: "DeviceOnboardingConfigSetRequest" + ) -> "DeviceOnboardingConfigSetResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def set_some( + self, + device_onboarding_config_set_some_request: "DeviceOnboardingConfigSetSomeRequest", + ) -> AsyncIterator["DeviceOnboardingConfigSetSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def delete( + self, + device_onboarding_config_delete_request: "DeviceOnboardingConfigDeleteRequest", + ) -> "DeviceOnboardingConfigDeleteResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def delete_some( + self, + device_onboarding_config_delete_some_request: "DeviceOnboardingConfigDeleteSomeRequest", + ) -> AsyncIterator["DeviceOnboardingConfigDeleteSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def delete_all( + self, + device_onboarding_config_delete_all_request: "DeviceOnboardingConfigDeleteAllRequest", + ) -> AsyncIterator["DeviceOnboardingConfigDeleteAllResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all_batched( + self, + device_onboarding_config_batched_stream_request: "DeviceOnboardingConfigBatchedStreamRequest", + ) -> AsyncIterator["DeviceOnboardingConfigBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, + device_onboarding_config_batched_stream_request: "DeviceOnboardingConfigBatchedStreamRequest", + ) -> AsyncIterator["DeviceOnboardingConfigBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def __rpc_get_one( + self, + stream: "grpclib.server.Stream[DeviceOnboardingConfigRequest, DeviceOnboardingConfigResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.get_one(request) + await stream.send_message(response) + + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[DeviceOnboardingConfigSomeRequest, DeviceOnboardingConfigSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + + async def __rpc_get_all( + self, + stream: "grpclib.server.Stream[DeviceOnboardingConfigStreamRequest, DeviceOnboardingConfigStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all, + stream, + request, + ) + + async def __rpc_subscribe( + self, + stream: "grpclib.server.Stream[DeviceOnboardingConfigStreamRequest, DeviceOnboardingConfigStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe, + stream, + request, + ) + + async def __rpc_get_meta( + self, + stream: "grpclib.server.Stream[DeviceOnboardingConfigStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, + stream: "grpclib.server.Stream[DeviceOnboardingConfigStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + + async def __rpc_set( + self, + stream: "grpclib.server.Stream[DeviceOnboardingConfigSetRequest, DeviceOnboardingConfigSetResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.set(request) + await stream.send_message(response) + + async def __rpc_set_some( + self, + stream: "grpclib.server.Stream[DeviceOnboardingConfigSetSomeRequest, DeviceOnboardingConfigSetSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.set_some, + stream, + request, + ) + + async def __rpc_delete( + self, + stream: "grpclib.server.Stream[DeviceOnboardingConfigDeleteRequest, DeviceOnboardingConfigDeleteResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.delete(request) + await stream.send_message(response) + + async def __rpc_delete_some( + self, + stream: "grpclib.server.Stream[DeviceOnboardingConfigDeleteSomeRequest, DeviceOnboardingConfigDeleteSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.delete_some, + stream, + request, + ) + + async def __rpc_delete_all( + self, + stream: "grpclib.server.Stream[DeviceOnboardingConfigDeleteAllRequest, DeviceOnboardingConfigDeleteAllResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.delete_all, + stream, + request, + ) + + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[DeviceOnboardingConfigBatchedStreamRequest, DeviceOnboardingConfigBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[DeviceOnboardingConfigBatchedStreamRequest, DeviceOnboardingConfigBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: + return { + "/arista.inventory.v1.DeviceOnboardingConfigService/GetOne": grpclib.const.Handler( + self.__rpc_get_one, + grpclib.const.Cardinality.UNARY_UNARY, + DeviceOnboardingConfigRequest, + DeviceOnboardingConfigResponse, + ), + "/arista.inventory.v1.DeviceOnboardingConfigService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + DeviceOnboardingConfigSomeRequest, + DeviceOnboardingConfigSomeResponse, + ), + "/arista.inventory.v1.DeviceOnboardingConfigService/GetAll": grpclib.const.Handler( + self.__rpc_get_all, + grpclib.const.Cardinality.UNARY_STREAM, + DeviceOnboardingConfigStreamRequest, + DeviceOnboardingConfigStreamResponse, + ), + "/arista.inventory.v1.DeviceOnboardingConfigService/Subscribe": grpclib.const.Handler( + self.__rpc_subscribe, + grpclib.const.Cardinality.UNARY_STREAM, + DeviceOnboardingConfigStreamRequest, + DeviceOnboardingConfigStreamResponse, + ), + "/arista.inventory.v1.DeviceOnboardingConfigService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + DeviceOnboardingConfigStreamRequest, + MetaResponse, + ), + "/arista.inventory.v1.DeviceOnboardingConfigService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + DeviceOnboardingConfigStreamRequest, + MetaResponse, + ), + "/arista.inventory.v1.DeviceOnboardingConfigService/Set": grpclib.const.Handler( + self.__rpc_set, + grpclib.const.Cardinality.UNARY_UNARY, + DeviceOnboardingConfigSetRequest, + DeviceOnboardingConfigSetResponse, + ), + "/arista.inventory.v1.DeviceOnboardingConfigService/SetSome": grpclib.const.Handler( + self.__rpc_set_some, + grpclib.const.Cardinality.UNARY_STREAM, + DeviceOnboardingConfigSetSomeRequest, + DeviceOnboardingConfigSetSomeResponse, + ), + "/arista.inventory.v1.DeviceOnboardingConfigService/Delete": grpclib.const.Handler( + self.__rpc_delete, + grpclib.const.Cardinality.UNARY_UNARY, + DeviceOnboardingConfigDeleteRequest, + DeviceOnboardingConfigDeleteResponse, + ), + "/arista.inventory.v1.DeviceOnboardingConfigService/DeleteSome": grpclib.const.Handler( + self.__rpc_delete_some, + grpclib.const.Cardinality.UNARY_STREAM, + DeviceOnboardingConfigDeleteSomeRequest, + DeviceOnboardingConfigDeleteSomeResponse, + ), + "/arista.inventory.v1.DeviceOnboardingConfigService/DeleteAll": grpclib.const.Handler( + self.__rpc_delete_all, + grpclib.const.Cardinality.UNARY_STREAM, + DeviceOnboardingConfigDeleteAllRequest, + DeviceOnboardingConfigDeleteAllResponse, + ), + "/arista.inventory.v1.DeviceOnboardingConfigService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + DeviceOnboardingConfigBatchedStreamRequest, + DeviceOnboardingConfigBatchedStreamResponse, + ), + "/arista.inventory.v1.DeviceOnboardingConfigService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + DeviceOnboardingConfigBatchedStreamRequest, + DeviceOnboardingConfigBatchedStreamResponse, + ), + } + + +class ProvisionedDeviceServiceBase(ServiceBase): + + async def get_one( + self, provisioned_device_request: "ProvisionedDeviceRequest" + ) -> "ProvisionedDeviceResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_some( + self, provisioned_device_some_request: "ProvisionedDeviceSomeRequest" + ) -> AsyncIterator["ProvisionedDeviceSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all( + self, provisioned_device_stream_request: "ProvisionedDeviceStreamRequest" + ) -> AsyncIterator["ProvisionedDeviceStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe( + self, provisioned_device_stream_request: "ProvisionedDeviceStreamRequest" + ) -> AsyncIterator["ProvisionedDeviceStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_meta( + self, provisioned_device_stream_request: "ProvisionedDeviceStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, provisioned_device_stream_request: "ProvisionedDeviceStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all_batched( + self, + provisioned_device_batched_stream_request: "ProvisionedDeviceBatchedStreamRequest", + ) -> AsyncIterator["ProvisionedDeviceBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, + provisioned_device_batched_stream_request: "ProvisionedDeviceBatchedStreamRequest", + ) -> AsyncIterator["ProvisionedDeviceBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def __rpc_get_one( + self, + stream: "grpclib.server.Stream[ProvisionedDeviceRequest, ProvisionedDeviceResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.get_one(request) + await stream.send_message(response) + + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[ProvisionedDeviceSomeRequest, ProvisionedDeviceSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + + async def __rpc_get_all( + self, + stream: "grpclib.server.Stream[ProvisionedDeviceStreamRequest, ProvisionedDeviceStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all, + stream, + request, + ) + + async def __rpc_subscribe( + self, + stream: "grpclib.server.Stream[ProvisionedDeviceStreamRequest, ProvisionedDeviceStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe, + stream, + request, + ) + + async def __rpc_get_meta( + self, + stream: "grpclib.server.Stream[ProvisionedDeviceStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, + stream: "grpclib.server.Stream[ProvisionedDeviceStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[ProvisionedDeviceBatchedStreamRequest, ProvisionedDeviceBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[ProvisionedDeviceBatchedStreamRequest, ProvisionedDeviceBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: + return { + "/arista.inventory.v1.ProvisionedDeviceService/GetOne": grpclib.const.Handler( + self.__rpc_get_one, + grpclib.const.Cardinality.UNARY_UNARY, + ProvisionedDeviceRequest, + ProvisionedDeviceResponse, + ), + "/arista.inventory.v1.ProvisionedDeviceService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + ProvisionedDeviceSomeRequest, + ProvisionedDeviceSomeResponse, + ), + "/arista.inventory.v1.ProvisionedDeviceService/GetAll": grpclib.const.Handler( + self.__rpc_get_all, + grpclib.const.Cardinality.UNARY_STREAM, + ProvisionedDeviceStreamRequest, + ProvisionedDeviceStreamResponse, + ), + "/arista.inventory.v1.ProvisionedDeviceService/Subscribe": grpclib.const.Handler( + self.__rpc_subscribe, + grpclib.const.Cardinality.UNARY_STREAM, + ProvisionedDeviceStreamRequest, + ProvisionedDeviceStreamResponse, + ), + "/arista.inventory.v1.ProvisionedDeviceService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + ProvisionedDeviceStreamRequest, + MetaResponse, + ), + "/arista.inventory.v1.ProvisionedDeviceService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + ProvisionedDeviceStreamRequest, + MetaResponse, + ), + "/arista.inventory.v1.ProvisionedDeviceService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + ProvisionedDeviceBatchedStreamRequest, + ProvisionedDeviceBatchedStreamResponse, + ), + "/arista.inventory.v1.ProvisionedDeviceService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + ProvisionedDeviceBatchedStreamRequest, + ProvisionedDeviceBatchedStreamResponse, + ), + } diff --git a/python-avd/pyavd/_cv/api/arista/lifecycle/__init__.py b/python-avd/pyavd/_cv/api/arista/lifecycle/__init__.py new file mode 100644 index 00000000000..b17ca7c745d --- /dev/null +++ b/python-avd/pyavd/_cv/api/arista/lifecycle/__init__.py @@ -0,0 +1,3 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/lifecycle/v1/__init__.py b/python-avd/pyavd/_cv/api/arista/lifecycle/v1/__init__.py similarity index 96% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/lifecycle/v1/__init__.py rename to python-avd/pyavd/_cv/api/arista/lifecycle/v1/__init__.py index 9718c17558d..0c09eb035ca 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/lifecycle/v1/__init__.py +++ b/python-avd/pyavd/_cv/api/arista/lifecycle/v1/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. +# Copyright (c) 2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. # Generated by the protocol buffer compiler. DO NOT EDIT! @@ -16,17 +16,9 @@ Optional, ) -try: - import aristaproto - import grpclib - from aristaproto.grpc.grpclib_server import ServiceBase -except ImportError: - HAS_ARISTAPROTO = False - from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_aristaproto as aristaproto - from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_grpclib as grpclib - ServiceBase = object -else: - HAS_ARISTAPROTO = True +import aristaproto +import grpclib +from aristaproto.grpc.grpclib_server import ServiceBase from .... import fmp as ___fmp__ from ... import ( @@ -325,6 +317,7 @@ async def subscribe_meta( class DeviceLifecycleSummaryServiceBase(ServiceBase): + async def get_one( self, device_lifecycle_summary_request: "DeviceLifecycleSummaryRequest" ) -> "DeviceLifecycleSummaryResponse": diff --git a/python-avd/pyavd/_cv/api/arista/redirector/__init__.py b/python-avd/pyavd/_cv/api/arista/redirector/__init__.py new file mode 100644 index 00000000000..b17ca7c745d --- /dev/null +++ b/python-avd/pyavd/_cv/api/arista/redirector/__init__.py @@ -0,0 +1,3 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. diff --git a/python-avd/pyavd/_cv/api/arista/redirector/v1/__init__.py b/python-avd/pyavd/_cv/api/arista/redirector/v1/__init__.py new file mode 100644 index 00000000000..2d4b69a1662 --- /dev/null +++ b/python-avd/pyavd/_cv/api/arista/redirector/v1/__init__.py @@ -0,0 +1,583 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +# Generated by the protocol buffer compiler. DO NOT EDIT! +# sources: arista/redirector.v1/redirector.proto, arista/redirector.v1/services.gen.proto +# plugin: python-aristaproto +# This file has been @generated + +from dataclasses import dataclass +from datetime import datetime +from typing import ( + TYPE_CHECKING, + AsyncIterator, + Dict, + List, + Optional, +) + +import aristaproto +import grpclib +from aristaproto.grpc.grpclib_server import ServiceBase + +from .... import fmp as ___fmp__ +from ... import ( + subscriptions as __subscriptions__, + time as __time__, +) + + +if TYPE_CHECKING: + import grpclib.server + from aristaproto.grpc.grpclib_client import MetadataLike + from grpclib.metadata import Deadline + + +@dataclass(eq=False, repr=False) +class AssignmentKey(aristaproto.Message): + """AssignmentKey allows to uniquely identify an assignment.""" + + system_id: Optional[str] = aristaproto.message_field( + 1, wraps=aristaproto.TYPE_STRING + ) + """system_id is the unique identifier of a device.""" + + +@dataclass(eq=False, repr=False) +class Assignment(aristaproto.Message): + """ + Assignment returns the information about the regional clusters that the + system is assigned to. Each cluster consists of a series of hosts, each of + which the client can use to connect. + """ + + key: "AssignmentKey" = aristaproto.message_field(1) + """key uniquely identifies the assignment of system_id to the cluster.""" + + clusters: "Clusters" = aristaproto.message_field(2) + """clusters that the system is assigned to.""" + + +@dataclass(eq=False, repr=False) +class Clusters(aristaproto.Message): + """ + Clusters wraps a cluster list which contain the information about the hosts. + """ + + values: List["Cluster"] = aristaproto.message_field(2) + """values contains the list of clusters associated with the region""" + + +@dataclass(eq=False, repr=False) +class Cluster(aristaproto.Message): + name: Optional[str] = aristaproto.message_field(1, wraps=aristaproto.TYPE_STRING) + """ + name of the cluster. The name can change over time as new clusters + are added or removed. + """ + + hosts: "___fmp__.RepeatedString" = aristaproto.message_field(2) + """hosts in the cluster that the devices can connect to.""" + + +@dataclass(eq=False, repr=False) +class MetaResponse(aristaproto.Message): + time: datetime = aristaproto.message_field(1) + """ + Time holds the timestamp of the last item included in the metadata calculation. + """ + + type: "__subscriptions__.Operation" = aristaproto.enum_field(2) + """ + Operation indicates how the value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + count: Optional[int] = aristaproto.message_field(3, wraps=aristaproto.TYPE_UINT32) + """ + Count is the number of items present under the conditions of the request. + """ + + +@dataclass(eq=False, repr=False) +class AssignmentRequest(aristaproto.Message): + key: "AssignmentKey" = aristaproto.message_field(1) + """ + Key uniquely identifies a Assignment instance to retrieve. + This value must be populated. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class AssignmentResponse(aristaproto.Message): + value: "Assignment" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time carries the (UTC) timestamp of the last-modification of the + Assignment instance in this response. + """ + + +@dataclass(eq=False, repr=False) +class AssignmentSomeRequest(aristaproto.Message): + keys: List["AssignmentKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class AssignmentSomeResponse(aristaproto.Message): + value: "Assignment" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + +@dataclass(eq=False, repr=False) +class AssignmentStreamRequest(aristaproto.Message): + partial_eq_filter: List["Assignment"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each Assignment at end. + * Each Assignment response is fully-specified (all fields set). + * start: Returns the state of each Assignment at start, followed by updates until now. + * Each Assignment response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each Assignment at start, followed by updates + until end. + * Each Assignment response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + +@dataclass(eq=False, repr=False) +class AssignmentStreamResponse(aristaproto.Message): + value: "Assignment" = aristaproto.message_field(1) + """ + Value is a value deemed relevant to the initiating request. + This structure will always have its key-field populated. Which other fields are + populated, and why, depends on the value of Operation and what triggered this notification. + """ + + time: datetime = aristaproto.message_field(2) + """Time holds the timestamp of this Assignment's last modification.""" + + type: "__subscriptions__.Operation" = aristaproto.enum_field(3) + """ + Operation indicates how the Assignment value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + +@dataclass(eq=False, repr=False) +class AssignmentBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["Assignment"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each Assignment at end. + * Each Assignment response is fully-specified (all fields set). + * start: Returns the state of each Assignment at start, followed by updates until now. + * Each Assignment response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each Assignment at start, followed by updates + until end. + * Each Assignment response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class AssignmentBatchedStreamResponse(aristaproto.Message): + responses: List["AssignmentStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + +class AssignmentServiceStub(aristaproto.ServiceStub): + async def get_one( + self, + assignment_request: "AssignmentRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "AssignmentResponse": + return await self._unary_unary( + "/arista.redirector.v1.AssignmentService/GetOne", + assignment_request, + AssignmentResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def get_some( + self, + assignment_some_request: "AssignmentSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["AssignmentSomeResponse"]: + async for response in self._unary_stream( + "/arista.redirector.v1.AssignmentService/GetSome", + assignment_some_request, + AssignmentSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all( + self, + assignment_stream_request: "AssignmentStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["AssignmentStreamResponse"]: + async for response in self._unary_stream( + "/arista.redirector.v1.AssignmentService/GetAll", + assignment_stream_request, + AssignmentStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe( + self, + assignment_stream_request: "AssignmentStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["AssignmentStreamResponse"]: + async for response in self._unary_stream( + "/arista.redirector.v1.AssignmentService/Subscribe", + assignment_stream_request, + AssignmentStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_meta( + self, + assignment_stream_request: "AssignmentStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.redirector.v1.AssignmentService/GetMeta", + assignment_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + assignment_stream_request: "AssignmentStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.redirector.v1.AssignmentService/SubscribeMeta", + assignment_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all_batched( + self, + assignment_batched_stream_request: "AssignmentBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["AssignmentBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.redirector.v1.AssignmentService/GetAllBatched", + assignment_batched_stream_request, + AssignmentBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + assignment_batched_stream_request: "AssignmentBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["AssignmentBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.redirector.v1.AssignmentService/SubscribeBatched", + assignment_batched_stream_request, + AssignmentBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + +class AssignmentServiceBase(ServiceBase): + + async def get_one( + self, assignment_request: "AssignmentRequest" + ) -> "AssignmentResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_some( + self, assignment_some_request: "AssignmentSomeRequest" + ) -> AsyncIterator["AssignmentSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all( + self, assignment_stream_request: "AssignmentStreamRequest" + ) -> AsyncIterator["AssignmentStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe( + self, assignment_stream_request: "AssignmentStreamRequest" + ) -> AsyncIterator["AssignmentStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_meta( + self, assignment_stream_request: "AssignmentStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, assignment_stream_request: "AssignmentStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all_batched( + self, assignment_batched_stream_request: "AssignmentBatchedStreamRequest" + ) -> AsyncIterator["AssignmentBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, assignment_batched_stream_request: "AssignmentBatchedStreamRequest" + ) -> AsyncIterator["AssignmentBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def __rpc_get_one( + self, stream: "grpclib.server.Stream[AssignmentRequest, AssignmentResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_one(request) + await stream.send_message(response) + + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[AssignmentSomeRequest, AssignmentSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + + async def __rpc_get_all( + self, + stream: "grpclib.server.Stream[AssignmentStreamRequest, AssignmentStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all, + stream, + request, + ) + + async def __rpc_subscribe( + self, + stream: "grpclib.server.Stream[AssignmentStreamRequest, AssignmentStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe, + stream, + request, + ) + + async def __rpc_get_meta( + self, stream: "grpclib.server.Stream[AssignmentStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, stream: "grpclib.server.Stream[AssignmentStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[AssignmentBatchedStreamRequest, AssignmentBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[AssignmentBatchedStreamRequest, AssignmentBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: + return { + "/arista.redirector.v1.AssignmentService/GetOne": grpclib.const.Handler( + self.__rpc_get_one, + grpclib.const.Cardinality.UNARY_UNARY, + AssignmentRequest, + AssignmentResponse, + ), + "/arista.redirector.v1.AssignmentService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + AssignmentSomeRequest, + AssignmentSomeResponse, + ), + "/arista.redirector.v1.AssignmentService/GetAll": grpclib.const.Handler( + self.__rpc_get_all, + grpclib.const.Cardinality.UNARY_STREAM, + AssignmentStreamRequest, + AssignmentStreamResponse, + ), + "/arista.redirector.v1.AssignmentService/Subscribe": grpclib.const.Handler( + self.__rpc_subscribe, + grpclib.const.Cardinality.UNARY_STREAM, + AssignmentStreamRequest, + AssignmentStreamResponse, + ), + "/arista.redirector.v1.AssignmentService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + AssignmentStreamRequest, + MetaResponse, + ), + "/arista.redirector.v1.AssignmentService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + AssignmentStreamRequest, + MetaResponse, + ), + "/arista.redirector.v1.AssignmentService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + AssignmentBatchedStreamRequest, + AssignmentBatchedStreamResponse, + ), + "/arista.redirector.v1.AssignmentService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + AssignmentBatchedStreamRequest, + AssignmentBatchedStreamResponse, + ), + } diff --git a/python-avd/pyavd/_cv/api/arista/serviceaccount/__init__.py b/python-avd/pyavd/_cv/api/arista/serviceaccount/__init__.py new file mode 100644 index 00000000000..b17ca7c745d --- /dev/null +++ b/python-avd/pyavd/_cv/api/arista/serviceaccount/__init__.py @@ -0,0 +1,3 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. diff --git a/python-avd/pyavd/_cv/api/arista/serviceaccount/v1/__init__.py b/python-avd/pyavd/_cv/api/arista/serviceaccount/v1/__init__.py new file mode 100644 index 00000000000..f05dd4f717a --- /dev/null +++ b/python-avd/pyavd/_cv/api/arista/serviceaccount/v1/__init__.py @@ -0,0 +1,2227 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +# Generated by the protocol buffer compiler. DO NOT EDIT! +# sources: arista/serviceaccount.v1/serviceaccount.proto, arista/serviceaccount.v1/services.gen.proto +# plugin: python-aristaproto +# This file has been @generated + +from dataclasses import dataclass +from datetime import ( + datetime, + timedelta, +) +from typing import ( + TYPE_CHECKING, + AsyncIterator, + Dict, + List, + Optional, +) + +import aristaproto +import grpclib +from aristaproto.grpc.grpclib_server import ServiceBase + +from .... import fmp as ___fmp__ +from ... import ( + subscriptions as __subscriptions__, + time as __time__, +) + + +if TYPE_CHECKING: + import grpclib.server + from aristaproto.grpc.grpclib_client import MetadataLike + from grpclib.metadata import Deadline + + +class AccountStatus(aristaproto.Enum): + """ + AccountStatus determines whether an service account is enabled or disabled. + """ + + UNSPECIFIED = 0 + """ + ACCOUNT_STATUS_UNSPECIFIED indicates the service account status is unspecified. + """ + + ENABLED = 1 + """ACCOUNT_STATUS_ENABLED indicates the service account is enabled.""" + + DISABLED = 2 + """ACCOUNT_STATUS_DISABLED indicates the service account is disabled.""" + + +@dataclass(eq=False, repr=False) +class AccountKey(aristaproto.Message): + """AccountKey contains the name of the service account.""" + + name: Optional[str] = aristaproto.message_field(1, wraps=aristaproto.TYPE_STRING) + """name is the unique identifier of the service account.""" + + +@dataclass(eq=False, repr=False) +class AccountConfig(aristaproto.Message): + """AccountConfig holds the configuration for a service account.""" + + key: "AccountKey" = aristaproto.message_field(1) + """key contains the name of the service account.""" + + status: "AccountStatus" = aristaproto.enum_field(2) + """ + status determines if the service account is enabled or disabled. New service accounts are + enabled by default. + """ + + description: Optional[str] = aristaproto.message_field( + 3, wraps=aristaproto.TYPE_STRING + ) + """description is a comment describing the service account.""" + + groups: "___fmp__.RepeatedString" = aristaproto.message_field(4) + """ + groups is a list of roles that the service account inherits permissions from. + """ + + +@dataclass(eq=False, repr=False) +class Account(aristaproto.Message): + """Account describes a service account.""" + + key: "AccountKey" = aristaproto.message_field(1) + """key uniquely identifies the service account.""" + + status: "AccountStatus" = aristaproto.enum_field(2) + """ + status determines whether the service account is enabled or disabled. + """ + + description: Optional[str] = aristaproto.message_field( + 3, wraps=aristaproto.TYPE_STRING + ) + """description is a comment describing the service account.""" + + groups: "___fmp__.RepeatedString" = aristaproto.message_field(4) + """ + groups is a list of roles that the service account inherits permissions from. + """ + + created_by: Optional[str] = aristaproto.message_field( + 5, wraps=aristaproto.TYPE_STRING + ) + """ + created_by is the name of the entity that created the service account. + """ + + last_access: datetime = aristaproto.message_field(6) + """last_access is the time when the service account was last fetched.""" + + +@dataclass(eq=False, repr=False) +class TokenKey(aristaproto.Message): + """TokenKey contains service account token ID.""" + + id: Optional[str] = aristaproto.message_field(1, wraps=aristaproto.TYPE_STRING) + """id is the unique identifier of the service account token.""" + + +@dataclass(eq=False, repr=False) +class TokenConfig(aristaproto.Message): + """ + TokenConfig holds the configuration for a service account token. The token is a signed JWT which + can be used as a credential for REST and WRPC endpoints. + """ + + key: "TokenKey" = aristaproto.message_field(1) + """key uniquely identifies the service account token.""" + + user: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + user is the name of the service account that the token is generated for. + """ + + description: Optional[str] = aristaproto.message_field( + 3, wraps=aristaproto.TYPE_STRING + ) + """ + description is a short name or comment used to identify the service account token. + """ + + valid_for: timedelta = aristaproto.message_field(4) + """ + valid_for determines the duration that the service account token will be valid for. + """ + + token: Optional[str] = aristaproto.message_field(5, wraps=aristaproto.TYPE_STRING) + """ + token is the JWT token generated for a service account token. + It is only populated in Set response. + """ + + +@dataclass(eq=False, repr=False) +class Token(aristaproto.Message): + """Token describes a service account token.""" + + key: "TokenKey" = aristaproto.message_field(1) + """key uniquely identifies the service account token.""" + + user: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + user is the name of the service account that the token is generated for. + """ + + description: Optional[str] = aristaproto.message_field( + 3, wraps=aristaproto.TYPE_STRING + ) + """ + description is a short name or comment used to identify the service account token. + """ + + valid_until: datetime = aristaproto.message_field(4) + """ + valid_until is the time that the service account token will be valid until. + """ + + created_by: Optional[str] = aristaproto.message_field( + 5, wraps=aristaproto.TYPE_STRING + ) + """ + created_by is the name of the entity that created the service account token. + """ + + last_used: datetime = aristaproto.message_field(6) + """ + last_used is the time when the service account token was last used to authenticate. + """ + + +@dataclass(eq=False, repr=False) +class MetaResponse(aristaproto.Message): + time: datetime = aristaproto.message_field(1) + """ + Time holds the timestamp of the last item included in the metadata calculation. + """ + + type: "__subscriptions__.Operation" = aristaproto.enum_field(2) + """ + Operation indicates how the value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + count: Optional[int] = aristaproto.message_field(3, wraps=aristaproto.TYPE_UINT32) + """ + Count is the number of items present under the conditions of the request. + """ + + +@dataclass(eq=False, repr=False) +class AccountRequest(aristaproto.Message): + key: "AccountKey" = aristaproto.message_field(1) + """ + Key uniquely identifies a Account instance to retrieve. + This value must be populated. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class AccountResponse(aristaproto.Message): + value: "Account" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time carries the (UTC) timestamp of the last-modification of the + Account instance in this response. + """ + + +@dataclass(eq=False, repr=False) +class AccountSomeRequest(aristaproto.Message): + keys: List["AccountKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class AccountSomeResponse(aristaproto.Message): + value: "Account" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + +@dataclass(eq=False, repr=False) +class AccountStreamRequest(aristaproto.Message): + partial_eq_filter: List["Account"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each Account at end. + * Each Account response is fully-specified (all fields set). + * start: Returns the state of each Account at start, followed by updates until now. + * Each Account response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each Account at start, followed by updates + until end. + * Each Account response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + +@dataclass(eq=False, repr=False) +class AccountStreamResponse(aristaproto.Message): + value: "Account" = aristaproto.message_field(1) + """ + Value is a value deemed relevant to the initiating request. + This structure will always have its key-field populated. Which other fields are + populated, and why, depends on the value of Operation and what triggered this notification. + """ + + time: datetime = aristaproto.message_field(2) + """Time holds the timestamp of this Account's last modification.""" + + type: "__subscriptions__.Operation" = aristaproto.enum_field(3) + """ + Operation indicates how the Account value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + +@dataclass(eq=False, repr=False) +class AccountConfigRequest(aristaproto.Message): + key: "AccountKey" = aristaproto.message_field(1) + """ + Key uniquely identifies a AccountConfig instance to retrieve. + This value must be populated. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class AccountConfigResponse(aristaproto.Message): + value: "AccountConfig" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time carries the (UTC) timestamp of the last-modification of the + AccountConfig instance in this response. + """ + + +@dataclass(eq=False, repr=False) +class AccountConfigSomeRequest(aristaproto.Message): + keys: List["AccountKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class AccountConfigSomeResponse(aristaproto.Message): + value: "AccountConfig" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + +@dataclass(eq=False, repr=False) +class AccountConfigStreamRequest(aristaproto.Message): + partial_eq_filter: List["AccountConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each AccountConfig at end. + * Each AccountConfig response is fully-specified (all fields set). + * start: Returns the state of each AccountConfig at start, followed by updates until now. + * Each AccountConfig response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each AccountConfig at start, followed by updates + until end. + * Each AccountConfig response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + +@dataclass(eq=False, repr=False) +class AccountConfigStreamResponse(aristaproto.Message): + value: "AccountConfig" = aristaproto.message_field(1) + """ + Value is a value deemed relevant to the initiating request. + This structure will always have its key-field populated. Which other fields are + populated, and why, depends on the value of Operation and what triggered this notification. + """ + + time: datetime = aristaproto.message_field(2) + """Time holds the timestamp of this AccountConfig's last modification.""" + + type: "__subscriptions__.Operation" = aristaproto.enum_field(3) + """ + Operation indicates how the AccountConfig value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + +@dataclass(eq=False, repr=False) +class AccountConfigSetRequest(aristaproto.Message): + value: "AccountConfig" = aristaproto.message_field(1) + """ + AccountConfig carries the value to set into the datastore. + See the documentation on the AccountConfig struct for which fields are required. + """ + + +@dataclass(eq=False, repr=False) +class AccountConfigSetResponse(aristaproto.Message): + value: "AccountConfig" = aristaproto.message_field(1) + """ + Value carries all the values given in the AccountConfigSetRequest as well + as any server-generated values. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the (UTC) timestamp at which the system recognizes the + creation. The only guarantees made about this timestamp are: + + - it is after the time the request was received + - a time-ranged query with StartTime==CreatedAt will include this instance. + """ + + +@dataclass(eq=False, repr=False) +class AccountConfigSetSomeRequest(aristaproto.Message): + values: List["AccountConfig"] = aristaproto.message_field(1) + """ + value contains a list of AccountConfig values to write. + It is possible to provide more values than can fit within either: + - the maxiumum send size of the client + - the maximum receive size of the server + If this error occurs you must reduce the number of values sent. + See gRPC "maximum message size" documentation for more information. + """ + + +@dataclass(eq=False, repr=False) +class AccountConfigSetSomeResponse(aristaproto.Message): + key: "AccountKey" = aristaproto.message_field(1) + error: str = aristaproto.string_field(2) + + +@dataclass(eq=False, repr=False) +class AccountConfigDeleteRequest(aristaproto.Message): + key: "AccountKey" = aristaproto.message_field(1) + """ + Key indicates which AccountConfig instance to remove. + This field must always be set. + """ + + +@dataclass(eq=False, repr=False) +class AccountConfigDeleteResponse(aristaproto.Message): + key: "AccountKey" = aristaproto.message_field(1) + """Key echoes back the key of the deleted AccountConfig instance.""" + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the (UTC) timestamp at which the system recognizes the + deletion. The only guarantees made about this timestamp are: + + - it is after the time the request was received + - a time-ranged query with StartTime==DeletedAt will not include this instance. + """ + + +@dataclass(eq=False, repr=False) +class AccountConfigDeleteSomeRequest(aristaproto.Message): + keys: List["AccountKey"] = aristaproto.message_field(1) + """key contains a list of AccountConfig keys to delete""" + + +@dataclass(eq=False, repr=False) +class AccountConfigDeleteSomeResponse(aristaproto.Message): + """AccountConfigDeleteSomeResponse is only sent when there is an error.""" + + key: "AccountKey" = aristaproto.message_field(1) + error: str = aristaproto.string_field(2) + + +@dataclass(eq=False, repr=False) +class AccountConfigDeleteAllRequest(aristaproto.Message): + partial_eq_filter: List["AccountConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a DeleteAll. + This requires all provided fields to be equal to the response. + A filtered DeleteAll will use GetAll with filter to find things to delete. + """ + + +@dataclass(eq=False, repr=False) +class AccountConfigDeleteAllResponse(aristaproto.Message): + type: "___fmp__.DeleteError" = aristaproto.enum_field(1) + """ + This describes the class of delete error. + A DeleteAllResponse is only sent when there is an error. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """This indicates the error message from the delete failure.""" + + key: "AccountKey" = aristaproto.message_field(3) + """ + This is the key of the AccountConfig instance that failed to be deleted. + """ + + time: datetime = aristaproto.message_field(4) + """Time indicates the (UTC) timestamp when the key was being deleted.""" + + +@dataclass(eq=False, repr=False) +class TokenRequest(aristaproto.Message): + key: "TokenKey" = aristaproto.message_field(1) + """ + Key uniquely identifies a Token instance to retrieve. + This value must be populated. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class TokenResponse(aristaproto.Message): + value: "Token" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time carries the (UTC) timestamp of the last-modification of the + Token instance in this response. + """ + + +@dataclass(eq=False, repr=False) +class TokenSomeRequest(aristaproto.Message): + keys: List["TokenKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class TokenSomeResponse(aristaproto.Message): + value: "Token" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + +@dataclass(eq=False, repr=False) +class TokenStreamRequest(aristaproto.Message): + partial_eq_filter: List["Token"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each Token at end. + * Each Token response is fully-specified (all fields set). + * start: Returns the state of each Token at start, followed by updates until now. + * Each Token response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each Token at start, followed by updates + until end. + * Each Token response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + +@dataclass(eq=False, repr=False) +class TokenStreamResponse(aristaproto.Message): + value: "Token" = aristaproto.message_field(1) + """ + Value is a value deemed relevant to the initiating request. + This structure will always have its key-field populated. Which other fields are + populated, and why, depends on the value of Operation and what triggered this notification. + """ + + time: datetime = aristaproto.message_field(2) + """Time holds the timestamp of this Token's last modification.""" + + type: "__subscriptions__.Operation" = aristaproto.enum_field(3) + """ + Operation indicates how the Token value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + +@dataclass(eq=False, repr=False) +class TokenConfigRequest(aristaproto.Message): + key: "TokenKey" = aristaproto.message_field(1) + """ + Key uniquely identifies a TokenConfig instance to retrieve. + This value must be populated. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class TokenConfigResponse(aristaproto.Message): + value: "TokenConfig" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time carries the (UTC) timestamp of the last-modification of the + TokenConfig instance in this response. + """ + + +@dataclass(eq=False, repr=False) +class TokenConfigSomeRequest(aristaproto.Message): + keys: List["TokenKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class TokenConfigSomeResponse(aristaproto.Message): + value: "TokenConfig" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + +@dataclass(eq=False, repr=False) +class TokenConfigStreamRequest(aristaproto.Message): + partial_eq_filter: List["TokenConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each TokenConfig at end. + * Each TokenConfig response is fully-specified (all fields set). + * start: Returns the state of each TokenConfig at start, followed by updates until now. + * Each TokenConfig response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each TokenConfig at start, followed by updates + until end. + * Each TokenConfig response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + +@dataclass(eq=False, repr=False) +class TokenConfigStreamResponse(aristaproto.Message): + value: "TokenConfig" = aristaproto.message_field(1) + """ + Value is a value deemed relevant to the initiating request. + This structure will always have its key-field populated. Which other fields are + populated, and why, depends on the value of Operation and what triggered this notification. + """ + + time: datetime = aristaproto.message_field(2) + """Time holds the timestamp of this TokenConfig's last modification.""" + + type: "__subscriptions__.Operation" = aristaproto.enum_field(3) + """ + Operation indicates how the TokenConfig value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + +@dataclass(eq=False, repr=False) +class TokenConfigSetRequest(aristaproto.Message): + value: "TokenConfig" = aristaproto.message_field(1) + """ + TokenConfig carries the value to set into the datastore. + See the documentation on the TokenConfig struct for which fields are required. + """ + + +@dataclass(eq=False, repr=False) +class TokenConfigSetResponse(aristaproto.Message): + value: "TokenConfig" = aristaproto.message_field(1) + """ + Value carries all the values given in the TokenConfigSetRequest as well + as any server-generated values. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the (UTC) timestamp at which the system recognizes the + creation. The only guarantees made about this timestamp are: + + - it is after the time the request was received + - a time-ranged query with StartTime==CreatedAt will include this instance. + """ + + +@dataclass(eq=False, repr=False) +class TokenConfigSetSomeRequest(aristaproto.Message): + values: List["TokenConfig"] = aristaproto.message_field(1) + """ + value contains a list of TokenConfig values to write. + It is possible to provide more values than can fit within either: + - the maxiumum send size of the client + - the maximum receive size of the server + If this error occurs you must reduce the number of values sent. + See gRPC "maximum message size" documentation for more information. + """ + + +@dataclass(eq=False, repr=False) +class TokenConfigSetSomeResponse(aristaproto.Message): + key: "TokenKey" = aristaproto.message_field(1) + error: str = aristaproto.string_field(2) + + +@dataclass(eq=False, repr=False) +class TokenConfigDeleteRequest(aristaproto.Message): + key: "TokenKey" = aristaproto.message_field(1) + """ + Key indicates which TokenConfig instance to remove. + This field must always be set. + """ + + +@dataclass(eq=False, repr=False) +class TokenConfigDeleteResponse(aristaproto.Message): + key: "TokenKey" = aristaproto.message_field(1) + """Key echoes back the key of the deleted TokenConfig instance.""" + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the (UTC) timestamp at which the system recognizes the + deletion. The only guarantees made about this timestamp are: + + - it is after the time the request was received + - a time-ranged query with StartTime==DeletedAt will not include this instance. + """ + + +@dataclass(eq=False, repr=False) +class TokenConfigDeleteSomeRequest(aristaproto.Message): + keys: List["TokenKey"] = aristaproto.message_field(1) + """key contains a list of TokenConfig keys to delete""" + + +@dataclass(eq=False, repr=False) +class TokenConfigDeleteSomeResponse(aristaproto.Message): + """TokenConfigDeleteSomeResponse is only sent when there is an error.""" + + key: "TokenKey" = aristaproto.message_field(1) + error: str = aristaproto.string_field(2) + + +@dataclass(eq=False, repr=False) +class TokenConfigDeleteAllRequest(aristaproto.Message): + partial_eq_filter: List["TokenConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a DeleteAll. + This requires all provided fields to be equal to the response. + A filtered DeleteAll will use GetAll with filter to find things to delete. + """ + + +@dataclass(eq=False, repr=False) +class TokenConfigDeleteAllResponse(aristaproto.Message): + type: "___fmp__.DeleteError" = aristaproto.enum_field(1) + """ + This describes the class of delete error. + A DeleteAllResponse is only sent when there is an error. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """This indicates the error message from the delete failure.""" + + key: "TokenKey" = aristaproto.message_field(3) + """ + This is the key of the TokenConfig instance that failed to be deleted. + """ + + time: datetime = aristaproto.message_field(4) + """Time indicates the (UTC) timestamp when the key was being deleted.""" + + +class AccountServiceStub(aristaproto.ServiceStub): + async def get_one( + self, + account_request: "AccountRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "AccountResponse": + return await self._unary_unary( + "/arista.serviceaccount.v1.AccountService/GetOne", + account_request, + AccountResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def get_some( + self, + account_some_request: "AccountSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["AccountSomeResponse"]: + async for response in self._unary_stream( + "/arista.serviceaccount.v1.AccountService/GetSome", + account_some_request, + AccountSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all( + self, + account_stream_request: "AccountStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["AccountStreamResponse"]: + async for response in self._unary_stream( + "/arista.serviceaccount.v1.AccountService/GetAll", + account_stream_request, + AccountStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe( + self, + account_stream_request: "AccountStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["AccountStreamResponse"]: + async for response in self._unary_stream( + "/arista.serviceaccount.v1.AccountService/Subscribe", + account_stream_request, + AccountStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_meta( + self, + account_stream_request: "AccountStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.serviceaccount.v1.AccountService/GetMeta", + account_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + account_stream_request: "AccountStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.serviceaccount.v1.AccountService/SubscribeMeta", + account_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + +class AccountConfigServiceStub(aristaproto.ServiceStub): + async def get_one( + self, + account_config_request: "AccountConfigRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "AccountConfigResponse": + return await self._unary_unary( + "/arista.serviceaccount.v1.AccountConfigService/GetOne", + account_config_request, + AccountConfigResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def get_some( + self, + account_config_some_request: "AccountConfigSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["AccountConfigSomeResponse"]: + async for response in self._unary_stream( + "/arista.serviceaccount.v1.AccountConfigService/GetSome", + account_config_some_request, + AccountConfigSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all( + self, + account_config_stream_request: "AccountConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["AccountConfigStreamResponse"]: + async for response in self._unary_stream( + "/arista.serviceaccount.v1.AccountConfigService/GetAll", + account_config_stream_request, + AccountConfigStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe( + self, + account_config_stream_request: "AccountConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["AccountConfigStreamResponse"]: + async for response in self._unary_stream( + "/arista.serviceaccount.v1.AccountConfigService/Subscribe", + account_config_stream_request, + AccountConfigStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_meta( + self, + account_config_stream_request: "AccountConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.serviceaccount.v1.AccountConfigService/GetMeta", + account_config_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + account_config_stream_request: "AccountConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.serviceaccount.v1.AccountConfigService/SubscribeMeta", + account_config_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def set( + self, + account_config_set_request: "AccountConfigSetRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "AccountConfigSetResponse": + return await self._unary_unary( + "/arista.serviceaccount.v1.AccountConfigService/Set", + account_config_set_request, + AccountConfigSetResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def set_some( + self, + account_config_set_some_request: "AccountConfigSetSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["AccountConfigSetSomeResponse"]: + async for response in self._unary_stream( + "/arista.serviceaccount.v1.AccountConfigService/SetSome", + account_config_set_some_request, + AccountConfigSetSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def delete( + self, + account_config_delete_request: "AccountConfigDeleteRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "AccountConfigDeleteResponse": + return await self._unary_unary( + "/arista.serviceaccount.v1.AccountConfigService/Delete", + account_config_delete_request, + AccountConfigDeleteResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def delete_some( + self, + account_config_delete_some_request: "AccountConfigDeleteSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["AccountConfigDeleteSomeResponse"]: + async for response in self._unary_stream( + "/arista.serviceaccount.v1.AccountConfigService/DeleteSome", + account_config_delete_some_request, + AccountConfigDeleteSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def delete_all( + self, + account_config_delete_all_request: "AccountConfigDeleteAllRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["AccountConfigDeleteAllResponse"]: + async for response in self._unary_stream( + "/arista.serviceaccount.v1.AccountConfigService/DeleteAll", + account_config_delete_all_request, + AccountConfigDeleteAllResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + +class TokenServiceStub(aristaproto.ServiceStub): + async def get_one( + self, + token_request: "TokenRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "TokenResponse": + return await self._unary_unary( + "/arista.serviceaccount.v1.TokenService/GetOne", + token_request, + TokenResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def get_some( + self, + token_some_request: "TokenSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["TokenSomeResponse"]: + async for response in self._unary_stream( + "/arista.serviceaccount.v1.TokenService/GetSome", + token_some_request, + TokenSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all( + self, + token_stream_request: "TokenStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["TokenStreamResponse"]: + async for response in self._unary_stream( + "/arista.serviceaccount.v1.TokenService/GetAll", + token_stream_request, + TokenStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe( + self, + token_stream_request: "TokenStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["TokenStreamResponse"]: + async for response in self._unary_stream( + "/arista.serviceaccount.v1.TokenService/Subscribe", + token_stream_request, + TokenStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_meta( + self, + token_stream_request: "TokenStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.serviceaccount.v1.TokenService/GetMeta", + token_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + token_stream_request: "TokenStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.serviceaccount.v1.TokenService/SubscribeMeta", + token_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + +class TokenConfigServiceStub(aristaproto.ServiceStub): + async def get_one( + self, + token_config_request: "TokenConfigRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "TokenConfigResponse": + return await self._unary_unary( + "/arista.serviceaccount.v1.TokenConfigService/GetOne", + token_config_request, + TokenConfigResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def get_some( + self, + token_config_some_request: "TokenConfigSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["TokenConfigSomeResponse"]: + async for response in self._unary_stream( + "/arista.serviceaccount.v1.TokenConfigService/GetSome", + token_config_some_request, + TokenConfigSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all( + self, + token_config_stream_request: "TokenConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["TokenConfigStreamResponse"]: + async for response in self._unary_stream( + "/arista.serviceaccount.v1.TokenConfigService/GetAll", + token_config_stream_request, + TokenConfigStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe( + self, + token_config_stream_request: "TokenConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["TokenConfigStreamResponse"]: + async for response in self._unary_stream( + "/arista.serviceaccount.v1.TokenConfigService/Subscribe", + token_config_stream_request, + TokenConfigStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_meta( + self, + token_config_stream_request: "TokenConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.serviceaccount.v1.TokenConfigService/GetMeta", + token_config_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + token_config_stream_request: "TokenConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.serviceaccount.v1.TokenConfigService/SubscribeMeta", + token_config_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def set( + self, + token_config_set_request: "TokenConfigSetRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "TokenConfigSetResponse": + return await self._unary_unary( + "/arista.serviceaccount.v1.TokenConfigService/Set", + token_config_set_request, + TokenConfigSetResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def set_some( + self, + token_config_set_some_request: "TokenConfigSetSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["TokenConfigSetSomeResponse"]: + async for response in self._unary_stream( + "/arista.serviceaccount.v1.TokenConfigService/SetSome", + token_config_set_some_request, + TokenConfigSetSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def delete( + self, + token_config_delete_request: "TokenConfigDeleteRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "TokenConfigDeleteResponse": + return await self._unary_unary( + "/arista.serviceaccount.v1.TokenConfigService/Delete", + token_config_delete_request, + TokenConfigDeleteResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def delete_some( + self, + token_config_delete_some_request: "TokenConfigDeleteSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["TokenConfigDeleteSomeResponse"]: + async for response in self._unary_stream( + "/arista.serviceaccount.v1.TokenConfigService/DeleteSome", + token_config_delete_some_request, + TokenConfigDeleteSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def delete_all( + self, + token_config_delete_all_request: "TokenConfigDeleteAllRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["TokenConfigDeleteAllResponse"]: + async for response in self._unary_stream( + "/arista.serviceaccount.v1.TokenConfigService/DeleteAll", + token_config_delete_all_request, + TokenConfigDeleteAllResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + +class AccountServiceBase(ServiceBase): + + async def get_one(self, account_request: "AccountRequest") -> "AccountResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_some( + self, account_some_request: "AccountSomeRequest" + ) -> AsyncIterator["AccountSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all( + self, account_stream_request: "AccountStreamRequest" + ) -> AsyncIterator["AccountStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe( + self, account_stream_request: "AccountStreamRequest" + ) -> AsyncIterator["AccountStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_meta( + self, account_stream_request: "AccountStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, account_stream_request: "AccountStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def __rpc_get_one( + self, stream: "grpclib.server.Stream[AccountRequest, AccountResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_one(request) + await stream.send_message(response) + + async def __rpc_get_some( + self, stream: "grpclib.server.Stream[AccountSomeRequest, AccountSomeResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + + async def __rpc_get_all( + self, + stream: "grpclib.server.Stream[AccountStreamRequest, AccountStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all, + stream, + request, + ) + + async def __rpc_subscribe( + self, + stream: "grpclib.server.Stream[AccountStreamRequest, AccountStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe, + stream, + request, + ) + + async def __rpc_get_meta( + self, stream: "grpclib.server.Stream[AccountStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, stream: "grpclib.server.Stream[AccountStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: + return { + "/arista.serviceaccount.v1.AccountService/GetOne": grpclib.const.Handler( + self.__rpc_get_one, + grpclib.const.Cardinality.UNARY_UNARY, + AccountRequest, + AccountResponse, + ), + "/arista.serviceaccount.v1.AccountService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + AccountSomeRequest, + AccountSomeResponse, + ), + "/arista.serviceaccount.v1.AccountService/GetAll": grpclib.const.Handler( + self.__rpc_get_all, + grpclib.const.Cardinality.UNARY_STREAM, + AccountStreamRequest, + AccountStreamResponse, + ), + "/arista.serviceaccount.v1.AccountService/Subscribe": grpclib.const.Handler( + self.__rpc_subscribe, + grpclib.const.Cardinality.UNARY_STREAM, + AccountStreamRequest, + AccountStreamResponse, + ), + "/arista.serviceaccount.v1.AccountService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + AccountStreamRequest, + MetaResponse, + ), + "/arista.serviceaccount.v1.AccountService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + AccountStreamRequest, + MetaResponse, + ), + } + + +class AccountConfigServiceBase(ServiceBase): + + async def get_one( + self, account_config_request: "AccountConfigRequest" + ) -> "AccountConfigResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_some( + self, account_config_some_request: "AccountConfigSomeRequest" + ) -> AsyncIterator["AccountConfigSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all( + self, account_config_stream_request: "AccountConfigStreamRequest" + ) -> AsyncIterator["AccountConfigStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe( + self, account_config_stream_request: "AccountConfigStreamRequest" + ) -> AsyncIterator["AccountConfigStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_meta( + self, account_config_stream_request: "AccountConfigStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, account_config_stream_request: "AccountConfigStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def set( + self, account_config_set_request: "AccountConfigSetRequest" + ) -> "AccountConfigSetResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def set_some( + self, account_config_set_some_request: "AccountConfigSetSomeRequest" + ) -> AsyncIterator["AccountConfigSetSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def delete( + self, account_config_delete_request: "AccountConfigDeleteRequest" + ) -> "AccountConfigDeleteResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def delete_some( + self, account_config_delete_some_request: "AccountConfigDeleteSomeRequest" + ) -> AsyncIterator["AccountConfigDeleteSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def delete_all( + self, account_config_delete_all_request: "AccountConfigDeleteAllRequest" + ) -> AsyncIterator["AccountConfigDeleteAllResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def __rpc_get_one( + self, + stream: "grpclib.server.Stream[AccountConfigRequest, AccountConfigResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.get_one(request) + await stream.send_message(response) + + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[AccountConfigSomeRequest, AccountConfigSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + + async def __rpc_get_all( + self, + stream: "grpclib.server.Stream[AccountConfigStreamRequest, AccountConfigStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all, + stream, + request, + ) + + async def __rpc_subscribe( + self, + stream: "grpclib.server.Stream[AccountConfigStreamRequest, AccountConfigStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe, + stream, + request, + ) + + async def __rpc_get_meta( + self, stream: "grpclib.server.Stream[AccountConfigStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, stream: "grpclib.server.Stream[AccountConfigStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + + async def __rpc_set( + self, + stream: "grpclib.server.Stream[AccountConfigSetRequest, AccountConfigSetResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.set(request) + await stream.send_message(response) + + async def __rpc_set_some( + self, + stream: "grpclib.server.Stream[AccountConfigSetSomeRequest, AccountConfigSetSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.set_some, + stream, + request, + ) + + async def __rpc_delete( + self, + stream: "grpclib.server.Stream[AccountConfigDeleteRequest, AccountConfigDeleteResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.delete(request) + await stream.send_message(response) + + async def __rpc_delete_some( + self, + stream: "grpclib.server.Stream[AccountConfigDeleteSomeRequest, AccountConfigDeleteSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.delete_some, + stream, + request, + ) + + async def __rpc_delete_all( + self, + stream: "grpclib.server.Stream[AccountConfigDeleteAllRequest, AccountConfigDeleteAllResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.delete_all, + stream, + request, + ) + + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: + return { + "/arista.serviceaccount.v1.AccountConfigService/GetOne": grpclib.const.Handler( + self.__rpc_get_one, + grpclib.const.Cardinality.UNARY_UNARY, + AccountConfigRequest, + AccountConfigResponse, + ), + "/arista.serviceaccount.v1.AccountConfigService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + AccountConfigSomeRequest, + AccountConfigSomeResponse, + ), + "/arista.serviceaccount.v1.AccountConfigService/GetAll": grpclib.const.Handler( + self.__rpc_get_all, + grpclib.const.Cardinality.UNARY_STREAM, + AccountConfigStreamRequest, + AccountConfigStreamResponse, + ), + "/arista.serviceaccount.v1.AccountConfigService/Subscribe": grpclib.const.Handler( + self.__rpc_subscribe, + grpclib.const.Cardinality.UNARY_STREAM, + AccountConfigStreamRequest, + AccountConfigStreamResponse, + ), + "/arista.serviceaccount.v1.AccountConfigService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + AccountConfigStreamRequest, + MetaResponse, + ), + "/arista.serviceaccount.v1.AccountConfigService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + AccountConfigStreamRequest, + MetaResponse, + ), + "/arista.serviceaccount.v1.AccountConfigService/Set": grpclib.const.Handler( + self.__rpc_set, + grpclib.const.Cardinality.UNARY_UNARY, + AccountConfigSetRequest, + AccountConfigSetResponse, + ), + "/arista.serviceaccount.v1.AccountConfigService/SetSome": grpclib.const.Handler( + self.__rpc_set_some, + grpclib.const.Cardinality.UNARY_STREAM, + AccountConfigSetSomeRequest, + AccountConfigSetSomeResponse, + ), + "/arista.serviceaccount.v1.AccountConfigService/Delete": grpclib.const.Handler( + self.__rpc_delete, + grpclib.const.Cardinality.UNARY_UNARY, + AccountConfigDeleteRequest, + AccountConfigDeleteResponse, + ), + "/arista.serviceaccount.v1.AccountConfigService/DeleteSome": grpclib.const.Handler( + self.__rpc_delete_some, + grpclib.const.Cardinality.UNARY_STREAM, + AccountConfigDeleteSomeRequest, + AccountConfigDeleteSomeResponse, + ), + "/arista.serviceaccount.v1.AccountConfigService/DeleteAll": grpclib.const.Handler( + self.__rpc_delete_all, + grpclib.const.Cardinality.UNARY_STREAM, + AccountConfigDeleteAllRequest, + AccountConfigDeleteAllResponse, + ), + } + + +class TokenServiceBase(ServiceBase): + + async def get_one(self, token_request: "TokenRequest") -> "TokenResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_some( + self, token_some_request: "TokenSomeRequest" + ) -> AsyncIterator["TokenSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all( + self, token_stream_request: "TokenStreamRequest" + ) -> AsyncIterator["TokenStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe( + self, token_stream_request: "TokenStreamRequest" + ) -> AsyncIterator["TokenStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_meta( + self, token_stream_request: "TokenStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, token_stream_request: "TokenStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def __rpc_get_one( + self, stream: "grpclib.server.Stream[TokenRequest, TokenResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_one(request) + await stream.send_message(response) + + async def __rpc_get_some( + self, stream: "grpclib.server.Stream[TokenSomeRequest, TokenSomeResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + + async def __rpc_get_all( + self, stream: "grpclib.server.Stream[TokenStreamRequest, TokenStreamResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all, + stream, + request, + ) + + async def __rpc_subscribe( + self, stream: "grpclib.server.Stream[TokenStreamRequest, TokenStreamResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe, + stream, + request, + ) + + async def __rpc_get_meta( + self, stream: "grpclib.server.Stream[TokenStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, stream: "grpclib.server.Stream[TokenStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: + return { + "/arista.serviceaccount.v1.TokenService/GetOne": grpclib.const.Handler( + self.__rpc_get_one, + grpclib.const.Cardinality.UNARY_UNARY, + TokenRequest, + TokenResponse, + ), + "/arista.serviceaccount.v1.TokenService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + TokenSomeRequest, + TokenSomeResponse, + ), + "/arista.serviceaccount.v1.TokenService/GetAll": grpclib.const.Handler( + self.__rpc_get_all, + grpclib.const.Cardinality.UNARY_STREAM, + TokenStreamRequest, + TokenStreamResponse, + ), + "/arista.serviceaccount.v1.TokenService/Subscribe": grpclib.const.Handler( + self.__rpc_subscribe, + grpclib.const.Cardinality.UNARY_STREAM, + TokenStreamRequest, + TokenStreamResponse, + ), + "/arista.serviceaccount.v1.TokenService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + TokenStreamRequest, + MetaResponse, + ), + "/arista.serviceaccount.v1.TokenService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + TokenStreamRequest, + MetaResponse, + ), + } + + +class TokenConfigServiceBase(ServiceBase): + + async def get_one( + self, token_config_request: "TokenConfigRequest" + ) -> "TokenConfigResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_some( + self, token_config_some_request: "TokenConfigSomeRequest" + ) -> AsyncIterator["TokenConfigSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all( + self, token_config_stream_request: "TokenConfigStreamRequest" + ) -> AsyncIterator["TokenConfigStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe( + self, token_config_stream_request: "TokenConfigStreamRequest" + ) -> AsyncIterator["TokenConfigStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_meta( + self, token_config_stream_request: "TokenConfigStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, token_config_stream_request: "TokenConfigStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def set( + self, token_config_set_request: "TokenConfigSetRequest" + ) -> "TokenConfigSetResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def set_some( + self, token_config_set_some_request: "TokenConfigSetSomeRequest" + ) -> AsyncIterator["TokenConfigSetSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def delete( + self, token_config_delete_request: "TokenConfigDeleteRequest" + ) -> "TokenConfigDeleteResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def delete_some( + self, token_config_delete_some_request: "TokenConfigDeleteSomeRequest" + ) -> AsyncIterator["TokenConfigDeleteSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def delete_all( + self, token_config_delete_all_request: "TokenConfigDeleteAllRequest" + ) -> AsyncIterator["TokenConfigDeleteAllResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def __rpc_get_one( + self, stream: "grpclib.server.Stream[TokenConfigRequest, TokenConfigResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_one(request) + await stream.send_message(response) + + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[TokenConfigSomeRequest, TokenConfigSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + + async def __rpc_get_all( + self, + stream: "grpclib.server.Stream[TokenConfigStreamRequest, TokenConfigStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all, + stream, + request, + ) + + async def __rpc_subscribe( + self, + stream: "grpclib.server.Stream[TokenConfigStreamRequest, TokenConfigStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe, + stream, + request, + ) + + async def __rpc_get_meta( + self, stream: "grpclib.server.Stream[TokenConfigStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, stream: "grpclib.server.Stream[TokenConfigStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + + async def __rpc_set( + self, + stream: "grpclib.server.Stream[TokenConfigSetRequest, TokenConfigSetResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.set(request) + await stream.send_message(response) + + async def __rpc_set_some( + self, + stream: "grpclib.server.Stream[TokenConfigSetSomeRequest, TokenConfigSetSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.set_some, + stream, + request, + ) + + async def __rpc_delete( + self, + stream: "grpclib.server.Stream[TokenConfigDeleteRequest, TokenConfigDeleteResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.delete(request) + await stream.send_message(response) + + async def __rpc_delete_some( + self, + stream: "grpclib.server.Stream[TokenConfigDeleteSomeRequest, TokenConfigDeleteSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.delete_some, + stream, + request, + ) + + async def __rpc_delete_all( + self, + stream: "grpclib.server.Stream[TokenConfigDeleteAllRequest, TokenConfigDeleteAllResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.delete_all, + stream, + request, + ) + + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: + return { + "/arista.serviceaccount.v1.TokenConfigService/GetOne": grpclib.const.Handler( + self.__rpc_get_one, + grpclib.const.Cardinality.UNARY_UNARY, + TokenConfigRequest, + TokenConfigResponse, + ), + "/arista.serviceaccount.v1.TokenConfigService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + TokenConfigSomeRequest, + TokenConfigSomeResponse, + ), + "/arista.serviceaccount.v1.TokenConfigService/GetAll": grpclib.const.Handler( + self.__rpc_get_all, + grpclib.const.Cardinality.UNARY_STREAM, + TokenConfigStreamRequest, + TokenConfigStreamResponse, + ), + "/arista.serviceaccount.v1.TokenConfigService/Subscribe": grpclib.const.Handler( + self.__rpc_subscribe, + grpclib.const.Cardinality.UNARY_STREAM, + TokenConfigStreamRequest, + TokenConfigStreamResponse, + ), + "/arista.serviceaccount.v1.TokenConfigService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + TokenConfigStreamRequest, + MetaResponse, + ), + "/arista.serviceaccount.v1.TokenConfigService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + TokenConfigStreamRequest, + MetaResponse, + ), + "/arista.serviceaccount.v1.TokenConfigService/Set": grpclib.const.Handler( + self.__rpc_set, + grpclib.const.Cardinality.UNARY_UNARY, + TokenConfigSetRequest, + TokenConfigSetResponse, + ), + "/arista.serviceaccount.v1.TokenConfigService/SetSome": grpclib.const.Handler( + self.__rpc_set_some, + grpclib.const.Cardinality.UNARY_STREAM, + TokenConfigSetSomeRequest, + TokenConfigSetSomeResponse, + ), + "/arista.serviceaccount.v1.TokenConfigService/Delete": grpclib.const.Handler( + self.__rpc_delete, + grpclib.const.Cardinality.UNARY_UNARY, + TokenConfigDeleteRequest, + TokenConfigDeleteResponse, + ), + "/arista.serviceaccount.v1.TokenConfigService/DeleteSome": grpclib.const.Handler( + self.__rpc_delete_some, + grpclib.const.Cardinality.UNARY_STREAM, + TokenConfigDeleteSomeRequest, + TokenConfigDeleteSomeResponse, + ), + "/arista.serviceaccount.v1.TokenConfigService/DeleteAll": grpclib.const.Handler( + self.__rpc_delete_all, + grpclib.const.Cardinality.UNARY_STREAM, + TokenConfigDeleteAllRequest, + TokenConfigDeleteAllResponse, + ), + } diff --git a/python-avd/pyavd/_cv/api/arista/studio/__init__.py b/python-avd/pyavd/_cv/api/arista/studio/__init__.py new file mode 100644 index 00000000000..b17ca7c745d --- /dev/null +++ b/python-avd/pyavd/_cv/api/arista/studio/__init__.py @@ -0,0 +1,3 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/studio/v1/__init__.py b/python-avd/pyavd/_cv/api/arista/studio/v1/__init__.py similarity index 67% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/studio/v1/__init__.py rename to python-avd/pyavd/_cv/api/arista/studio/v1/__init__.py index 53c1f195923..7901666a037 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/studio/v1/__init__.py +++ b/python-avd/pyavd/_cv/api/arista/studio/v1/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. +# Copyright (c) 2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. # Generated by the protocol buffer compiler. DO NOT EDIT! @@ -16,17 +16,9 @@ Optional, ) -try: - import aristaproto - import grpclib - from aristaproto.grpc.grpclib_server import ServiceBase -except ImportError: - HAS_ARISTAPROTO = False - from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_aristaproto as aristaproto - from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_grpclib as grpclib - ServiceBase = object -else: - HAS_ARISTAPROTO = True +import aristaproto +import grpclib +from aristaproto.grpc.grpclib_server import ServiceBase from .... import fmp as ___fmp__ from ... import ( @@ -41,6 +33,42 @@ from grpclib.metadata import Deadline +class EntityType(aristaproto.Enum): + """EntityType enumerates the set of entity types.""" + + UNSPECIFIED = 0 + """ENTITY_TYPE_UNSPECIFIED indicates an unspecified entity type.""" + + STUDIO = 1 + """ENTITY_TYPE_STUDIO indicates the Studio entity type.""" + + INPUTS = 2 + """ENTITY_TYPE_INPUTS indicates the Inputs entity type.""" + + ASSIGNED_TAGS = 3 + """ENTITY_TYPE_ASSIGNED_TAGS indicates the AssignedTags entity type.""" + + BUILD_HOOK = 4 + """ENTITY_TYPE_BUILD_HOOK indicates the BuildHook entity type.""" + + AUTOFILL_ACTION = 5 + """ + ENTITY_TYPE_AUTOFILL_ACTION indicates the AutofillAction entity type. + """ + + CONFIGLET = 6 + """ + ENTITY_TYPE_CONFIGLET indicates the Configlet entity type for + static config studio. + """ + + CONFIGLET_ASSIGNMENT = 7 + """ + ENTITY_TYPE_CONFIGLET_ASSIGNMENT indicates the ConfigletAssignment + entity type for static config studio. + """ + + class TemplateType(aristaproto.Enum): """ TemplateType defines the set of supported languages that can @@ -48,6 +76,8 @@ class TemplateType(aristaproto.Enum): """ UNSPECIFIED = 0 + """TEMPLATE_TYPE_UNSPECIFIED indicates an unspecified template type.""" + MAKO = 1 """ TEMPLATE_TYPE_MAKO is the Mako templating language for Python. @@ -76,6 +106,10 @@ class InputFieldType(aristaproto.Enum): """ UNSPECIFIED = 0 + """ + INPUT_FIELD_TYPE_UNSPECIFIED indicates an unspecified input data type. + """ + BOOLEAN = 1 """INPUT_FIELD_TYPE_BOOLEAN is the data type for a boolean value.""" @@ -130,6 +164,10 @@ class ResolverFieldInputMode(aristaproto.Enum): """ UNSPECIFIED = 0 + """ + RESOLVER_FIELD_INPUT_MODE_UNSPECIFIED indicates an unspecified resolver input mode. + """ + SINGLE_DEVICE_TAG = 1 """ RESOLVER_FIELD_INPUT_MODE_SINGLE_DEVICE_TAG allows devices to be @@ -162,6 +200,10 @@ class ResolverFieldDisplayMode(aristaproto.Enum): """ UNSPECIFIED = 0 + """ + RESOLVER_FIELD_DISPLAY_MODE_UNSPECIFIED indicates an unspecified resolver display mode. + """ + ALL = 1 """ RESOLVER_FIELD_DISPLAY_MODE_ALL instructs the UI to show all @@ -183,6 +225,10 @@ class TagMatcherFieldMode(aristaproto.Enum): """ UNSPECIFIED = 0 + """ + TAG_MATCHER_FIELD_MODE_UNSPECIFIED indicates an unspecified tag matcher mode. + """ + SINGLE_DEVICE_TAG = 1 """ TAG_MATCHER_FIELD_MODE_SINGLE_DEVICE_TAG allows devices to be @@ -208,62 +254,16 @@ class TagMatcherFieldMode(aristaproto.Enum): """ -class TopologyElement(aristaproto.Enum): - """ - TopologyElememt defines the fundamental types of elements in topology. - """ - - UNSPECIFIED = 0 - DEVICE = 1 - """TOPOLOGY_ELEMENT_DEVICE indicates a device.""" - - INTERFACE = 2 - """TOPOLOGY_ELEMENT_INTERFACE indicates an interface.""" - - CONNECTION = 3 - """TOPOLOGY_ELEMENT_CONNECTION indicates a connection.""" - - -class TopologyOperation(aristaproto.Enum): - """ - TopologyOperation defines the operations that may be performed on the topology. - """ - - UNSPECIFIED = 0 - ADDED = 1 - """TOPOLOGY_OPERATION_ADDED indicates addition of a TopologyElement.""" - - MODIFIED = 2 - """ - TOPOLOGY_OPERATION_MODIFIED indicates modification of a TopologyElement. - """ - - REMOVED = 3 - """TOPOLOGY_OPERATION_REMOVED indicates removal of a TopologyElement.""" - - -class TopologyUpdateStatus(aristaproto.Enum): +class AutofillProviderType(aristaproto.Enum): """ - TopologyUpdateStatus defines the set of statuses that apply to individual topology updates. + AutofillProviderType describes the set of possible provided argument types. """ UNSPECIFIED = 0 - NEW = 1 - """TOPOLOGY_UPDATE_STATUS_NEW indicates the update is new.""" - - ACCEPTED = 2 - """TOPOLOGY_UPDATE_STATUS_ACCEPTED indicates the update is accepted.""" - - IGNORED = 3 - """TOPOLOGY_UPDATE_STATUS_IGNORED indicates the update is ignored.""" - - -class AutofillProviderType(aristaproto.Enum): """ - AutofillProviderType describes the set of possible provided argument types. + AUTOFILL_PROVIDER_TYPE_UNSPECIFIED indicates that no provider type is specified. """ - UNSPECIFIED = 0 USER_SPECIFIED = 1 """ AUTOFILL_PROVIDER_TYPE_USER_SPECIFIED is when an argument is to be @@ -324,7 +324,12 @@ class StudioConfig(aristaproto.Message): display_name: Optional[str] = aristaproto.message_field( 3, wraps=aristaproto.TYPE_STRING ) - """display_name is the name of this studio as displayed on the UI.""" + """ + display_name is the name of this studio as displayed on the UI. + This and remaining fields are config fields, with workspace changes to be applied + on top of mainline. The corresponding `Studio` will be present + in the workspace only if the studio is modified (via this resource). + """ description: Optional[str] = aristaproto.message_field( 4, wraps=aristaproto.TYPE_STRING @@ -371,6 +376,51 @@ class StudioSummary(aristaproto.Message): schema and template cannot be modified. """ + entities: "Entities" = aristaproto.message_field(5) + """entities indicate all the entities of the studio.""" + + in_use: Optional[bool] = aristaproto.message_field(6, wraps=aristaproto.TYPE_BOOL) + """ + in_use indicates that the studio is in use, i.e. there are non-empty inputs, + and assigned to some devices, either in a given workspace, or in mainline. + """ + + +@dataclass(eq=False, repr=False) +class Entity(aristaproto.Message): + """Entity holds the basic information of an entity.""" + + entity_type: "EntityType" = aristaproto.enum_field(1) + """EntityType is the type of the entity.""" + + last_modified_at: datetime = aristaproto.message_field(2) + """last_modified_at is the time at which the entity was last modified.""" + + last_modified_by: Optional[str] = aristaproto.message_field( + 3, wraps=aristaproto.TYPE_STRING + ) + """ + last_modified_by is the name of the user that last modified the entity. + """ + + removed: Optional[bool] = aristaproto.message_field(4, wraps=aristaproto.TYPE_BOOL) + """removed indicates if the entity is removed.""" + + +@dataclass(eq=False, repr=False) +class Entities(aristaproto.Message): + """Entities is a list of Entity.""" + + values: Dict[str, "Entity"] = aristaproto.map_field( + 1, aristaproto.TYPE_STRING, aristaproto.TYPE_MESSAGE + ) + """ + values is a map from entity type name to entity + The possible keys to this map are ENTITY_TYPE_STUDIO, + ENTITY_TYPE_INPUTS, ENTITY_TYPE_ASSIGNED_TAGS, + ENTITY_TYPE_BUILD_HOOK and ENTITY_TYPE_AUTOFILL_ACTION. + """ + @dataclass(eq=False, repr=False) class Studio(aristaproto.Message): @@ -400,7 +450,12 @@ class Studio(aristaproto.Message): display_name: Optional[str] = aristaproto.message_field( 6, wraps=aristaproto.TYPE_STRING ) - """display_name is the name of this studio as displayed on the UI.""" + """ + display_name is the name of this studio as displayed on the UI. + This and remaining fields are config fields, with workspace changes applied on top of + mainline. This resource will be present in the workspace only if + the studio is modified (via the `StudioConfig` resource). + """ description: Optional[str] = aristaproto.message_field( 7, wraps=aristaproto.TYPE_STRING @@ -419,6 +474,14 @@ class Studio(aristaproto.Message): by `template`. """ + from_package: Optional[str] = aristaproto.message_field( + 11, wraps=aristaproto.TYPE_STRING + ) + """ + from_package indicates that this studio was created by a package, and can only be modified + by the packaging service. + """ + @dataclass(eq=False, repr=False) class AssignedTagsConfig(aristaproto.Message): @@ -1079,207 +1142,6 @@ class SecretInput(aristaproto.Message): """plain_text is the unmasked value of the secret.""" -@dataclass(eq=False, repr=False) -class DeviceInfo(aristaproto.Message): - """DeviceInfo contains device properties.""" - - device_id: Optional[str] = aristaproto.message_field( - 1, wraps=aristaproto.TYPE_STRING - ) - """device_id identifies the device uniquely.""" - - model_name: Optional[str] = aristaproto.message_field( - 2, wraps=aristaproto.TYPE_STRING - ) - """model_name indicates the model of the device.""" - - mac_address: "___fmp__.MacAddress" = aristaproto.message_field(3) - """mac_address indicates the MAC address of the device.""" - - hostname: Optional[str] = aristaproto.message_field( - 4, wraps=aristaproto.TYPE_STRING - ) - """hostname indicates the hostname of the device.""" - - interface_infos: "InterfaceInfos" = aristaproto.message_field(5) - """interfaces_infos contains a list of the device's interfaces.""" - - -@dataclass(eq=False, repr=False) -class InterfaceInfo(aristaproto.Message): - """InterfaceInfo contains interface properties.""" - - name: Optional[str] = aristaproto.message_field(1, wraps=aristaproto.TYPE_STRING) - """name is the name of an interface.""" - - neighbor_device_id: Optional[str] = aristaproto.message_field( - 2, wraps=aristaproto.TYPE_STRING - ) - """ - neighbor_device_id indicates the device ID of the neighbor to which - this interface is connected. - """ - - neighbor_interface_name: Optional[str] = aristaproto.message_field( - 3, wraps=aristaproto.TYPE_STRING - ) - """ - neighbor_device_name indicates the interface on the neighbor to which - this interface is connected. - """ - - topology_operation: "TopologyOperation" = aristaproto.enum_field(4) - """topology_operation indicates the type of operation to the interface.""" - - -@dataclass(eq=False, repr=False) -class InterfaceInfos(aristaproto.Message): - """InterfaceInfos is a list of InterfaceInfo.""" - - values: List["InterfaceInfo"] = aristaproto.message_field(1) - """values is a list of InterfaceInfo.""" - - -@dataclass(eq=False, repr=False) -class TopologyInputKey(aristaproto.Message): - """ - TopologyInputKey is the set of inputs that uniquely identify - the device for a workspace. - """ - - workspace_id: Optional[str] = aristaproto.message_field( - 1, wraps=aristaproto.TYPE_STRING - ) - """workspace_id identifies the workspace uniquely.""" - - device_id: Optional[str] = aristaproto.message_field( - 2, wraps=aristaproto.TYPE_STRING - ) - """device_id identifies the device uniquely.""" - - -@dataclass(eq=False, repr=False) -class TopologyInputConfig(aristaproto.Message): - """TopologyInputConfig is the desired topology input for a device.""" - - key: "TopologyInputKey" = aristaproto.message_field(1) - """key uniquely identifies the device ID for a given workspace.""" - - device_info: "DeviceInfo" = aristaproto.message_field(2) - """device_info contains device properties.""" - - -@dataclass(eq=False, repr=False) -class TopologyInput(aristaproto.Message): - """ - TopologyInput is the state of a mainline and accepted topology inputs. - """ - - key: "TopologyInputKey" = aristaproto.message_field(1) - """key uniquely identifies the device in a given workspace.""" - - device_info: "DeviceInfo" = aristaproto.message_field(2) - """device_info contains device properties.""" - - -@dataclass(eq=False, repr=False) -class TopologyUpdateKey(aristaproto.Message): - """TopologyUpdateKey uniquely identifies a workspace topology update.""" - - workspace_id: Optional[str] = aristaproto.message_field( - 1, wraps=aristaproto.TYPE_STRING - ) - """workspace_id identifies the workspace uniquely.""" - - update_id: Optional[str] = aristaproto.message_field( - 2, wraps=aristaproto.TYPE_STRING - ) - """update_id identifies the update uniquely.""" - - -@dataclass(eq=False, repr=False) -class TopologyUpdateConfig(aristaproto.Message): - """ - TopologyUpdateConfig contains the acceptance status of a TopologyUpdate. - """ - - key: "TopologyUpdateKey" = aristaproto.message_field(1) - """key uniquely identifies the update.""" - - status: "TopologyUpdateStatus" = aristaproto.enum_field(2) - """status indicates the status of the topology update.""" - - -@dataclass(eq=False, repr=False) -class TopologyUpdate(aristaproto.Message): - """TopologyUpdate represents an update on to the workspace.""" - - key: "TopologyUpdateKey" = aristaproto.message_field(1) - """key uniquely identifies the update.""" - - topology_element: "TopologyElement" = aristaproto.enum_field(2) - """topology_element indicates the type of a network element.""" - - topology_operation: "TopologyOperation" = aristaproto.enum_field(3) - """ - topology_operation indicates the type of operation on the topology update. - """ - - status: "TopologyUpdateStatus" = aristaproto.enum_field(4) - """status indicates the status of the topology update.""" - - description: Optional[str] = aristaproto.message_field( - 5, wraps=aristaproto.TYPE_STRING - ) - """description describes the topology update in short.""" - - -@dataclass(eq=False, repr=False) -class WorkspaceKey(aristaproto.Message): - """WorkspaceKey uniquely identifies the workspace.""" - - workspace_id: Optional[str] = aristaproto.message_field( - 1, wraps=aristaproto.TYPE_STRING - ) - """workspace_id identifies the workspace uniquely.""" - - -@dataclass(eq=False, repr=False) -class TopologyUpdateSyncConfig(aristaproto.Message): - """ - TopologyUpdateSyncConfig model represents a point in time all updates - are to be accepted. - """ - - key: "WorkspaceKey" = aristaproto.message_field(1) - """key uniquely identifies the workspace.""" - - sync_time: datetime = aristaproto.message_field(2) - """ - sync_time indicates the desired synchronization time with the live topology. - If the sync_time indicated in the config takes effect without error, - it will appear in the state model, and then all updates that occurred up to - and including the timestamp in the state model will be accepted. - """ - - -@dataclass(eq=False, repr=False) -class TopologyUpdateSync(aristaproto.Message): - """ - TopologyUpdateSync model represents the state of topology updates, - which consists of the time up to which updates are accepted. - """ - - key: "WorkspaceKey" = aristaproto.message_field(1) - """key uniquely identifies the workspace.""" - - sync_time: datetime = aristaproto.message_field(2) - """ - sync_time indicates the time up to which the live topology is synchronized. - All updates that happened up to this timestamp will be accepted. - """ - - @dataclass(eq=False, repr=False) class AutofillActionKey(aristaproto.Message): """AutofillActionKey identifies an autofill action.""" @@ -1416,6 +1278,9 @@ class AutofillArgumentProviders(aristaproto.Message): values: Dict[str, "AutofillArgumentProvider"] = aristaproto.map_field( 1, aristaproto.TYPE_STRING, aristaproto.TYPE_MESSAGE ) + """ + values is a map of dynamic argument name to argument provider information. + """ @dataclass(eq=False, repr=False) @@ -1443,6 +1308,27 @@ class AutofillArgumentProvider(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class MetaResponse(aristaproto.Message): + time: datetime = aristaproto.message_field(1) + """ + Time holds the timestamp of the last item included in the metadata calculation. + """ + + type: "__subscriptions__.Operation" = aristaproto.enum_field(2) + """ + Operation indicates how the value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + count: Optional[int] = aristaproto.message_field(3, wraps=aristaproto.TYPE_UINT32) + """ + Count is the number of items present under the conditions of the request. + """ + + @dataclass(eq=False, repr=False) class AssignedTagsRequest(aristaproto.Message): key: "StudioKey" = aristaproto.message_field(1) @@ -1475,6 +1361,35 @@ class AssignedTagsResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class AssignedTagsSomeRequest(aristaproto.Message): + keys: List["StudioKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class AssignedTagsSomeResponse(aristaproto.Message): + value: "AssignedTags" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + @dataclass(eq=False, repr=False) class AssignedTagsStreamRequest(aristaproto.Message): partial_eq_filter: List["AssignedTags"] = aristaproto.message_field(1) @@ -1528,17 +1443,68 @@ class AssignedTagsStreamResponse(aristaproto.Message): @dataclass(eq=False, repr=False) -class AssignedTagsConfigRequest(aristaproto.Message): - key: "StudioKey" = aristaproto.message_field(1) - """ - Key uniquely identifies a AssignedTagsConfig instance to retrieve. - This value must be populated. +class AssignedTagsBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["AssignedTags"] = aristaproto.message_field(1) """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. - time: datetime = aristaproto.message_field(2) - """ - Time indicates the time for which you are interested in the data. - If no time is given, the server will use the time at which it makes the request. + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each AssignedTags at end. + * Each AssignedTags response is fully-specified (all fields set). + * start: Returns the state of each AssignedTags at start, followed by updates until now. + * Each AssignedTags response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each AssignedTags at start, followed by updates + until end. + * Each AssignedTags response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class AssignedTagsBatchedStreamResponse(aristaproto.Message): + responses: List["AssignedTagsStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + +@dataclass(eq=False, repr=False) +class AssignedTagsConfigRequest(aristaproto.Message): + key: "StudioKey" = aristaproto.message_field(1) + """ + Key uniquely identifies a AssignedTagsConfig instance to retrieve. + This value must be populated. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. """ @@ -1559,6 +1525,35 @@ class AssignedTagsConfigResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class AssignedTagsConfigSomeRequest(aristaproto.Message): + keys: List["StudioKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class AssignedTagsConfigSomeResponse(aristaproto.Message): + value: "AssignedTagsConfig" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + @dataclass(eq=False, repr=False) class AssignedTagsConfigStreamRequest(aristaproto.Message): partial_eq_filter: List["AssignedTagsConfig"] = aristaproto.message_field(1) @@ -1613,6 +1608,57 @@ class AssignedTagsConfigStreamResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class AssignedTagsConfigBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["AssignedTagsConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each AssignedTagsConfig at end. + * Each AssignedTagsConfig response is fully-specified (all fields set). + * start: Returns the state of each AssignedTagsConfig at start, followed by updates until now. + * Each AssignedTagsConfig response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each AssignedTagsConfig at start, followed by updates + until end. + * Each AssignedTagsConfig response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class AssignedTagsConfigBatchedStreamResponse(aristaproto.Message): + responses: List["AssignedTagsConfigStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + @dataclass(eq=False, repr=False) class AssignedTagsConfigSetRequest(aristaproto.Message): value: "AssignedTagsConfig" = aristaproto.message_field(1) @@ -1683,15 +1729,39 @@ class AssignedTagsConfigDeleteResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class AssignedTagsConfigDeleteSomeRequest(aristaproto.Message): + keys: List["StudioKey"] = aristaproto.message_field(1) + """key contains a list of AssignedTagsConfig keys to delete""" + + +@dataclass(eq=False, repr=False) +class AssignedTagsConfigDeleteSomeResponse(aristaproto.Message): + """ + AssignedTagsConfigDeleteSomeResponse is only sent when there is an error. + """ + + key: "StudioKey" = aristaproto.message_field(1) + error: str = aristaproto.string_field(2) + + @dataclass(eq=False, repr=False) class AssignedTagsConfigDeleteAllRequest(aristaproto.Message): - pass + partial_eq_filter: List["AssignedTagsConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a DeleteAll. + This requires all provided fields to be equal to the response. + A filtered DeleteAll will use GetAll with filter to find things to delete. + """ @dataclass(eq=False, repr=False) class AssignedTagsConfigDeleteAllResponse(aristaproto.Message): type: "___fmp__.DeleteError" = aristaproto.enum_field(1) - """This describes the class of delete error.""" + """ + This describes the class of delete error. + A DeleteAllResponse is only sent when there is an error. + """ error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) """This indicates the error message from the delete failure.""" @@ -1737,6 +1807,35 @@ class AutofillActionResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class AutofillActionSomeRequest(aristaproto.Message): + keys: List["AutofillActionKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class AutofillActionSomeResponse(aristaproto.Message): + value: "AutofillAction" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + @dataclass(eq=False, repr=False) class AutofillActionStreamRequest(aristaproto.Message): partial_eq_filter: List["AutofillAction"] = aristaproto.message_field(1) @@ -1789,6 +1888,57 @@ class AutofillActionStreamResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class AutofillActionBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["AutofillAction"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each AutofillAction at end. + * Each AutofillAction response is fully-specified (all fields set). + * start: Returns the state of each AutofillAction at start, followed by updates until now. + * Each AutofillAction response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each AutofillAction at start, followed by updates + until end. + * Each AutofillAction response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class AutofillActionBatchedStreamResponse(aristaproto.Message): + responses: List["AutofillActionStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + @dataclass(eq=False, repr=False) class AutofillActionConfigRequest(aristaproto.Message): key: "AutofillActionKey" = aristaproto.message_field(1) @@ -1821,6 +1971,35 @@ class AutofillActionConfigResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class AutofillActionConfigSomeRequest(aristaproto.Message): + keys: List["AutofillActionKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class AutofillActionConfigSomeResponse(aristaproto.Message): + value: "AutofillActionConfig" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + @dataclass(eq=False, repr=False) class AutofillActionConfigStreamRequest(aristaproto.Message): partial_eq_filter: List["AutofillActionConfig"] = aristaproto.message_field(1) @@ -1875,6 +2054,57 @@ class AutofillActionConfigStreamResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class AutofillActionConfigBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["AutofillActionConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each AutofillActionConfig at end. + * Each AutofillActionConfig response is fully-specified (all fields set). + * start: Returns the state of each AutofillActionConfig at start, followed by updates until now. + * Each AutofillActionConfig response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each AutofillActionConfig at start, followed by updates + until end. + * Each AutofillActionConfig response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class AutofillActionConfigBatchedStreamResponse(aristaproto.Message): + responses: List["AutofillActionConfigStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + @dataclass(eq=False, repr=False) class AutofillActionConfigSetRequest(aristaproto.Message): value: "AutofillActionConfig" = aristaproto.message_field(1) @@ -1948,24 +2178,48 @@ class AutofillActionConfigDeleteResponse(aristaproto.Message): @dataclass(eq=False, repr=False) -class AutofillActionConfigDeleteAllRequest(aristaproto.Message): - pass +class AutofillActionConfigDeleteSomeRequest(aristaproto.Message): + keys: List["AutofillActionKey"] = aristaproto.message_field(1) + """key contains a list of AutofillActionConfig keys to delete""" @dataclass(eq=False, repr=False) -class AutofillActionConfigDeleteAllResponse(aristaproto.Message): - type: "___fmp__.DeleteError" = aristaproto.enum_field(1) - """This describes the class of delete error.""" - - error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) - """This indicates the error message from the delete failure.""" - - key: "AutofillActionKey" = aristaproto.message_field(3) +class AutofillActionConfigDeleteSomeResponse(aristaproto.Message): """ - This is the key of the AutofillActionConfig instance that failed to be deleted. + AutofillActionConfigDeleteSomeResponse is only sent when there is an error. """ - time: datetime = aristaproto.message_field(4) + key: "AutofillActionKey" = aristaproto.message_field(1) + error: str = aristaproto.string_field(2) + + +@dataclass(eq=False, repr=False) +class AutofillActionConfigDeleteAllRequest(aristaproto.Message): + partial_eq_filter: List["AutofillActionConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a DeleteAll. + This requires all provided fields to be equal to the response. + A filtered DeleteAll will use GetAll with filter to find things to delete. + """ + + +@dataclass(eq=False, repr=False) +class AutofillActionConfigDeleteAllResponse(aristaproto.Message): + type: "___fmp__.DeleteError" = aristaproto.enum_field(1) + """ + This describes the class of delete error. + A DeleteAllResponse is only sent when there is an error. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """This indicates the error message from the delete failure.""" + + key: "AutofillActionKey" = aristaproto.message_field(3) + """ + This is the key of the AutofillActionConfig instance that failed to be deleted. + """ + + time: datetime = aristaproto.message_field(4) """Time indicates the (UTC) timestamp when the key was being deleted.""" @@ -2001,6 +2255,35 @@ class InputsResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class InputsSomeRequest(aristaproto.Message): + keys: List["InputsKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class InputsSomeResponse(aristaproto.Message): + value: "Inputs" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + @dataclass(eq=False, repr=False) class InputsStreamRequest(aristaproto.Message): partial_eq_filter: List["Inputs"] = aristaproto.message_field(1) @@ -2053,6 +2336,57 @@ class InputsStreamResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class InputsBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["Inputs"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each Inputs at end. + * Each Inputs response is fully-specified (all fields set). + * start: Returns the state of each Inputs at start, followed by updates until now. + * Each Inputs response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each Inputs at start, followed by updates + until end. + * Each Inputs response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class InputsBatchedStreamResponse(aristaproto.Message): + responses: List["InputsStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + @dataclass(eq=False, repr=False) class InputsConfigRequest(aristaproto.Message): key: "InputsKey" = aristaproto.message_field(1) @@ -2085,6 +2419,35 @@ class InputsConfigResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class InputsConfigSomeRequest(aristaproto.Message): + keys: List["InputsKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class InputsConfigSomeResponse(aristaproto.Message): + value: "InputsConfig" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + @dataclass(eq=False, repr=False) class InputsConfigStreamRequest(aristaproto.Message): partial_eq_filter: List["InputsConfig"] = aristaproto.message_field(1) @@ -2137,6 +2500,57 @@ class InputsConfigStreamResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class InputsConfigBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["InputsConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each InputsConfig at end. + * Each InputsConfig response is fully-specified (all fields set). + * start: Returns the state of each InputsConfig at start, followed by updates until now. + * Each InputsConfig response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each InputsConfig at start, followed by updates + until end. + * Each InputsConfig response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class InputsConfigBatchedStreamResponse(aristaproto.Message): + responses: List["InputsConfigStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + @dataclass(eq=False, repr=False) class InputsConfigSetRequest(aristaproto.Message): value: "InputsConfig" = aristaproto.message_field(1) @@ -2207,15 +2621,37 @@ class InputsConfigDeleteResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class InputsConfigDeleteSomeRequest(aristaproto.Message): + keys: List["InputsKey"] = aristaproto.message_field(1) + """key contains a list of InputsConfig keys to delete""" + + +@dataclass(eq=False, repr=False) +class InputsConfigDeleteSomeResponse(aristaproto.Message): + """InputsConfigDeleteSomeResponse is only sent when there is an error.""" + + key: "InputsKey" = aristaproto.message_field(1) + error: str = aristaproto.string_field(2) + + @dataclass(eq=False, repr=False) class InputsConfigDeleteAllRequest(aristaproto.Message): - pass + partial_eq_filter: List["InputsConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a DeleteAll. + This requires all provided fields to be equal to the response. + A filtered DeleteAll will use GetAll with filter to find things to delete. + """ @dataclass(eq=False, repr=False) class InputsConfigDeleteAllResponse(aristaproto.Message): type: "___fmp__.DeleteError" = aristaproto.enum_field(1) - """This describes the class of delete error.""" + """ + This describes the class of delete error. + A DeleteAllResponse is only sent when there is an error. + """ error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) """This indicates the error message from the delete failure.""" @@ -2261,6 +2697,35 @@ class SecretInputResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class SecretInputSomeRequest(aristaproto.Message): + keys: List["InputsKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class SecretInputSomeResponse(aristaproto.Message): + value: "SecretInput" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + @dataclass(eq=False, repr=False) class SecretInputStreamRequest(aristaproto.Message): partial_eq_filter: List["SecretInput"] = aristaproto.message_field(1) @@ -2313,6 +2778,57 @@ class SecretInputStreamResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class SecretInputBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["SecretInput"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each SecretInput at end. + * Each SecretInput response is fully-specified (all fields set). + * start: Returns the state of each SecretInput at start, followed by updates until now. + * Each SecretInput response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each SecretInput at start, followed by updates + until end. + * Each SecretInput response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class SecretInputBatchedStreamResponse(aristaproto.Message): + responses: List["SecretInputStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + @dataclass(eq=False, repr=False) class StudioRequest(aristaproto.Message): key: "StudioKey" = aristaproto.message_field(1) @@ -2345,6 +2861,35 @@ class StudioResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class StudioSomeRequest(aristaproto.Message): + keys: List["StudioKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class StudioSomeResponse(aristaproto.Message): + value: "Studio" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + @dataclass(eq=False, repr=False) class StudioStreamRequest(aristaproto.Message): partial_eq_filter: List["Studio"] = aristaproto.message_field(1) @@ -2398,11 +2943,62 @@ class StudioStreamResponse(aristaproto.Message): @dataclass(eq=False, repr=False) -class StudioConfigRequest(aristaproto.Message): - key: "StudioKey" = aristaproto.message_field(1) +class StudioBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["Studio"] = aristaproto.message_field(1) """ - Key uniquely identifies a StudioConfig instance to retrieve. - This value must be populated. + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each Studio at end. + * Each Studio response is fully-specified (all fields set). + * start: Returns the state of each Studio at start, followed by updates until now. + * Each Studio response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each Studio at start, followed by updates + until end. + * Each Studio response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class StudioBatchedStreamResponse(aristaproto.Message): + responses: List["StudioStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + +@dataclass(eq=False, repr=False) +class StudioConfigRequest(aristaproto.Message): + key: "StudioKey" = aristaproto.message_field(1) + """ + Key uniquely identifies a StudioConfig instance to retrieve. + This value must be populated. """ time: datetime = aristaproto.message_field(2) @@ -2429,6 +3025,35 @@ class StudioConfigResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class StudioConfigSomeRequest(aristaproto.Message): + keys: List["StudioKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class StudioConfigSomeResponse(aristaproto.Message): + value: "StudioConfig" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + @dataclass(eq=False, repr=False) class StudioConfigStreamRequest(aristaproto.Message): partial_eq_filter: List["StudioConfig"] = aristaproto.message_field(1) @@ -2481,6 +3106,57 @@ class StudioConfigStreamResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class StudioConfigBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["StudioConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each StudioConfig at end. + * Each StudioConfig response is fully-specified (all fields set). + * start: Returns the state of each StudioConfig at start, followed by updates until now. + * Each StudioConfig response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each StudioConfig at start, followed by updates + until end. + * Each StudioConfig response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class StudioConfigBatchedStreamResponse(aristaproto.Message): + responses: List["StudioConfigStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + @dataclass(eq=False, repr=False) class StudioConfigSetRequest(aristaproto.Message): value: "StudioConfig" = aristaproto.message_field(1) @@ -2551,15 +3227,37 @@ class StudioConfigDeleteResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class StudioConfigDeleteSomeRequest(aristaproto.Message): + keys: List["StudioKey"] = aristaproto.message_field(1) + """key contains a list of StudioConfig keys to delete""" + + +@dataclass(eq=False, repr=False) +class StudioConfigDeleteSomeResponse(aristaproto.Message): + """StudioConfigDeleteSomeResponse is only sent when there is an error.""" + + key: "StudioKey" = aristaproto.message_field(1) + error: str = aristaproto.string_field(2) + + @dataclass(eq=False, repr=False) class StudioConfigDeleteAllRequest(aristaproto.Message): - pass + partial_eq_filter: List["StudioConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a DeleteAll. + This requires all provided fields to be equal to the response. + A filtered DeleteAll will use GetAll with filter to find things to delete. + """ @dataclass(eq=False, repr=False) class StudioConfigDeleteAllResponse(aristaproto.Message): type: "___fmp__.DeleteError" = aristaproto.enum_field(1) - """This describes the class of delete error.""" + """ + This describes the class of delete error. + A DeleteAllResponse is only sent when there is an error. + """ error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) """This indicates the error message from the delete failure.""" @@ -2606,65 +3304,8 @@ class StudioSummaryResponse(aristaproto.Message): @dataclass(eq=False, repr=False) -class StudioSummaryStreamRequest(aristaproto.Message): - partial_eq_filter: List["StudioSummary"] = aristaproto.message_field(1) - """ - PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. - This requires all provided fields to be equal to the response. - - While transparent to users, this field also allows services to optimize internal - subscriptions if filter(s) are sufficiently specific. - """ - - time: "__time__.TimeBounds" = aristaproto.message_field(3) - """ - TimeRange allows limiting response data to within a specified time window. - If this field is populated, at least one of the two time fields are required. - - For GetAll, the fields start and end can be used as follows: - - * end: Returns the state of each StudioSummary at end. - * Each StudioSummary response is fully-specified (all fields set). - * start: Returns the state of each StudioSummary at start, followed by updates until now. - * Each StudioSummary response at start is fully-specified, but updates may be partial. - * start and end: Returns the state of each StudioSummary at start, followed by updates - until end. - * Each StudioSummary response at start is fully-specified, but updates until end may - be partial. - - This field is not allowed in the Subscribe RPC. - """ - - -@dataclass(eq=False, repr=False) -class StudioSummaryStreamResponse(aristaproto.Message): - value: "StudioSummary" = aristaproto.message_field(1) - """ - Value is a value deemed relevant to the initiating request. - This structure will always have its key-field populated. Which other fields are - populated, and why, depends on the value of Operation and what triggered this notification. - """ - - time: datetime = aristaproto.message_field(2) - """Time holds the timestamp of this StudioSummary's last modification.""" - - type: "__subscriptions__.Operation" = aristaproto.enum_field(3) - """ - Operation indicates how the StudioSummary value in this response should be considered. - Under non-subscribe requests, this value should always be INITIAL. In a subscription, - once all initial data is streamed and the client begins to receive modification updates, - you should not see INITIAL again. - """ - - -@dataclass(eq=False, repr=False) -class TopologyInputRequest(aristaproto.Message): - key: "TopologyInputKey" = aristaproto.message_field(1) - """ - Key uniquely identifies a TopologyInput instance to retrieve. - This value must be populated. - """ - +class StudioSummarySomeRequest(aristaproto.Message): + keys: List["StudioKey"] = aristaproto.message_field(1) time: datetime = aristaproto.message_field(2) """ Time indicates the time for which you are interested in the data. @@ -2673,8 +3314,8 @@ class TopologyInputRequest(aristaproto.Message): @dataclass(eq=False, repr=False) -class TopologyInputResponse(aristaproto.Message): - value: "TopologyInput" = aristaproto.message_field(1) +class StudioSummarySomeResponse(aristaproto.Message): + value: "StudioSummary" = aristaproto.message_field(1) """ Value is the value requested. This structure will be fully-populated as it exists in the datastore. If @@ -2682,16 +3323,18 @@ class TopologyInputResponse(aristaproto.Message): set to default values. """ - time: datetime = aristaproto.message_field(2) + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) """ - Time carries the (UTC) timestamp of the last-modification of the - TopologyInput instance in this response. + Error is an optional field. + It should be filled when there is an error in the GetSome process. """ + time: datetime = aristaproto.message_field(3) + @dataclass(eq=False, repr=False) -class TopologyInputStreamRequest(aristaproto.Message): - partial_eq_filter: List["TopologyInput"] = aristaproto.message_field(1) +class StudioSummaryStreamRequest(aristaproto.Message): + partial_eq_filter: List["StudioSummary"] = aristaproto.message_field(1) """ PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. This requires all provided fields to be equal to the response. @@ -2707,13 +3350,13 @@ class TopologyInputStreamRequest(aristaproto.Message): For GetAll, the fields start and end can be used as follows: - * end: Returns the state of each TopologyInput at end. - * Each TopologyInput response is fully-specified (all fields set). - * start: Returns the state of each TopologyInput at start, followed by updates until now. - * Each TopologyInput response at start is fully-specified, but updates may be partial. - * start and end: Returns the state of each TopologyInput at start, followed by updates + * end: Returns the state of each StudioSummary at end. + * Each StudioSummary response is fully-specified (all fields set). + * start: Returns the state of each StudioSummary at start, followed by updates until now. + * Each StudioSummary response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each StudioSummary at start, followed by updates until end. - * Each TopologyInput response at start is fully-specified, but updates until end may + * Each StudioSummary response at start is fully-specified, but updates until end may be partial. This field is not allowed in the Subscribe RPC. @@ -2721,8 +3364,8 @@ class TopologyInputStreamRequest(aristaproto.Message): @dataclass(eq=False, repr=False) -class TopologyInputStreamResponse(aristaproto.Message): - value: "TopologyInput" = aristaproto.message_field(1) +class StudioSummaryStreamResponse(aristaproto.Message): + value: "StudioSummary" = aristaproto.message_field(1) """ Value is a value deemed relevant to the initiating request. This structure will always have its key-field populated. Which other fields are @@ -2730,11 +3373,11 @@ class TopologyInputStreamResponse(aristaproto.Message): """ time: datetime = aristaproto.message_field(2) - """Time holds the timestamp of this TopologyInput's last modification.""" + """Time holds the timestamp of this StudioSummary's last modification.""" type: "__subscriptions__.Operation" = aristaproto.enum_field(3) """ - Operation indicates how the TopologyInput value in this response should be considered. + Operation indicates how the StudioSummary value in this response should be considered. Under non-subscribe requests, this value should always be INITIAL. In a subscription, once all initial data is streamed and the client begins to receive modification updates, you should not see INITIAL again. @@ -2742,40 +3385,8 @@ class TopologyInputStreamResponse(aristaproto.Message): @dataclass(eq=False, repr=False) -class TopologyInputConfigRequest(aristaproto.Message): - key: "TopologyInputKey" = aristaproto.message_field(1) - """ - Key uniquely identifies a TopologyInputConfig instance to retrieve. - This value must be populated. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the time for which you are interested in the data. - If no time is given, the server will use the time at which it makes the request. - """ - - -@dataclass(eq=False, repr=False) -class TopologyInputConfigResponse(aristaproto.Message): - value: "TopologyInputConfig" = aristaproto.message_field(1) - """ - Value is the value requested. - This structure will be fully-populated as it exists in the datastore. If - optional fields were not given at creation, these fields will be empty or - set to default values. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time carries the (UTC) timestamp of the last-modification of the - TopologyInputConfig instance in this response. - """ - - -@dataclass(eq=False, repr=False) -class TopologyInputConfigStreamRequest(aristaproto.Message): - partial_eq_filter: List["TopologyInputConfig"] = aristaproto.message_field(1) +class StudioSummaryBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["StudioSummary"] = aristaproto.message_field(1) """ PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. This requires all provided fields to be equal to the response. @@ -2791,712 +3402,176 @@ class TopologyInputConfigStreamRequest(aristaproto.Message): For GetAll, the fields start and end can be used as follows: - * end: Returns the state of each TopologyInputConfig at end. - * Each TopologyInputConfig response is fully-specified (all fields set). - * start: Returns the state of each TopologyInputConfig at start, followed by updates until now. - * Each TopologyInputConfig response at start is fully-specified, but updates may be partial. - * start and end: Returns the state of each TopologyInputConfig at start, followed by updates + * end: Returns the state of each StudioSummary at end. + * Each StudioSummary response is fully-specified (all fields set). + * start: Returns the state of each StudioSummary at start, followed by updates until now. + * Each StudioSummary response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each StudioSummary at start, followed by updates until end. - * Each TopologyInputConfig response at start is fully-specified, but updates until end may + * Each StudioSummary response at start is fully-specified, but updates until end may be partial. This field is not allowed in the Subscribe RPC. """ - -@dataclass(eq=False, repr=False) -class TopologyInputConfigStreamResponse(aristaproto.Message): - value: "TopologyInputConfig" = aristaproto.message_field(1) - """ - Value is a value deemed relevant to the initiating request. - This structure will always have its key-field populated. Which other fields are - populated, and why, depends on the value of Operation and what triggered this notification. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time holds the timestamp of this TopologyInputConfig's last modification. - """ - - type: "__subscriptions__.Operation" = aristaproto.enum_field(3) - """ - Operation indicates how the TopologyInputConfig value in this response should be considered. - Under non-subscribe requests, this value should always be INITIAL. In a subscription, - once all initial data is streamed and the client begins to receive modification updates, - you should not see INITIAL again. - """ - - -@dataclass(eq=False, repr=False) -class TopologyInputConfigSetRequest(aristaproto.Message): - value: "TopologyInputConfig" = aristaproto.message_field(1) + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) """ - TopologyInputConfig carries the value to set into the datastore. - See the documentation on the TopologyInputConfig struct for which fields are required. + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. """ @dataclass(eq=False, repr=False) -class TopologyInputConfigSetResponse(aristaproto.Message): - value: "TopologyInputConfig" = aristaproto.message_field(1) - """ - Value carries all the values given in the TopologyInputConfigSetRequest as well - as any server-generated values. +class StudioSummaryBatchedStreamResponse(aristaproto.Message): + responses: List["StudioSummaryStreamResponse"] = aristaproto.message_field(1) """ - - time: datetime = aristaproto.message_field(2) + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). """ - Time indicates the (UTC) timestamp at which the system recognizes the - creation. The only guarantees made about this timestamp are: - - it is after the time the request was received - - a time-ranged query with StartTime==CreatedAt will include this instance. - """ +class AssignedTagsServiceStub(aristaproto.ServiceStub): + async def get_one( + self, + assigned_tags_request: "AssignedTagsRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "AssignedTagsResponse": + return await self._unary_unary( + "/arista.studio.v1.AssignedTagsService/GetOne", + assigned_tags_request, + AssignedTagsResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) -@dataclass(eq=False, repr=False) -class TopologyInputConfigSetSomeRequest(aristaproto.Message): - values: List["TopologyInputConfig"] = aristaproto.message_field(1) - """ - value contains a list of TopologyInputConfig values to write. - It is possible to provide more values than can fit within either: - - the maxiumum send size of the client - - the maximum receive size of the server - If this error occurs you must reduce the number of values sent. - See gRPC "maximum message size" documentation for more information. - """ - - -@dataclass(eq=False, repr=False) -class TopologyInputConfigSetSomeResponse(aristaproto.Message): - key: "TopologyInputKey" = aristaproto.message_field(1) - error: str = aristaproto.string_field(2) - - -@dataclass(eq=False, repr=False) -class TopologyInputConfigDeleteRequest(aristaproto.Message): - key: "TopologyInputKey" = aristaproto.message_field(1) - """ - Key indicates which TopologyInputConfig instance to remove. - This field must always be set. - """ - - -@dataclass(eq=False, repr=False) -class TopologyInputConfigDeleteResponse(aristaproto.Message): - key: "TopologyInputKey" = aristaproto.message_field(1) - """Key echoes back the key of the deleted TopologyInputConfig instance.""" - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the (UTC) timestamp at which the system recognizes the - deletion. The only guarantees made about this timestamp are: - - - it is after the time the request was received - - a time-ranged query with StartTime==DeletedAt will not include this instance. - """ - - -@dataclass(eq=False, repr=False) -class TopologyInputConfigDeleteAllRequest(aristaproto.Message): - pass - - -@dataclass(eq=False, repr=False) -class TopologyInputConfigDeleteAllResponse(aristaproto.Message): - type: "___fmp__.DeleteError" = aristaproto.enum_field(1) - """This describes the class of delete error.""" - - error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) - """This indicates the error message from the delete failure.""" - - key: "TopologyInputKey" = aristaproto.message_field(3) - """ - This is the key of the TopologyInputConfig instance that failed to be deleted. - """ - - time: datetime = aristaproto.message_field(4) - """Time indicates the (UTC) timestamp when the key was being deleted.""" - - -@dataclass(eq=False, repr=False) -class TopologyUpdateRequest(aristaproto.Message): - key: "TopologyUpdateKey" = aristaproto.message_field(1) - """ - Key uniquely identifies a TopologyUpdate instance to retrieve. - This value must be populated. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the time for which you are interested in the data. - If no time is given, the server will use the time at which it makes the request. - """ - - -@dataclass(eq=False, repr=False) -class TopologyUpdateResponse(aristaproto.Message): - value: "TopologyUpdate" = aristaproto.message_field(1) - """ - Value is the value requested. - This structure will be fully-populated as it exists in the datastore. If - optional fields were not given at creation, these fields will be empty or - set to default values. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time carries the (UTC) timestamp of the last-modification of the - TopologyUpdate instance in this response. - """ - - -@dataclass(eq=False, repr=False) -class TopologyUpdateStreamRequest(aristaproto.Message): - partial_eq_filter: List["TopologyUpdate"] = aristaproto.message_field(1) - """ - PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. - This requires all provided fields to be equal to the response. - - While transparent to users, this field also allows services to optimize internal - subscriptions if filter(s) are sufficiently specific. - """ - - time: "__time__.TimeBounds" = aristaproto.message_field(3) - """ - TimeRange allows limiting response data to within a specified time window. - If this field is populated, at least one of the two time fields are required. - - For GetAll, the fields start and end can be used as follows: - - * end: Returns the state of each TopologyUpdate at end. - * Each TopologyUpdate response is fully-specified (all fields set). - * start: Returns the state of each TopologyUpdate at start, followed by updates until now. - * Each TopologyUpdate response at start is fully-specified, but updates may be partial. - * start and end: Returns the state of each TopologyUpdate at start, followed by updates - until end. - * Each TopologyUpdate response at start is fully-specified, but updates until end may - be partial. - - This field is not allowed in the Subscribe RPC. - """ - - -@dataclass(eq=False, repr=False) -class TopologyUpdateStreamResponse(aristaproto.Message): - value: "TopologyUpdate" = aristaproto.message_field(1) - """ - Value is a value deemed relevant to the initiating request. - This structure will always have its key-field populated. Which other fields are - populated, and why, depends on the value of Operation and what triggered this notification. - """ - - time: datetime = aristaproto.message_field(2) - """Time holds the timestamp of this TopologyUpdate's last modification.""" - - type: "__subscriptions__.Operation" = aristaproto.enum_field(3) - """ - Operation indicates how the TopologyUpdate value in this response should be considered. - Under non-subscribe requests, this value should always be INITIAL. In a subscription, - once all initial data is streamed and the client begins to receive modification updates, - you should not see INITIAL again. - """ - - -@dataclass(eq=False, repr=False) -class TopologyUpdateConfigRequest(aristaproto.Message): - key: "TopologyUpdateKey" = aristaproto.message_field(1) - """ - Key uniquely identifies a TopologyUpdateConfig instance to retrieve. - This value must be populated. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the time for which you are interested in the data. - If no time is given, the server will use the time at which it makes the request. - """ - - -@dataclass(eq=False, repr=False) -class TopologyUpdateConfigResponse(aristaproto.Message): - value: "TopologyUpdateConfig" = aristaproto.message_field(1) - """ - Value is the value requested. - This structure will be fully-populated as it exists in the datastore. If - optional fields were not given at creation, these fields will be empty or - set to default values. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time carries the (UTC) timestamp of the last-modification of the - TopologyUpdateConfig instance in this response. - """ - - -@dataclass(eq=False, repr=False) -class TopologyUpdateConfigStreamRequest(aristaproto.Message): - partial_eq_filter: List["TopologyUpdateConfig"] = aristaproto.message_field(1) - """ - PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. - This requires all provided fields to be equal to the response. - - While transparent to users, this field also allows services to optimize internal - subscriptions if filter(s) are sufficiently specific. - """ - - time: "__time__.TimeBounds" = aristaproto.message_field(3) - """ - TimeRange allows limiting response data to within a specified time window. - If this field is populated, at least one of the two time fields are required. - - For GetAll, the fields start and end can be used as follows: - - * end: Returns the state of each TopologyUpdateConfig at end. - * Each TopologyUpdateConfig response is fully-specified (all fields set). - * start: Returns the state of each TopologyUpdateConfig at start, followed by updates until now. - * Each TopologyUpdateConfig response at start is fully-specified, but updates may be partial. - * start and end: Returns the state of each TopologyUpdateConfig at start, followed by updates - until end. - * Each TopologyUpdateConfig response at start is fully-specified, but updates until end may - be partial. - - This field is not allowed in the Subscribe RPC. - """ - - -@dataclass(eq=False, repr=False) -class TopologyUpdateConfigStreamResponse(aristaproto.Message): - value: "TopologyUpdateConfig" = aristaproto.message_field(1) - """ - Value is a value deemed relevant to the initiating request. - This structure will always have its key-field populated. Which other fields are - populated, and why, depends on the value of Operation and what triggered this notification. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time holds the timestamp of this TopologyUpdateConfig's last modification. - """ - - type: "__subscriptions__.Operation" = aristaproto.enum_field(3) - """ - Operation indicates how the TopologyUpdateConfig value in this response should be considered. - Under non-subscribe requests, this value should always be INITIAL. In a subscription, - once all initial data is streamed and the client begins to receive modification updates, - you should not see INITIAL again. - """ - - -@dataclass(eq=False, repr=False) -class TopologyUpdateConfigSetRequest(aristaproto.Message): - value: "TopologyUpdateConfig" = aristaproto.message_field(1) - """ - TopologyUpdateConfig carries the value to set into the datastore. - See the documentation on the TopologyUpdateConfig struct for which fields are required. - """ - - -@dataclass(eq=False, repr=False) -class TopologyUpdateConfigSetResponse(aristaproto.Message): - value: "TopologyUpdateConfig" = aristaproto.message_field(1) - """ - Value carries all the values given in the TopologyUpdateConfigSetRequest as well - as any server-generated values. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the (UTC) timestamp at which the system recognizes the - creation. The only guarantees made about this timestamp are: - - - it is after the time the request was received - - a time-ranged query with StartTime==CreatedAt will include this instance. - """ - - -@dataclass(eq=False, repr=False) -class TopologyUpdateConfigSetSomeRequest(aristaproto.Message): - values: List["TopologyUpdateConfig"] = aristaproto.message_field(1) - """ - value contains a list of TopologyUpdateConfig values to write. - It is possible to provide more values than can fit within either: - - the maxiumum send size of the client - - the maximum receive size of the server - If this error occurs you must reduce the number of values sent. - See gRPC "maximum message size" documentation for more information. - """ - - -@dataclass(eq=False, repr=False) -class TopologyUpdateConfigSetSomeResponse(aristaproto.Message): - key: "TopologyUpdateKey" = aristaproto.message_field(1) - error: str = aristaproto.string_field(2) - - -@dataclass(eq=False, repr=False) -class TopologyUpdateConfigDeleteRequest(aristaproto.Message): - key: "TopologyUpdateKey" = aristaproto.message_field(1) - """ - Key indicates which TopologyUpdateConfig instance to remove. - This field must always be set. - """ - - -@dataclass(eq=False, repr=False) -class TopologyUpdateConfigDeleteResponse(aristaproto.Message): - key: "TopologyUpdateKey" = aristaproto.message_field(1) - """ - Key echoes back the key of the deleted TopologyUpdateConfig instance. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the (UTC) timestamp at which the system recognizes the - deletion. The only guarantees made about this timestamp are: - - - it is after the time the request was received - - a time-ranged query with StartTime==DeletedAt will not include this instance. - """ - - -@dataclass(eq=False, repr=False) -class TopologyUpdateConfigDeleteAllRequest(aristaproto.Message): - pass - - -@dataclass(eq=False, repr=False) -class TopologyUpdateConfigDeleteAllResponse(aristaproto.Message): - type: "___fmp__.DeleteError" = aristaproto.enum_field(1) - """This describes the class of delete error.""" - - error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) - """This indicates the error message from the delete failure.""" - - key: "TopologyUpdateKey" = aristaproto.message_field(3) - """ - This is the key of the TopologyUpdateConfig instance that failed to be deleted. - """ - - time: datetime = aristaproto.message_field(4) - """Time indicates the (UTC) timestamp when the key was being deleted.""" - - -@dataclass(eq=False, repr=False) -class TopologyUpdateSyncRequest(aristaproto.Message): - key: "WorkspaceKey" = aristaproto.message_field(1) - """ - Key uniquely identifies a TopologyUpdateSync instance to retrieve. - This value must be populated. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the time for which you are interested in the data. - If no time is given, the server will use the time at which it makes the request. - """ - - -@dataclass(eq=False, repr=False) -class TopologyUpdateSyncResponse(aristaproto.Message): - value: "TopologyUpdateSync" = aristaproto.message_field(1) - """ - Value is the value requested. - This structure will be fully-populated as it exists in the datastore. If - optional fields were not given at creation, these fields will be empty or - set to default values. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time carries the (UTC) timestamp of the last-modification of the - TopologyUpdateSync instance in this response. - """ - - -@dataclass(eq=False, repr=False) -class TopologyUpdateSyncStreamRequest(aristaproto.Message): - partial_eq_filter: List["TopologyUpdateSync"] = aristaproto.message_field(1) - """ - PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. - This requires all provided fields to be equal to the response. - - While transparent to users, this field also allows services to optimize internal - subscriptions if filter(s) are sufficiently specific. - """ - - time: "__time__.TimeBounds" = aristaproto.message_field(3) - """ - TimeRange allows limiting response data to within a specified time window. - If this field is populated, at least one of the two time fields are required. - - For GetAll, the fields start and end can be used as follows: - - * end: Returns the state of each TopologyUpdateSync at end. - * Each TopologyUpdateSync response is fully-specified (all fields set). - * start: Returns the state of each TopologyUpdateSync at start, followed by updates until now. - * Each TopologyUpdateSync response at start is fully-specified, but updates may be partial. - * start and end: Returns the state of each TopologyUpdateSync at start, followed by updates - until end. - * Each TopologyUpdateSync response at start is fully-specified, but updates until end may - be partial. - - This field is not allowed in the Subscribe RPC. - """ - - -@dataclass(eq=False, repr=False) -class TopologyUpdateSyncStreamResponse(aristaproto.Message): - value: "TopologyUpdateSync" = aristaproto.message_field(1) - """ - Value is a value deemed relevant to the initiating request. - This structure will always have its key-field populated. Which other fields are - populated, and why, depends on the value of Operation and what triggered this notification. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time holds the timestamp of this TopologyUpdateSync's last modification. - """ - - type: "__subscriptions__.Operation" = aristaproto.enum_field(3) - """ - Operation indicates how the TopologyUpdateSync value in this response should be considered. - Under non-subscribe requests, this value should always be INITIAL. In a subscription, - once all initial data is streamed and the client begins to receive modification updates, - you should not see INITIAL again. - """ - - -@dataclass(eq=False, repr=False) -class TopologyUpdateSyncConfigRequest(aristaproto.Message): - key: "WorkspaceKey" = aristaproto.message_field(1) - """ - Key uniquely identifies a TopologyUpdateSyncConfig instance to retrieve. - This value must be populated. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the time for which you are interested in the data. - If no time is given, the server will use the time at which it makes the request. - """ - - -@dataclass(eq=False, repr=False) -class TopologyUpdateSyncConfigResponse(aristaproto.Message): - value: "TopologyUpdateSyncConfig" = aristaproto.message_field(1) - """ - Value is the value requested. - This structure will be fully-populated as it exists in the datastore. If - optional fields were not given at creation, these fields will be empty or - set to default values. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time carries the (UTC) timestamp of the last-modification of the - TopologyUpdateSyncConfig instance in this response. - """ - - -@dataclass(eq=False, repr=False) -class TopologyUpdateSyncConfigStreamRequest(aristaproto.Message): - partial_eq_filter: List["TopologyUpdateSyncConfig"] = aristaproto.message_field(1) - """ - PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. - This requires all provided fields to be equal to the response. - - While transparent to users, this field also allows services to optimize internal - subscriptions if filter(s) are sufficiently specific. - """ - - time: "__time__.TimeBounds" = aristaproto.message_field(3) - """ - TimeRange allows limiting response data to within a specified time window. - If this field is populated, at least one of the two time fields are required. - - For GetAll, the fields start and end can be used as follows: - - * end: Returns the state of each TopologyUpdateSyncConfig at end. - * Each TopologyUpdateSyncConfig response is fully-specified (all fields set). - * start: Returns the state of each TopologyUpdateSyncConfig at start, followed by updates until now. - * Each TopologyUpdateSyncConfig response at start is fully-specified, but updates may be partial. - * start and end: Returns the state of each TopologyUpdateSyncConfig at start, followed by updates - until end. - * Each TopologyUpdateSyncConfig response at start is fully-specified, but updates until end may - be partial. - - This field is not allowed in the Subscribe RPC. - """ - - -@dataclass(eq=False, repr=False) -class TopologyUpdateSyncConfigStreamResponse(aristaproto.Message): - value: "TopologyUpdateSyncConfig" = aristaproto.message_field(1) - """ - Value is a value deemed relevant to the initiating request. - This structure will always have its key-field populated. Which other fields are - populated, and why, depends on the value of Operation and what triggered this notification. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time holds the timestamp of this TopologyUpdateSyncConfig's last modification. - """ - - type: "__subscriptions__.Operation" = aristaproto.enum_field(3) - """ - Operation indicates how the TopologyUpdateSyncConfig value in this response should be considered. - Under non-subscribe requests, this value should always be INITIAL. In a subscription, - once all initial data is streamed and the client begins to receive modification updates, - you should not see INITIAL again. - """ - - -@dataclass(eq=False, repr=False) -class TopologyUpdateSyncConfigSetRequest(aristaproto.Message): - value: "TopologyUpdateSyncConfig" = aristaproto.message_field(1) - """ - TopologyUpdateSyncConfig carries the value to set into the datastore. - See the documentation on the TopologyUpdateSyncConfig struct for which fields are required. - """ - - -@dataclass(eq=False, repr=False) -class TopologyUpdateSyncConfigSetResponse(aristaproto.Message): - value: "TopologyUpdateSyncConfig" = aristaproto.message_field(1) - """ - Value carries all the values given in the TopologyUpdateSyncConfigSetRequest as well - as any server-generated values. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the (UTC) timestamp at which the system recognizes the - creation. The only guarantees made about this timestamp are: - - - it is after the time the request was received - - a time-ranged query with StartTime==CreatedAt will include this instance. - """ - - -@dataclass(eq=False, repr=False) -class TopologyUpdateSyncConfigSetSomeRequest(aristaproto.Message): - values: List["TopologyUpdateSyncConfig"] = aristaproto.message_field(1) - """ - value contains a list of TopologyUpdateSyncConfig values to write. - It is possible to provide more values than can fit within either: - - the maxiumum send size of the client - - the maximum receive size of the server - If this error occurs you must reduce the number of values sent. - See gRPC "maximum message size" documentation for more information. - """ - - -@dataclass(eq=False, repr=False) -class TopologyUpdateSyncConfigSetSomeResponse(aristaproto.Message): - key: "WorkspaceKey" = aristaproto.message_field(1) - error: str = aristaproto.string_field(2) - - -@dataclass(eq=False, repr=False) -class TopologyUpdateSyncConfigDeleteRequest(aristaproto.Message): - key: "WorkspaceKey" = aristaproto.message_field(1) - """ - Key indicates which TopologyUpdateSyncConfig instance to remove. - This field must always be set. - """ - - -@dataclass(eq=False, repr=False) -class TopologyUpdateSyncConfigDeleteResponse(aristaproto.Message): - key: "WorkspaceKey" = aristaproto.message_field(1) - """ - Key echoes back the key of the deleted TopologyUpdateSyncConfig instance. - """ - - time: datetime = aristaproto.message_field(2) - """ - Time indicates the (UTC) timestamp at which the system recognizes the - deletion. The only guarantees made about this timestamp are: - - - it is after the time the request was received - - a time-ranged query with StartTime==DeletedAt will not include this instance. - """ - - -@dataclass(eq=False, repr=False) -class TopologyUpdateSyncConfigDeleteAllRequest(aristaproto.Message): - pass - - -@dataclass(eq=False, repr=False) -class TopologyUpdateSyncConfigDeleteAllResponse(aristaproto.Message): - type: "___fmp__.DeleteError" = aristaproto.enum_field(1) - """This describes the class of delete error.""" - - error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) - """This indicates the error message from the delete failure.""" - - key: "WorkspaceKey" = aristaproto.message_field(3) - """ - This is the key of the TopologyUpdateSyncConfig instance that failed to be deleted. - """ + async def get_some( + self, + assigned_tags_some_request: "AssignedTagsSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["AssignedTagsSomeResponse"]: + async for response in self._unary_stream( + "/arista.studio.v1.AssignedTagsService/GetSome", + assigned_tags_some_request, + AssignedTagsSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response - time: datetime = aristaproto.message_field(4) - """Time indicates the (UTC) timestamp when the key was being deleted.""" + async def get_all( + self, + assigned_tags_stream_request: "AssignedTagsStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["AssignedTagsStreamResponse"]: + async for response in self._unary_stream( + "/arista.studio.v1.AssignedTagsService/GetAll", + assigned_tags_stream_request, + AssignedTagsStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def subscribe( + self, + assigned_tags_stream_request: "AssignedTagsStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["AssignedTagsStreamResponse"]: + async for response in self._unary_stream( + "/arista.studio.v1.AssignedTagsService/Subscribe", + assigned_tags_stream_request, + AssignedTagsStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response -class AssignedTagsServiceStub(aristaproto.ServiceStub): - async def get_one( + async def get_meta( self, - assigned_tags_request: "AssignedTagsRequest", + assigned_tags_stream_request: "AssignedTagsStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> "AssignedTagsResponse": + ) -> "MetaResponse": return await self._unary_unary( - "/arista.studio.v1.AssignedTagsService/GetOne", - assigned_tags_request, - AssignedTagsResponse, + "/arista.studio.v1.AssignedTagsService/GetMeta", + assigned_tags_stream_request, + MetaResponse, timeout=timeout, deadline=deadline, metadata=metadata, ) - async def get_all( + async def subscribe_meta( self, assigned_tags_stream_request: "AssignedTagsStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["AssignedTagsStreamResponse"]: + ) -> AsyncIterator["MetaResponse"]: async for response in self._unary_stream( - "/arista.studio.v1.AssignedTagsService/GetAll", + "/arista.studio.v1.AssignedTagsService/SubscribeMeta", assigned_tags_stream_request, - AssignedTagsStreamResponse, + MetaResponse, timeout=timeout, deadline=deadline, metadata=metadata, ): yield response - async def subscribe( + async def get_all_batched( self, - assigned_tags_stream_request: "AssignedTagsStreamRequest", + assigned_tags_batched_stream_request: "AssignedTagsBatchedStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["AssignedTagsStreamResponse"]: + ) -> AsyncIterator["AssignedTagsBatchedStreamResponse"]: async for response in self._unary_stream( - "/arista.studio.v1.AssignedTagsService/Subscribe", - assigned_tags_stream_request, - AssignedTagsStreamResponse, + "/arista.studio.v1.AssignedTagsService/GetAllBatched", + assigned_tags_batched_stream_request, + AssignedTagsBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + assigned_tags_batched_stream_request: "AssignedTagsBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["AssignedTagsBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.studio.v1.AssignedTagsService/SubscribeBatched", + assigned_tags_batched_stream_request, + AssignedTagsBatchedStreamResponse, timeout=timeout, deadline=deadline, metadata=metadata, @@ -3522,6 +3597,24 @@ async def get_one( metadata=metadata, ) + async def get_some( + self, + assigned_tags_config_some_request: "AssignedTagsConfigSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["AssignedTagsConfigSomeResponse"]: + async for response in self._unary_stream( + "/arista.studio.v1.AssignedTagsConfigService/GetSome", + assigned_tags_config_some_request, + AssignedTagsConfigSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def get_all( self, assigned_tags_config_stream_request: "AssignedTagsConfigStreamRequest", @@ -3558,6 +3651,41 @@ async def subscribe( ): yield response + async def get_meta( + self, + assigned_tags_config_stream_request: "AssignedTagsConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.studio.v1.AssignedTagsConfigService/GetMeta", + assigned_tags_config_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + assigned_tags_config_stream_request: "AssignedTagsConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.studio.v1.AssignedTagsConfigService/SubscribeMeta", + assigned_tags_config_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def set( self, assigned_tags_config_set_request: "AssignedTagsConfigSetRequest", @@ -3565,63 +3693,261 @@ async def set( timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> "AssignedTagsConfigSetResponse": + ) -> "AssignedTagsConfigSetResponse": + return await self._unary_unary( + "/arista.studio.v1.AssignedTagsConfigService/Set", + assigned_tags_config_set_request, + AssignedTagsConfigSetResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def set_some( + self, + assigned_tags_config_set_some_request: "AssignedTagsConfigSetSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["AssignedTagsConfigSetSomeResponse"]: + async for response in self._unary_stream( + "/arista.studio.v1.AssignedTagsConfigService/SetSome", + assigned_tags_config_set_some_request, + AssignedTagsConfigSetSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def delete( + self, + assigned_tags_config_delete_request: "AssignedTagsConfigDeleteRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "AssignedTagsConfigDeleteResponse": + return await self._unary_unary( + "/arista.studio.v1.AssignedTagsConfigService/Delete", + assigned_tags_config_delete_request, + AssignedTagsConfigDeleteResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def delete_some( + self, + assigned_tags_config_delete_some_request: "AssignedTagsConfigDeleteSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["AssignedTagsConfigDeleteSomeResponse"]: + async for response in self._unary_stream( + "/arista.studio.v1.AssignedTagsConfigService/DeleteSome", + assigned_tags_config_delete_some_request, + AssignedTagsConfigDeleteSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def delete_all( + self, + assigned_tags_config_delete_all_request: "AssignedTagsConfigDeleteAllRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["AssignedTagsConfigDeleteAllResponse"]: + async for response in self._unary_stream( + "/arista.studio.v1.AssignedTagsConfigService/DeleteAll", + assigned_tags_config_delete_all_request, + AssignedTagsConfigDeleteAllResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all_batched( + self, + assigned_tags_config_batched_stream_request: "AssignedTagsConfigBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["AssignedTagsConfigBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.studio.v1.AssignedTagsConfigService/GetAllBatched", + assigned_tags_config_batched_stream_request, + AssignedTagsConfigBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + assigned_tags_config_batched_stream_request: "AssignedTagsConfigBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["AssignedTagsConfigBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.studio.v1.AssignedTagsConfigService/SubscribeBatched", + assigned_tags_config_batched_stream_request, + AssignedTagsConfigBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + +class AutofillActionServiceStub(aristaproto.ServiceStub): + async def get_one( + self, + autofill_action_request: "AutofillActionRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "AutofillActionResponse": + return await self._unary_unary( + "/arista.studio.v1.AutofillActionService/GetOne", + autofill_action_request, + AutofillActionResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def get_some( + self, + autofill_action_some_request: "AutofillActionSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["AutofillActionSomeResponse"]: + async for response in self._unary_stream( + "/arista.studio.v1.AutofillActionService/GetSome", + autofill_action_some_request, + AutofillActionSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all( + self, + autofill_action_stream_request: "AutofillActionStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["AutofillActionStreamResponse"]: + async for response in self._unary_stream( + "/arista.studio.v1.AutofillActionService/GetAll", + autofill_action_stream_request, + AutofillActionStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe( + self, + autofill_action_stream_request: "AutofillActionStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["AutofillActionStreamResponse"]: + async for response in self._unary_stream( + "/arista.studio.v1.AutofillActionService/Subscribe", + autofill_action_stream_request, + AutofillActionStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_meta( + self, + autofill_action_stream_request: "AutofillActionStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": return await self._unary_unary( - "/arista.studio.v1.AssignedTagsConfigService/Set", - assigned_tags_config_set_request, - AssignedTagsConfigSetResponse, + "/arista.studio.v1.AutofillActionService/GetMeta", + autofill_action_stream_request, + MetaResponse, timeout=timeout, deadline=deadline, metadata=metadata, ) - async def set_some( + async def subscribe_meta( self, - assigned_tags_config_set_some_request: "AssignedTagsConfigSetSomeRequest", + autofill_action_stream_request: "AutofillActionStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["AssignedTagsConfigSetSomeResponse"]: + ) -> AsyncIterator["MetaResponse"]: async for response in self._unary_stream( - "/arista.studio.v1.AssignedTagsConfigService/SetSome", - assigned_tags_config_set_some_request, - AssignedTagsConfigSetSomeResponse, + "/arista.studio.v1.AutofillActionService/SubscribeMeta", + autofill_action_stream_request, + MetaResponse, timeout=timeout, deadline=deadline, metadata=metadata, ): yield response - async def delete( + async def get_all_batched( self, - assigned_tags_config_delete_request: "AssignedTagsConfigDeleteRequest", + autofill_action_batched_stream_request: "AutofillActionBatchedStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> "AssignedTagsConfigDeleteResponse": - return await self._unary_unary( - "/arista.studio.v1.AssignedTagsConfigService/Delete", - assigned_tags_config_delete_request, - AssignedTagsConfigDeleteResponse, + ) -> AsyncIterator["AutofillActionBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.studio.v1.AutofillActionService/GetAllBatched", + autofill_action_batched_stream_request, + AutofillActionBatchedStreamResponse, timeout=timeout, deadline=deadline, metadata=metadata, - ) + ): + yield response - async def delete_all( + async def subscribe_batched( self, - assigned_tags_config_delete_all_request: "AssignedTagsConfigDeleteAllRequest", + autofill_action_batched_stream_request: "AutofillActionBatchedStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["AssignedTagsConfigDeleteAllResponse"]: + ) -> AsyncIterator["AutofillActionBatchedStreamResponse"]: async for response in self._unary_stream( - "/arista.studio.v1.AssignedTagsConfigService/DeleteAll", - assigned_tags_config_delete_all_request, - AssignedTagsConfigDeleteAllResponse, + "/arista.studio.v1.AutofillActionService/SubscribeBatched", + autofill_action_batched_stream_request, + AutofillActionBatchedStreamResponse, timeout=timeout, deadline=deadline, metadata=metadata, @@ -3629,109 +3955,107 @@ async def delete_all( yield response -class AutofillActionServiceStub(aristaproto.ServiceStub): +class AutofillActionConfigServiceStub(aristaproto.ServiceStub): async def get_one( self, - autofill_action_request: "AutofillActionRequest", + autofill_action_config_request: "AutofillActionConfigRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> "AutofillActionResponse": + ) -> "AutofillActionConfigResponse": return await self._unary_unary( - "/arista.studio.v1.AutofillActionService/GetOne", - autofill_action_request, - AutofillActionResponse, + "/arista.studio.v1.AutofillActionConfigService/GetOne", + autofill_action_config_request, + AutofillActionConfigResponse, timeout=timeout, deadline=deadline, metadata=metadata, ) - async def get_all( + async def get_some( self, - autofill_action_stream_request: "AutofillActionStreamRequest", + autofill_action_config_some_request: "AutofillActionConfigSomeRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["AutofillActionStreamResponse"]: + ) -> AsyncIterator["AutofillActionConfigSomeResponse"]: async for response in self._unary_stream( - "/arista.studio.v1.AutofillActionService/GetAll", - autofill_action_stream_request, - AutofillActionStreamResponse, + "/arista.studio.v1.AutofillActionConfigService/GetSome", + autofill_action_config_some_request, + AutofillActionConfigSomeResponse, timeout=timeout, deadline=deadline, metadata=metadata, ): yield response - async def subscribe( + async def get_all( self, - autofill_action_stream_request: "AutofillActionStreamRequest", + autofill_action_config_stream_request: "AutofillActionConfigStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["AutofillActionStreamResponse"]: + ) -> AsyncIterator["AutofillActionConfigStreamResponse"]: async for response in self._unary_stream( - "/arista.studio.v1.AutofillActionService/Subscribe", - autofill_action_stream_request, - AutofillActionStreamResponse, + "/arista.studio.v1.AutofillActionConfigService/GetAll", + autofill_action_config_stream_request, + AutofillActionConfigStreamResponse, timeout=timeout, deadline=deadline, metadata=metadata, ): yield response - -class AutofillActionConfigServiceStub(aristaproto.ServiceStub): - async def get_one( + async def subscribe( self, - autofill_action_config_request: "AutofillActionConfigRequest", + autofill_action_config_stream_request: "AutofillActionConfigStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> "AutofillActionConfigResponse": - return await self._unary_unary( - "/arista.studio.v1.AutofillActionConfigService/GetOne", - autofill_action_config_request, - AutofillActionConfigResponse, + ) -> AsyncIterator["AutofillActionConfigStreamResponse"]: + async for response in self._unary_stream( + "/arista.studio.v1.AutofillActionConfigService/Subscribe", + autofill_action_config_stream_request, + AutofillActionConfigStreamResponse, timeout=timeout, deadline=deadline, metadata=metadata, - ) + ): + yield response - async def get_all( + async def get_meta( self, autofill_action_config_stream_request: "AutofillActionConfigStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["AutofillActionConfigStreamResponse"]: - async for response in self._unary_stream( - "/arista.studio.v1.AutofillActionConfigService/GetAll", + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.studio.v1.AutofillActionConfigService/GetMeta", autofill_action_config_stream_request, - AutofillActionConfigStreamResponse, + MetaResponse, timeout=timeout, deadline=deadline, metadata=metadata, - ): - yield response + ) - async def subscribe( + async def subscribe_meta( self, autofill_action_config_stream_request: "AutofillActionConfigStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["AutofillActionConfigStreamResponse"]: + ) -> AsyncIterator["MetaResponse"]: async for response in self._unary_stream( - "/arista.studio.v1.AutofillActionConfigService/Subscribe", + "/arista.studio.v1.AutofillActionConfigService/SubscribeMeta", autofill_action_config_stream_request, - AutofillActionConfigStreamResponse, + MetaResponse, timeout=timeout, deadline=deadline, metadata=metadata, @@ -3790,6 +4114,24 @@ async def delete( metadata=metadata, ) + async def delete_some( + self, + autofill_action_config_delete_some_request: "AutofillActionConfigDeleteSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["AutofillActionConfigDeleteSomeResponse"]: + async for response in self._unary_stream( + "/arista.studio.v1.AutofillActionConfigService/DeleteSome", + autofill_action_config_delete_some_request, + AutofillActionConfigDeleteSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def delete_all( self, autofill_action_config_delete_all_request: "AutofillActionConfigDeleteAllRequest", @@ -3808,6 +4150,42 @@ async def delete_all( ): yield response + async def get_all_batched( + self, + autofill_action_config_batched_stream_request: "AutofillActionConfigBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["AutofillActionConfigBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.studio.v1.AutofillActionConfigService/GetAllBatched", + autofill_action_config_batched_stream_request, + AutofillActionConfigBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + autofill_action_config_batched_stream_request: "AutofillActionConfigBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["AutofillActionConfigBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.studio.v1.AutofillActionConfigService/SubscribeBatched", + autofill_action_config_batched_stream_request, + AutofillActionConfigBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + class InputsServiceStub(aristaproto.ServiceStub): async def get_one( @@ -3827,6 +4205,24 @@ async def get_one( metadata=metadata, ) + async def get_some( + self, + inputs_some_request: "InputsSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["InputsSomeResponse"]: + async for response in self._unary_stream( + "/arista.studio.v1.InputsService/GetSome", + inputs_some_request, + InputsSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def get_all( self, inputs_stream_request: "InputsStreamRequest", @@ -3863,162 +4259,126 @@ async def subscribe( ): yield response - -class InputsConfigServiceStub(aristaproto.ServiceStub): - async def get_one( + async def get_meta( self, - inputs_config_request: "InputsConfigRequest", + inputs_stream_request: "InputsStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> "InputsConfigResponse": + ) -> "MetaResponse": return await self._unary_unary( - "/arista.studio.v1.InputsConfigService/GetOne", - inputs_config_request, - InputsConfigResponse, + "/arista.studio.v1.InputsService/GetMeta", + inputs_stream_request, + MetaResponse, timeout=timeout, deadline=deadline, metadata=metadata, ) - async def get_all( + async def subscribe_meta( self, - inputs_config_stream_request: "InputsConfigStreamRequest", + inputs_stream_request: "InputsStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["InputsConfigStreamResponse"]: + ) -> AsyncIterator["MetaResponse"]: async for response in self._unary_stream( - "/arista.studio.v1.InputsConfigService/GetAll", - inputs_config_stream_request, - InputsConfigStreamResponse, + "/arista.studio.v1.InputsService/SubscribeMeta", + inputs_stream_request, + MetaResponse, timeout=timeout, deadline=deadline, metadata=metadata, ): yield response - async def subscribe( + async def get_all_batched( self, - inputs_config_stream_request: "InputsConfigStreamRequest", + inputs_batched_stream_request: "InputsBatchedStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["InputsConfigStreamResponse"]: + ) -> AsyncIterator["InputsBatchedStreamResponse"]: async for response in self._unary_stream( - "/arista.studio.v1.InputsConfigService/Subscribe", - inputs_config_stream_request, - InputsConfigStreamResponse, + "/arista.studio.v1.InputsService/GetAllBatched", + inputs_batched_stream_request, + InputsBatchedStreamResponse, timeout=timeout, deadline=deadline, metadata=metadata, ): yield response - async def set( - self, - inputs_config_set_request: "InputsConfigSetRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> "InputsConfigSetResponse": - return await self._unary_unary( - "/arista.studio.v1.InputsConfigService/Set", - inputs_config_set_request, - InputsConfigSetResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ) - - async def set_some( + async def subscribe_batched( self, - inputs_config_set_some_request: "InputsConfigSetSomeRequest", + inputs_batched_stream_request: "InputsBatchedStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["InputsConfigSetSomeResponse"]: + ) -> AsyncIterator["InputsBatchedStreamResponse"]: async for response in self._unary_stream( - "/arista.studio.v1.InputsConfigService/SetSome", - inputs_config_set_some_request, - InputsConfigSetSomeResponse, + "/arista.studio.v1.InputsService/SubscribeBatched", + inputs_batched_stream_request, + InputsBatchedStreamResponse, timeout=timeout, deadline=deadline, metadata=metadata, ): yield response - async def delete( + +class InputsConfigServiceStub(aristaproto.ServiceStub): + async def get_one( self, - inputs_config_delete_request: "InputsConfigDeleteRequest", + inputs_config_request: "InputsConfigRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> "InputsConfigDeleteResponse": + ) -> "InputsConfigResponse": return await self._unary_unary( - "/arista.studio.v1.InputsConfigService/Delete", - inputs_config_delete_request, - InputsConfigDeleteResponse, + "/arista.studio.v1.InputsConfigService/GetOne", + inputs_config_request, + InputsConfigResponse, timeout=timeout, deadline=deadline, metadata=metadata, ) - async def delete_all( + async def get_some( self, - inputs_config_delete_all_request: "InputsConfigDeleteAllRequest", + inputs_config_some_request: "InputsConfigSomeRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["InputsConfigDeleteAllResponse"]: + ) -> AsyncIterator["InputsConfigSomeResponse"]: async for response in self._unary_stream( - "/arista.studio.v1.InputsConfigService/DeleteAll", - inputs_config_delete_all_request, - InputsConfigDeleteAllResponse, + "/arista.studio.v1.InputsConfigService/GetSome", + inputs_config_some_request, + InputsConfigSomeResponse, timeout=timeout, deadline=deadline, metadata=metadata, ): yield response - -class SecretInputServiceStub(aristaproto.ServiceStub): - async def get_one( - self, - secret_input_request: "SecretInputRequest", - *, - timeout: Optional[float] = None, - deadline: Optional["Deadline"] = None, - metadata: Optional["MetadataLike"] = None - ) -> "SecretInputResponse": - return await self._unary_unary( - "/arista.studio.v1.SecretInputService/GetOne", - secret_input_request, - SecretInputResponse, - timeout=timeout, - deadline=deadline, - metadata=metadata, - ) - async def get_all( self, - secret_input_stream_request: "SecretInputStreamRequest", + inputs_config_stream_request: "InputsConfigStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["SecretInputStreamResponse"]: + ) -> AsyncIterator["InputsConfigStreamResponse"]: async for response in self._unary_stream( - "/arista.studio.v1.SecretInputService/GetAll", - secret_input_stream_request, - SecretInputStreamResponse, + "/arista.studio.v1.InputsConfigService/GetAll", + inputs_config_stream_request, + InputsConfigStreamResponse, timeout=timeout, deadline=deadline, metadata=metadata, @@ -4027,306 +4387,319 @@ async def get_all( async def subscribe( self, - secret_input_stream_request: "SecretInputStreamRequest", + inputs_config_stream_request: "InputsConfigStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["SecretInputStreamResponse"]: + ) -> AsyncIterator["InputsConfigStreamResponse"]: async for response in self._unary_stream( - "/arista.studio.v1.SecretInputService/Subscribe", - secret_input_stream_request, - SecretInputStreamResponse, + "/arista.studio.v1.InputsConfigService/Subscribe", + inputs_config_stream_request, + InputsConfigStreamResponse, timeout=timeout, deadline=deadline, metadata=metadata, ): yield response - -class StudioServiceStub(aristaproto.ServiceStub): - async def get_one( + async def get_meta( self, - studio_request: "StudioRequest", + inputs_config_stream_request: "InputsConfigStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> "StudioResponse": + ) -> "MetaResponse": return await self._unary_unary( - "/arista.studio.v1.StudioService/GetOne", - studio_request, - StudioResponse, + "/arista.studio.v1.InputsConfigService/GetMeta", + inputs_config_stream_request, + MetaResponse, timeout=timeout, deadline=deadline, metadata=metadata, ) - async def get_all( + async def subscribe_meta( self, - studio_stream_request: "StudioStreamRequest", + inputs_config_stream_request: "InputsConfigStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["StudioStreamResponse"]: + ) -> AsyncIterator["MetaResponse"]: async for response in self._unary_stream( - "/arista.studio.v1.StudioService/GetAll", - studio_stream_request, - StudioStreamResponse, + "/arista.studio.v1.InputsConfigService/SubscribeMeta", + inputs_config_stream_request, + MetaResponse, timeout=timeout, deadline=deadline, metadata=metadata, ): yield response - async def subscribe( + async def set( self, - studio_stream_request: "StudioStreamRequest", + inputs_config_set_request: "InputsConfigSetRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["StudioStreamResponse"]: + ) -> "InputsConfigSetResponse": + return await self._unary_unary( + "/arista.studio.v1.InputsConfigService/Set", + inputs_config_set_request, + InputsConfigSetResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def set_some( + self, + inputs_config_set_some_request: "InputsConfigSetSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["InputsConfigSetSomeResponse"]: async for response in self._unary_stream( - "/arista.studio.v1.StudioService/Subscribe", - studio_stream_request, - StudioStreamResponse, + "/arista.studio.v1.InputsConfigService/SetSome", + inputs_config_set_some_request, + InputsConfigSetSomeResponse, timeout=timeout, deadline=deadline, metadata=metadata, ): yield response - -class StudioConfigServiceStub(aristaproto.ServiceStub): - async def get_one( + async def delete( self, - studio_config_request: "StudioConfigRequest", + inputs_config_delete_request: "InputsConfigDeleteRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> "StudioConfigResponse": + ) -> "InputsConfigDeleteResponse": return await self._unary_unary( - "/arista.studio.v1.StudioConfigService/GetOne", - studio_config_request, - StudioConfigResponse, + "/arista.studio.v1.InputsConfigService/Delete", + inputs_config_delete_request, + InputsConfigDeleteResponse, timeout=timeout, deadline=deadline, metadata=metadata, ) - async def get_all( + async def delete_some( self, - studio_config_stream_request: "StudioConfigStreamRequest", + inputs_config_delete_some_request: "InputsConfigDeleteSomeRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["StudioConfigStreamResponse"]: + ) -> AsyncIterator["InputsConfigDeleteSomeResponse"]: async for response in self._unary_stream( - "/arista.studio.v1.StudioConfigService/GetAll", - studio_config_stream_request, - StudioConfigStreamResponse, + "/arista.studio.v1.InputsConfigService/DeleteSome", + inputs_config_delete_some_request, + InputsConfigDeleteSomeResponse, timeout=timeout, deadline=deadline, metadata=metadata, ): yield response - async def subscribe( + async def delete_all( self, - studio_config_stream_request: "StudioConfigStreamRequest", + inputs_config_delete_all_request: "InputsConfigDeleteAllRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["StudioConfigStreamResponse"]: + ) -> AsyncIterator["InputsConfigDeleteAllResponse"]: async for response in self._unary_stream( - "/arista.studio.v1.StudioConfigService/Subscribe", - studio_config_stream_request, - StudioConfigStreamResponse, + "/arista.studio.v1.InputsConfigService/DeleteAll", + inputs_config_delete_all_request, + InputsConfigDeleteAllResponse, timeout=timeout, deadline=deadline, metadata=metadata, ): yield response - async def set( + async def get_all_batched( self, - studio_config_set_request: "StudioConfigSetRequest", + inputs_config_batched_stream_request: "InputsConfigBatchedStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> "StudioConfigSetResponse": - return await self._unary_unary( - "/arista.studio.v1.StudioConfigService/Set", - studio_config_set_request, - StudioConfigSetResponse, + ) -> AsyncIterator["InputsConfigBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.studio.v1.InputsConfigService/GetAllBatched", + inputs_config_batched_stream_request, + InputsConfigBatchedStreamResponse, timeout=timeout, deadline=deadline, metadata=metadata, - ) + ): + yield response - async def set_some( + async def subscribe_batched( self, - studio_config_set_some_request: "StudioConfigSetSomeRequest", + inputs_config_batched_stream_request: "InputsConfigBatchedStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["StudioConfigSetSomeResponse"]: + ) -> AsyncIterator["InputsConfigBatchedStreamResponse"]: async for response in self._unary_stream( - "/arista.studio.v1.StudioConfigService/SetSome", - studio_config_set_some_request, - StudioConfigSetSomeResponse, + "/arista.studio.v1.InputsConfigService/SubscribeBatched", + inputs_config_batched_stream_request, + InputsConfigBatchedStreamResponse, timeout=timeout, deadline=deadline, metadata=metadata, ): yield response - async def delete( + +class SecretInputServiceStub(aristaproto.ServiceStub): + async def get_one( self, - studio_config_delete_request: "StudioConfigDeleteRequest", + secret_input_request: "SecretInputRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> "StudioConfigDeleteResponse": + ) -> "SecretInputResponse": return await self._unary_unary( - "/arista.studio.v1.StudioConfigService/Delete", - studio_config_delete_request, - StudioConfigDeleteResponse, + "/arista.studio.v1.SecretInputService/GetOne", + secret_input_request, + SecretInputResponse, timeout=timeout, deadline=deadline, metadata=metadata, ) - async def delete_all( + async def get_some( self, - studio_config_delete_all_request: "StudioConfigDeleteAllRequest", + secret_input_some_request: "SecretInputSomeRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["StudioConfigDeleteAllResponse"]: + ) -> AsyncIterator["SecretInputSomeResponse"]: async for response in self._unary_stream( - "/arista.studio.v1.StudioConfigService/DeleteAll", - studio_config_delete_all_request, - StudioConfigDeleteAllResponse, + "/arista.studio.v1.SecretInputService/GetSome", + secret_input_some_request, + SecretInputSomeResponse, timeout=timeout, deadline=deadline, metadata=metadata, ): yield response - -class StudioSummaryServiceStub(aristaproto.ServiceStub): - async def get_one( + async def get_all( self, - studio_summary_request: "StudioSummaryRequest", + secret_input_stream_request: "SecretInputStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> "StudioSummaryResponse": - return await self._unary_unary( - "/arista.studio.v1.StudioSummaryService/GetOne", - studio_summary_request, - StudioSummaryResponse, + ) -> AsyncIterator["SecretInputStreamResponse"]: + async for response in self._unary_stream( + "/arista.studio.v1.SecretInputService/GetAll", + secret_input_stream_request, + SecretInputStreamResponse, timeout=timeout, deadline=deadline, metadata=metadata, - ) + ): + yield response - async def get_all( + async def subscribe( self, - studio_summary_stream_request: "StudioSummaryStreamRequest", + secret_input_stream_request: "SecretInputStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["StudioSummaryStreamResponse"]: + ) -> AsyncIterator["SecretInputStreamResponse"]: async for response in self._unary_stream( - "/arista.studio.v1.StudioSummaryService/GetAll", - studio_summary_stream_request, - StudioSummaryStreamResponse, + "/arista.studio.v1.SecretInputService/Subscribe", + secret_input_stream_request, + SecretInputStreamResponse, timeout=timeout, deadline=deadline, metadata=metadata, ): yield response - async def subscribe( + async def get_meta( self, - studio_summary_stream_request: "StudioSummaryStreamRequest", + secret_input_stream_request: "SecretInputStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["StudioSummaryStreamResponse"]: - async for response in self._unary_stream( - "/arista.studio.v1.StudioSummaryService/Subscribe", - studio_summary_stream_request, - StudioSummaryStreamResponse, + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.studio.v1.SecretInputService/GetMeta", + secret_input_stream_request, + MetaResponse, timeout=timeout, deadline=deadline, metadata=metadata, - ): - yield response - + ) -class TopologyInputServiceStub(aristaproto.ServiceStub): - async def get_one( + async def subscribe_meta( self, - topology_input_request: "TopologyInputRequest", + secret_input_stream_request: "SecretInputStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> "TopologyInputResponse": - return await self._unary_unary( - "/arista.studio.v1.TopologyInputService/GetOne", - topology_input_request, - TopologyInputResponse, + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.studio.v1.SecretInputService/SubscribeMeta", + secret_input_stream_request, + MetaResponse, timeout=timeout, deadline=deadline, metadata=metadata, - ) + ): + yield response - async def get_all( + async def get_all_batched( self, - topology_input_stream_request: "TopologyInputStreamRequest", + secret_input_batched_stream_request: "SecretInputBatchedStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["TopologyInputStreamResponse"]: + ) -> AsyncIterator["SecretInputBatchedStreamResponse"]: async for response in self._unary_stream( - "/arista.studio.v1.TopologyInputService/GetAll", - topology_input_stream_request, - TopologyInputStreamResponse, + "/arista.studio.v1.SecretInputService/GetAllBatched", + secret_input_batched_stream_request, + SecretInputBatchedStreamResponse, timeout=timeout, deadline=deadline, metadata=metadata, ): yield response - async def subscribe( + async def subscribe_batched( self, - topology_input_stream_request: "TopologyInputStreamRequest", + secret_input_batched_stream_request: "SecretInputBatchedStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["TopologyInputStreamResponse"]: + ) -> AsyncIterator["SecretInputBatchedStreamResponse"]: async for response in self._unary_stream( - "/arista.studio.v1.TopologyInputService/Subscribe", - topology_input_stream_request, - TopologyInputStreamResponse, + "/arista.studio.v1.SecretInputService/SubscribeBatched", + secret_input_batched_stream_request, + SecretInputBatchedStreamResponse, timeout=timeout, deadline=deadline, metadata=metadata, @@ -4334,36 +4707,54 @@ async def subscribe( yield response -class TopologyInputConfigServiceStub(aristaproto.ServiceStub): +class StudioServiceStub(aristaproto.ServiceStub): async def get_one( self, - topology_input_config_request: "TopologyInputConfigRequest", + studio_request: "StudioRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> "TopologyInputConfigResponse": + ) -> "StudioResponse": return await self._unary_unary( - "/arista.studio.v1.TopologyInputConfigService/GetOne", - topology_input_config_request, - TopologyInputConfigResponse, + "/arista.studio.v1.StudioService/GetOne", + studio_request, + StudioResponse, timeout=timeout, deadline=deadline, metadata=metadata, ) + async def get_some( + self, + studio_some_request: "StudioSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["StudioSomeResponse"]: + async for response in self._unary_stream( + "/arista.studio.v1.StudioService/GetSome", + studio_some_request, + StudioSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def get_all( self, - topology_input_config_stream_request: "TopologyInputConfigStreamRequest", + studio_stream_request: "StudioStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["TopologyInputConfigStreamResponse"]: + ) -> AsyncIterator["StudioStreamResponse"]: async for response in self._unary_stream( - "/arista.studio.v1.TopologyInputConfigService/GetAll", - topology_input_config_stream_request, - TopologyInputConfigStreamResponse, + "/arista.studio.v1.StudioService/GetAll", + studio_stream_request, + StudioStreamResponse, timeout=timeout, deadline=deadline, metadata=metadata, @@ -4372,86 +4763,87 @@ async def get_all( async def subscribe( self, - topology_input_config_stream_request: "TopologyInputConfigStreamRequest", + studio_stream_request: "StudioStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["TopologyInputConfigStreamResponse"]: + ) -> AsyncIterator["StudioStreamResponse"]: async for response in self._unary_stream( - "/arista.studio.v1.TopologyInputConfigService/Subscribe", - topology_input_config_stream_request, - TopologyInputConfigStreamResponse, + "/arista.studio.v1.StudioService/Subscribe", + studio_stream_request, + StudioStreamResponse, timeout=timeout, deadline=deadline, metadata=metadata, ): yield response - async def set( + async def get_meta( self, - topology_input_config_set_request: "TopologyInputConfigSetRequest", + studio_stream_request: "StudioStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> "TopologyInputConfigSetResponse": + ) -> "MetaResponse": return await self._unary_unary( - "/arista.studio.v1.TopologyInputConfigService/Set", - topology_input_config_set_request, - TopologyInputConfigSetResponse, + "/arista.studio.v1.StudioService/GetMeta", + studio_stream_request, + MetaResponse, timeout=timeout, deadline=deadline, metadata=metadata, ) - async def set_some( + async def subscribe_meta( self, - topology_input_config_set_some_request: "TopologyInputConfigSetSomeRequest", + studio_stream_request: "StudioStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["TopologyInputConfigSetSomeResponse"]: + ) -> AsyncIterator["MetaResponse"]: async for response in self._unary_stream( - "/arista.studio.v1.TopologyInputConfigService/SetSome", - topology_input_config_set_some_request, - TopologyInputConfigSetSomeResponse, + "/arista.studio.v1.StudioService/SubscribeMeta", + studio_stream_request, + MetaResponse, timeout=timeout, deadline=deadline, metadata=metadata, ): yield response - async def delete( + async def get_all_batched( self, - topology_input_config_delete_request: "TopologyInputConfigDeleteRequest", + studio_batched_stream_request: "StudioBatchedStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> "TopologyInputConfigDeleteResponse": - return await self._unary_unary( - "/arista.studio.v1.TopologyInputConfigService/Delete", - topology_input_config_delete_request, - TopologyInputConfigDeleteResponse, + ) -> AsyncIterator["StudioBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.studio.v1.StudioService/GetAllBatched", + studio_batched_stream_request, + StudioBatchedStreamResponse, timeout=timeout, deadline=deadline, metadata=metadata, - ) + ): + yield response - async def delete_all( + async def subscribe_batched( self, - topology_input_config_delete_all_request: "TopologyInputConfigDeleteAllRequest", + studio_batched_stream_request: "StudioBatchedStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["TopologyInputConfigDeleteAllResponse"]: + ) -> AsyncIterator["StudioBatchedStreamResponse"]: async for response in self._unary_stream( - "/arista.studio.v1.TopologyInputConfigService/DeleteAll", - topology_input_config_delete_all_request, - TopologyInputConfigDeleteAllResponse, + "/arista.studio.v1.StudioService/SubscribeBatched", + studio_batched_stream_request, + StudioBatchedStreamResponse, timeout=timeout, deadline=deadline, metadata=metadata, @@ -4459,109 +4851,107 @@ async def delete_all( yield response -class TopologyUpdateServiceStub(aristaproto.ServiceStub): +class StudioConfigServiceStub(aristaproto.ServiceStub): async def get_one( self, - topology_update_request: "TopologyUpdateRequest", + studio_config_request: "StudioConfigRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> "TopologyUpdateResponse": + ) -> "StudioConfigResponse": return await self._unary_unary( - "/arista.studio.v1.TopologyUpdateService/GetOne", - topology_update_request, - TopologyUpdateResponse, + "/arista.studio.v1.StudioConfigService/GetOne", + studio_config_request, + StudioConfigResponse, timeout=timeout, deadline=deadline, metadata=metadata, ) - async def get_all( + async def get_some( self, - topology_update_stream_request: "TopologyUpdateStreamRequest", + studio_config_some_request: "StudioConfigSomeRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["TopologyUpdateStreamResponse"]: + ) -> AsyncIterator["StudioConfigSomeResponse"]: async for response in self._unary_stream( - "/arista.studio.v1.TopologyUpdateService/GetAll", - topology_update_stream_request, - TopologyUpdateStreamResponse, + "/arista.studio.v1.StudioConfigService/GetSome", + studio_config_some_request, + StudioConfigSomeResponse, timeout=timeout, deadline=deadline, metadata=metadata, ): yield response - async def subscribe( + async def get_all( self, - topology_update_stream_request: "TopologyUpdateStreamRequest", + studio_config_stream_request: "StudioConfigStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["TopologyUpdateStreamResponse"]: + ) -> AsyncIterator["StudioConfigStreamResponse"]: async for response in self._unary_stream( - "/arista.studio.v1.TopologyUpdateService/Subscribe", - topology_update_stream_request, - TopologyUpdateStreamResponse, + "/arista.studio.v1.StudioConfigService/GetAll", + studio_config_stream_request, + StudioConfigStreamResponse, timeout=timeout, deadline=deadline, metadata=metadata, ): yield response - -class TopologyUpdateConfigServiceStub(aristaproto.ServiceStub): - async def get_one( + async def subscribe( self, - topology_update_config_request: "TopologyUpdateConfigRequest", + studio_config_stream_request: "StudioConfigStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> "TopologyUpdateConfigResponse": - return await self._unary_unary( - "/arista.studio.v1.TopologyUpdateConfigService/GetOne", - topology_update_config_request, - TopologyUpdateConfigResponse, + ) -> AsyncIterator["StudioConfigStreamResponse"]: + async for response in self._unary_stream( + "/arista.studio.v1.StudioConfigService/Subscribe", + studio_config_stream_request, + StudioConfigStreamResponse, timeout=timeout, deadline=deadline, metadata=metadata, - ) + ): + yield response - async def get_all( + async def get_meta( self, - topology_update_config_stream_request: "TopologyUpdateConfigStreamRequest", + studio_config_stream_request: "StudioConfigStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["TopologyUpdateConfigStreamResponse"]: - async for response in self._unary_stream( - "/arista.studio.v1.TopologyUpdateConfigService/GetAll", - topology_update_config_stream_request, - TopologyUpdateConfigStreamResponse, + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.studio.v1.StudioConfigService/GetMeta", + studio_config_stream_request, + MetaResponse, timeout=timeout, deadline=deadline, metadata=metadata, - ): - yield response + ) - async def subscribe( + async def subscribe_meta( self, - topology_update_config_stream_request: "TopologyUpdateConfigStreamRequest", + studio_config_stream_request: "StudioConfigStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["TopologyUpdateConfigStreamResponse"]: + ) -> AsyncIterator["MetaResponse"]: async for response in self._unary_stream( - "/arista.studio.v1.TopologyUpdateConfigService/Subscribe", - topology_update_config_stream_request, - TopologyUpdateConfigStreamResponse, + "/arista.studio.v1.StudioConfigService/SubscribeMeta", + studio_config_stream_request, + MetaResponse, timeout=timeout, deadline=deadline, metadata=metadata, @@ -4570,16 +4960,16 @@ async def subscribe( async def set( self, - topology_update_config_set_request: "TopologyUpdateConfigSetRequest", + studio_config_set_request: "StudioConfigSetRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> "TopologyUpdateConfigSetResponse": + ) -> "StudioConfigSetResponse": return await self._unary_unary( - "/arista.studio.v1.TopologyUpdateConfigService/Set", - topology_update_config_set_request, - TopologyUpdateConfigSetResponse, + "/arista.studio.v1.StudioConfigService/Set", + studio_config_set_request, + StudioConfigSetResponse, timeout=timeout, deadline=deadline, metadata=metadata, @@ -4587,16 +4977,16 @@ async def set( async def set_some( self, - topology_update_config_set_some_request: "TopologyUpdateConfigSetSomeRequest", + studio_config_set_some_request: "StudioConfigSetSomeRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["TopologyUpdateConfigSetSomeResponse"]: + ) -> AsyncIterator["StudioConfigSetSomeResponse"]: async for response in self._unary_stream( - "/arista.studio.v1.TopologyUpdateConfigService/SetSome", - topology_update_config_set_some_request, - TopologyUpdateConfigSetSomeResponse, + "/arista.studio.v1.StudioConfigService/SetSome", + studio_config_set_some_request, + StudioConfigSetSomeResponse, timeout=timeout, deadline=deadline, metadata=metadata, @@ -4605,88 +4995,87 @@ async def set_some( async def delete( self, - topology_update_config_delete_request: "TopologyUpdateConfigDeleteRequest", + studio_config_delete_request: "StudioConfigDeleteRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> "TopologyUpdateConfigDeleteResponse": + ) -> "StudioConfigDeleteResponse": return await self._unary_unary( - "/arista.studio.v1.TopologyUpdateConfigService/Delete", - topology_update_config_delete_request, - TopologyUpdateConfigDeleteResponse, + "/arista.studio.v1.StudioConfigService/Delete", + studio_config_delete_request, + StudioConfigDeleteResponse, timeout=timeout, deadline=deadline, metadata=metadata, ) - async def delete_all( + async def delete_some( self, - topology_update_config_delete_all_request: "TopologyUpdateConfigDeleteAllRequest", + studio_config_delete_some_request: "StudioConfigDeleteSomeRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["TopologyUpdateConfigDeleteAllResponse"]: + ) -> AsyncIterator["StudioConfigDeleteSomeResponse"]: async for response in self._unary_stream( - "/arista.studio.v1.TopologyUpdateConfigService/DeleteAll", - topology_update_config_delete_all_request, - TopologyUpdateConfigDeleteAllResponse, + "/arista.studio.v1.StudioConfigService/DeleteSome", + studio_config_delete_some_request, + StudioConfigDeleteSomeResponse, timeout=timeout, deadline=deadline, metadata=metadata, ): yield response - -class TopologyUpdateSyncServiceStub(aristaproto.ServiceStub): - async def get_one( + async def delete_all( self, - topology_update_sync_request: "TopologyUpdateSyncRequest", + studio_config_delete_all_request: "StudioConfigDeleteAllRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> "TopologyUpdateSyncResponse": - return await self._unary_unary( - "/arista.studio.v1.TopologyUpdateSyncService/GetOne", - topology_update_sync_request, - TopologyUpdateSyncResponse, + ) -> AsyncIterator["StudioConfigDeleteAllResponse"]: + async for response in self._unary_stream( + "/arista.studio.v1.StudioConfigService/DeleteAll", + studio_config_delete_all_request, + StudioConfigDeleteAllResponse, timeout=timeout, deadline=deadline, metadata=metadata, - ) + ): + yield response - async def get_all( + async def get_all_batched( self, - topology_update_sync_stream_request: "TopologyUpdateSyncStreamRequest", + studio_config_batched_stream_request: "StudioConfigBatchedStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["TopologyUpdateSyncStreamResponse"]: + ) -> AsyncIterator["StudioConfigBatchedStreamResponse"]: async for response in self._unary_stream( - "/arista.studio.v1.TopologyUpdateSyncService/GetAll", - topology_update_sync_stream_request, - TopologyUpdateSyncStreamResponse, + "/arista.studio.v1.StudioConfigService/GetAllBatched", + studio_config_batched_stream_request, + StudioConfigBatchedStreamResponse, timeout=timeout, deadline=deadline, metadata=metadata, ): yield response - async def subscribe( + async def subscribe_batched( self, - topology_update_sync_stream_request: "TopologyUpdateSyncStreamRequest", + studio_config_batched_stream_request: "StudioConfigBatchedStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["TopologyUpdateSyncStreamResponse"]: + ) -> AsyncIterator["StudioConfigBatchedStreamResponse"]: async for response in self._unary_stream( - "/arista.studio.v1.TopologyUpdateSyncService/Subscribe", - topology_update_sync_stream_request, - TopologyUpdateSyncStreamResponse, + "/arista.studio.v1.StudioConfigService/SubscribeBatched", + studio_config_batched_stream_request, + StudioConfigBatchedStreamResponse, timeout=timeout, deadline=deadline, metadata=metadata, @@ -4694,36 +5083,54 @@ async def subscribe( yield response -class TopologyUpdateSyncConfigServiceStub(aristaproto.ServiceStub): +class StudioSummaryServiceStub(aristaproto.ServiceStub): async def get_one( self, - topology_update_sync_config_request: "TopologyUpdateSyncConfigRequest", + studio_summary_request: "StudioSummaryRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> "TopologyUpdateSyncConfigResponse": + ) -> "StudioSummaryResponse": return await self._unary_unary( - "/arista.studio.v1.TopologyUpdateSyncConfigService/GetOne", - topology_update_sync_config_request, - TopologyUpdateSyncConfigResponse, + "/arista.studio.v1.StudioSummaryService/GetOne", + studio_summary_request, + StudioSummaryResponse, timeout=timeout, deadline=deadline, metadata=metadata, ) + async def get_some( + self, + studio_summary_some_request: "StudioSummarySomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["StudioSummarySomeResponse"]: + async for response in self._unary_stream( + "/arista.studio.v1.StudioSummaryService/GetSome", + studio_summary_some_request, + StudioSummarySomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def get_all( self, - topology_update_sync_config_stream_request: "TopologyUpdateSyncConfigStreamRequest", + studio_summary_stream_request: "StudioSummaryStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["TopologyUpdateSyncConfigStreamResponse"]: + ) -> AsyncIterator["StudioSummaryStreamResponse"]: async for response in self._unary_stream( - "/arista.studio.v1.TopologyUpdateSyncConfigService/GetAll", - topology_update_sync_config_stream_request, - TopologyUpdateSyncConfigStreamResponse, + "/arista.studio.v1.StudioSummaryService/GetAll", + studio_summary_stream_request, + StudioSummaryStreamResponse, timeout=timeout, deadline=deadline, metadata=metadata, @@ -4732,86 +5139,87 @@ async def get_all( async def subscribe( self, - topology_update_sync_config_stream_request: "TopologyUpdateSyncConfigStreamRequest", + studio_summary_stream_request: "StudioSummaryStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["TopologyUpdateSyncConfigStreamResponse"]: + ) -> AsyncIterator["StudioSummaryStreamResponse"]: async for response in self._unary_stream( - "/arista.studio.v1.TopologyUpdateSyncConfigService/Subscribe", - topology_update_sync_config_stream_request, - TopologyUpdateSyncConfigStreamResponse, + "/arista.studio.v1.StudioSummaryService/Subscribe", + studio_summary_stream_request, + StudioSummaryStreamResponse, timeout=timeout, deadline=deadline, metadata=metadata, ): yield response - async def set( + async def get_meta( self, - topology_update_sync_config_set_request: "TopologyUpdateSyncConfigSetRequest", + studio_summary_stream_request: "StudioSummaryStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> "TopologyUpdateSyncConfigSetResponse": + ) -> "MetaResponse": return await self._unary_unary( - "/arista.studio.v1.TopologyUpdateSyncConfigService/Set", - topology_update_sync_config_set_request, - TopologyUpdateSyncConfigSetResponse, + "/arista.studio.v1.StudioSummaryService/GetMeta", + studio_summary_stream_request, + MetaResponse, timeout=timeout, deadline=deadline, metadata=metadata, ) - async def set_some( + async def subscribe_meta( self, - topology_update_sync_config_set_some_request: "TopologyUpdateSyncConfigSetSomeRequest", + studio_summary_stream_request: "StudioSummaryStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["TopologyUpdateSyncConfigSetSomeResponse"]: + ) -> AsyncIterator["MetaResponse"]: async for response in self._unary_stream( - "/arista.studio.v1.TopologyUpdateSyncConfigService/SetSome", - topology_update_sync_config_set_some_request, - TopologyUpdateSyncConfigSetSomeResponse, + "/arista.studio.v1.StudioSummaryService/SubscribeMeta", + studio_summary_stream_request, + MetaResponse, timeout=timeout, deadline=deadline, metadata=metadata, ): yield response - async def delete( + async def get_all_batched( self, - topology_update_sync_config_delete_request: "TopologyUpdateSyncConfigDeleteRequest", + studio_summary_batched_stream_request: "StudioSummaryBatchedStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> "TopologyUpdateSyncConfigDeleteResponse": - return await self._unary_unary( - "/arista.studio.v1.TopologyUpdateSyncConfigService/Delete", - topology_update_sync_config_delete_request, - TopologyUpdateSyncConfigDeleteResponse, + ) -> AsyncIterator["StudioSummaryBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.studio.v1.StudioSummaryService/GetAllBatched", + studio_summary_batched_stream_request, + StudioSummaryBatchedStreamResponse, timeout=timeout, deadline=deadline, metadata=metadata, - ) + ): + yield response - async def delete_all( + async def subscribe_batched( self, - topology_update_sync_config_delete_all_request: "TopologyUpdateSyncConfigDeleteAllRequest", + studio_summary_batched_stream_request: "StudioSummaryBatchedStreamRequest", *, timeout: Optional[float] = None, deadline: Optional["Deadline"] = None, metadata: Optional["MetadataLike"] = None - ) -> AsyncIterator["TopologyUpdateSyncConfigDeleteAllResponse"]: + ) -> AsyncIterator["StudioSummaryBatchedStreamResponse"]: async for response in self._unary_stream( - "/arista.studio.v1.TopologyUpdateSyncConfigService/DeleteAll", - topology_update_sync_config_delete_all_request, - TopologyUpdateSyncConfigDeleteAllResponse, + "/arista.studio.v1.StudioSummaryService/SubscribeBatched", + studio_summary_batched_stream_request, + StudioSummaryBatchedStreamResponse, timeout=timeout, deadline=deadline, metadata=metadata, @@ -4820,11 +5228,17 @@ async def delete_all( class AssignedTagsServiceBase(ServiceBase): + async def get_one( self, assigned_tags_request: "AssignedTagsRequest" ) -> "AssignedTagsResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_some( + self, assigned_tags_some_request: "AssignedTagsSomeRequest" + ) -> AsyncIterator["AssignedTagsSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_all( self, assigned_tags_stream_request: "AssignedTagsStreamRequest" ) -> AsyncIterator["AssignedTagsStreamResponse"]: @@ -4835,328 +5249,251 @@ async def subscribe( ) -> AsyncIterator["AssignedTagsStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - async def __rpc_get_one( - self, stream: "grpclib.server.Stream[AssignedTagsRequest, AssignedTagsResponse]" - ) -> None: - request = await stream.recv_message() - response = await self.get_one(request) - await stream.send_message(response) - - async def __rpc_get_all( - self, - stream: "grpclib.server.Stream[AssignedTagsStreamRequest, AssignedTagsStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.get_all, - stream, - request, - ) - - async def __rpc_subscribe( - self, - stream: "grpclib.server.Stream[AssignedTagsStreamRequest, AssignedTagsStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.subscribe, - stream, - request, - ) - - def __mapping__(self) -> Dict[str, grpclib.const.Handler]: - return { - "/arista.studio.v1.AssignedTagsService/GetOne": grpclib.const.Handler( - self.__rpc_get_one, - grpclib.const.Cardinality.UNARY_UNARY, - AssignedTagsRequest, - AssignedTagsResponse, - ), - "/arista.studio.v1.AssignedTagsService/GetAll": grpclib.const.Handler( - self.__rpc_get_all, - grpclib.const.Cardinality.UNARY_STREAM, - AssignedTagsStreamRequest, - AssignedTagsStreamResponse, - ), - "/arista.studio.v1.AssignedTagsService/Subscribe": grpclib.const.Handler( - self.__rpc_subscribe, - grpclib.const.Cardinality.UNARY_STREAM, - AssignedTagsStreamRequest, - AssignedTagsStreamResponse, - ), - } - - -class AssignedTagsConfigServiceBase(ServiceBase): - async def get_one( - self, assigned_tags_config_request: "AssignedTagsConfigRequest" - ) -> "AssignedTagsConfigResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def get_all( - self, assigned_tags_config_stream_request: "AssignedTagsConfigStreamRequest" - ) -> AsyncIterator["AssignedTagsConfigStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def subscribe( - self, assigned_tags_config_stream_request: "AssignedTagsConfigStreamRequest" - ) -> AsyncIterator["AssignedTagsConfigStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def set( - self, assigned_tags_config_set_request: "AssignedTagsConfigSetRequest" - ) -> "AssignedTagsConfigSetResponse": + async def get_meta( + self, assigned_tags_stream_request: "AssignedTagsStreamRequest" + ) -> "MetaResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - async def set_some( - self, assigned_tags_config_set_some_request: "AssignedTagsConfigSetSomeRequest" - ) -> AsyncIterator["AssignedTagsConfigSetSomeResponse"]: + async def subscribe_meta( + self, assigned_tags_stream_request: "AssignedTagsStreamRequest" + ) -> AsyncIterator["MetaResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - async def delete( - self, assigned_tags_config_delete_request: "AssignedTagsConfigDeleteRequest" - ) -> "AssignedTagsConfigDeleteResponse": + async def get_all_batched( + self, assigned_tags_batched_stream_request: "AssignedTagsBatchedStreamRequest" + ) -> AsyncIterator["AssignedTagsBatchedStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - async def delete_all( - self, - assigned_tags_config_delete_all_request: "AssignedTagsConfigDeleteAllRequest", - ) -> AsyncIterator["AssignedTagsConfigDeleteAllResponse"]: + async def subscribe_batched( + self, assigned_tags_batched_stream_request: "AssignedTagsBatchedStreamRequest" + ) -> AsyncIterator["AssignedTagsBatchedStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) async def __rpc_get_one( - self, - stream: "grpclib.server.Stream[AssignedTagsConfigRequest, AssignedTagsConfigResponse]", + self, stream: "grpclib.server.Stream[AssignedTagsRequest, AssignedTagsResponse]" ) -> None: request = await stream.recv_message() response = await self.get_one(request) await stream.send_message(response) - async def __rpc_get_all( - self, - stream: "grpclib.server.Stream[AssignedTagsConfigStreamRequest, AssignedTagsConfigStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.get_all, - stream, - request, - ) - - async def __rpc_subscribe( - self, - stream: "grpclib.server.Stream[AssignedTagsConfigStreamRequest, AssignedTagsConfigStreamResponse]", - ) -> None: - request = await stream.recv_message() - await self._call_rpc_handler_server_stream( - self.subscribe, - stream, - request, - ) - - async def __rpc_set( - self, - stream: "grpclib.server.Stream[AssignedTagsConfigSetRequest, AssignedTagsConfigSetResponse]", - ) -> None: - request = await stream.recv_message() - response = await self.set(request) - await stream.send_message(response) - - async def __rpc_set_some( + async def __rpc_get_some( self, - stream: "grpclib.server.Stream[AssignedTagsConfigSetSomeRequest, AssignedTagsConfigSetSomeResponse]", + stream: "grpclib.server.Stream[AssignedTagsSomeRequest, AssignedTagsSomeResponse]", ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( - self.set_some, + self.get_some, stream, request, ) - async def __rpc_delete( - self, - stream: "grpclib.server.Stream[AssignedTagsConfigDeleteRequest, AssignedTagsConfigDeleteResponse]", - ) -> None: - request = await stream.recv_message() - response = await self.delete(request) - await stream.send_message(response) - - async def __rpc_delete_all( + async def __rpc_get_all( self, - stream: "grpclib.server.Stream[AssignedTagsConfigDeleteAllRequest, AssignedTagsConfigDeleteAllResponse]", + stream: "grpclib.server.Stream[AssignedTagsStreamRequest, AssignedTagsStreamResponse]", ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( - self.delete_all, + self.get_all, stream, request, ) - def __mapping__(self) -> Dict[str, grpclib.const.Handler]: - return { - "/arista.studio.v1.AssignedTagsConfigService/GetOne": grpclib.const.Handler( - self.__rpc_get_one, - grpclib.const.Cardinality.UNARY_UNARY, - AssignedTagsConfigRequest, - AssignedTagsConfigResponse, - ), - "/arista.studio.v1.AssignedTagsConfigService/GetAll": grpclib.const.Handler( - self.__rpc_get_all, - grpclib.const.Cardinality.UNARY_STREAM, - AssignedTagsConfigStreamRequest, - AssignedTagsConfigStreamResponse, - ), - "/arista.studio.v1.AssignedTagsConfigService/Subscribe": grpclib.const.Handler( - self.__rpc_subscribe, - grpclib.const.Cardinality.UNARY_STREAM, - AssignedTagsConfigStreamRequest, - AssignedTagsConfigStreamResponse, - ), - "/arista.studio.v1.AssignedTagsConfigService/Set": grpclib.const.Handler( - self.__rpc_set, - grpclib.const.Cardinality.UNARY_UNARY, - AssignedTagsConfigSetRequest, - AssignedTagsConfigSetResponse, - ), - "/arista.studio.v1.AssignedTagsConfigService/SetSome": grpclib.const.Handler( - self.__rpc_set_some, - grpclib.const.Cardinality.UNARY_STREAM, - AssignedTagsConfigSetSomeRequest, - AssignedTagsConfigSetSomeResponse, - ), - "/arista.studio.v1.AssignedTagsConfigService/Delete": grpclib.const.Handler( - self.__rpc_delete, - grpclib.const.Cardinality.UNARY_UNARY, - AssignedTagsConfigDeleteRequest, - AssignedTagsConfigDeleteResponse, - ), - "/arista.studio.v1.AssignedTagsConfigService/DeleteAll": grpclib.const.Handler( - self.__rpc_delete_all, - grpclib.const.Cardinality.UNARY_STREAM, - AssignedTagsConfigDeleteAllRequest, - AssignedTagsConfigDeleteAllResponse, - ), - } - - -class AutofillActionServiceBase(ServiceBase): - async def get_one( - self, autofill_action_request: "AutofillActionRequest" - ) -> "AutofillActionResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def get_all( - self, autofill_action_stream_request: "AutofillActionStreamRequest" - ) -> AsyncIterator["AutofillActionStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def subscribe( - self, autofill_action_stream_request: "AutofillActionStreamRequest" - ) -> AsyncIterator["AutofillActionStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def __rpc_get_one( + async def __rpc_subscribe( self, - stream: "grpclib.server.Stream[AutofillActionRequest, AutofillActionResponse]", + stream: "grpclib.server.Stream[AssignedTagsStreamRequest, AssignedTagsStreamResponse]", ) -> None: request = await stream.recv_message() - response = await self.get_one(request) + await self._call_rpc_handler_server_stream( + self.subscribe, + stream, + request, + ) + + async def __rpc_get_meta( + self, stream: "grpclib.server.Stream[AssignedTagsStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) await stream.send_message(response) - async def __rpc_get_all( + async def __rpc_subscribe_meta( + self, stream: "grpclib.server.Stream[AssignedTagsStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + + async def __rpc_get_all_batched( self, - stream: "grpclib.server.Stream[AutofillActionStreamRequest, AutofillActionStreamResponse]", + stream: "grpclib.server.Stream[AssignedTagsBatchedStreamRequest, AssignedTagsBatchedStreamResponse]", ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( - self.get_all, + self.get_all_batched, stream, request, ) - async def __rpc_subscribe( + async def __rpc_subscribe_batched( self, - stream: "grpclib.server.Stream[AutofillActionStreamRequest, AutofillActionStreamResponse]", + stream: "grpclib.server.Stream[AssignedTagsBatchedStreamRequest, AssignedTagsBatchedStreamResponse]", ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( - self.subscribe, + self.subscribe_batched, stream, request, ) def __mapping__(self) -> Dict[str, grpclib.const.Handler]: return { - "/arista.studio.v1.AutofillActionService/GetOne": grpclib.const.Handler( + "/arista.studio.v1.AssignedTagsService/GetOne": grpclib.const.Handler( self.__rpc_get_one, grpclib.const.Cardinality.UNARY_UNARY, - AutofillActionRequest, - AutofillActionResponse, + AssignedTagsRequest, + AssignedTagsResponse, ), - "/arista.studio.v1.AutofillActionService/GetAll": grpclib.const.Handler( + "/arista.studio.v1.AssignedTagsService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + AssignedTagsSomeRequest, + AssignedTagsSomeResponse, + ), + "/arista.studio.v1.AssignedTagsService/GetAll": grpclib.const.Handler( self.__rpc_get_all, grpclib.const.Cardinality.UNARY_STREAM, - AutofillActionStreamRequest, - AutofillActionStreamResponse, + AssignedTagsStreamRequest, + AssignedTagsStreamResponse, ), - "/arista.studio.v1.AutofillActionService/Subscribe": grpclib.const.Handler( + "/arista.studio.v1.AssignedTagsService/Subscribe": grpclib.const.Handler( self.__rpc_subscribe, grpclib.const.Cardinality.UNARY_STREAM, - AutofillActionStreamRequest, - AutofillActionStreamResponse, + AssignedTagsStreamRequest, + AssignedTagsStreamResponse, + ), + "/arista.studio.v1.AssignedTagsService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + AssignedTagsStreamRequest, + MetaResponse, + ), + "/arista.studio.v1.AssignedTagsService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + AssignedTagsStreamRequest, + MetaResponse, + ), + "/arista.studio.v1.AssignedTagsService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + AssignedTagsBatchedStreamRequest, + AssignedTagsBatchedStreamResponse, + ), + "/arista.studio.v1.AssignedTagsService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + AssignedTagsBatchedStreamRequest, + AssignedTagsBatchedStreamResponse, ), } -class AutofillActionConfigServiceBase(ServiceBase): +class AssignedTagsConfigServiceBase(ServiceBase): + async def get_one( - self, autofill_action_config_request: "AutofillActionConfigRequest" - ) -> "AutofillActionConfigResponse": + self, assigned_tags_config_request: "AssignedTagsConfigRequest" + ) -> "AssignedTagsConfigResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_some( + self, assigned_tags_config_some_request: "AssignedTagsConfigSomeRequest" + ) -> AsyncIterator["AssignedTagsConfigSomeResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) async def get_all( - self, autofill_action_config_stream_request: "AutofillActionConfigStreamRequest" - ) -> AsyncIterator["AutofillActionConfigStreamResponse"]: + self, assigned_tags_config_stream_request: "AssignedTagsConfigStreamRequest" + ) -> AsyncIterator["AssignedTagsConfigStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) async def subscribe( - self, autofill_action_config_stream_request: "AutofillActionConfigStreamRequest" - ) -> AsyncIterator["AutofillActionConfigStreamResponse"]: + self, assigned_tags_config_stream_request: "AssignedTagsConfigStreamRequest" + ) -> AsyncIterator["AssignedTagsConfigStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_meta( + self, assigned_tags_config_stream_request: "AssignedTagsConfigStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, assigned_tags_config_stream_request: "AssignedTagsConfigStreamRequest" + ) -> AsyncIterator["MetaResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) async def set( - self, autofill_action_config_set_request: "AutofillActionConfigSetRequest" - ) -> "AutofillActionConfigSetResponse": + self, assigned_tags_config_set_request: "AssignedTagsConfigSetRequest" + ) -> "AssignedTagsConfigSetResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) async def set_some( - self, - autofill_action_config_set_some_request: "AutofillActionConfigSetSomeRequest", - ) -> AsyncIterator["AutofillActionConfigSetSomeResponse"]: + self, assigned_tags_config_set_some_request: "AssignedTagsConfigSetSomeRequest" + ) -> AsyncIterator["AssignedTagsConfigSetSomeResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) async def delete( - self, autofill_action_config_delete_request: "AutofillActionConfigDeleteRequest" - ) -> "AutofillActionConfigDeleteResponse": + self, assigned_tags_config_delete_request: "AssignedTagsConfigDeleteRequest" + ) -> "AssignedTagsConfigDeleteResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def delete_some( + self, + assigned_tags_config_delete_some_request: "AssignedTagsConfigDeleteSomeRequest", + ) -> AsyncIterator["AssignedTagsConfigDeleteSomeResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) async def delete_all( self, - autofill_action_config_delete_all_request: "AutofillActionConfigDeleteAllRequest", - ) -> AsyncIterator["AutofillActionConfigDeleteAllResponse"]: + assigned_tags_config_delete_all_request: "AssignedTagsConfigDeleteAllRequest", + ) -> AsyncIterator["AssignedTagsConfigDeleteAllResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all_batched( + self, + assigned_tags_config_batched_stream_request: "AssignedTagsConfigBatchedStreamRequest", + ) -> AsyncIterator["AssignedTagsConfigBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, + assigned_tags_config_batched_stream_request: "AssignedTagsConfigBatchedStreamRequest", + ) -> AsyncIterator["AssignedTagsConfigBatchedStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) async def __rpc_get_one( self, - stream: "grpclib.server.Stream[AutofillActionConfigRequest, AutofillActionConfigResponse]", + stream: "grpclib.server.Stream[AssignedTagsConfigRequest, AssignedTagsConfigResponse]", ) -> None: request = await stream.recv_message() response = await self.get_one(request) await stream.send_message(response) + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[AssignedTagsConfigSomeRequest, AssignedTagsConfigSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + async def __rpc_get_all( self, - stream: "grpclib.server.Stream[AutofillActionConfigStreamRequest, AutofillActionConfigStreamResponse]", + stream: "grpclib.server.Stream[AssignedTagsConfigStreamRequest, AssignedTagsConfigStreamResponse]", ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( @@ -5167,7 +5504,7 @@ async def __rpc_get_all( async def __rpc_subscribe( self, - stream: "grpclib.server.Stream[AutofillActionConfigStreamRequest, AutofillActionConfigStreamResponse]", + stream: "grpclib.server.Stream[AssignedTagsConfigStreamRequest, AssignedTagsConfigStreamResponse]", ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( @@ -5176,9 +5513,28 @@ async def __rpc_subscribe( request, ) + async def __rpc_get_meta( + self, + stream: "grpclib.server.Stream[AssignedTagsConfigStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, + stream: "grpclib.server.Stream[AssignedTagsConfigStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + async def __rpc_set( self, - stream: "grpclib.server.Stream[AutofillActionConfigSetRequest, AutofillActionConfigSetResponse]", + stream: "grpclib.server.Stream[AssignedTagsConfigSetRequest, AssignedTagsConfigSetResponse]", ) -> None: request = await stream.recv_message() response = await self.set(request) @@ -5186,7 +5542,7 @@ async def __rpc_set( async def __rpc_set_some( self, - stream: "grpclib.server.Stream[AutofillActionConfigSetSomeRequest, AutofillActionConfigSetSomeResponse]", + stream: "grpclib.server.Stream[AssignedTagsConfigSetSomeRequest, AssignedTagsConfigSetSomeResponse]", ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( @@ -5197,180 +5553,205 @@ async def __rpc_set_some( async def __rpc_delete( self, - stream: "grpclib.server.Stream[AutofillActionConfigDeleteRequest, AutofillActionConfigDeleteResponse]", + stream: "grpclib.server.Stream[AssignedTagsConfigDeleteRequest, AssignedTagsConfigDeleteResponse]", ) -> None: request = await stream.recv_message() response = await self.delete(request) await stream.send_message(response) - async def __rpc_delete_all( + async def __rpc_delete_some( self, - stream: "grpclib.server.Stream[AutofillActionConfigDeleteAllRequest, AutofillActionConfigDeleteAllResponse]", + stream: "grpclib.server.Stream[AssignedTagsConfigDeleteSomeRequest, AssignedTagsConfigDeleteSomeResponse]", ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( - self.delete_all, + self.delete_some, stream, request, ) - def __mapping__(self) -> Dict[str, grpclib.const.Handler]: - return { - "/arista.studio.v1.AutofillActionConfigService/GetOne": grpclib.const.Handler( - self.__rpc_get_one, - grpclib.const.Cardinality.UNARY_UNARY, - AutofillActionConfigRequest, - AutofillActionConfigResponse, - ), - "/arista.studio.v1.AutofillActionConfigService/GetAll": grpclib.const.Handler( - self.__rpc_get_all, - grpclib.const.Cardinality.UNARY_STREAM, - AutofillActionConfigStreamRequest, - AutofillActionConfigStreamResponse, - ), - "/arista.studio.v1.AutofillActionConfigService/Subscribe": grpclib.const.Handler( - self.__rpc_subscribe, - grpclib.const.Cardinality.UNARY_STREAM, - AutofillActionConfigStreamRequest, - AutofillActionConfigStreamResponse, - ), - "/arista.studio.v1.AutofillActionConfigService/Set": grpclib.const.Handler( - self.__rpc_set, - grpclib.const.Cardinality.UNARY_UNARY, - AutofillActionConfigSetRequest, - AutofillActionConfigSetResponse, - ), - "/arista.studio.v1.AutofillActionConfigService/SetSome": grpclib.const.Handler( - self.__rpc_set_some, - grpclib.const.Cardinality.UNARY_STREAM, - AutofillActionConfigSetSomeRequest, - AutofillActionConfigSetSomeResponse, - ), - "/arista.studio.v1.AutofillActionConfigService/Delete": grpclib.const.Handler( - self.__rpc_delete, - grpclib.const.Cardinality.UNARY_UNARY, - AutofillActionConfigDeleteRequest, - AutofillActionConfigDeleteResponse, - ), - "/arista.studio.v1.AutofillActionConfigService/DeleteAll": grpclib.const.Handler( - self.__rpc_delete_all, - grpclib.const.Cardinality.UNARY_STREAM, - AutofillActionConfigDeleteAllRequest, - AutofillActionConfigDeleteAllResponse, - ), - } - - -class InputsServiceBase(ServiceBase): - async def get_one(self, inputs_request: "InputsRequest") -> "InputsResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def get_all( - self, inputs_stream_request: "InputsStreamRequest" - ) -> AsyncIterator["InputsStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def subscribe( - self, inputs_stream_request: "InputsStreamRequest" - ) -> AsyncIterator["InputsStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def __rpc_get_one( - self, stream: "grpclib.server.Stream[InputsRequest, InputsResponse]" + async def __rpc_delete_all( + self, + stream: "grpclib.server.Stream[AssignedTagsConfigDeleteAllRequest, AssignedTagsConfigDeleteAllResponse]", ) -> None: request = await stream.recv_message() - response = await self.get_one(request) - await stream.send_message(response) + await self._call_rpc_handler_server_stream( + self.delete_all, + stream, + request, + ) - async def __rpc_get_all( - self, stream: "grpclib.server.Stream[InputsStreamRequest, InputsStreamResponse]" + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[AssignedTagsConfigBatchedStreamRequest, AssignedTagsConfigBatchedStreamResponse]", ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( - self.get_all, + self.get_all_batched, stream, request, ) - async def __rpc_subscribe( - self, stream: "grpclib.server.Stream[InputsStreamRequest, InputsStreamResponse]" + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[AssignedTagsConfigBatchedStreamRequest, AssignedTagsConfigBatchedStreamResponse]", ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( - self.subscribe, + self.subscribe_batched, stream, request, ) def __mapping__(self) -> Dict[str, grpclib.const.Handler]: return { - "/arista.studio.v1.InputsService/GetOne": grpclib.const.Handler( + "/arista.studio.v1.AssignedTagsConfigService/GetOne": grpclib.const.Handler( self.__rpc_get_one, grpclib.const.Cardinality.UNARY_UNARY, - InputsRequest, - InputsResponse, + AssignedTagsConfigRequest, + AssignedTagsConfigResponse, + ), + "/arista.studio.v1.AssignedTagsConfigService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + AssignedTagsConfigSomeRequest, + AssignedTagsConfigSomeResponse, + ), + "/arista.studio.v1.AssignedTagsConfigService/GetAll": grpclib.const.Handler( + self.__rpc_get_all, + grpclib.const.Cardinality.UNARY_STREAM, + AssignedTagsConfigStreamRequest, + AssignedTagsConfigStreamResponse, + ), + "/arista.studio.v1.AssignedTagsConfigService/Subscribe": grpclib.const.Handler( + self.__rpc_subscribe, + grpclib.const.Cardinality.UNARY_STREAM, + AssignedTagsConfigStreamRequest, + AssignedTagsConfigStreamResponse, + ), + "/arista.studio.v1.AssignedTagsConfigService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + AssignedTagsConfigStreamRequest, + MetaResponse, + ), + "/arista.studio.v1.AssignedTagsConfigService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + AssignedTagsConfigStreamRequest, + MetaResponse, + ), + "/arista.studio.v1.AssignedTagsConfigService/Set": grpclib.const.Handler( + self.__rpc_set, + grpclib.const.Cardinality.UNARY_UNARY, + AssignedTagsConfigSetRequest, + AssignedTagsConfigSetResponse, + ), + "/arista.studio.v1.AssignedTagsConfigService/SetSome": grpclib.const.Handler( + self.__rpc_set_some, + grpclib.const.Cardinality.UNARY_STREAM, + AssignedTagsConfigSetSomeRequest, + AssignedTagsConfigSetSomeResponse, + ), + "/arista.studio.v1.AssignedTagsConfigService/Delete": grpclib.const.Handler( + self.__rpc_delete, + grpclib.const.Cardinality.UNARY_UNARY, + AssignedTagsConfigDeleteRequest, + AssignedTagsConfigDeleteResponse, ), - "/arista.studio.v1.InputsService/GetAll": grpclib.const.Handler( - self.__rpc_get_all, + "/arista.studio.v1.AssignedTagsConfigService/DeleteSome": grpclib.const.Handler( + self.__rpc_delete_some, grpclib.const.Cardinality.UNARY_STREAM, - InputsStreamRequest, - InputsStreamResponse, + AssignedTagsConfigDeleteSomeRequest, + AssignedTagsConfigDeleteSomeResponse, ), - "/arista.studio.v1.InputsService/Subscribe": grpclib.const.Handler( - self.__rpc_subscribe, + "/arista.studio.v1.AssignedTagsConfigService/DeleteAll": grpclib.const.Handler( + self.__rpc_delete_all, grpclib.const.Cardinality.UNARY_STREAM, - InputsStreamRequest, - InputsStreamResponse, + AssignedTagsConfigDeleteAllRequest, + AssignedTagsConfigDeleteAllResponse, + ), + "/arista.studio.v1.AssignedTagsConfigService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + AssignedTagsConfigBatchedStreamRequest, + AssignedTagsConfigBatchedStreamResponse, + ), + "/arista.studio.v1.AssignedTagsConfigService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + AssignedTagsConfigBatchedStreamRequest, + AssignedTagsConfigBatchedStreamResponse, ), } -class InputsConfigServiceBase(ServiceBase): +class AutofillActionServiceBase(ServiceBase): + async def get_one( - self, inputs_config_request: "InputsConfigRequest" - ) -> "InputsConfigResponse": + self, autofill_action_request: "AutofillActionRequest" + ) -> "AutofillActionResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_some( + self, autofill_action_some_request: "AutofillActionSomeRequest" + ) -> AsyncIterator["AutofillActionSomeResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) async def get_all( - self, inputs_config_stream_request: "InputsConfigStreamRequest" - ) -> AsyncIterator["InputsConfigStreamResponse"]: + self, autofill_action_stream_request: "AutofillActionStreamRequest" + ) -> AsyncIterator["AutofillActionStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) async def subscribe( - self, inputs_config_stream_request: "InputsConfigStreamRequest" - ) -> AsyncIterator["InputsConfigStreamResponse"]: + self, autofill_action_stream_request: "AutofillActionStreamRequest" + ) -> AsyncIterator["AutofillActionStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - async def set( - self, inputs_config_set_request: "InputsConfigSetRequest" - ) -> "InputsConfigSetResponse": + async def get_meta( + self, autofill_action_stream_request: "AutofillActionStreamRequest" + ) -> "MetaResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - async def set_some( - self, inputs_config_set_some_request: "InputsConfigSetSomeRequest" - ) -> AsyncIterator["InputsConfigSetSomeResponse"]: + async def subscribe_meta( + self, autofill_action_stream_request: "AutofillActionStreamRequest" + ) -> AsyncIterator["MetaResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - async def delete( - self, inputs_config_delete_request: "InputsConfigDeleteRequest" - ) -> "InputsConfigDeleteResponse": + async def get_all_batched( + self, + autofill_action_batched_stream_request: "AutofillActionBatchedStreamRequest", + ) -> AsyncIterator["AutofillActionBatchedStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - async def delete_all( - self, inputs_config_delete_all_request: "InputsConfigDeleteAllRequest" - ) -> AsyncIterator["InputsConfigDeleteAllResponse"]: + async def subscribe_batched( + self, + autofill_action_batched_stream_request: "AutofillActionBatchedStreamRequest", + ) -> AsyncIterator["AutofillActionBatchedStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) async def __rpc_get_one( - self, stream: "grpclib.server.Stream[InputsConfigRequest, InputsConfigResponse]" + self, + stream: "grpclib.server.Stream[AutofillActionRequest, AutofillActionResponse]", ) -> None: request = await stream.recv_message() response = await self.get_one(request) await stream.send_message(response) + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[AutofillActionSomeRequest, AutofillActionSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + async def __rpc_get_all( self, - stream: "grpclib.server.Stream[InputsConfigStreamRequest, InputsConfigStreamResponse]", + stream: "grpclib.server.Stream[AutofillActionStreamRequest, AutofillActionStreamResponse]", ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( @@ -5381,7 +5762,7 @@ async def __rpc_get_all( async def __rpc_subscribe( self, - stream: "grpclib.server.Stream[InputsConfigStreamRequest, InputsConfigStreamResponse]", + stream: "grpclib.server.Stream[AutofillActionStreamRequest, AutofillActionStreamResponse]", ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( @@ -5390,117 +5771,192 @@ async def __rpc_subscribe( request, ) - async def __rpc_set( - self, - stream: "grpclib.server.Stream[InputsConfigSetRequest, InputsConfigSetResponse]", + async def __rpc_get_meta( + self, stream: "grpclib.server.Stream[AutofillActionStreamRequest, MetaResponse]" ) -> None: request = await stream.recv_message() - response = await self.set(request) + response = await self.get_meta(request) await stream.send_message(response) - async def __rpc_set_some( - self, - stream: "grpclib.server.Stream[InputsConfigSetSomeRequest, InputsConfigSetSomeResponse]", + async def __rpc_subscribe_meta( + self, stream: "grpclib.server.Stream[AutofillActionStreamRequest, MetaResponse]" ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( - self.set_some, + self.subscribe_meta, stream, request, ) - async def __rpc_delete( + async def __rpc_get_all_batched( self, - stream: "grpclib.server.Stream[InputsConfigDeleteRequest, InputsConfigDeleteResponse]", + stream: "grpclib.server.Stream[AutofillActionBatchedStreamRequest, AutofillActionBatchedStreamResponse]", ) -> None: request = await stream.recv_message() - response = await self.delete(request) - await stream.send_message(response) + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) - async def __rpc_delete_all( + async def __rpc_subscribe_batched( self, - stream: "grpclib.server.Stream[InputsConfigDeleteAllRequest, InputsConfigDeleteAllResponse]", + stream: "grpclib.server.Stream[AutofillActionBatchedStreamRequest, AutofillActionBatchedStreamResponse]", ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( - self.delete_all, + self.subscribe_batched, stream, request, ) def __mapping__(self) -> Dict[str, grpclib.const.Handler]: return { - "/arista.studio.v1.InputsConfigService/GetOne": grpclib.const.Handler( + "/arista.studio.v1.AutofillActionService/GetOne": grpclib.const.Handler( self.__rpc_get_one, grpclib.const.Cardinality.UNARY_UNARY, - InputsConfigRequest, - InputsConfigResponse, + AutofillActionRequest, + AutofillActionResponse, ), - "/arista.studio.v1.InputsConfigService/GetAll": grpclib.const.Handler( + "/arista.studio.v1.AutofillActionService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + AutofillActionSomeRequest, + AutofillActionSomeResponse, + ), + "/arista.studio.v1.AutofillActionService/GetAll": grpclib.const.Handler( self.__rpc_get_all, grpclib.const.Cardinality.UNARY_STREAM, - InputsConfigStreamRequest, - InputsConfigStreamResponse, + AutofillActionStreamRequest, + AutofillActionStreamResponse, ), - "/arista.studio.v1.InputsConfigService/Subscribe": grpclib.const.Handler( + "/arista.studio.v1.AutofillActionService/Subscribe": grpclib.const.Handler( self.__rpc_subscribe, grpclib.const.Cardinality.UNARY_STREAM, - InputsConfigStreamRequest, - InputsConfigStreamResponse, + AutofillActionStreamRequest, + AutofillActionStreamResponse, ), - "/arista.studio.v1.InputsConfigService/Set": grpclib.const.Handler( - self.__rpc_set, + "/arista.studio.v1.AutofillActionService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, grpclib.const.Cardinality.UNARY_UNARY, - InputsConfigSetRequest, - InputsConfigSetResponse, + AutofillActionStreamRequest, + MetaResponse, ), - "/arista.studio.v1.InputsConfigService/SetSome": grpclib.const.Handler( - self.__rpc_set_some, + "/arista.studio.v1.AutofillActionService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, grpclib.const.Cardinality.UNARY_STREAM, - InputsConfigSetSomeRequest, - InputsConfigSetSomeResponse, + AutofillActionStreamRequest, + MetaResponse, ), - "/arista.studio.v1.InputsConfigService/Delete": grpclib.const.Handler( - self.__rpc_delete, - grpclib.const.Cardinality.UNARY_UNARY, - InputsConfigDeleteRequest, - InputsConfigDeleteResponse, + "/arista.studio.v1.AutofillActionService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + AutofillActionBatchedStreamRequest, + AutofillActionBatchedStreamResponse, ), - "/arista.studio.v1.InputsConfigService/DeleteAll": grpclib.const.Handler( - self.__rpc_delete_all, + "/arista.studio.v1.AutofillActionService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, grpclib.const.Cardinality.UNARY_STREAM, - InputsConfigDeleteAllRequest, - InputsConfigDeleteAllResponse, + AutofillActionBatchedStreamRequest, + AutofillActionBatchedStreamResponse, ), } -class SecretInputServiceBase(ServiceBase): +class AutofillActionConfigServiceBase(ServiceBase): + async def get_one( - self, secret_input_request: "SecretInputRequest" - ) -> "SecretInputResponse": + self, autofill_action_config_request: "AutofillActionConfigRequest" + ) -> "AutofillActionConfigResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_some( + self, autofill_action_config_some_request: "AutofillActionConfigSomeRequest" + ) -> AsyncIterator["AutofillActionConfigSomeResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) async def get_all( - self, secret_input_stream_request: "SecretInputStreamRequest" - ) -> AsyncIterator["SecretInputStreamResponse"]: + self, autofill_action_config_stream_request: "AutofillActionConfigStreamRequest" + ) -> AsyncIterator["AutofillActionConfigStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) async def subscribe( - self, secret_input_stream_request: "SecretInputStreamRequest" - ) -> AsyncIterator["SecretInputStreamResponse"]: + self, autofill_action_config_stream_request: "AutofillActionConfigStreamRequest" + ) -> AsyncIterator["AutofillActionConfigStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_meta( + self, autofill_action_config_stream_request: "AutofillActionConfigStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, autofill_action_config_stream_request: "AutofillActionConfigStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def set( + self, autofill_action_config_set_request: "AutofillActionConfigSetRequest" + ) -> "AutofillActionConfigSetResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def set_some( + self, + autofill_action_config_set_some_request: "AutofillActionConfigSetSomeRequest", + ) -> AsyncIterator["AutofillActionConfigSetSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def delete( + self, autofill_action_config_delete_request: "AutofillActionConfigDeleteRequest" + ) -> "AutofillActionConfigDeleteResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def delete_some( + self, + autofill_action_config_delete_some_request: "AutofillActionConfigDeleteSomeRequest", + ) -> AsyncIterator["AutofillActionConfigDeleteSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def delete_all( + self, + autofill_action_config_delete_all_request: "AutofillActionConfigDeleteAllRequest", + ) -> AsyncIterator["AutofillActionConfigDeleteAllResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all_batched( + self, + autofill_action_config_batched_stream_request: "AutofillActionConfigBatchedStreamRequest", + ) -> AsyncIterator["AutofillActionConfigBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, + autofill_action_config_batched_stream_request: "AutofillActionConfigBatchedStreamRequest", + ) -> AsyncIterator["AutofillActionConfigBatchedStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) async def __rpc_get_one( - self, stream: "grpclib.server.Stream[SecretInputRequest, SecretInputResponse]" + self, + stream: "grpclib.server.Stream[AutofillActionConfigRequest, AutofillActionConfigResponse]", ) -> None: request = await stream.recv_message() response = await self.get_one(request) await stream.send_message(response) + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[AutofillActionConfigSomeRequest, AutofillActionConfigSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + async def __rpc_get_all( self, - stream: "grpclib.server.Stream[SecretInputStreamRequest, SecretInputStreamResponse]", + stream: "grpclib.server.Stream[AutofillActionConfigStreamRequest, AutofillActionConfigStreamResponse]", ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( @@ -5511,7 +5967,7 @@ async def __rpc_get_all( async def __rpc_subscribe( self, - stream: "grpclib.server.Stream[SecretInputStreamRequest, SecretInputStreamResponse]", + stream: "grpclib.server.Stream[AutofillActionConfigStreamRequest, AutofillActionConfigStreamResponse]", ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( @@ -5520,139 +5976,238 @@ async def __rpc_subscribe( request, ) - def __mapping__(self) -> Dict[str, grpclib.const.Handler]: - return { - "/arista.studio.v1.SecretInputService/GetOne": grpclib.const.Handler( - self.__rpc_get_one, - grpclib.const.Cardinality.UNARY_UNARY, - SecretInputRequest, - SecretInputResponse, - ), - "/arista.studio.v1.SecretInputService/GetAll": grpclib.const.Handler( - self.__rpc_get_all, - grpclib.const.Cardinality.UNARY_STREAM, - SecretInputStreamRequest, - SecretInputStreamResponse, - ), - "/arista.studio.v1.SecretInputService/Subscribe": grpclib.const.Handler( - self.__rpc_subscribe, - grpclib.const.Cardinality.UNARY_STREAM, - SecretInputStreamRequest, - SecretInputStreamResponse, - ), - } - + async def __rpc_get_meta( + self, + stream: "grpclib.server.Stream[AutofillActionConfigStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) -class StudioServiceBase(ServiceBase): - async def get_one(self, studio_request: "StudioRequest") -> "StudioResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def __rpc_subscribe_meta( + self, + stream: "grpclib.server.Stream[AutofillActionConfigStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) - async def get_all( - self, studio_stream_request: "StudioStreamRequest" - ) -> AsyncIterator["StudioStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def __rpc_set( + self, + stream: "grpclib.server.Stream[AutofillActionConfigSetRequest, AutofillActionConfigSetResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.set(request) + await stream.send_message(response) - async def subscribe( - self, studio_stream_request: "StudioStreamRequest" - ) -> AsyncIterator["StudioStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def __rpc_set_some( + self, + stream: "grpclib.server.Stream[AutofillActionConfigSetSomeRequest, AutofillActionConfigSetSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.set_some, + stream, + request, + ) - async def __rpc_get_one( - self, stream: "grpclib.server.Stream[StudioRequest, StudioResponse]" + async def __rpc_delete( + self, + stream: "grpclib.server.Stream[AutofillActionConfigDeleteRequest, AutofillActionConfigDeleteResponse]", ) -> None: request = await stream.recv_message() - response = await self.get_one(request) + response = await self.delete(request) await stream.send_message(response) - async def __rpc_get_all( - self, stream: "grpclib.server.Stream[StudioStreamRequest, StudioStreamResponse]" + async def __rpc_delete_some( + self, + stream: "grpclib.server.Stream[AutofillActionConfigDeleteSomeRequest, AutofillActionConfigDeleteSomeResponse]", ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( - self.get_all, + self.delete_some, stream, request, ) - async def __rpc_subscribe( - self, stream: "grpclib.server.Stream[StudioStreamRequest, StudioStreamResponse]" + async def __rpc_delete_all( + self, + stream: "grpclib.server.Stream[AutofillActionConfigDeleteAllRequest, AutofillActionConfigDeleteAllResponse]", ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( - self.subscribe, + self.delete_all, + stream, + request, + ) + + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[AutofillActionConfigBatchedStreamRequest, AutofillActionConfigBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[AutofillActionConfigBatchedStreamRequest, AutofillActionConfigBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, stream, request, ) def __mapping__(self) -> Dict[str, grpclib.const.Handler]: return { - "/arista.studio.v1.StudioService/GetOne": grpclib.const.Handler( + "/arista.studio.v1.AutofillActionConfigService/GetOne": grpclib.const.Handler( self.__rpc_get_one, grpclib.const.Cardinality.UNARY_UNARY, - StudioRequest, - StudioResponse, + AutofillActionConfigRequest, + AutofillActionConfigResponse, ), - "/arista.studio.v1.StudioService/GetAll": grpclib.const.Handler( + "/arista.studio.v1.AutofillActionConfigService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + AutofillActionConfigSomeRequest, + AutofillActionConfigSomeResponse, + ), + "/arista.studio.v1.AutofillActionConfigService/GetAll": grpclib.const.Handler( self.__rpc_get_all, grpclib.const.Cardinality.UNARY_STREAM, - StudioStreamRequest, - StudioStreamResponse, + AutofillActionConfigStreamRequest, + AutofillActionConfigStreamResponse, ), - "/arista.studio.v1.StudioService/Subscribe": grpclib.const.Handler( + "/arista.studio.v1.AutofillActionConfigService/Subscribe": grpclib.const.Handler( self.__rpc_subscribe, grpclib.const.Cardinality.UNARY_STREAM, - StudioStreamRequest, - StudioStreamResponse, + AutofillActionConfigStreamRequest, + AutofillActionConfigStreamResponse, + ), + "/arista.studio.v1.AutofillActionConfigService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + AutofillActionConfigStreamRequest, + MetaResponse, + ), + "/arista.studio.v1.AutofillActionConfigService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + AutofillActionConfigStreamRequest, + MetaResponse, + ), + "/arista.studio.v1.AutofillActionConfigService/Set": grpclib.const.Handler( + self.__rpc_set, + grpclib.const.Cardinality.UNARY_UNARY, + AutofillActionConfigSetRequest, + AutofillActionConfigSetResponse, + ), + "/arista.studio.v1.AutofillActionConfigService/SetSome": grpclib.const.Handler( + self.__rpc_set_some, + grpclib.const.Cardinality.UNARY_STREAM, + AutofillActionConfigSetSomeRequest, + AutofillActionConfigSetSomeResponse, + ), + "/arista.studio.v1.AutofillActionConfigService/Delete": grpclib.const.Handler( + self.__rpc_delete, + grpclib.const.Cardinality.UNARY_UNARY, + AutofillActionConfigDeleteRequest, + AutofillActionConfigDeleteResponse, + ), + "/arista.studio.v1.AutofillActionConfigService/DeleteSome": grpclib.const.Handler( + self.__rpc_delete_some, + grpclib.const.Cardinality.UNARY_STREAM, + AutofillActionConfigDeleteSomeRequest, + AutofillActionConfigDeleteSomeResponse, + ), + "/arista.studio.v1.AutofillActionConfigService/DeleteAll": grpclib.const.Handler( + self.__rpc_delete_all, + grpclib.const.Cardinality.UNARY_STREAM, + AutofillActionConfigDeleteAllRequest, + AutofillActionConfigDeleteAllResponse, + ), + "/arista.studio.v1.AutofillActionConfigService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + AutofillActionConfigBatchedStreamRequest, + AutofillActionConfigBatchedStreamResponse, + ), + "/arista.studio.v1.AutofillActionConfigService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + AutofillActionConfigBatchedStreamRequest, + AutofillActionConfigBatchedStreamResponse, ), } -class StudioConfigServiceBase(ServiceBase): - async def get_one( - self, studio_config_request: "StudioConfigRequest" - ) -> "StudioConfigResponse": +class InputsServiceBase(ServiceBase): + + async def get_one(self, inputs_request: "InputsRequest") -> "InputsResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_some( + self, inputs_some_request: "InputsSomeRequest" + ) -> AsyncIterator["InputsSomeResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) async def get_all( - self, studio_config_stream_request: "StudioConfigStreamRequest" - ) -> AsyncIterator["StudioConfigStreamResponse"]: + self, inputs_stream_request: "InputsStreamRequest" + ) -> AsyncIterator["InputsStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) async def subscribe( - self, studio_config_stream_request: "StudioConfigStreamRequest" - ) -> AsyncIterator["StudioConfigStreamResponse"]: + self, inputs_stream_request: "InputsStreamRequest" + ) -> AsyncIterator["InputsStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - async def set( - self, studio_config_set_request: "StudioConfigSetRequest" - ) -> "StudioConfigSetResponse": + async def get_meta( + self, inputs_stream_request: "InputsStreamRequest" + ) -> "MetaResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - async def set_some( - self, studio_config_set_some_request: "StudioConfigSetSomeRequest" - ) -> AsyncIterator["StudioConfigSetSomeResponse"]: + async def subscribe_meta( + self, inputs_stream_request: "InputsStreamRequest" + ) -> AsyncIterator["MetaResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - async def delete( - self, studio_config_delete_request: "StudioConfigDeleteRequest" - ) -> "StudioConfigDeleteResponse": + async def get_all_batched( + self, inputs_batched_stream_request: "InputsBatchedStreamRequest" + ) -> AsyncIterator["InputsBatchedStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - async def delete_all( - self, studio_config_delete_all_request: "StudioConfigDeleteAllRequest" - ) -> AsyncIterator["StudioConfigDeleteAllResponse"]: + async def subscribe_batched( + self, inputs_batched_stream_request: "InputsBatchedStreamRequest" + ) -> AsyncIterator["InputsBatchedStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) async def __rpc_get_one( - self, stream: "grpclib.server.Stream[StudioConfigRequest, StudioConfigResponse]" + self, stream: "grpclib.server.Stream[InputsRequest, InputsResponse]" ) -> None: request = await stream.recv_message() response = await self.get_one(request) await stream.send_message(response) + async def __rpc_get_some( + self, stream: "grpclib.server.Stream[InputsSomeRequest, InputsSomeResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + async def __rpc_get_all( - self, - stream: "grpclib.server.Stream[StudioConfigStreamRequest, StudioConfigStreamResponse]", + self, stream: "grpclib.server.Stream[InputsStreamRequest, InputsStreamResponse]" ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( @@ -5662,8 +6217,7 @@ async def __rpc_get_all( ) async def __rpc_subscribe( - self, - stream: "grpclib.server.Stream[StudioConfigStreamRequest, StudioConfigStreamResponse]", + self, stream: "grpclib.server.Stream[InputsStreamRequest, InputsStreamResponse]" ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( @@ -5672,118 +6226,186 @@ async def __rpc_subscribe( request, ) - async def __rpc_set( - self, - stream: "grpclib.server.Stream[StudioConfigSetRequest, StudioConfigSetResponse]", + async def __rpc_get_meta( + self, stream: "grpclib.server.Stream[InputsStreamRequest, MetaResponse]" ) -> None: request = await stream.recv_message() - response = await self.set(request) + response = await self.get_meta(request) await stream.send_message(response) - async def __rpc_set_some( - self, - stream: "grpclib.server.Stream[StudioConfigSetSomeRequest, StudioConfigSetSomeResponse]", + async def __rpc_subscribe_meta( + self, stream: "grpclib.server.Stream[InputsStreamRequest, MetaResponse]" ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( - self.set_some, + self.subscribe_meta, stream, request, ) - async def __rpc_delete( + async def __rpc_get_all_batched( self, - stream: "grpclib.server.Stream[StudioConfigDeleteRequest, StudioConfigDeleteResponse]", + stream: "grpclib.server.Stream[InputsBatchedStreamRequest, InputsBatchedStreamResponse]", ) -> None: request = await stream.recv_message() - response = await self.delete(request) - await stream.send_message(response) + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) - async def __rpc_delete_all( + async def __rpc_subscribe_batched( self, - stream: "grpclib.server.Stream[StudioConfigDeleteAllRequest, StudioConfigDeleteAllResponse]", + stream: "grpclib.server.Stream[InputsBatchedStreamRequest, InputsBatchedStreamResponse]", ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( - self.delete_all, + self.subscribe_batched, stream, request, ) def __mapping__(self) -> Dict[str, grpclib.const.Handler]: return { - "/arista.studio.v1.StudioConfigService/GetOne": grpclib.const.Handler( + "/arista.studio.v1.InputsService/GetOne": grpclib.const.Handler( self.__rpc_get_one, grpclib.const.Cardinality.UNARY_UNARY, - StudioConfigRequest, - StudioConfigResponse, + InputsRequest, + InputsResponse, ), - "/arista.studio.v1.StudioConfigService/GetAll": grpclib.const.Handler( + "/arista.studio.v1.InputsService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + InputsSomeRequest, + InputsSomeResponse, + ), + "/arista.studio.v1.InputsService/GetAll": grpclib.const.Handler( self.__rpc_get_all, grpclib.const.Cardinality.UNARY_STREAM, - StudioConfigStreamRequest, - StudioConfigStreamResponse, + InputsStreamRequest, + InputsStreamResponse, ), - "/arista.studio.v1.StudioConfigService/Subscribe": grpclib.const.Handler( + "/arista.studio.v1.InputsService/Subscribe": grpclib.const.Handler( self.__rpc_subscribe, grpclib.const.Cardinality.UNARY_STREAM, - StudioConfigStreamRequest, - StudioConfigStreamResponse, + InputsStreamRequest, + InputsStreamResponse, ), - "/arista.studio.v1.StudioConfigService/Set": grpclib.const.Handler( - self.__rpc_set, + "/arista.studio.v1.InputsService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, grpclib.const.Cardinality.UNARY_UNARY, - StudioConfigSetRequest, - StudioConfigSetResponse, + InputsStreamRequest, + MetaResponse, ), - "/arista.studio.v1.StudioConfigService/SetSome": grpclib.const.Handler( - self.__rpc_set_some, + "/arista.studio.v1.InputsService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, grpclib.const.Cardinality.UNARY_STREAM, - StudioConfigSetSomeRequest, - StudioConfigSetSomeResponse, + InputsStreamRequest, + MetaResponse, ), - "/arista.studio.v1.StudioConfigService/Delete": grpclib.const.Handler( - self.__rpc_delete, - grpclib.const.Cardinality.UNARY_UNARY, - StudioConfigDeleteRequest, - StudioConfigDeleteResponse, + "/arista.studio.v1.InputsService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + InputsBatchedStreamRequest, + InputsBatchedStreamResponse, ), - "/arista.studio.v1.StudioConfigService/DeleteAll": grpclib.const.Handler( - self.__rpc_delete_all, + "/arista.studio.v1.InputsService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, grpclib.const.Cardinality.UNARY_STREAM, - StudioConfigDeleteAllRequest, - StudioConfigDeleteAllResponse, + InputsBatchedStreamRequest, + InputsBatchedStreamResponse, ), } -class StudioSummaryServiceBase(ServiceBase): +class InputsConfigServiceBase(ServiceBase): + async def get_one( - self, studio_summary_request: "StudioSummaryRequest" - ) -> "StudioSummaryResponse": + self, inputs_config_request: "InputsConfigRequest" + ) -> "InputsConfigResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_some( + self, inputs_config_some_request: "InputsConfigSomeRequest" + ) -> AsyncIterator["InputsConfigSomeResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) async def get_all( - self, studio_summary_stream_request: "StudioSummaryStreamRequest" - ) -> AsyncIterator["StudioSummaryStreamResponse"]: + self, inputs_config_stream_request: "InputsConfigStreamRequest" + ) -> AsyncIterator["InputsConfigStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) async def subscribe( - self, studio_summary_stream_request: "StudioSummaryStreamRequest" - ) -> AsyncIterator["StudioSummaryStreamResponse"]: + self, inputs_config_stream_request: "InputsConfigStreamRequest" + ) -> AsyncIterator["InputsConfigStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_meta( + self, inputs_config_stream_request: "InputsConfigStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, inputs_config_stream_request: "InputsConfigStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def set( + self, inputs_config_set_request: "InputsConfigSetRequest" + ) -> "InputsConfigSetResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def set_some( + self, inputs_config_set_some_request: "InputsConfigSetSomeRequest" + ) -> AsyncIterator["InputsConfigSetSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def delete( + self, inputs_config_delete_request: "InputsConfigDeleteRequest" + ) -> "InputsConfigDeleteResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def delete_some( + self, inputs_config_delete_some_request: "InputsConfigDeleteSomeRequest" + ) -> AsyncIterator["InputsConfigDeleteSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def delete_all( + self, inputs_config_delete_all_request: "InputsConfigDeleteAllRequest" + ) -> AsyncIterator["InputsConfigDeleteAllResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all_batched( + self, inputs_config_batched_stream_request: "InputsConfigBatchedStreamRequest" + ) -> AsyncIterator["InputsConfigBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, inputs_config_batched_stream_request: "InputsConfigBatchedStreamRequest" + ) -> AsyncIterator["InputsConfigBatchedStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) async def __rpc_get_one( - self, - stream: "grpclib.server.Stream[StudioSummaryRequest, StudioSummaryResponse]", + self, stream: "grpclib.server.Stream[InputsConfigRequest, InputsConfigResponse]" ) -> None: request = await stream.recv_message() response = await self.get_one(request) await stream.send_message(response) + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[InputsConfigSomeRequest, InputsConfigSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + async def __rpc_get_all( self, - stream: "grpclib.server.Stream[StudioSummaryStreamRequest, StudioSummaryStreamResponse]", + stream: "grpclib.server.Stream[InputsConfigStreamRequest, InputsConfigStreamResponse]", ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( @@ -5794,7 +6416,7 @@ async def __rpc_get_all( async def __rpc_subscribe( self, - stream: "grpclib.server.Stream[StudioSummaryStreamRequest, StudioSummaryStreamResponse]", + stream: "grpclib.server.Stream[InputsConfigStreamRequest, InputsConfigStreamResponse]", ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( @@ -5803,147 +6425,240 @@ async def __rpc_subscribe( request, ) - def __mapping__(self) -> Dict[str, grpclib.const.Handler]: - return { - "/arista.studio.v1.StudioSummaryService/GetOne": grpclib.const.Handler( - self.__rpc_get_one, - grpclib.const.Cardinality.UNARY_UNARY, - StudioSummaryRequest, - StudioSummaryResponse, - ), - "/arista.studio.v1.StudioSummaryService/GetAll": grpclib.const.Handler( - self.__rpc_get_all, - grpclib.const.Cardinality.UNARY_STREAM, - StudioSummaryStreamRequest, - StudioSummaryStreamResponse, - ), - "/arista.studio.v1.StudioSummaryService/Subscribe": grpclib.const.Handler( - self.__rpc_subscribe, - grpclib.const.Cardinality.UNARY_STREAM, - StudioSummaryStreamRequest, - StudioSummaryStreamResponse, - ), - } - + async def __rpc_get_meta( + self, stream: "grpclib.server.Stream[InputsConfigStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) -class TopologyInputServiceBase(ServiceBase): - async def get_one( - self, topology_input_request: "TopologyInputRequest" - ) -> "TopologyInputResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def __rpc_subscribe_meta( + self, stream: "grpclib.server.Stream[InputsConfigStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) - async def get_all( - self, topology_input_stream_request: "TopologyInputStreamRequest" - ) -> AsyncIterator["TopologyInputStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def __rpc_set( + self, + stream: "grpclib.server.Stream[InputsConfigSetRequest, InputsConfigSetResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.set(request) + await stream.send_message(response) - async def subscribe( - self, topology_input_stream_request: "TopologyInputStreamRequest" - ) -> AsyncIterator["TopologyInputStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def __rpc_set_some( + self, + stream: "grpclib.server.Stream[InputsConfigSetSomeRequest, InputsConfigSetSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.set_some, + stream, + request, + ) - async def __rpc_get_one( + async def __rpc_delete( self, - stream: "grpclib.server.Stream[TopologyInputRequest, TopologyInputResponse]", + stream: "grpclib.server.Stream[InputsConfigDeleteRequest, InputsConfigDeleteResponse]", ) -> None: request = await stream.recv_message() - response = await self.get_one(request) + response = await self.delete(request) await stream.send_message(response) - async def __rpc_get_all( + async def __rpc_delete_some( self, - stream: "grpclib.server.Stream[TopologyInputStreamRequest, TopologyInputStreamResponse]", + stream: "grpclib.server.Stream[InputsConfigDeleteSomeRequest, InputsConfigDeleteSomeResponse]", ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( - self.get_all, + self.delete_some, stream, request, ) - async def __rpc_subscribe( + async def __rpc_delete_all( self, - stream: "grpclib.server.Stream[TopologyInputStreamRequest, TopologyInputStreamResponse]", + stream: "grpclib.server.Stream[InputsConfigDeleteAllRequest, InputsConfigDeleteAllResponse]", ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( - self.subscribe, + self.delete_all, + stream, + request, + ) + + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[InputsConfigBatchedStreamRequest, InputsConfigBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[InputsConfigBatchedStreamRequest, InputsConfigBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, stream, request, ) def __mapping__(self) -> Dict[str, grpclib.const.Handler]: return { - "/arista.studio.v1.TopologyInputService/GetOne": grpclib.const.Handler( + "/arista.studio.v1.InputsConfigService/GetOne": grpclib.const.Handler( self.__rpc_get_one, grpclib.const.Cardinality.UNARY_UNARY, - TopologyInputRequest, - TopologyInputResponse, + InputsConfigRequest, + InputsConfigResponse, + ), + "/arista.studio.v1.InputsConfigService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + InputsConfigSomeRequest, + InputsConfigSomeResponse, ), - "/arista.studio.v1.TopologyInputService/GetAll": grpclib.const.Handler( + "/arista.studio.v1.InputsConfigService/GetAll": grpclib.const.Handler( self.__rpc_get_all, grpclib.const.Cardinality.UNARY_STREAM, - TopologyInputStreamRequest, - TopologyInputStreamResponse, + InputsConfigStreamRequest, + InputsConfigStreamResponse, ), - "/arista.studio.v1.TopologyInputService/Subscribe": grpclib.const.Handler( + "/arista.studio.v1.InputsConfigService/Subscribe": grpclib.const.Handler( self.__rpc_subscribe, grpclib.const.Cardinality.UNARY_STREAM, - TopologyInputStreamRequest, - TopologyInputStreamResponse, + InputsConfigStreamRequest, + InputsConfigStreamResponse, + ), + "/arista.studio.v1.InputsConfigService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + InputsConfigStreamRequest, + MetaResponse, + ), + "/arista.studio.v1.InputsConfigService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + InputsConfigStreamRequest, + MetaResponse, + ), + "/arista.studio.v1.InputsConfigService/Set": grpclib.const.Handler( + self.__rpc_set, + grpclib.const.Cardinality.UNARY_UNARY, + InputsConfigSetRequest, + InputsConfigSetResponse, + ), + "/arista.studio.v1.InputsConfigService/SetSome": grpclib.const.Handler( + self.__rpc_set_some, + grpclib.const.Cardinality.UNARY_STREAM, + InputsConfigSetSomeRequest, + InputsConfigSetSomeResponse, + ), + "/arista.studio.v1.InputsConfigService/Delete": grpclib.const.Handler( + self.__rpc_delete, + grpclib.const.Cardinality.UNARY_UNARY, + InputsConfigDeleteRequest, + InputsConfigDeleteResponse, + ), + "/arista.studio.v1.InputsConfigService/DeleteSome": grpclib.const.Handler( + self.__rpc_delete_some, + grpclib.const.Cardinality.UNARY_STREAM, + InputsConfigDeleteSomeRequest, + InputsConfigDeleteSomeResponse, + ), + "/arista.studio.v1.InputsConfigService/DeleteAll": grpclib.const.Handler( + self.__rpc_delete_all, + grpclib.const.Cardinality.UNARY_STREAM, + InputsConfigDeleteAllRequest, + InputsConfigDeleteAllResponse, + ), + "/arista.studio.v1.InputsConfigService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + InputsConfigBatchedStreamRequest, + InputsConfigBatchedStreamResponse, + ), + "/arista.studio.v1.InputsConfigService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + InputsConfigBatchedStreamRequest, + InputsConfigBatchedStreamResponse, ), } -class TopologyInputConfigServiceBase(ServiceBase): +class SecretInputServiceBase(ServiceBase): + async def get_one( - self, topology_input_config_request: "TopologyInputConfigRequest" - ) -> "TopologyInputConfigResponse": + self, secret_input_request: "SecretInputRequest" + ) -> "SecretInputResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_some( + self, secret_input_some_request: "SecretInputSomeRequest" + ) -> AsyncIterator["SecretInputSomeResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) async def get_all( - self, topology_input_config_stream_request: "TopologyInputConfigStreamRequest" - ) -> AsyncIterator["TopologyInputConfigStreamResponse"]: + self, secret_input_stream_request: "SecretInputStreamRequest" + ) -> AsyncIterator["SecretInputStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) async def subscribe( - self, topology_input_config_stream_request: "TopologyInputConfigStreamRequest" - ) -> AsyncIterator["TopologyInputConfigStreamResponse"]: + self, secret_input_stream_request: "SecretInputStreamRequest" + ) -> AsyncIterator["SecretInputStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - async def set( - self, topology_input_config_set_request: "TopologyInputConfigSetRequest" - ) -> "TopologyInputConfigSetResponse": + async def get_meta( + self, secret_input_stream_request: "SecretInputStreamRequest" + ) -> "MetaResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - async def set_some( - self, - topology_input_config_set_some_request: "TopologyInputConfigSetSomeRequest", - ) -> AsyncIterator["TopologyInputConfigSetSomeResponse"]: + async def subscribe_meta( + self, secret_input_stream_request: "SecretInputStreamRequest" + ) -> AsyncIterator["MetaResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - async def delete( - self, topology_input_config_delete_request: "TopologyInputConfigDeleteRequest" - ) -> "TopologyInputConfigDeleteResponse": + async def get_all_batched( + self, secret_input_batched_stream_request: "SecretInputBatchedStreamRequest" + ) -> AsyncIterator["SecretInputBatchedStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - async def delete_all( - self, - topology_input_config_delete_all_request: "TopologyInputConfigDeleteAllRequest", - ) -> AsyncIterator["TopologyInputConfigDeleteAllResponse"]: + async def subscribe_batched( + self, secret_input_batched_stream_request: "SecretInputBatchedStreamRequest" + ) -> AsyncIterator["SecretInputBatchedStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) async def __rpc_get_one( - self, - stream: "grpclib.server.Stream[TopologyInputConfigRequest, TopologyInputConfigResponse]", + self, stream: "grpclib.server.Stream[SecretInputRequest, SecretInputResponse]" ) -> None: request = await stream.recv_message() response = await self.get_one(request) await stream.send_message(response) + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[SecretInputSomeRequest, SecretInputSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + async def __rpc_get_all( self, - stream: "grpclib.server.Stream[TopologyInputConfigStreamRequest, TopologyInputConfigStreamResponse]", + stream: "grpclib.server.Stream[SecretInputStreamRequest, SecretInputStreamResponse]", ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( @@ -5954,7 +6669,7 @@ async def __rpc_get_all( async def __rpc_subscribe( self, - stream: "grpclib.server.Stream[TopologyInputConfigStreamRequest, TopologyInputConfigStreamResponse]", + stream: "grpclib.server.Stream[SecretInputStreamRequest, SecretInputStreamResponse]", ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( @@ -5963,209 +6678,355 @@ async def __rpc_subscribe( request, ) - async def __rpc_set( - self, - stream: "grpclib.server.Stream[TopologyInputConfigSetRequest, TopologyInputConfigSetResponse]", + async def __rpc_get_meta( + self, stream: "grpclib.server.Stream[SecretInputStreamRequest, MetaResponse]" ) -> None: request = await stream.recv_message() - response = await self.set(request) + response = await self.get_meta(request) await stream.send_message(response) - async def __rpc_set_some( - self, - stream: "grpclib.server.Stream[TopologyInputConfigSetSomeRequest, TopologyInputConfigSetSomeResponse]", + async def __rpc_subscribe_meta( + self, stream: "grpclib.server.Stream[SecretInputStreamRequest, MetaResponse]" ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( - self.set_some, + self.subscribe_meta, stream, request, ) - async def __rpc_delete( + async def __rpc_get_all_batched( self, - stream: "grpclib.server.Stream[TopologyInputConfigDeleteRequest, TopologyInputConfigDeleteResponse]", + stream: "grpclib.server.Stream[SecretInputBatchedStreamRequest, SecretInputBatchedStreamResponse]", ) -> None: request = await stream.recv_message() - response = await self.delete(request) - await stream.send_message(response) + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) - async def __rpc_delete_all( + async def __rpc_subscribe_batched( self, - stream: "grpclib.server.Stream[TopologyInputConfigDeleteAllRequest, TopologyInputConfigDeleteAllResponse]", + stream: "grpclib.server.Stream[SecretInputBatchedStreamRequest, SecretInputBatchedStreamResponse]", ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( - self.delete_all, + self.subscribe_batched, stream, request, ) def __mapping__(self) -> Dict[str, grpclib.const.Handler]: return { - "/arista.studio.v1.TopologyInputConfigService/GetOne": grpclib.const.Handler( + "/arista.studio.v1.SecretInputService/GetOne": grpclib.const.Handler( self.__rpc_get_one, grpclib.const.Cardinality.UNARY_UNARY, - TopologyInputConfigRequest, - TopologyInputConfigResponse, + SecretInputRequest, + SecretInputResponse, + ), + "/arista.studio.v1.SecretInputService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + SecretInputSomeRequest, + SecretInputSomeResponse, ), - "/arista.studio.v1.TopologyInputConfigService/GetAll": grpclib.const.Handler( + "/arista.studio.v1.SecretInputService/GetAll": grpclib.const.Handler( self.__rpc_get_all, grpclib.const.Cardinality.UNARY_STREAM, - TopologyInputConfigStreamRequest, - TopologyInputConfigStreamResponse, + SecretInputStreamRequest, + SecretInputStreamResponse, ), - "/arista.studio.v1.TopologyInputConfigService/Subscribe": grpclib.const.Handler( + "/arista.studio.v1.SecretInputService/Subscribe": grpclib.const.Handler( self.__rpc_subscribe, grpclib.const.Cardinality.UNARY_STREAM, - TopologyInputConfigStreamRequest, - TopologyInputConfigStreamResponse, + SecretInputStreamRequest, + SecretInputStreamResponse, ), - "/arista.studio.v1.TopologyInputConfigService/Set": grpclib.const.Handler( - self.__rpc_set, + "/arista.studio.v1.SecretInputService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, grpclib.const.Cardinality.UNARY_UNARY, - TopologyInputConfigSetRequest, - TopologyInputConfigSetResponse, + SecretInputStreamRequest, + MetaResponse, ), - "/arista.studio.v1.TopologyInputConfigService/SetSome": grpclib.const.Handler( - self.__rpc_set_some, + "/arista.studio.v1.SecretInputService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, grpclib.const.Cardinality.UNARY_STREAM, - TopologyInputConfigSetSomeRequest, - TopologyInputConfigSetSomeResponse, + SecretInputStreamRequest, + MetaResponse, ), - "/arista.studio.v1.TopologyInputConfigService/Delete": grpclib.const.Handler( - self.__rpc_delete, - grpclib.const.Cardinality.UNARY_UNARY, - TopologyInputConfigDeleteRequest, - TopologyInputConfigDeleteResponse, + "/arista.studio.v1.SecretInputService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + SecretInputBatchedStreamRequest, + SecretInputBatchedStreamResponse, ), - "/arista.studio.v1.TopologyInputConfigService/DeleteAll": grpclib.const.Handler( - self.__rpc_delete_all, + "/arista.studio.v1.SecretInputService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, grpclib.const.Cardinality.UNARY_STREAM, - TopologyInputConfigDeleteAllRequest, - TopologyInputConfigDeleteAllResponse, + SecretInputBatchedStreamRequest, + SecretInputBatchedStreamResponse, ), } -class TopologyUpdateServiceBase(ServiceBase): - async def get_one( - self, topology_update_request: "TopologyUpdateRequest" - ) -> "TopologyUpdateResponse": +class StudioServiceBase(ServiceBase): + + async def get_one(self, studio_request: "StudioRequest") -> "StudioResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_some( + self, studio_some_request: "StudioSomeRequest" + ) -> AsyncIterator["StudioSomeResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) async def get_all( - self, topology_update_stream_request: "TopologyUpdateStreamRequest" - ) -> AsyncIterator["TopologyUpdateStreamResponse"]: + self, studio_stream_request: "StudioStreamRequest" + ) -> AsyncIterator["StudioStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) async def subscribe( - self, topology_update_stream_request: "TopologyUpdateStreamRequest" - ) -> AsyncIterator["TopologyUpdateStreamResponse"]: + self, studio_stream_request: "StudioStreamRequest" + ) -> AsyncIterator["StudioStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_meta( + self, studio_stream_request: "StudioStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, studio_stream_request: "StudioStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all_batched( + self, studio_batched_stream_request: "StudioBatchedStreamRequest" + ) -> AsyncIterator["StudioBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, studio_batched_stream_request: "StudioBatchedStreamRequest" + ) -> AsyncIterator["StudioBatchedStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) async def __rpc_get_one( - self, - stream: "grpclib.server.Stream[TopologyUpdateRequest, TopologyUpdateResponse]", + self, stream: "grpclib.server.Stream[StudioRequest, StudioResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_one(request) + await stream.send_message(response) + + async def __rpc_get_some( + self, stream: "grpclib.server.Stream[StudioSomeRequest, StudioSomeResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + + async def __rpc_get_all( + self, stream: "grpclib.server.Stream[StudioStreamRequest, StudioStreamResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all, + stream, + request, + ) + + async def __rpc_subscribe( + self, stream: "grpclib.server.Stream[StudioStreamRequest, StudioStreamResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe, + stream, + request, + ) + + async def __rpc_get_meta( + self, stream: "grpclib.server.Stream[StudioStreamRequest, MetaResponse]" ) -> None: request = await stream.recv_message() - response = await self.get_one(request) + response = await self.get_meta(request) await stream.send_message(response) - async def __rpc_get_all( + async def __rpc_subscribe_meta( + self, stream: "grpclib.server.Stream[StudioStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + + async def __rpc_get_all_batched( self, - stream: "grpclib.server.Stream[TopologyUpdateStreamRequest, TopologyUpdateStreamResponse]", + stream: "grpclib.server.Stream[StudioBatchedStreamRequest, StudioBatchedStreamResponse]", ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( - self.get_all, + self.get_all_batched, stream, request, ) - async def __rpc_subscribe( + async def __rpc_subscribe_batched( self, - stream: "grpclib.server.Stream[TopologyUpdateStreamRequest, TopologyUpdateStreamResponse]", + stream: "grpclib.server.Stream[StudioBatchedStreamRequest, StudioBatchedStreamResponse]", ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( - self.subscribe, + self.subscribe_batched, stream, request, ) def __mapping__(self) -> Dict[str, grpclib.const.Handler]: return { - "/arista.studio.v1.TopologyUpdateService/GetOne": grpclib.const.Handler( + "/arista.studio.v1.StudioService/GetOne": grpclib.const.Handler( self.__rpc_get_one, grpclib.const.Cardinality.UNARY_UNARY, - TopologyUpdateRequest, - TopologyUpdateResponse, + StudioRequest, + StudioResponse, + ), + "/arista.studio.v1.StudioService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + StudioSomeRequest, + StudioSomeResponse, ), - "/arista.studio.v1.TopologyUpdateService/GetAll": grpclib.const.Handler( + "/arista.studio.v1.StudioService/GetAll": grpclib.const.Handler( self.__rpc_get_all, grpclib.const.Cardinality.UNARY_STREAM, - TopologyUpdateStreamRequest, - TopologyUpdateStreamResponse, + StudioStreamRequest, + StudioStreamResponse, ), - "/arista.studio.v1.TopologyUpdateService/Subscribe": grpclib.const.Handler( + "/arista.studio.v1.StudioService/Subscribe": grpclib.const.Handler( self.__rpc_subscribe, grpclib.const.Cardinality.UNARY_STREAM, - TopologyUpdateStreamRequest, - TopologyUpdateStreamResponse, + StudioStreamRequest, + StudioStreamResponse, + ), + "/arista.studio.v1.StudioService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + StudioStreamRequest, + MetaResponse, + ), + "/arista.studio.v1.StudioService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + StudioStreamRequest, + MetaResponse, + ), + "/arista.studio.v1.StudioService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + StudioBatchedStreamRequest, + StudioBatchedStreamResponse, + ), + "/arista.studio.v1.StudioService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + StudioBatchedStreamRequest, + StudioBatchedStreamResponse, ), } -class TopologyUpdateConfigServiceBase(ServiceBase): +class StudioConfigServiceBase(ServiceBase): + async def get_one( - self, topology_update_config_request: "TopologyUpdateConfigRequest" - ) -> "TopologyUpdateConfigResponse": + self, studio_config_request: "StudioConfigRequest" + ) -> "StudioConfigResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_some( + self, studio_config_some_request: "StudioConfigSomeRequest" + ) -> AsyncIterator["StudioConfigSomeResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) async def get_all( - self, topology_update_config_stream_request: "TopologyUpdateConfigStreamRequest" - ) -> AsyncIterator["TopologyUpdateConfigStreamResponse"]: + self, studio_config_stream_request: "StudioConfigStreamRequest" + ) -> AsyncIterator["StudioConfigStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) async def subscribe( - self, topology_update_config_stream_request: "TopologyUpdateConfigStreamRequest" - ) -> AsyncIterator["TopologyUpdateConfigStreamResponse"]: + self, studio_config_stream_request: "StudioConfigStreamRequest" + ) -> AsyncIterator["StudioConfigStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_meta( + self, studio_config_stream_request: "StudioConfigStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, studio_config_stream_request: "StudioConfigStreamRequest" + ) -> AsyncIterator["MetaResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) async def set( - self, topology_update_config_set_request: "TopologyUpdateConfigSetRequest" - ) -> "TopologyUpdateConfigSetResponse": + self, studio_config_set_request: "StudioConfigSetRequest" + ) -> "StudioConfigSetResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) async def set_some( - self, - topology_update_config_set_some_request: "TopologyUpdateConfigSetSomeRequest", - ) -> AsyncIterator["TopologyUpdateConfigSetSomeResponse"]: + self, studio_config_set_some_request: "StudioConfigSetSomeRequest" + ) -> AsyncIterator["StudioConfigSetSomeResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) async def delete( - self, topology_update_config_delete_request: "TopologyUpdateConfigDeleteRequest" - ) -> "TopologyUpdateConfigDeleteResponse": + self, studio_config_delete_request: "StudioConfigDeleteRequest" + ) -> "StudioConfigDeleteResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def delete_some( + self, studio_config_delete_some_request: "StudioConfigDeleteSomeRequest" + ) -> AsyncIterator["StudioConfigDeleteSomeResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) async def delete_all( - self, - topology_update_config_delete_all_request: "TopologyUpdateConfigDeleteAllRequest", - ) -> AsyncIterator["TopologyUpdateConfigDeleteAllResponse"]: + self, studio_config_delete_all_request: "StudioConfigDeleteAllRequest" + ) -> AsyncIterator["StudioConfigDeleteAllResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all_batched( + self, studio_config_batched_stream_request: "StudioConfigBatchedStreamRequest" + ) -> AsyncIterator["StudioConfigBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, studio_config_batched_stream_request: "StudioConfigBatchedStreamRequest" + ) -> AsyncIterator["StudioConfigBatchedStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) async def __rpc_get_one( - self, - stream: "grpclib.server.Stream[TopologyUpdateConfigRequest, TopologyUpdateConfigResponse]", + self, stream: "grpclib.server.Stream[StudioConfigRequest, StudioConfigResponse]" ) -> None: request = await stream.recv_message() response = await self.get_one(request) await stream.send_message(response) + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[StudioConfigSomeRequest, StudioConfigSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + async def __rpc_get_all( self, - stream: "grpclib.server.Stream[TopologyUpdateConfigStreamRequest, TopologyUpdateConfigStreamResponse]", + stream: "grpclib.server.Stream[StudioConfigStreamRequest, StudioConfigStreamResponse]", ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( @@ -6176,7 +7037,7 @@ async def __rpc_get_all( async def __rpc_subscribe( self, - stream: "grpclib.server.Stream[TopologyUpdateConfigStreamRequest, TopologyUpdateConfigStreamResponse]", + stream: "grpclib.server.Stream[StudioConfigStreamRequest, StudioConfigStreamResponse]", ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( @@ -6185,9 +7046,26 @@ async def __rpc_subscribe( request, ) + async def __rpc_get_meta( + self, stream: "grpclib.server.Stream[StudioConfigStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, stream: "grpclib.server.Stream[StudioConfigStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + async def __rpc_set( self, - stream: "grpclib.server.Stream[TopologyUpdateConfigSetRequest, TopologyUpdateConfigSetResponse]", + stream: "grpclib.server.Stream[StudioConfigSetRequest, StudioConfigSetResponse]", ) -> None: request = await stream.recv_message() response = await self.set(request) @@ -6195,7 +7073,7 @@ async def __rpc_set( async def __rpc_set_some( self, - stream: "grpclib.server.Stream[TopologyUpdateConfigSetSomeRequest, TopologyUpdateConfigSetSomeResponse]", + stream: "grpclib.server.Stream[StudioConfigSetSomeRequest, StudioConfigSetSomeResponse]", ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( @@ -6206,192 +7084,203 @@ async def __rpc_set_some( async def __rpc_delete( self, - stream: "grpclib.server.Stream[TopologyUpdateConfigDeleteRequest, TopologyUpdateConfigDeleteResponse]", + stream: "grpclib.server.Stream[StudioConfigDeleteRequest, StudioConfigDeleteResponse]", ) -> None: request = await stream.recv_message() response = await self.delete(request) await stream.send_message(response) - async def __rpc_delete_all( + async def __rpc_delete_some( self, - stream: "grpclib.server.Stream[TopologyUpdateConfigDeleteAllRequest, TopologyUpdateConfigDeleteAllResponse]", + stream: "grpclib.server.Stream[StudioConfigDeleteSomeRequest, StudioConfigDeleteSomeResponse]", ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( - self.delete_all, + self.delete_some, stream, request, ) - def __mapping__(self) -> Dict[str, grpclib.const.Handler]: - return { - "/arista.studio.v1.TopologyUpdateConfigService/GetOne": grpclib.const.Handler( - self.__rpc_get_one, - grpclib.const.Cardinality.UNARY_UNARY, - TopologyUpdateConfigRequest, - TopologyUpdateConfigResponse, - ), - "/arista.studio.v1.TopologyUpdateConfigService/GetAll": grpclib.const.Handler( - self.__rpc_get_all, - grpclib.const.Cardinality.UNARY_STREAM, - TopologyUpdateConfigStreamRequest, - TopologyUpdateConfigStreamResponse, - ), - "/arista.studio.v1.TopologyUpdateConfigService/Subscribe": grpclib.const.Handler( - self.__rpc_subscribe, - grpclib.const.Cardinality.UNARY_STREAM, - TopologyUpdateConfigStreamRequest, - TopologyUpdateConfigStreamResponse, - ), - "/arista.studio.v1.TopologyUpdateConfigService/Set": grpclib.const.Handler( - self.__rpc_set, - grpclib.const.Cardinality.UNARY_UNARY, - TopologyUpdateConfigSetRequest, - TopologyUpdateConfigSetResponse, - ), - "/arista.studio.v1.TopologyUpdateConfigService/SetSome": grpclib.const.Handler( - self.__rpc_set_some, - grpclib.const.Cardinality.UNARY_STREAM, - TopologyUpdateConfigSetSomeRequest, - TopologyUpdateConfigSetSomeResponse, - ), - "/arista.studio.v1.TopologyUpdateConfigService/Delete": grpclib.const.Handler( - self.__rpc_delete, - grpclib.const.Cardinality.UNARY_UNARY, - TopologyUpdateConfigDeleteRequest, - TopologyUpdateConfigDeleteResponse, - ), - "/arista.studio.v1.TopologyUpdateConfigService/DeleteAll": grpclib.const.Handler( - self.__rpc_delete_all, - grpclib.const.Cardinality.UNARY_STREAM, - TopologyUpdateConfigDeleteAllRequest, - TopologyUpdateConfigDeleteAllResponse, - ), - } - - -class TopologyUpdateSyncServiceBase(ServiceBase): - async def get_one( - self, topology_update_sync_request: "TopologyUpdateSyncRequest" - ) -> "TopologyUpdateSyncResponse": - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def get_all( - self, topology_update_sync_stream_request: "TopologyUpdateSyncStreamRequest" - ) -> AsyncIterator["TopologyUpdateSyncStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def subscribe( - self, topology_update_sync_stream_request: "TopologyUpdateSyncStreamRequest" - ) -> AsyncIterator["TopologyUpdateSyncStreamResponse"]: - raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - - async def __rpc_get_one( + async def __rpc_delete_all( self, - stream: "grpclib.server.Stream[TopologyUpdateSyncRequest, TopologyUpdateSyncResponse]", + stream: "grpclib.server.Stream[StudioConfigDeleteAllRequest, StudioConfigDeleteAllResponse]", ) -> None: request = await stream.recv_message() - response = await self.get_one(request) - await stream.send_message(response) + await self._call_rpc_handler_server_stream( + self.delete_all, + stream, + request, + ) - async def __rpc_get_all( + async def __rpc_get_all_batched( self, - stream: "grpclib.server.Stream[TopologyUpdateSyncStreamRequest, TopologyUpdateSyncStreamResponse]", + stream: "grpclib.server.Stream[StudioConfigBatchedStreamRequest, StudioConfigBatchedStreamResponse]", ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( - self.get_all, + self.get_all_batched, stream, request, ) - async def __rpc_subscribe( + async def __rpc_subscribe_batched( self, - stream: "grpclib.server.Stream[TopologyUpdateSyncStreamRequest, TopologyUpdateSyncStreamResponse]", + stream: "grpclib.server.Stream[StudioConfigBatchedStreamRequest, StudioConfigBatchedStreamResponse]", ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( - self.subscribe, + self.subscribe_batched, stream, request, ) def __mapping__(self) -> Dict[str, grpclib.const.Handler]: return { - "/arista.studio.v1.TopologyUpdateSyncService/GetOne": grpclib.const.Handler( + "/arista.studio.v1.StudioConfigService/GetOne": grpclib.const.Handler( self.__rpc_get_one, grpclib.const.Cardinality.UNARY_UNARY, - TopologyUpdateSyncRequest, - TopologyUpdateSyncResponse, + StudioConfigRequest, + StudioConfigResponse, + ), + "/arista.studio.v1.StudioConfigService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + StudioConfigSomeRequest, + StudioConfigSomeResponse, ), - "/arista.studio.v1.TopologyUpdateSyncService/GetAll": grpclib.const.Handler( + "/arista.studio.v1.StudioConfigService/GetAll": grpclib.const.Handler( self.__rpc_get_all, grpclib.const.Cardinality.UNARY_STREAM, - TopologyUpdateSyncStreamRequest, - TopologyUpdateSyncStreamResponse, + StudioConfigStreamRequest, + StudioConfigStreamResponse, ), - "/arista.studio.v1.TopologyUpdateSyncService/Subscribe": grpclib.const.Handler( + "/arista.studio.v1.StudioConfigService/Subscribe": grpclib.const.Handler( self.__rpc_subscribe, grpclib.const.Cardinality.UNARY_STREAM, - TopologyUpdateSyncStreamRequest, - TopologyUpdateSyncStreamResponse, + StudioConfigStreamRequest, + StudioConfigStreamResponse, + ), + "/arista.studio.v1.StudioConfigService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + StudioConfigStreamRequest, + MetaResponse, + ), + "/arista.studio.v1.StudioConfigService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + StudioConfigStreamRequest, + MetaResponse, + ), + "/arista.studio.v1.StudioConfigService/Set": grpclib.const.Handler( + self.__rpc_set, + grpclib.const.Cardinality.UNARY_UNARY, + StudioConfigSetRequest, + StudioConfigSetResponse, + ), + "/arista.studio.v1.StudioConfigService/SetSome": grpclib.const.Handler( + self.__rpc_set_some, + grpclib.const.Cardinality.UNARY_STREAM, + StudioConfigSetSomeRequest, + StudioConfigSetSomeResponse, + ), + "/arista.studio.v1.StudioConfigService/Delete": grpclib.const.Handler( + self.__rpc_delete, + grpclib.const.Cardinality.UNARY_UNARY, + StudioConfigDeleteRequest, + StudioConfigDeleteResponse, + ), + "/arista.studio.v1.StudioConfigService/DeleteSome": grpclib.const.Handler( + self.__rpc_delete_some, + grpclib.const.Cardinality.UNARY_STREAM, + StudioConfigDeleteSomeRequest, + StudioConfigDeleteSomeResponse, + ), + "/arista.studio.v1.StudioConfigService/DeleteAll": grpclib.const.Handler( + self.__rpc_delete_all, + grpclib.const.Cardinality.UNARY_STREAM, + StudioConfigDeleteAllRequest, + StudioConfigDeleteAllResponse, + ), + "/arista.studio.v1.StudioConfigService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + StudioConfigBatchedStreamRequest, + StudioConfigBatchedStreamResponse, + ), + "/arista.studio.v1.StudioConfigService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + StudioConfigBatchedStreamRequest, + StudioConfigBatchedStreamResponse, ), } -class TopologyUpdateSyncConfigServiceBase(ServiceBase): +class StudioSummaryServiceBase(ServiceBase): + async def get_one( - self, topology_update_sync_config_request: "TopologyUpdateSyncConfigRequest" - ) -> "TopologyUpdateSyncConfigResponse": + self, studio_summary_request: "StudioSummaryRequest" + ) -> "StudioSummaryResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_some( + self, studio_summary_some_request: "StudioSummarySomeRequest" + ) -> AsyncIterator["StudioSummarySomeResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) async def get_all( - self, - topology_update_sync_config_stream_request: "TopologyUpdateSyncConfigStreamRequest", - ) -> AsyncIterator["TopologyUpdateSyncConfigStreamResponse"]: + self, studio_summary_stream_request: "StudioSummaryStreamRequest" + ) -> AsyncIterator["StudioSummaryStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) async def subscribe( - self, - topology_update_sync_config_stream_request: "TopologyUpdateSyncConfigStreamRequest", - ) -> AsyncIterator["TopologyUpdateSyncConfigStreamResponse"]: + self, studio_summary_stream_request: "StudioSummaryStreamRequest" + ) -> AsyncIterator["StudioSummaryStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - async def set( - self, - topology_update_sync_config_set_request: "TopologyUpdateSyncConfigSetRequest", - ) -> "TopologyUpdateSyncConfigSetResponse": + async def get_meta( + self, studio_summary_stream_request: "StudioSummaryStreamRequest" + ) -> "MetaResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - async def set_some( - self, - topology_update_sync_config_set_some_request: "TopologyUpdateSyncConfigSetSomeRequest", - ) -> AsyncIterator["TopologyUpdateSyncConfigSetSomeResponse"]: + async def subscribe_meta( + self, studio_summary_stream_request: "StudioSummaryStreamRequest" + ) -> AsyncIterator["MetaResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - async def delete( - self, - topology_update_sync_config_delete_request: "TopologyUpdateSyncConfigDeleteRequest", - ) -> "TopologyUpdateSyncConfigDeleteResponse": + async def get_all_batched( + self, studio_summary_batched_stream_request: "StudioSummaryBatchedStreamRequest" + ) -> AsyncIterator["StudioSummaryBatchedStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - async def delete_all( - self, - topology_update_sync_config_delete_all_request: "TopologyUpdateSyncConfigDeleteAllRequest", - ) -> AsyncIterator["TopologyUpdateSyncConfigDeleteAllResponse"]: + async def subscribe_batched( + self, studio_summary_batched_stream_request: "StudioSummaryBatchedStreamRequest" + ) -> AsyncIterator["StudioSummaryBatchedStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) async def __rpc_get_one( self, - stream: "grpclib.server.Stream[TopologyUpdateSyncConfigRequest, TopologyUpdateSyncConfigResponse]", + stream: "grpclib.server.Stream[StudioSummaryRequest, StudioSummaryResponse]", ) -> None: request = await stream.recv_message() response = await self.get_one(request) await stream.send_message(response) + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[StudioSummarySomeRequest, StudioSummarySomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + async def __rpc_get_all( self, - stream: "grpclib.server.Stream[TopologyUpdateSyncConfigStreamRequest, TopologyUpdateSyncConfigStreamResponse]", + stream: "grpclib.server.Stream[StudioSummaryStreamRequest, StudioSummaryStreamResponse]", ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( @@ -6402,7 +7291,7 @@ async def __rpc_get_all( async def __rpc_subscribe( self, - stream: "grpclib.server.Stream[TopologyUpdateSyncConfigStreamRequest, TopologyUpdateSyncConfigStreamResponse]", + stream: "grpclib.server.Stream[StudioSummaryStreamRequest, StudioSummaryStreamResponse]", ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( @@ -6411,86 +7300,93 @@ async def __rpc_subscribe( request, ) - async def __rpc_set( - self, - stream: "grpclib.server.Stream[TopologyUpdateSyncConfigSetRequest, TopologyUpdateSyncConfigSetResponse]", + async def __rpc_get_meta( + self, stream: "grpclib.server.Stream[StudioSummaryStreamRequest, MetaResponse]" ) -> None: request = await stream.recv_message() - response = await self.set(request) + response = await self.get_meta(request) await stream.send_message(response) - async def __rpc_set_some( - self, - stream: "grpclib.server.Stream[TopologyUpdateSyncConfigSetSomeRequest, TopologyUpdateSyncConfigSetSomeResponse]", + async def __rpc_subscribe_meta( + self, stream: "grpclib.server.Stream[StudioSummaryStreamRequest, MetaResponse]" ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( - self.set_some, + self.subscribe_meta, stream, request, ) - async def __rpc_delete( + async def __rpc_get_all_batched( self, - stream: "grpclib.server.Stream[TopologyUpdateSyncConfigDeleteRequest, TopologyUpdateSyncConfigDeleteResponse]", + stream: "grpclib.server.Stream[StudioSummaryBatchedStreamRequest, StudioSummaryBatchedStreamResponse]", ) -> None: request = await stream.recv_message() - response = await self.delete(request) - await stream.send_message(response) + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) - async def __rpc_delete_all( + async def __rpc_subscribe_batched( self, - stream: "grpclib.server.Stream[TopologyUpdateSyncConfigDeleteAllRequest, TopologyUpdateSyncConfigDeleteAllResponse]", + stream: "grpclib.server.Stream[StudioSummaryBatchedStreamRequest, StudioSummaryBatchedStreamResponse]", ) -> None: request = await stream.recv_message() await self._call_rpc_handler_server_stream( - self.delete_all, + self.subscribe_batched, stream, request, ) def __mapping__(self) -> Dict[str, grpclib.const.Handler]: return { - "/arista.studio.v1.TopologyUpdateSyncConfigService/GetOne": grpclib.const.Handler( + "/arista.studio.v1.StudioSummaryService/GetOne": grpclib.const.Handler( self.__rpc_get_one, grpclib.const.Cardinality.UNARY_UNARY, - TopologyUpdateSyncConfigRequest, - TopologyUpdateSyncConfigResponse, + StudioSummaryRequest, + StudioSummaryResponse, ), - "/arista.studio.v1.TopologyUpdateSyncConfigService/GetAll": grpclib.const.Handler( + "/arista.studio.v1.StudioSummaryService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + StudioSummarySomeRequest, + StudioSummarySomeResponse, + ), + "/arista.studio.v1.StudioSummaryService/GetAll": grpclib.const.Handler( self.__rpc_get_all, grpclib.const.Cardinality.UNARY_STREAM, - TopologyUpdateSyncConfigStreamRequest, - TopologyUpdateSyncConfigStreamResponse, + StudioSummaryStreamRequest, + StudioSummaryStreamResponse, ), - "/arista.studio.v1.TopologyUpdateSyncConfigService/Subscribe": grpclib.const.Handler( + "/arista.studio.v1.StudioSummaryService/Subscribe": grpclib.const.Handler( self.__rpc_subscribe, grpclib.const.Cardinality.UNARY_STREAM, - TopologyUpdateSyncConfigStreamRequest, - TopologyUpdateSyncConfigStreamResponse, + StudioSummaryStreamRequest, + StudioSummaryStreamResponse, ), - "/arista.studio.v1.TopologyUpdateSyncConfigService/Set": grpclib.const.Handler( - self.__rpc_set, + "/arista.studio.v1.StudioSummaryService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, grpclib.const.Cardinality.UNARY_UNARY, - TopologyUpdateSyncConfigSetRequest, - TopologyUpdateSyncConfigSetResponse, + StudioSummaryStreamRequest, + MetaResponse, ), - "/arista.studio.v1.TopologyUpdateSyncConfigService/SetSome": grpclib.const.Handler( - self.__rpc_set_some, + "/arista.studio.v1.StudioSummaryService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, grpclib.const.Cardinality.UNARY_STREAM, - TopologyUpdateSyncConfigSetSomeRequest, - TopologyUpdateSyncConfigSetSomeResponse, + StudioSummaryStreamRequest, + MetaResponse, ), - "/arista.studio.v1.TopologyUpdateSyncConfigService/Delete": grpclib.const.Handler( - self.__rpc_delete, - grpclib.const.Cardinality.UNARY_UNARY, - TopologyUpdateSyncConfigDeleteRequest, - TopologyUpdateSyncConfigDeleteResponse, + "/arista.studio.v1.StudioSummaryService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + StudioSummaryBatchedStreamRequest, + StudioSummaryBatchedStreamResponse, ), - "/arista.studio.v1.TopologyUpdateSyncConfigService/DeleteAll": grpclib.const.Handler( - self.__rpc_delete_all, + "/arista.studio.v1.StudioSummaryService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, grpclib.const.Cardinality.UNARY_STREAM, - TopologyUpdateSyncConfigDeleteAllRequest, - TopologyUpdateSyncConfigDeleteAllResponse, + StudioSummaryBatchedStreamRequest, + StudioSummaryBatchedStreamResponse, ), } diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/subscriptions/__init__.py b/python-avd/pyavd/_cv/api/arista/subscriptions/__init__.py similarity index 81% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/subscriptions/__init__.py rename to python-avd/pyavd/_cv/api/arista/subscriptions/__init__.py index 220e3842162..633e7bb9348 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/subscriptions/__init__.py +++ b/python-avd/pyavd/_cv/api/arista/subscriptions/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. +# Copyright (c) 2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. # Generated by the protocol buffer compiler. DO NOT EDIT! @@ -8,13 +8,7 @@ from dataclasses import dataclass -try: - import aristaproto -except ImportError: - HAS_ARISTAPROTO = False - from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_aristaproto as aristaproto -else: - HAS_ARISTAPROTO = True +import aristaproto class Operation(aristaproto.Enum): diff --git a/python-avd/pyavd/_cv/api/arista/swg/__init__.py b/python-avd/pyavd/_cv/api/arista/swg/__init__.py new file mode 100644 index 00000000000..b17ca7c745d --- /dev/null +++ b/python-avd/pyavd/_cv/api/arista/swg/__init__.py @@ -0,0 +1,3 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. diff --git a/python-avd/pyavd/_cv/api/arista/swg/v1/__init__.py b/python-avd/pyavd/_cv/api/arista/swg/v1/__init__.py new file mode 100644 index 00000000000..a75e66fd970 --- /dev/null +++ b/python-avd/pyavd/_cv/api/arista/swg/v1/__init__.py @@ -0,0 +1,1441 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +# Generated by the protocol buffer compiler. DO NOT EDIT! +# sources: arista/swg.v1/services.gen.proto, arista/swg.v1/swg.proto +# plugin: python-aristaproto +# This file has been @generated + +from dataclasses import dataclass +from datetime import datetime +from typing import ( + TYPE_CHECKING, + AsyncIterator, + Dict, + List, + Optional, +) + +import aristaproto +import grpclib +from aristaproto.grpc.grpclib_server import ServiceBase + +from .... import fmp as ___fmp__ +from ... import ( + subscriptions as __subscriptions__, + time as __time__, +) + + +if TYPE_CHECKING: + import grpclib.server + from aristaproto.grpc.grpclib_client import MetadataLike + from grpclib.metadata import Deadline + + +class ServiceName(aristaproto.Enum): + """ServiceName represents the name of the secure web gateway service""" + + UNSPECIFIED = 0 + """SERVICE_NAME_UNSPECIFIED indicates service name is unknown""" + + ZSCALER = 1 + """SERVICE_NAME_ZSCALER indicates service name as "zscaler""" + + +@dataclass(eq=False, repr=False) +class SwgKey(aristaproto.Message): + """SwgKey identifies a device and a secure web gateway service""" + + device_id: Optional[str] = aristaproto.message_field( + 1, wraps=aristaproto.TYPE_STRING + ) + """device_id is id of a device""" + + service_name: "ServiceName" = aristaproto.enum_field(2) + """service_name is the name of the secure web gateway service.""" + + +@dataclass(eq=False, repr=False) +class Location(aristaproto.Message): + """Location represents a device's or an endpoint's location""" + + city: Optional[str] = aristaproto.message_field(1, wraps=aristaproto.TYPE_STRING) + """city is the city where a device or endpoint is located""" + + region: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """region is the region where device or endpoint is located""" + + country: Optional[str] = aristaproto.message_field(3, wraps=aristaproto.TYPE_STRING) + """country is the country where a device or endpoint is located""" + + latitude: Optional[float] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_FLOAT + ) + """latitude is the latitude of a device's or an endpoint's location""" + + longitude: Optional[float] = aristaproto.message_field( + 5, wraps=aristaproto.TYPE_FLOAT + ) + """longitude is the longitude of a device's or an endpoint's location""" + + +@dataclass(eq=False, repr=False) +class VpnEndpoint(aristaproto.Message): + """VpnEndpoint represents the secure web gateway endpoint""" + + ip_address: "___fmp__.IpAddress" = aristaproto.message_field(1) + """ip_address is the IP address of a SWG endpoint""" + + datacenter: Optional[str] = aristaproto.message_field( + 2, wraps=aristaproto.TYPE_STRING + ) + """datacenter of a SWG endpoint""" + + endpoint_location: "Location" = aristaproto.message_field(3) + """endpoint_location represents the location of a SWG endpoint""" + + +@dataclass(eq=False, repr=False) +class VpnEndpoints(aristaproto.Message): + """VpnEndpoints represents a collection of SWG endpoints""" + + values: Dict[str, "VpnEndpoint"] = aristaproto.map_field( + 1, aristaproto.TYPE_STRING, aristaproto.TYPE_MESSAGE + ) + """ + values is a map of vpn endpoints. + Valid keys are "primary", "secondary" and "tertiary" + """ + + +@dataclass(eq=False, repr=False) +class EndpointStatus(aristaproto.Message): + """EndpointStatus represents the status of a SWG endpoint""" + + key: "SwgKey" = aristaproto.message_field(1) + """key represents a device and a SWG service""" + + vpn_endpoints: "VpnEndpoints" = aristaproto.message_field(2) + """vpn_endpoints represents a collection of SWG endpoints""" + + cloud_name: Optional[str] = aristaproto.message_field( + 3, wraps=aristaproto.TYPE_STRING + ) + """ + cloud_name represents the cloud name assigned to the user + by the SWG administrator + """ + + device_location: "Location" = aristaproto.message_field(4) + """device_location is the location of the device""" + + +@dataclass(eq=False, repr=False) +class EndpointConfig(aristaproto.Message): + """EndpointConfig represents the configuration of a device endpoint""" + + key: "SwgKey" = aristaproto.message_field(1) + """key represents a device and a SWG service""" + + address: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """address is the physical address of a device""" + + +@dataclass(eq=False, repr=False) +class MetaResponse(aristaproto.Message): + time: datetime = aristaproto.message_field(1) + """ + Time holds the timestamp of the last item included in the metadata calculation. + """ + + type: "__subscriptions__.Operation" = aristaproto.enum_field(2) + """ + Operation indicates how the value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + count: Optional[int] = aristaproto.message_field(3, wraps=aristaproto.TYPE_UINT32) + """ + Count is the number of items present under the conditions of the request. + """ + + +@dataclass(eq=False, repr=False) +class EndpointConfigRequest(aristaproto.Message): + key: "SwgKey" = aristaproto.message_field(1) + """ + Key uniquely identifies a EndpointConfig instance to retrieve. + This value must be populated. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class EndpointConfigResponse(aristaproto.Message): + value: "EndpointConfig" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time carries the (UTC) timestamp of the last-modification of the + EndpointConfig instance in this response. + """ + + +@dataclass(eq=False, repr=False) +class EndpointConfigSomeRequest(aristaproto.Message): + keys: List["SwgKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class EndpointConfigSomeResponse(aristaproto.Message): + value: "EndpointConfig" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + +@dataclass(eq=False, repr=False) +class EndpointConfigStreamRequest(aristaproto.Message): + partial_eq_filter: List["EndpointConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each EndpointConfig at end. + * Each EndpointConfig response is fully-specified (all fields set). + * start: Returns the state of each EndpointConfig at start, followed by updates until now. + * Each EndpointConfig response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each EndpointConfig at start, followed by updates + until end. + * Each EndpointConfig response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + +@dataclass(eq=False, repr=False) +class EndpointConfigStreamResponse(aristaproto.Message): + value: "EndpointConfig" = aristaproto.message_field(1) + """ + Value is a value deemed relevant to the initiating request. + This structure will always have its key-field populated. Which other fields are + populated, and why, depends on the value of Operation and what triggered this notification. + """ + + time: datetime = aristaproto.message_field(2) + """Time holds the timestamp of this EndpointConfig's last modification.""" + + type: "__subscriptions__.Operation" = aristaproto.enum_field(3) + """ + Operation indicates how the EndpointConfig value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + +@dataclass(eq=False, repr=False) +class EndpointConfigBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["EndpointConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each EndpointConfig at end. + * Each EndpointConfig response is fully-specified (all fields set). + * start: Returns the state of each EndpointConfig at start, followed by updates until now. + * Each EndpointConfig response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each EndpointConfig at start, followed by updates + until end. + * Each EndpointConfig response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class EndpointConfigBatchedStreamResponse(aristaproto.Message): + responses: List["EndpointConfigStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + +@dataclass(eq=False, repr=False) +class EndpointConfigSetRequest(aristaproto.Message): + value: "EndpointConfig" = aristaproto.message_field(1) + """ + EndpointConfig carries the value to set into the datastore. + See the documentation on the EndpointConfig struct for which fields are required. + """ + + +@dataclass(eq=False, repr=False) +class EndpointConfigSetResponse(aristaproto.Message): + value: "EndpointConfig" = aristaproto.message_field(1) + """ + Value carries all the values given in the EndpointConfigSetRequest as well + as any server-generated values. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the (UTC) timestamp at which the system recognizes the + creation. The only guarantees made about this timestamp are: + + - it is after the time the request was received + - a time-ranged query with StartTime==CreatedAt will include this instance. + """ + + +@dataclass(eq=False, repr=False) +class EndpointConfigSetSomeRequest(aristaproto.Message): + values: List["EndpointConfig"] = aristaproto.message_field(1) + """ + value contains a list of EndpointConfig values to write. + It is possible to provide more values than can fit within either: + - the maxiumum send size of the client + - the maximum receive size of the server + If this error occurs you must reduce the number of values sent. + See gRPC "maximum message size" documentation for more information. + """ + + +@dataclass(eq=False, repr=False) +class EndpointConfigSetSomeResponse(aristaproto.Message): + key: "SwgKey" = aristaproto.message_field(1) + error: str = aristaproto.string_field(2) + + +@dataclass(eq=False, repr=False) +class EndpointConfigDeleteRequest(aristaproto.Message): + key: "SwgKey" = aristaproto.message_field(1) + """ + Key indicates which EndpointConfig instance to remove. + This field must always be set. + """ + + +@dataclass(eq=False, repr=False) +class EndpointConfigDeleteResponse(aristaproto.Message): + key: "SwgKey" = aristaproto.message_field(1) + """Key echoes back the key of the deleted EndpointConfig instance.""" + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the (UTC) timestamp at which the system recognizes the + deletion. The only guarantees made about this timestamp are: + + - it is after the time the request was received + - a time-ranged query with StartTime==DeletedAt will not include this instance. + """ + + +@dataclass(eq=False, repr=False) +class EndpointConfigDeleteSomeRequest(aristaproto.Message): + keys: List["SwgKey"] = aristaproto.message_field(1) + """key contains a list of EndpointConfig keys to delete""" + + +@dataclass(eq=False, repr=False) +class EndpointConfigDeleteSomeResponse(aristaproto.Message): + """ + EndpointConfigDeleteSomeResponse is only sent when there is an error. + """ + + key: "SwgKey" = aristaproto.message_field(1) + error: str = aristaproto.string_field(2) + + +@dataclass(eq=False, repr=False) +class EndpointConfigDeleteAllRequest(aristaproto.Message): + partial_eq_filter: List["EndpointConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a DeleteAll. + This requires all provided fields to be equal to the response. + A filtered DeleteAll will use GetAll with filter to find things to delete. + """ + + +@dataclass(eq=False, repr=False) +class EndpointConfigDeleteAllResponse(aristaproto.Message): + type: "___fmp__.DeleteError" = aristaproto.enum_field(1) + """ + This describes the class of delete error. + A DeleteAllResponse is only sent when there is an error. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """This indicates the error message from the delete failure.""" + + key: "SwgKey" = aristaproto.message_field(3) + """ + This is the key of the EndpointConfig instance that failed to be deleted. + """ + + time: datetime = aristaproto.message_field(4) + """Time indicates the (UTC) timestamp when the key was being deleted.""" + + +@dataclass(eq=False, repr=False) +class EndpointStatusRequest(aristaproto.Message): + key: "SwgKey" = aristaproto.message_field(1) + """ + Key uniquely identifies a EndpointStatus instance to retrieve. + This value must be populated. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class EndpointStatusResponse(aristaproto.Message): + value: "EndpointStatus" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time carries the (UTC) timestamp of the last-modification of the + EndpointStatus instance in this response. + """ + + +@dataclass(eq=False, repr=False) +class EndpointStatusSomeRequest(aristaproto.Message): + keys: List["SwgKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class EndpointStatusSomeResponse(aristaproto.Message): + value: "EndpointStatus" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + +@dataclass(eq=False, repr=False) +class EndpointStatusStreamRequest(aristaproto.Message): + partial_eq_filter: List["EndpointStatus"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each EndpointStatus at end. + * Each EndpointStatus response is fully-specified (all fields set). + * start: Returns the state of each EndpointStatus at start, followed by updates until now. + * Each EndpointStatus response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each EndpointStatus at start, followed by updates + until end. + * Each EndpointStatus response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + +@dataclass(eq=False, repr=False) +class EndpointStatusStreamResponse(aristaproto.Message): + value: "EndpointStatus" = aristaproto.message_field(1) + """ + Value is a value deemed relevant to the initiating request. + This structure will always have its key-field populated. Which other fields are + populated, and why, depends on the value of Operation and what triggered this notification. + """ + + time: datetime = aristaproto.message_field(2) + """Time holds the timestamp of this EndpointStatus's last modification.""" + + type: "__subscriptions__.Operation" = aristaproto.enum_field(3) + """ + Operation indicates how the EndpointStatus value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + +@dataclass(eq=False, repr=False) +class EndpointStatusBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["EndpointStatus"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each EndpointStatus at end. + * Each EndpointStatus response is fully-specified (all fields set). + * start: Returns the state of each EndpointStatus at start, followed by updates until now. + * Each EndpointStatus response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each EndpointStatus at start, followed by updates + until end. + * Each EndpointStatus response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class EndpointStatusBatchedStreamResponse(aristaproto.Message): + responses: List["EndpointStatusStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + +class EndpointConfigServiceStub(aristaproto.ServiceStub): + async def get_one( + self, + endpoint_config_request: "EndpointConfigRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "EndpointConfigResponse": + return await self._unary_unary( + "/arista.swg.v1.EndpointConfigService/GetOne", + endpoint_config_request, + EndpointConfigResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def get_some( + self, + endpoint_config_some_request: "EndpointConfigSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["EndpointConfigSomeResponse"]: + async for response in self._unary_stream( + "/arista.swg.v1.EndpointConfigService/GetSome", + endpoint_config_some_request, + EndpointConfigSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all( + self, + endpoint_config_stream_request: "EndpointConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["EndpointConfigStreamResponse"]: + async for response in self._unary_stream( + "/arista.swg.v1.EndpointConfigService/GetAll", + endpoint_config_stream_request, + EndpointConfigStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe( + self, + endpoint_config_stream_request: "EndpointConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["EndpointConfigStreamResponse"]: + async for response in self._unary_stream( + "/arista.swg.v1.EndpointConfigService/Subscribe", + endpoint_config_stream_request, + EndpointConfigStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_meta( + self, + endpoint_config_stream_request: "EndpointConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.swg.v1.EndpointConfigService/GetMeta", + endpoint_config_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + endpoint_config_stream_request: "EndpointConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.swg.v1.EndpointConfigService/SubscribeMeta", + endpoint_config_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def set( + self, + endpoint_config_set_request: "EndpointConfigSetRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "EndpointConfigSetResponse": + return await self._unary_unary( + "/arista.swg.v1.EndpointConfigService/Set", + endpoint_config_set_request, + EndpointConfigSetResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def set_some( + self, + endpoint_config_set_some_request: "EndpointConfigSetSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["EndpointConfigSetSomeResponse"]: + async for response in self._unary_stream( + "/arista.swg.v1.EndpointConfigService/SetSome", + endpoint_config_set_some_request, + EndpointConfigSetSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def delete( + self, + endpoint_config_delete_request: "EndpointConfigDeleteRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "EndpointConfigDeleteResponse": + return await self._unary_unary( + "/arista.swg.v1.EndpointConfigService/Delete", + endpoint_config_delete_request, + EndpointConfigDeleteResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def delete_some( + self, + endpoint_config_delete_some_request: "EndpointConfigDeleteSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["EndpointConfigDeleteSomeResponse"]: + async for response in self._unary_stream( + "/arista.swg.v1.EndpointConfigService/DeleteSome", + endpoint_config_delete_some_request, + EndpointConfigDeleteSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def delete_all( + self, + endpoint_config_delete_all_request: "EndpointConfigDeleteAllRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["EndpointConfigDeleteAllResponse"]: + async for response in self._unary_stream( + "/arista.swg.v1.EndpointConfigService/DeleteAll", + endpoint_config_delete_all_request, + EndpointConfigDeleteAllResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all_batched( + self, + endpoint_config_batched_stream_request: "EndpointConfigBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["EndpointConfigBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.swg.v1.EndpointConfigService/GetAllBatched", + endpoint_config_batched_stream_request, + EndpointConfigBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + endpoint_config_batched_stream_request: "EndpointConfigBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["EndpointConfigBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.swg.v1.EndpointConfigService/SubscribeBatched", + endpoint_config_batched_stream_request, + EndpointConfigBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + +class EndpointStatusServiceStub(aristaproto.ServiceStub): + async def get_one( + self, + endpoint_status_request: "EndpointStatusRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "EndpointStatusResponse": + return await self._unary_unary( + "/arista.swg.v1.EndpointStatusService/GetOne", + endpoint_status_request, + EndpointStatusResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def get_some( + self, + endpoint_status_some_request: "EndpointStatusSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["EndpointStatusSomeResponse"]: + async for response in self._unary_stream( + "/arista.swg.v1.EndpointStatusService/GetSome", + endpoint_status_some_request, + EndpointStatusSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all( + self, + endpoint_status_stream_request: "EndpointStatusStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["EndpointStatusStreamResponse"]: + async for response in self._unary_stream( + "/arista.swg.v1.EndpointStatusService/GetAll", + endpoint_status_stream_request, + EndpointStatusStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe( + self, + endpoint_status_stream_request: "EndpointStatusStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["EndpointStatusStreamResponse"]: + async for response in self._unary_stream( + "/arista.swg.v1.EndpointStatusService/Subscribe", + endpoint_status_stream_request, + EndpointStatusStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_meta( + self, + endpoint_status_stream_request: "EndpointStatusStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.swg.v1.EndpointStatusService/GetMeta", + endpoint_status_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + endpoint_status_stream_request: "EndpointStatusStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.swg.v1.EndpointStatusService/SubscribeMeta", + endpoint_status_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all_batched( + self, + endpoint_status_batched_stream_request: "EndpointStatusBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["EndpointStatusBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.swg.v1.EndpointStatusService/GetAllBatched", + endpoint_status_batched_stream_request, + EndpointStatusBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + endpoint_status_batched_stream_request: "EndpointStatusBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["EndpointStatusBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.swg.v1.EndpointStatusService/SubscribeBatched", + endpoint_status_batched_stream_request, + EndpointStatusBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + +class EndpointConfigServiceBase(ServiceBase): + + async def get_one( + self, endpoint_config_request: "EndpointConfigRequest" + ) -> "EndpointConfigResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_some( + self, endpoint_config_some_request: "EndpointConfigSomeRequest" + ) -> AsyncIterator["EndpointConfigSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all( + self, endpoint_config_stream_request: "EndpointConfigStreamRequest" + ) -> AsyncIterator["EndpointConfigStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe( + self, endpoint_config_stream_request: "EndpointConfigStreamRequest" + ) -> AsyncIterator["EndpointConfigStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_meta( + self, endpoint_config_stream_request: "EndpointConfigStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, endpoint_config_stream_request: "EndpointConfigStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def set( + self, endpoint_config_set_request: "EndpointConfigSetRequest" + ) -> "EndpointConfigSetResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def set_some( + self, endpoint_config_set_some_request: "EndpointConfigSetSomeRequest" + ) -> AsyncIterator["EndpointConfigSetSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def delete( + self, endpoint_config_delete_request: "EndpointConfigDeleteRequest" + ) -> "EndpointConfigDeleteResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def delete_some( + self, endpoint_config_delete_some_request: "EndpointConfigDeleteSomeRequest" + ) -> AsyncIterator["EndpointConfigDeleteSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def delete_all( + self, endpoint_config_delete_all_request: "EndpointConfigDeleteAllRequest" + ) -> AsyncIterator["EndpointConfigDeleteAllResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all_batched( + self, + endpoint_config_batched_stream_request: "EndpointConfigBatchedStreamRequest", + ) -> AsyncIterator["EndpointConfigBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, + endpoint_config_batched_stream_request: "EndpointConfigBatchedStreamRequest", + ) -> AsyncIterator["EndpointConfigBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def __rpc_get_one( + self, + stream: "grpclib.server.Stream[EndpointConfigRequest, EndpointConfigResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.get_one(request) + await stream.send_message(response) + + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[EndpointConfigSomeRequest, EndpointConfigSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + + async def __rpc_get_all( + self, + stream: "grpclib.server.Stream[EndpointConfigStreamRequest, EndpointConfigStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all, + stream, + request, + ) + + async def __rpc_subscribe( + self, + stream: "grpclib.server.Stream[EndpointConfigStreamRequest, EndpointConfigStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe, + stream, + request, + ) + + async def __rpc_get_meta( + self, stream: "grpclib.server.Stream[EndpointConfigStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, stream: "grpclib.server.Stream[EndpointConfigStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + + async def __rpc_set( + self, + stream: "grpclib.server.Stream[EndpointConfigSetRequest, EndpointConfigSetResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.set(request) + await stream.send_message(response) + + async def __rpc_set_some( + self, + stream: "grpclib.server.Stream[EndpointConfigSetSomeRequest, EndpointConfigSetSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.set_some, + stream, + request, + ) + + async def __rpc_delete( + self, + stream: "grpclib.server.Stream[EndpointConfigDeleteRequest, EndpointConfigDeleteResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.delete(request) + await stream.send_message(response) + + async def __rpc_delete_some( + self, + stream: "grpclib.server.Stream[EndpointConfigDeleteSomeRequest, EndpointConfigDeleteSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.delete_some, + stream, + request, + ) + + async def __rpc_delete_all( + self, + stream: "grpclib.server.Stream[EndpointConfigDeleteAllRequest, EndpointConfigDeleteAllResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.delete_all, + stream, + request, + ) + + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[EndpointConfigBatchedStreamRequest, EndpointConfigBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[EndpointConfigBatchedStreamRequest, EndpointConfigBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: + return { + "/arista.swg.v1.EndpointConfigService/GetOne": grpclib.const.Handler( + self.__rpc_get_one, + grpclib.const.Cardinality.UNARY_UNARY, + EndpointConfigRequest, + EndpointConfigResponse, + ), + "/arista.swg.v1.EndpointConfigService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + EndpointConfigSomeRequest, + EndpointConfigSomeResponse, + ), + "/arista.swg.v1.EndpointConfigService/GetAll": grpclib.const.Handler( + self.__rpc_get_all, + grpclib.const.Cardinality.UNARY_STREAM, + EndpointConfigStreamRequest, + EndpointConfigStreamResponse, + ), + "/arista.swg.v1.EndpointConfigService/Subscribe": grpclib.const.Handler( + self.__rpc_subscribe, + grpclib.const.Cardinality.UNARY_STREAM, + EndpointConfigStreamRequest, + EndpointConfigStreamResponse, + ), + "/arista.swg.v1.EndpointConfigService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + EndpointConfigStreamRequest, + MetaResponse, + ), + "/arista.swg.v1.EndpointConfigService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + EndpointConfigStreamRequest, + MetaResponse, + ), + "/arista.swg.v1.EndpointConfigService/Set": grpclib.const.Handler( + self.__rpc_set, + grpclib.const.Cardinality.UNARY_UNARY, + EndpointConfigSetRequest, + EndpointConfigSetResponse, + ), + "/arista.swg.v1.EndpointConfigService/SetSome": grpclib.const.Handler( + self.__rpc_set_some, + grpclib.const.Cardinality.UNARY_STREAM, + EndpointConfigSetSomeRequest, + EndpointConfigSetSomeResponse, + ), + "/arista.swg.v1.EndpointConfigService/Delete": grpclib.const.Handler( + self.__rpc_delete, + grpclib.const.Cardinality.UNARY_UNARY, + EndpointConfigDeleteRequest, + EndpointConfigDeleteResponse, + ), + "/arista.swg.v1.EndpointConfigService/DeleteSome": grpclib.const.Handler( + self.__rpc_delete_some, + grpclib.const.Cardinality.UNARY_STREAM, + EndpointConfigDeleteSomeRequest, + EndpointConfigDeleteSomeResponse, + ), + "/arista.swg.v1.EndpointConfigService/DeleteAll": grpclib.const.Handler( + self.__rpc_delete_all, + grpclib.const.Cardinality.UNARY_STREAM, + EndpointConfigDeleteAllRequest, + EndpointConfigDeleteAllResponse, + ), + "/arista.swg.v1.EndpointConfigService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + EndpointConfigBatchedStreamRequest, + EndpointConfigBatchedStreamResponse, + ), + "/arista.swg.v1.EndpointConfigService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + EndpointConfigBatchedStreamRequest, + EndpointConfigBatchedStreamResponse, + ), + } + + +class EndpointStatusServiceBase(ServiceBase): + + async def get_one( + self, endpoint_status_request: "EndpointStatusRequest" + ) -> "EndpointStatusResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_some( + self, endpoint_status_some_request: "EndpointStatusSomeRequest" + ) -> AsyncIterator["EndpointStatusSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all( + self, endpoint_status_stream_request: "EndpointStatusStreamRequest" + ) -> AsyncIterator["EndpointStatusStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe( + self, endpoint_status_stream_request: "EndpointStatusStreamRequest" + ) -> AsyncIterator["EndpointStatusStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_meta( + self, endpoint_status_stream_request: "EndpointStatusStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, endpoint_status_stream_request: "EndpointStatusStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all_batched( + self, + endpoint_status_batched_stream_request: "EndpointStatusBatchedStreamRequest", + ) -> AsyncIterator["EndpointStatusBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, + endpoint_status_batched_stream_request: "EndpointStatusBatchedStreamRequest", + ) -> AsyncIterator["EndpointStatusBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def __rpc_get_one( + self, + stream: "grpclib.server.Stream[EndpointStatusRequest, EndpointStatusResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.get_one(request) + await stream.send_message(response) + + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[EndpointStatusSomeRequest, EndpointStatusSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + + async def __rpc_get_all( + self, + stream: "grpclib.server.Stream[EndpointStatusStreamRequest, EndpointStatusStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all, + stream, + request, + ) + + async def __rpc_subscribe( + self, + stream: "grpclib.server.Stream[EndpointStatusStreamRequest, EndpointStatusStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe, + stream, + request, + ) + + async def __rpc_get_meta( + self, stream: "grpclib.server.Stream[EndpointStatusStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, stream: "grpclib.server.Stream[EndpointStatusStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[EndpointStatusBatchedStreamRequest, EndpointStatusBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[EndpointStatusBatchedStreamRequest, EndpointStatusBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: + return { + "/arista.swg.v1.EndpointStatusService/GetOne": grpclib.const.Handler( + self.__rpc_get_one, + grpclib.const.Cardinality.UNARY_UNARY, + EndpointStatusRequest, + EndpointStatusResponse, + ), + "/arista.swg.v1.EndpointStatusService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + EndpointStatusSomeRequest, + EndpointStatusSomeResponse, + ), + "/arista.swg.v1.EndpointStatusService/GetAll": grpclib.const.Handler( + self.__rpc_get_all, + grpclib.const.Cardinality.UNARY_STREAM, + EndpointStatusStreamRequest, + EndpointStatusStreamResponse, + ), + "/arista.swg.v1.EndpointStatusService/Subscribe": grpclib.const.Handler( + self.__rpc_subscribe, + grpclib.const.Cardinality.UNARY_STREAM, + EndpointStatusStreamRequest, + EndpointStatusStreamResponse, + ), + "/arista.swg.v1.EndpointStatusService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + EndpointStatusStreamRequest, + MetaResponse, + ), + "/arista.swg.v1.EndpointStatusService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + EndpointStatusStreamRequest, + MetaResponse, + ), + "/arista.swg.v1.EndpointStatusService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + EndpointStatusBatchedStreamRequest, + EndpointStatusBatchedStreamResponse, + ), + "/arista.swg.v1.EndpointStatusService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + EndpointStatusBatchedStreamRequest, + EndpointStatusBatchedStreamResponse, + ), + } diff --git a/python-avd/pyavd/_cv/api/arista/tag/__init__.py b/python-avd/pyavd/_cv/api/arista/tag/__init__.py new file mode 100644 index 00000000000..b17ca7c745d --- /dev/null +++ b/python-avd/pyavd/_cv/api/arista/tag/__init__.py @@ -0,0 +1,3 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/tag/v2/__init__.py b/python-avd/pyavd/_cv/api/arista/tag/v2/__init__.py similarity index 53% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/tag/v2/__init__.py rename to python-avd/pyavd/_cv/api/arista/tag/v2/__init__.py index 3e0a497c5a6..1193d76bc7c 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/tag/v2/__init__.py +++ b/python-avd/pyavd/_cv/api/arista/tag/v2/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. +# Copyright (c) 2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. # Generated by the protocol buffer compiler. DO NOT EDIT! @@ -16,17 +16,9 @@ Optional, ) -try: - import aristaproto - import grpclib - from aristaproto.grpc.grpclib_server import ServiceBase -except ImportError: - HAS_ARISTAPROTO = False - from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_aristaproto as aristaproto - from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_grpclib as grpclib - ServiceBase = object -else: - HAS_ARISTAPROTO = True +import aristaproto +import grpclib +from aristaproto.grpc.grpclib_server import ServiceBase from .... import fmp as ___fmp__ from ... import ( @@ -267,6 +259,27 @@ class TagAssignment(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class MetaResponse(aristaproto.Message): + time: datetime = aristaproto.message_field(1) + """ + Time holds the timestamp of the last item included in the metadata calculation. + """ + + type: "__subscriptions__.Operation" = aristaproto.enum_field(2) + """ + Operation indicates how the value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + count: Optional[int] = aristaproto.message_field(3, wraps=aristaproto.TYPE_UINT32) + """ + Count is the number of items present under the conditions of the request. + """ + + @dataclass(eq=False, repr=False) class TagRequest(aristaproto.Message): key: "TagKey" = aristaproto.message_field(1) @@ -299,6 +312,35 @@ class TagResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class TagSomeRequest(aristaproto.Message): + keys: List["TagKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class TagSomeResponse(aristaproto.Message): + value: "Tag" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + @dataclass(eq=False, repr=False) class TagStreamRequest(aristaproto.Message): partial_eq_filter: List["Tag"] = aristaproto.message_field(1) @@ -351,6 +393,57 @@ class TagStreamResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class TagBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["Tag"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each Tag at end. + * Each Tag response is fully-specified (all fields set). + * start: Returns the state of each Tag at start, followed by updates until now. + * Each Tag response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each Tag at start, followed by updates + until end. + * Each Tag response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class TagBatchedStreamResponse(aristaproto.Message): + responses: List["TagStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + @dataclass(eq=False, repr=False) class TagAssignmentRequest(aristaproto.Message): key: "TagAssignmentKey" = aristaproto.message_field(1) @@ -383,6 +476,35 @@ class TagAssignmentResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class TagAssignmentSomeRequest(aristaproto.Message): + keys: List["TagAssignmentKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class TagAssignmentSomeResponse(aristaproto.Message): + value: "TagAssignment" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + @dataclass(eq=False, repr=False) class TagAssignmentStreamRequest(aristaproto.Message): partial_eq_filter: List["TagAssignment"] = aristaproto.message_field(1) @@ -435,6 +557,57 @@ class TagAssignmentStreamResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class TagAssignmentBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["TagAssignment"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each TagAssignment at end. + * Each TagAssignment response is fully-specified (all fields set). + * start: Returns the state of each TagAssignment at start, followed by updates until now. + * Each TagAssignment response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each TagAssignment at start, followed by updates + until end. + * Each TagAssignment response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class TagAssignmentBatchedStreamResponse(aristaproto.Message): + responses: List["TagAssignmentStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + @dataclass(eq=False, repr=False) class TagAssignmentConfigRequest(aristaproto.Message): key: "TagAssignmentKey" = aristaproto.message_field(1) @@ -467,6 +640,35 @@ class TagAssignmentConfigResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class TagAssignmentConfigSomeRequest(aristaproto.Message): + keys: List["TagAssignmentKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class TagAssignmentConfigSomeResponse(aristaproto.Message): + value: "TagAssignmentConfig" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + @dataclass(eq=False, repr=False) class TagAssignmentConfigStreamRequest(aristaproto.Message): partial_eq_filter: List["TagAssignmentConfig"] = aristaproto.message_field(1) @@ -521,6 +723,57 @@ class TagAssignmentConfigStreamResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class TagAssignmentConfigBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["TagAssignmentConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each TagAssignmentConfig at end. + * Each TagAssignmentConfig response is fully-specified (all fields set). + * start: Returns the state of each TagAssignmentConfig at start, followed by updates until now. + * Each TagAssignmentConfig response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each TagAssignmentConfig at start, followed by updates + until end. + * Each TagAssignmentConfig response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class TagAssignmentConfigBatchedStreamResponse(aristaproto.Message): + responses: List["TagAssignmentConfigStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + @dataclass(eq=False, repr=False) class TagAssignmentConfigSetRequest(aristaproto.Message): value: "TagAssignmentConfig" = aristaproto.message_field(1) @@ -591,15 +844,39 @@ class TagAssignmentConfigDeleteResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class TagAssignmentConfigDeleteSomeRequest(aristaproto.Message): + keys: List["TagAssignmentKey"] = aristaproto.message_field(1) + """key contains a list of TagAssignmentConfig keys to delete""" + + +@dataclass(eq=False, repr=False) +class TagAssignmentConfigDeleteSomeResponse(aristaproto.Message): + """ + TagAssignmentConfigDeleteSomeResponse is only sent when there is an error. + """ + + key: "TagAssignmentKey" = aristaproto.message_field(1) + error: str = aristaproto.string_field(2) + + @dataclass(eq=False, repr=False) class TagAssignmentConfigDeleteAllRequest(aristaproto.Message): - pass + partial_eq_filter: List["TagAssignmentConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a DeleteAll. + This requires all provided fields to be equal to the response. + A filtered DeleteAll will use GetAll with filter to find things to delete. + """ @dataclass(eq=False, repr=False) class TagAssignmentConfigDeleteAllResponse(aristaproto.Message): type: "___fmp__.DeleteError" = aristaproto.enum_field(1) - """This describes the class of delete error.""" + """ + This describes the class of delete error. + A DeleteAllResponse is only sent when there is an error. + """ error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) """This indicates the error message from the delete failure.""" @@ -645,6 +922,35 @@ class TagConfigResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class TagConfigSomeRequest(aristaproto.Message): + keys: List["TagKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class TagConfigSomeResponse(aristaproto.Message): + value: "TagConfig" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + @dataclass(eq=False, repr=False) class TagConfigStreamRequest(aristaproto.Message): partial_eq_filter: List["TagConfig"] = aristaproto.message_field(1) @@ -698,19 +1004,70 @@ class TagConfigStreamResponse(aristaproto.Message): @dataclass(eq=False, repr=False) -class TagConfigSetRequest(aristaproto.Message): - value: "TagConfig" = aristaproto.message_field(1) - """ - TagConfig carries the value to set into the datastore. - See the documentation on the TagConfig struct for which fields are required. +class TagConfigBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["TagConfig"] = aristaproto.message_field(1) """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ -@dataclass(eq=False, repr=False) -class TagConfigSetResponse(aristaproto.Message): - value: "TagConfig" = aristaproto.message_field(1) + time: "__time__.TimeBounds" = aristaproto.message_field(3) """ - Value carries all the values given in the TagConfigSetRequest as well + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each TagConfig at end. + * Each TagConfig response is fully-specified (all fields set). + * start: Returns the state of each TagConfig at start, followed by updates until now. + * Each TagConfig response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each TagConfig at start, followed by updates + until end. + * Each TagConfig response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class TagConfigBatchedStreamResponse(aristaproto.Message): + responses: List["TagConfigStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + +@dataclass(eq=False, repr=False) +class TagConfigSetRequest(aristaproto.Message): + value: "TagConfig" = aristaproto.message_field(1) + """ + TagConfig carries the value to set into the datastore. + See the documentation on the TagConfig struct for which fields are required. + """ + + +@dataclass(eq=False, repr=False) +class TagConfigSetResponse(aristaproto.Message): + value: "TagConfig" = aristaproto.message_field(1) + """ + Value carries all the values given in the TagConfigSetRequest as well as any server-generated values. """ @@ -767,15 +1124,37 @@ class TagConfigDeleteResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class TagConfigDeleteSomeRequest(aristaproto.Message): + keys: List["TagKey"] = aristaproto.message_field(1) + """key contains a list of TagConfig keys to delete""" + + +@dataclass(eq=False, repr=False) +class TagConfigDeleteSomeResponse(aristaproto.Message): + """TagConfigDeleteSomeResponse is only sent when there is an error.""" + + key: "TagKey" = aristaproto.message_field(1) + error: str = aristaproto.string_field(2) + + @dataclass(eq=False, repr=False) class TagConfigDeleteAllRequest(aristaproto.Message): - pass + partial_eq_filter: List["TagConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a DeleteAll. + This requires all provided fields to be equal to the response. + A filtered DeleteAll will use GetAll with filter to find things to delete. + """ @dataclass(eq=False, repr=False) class TagConfigDeleteAllResponse(aristaproto.Message): type: "___fmp__.DeleteError" = aristaproto.enum_field(1) - """This describes the class of delete error.""" + """ + This describes the class of delete error. + A DeleteAllResponse is only sent when there is an error. + """ error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) """This indicates the error message from the delete failure.""" @@ -805,6 +1184,24 @@ async def get_one( metadata=metadata, ) + async def get_some( + self, + tag_some_request: "TagSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["TagSomeResponse"]: + async for response in self._unary_stream( + "/arista.tag.v2.TagService/GetSome", + tag_some_request, + TagSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def get_all( self, tag_stream_request: "TagStreamRequest", @@ -841,6 +1238,77 @@ async def subscribe( ): yield response + async def get_meta( + self, + tag_stream_request: "TagStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.tag.v2.TagService/GetMeta", + tag_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + tag_stream_request: "TagStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.tag.v2.TagService/SubscribeMeta", + tag_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all_batched( + self, + tag_batched_stream_request: "TagBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["TagBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.tag.v2.TagService/GetAllBatched", + tag_batched_stream_request, + TagBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + tag_batched_stream_request: "TagBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["TagBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.tag.v2.TagService/SubscribeBatched", + tag_batched_stream_request, + TagBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + class TagAssignmentServiceStub(aristaproto.ServiceStub): async def get_one( @@ -860,6 +1328,24 @@ async def get_one( metadata=metadata, ) + async def get_some( + self, + tag_assignment_some_request: "TagAssignmentSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["TagAssignmentSomeResponse"]: + async for response in self._unary_stream( + "/arista.tag.v2.TagAssignmentService/GetSome", + tag_assignment_some_request, + TagAssignmentSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def get_all( self, tag_assignment_stream_request: "TagAssignmentStreamRequest", @@ -896,6 +1382,77 @@ async def subscribe( ): yield response + async def get_meta( + self, + tag_assignment_stream_request: "TagAssignmentStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.tag.v2.TagAssignmentService/GetMeta", + tag_assignment_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + tag_assignment_stream_request: "TagAssignmentStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.tag.v2.TagAssignmentService/SubscribeMeta", + tag_assignment_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all_batched( + self, + tag_assignment_batched_stream_request: "TagAssignmentBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["TagAssignmentBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.tag.v2.TagAssignmentService/GetAllBatched", + tag_assignment_batched_stream_request, + TagAssignmentBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + tag_assignment_batched_stream_request: "TagAssignmentBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["TagAssignmentBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.tag.v2.TagAssignmentService/SubscribeBatched", + tag_assignment_batched_stream_request, + TagAssignmentBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + class TagAssignmentConfigServiceStub(aristaproto.ServiceStub): async def get_one( @@ -915,6 +1472,24 @@ async def get_one( metadata=metadata, ) + async def get_some( + self, + tag_assignment_config_some_request: "TagAssignmentConfigSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["TagAssignmentConfigSomeResponse"]: + async for response in self._unary_stream( + "/arista.tag.v2.TagAssignmentConfigService/GetSome", + tag_assignment_config_some_request, + TagAssignmentConfigSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def get_all( self, tag_assignment_config_stream_request: "TagAssignmentConfigStreamRequest", @@ -951,6 +1526,41 @@ async def subscribe( ): yield response + async def get_meta( + self, + tag_assignment_config_stream_request: "TagAssignmentConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.tag.v2.TagAssignmentConfigService/GetMeta", + tag_assignment_config_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + tag_assignment_config_stream_request: "TagAssignmentConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.tag.v2.TagAssignmentConfigService/SubscribeMeta", + tag_assignment_config_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def set( self, tag_assignment_config_set_request: "TagAssignmentConfigSetRequest", @@ -1003,6 +1613,24 @@ async def delete( metadata=metadata, ) + async def delete_some( + self, + tag_assignment_config_delete_some_request: "TagAssignmentConfigDeleteSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["TagAssignmentConfigDeleteSomeResponse"]: + async for response in self._unary_stream( + "/arista.tag.v2.TagAssignmentConfigService/DeleteSome", + tag_assignment_config_delete_some_request, + TagAssignmentConfigDeleteSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def delete_all( self, tag_assignment_config_delete_all_request: "TagAssignmentConfigDeleteAllRequest", @@ -1021,6 +1649,42 @@ async def delete_all( ): yield response + async def get_all_batched( + self, + tag_assignment_config_batched_stream_request: "TagAssignmentConfigBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["TagAssignmentConfigBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.tag.v2.TagAssignmentConfigService/GetAllBatched", + tag_assignment_config_batched_stream_request, + TagAssignmentConfigBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + tag_assignment_config_batched_stream_request: "TagAssignmentConfigBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["TagAssignmentConfigBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.tag.v2.TagAssignmentConfigService/SubscribeBatched", + tag_assignment_config_batched_stream_request, + TagAssignmentConfigBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + class TagConfigServiceStub(aristaproto.ServiceStub): async def get_one( @@ -1040,6 +1704,24 @@ async def get_one( metadata=metadata, ) + async def get_some( + self, + tag_config_some_request: "TagConfigSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["TagConfigSomeResponse"]: + async for response in self._unary_stream( + "/arista.tag.v2.TagConfigService/GetSome", + tag_config_some_request, + TagConfigSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def get_all( self, tag_config_stream_request: "TagConfigStreamRequest", @@ -1076,6 +1758,41 @@ async def subscribe( ): yield response + async def get_meta( + self, + tag_config_stream_request: "TagConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.tag.v2.TagConfigService/GetMeta", + tag_config_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + tag_config_stream_request: "TagConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.tag.v2.TagConfigService/SubscribeMeta", + tag_config_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def set( self, tag_config_set_request: "TagConfigSetRequest", @@ -1128,6 +1845,24 @@ async def delete( metadata=metadata, ) + async def delete_some( + self, + tag_config_delete_some_request: "TagConfigDeleteSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["TagConfigDeleteSomeResponse"]: + async for response in self._unary_stream( + "/arista.tag.v2.TagConfigService/DeleteSome", + tag_config_delete_some_request, + TagConfigDeleteSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def delete_all( self, tag_config_delete_all_request: "TagConfigDeleteAllRequest", @@ -1146,11 +1881,53 @@ async def delete_all( ): yield response + async def get_all_batched( + self, + tag_config_batched_stream_request: "TagConfigBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["TagConfigBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.tag.v2.TagConfigService/GetAllBatched", + tag_config_batched_stream_request, + TagConfigBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + tag_config_batched_stream_request: "TagConfigBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["TagConfigBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.tag.v2.TagConfigService/SubscribeBatched", + tag_config_batched_stream_request, + TagConfigBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + class TagServiceBase(ServiceBase): + async def get_one(self, tag_request: "TagRequest") -> "TagResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_some( + self, tag_some_request: "TagSomeRequest" + ) -> AsyncIterator["TagSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_all( self, tag_stream_request: "TagStreamRequest" ) -> AsyncIterator["TagStreamResponse"]: @@ -1161,6 +1938,24 @@ async def subscribe( ) -> AsyncIterator["TagStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_meta(self, tag_stream_request: "TagStreamRequest") -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, tag_stream_request: "TagStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all_batched( + self, tag_batched_stream_request: "TagBatchedStreamRequest" + ) -> AsyncIterator["TagBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, tag_batched_stream_request: "TagBatchedStreamRequest" + ) -> AsyncIterator["TagBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def __rpc_get_one( self, stream: "grpclib.server.Stream[TagRequest, TagResponse]" ) -> None: @@ -1168,6 +1963,16 @@ async def __rpc_get_one( response = await self.get_one(request) await stream.send_message(response) + async def __rpc_get_some( + self, stream: "grpclib.server.Stream[TagSomeRequest, TagSomeResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + async def __rpc_get_all( self, stream: "grpclib.server.Stream[TagStreamRequest, TagStreamResponse]" ) -> None: @@ -1188,6 +1993,45 @@ async def __rpc_subscribe( request, ) + async def __rpc_get_meta( + self, stream: "grpclib.server.Stream[TagStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, stream: "grpclib.server.Stream[TagStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[TagBatchedStreamRequest, TagBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[TagBatchedStreamRequest, TagBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: return { "/arista.tag.v2.TagService/GetOne": grpclib.const.Handler( @@ -1196,6 +2040,12 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: TagRequest, TagResponse, ), + "/arista.tag.v2.TagService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + TagSomeRequest, + TagSomeResponse, + ), "/arista.tag.v2.TagService/GetAll": grpclib.const.Handler( self.__rpc_get_all, grpclib.const.Cardinality.UNARY_STREAM, @@ -1208,15 +2058,45 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: TagStreamRequest, TagStreamResponse, ), + "/arista.tag.v2.TagService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + TagStreamRequest, + MetaResponse, + ), + "/arista.tag.v2.TagService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + TagStreamRequest, + MetaResponse, + ), + "/arista.tag.v2.TagService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + TagBatchedStreamRequest, + TagBatchedStreamResponse, + ), + "/arista.tag.v2.TagService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + TagBatchedStreamRequest, + TagBatchedStreamResponse, + ), } class TagAssignmentServiceBase(ServiceBase): + async def get_one( self, tag_assignment_request: "TagAssignmentRequest" ) -> "TagAssignmentResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_some( + self, tag_assignment_some_request: "TagAssignmentSomeRequest" + ) -> AsyncIterator["TagAssignmentSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_all( self, tag_assignment_stream_request: "TagAssignmentStreamRequest" ) -> AsyncIterator["TagAssignmentStreamResponse"]: @@ -1227,6 +2107,26 @@ async def subscribe( ) -> AsyncIterator["TagAssignmentStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_meta( + self, tag_assignment_stream_request: "TagAssignmentStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, tag_assignment_stream_request: "TagAssignmentStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all_batched( + self, tag_assignment_batched_stream_request: "TagAssignmentBatchedStreamRequest" + ) -> AsyncIterator["TagAssignmentBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, tag_assignment_batched_stream_request: "TagAssignmentBatchedStreamRequest" + ) -> AsyncIterator["TagAssignmentBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def __rpc_get_one( self, stream: "grpclib.server.Stream[TagAssignmentRequest, TagAssignmentResponse]", @@ -1235,6 +2135,17 @@ async def __rpc_get_one( response = await self.get_one(request) await stream.send_message(response) + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[TagAssignmentSomeRequest, TagAssignmentSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + async def __rpc_get_all( self, stream: "grpclib.server.Stream[TagAssignmentStreamRequest, TagAssignmentStreamResponse]", @@ -1257,6 +2168,45 @@ async def __rpc_subscribe( request, ) + async def __rpc_get_meta( + self, stream: "grpclib.server.Stream[TagAssignmentStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, stream: "grpclib.server.Stream[TagAssignmentStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[TagAssignmentBatchedStreamRequest, TagAssignmentBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[TagAssignmentBatchedStreamRequest, TagAssignmentBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: return { "/arista.tag.v2.TagAssignmentService/GetOne": grpclib.const.Handler( @@ -1265,6 +2215,12 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: TagAssignmentRequest, TagAssignmentResponse, ), + "/arista.tag.v2.TagAssignmentService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + TagAssignmentSomeRequest, + TagAssignmentSomeResponse, + ), "/arista.tag.v2.TagAssignmentService/GetAll": grpclib.const.Handler( self.__rpc_get_all, grpclib.const.Cardinality.UNARY_STREAM, @@ -1277,15 +2233,45 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: TagAssignmentStreamRequest, TagAssignmentStreamResponse, ), + "/arista.tag.v2.TagAssignmentService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + TagAssignmentStreamRequest, + MetaResponse, + ), + "/arista.tag.v2.TagAssignmentService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + TagAssignmentStreamRequest, + MetaResponse, + ), + "/arista.tag.v2.TagAssignmentService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + TagAssignmentBatchedStreamRequest, + TagAssignmentBatchedStreamResponse, + ), + "/arista.tag.v2.TagAssignmentService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + TagAssignmentBatchedStreamRequest, + TagAssignmentBatchedStreamResponse, + ), } class TagAssignmentConfigServiceBase(ServiceBase): + async def get_one( self, tag_assignment_config_request: "TagAssignmentConfigRequest" ) -> "TagAssignmentConfigResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_some( + self, tag_assignment_config_some_request: "TagAssignmentConfigSomeRequest" + ) -> AsyncIterator["TagAssignmentConfigSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_all( self, tag_assignment_config_stream_request: "TagAssignmentConfigStreamRequest" ) -> AsyncIterator["TagAssignmentConfigStreamResponse"]: @@ -1296,6 +2282,16 @@ async def subscribe( ) -> AsyncIterator["TagAssignmentConfigStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_meta( + self, tag_assignment_config_stream_request: "TagAssignmentConfigStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, tag_assignment_config_stream_request: "TagAssignmentConfigStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def set( self, tag_assignment_config_set_request: "TagAssignmentConfigSetRequest" ) -> "TagAssignmentConfigSetResponse": @@ -1312,12 +2308,30 @@ async def delete( ) -> "TagAssignmentConfigDeleteResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def delete_some( + self, + tag_assignment_config_delete_some_request: "TagAssignmentConfigDeleteSomeRequest", + ) -> AsyncIterator["TagAssignmentConfigDeleteSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def delete_all( self, tag_assignment_config_delete_all_request: "TagAssignmentConfigDeleteAllRequest", ) -> AsyncIterator["TagAssignmentConfigDeleteAllResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_all_batched( + self, + tag_assignment_config_batched_stream_request: "TagAssignmentConfigBatchedStreamRequest", + ) -> AsyncIterator["TagAssignmentConfigBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, + tag_assignment_config_batched_stream_request: "TagAssignmentConfigBatchedStreamRequest", + ) -> AsyncIterator["TagAssignmentConfigBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def __rpc_get_one( self, stream: "grpclib.server.Stream[TagAssignmentConfigRequest, TagAssignmentConfigResponse]", @@ -1326,6 +2340,17 @@ async def __rpc_get_one( response = await self.get_one(request) await stream.send_message(response) + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[TagAssignmentConfigSomeRequest, TagAssignmentConfigSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + async def __rpc_get_all( self, stream: "grpclib.server.Stream[TagAssignmentConfigStreamRequest, TagAssignmentConfigStreamResponse]", @@ -1348,6 +2373,25 @@ async def __rpc_subscribe( request, ) + async def __rpc_get_meta( + self, + stream: "grpclib.server.Stream[TagAssignmentConfigStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, + stream: "grpclib.server.Stream[TagAssignmentConfigStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + async def __rpc_set( self, stream: "grpclib.server.Stream[TagAssignmentConfigSetRequest, TagAssignmentConfigSetResponse]", @@ -1375,6 +2419,17 @@ async def __rpc_delete( response = await self.delete(request) await stream.send_message(response) + async def __rpc_delete_some( + self, + stream: "grpclib.server.Stream[TagAssignmentConfigDeleteSomeRequest, TagAssignmentConfigDeleteSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.delete_some, + stream, + request, + ) + async def __rpc_delete_all( self, stream: "grpclib.server.Stream[TagAssignmentConfigDeleteAllRequest, TagAssignmentConfigDeleteAllResponse]", @@ -1386,6 +2441,28 @@ async def __rpc_delete_all( request, ) + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[TagAssignmentConfigBatchedStreamRequest, TagAssignmentConfigBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[TagAssignmentConfigBatchedStreamRequest, TagAssignmentConfigBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: return { "/arista.tag.v2.TagAssignmentConfigService/GetOne": grpclib.const.Handler( @@ -1394,6 +2471,12 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: TagAssignmentConfigRequest, TagAssignmentConfigResponse, ), + "/arista.tag.v2.TagAssignmentConfigService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + TagAssignmentConfigSomeRequest, + TagAssignmentConfigSomeResponse, + ), "/arista.tag.v2.TagAssignmentConfigService/GetAll": grpclib.const.Handler( self.__rpc_get_all, grpclib.const.Cardinality.UNARY_STREAM, @@ -1406,6 +2489,18 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: TagAssignmentConfigStreamRequest, TagAssignmentConfigStreamResponse, ), + "/arista.tag.v2.TagAssignmentConfigService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + TagAssignmentConfigStreamRequest, + MetaResponse, + ), + "/arista.tag.v2.TagAssignmentConfigService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + TagAssignmentConfigStreamRequest, + MetaResponse, + ), "/arista.tag.v2.TagAssignmentConfigService/Set": grpclib.const.Handler( self.__rpc_set, grpclib.const.Cardinality.UNARY_UNARY, @@ -1424,21 +2519,45 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: TagAssignmentConfigDeleteRequest, TagAssignmentConfigDeleteResponse, ), + "/arista.tag.v2.TagAssignmentConfigService/DeleteSome": grpclib.const.Handler( + self.__rpc_delete_some, + grpclib.const.Cardinality.UNARY_STREAM, + TagAssignmentConfigDeleteSomeRequest, + TagAssignmentConfigDeleteSomeResponse, + ), "/arista.tag.v2.TagAssignmentConfigService/DeleteAll": grpclib.const.Handler( self.__rpc_delete_all, grpclib.const.Cardinality.UNARY_STREAM, TagAssignmentConfigDeleteAllRequest, TagAssignmentConfigDeleteAllResponse, ), + "/arista.tag.v2.TagAssignmentConfigService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + TagAssignmentConfigBatchedStreamRequest, + TagAssignmentConfigBatchedStreamResponse, + ), + "/arista.tag.v2.TagAssignmentConfigService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + TagAssignmentConfigBatchedStreamRequest, + TagAssignmentConfigBatchedStreamResponse, + ), } class TagConfigServiceBase(ServiceBase): + async def get_one( self, tag_config_request: "TagConfigRequest" ) -> "TagConfigResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_some( + self, tag_config_some_request: "TagConfigSomeRequest" + ) -> AsyncIterator["TagConfigSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_all( self, tag_config_stream_request: "TagConfigStreamRequest" ) -> AsyncIterator["TagConfigStreamResponse"]: @@ -1449,6 +2568,16 @@ async def subscribe( ) -> AsyncIterator["TagConfigStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_meta( + self, tag_config_stream_request: "TagConfigStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, tag_config_stream_request: "TagConfigStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def set( self, tag_config_set_request: "TagConfigSetRequest" ) -> "TagConfigSetResponse": @@ -1464,11 +2593,26 @@ async def delete( ) -> "TagConfigDeleteResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def delete_some( + self, tag_config_delete_some_request: "TagConfigDeleteSomeRequest" + ) -> AsyncIterator["TagConfigDeleteSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def delete_all( self, tag_config_delete_all_request: "TagConfigDeleteAllRequest" ) -> AsyncIterator["TagConfigDeleteAllResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_all_batched( + self, tag_config_batched_stream_request: "TagConfigBatchedStreamRequest" + ) -> AsyncIterator["TagConfigBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, tag_config_batched_stream_request: "TagConfigBatchedStreamRequest" + ) -> AsyncIterator["TagConfigBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def __rpc_get_one( self, stream: "grpclib.server.Stream[TagConfigRequest, TagConfigResponse]" ) -> None: @@ -1476,6 +2620,17 @@ async def __rpc_get_one( response = await self.get_one(request) await stream.send_message(response) + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[TagConfigSomeRequest, TagConfigSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + async def __rpc_get_all( self, stream: "grpclib.server.Stream[TagConfigStreamRequest, TagConfigStreamResponse]", @@ -1498,6 +2653,23 @@ async def __rpc_subscribe( request, ) + async def __rpc_get_meta( + self, stream: "grpclib.server.Stream[TagConfigStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, stream: "grpclib.server.Stream[TagConfigStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + async def __rpc_set( self, stream: "grpclib.server.Stream[TagConfigSetRequest, TagConfigSetResponse]" ) -> None: @@ -1524,6 +2696,17 @@ async def __rpc_delete( response = await self.delete(request) await stream.send_message(response) + async def __rpc_delete_some( + self, + stream: "grpclib.server.Stream[TagConfigDeleteSomeRequest, TagConfigDeleteSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.delete_some, + stream, + request, + ) + async def __rpc_delete_all( self, stream: "grpclib.server.Stream[TagConfigDeleteAllRequest, TagConfigDeleteAllResponse]", @@ -1535,6 +2718,28 @@ async def __rpc_delete_all( request, ) + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[TagConfigBatchedStreamRequest, TagConfigBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[TagConfigBatchedStreamRequest, TagConfigBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: return { "/arista.tag.v2.TagConfigService/GetOne": grpclib.const.Handler( @@ -1543,6 +2748,12 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: TagConfigRequest, TagConfigResponse, ), + "/arista.tag.v2.TagConfigService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + TagConfigSomeRequest, + TagConfigSomeResponse, + ), "/arista.tag.v2.TagConfigService/GetAll": grpclib.const.Handler( self.__rpc_get_all, grpclib.const.Cardinality.UNARY_STREAM, @@ -1555,6 +2766,18 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: TagConfigStreamRequest, TagConfigStreamResponse, ), + "/arista.tag.v2.TagConfigService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + TagConfigStreamRequest, + MetaResponse, + ), + "/arista.tag.v2.TagConfigService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + TagConfigStreamRequest, + MetaResponse, + ), "/arista.tag.v2.TagConfigService/Set": grpclib.const.Handler( self.__rpc_set, grpclib.const.Cardinality.UNARY_UNARY, @@ -1573,10 +2796,28 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: TagConfigDeleteRequest, TagConfigDeleteResponse, ), + "/arista.tag.v2.TagConfigService/DeleteSome": grpclib.const.Handler( + self.__rpc_delete_some, + grpclib.const.Cardinality.UNARY_STREAM, + TagConfigDeleteSomeRequest, + TagConfigDeleteSomeResponse, + ), "/arista.tag.v2.TagConfigService/DeleteAll": grpclib.const.Handler( self.__rpc_delete_all, grpclib.const.Cardinality.UNARY_STREAM, TagConfigDeleteAllRequest, TagConfigDeleteAllResponse, ), + "/arista.tag.v2.TagConfigService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + TagConfigBatchedStreamRequest, + TagConfigBatchedStreamResponse, + ), + "/arista.tag.v2.TagConfigService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + TagConfigBatchedStreamRequest, + TagConfigBatchedStreamResponse, + ), } diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/time/__init__.py b/python-avd/pyavd/_cv/api/arista/time/__init__.py similarity index 63% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/time/__init__.py rename to python-avd/pyavd/_cv/api/arista/time/__init__.py index eb863fa0f57..ffd33402025 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/time/__init__.py +++ b/python-avd/pyavd/_cv/api/arista/time/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. +# Copyright (c) 2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. # Generated by the protocol buffer compiler. DO NOT EDIT! @@ -9,13 +9,7 @@ from dataclasses import dataclass from datetime import datetime -try: - import aristaproto -except ImportError: - HAS_ARISTAPROTO = False - from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_aristaproto as aristaproto -else: - HAS_ARISTAPROTO = True +import aristaproto @dataclass(eq=False, repr=False) diff --git a/python-avd/pyavd/_cv/api/arista/workspace/__init__.py b/python-avd/pyavd/_cv/api/arista/workspace/__init__.py new file mode 100644 index 00000000000..b17ca7c745d --- /dev/null +++ b/python-avd/pyavd/_cv/api/arista/workspace/__init__.py @@ -0,0 +1,3 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/workspace/v1/__init__.py b/python-avd/pyavd/_cv/api/arista/workspace/v1/__init__.py similarity index 58% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/workspace/v1/__init__.py rename to python-avd/pyavd/_cv/api/arista/workspace/v1/__init__.py index f76b6e7b1d3..5cb57b2a4ed 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/workspace/v1/__init__.py +++ b/python-avd/pyavd/_cv/api/arista/workspace/v1/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. +# Copyright (c) 2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. # Generated by the protocol buffer compiler. DO NOT EDIT! @@ -16,17 +16,9 @@ Optional, ) -try: - import aristaproto - import grpclib - from aristaproto.grpc.grpclib_server import ServiceBase -except ImportError: - HAS_ARISTAPROTO = False - from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_aristaproto as aristaproto - from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_grpclib as grpclib - ServiceBase = object -else: - HAS_ARISTAPROTO = True +import aristaproto +import grpclib +from aristaproto.grpc.grpclib_server import ServiceBase from .... import fmp as ___fmp__ from ... import ( @@ -298,6 +290,12 @@ class ConfigValidationSkipCause(aristaproto.Enum): skipped because the device has no configuration changes in the workspace. """ + NO_CONFIG_SOURCES = 4 + """ + CONFIG_VALIDATION_SKIP_CAUSE_NO_CONFIG_SOURCES indicates that the stage was + skipped because the device has no config sources in the workspace. + """ + class ImageValidationSkipCause(aristaproto.Enum): """ @@ -329,6 +327,12 @@ class ImageValidationSkipCause(aristaproto.Enum): skipped because the device has no image changes in the workspace. """ + NO_PROPOSED_SOFTWARE = 4 + """ + IMAGE_VALIDATION_SKIP_CAUSE_NO_PROPOSED_SOFTWARE indicates that the stage was + skipped because the device has no proposed software changes in the workspace. + """ + @dataclass(eq=False, repr=False) class RequestParams(aristaproto.Message): @@ -824,6 +828,27 @@ class WorkspaceBuildDetails(aristaproto.Message): """authz_status is the status of provision permission for the device.""" +@dataclass(eq=False, repr=False) +class MetaResponse(aristaproto.Message): + time: datetime = aristaproto.message_field(1) + """ + Time holds the timestamp of the last item included in the metadata calculation. + """ + + type: "__subscriptions__.Operation" = aristaproto.enum_field(2) + """ + Operation indicates how the value in this response should be considered. + Under non-subscribe requests, this value should always be INITIAL. In a subscription, + once all initial data is streamed and the client begins to receive modification updates, + you should not see INITIAL again. + """ + + count: Optional[int] = aristaproto.message_field(3, wraps=aristaproto.TYPE_UINT32) + """ + Count is the number of items present under the conditions of the request. + """ + + @dataclass(eq=False, repr=False) class WorkspaceRequest(aristaproto.Message): key: "WorkspaceKey" = aristaproto.message_field(1) @@ -856,6 +881,35 @@ class WorkspaceResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class WorkspaceSomeRequest(aristaproto.Message): + keys: List["WorkspaceKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class WorkspaceSomeResponse(aristaproto.Message): + value: "Workspace" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + @dataclass(eq=False, repr=False) class WorkspaceStreamRequest(aristaproto.Message): partial_eq_filter: List["Workspace"] = aristaproto.message_field(1) @@ -908,6 +962,57 @@ class WorkspaceStreamResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class WorkspaceBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["Workspace"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each Workspace at end. + * Each Workspace response is fully-specified (all fields set). + * start: Returns the state of each Workspace at start, followed by updates until now. + * Each Workspace response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each Workspace at start, followed by updates + until end. + * Each Workspace response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class WorkspaceBatchedStreamResponse(aristaproto.Message): + responses: List["WorkspaceStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + @dataclass(eq=False, repr=False) class WorkspaceBuildRequest(aristaproto.Message): key: "WorkspaceBuildKey" = aristaproto.message_field(1) @@ -940,6 +1045,35 @@ class WorkspaceBuildResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class WorkspaceBuildSomeRequest(aristaproto.Message): + keys: List["WorkspaceBuildKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class WorkspaceBuildSomeResponse(aristaproto.Message): + value: "WorkspaceBuild" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + @dataclass(eq=False, repr=False) class WorkspaceBuildStreamRequest(aristaproto.Message): partial_eq_filter: List["WorkspaceBuild"] = aristaproto.message_field(1) @@ -992,6 +1126,57 @@ class WorkspaceBuildStreamResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class WorkspaceBuildBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["WorkspaceBuild"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each WorkspaceBuild at end. + * Each WorkspaceBuild response is fully-specified (all fields set). + * start: Returns the state of each WorkspaceBuild at start, followed by updates until now. + * Each WorkspaceBuild response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each WorkspaceBuild at start, followed by updates + until end. + * Each WorkspaceBuild response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class WorkspaceBuildBatchedStreamResponse(aristaproto.Message): + responses: List["WorkspaceBuildStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + @dataclass(eq=False, repr=False) class WorkspaceBuildDetailsRequest(aristaproto.Message): key: "WorkspaceBuildDetailsKey" = aristaproto.message_field(1) @@ -1024,6 +1209,35 @@ class WorkspaceBuildDetailsResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class WorkspaceBuildDetailsSomeRequest(aristaproto.Message): + keys: List["WorkspaceBuildDetailsKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class WorkspaceBuildDetailsSomeResponse(aristaproto.Message): + value: "WorkspaceBuildDetails" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + @dataclass(eq=False, repr=False) class WorkspaceBuildDetailsStreamRequest(aristaproto.Message): partial_eq_filter: List["WorkspaceBuildDetails"] = aristaproto.message_field(1) @@ -1078,6 +1292,59 @@ class WorkspaceBuildDetailsStreamResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class WorkspaceBuildDetailsBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["WorkspaceBuildDetails"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. + + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. + """ + + time: "__time__.TimeBounds" = aristaproto.message_field(3) + """ + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. + + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each WorkspaceBuildDetails at end. + * Each WorkspaceBuildDetails response is fully-specified (all fields set). + * start: Returns the state of each WorkspaceBuildDetails at start, followed by updates until now. + * Each WorkspaceBuildDetails response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each WorkspaceBuildDetails at start, followed by updates + until end. + * Each WorkspaceBuildDetails response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class WorkspaceBuildDetailsBatchedStreamResponse(aristaproto.Message): + responses: List["WorkspaceBuildDetailsStreamResponse"] = aristaproto.message_field( + 1 + ) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + @dataclass(eq=False, repr=False) class WorkspaceConfigRequest(aristaproto.Message): key: "WorkspaceKey" = aristaproto.message_field(1) @@ -1110,6 +1377,35 @@ class WorkspaceConfigResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class WorkspaceConfigSomeRequest(aristaproto.Message): + keys: List["WorkspaceKey"] = aristaproto.message_field(1) + time: datetime = aristaproto.message_field(2) + """ + Time indicates the time for which you are interested in the data. + If no time is given, the server will use the time at which it makes the request. + """ + + +@dataclass(eq=False, repr=False) +class WorkspaceConfigSomeResponse(aristaproto.Message): + value: "WorkspaceConfig" = aristaproto.message_field(1) + """ + Value is the value requested. + This structure will be fully-populated as it exists in the datastore. If + optional fields were not given at creation, these fields will be empty or + set to default values. + """ + + error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) + """ + Error is an optional field. + It should be filled when there is an error in the GetSome process. + """ + + time: datetime = aristaproto.message_field(3) + + @dataclass(eq=False, repr=False) class WorkspaceConfigStreamRequest(aristaproto.Message): partial_eq_filter: List["WorkspaceConfig"] = aristaproto.message_field(1) @@ -1165,30 +1461,81 @@ class WorkspaceConfigStreamResponse(aristaproto.Message): @dataclass(eq=False, repr=False) -class WorkspaceConfigSetRequest(aristaproto.Message): - value: "WorkspaceConfig" = aristaproto.message_field(1) - """ - WorkspaceConfig carries the value to set into the datastore. - See the documentation on the WorkspaceConfig struct for which fields are required. +class WorkspaceConfigBatchedStreamRequest(aristaproto.Message): + partial_eq_filter: List["WorkspaceConfig"] = aristaproto.message_field(1) """ + PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + This requires all provided fields to be equal to the response. - -@dataclass(eq=False, repr=False) -class WorkspaceConfigSetResponse(aristaproto.Message): - value: "WorkspaceConfig" = aristaproto.message_field(1) - """ - Value carries all the values given in the WorkspaceConfigSetRequest as well - as any server-generated values. + While transparent to users, this field also allows services to optimize internal + subscriptions if filter(s) are sufficiently specific. """ - time: datetime = aristaproto.message_field(2) + time: "__time__.TimeBounds" = aristaproto.message_field(3) """ - Time indicates the (UTC) timestamp at which the system recognizes the - creation. The only guarantees made about this timestamp are: + TimeRange allows limiting response data to within a specified time window. + If this field is populated, at least one of the two time fields are required. - - it is after the time the request was received - - a time-ranged query with StartTime==CreatedAt will include this instance. - """ + For GetAll, the fields start and end can be used as follows: + + * end: Returns the state of each WorkspaceConfig at end. + * Each WorkspaceConfig response is fully-specified (all fields set). + * start: Returns the state of each WorkspaceConfig at start, followed by updates until now. + * Each WorkspaceConfig response at start is fully-specified, but updates may be partial. + * start and end: Returns the state of each WorkspaceConfig at start, followed by updates + until end. + * Each WorkspaceConfig response at start is fully-specified, but updates until end may + be partial. + + This field is not allowed in the Subscribe RPC. + """ + + max_messages: Optional[int] = aristaproto.message_field( + 4, wraps=aristaproto.TYPE_UINT32 + ) + """ + MaxMessages limits the maximum number of messages that can be contained in one batch. + MaxMessages is required to be at least 1. + The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + INTERNAL_BATCH_LIMIT is set based on the maximum message size. + """ + + +@dataclass(eq=False, repr=False) +class WorkspaceConfigBatchedStreamResponse(aristaproto.Message): + responses: List["WorkspaceConfigStreamResponse"] = aristaproto.message_field(1) + """ + Values are the values deemed relevant to the initiating request. + The length of this structure is guaranteed to be between (inclusive) 1 and + min(req.max_messages, INTERNAL_BATCH_LIMIT). + """ + + +@dataclass(eq=False, repr=False) +class WorkspaceConfigSetRequest(aristaproto.Message): + value: "WorkspaceConfig" = aristaproto.message_field(1) + """ + WorkspaceConfig carries the value to set into the datastore. + See the documentation on the WorkspaceConfig struct for which fields are required. + """ + + +@dataclass(eq=False, repr=False) +class WorkspaceConfigSetResponse(aristaproto.Message): + value: "WorkspaceConfig" = aristaproto.message_field(1) + """ + Value carries all the values given in the WorkspaceConfigSetRequest as well + as any server-generated values. + """ + + time: datetime = aristaproto.message_field(2) + """ + Time indicates the (UTC) timestamp at which the system recognizes the + creation. The only guarantees made about this timestamp are: + + - it is after the time the request was received + - a time-ranged query with StartTime==CreatedAt will include this instance. + """ @dataclass(eq=False, repr=False) @@ -1234,15 +1581,39 @@ class WorkspaceConfigDeleteResponse(aristaproto.Message): """ +@dataclass(eq=False, repr=False) +class WorkspaceConfigDeleteSomeRequest(aristaproto.Message): + keys: List["WorkspaceKey"] = aristaproto.message_field(1) + """key contains a list of WorkspaceConfig keys to delete""" + + +@dataclass(eq=False, repr=False) +class WorkspaceConfigDeleteSomeResponse(aristaproto.Message): + """ + WorkspaceConfigDeleteSomeResponse is only sent when there is an error. + """ + + key: "WorkspaceKey" = aristaproto.message_field(1) + error: str = aristaproto.string_field(2) + + @dataclass(eq=False, repr=False) class WorkspaceConfigDeleteAllRequest(aristaproto.Message): - pass + partial_eq_filter: List["WorkspaceConfig"] = aristaproto.message_field(1) + """ + PartialEqFilter provides a way to server-side filter a DeleteAll. + This requires all provided fields to be equal to the response. + A filtered DeleteAll will use GetAll with filter to find things to delete. + """ @dataclass(eq=False, repr=False) class WorkspaceConfigDeleteAllResponse(aristaproto.Message): type: "___fmp__.DeleteError" = aristaproto.enum_field(1) - """This describes the class of delete error.""" + """ + This describes the class of delete error. + A DeleteAllResponse is only sent when there is an error. + """ error: Optional[str] = aristaproto.message_field(2, wraps=aristaproto.TYPE_STRING) """This indicates the error message from the delete failure.""" @@ -1274,6 +1645,24 @@ async def get_one( metadata=metadata, ) + async def get_some( + self, + workspace_some_request: "WorkspaceSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["WorkspaceSomeResponse"]: + async for response in self._unary_stream( + "/arista.workspace.v1.WorkspaceService/GetSome", + workspace_some_request, + WorkspaceSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def get_all( self, workspace_stream_request: "WorkspaceStreamRequest", @@ -1310,6 +1699,77 @@ async def subscribe( ): yield response + async def get_meta( + self, + workspace_stream_request: "WorkspaceStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.workspace.v1.WorkspaceService/GetMeta", + workspace_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + workspace_stream_request: "WorkspaceStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.workspace.v1.WorkspaceService/SubscribeMeta", + workspace_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all_batched( + self, + workspace_batched_stream_request: "WorkspaceBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["WorkspaceBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.workspace.v1.WorkspaceService/GetAllBatched", + workspace_batched_stream_request, + WorkspaceBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + workspace_batched_stream_request: "WorkspaceBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["WorkspaceBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.workspace.v1.WorkspaceService/SubscribeBatched", + workspace_batched_stream_request, + WorkspaceBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + class WorkspaceBuildServiceStub(aristaproto.ServiceStub): async def get_one( @@ -1329,6 +1789,24 @@ async def get_one( metadata=metadata, ) + async def get_some( + self, + workspace_build_some_request: "WorkspaceBuildSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["WorkspaceBuildSomeResponse"]: + async for response in self._unary_stream( + "/arista.workspace.v1.WorkspaceBuildService/GetSome", + workspace_build_some_request, + WorkspaceBuildSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def get_all( self, workspace_build_stream_request: "WorkspaceBuildStreamRequest", @@ -1365,6 +1843,77 @@ async def subscribe( ): yield response + async def get_meta( + self, + workspace_build_stream_request: "WorkspaceBuildStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.workspace.v1.WorkspaceBuildService/GetMeta", + workspace_build_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + workspace_build_stream_request: "WorkspaceBuildStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.workspace.v1.WorkspaceBuildService/SubscribeMeta", + workspace_build_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all_batched( + self, + workspace_build_batched_stream_request: "WorkspaceBuildBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["WorkspaceBuildBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.workspace.v1.WorkspaceBuildService/GetAllBatched", + workspace_build_batched_stream_request, + WorkspaceBuildBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + workspace_build_batched_stream_request: "WorkspaceBuildBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["WorkspaceBuildBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.workspace.v1.WorkspaceBuildService/SubscribeBatched", + workspace_build_batched_stream_request, + WorkspaceBuildBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + class WorkspaceBuildDetailsServiceStub(aristaproto.ServiceStub): async def get_one( @@ -1384,6 +1933,24 @@ async def get_one( metadata=metadata, ) + async def get_some( + self, + workspace_build_details_some_request: "WorkspaceBuildDetailsSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["WorkspaceBuildDetailsSomeResponse"]: + async for response in self._unary_stream( + "/arista.workspace.v1.WorkspaceBuildDetailsService/GetSome", + workspace_build_details_some_request, + WorkspaceBuildDetailsSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def get_all( self, workspace_build_details_stream_request: "WorkspaceBuildDetailsStreamRequest", @@ -1420,6 +1987,77 @@ async def subscribe( ): yield response + async def get_meta( + self, + workspace_build_details_stream_request: "WorkspaceBuildDetailsStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.workspace.v1.WorkspaceBuildDetailsService/GetMeta", + workspace_build_details_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + workspace_build_details_stream_request: "WorkspaceBuildDetailsStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.workspace.v1.WorkspaceBuildDetailsService/SubscribeMeta", + workspace_build_details_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def get_all_batched( + self, + workspace_build_details_batched_stream_request: "WorkspaceBuildDetailsBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["WorkspaceBuildDetailsBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.workspace.v1.WorkspaceBuildDetailsService/GetAllBatched", + workspace_build_details_batched_stream_request, + WorkspaceBuildDetailsBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + workspace_build_details_batched_stream_request: "WorkspaceBuildDetailsBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["WorkspaceBuildDetailsBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.workspace.v1.WorkspaceBuildDetailsService/SubscribeBatched", + workspace_build_details_batched_stream_request, + WorkspaceBuildDetailsBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + class WorkspaceConfigServiceStub(aristaproto.ServiceStub): async def get_one( @@ -1439,6 +2077,24 @@ async def get_one( metadata=metadata, ) + async def get_some( + self, + workspace_config_some_request: "WorkspaceConfigSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["WorkspaceConfigSomeResponse"]: + async for response in self._unary_stream( + "/arista.workspace.v1.WorkspaceConfigService/GetSome", + workspace_config_some_request, + WorkspaceConfigSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def get_all( self, workspace_config_stream_request: "WorkspaceConfigStreamRequest", @@ -1475,6 +2131,41 @@ async def subscribe( ): yield response + async def get_meta( + self, + workspace_config_stream_request: "WorkspaceConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> "MetaResponse": + return await self._unary_unary( + "/arista.workspace.v1.WorkspaceConfigService/GetMeta", + workspace_config_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ) + + async def subscribe_meta( + self, + workspace_config_stream_request: "WorkspaceConfigStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["MetaResponse"]: + async for response in self._unary_stream( + "/arista.workspace.v1.WorkspaceConfigService/SubscribeMeta", + workspace_config_stream_request, + MetaResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def set( self, workspace_config_set_request: "WorkspaceConfigSetRequest", @@ -1527,6 +2218,24 @@ async def delete( metadata=metadata, ) + async def delete_some( + self, + workspace_config_delete_some_request: "WorkspaceConfigDeleteSomeRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["WorkspaceConfigDeleteSomeResponse"]: + async for response in self._unary_stream( + "/arista.workspace.v1.WorkspaceConfigService/DeleteSome", + workspace_config_delete_some_request, + WorkspaceConfigDeleteSomeResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + async def delete_all( self, workspace_config_delete_all_request: "WorkspaceConfigDeleteAllRequest", @@ -1545,21 +2254,83 @@ async def delete_all( ): yield response + async def get_all_batched( + self, + workspace_config_batched_stream_request: "WorkspaceConfigBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["WorkspaceConfigBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.workspace.v1.WorkspaceConfigService/GetAllBatched", + workspace_config_batched_stream_request, + WorkspaceConfigBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + + async def subscribe_batched( + self, + workspace_config_batched_stream_request: "WorkspaceConfigBatchedStreamRequest", + *, + timeout: Optional[float] = None, + deadline: Optional["Deadline"] = None, + metadata: Optional["MetadataLike"] = None + ) -> AsyncIterator["WorkspaceConfigBatchedStreamResponse"]: + async for response in self._unary_stream( + "/arista.workspace.v1.WorkspaceConfigService/SubscribeBatched", + workspace_config_batched_stream_request, + WorkspaceConfigBatchedStreamResponse, + timeout=timeout, + deadline=deadline, + metadata=metadata, + ): + yield response + class WorkspaceServiceBase(ServiceBase): + async def get_one( self, workspace_request: "WorkspaceRequest" ) -> "WorkspaceResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_some( + self, workspace_some_request: "WorkspaceSomeRequest" + ) -> AsyncIterator["WorkspaceSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_all( self, workspace_stream_request: "WorkspaceStreamRequest" ) -> AsyncIterator["WorkspaceStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) - async def subscribe( - self, workspace_stream_request: "WorkspaceStreamRequest" - ) -> AsyncIterator["WorkspaceStreamResponse"]: + async def subscribe( + self, workspace_stream_request: "WorkspaceStreamRequest" + ) -> AsyncIterator["WorkspaceStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_meta( + self, workspace_stream_request: "WorkspaceStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, workspace_stream_request: "WorkspaceStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all_batched( + self, workspace_batched_stream_request: "WorkspaceBatchedStreamRequest" + ) -> AsyncIterator["WorkspaceBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, workspace_batched_stream_request: "WorkspaceBatchedStreamRequest" + ) -> AsyncIterator["WorkspaceBatchedStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) async def __rpc_get_one( @@ -1569,6 +2340,17 @@ async def __rpc_get_one( response = await self.get_one(request) await stream.send_message(response) + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[WorkspaceSomeRequest, WorkspaceSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + async def __rpc_get_all( self, stream: "grpclib.server.Stream[WorkspaceStreamRequest, WorkspaceStreamResponse]", @@ -1591,6 +2373,45 @@ async def __rpc_subscribe( request, ) + async def __rpc_get_meta( + self, stream: "grpclib.server.Stream[WorkspaceStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, stream: "grpclib.server.Stream[WorkspaceStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[WorkspaceBatchedStreamRequest, WorkspaceBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[WorkspaceBatchedStreamRequest, WorkspaceBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: return { "/arista.workspace.v1.WorkspaceService/GetOne": grpclib.const.Handler( @@ -1599,6 +2420,12 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: WorkspaceRequest, WorkspaceResponse, ), + "/arista.workspace.v1.WorkspaceService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + WorkspaceSomeRequest, + WorkspaceSomeResponse, + ), "/arista.workspace.v1.WorkspaceService/GetAll": grpclib.const.Handler( self.__rpc_get_all, grpclib.const.Cardinality.UNARY_STREAM, @@ -1611,15 +2438,45 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: WorkspaceStreamRequest, WorkspaceStreamResponse, ), + "/arista.workspace.v1.WorkspaceService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + WorkspaceStreamRequest, + MetaResponse, + ), + "/arista.workspace.v1.WorkspaceService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + WorkspaceStreamRequest, + MetaResponse, + ), + "/arista.workspace.v1.WorkspaceService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + WorkspaceBatchedStreamRequest, + WorkspaceBatchedStreamResponse, + ), + "/arista.workspace.v1.WorkspaceService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + WorkspaceBatchedStreamRequest, + WorkspaceBatchedStreamResponse, + ), } class WorkspaceBuildServiceBase(ServiceBase): + async def get_one( self, workspace_build_request: "WorkspaceBuildRequest" ) -> "WorkspaceBuildResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_some( + self, workspace_build_some_request: "WorkspaceBuildSomeRequest" + ) -> AsyncIterator["WorkspaceBuildSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_all( self, workspace_build_stream_request: "WorkspaceBuildStreamRequest" ) -> AsyncIterator["WorkspaceBuildStreamResponse"]: @@ -1630,6 +2487,28 @@ async def subscribe( ) -> AsyncIterator["WorkspaceBuildStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_meta( + self, workspace_build_stream_request: "WorkspaceBuildStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, workspace_build_stream_request: "WorkspaceBuildStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all_batched( + self, + workspace_build_batched_stream_request: "WorkspaceBuildBatchedStreamRequest", + ) -> AsyncIterator["WorkspaceBuildBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, + workspace_build_batched_stream_request: "WorkspaceBuildBatchedStreamRequest", + ) -> AsyncIterator["WorkspaceBuildBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def __rpc_get_one( self, stream: "grpclib.server.Stream[WorkspaceBuildRequest, WorkspaceBuildResponse]", @@ -1638,6 +2517,17 @@ async def __rpc_get_one( response = await self.get_one(request) await stream.send_message(response) + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[WorkspaceBuildSomeRequest, WorkspaceBuildSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + async def __rpc_get_all( self, stream: "grpclib.server.Stream[WorkspaceBuildStreamRequest, WorkspaceBuildStreamResponse]", @@ -1660,6 +2550,45 @@ async def __rpc_subscribe( request, ) + async def __rpc_get_meta( + self, stream: "grpclib.server.Stream[WorkspaceBuildStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, stream: "grpclib.server.Stream[WorkspaceBuildStreamRequest, MetaResponse]" + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[WorkspaceBuildBatchedStreamRequest, WorkspaceBuildBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[WorkspaceBuildBatchedStreamRequest, WorkspaceBuildBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: return { "/arista.workspace.v1.WorkspaceBuildService/GetOne": grpclib.const.Handler( @@ -1668,6 +2597,12 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: WorkspaceBuildRequest, WorkspaceBuildResponse, ), + "/arista.workspace.v1.WorkspaceBuildService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + WorkspaceBuildSomeRequest, + WorkspaceBuildSomeResponse, + ), "/arista.workspace.v1.WorkspaceBuildService/GetAll": grpclib.const.Handler( self.__rpc_get_all, grpclib.const.Cardinality.UNARY_STREAM, @@ -1680,15 +2615,45 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: WorkspaceBuildStreamRequest, WorkspaceBuildStreamResponse, ), + "/arista.workspace.v1.WorkspaceBuildService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + WorkspaceBuildStreamRequest, + MetaResponse, + ), + "/arista.workspace.v1.WorkspaceBuildService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + WorkspaceBuildStreamRequest, + MetaResponse, + ), + "/arista.workspace.v1.WorkspaceBuildService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + WorkspaceBuildBatchedStreamRequest, + WorkspaceBuildBatchedStreamResponse, + ), + "/arista.workspace.v1.WorkspaceBuildService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + WorkspaceBuildBatchedStreamRequest, + WorkspaceBuildBatchedStreamResponse, + ), } class WorkspaceBuildDetailsServiceBase(ServiceBase): + async def get_one( self, workspace_build_details_request: "WorkspaceBuildDetailsRequest" ) -> "WorkspaceBuildDetailsResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_some( + self, workspace_build_details_some_request: "WorkspaceBuildDetailsSomeRequest" + ) -> AsyncIterator["WorkspaceBuildDetailsSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_all( self, workspace_build_details_stream_request: "WorkspaceBuildDetailsStreamRequest", @@ -1701,6 +2666,30 @@ async def subscribe( ) -> AsyncIterator["WorkspaceBuildDetailsStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_meta( + self, + workspace_build_details_stream_request: "WorkspaceBuildDetailsStreamRequest", + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, + workspace_build_details_stream_request: "WorkspaceBuildDetailsStreamRequest", + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def get_all_batched( + self, + workspace_build_details_batched_stream_request: "WorkspaceBuildDetailsBatchedStreamRequest", + ) -> AsyncIterator["WorkspaceBuildDetailsBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, + workspace_build_details_batched_stream_request: "WorkspaceBuildDetailsBatchedStreamRequest", + ) -> AsyncIterator["WorkspaceBuildDetailsBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def __rpc_get_one( self, stream: "grpclib.server.Stream[WorkspaceBuildDetailsRequest, WorkspaceBuildDetailsResponse]", @@ -1709,6 +2698,17 @@ async def __rpc_get_one( response = await self.get_one(request) await stream.send_message(response) + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[WorkspaceBuildDetailsSomeRequest, WorkspaceBuildDetailsSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + async def __rpc_get_all( self, stream: "grpclib.server.Stream[WorkspaceBuildDetailsStreamRequest, WorkspaceBuildDetailsStreamResponse]", @@ -1731,6 +2731,47 @@ async def __rpc_subscribe( request, ) + async def __rpc_get_meta( + self, + stream: "grpclib.server.Stream[WorkspaceBuildDetailsStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, + stream: "grpclib.server.Stream[WorkspaceBuildDetailsStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[WorkspaceBuildDetailsBatchedStreamRequest, WorkspaceBuildDetailsBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[WorkspaceBuildDetailsBatchedStreamRequest, WorkspaceBuildDetailsBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: return { "/arista.workspace.v1.WorkspaceBuildDetailsService/GetOne": grpclib.const.Handler( @@ -1739,6 +2780,12 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: WorkspaceBuildDetailsRequest, WorkspaceBuildDetailsResponse, ), + "/arista.workspace.v1.WorkspaceBuildDetailsService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + WorkspaceBuildDetailsSomeRequest, + WorkspaceBuildDetailsSomeResponse, + ), "/arista.workspace.v1.WorkspaceBuildDetailsService/GetAll": grpclib.const.Handler( self.__rpc_get_all, grpclib.const.Cardinality.UNARY_STREAM, @@ -1751,15 +2798,45 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: WorkspaceBuildDetailsStreamRequest, WorkspaceBuildDetailsStreamResponse, ), + "/arista.workspace.v1.WorkspaceBuildDetailsService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + WorkspaceBuildDetailsStreamRequest, + MetaResponse, + ), + "/arista.workspace.v1.WorkspaceBuildDetailsService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + WorkspaceBuildDetailsStreamRequest, + MetaResponse, + ), + "/arista.workspace.v1.WorkspaceBuildDetailsService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + WorkspaceBuildDetailsBatchedStreamRequest, + WorkspaceBuildDetailsBatchedStreamResponse, + ), + "/arista.workspace.v1.WorkspaceBuildDetailsService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + WorkspaceBuildDetailsBatchedStreamRequest, + WorkspaceBuildDetailsBatchedStreamResponse, + ), } class WorkspaceConfigServiceBase(ServiceBase): + async def get_one( self, workspace_config_request: "WorkspaceConfigRequest" ) -> "WorkspaceConfigResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_some( + self, workspace_config_some_request: "WorkspaceConfigSomeRequest" + ) -> AsyncIterator["WorkspaceConfigSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_all( self, workspace_config_stream_request: "WorkspaceConfigStreamRequest" ) -> AsyncIterator["WorkspaceConfigStreamResponse"]: @@ -1770,6 +2847,16 @@ async def subscribe( ) -> AsyncIterator["WorkspaceConfigStreamResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_meta( + self, workspace_config_stream_request: "WorkspaceConfigStreamRequest" + ) -> "MetaResponse": + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_meta( + self, workspace_config_stream_request: "WorkspaceConfigStreamRequest" + ) -> AsyncIterator["MetaResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def set( self, workspace_config_set_request: "WorkspaceConfigSetRequest" ) -> "WorkspaceConfigSetResponse": @@ -1785,11 +2872,28 @@ async def delete( ) -> "WorkspaceConfigDeleteResponse": raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def delete_some( + self, workspace_config_delete_some_request: "WorkspaceConfigDeleteSomeRequest" + ) -> AsyncIterator["WorkspaceConfigDeleteSomeResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def delete_all( self, workspace_config_delete_all_request: "WorkspaceConfigDeleteAllRequest" ) -> AsyncIterator["WorkspaceConfigDeleteAllResponse"]: raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def get_all_batched( + self, + workspace_config_batched_stream_request: "WorkspaceConfigBatchedStreamRequest", + ) -> AsyncIterator["WorkspaceConfigBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + + async def subscribe_batched( + self, + workspace_config_batched_stream_request: "WorkspaceConfigBatchedStreamRequest", + ) -> AsyncIterator["WorkspaceConfigBatchedStreamResponse"]: + raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED) + async def __rpc_get_one( self, stream: "grpclib.server.Stream[WorkspaceConfigRequest, WorkspaceConfigResponse]", @@ -1798,6 +2902,17 @@ async def __rpc_get_one( response = await self.get_one(request) await stream.send_message(response) + async def __rpc_get_some( + self, + stream: "grpclib.server.Stream[WorkspaceConfigSomeRequest, WorkspaceConfigSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_some, + stream, + request, + ) + async def __rpc_get_all( self, stream: "grpclib.server.Stream[WorkspaceConfigStreamRequest, WorkspaceConfigStreamResponse]", @@ -1820,6 +2935,25 @@ async def __rpc_subscribe( request, ) + async def __rpc_get_meta( + self, + stream: "grpclib.server.Stream[WorkspaceConfigStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + response = await self.get_meta(request) + await stream.send_message(response) + + async def __rpc_subscribe_meta( + self, + stream: "grpclib.server.Stream[WorkspaceConfigStreamRequest, MetaResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_meta, + stream, + request, + ) + async def __rpc_set( self, stream: "grpclib.server.Stream[WorkspaceConfigSetRequest, WorkspaceConfigSetResponse]", @@ -1847,6 +2981,17 @@ async def __rpc_delete( response = await self.delete(request) await stream.send_message(response) + async def __rpc_delete_some( + self, + stream: "grpclib.server.Stream[WorkspaceConfigDeleteSomeRequest, WorkspaceConfigDeleteSomeResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.delete_some, + stream, + request, + ) + async def __rpc_delete_all( self, stream: "grpclib.server.Stream[WorkspaceConfigDeleteAllRequest, WorkspaceConfigDeleteAllResponse]", @@ -1858,6 +3003,28 @@ async def __rpc_delete_all( request, ) + async def __rpc_get_all_batched( + self, + stream: "grpclib.server.Stream[WorkspaceConfigBatchedStreamRequest, WorkspaceConfigBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.get_all_batched, + stream, + request, + ) + + async def __rpc_subscribe_batched( + self, + stream: "grpclib.server.Stream[WorkspaceConfigBatchedStreamRequest, WorkspaceConfigBatchedStreamResponse]", + ) -> None: + request = await stream.recv_message() + await self._call_rpc_handler_server_stream( + self.subscribe_batched, + stream, + request, + ) + def __mapping__(self) -> Dict[str, grpclib.const.Handler]: return { "/arista.workspace.v1.WorkspaceConfigService/GetOne": grpclib.const.Handler( @@ -1866,6 +3033,12 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: WorkspaceConfigRequest, WorkspaceConfigResponse, ), + "/arista.workspace.v1.WorkspaceConfigService/GetSome": grpclib.const.Handler( + self.__rpc_get_some, + grpclib.const.Cardinality.UNARY_STREAM, + WorkspaceConfigSomeRequest, + WorkspaceConfigSomeResponse, + ), "/arista.workspace.v1.WorkspaceConfigService/GetAll": grpclib.const.Handler( self.__rpc_get_all, grpclib.const.Cardinality.UNARY_STREAM, @@ -1878,6 +3051,18 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: WorkspaceConfigStreamRequest, WorkspaceConfigStreamResponse, ), + "/arista.workspace.v1.WorkspaceConfigService/GetMeta": grpclib.const.Handler( + self.__rpc_get_meta, + grpclib.const.Cardinality.UNARY_UNARY, + WorkspaceConfigStreamRequest, + MetaResponse, + ), + "/arista.workspace.v1.WorkspaceConfigService/SubscribeMeta": grpclib.const.Handler( + self.__rpc_subscribe_meta, + grpclib.const.Cardinality.UNARY_STREAM, + WorkspaceConfigStreamRequest, + MetaResponse, + ), "/arista.workspace.v1.WorkspaceConfigService/Set": grpclib.const.Handler( self.__rpc_set, grpclib.const.Cardinality.UNARY_UNARY, @@ -1896,10 +3081,28 @@ def __mapping__(self) -> Dict[str, grpclib.const.Handler]: WorkspaceConfigDeleteRequest, WorkspaceConfigDeleteResponse, ), + "/arista.workspace.v1.WorkspaceConfigService/DeleteSome": grpclib.const.Handler( + self.__rpc_delete_some, + grpclib.const.Cardinality.UNARY_STREAM, + WorkspaceConfigDeleteSomeRequest, + WorkspaceConfigDeleteSomeResponse, + ), "/arista.workspace.v1.WorkspaceConfigService/DeleteAll": grpclib.const.Handler( self.__rpc_delete_all, grpclib.const.Cardinality.UNARY_STREAM, WorkspaceConfigDeleteAllRequest, WorkspaceConfigDeleteAllResponse, ), + "/arista.workspace.v1.WorkspaceConfigService/GetAllBatched": grpclib.const.Handler( + self.__rpc_get_all_batched, + grpclib.const.Cardinality.UNARY_STREAM, + WorkspaceConfigBatchedStreamRequest, + WorkspaceConfigBatchedStreamResponse, + ), + "/arista.workspace.v1.WorkspaceConfigService/SubscribeBatched": grpclib.const.Handler( + self.__rpc_subscribe_batched, + grpclib.const.Cardinality.UNARY_STREAM, + WorkspaceConfigBatchedStreamRequest, + WorkspaceConfigBatchedStreamResponse, + ), } diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/fmp/__init__.py b/python-avd/pyavd/_cv/api/fmp/__init__.py similarity index 97% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/fmp/__init__.py rename to python-avd/pyavd/_cv/api/fmp/__init__.py index b5acf9de1bd..d4c15f5c4c4 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/fmp/__init__.py +++ b/python-avd/pyavd/_cv/api/fmp/__init__.py @@ -1,8 +1,8 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. +# Copyright (c) 2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. # Generated by the protocol buffer compiler. DO NOT EDIT! -# sources: fmp/deletes.proto, fmp/extensions.proto, fmp/inet.proto, fmp/wrappers.proto, fmp/yang.proto +# sources: fmp/deletes.proto, fmp/extensions.proto, fmp/inet.proto, fmp/pages.proto, fmp/wrappers.proto, fmp/yang.proto # plugin: python-aristaproto # This file has been @generated @@ -12,13 +12,22 @@ List, ) -try: - import aristaproto -except ImportError: - HAS_ARISTAPROTO = False - from ansible_collections.arista.avd.plugins.plugin_utils.cv_client.mocked_classes import mocked_aristaproto as aristaproto -else: - HAS_ARISTAPROTO = True +import aristaproto + + +class SortDirection(aristaproto.Enum): + """ + SortDirection is an enum of possible values for direction of sorting. + """ + + UNSPECIFIED = 0 + """SORT_DIRECTION_UNSPECIFIED means that no sort direction specified.""" + + ASCENDING = 1 + """SORT_DIRECTION_ASCENDING sorts in ascending order.""" + + DESCENDING = 2 + """SORT_DIRECTION_DESCENDING sorts in descending order.""" class DeleteError(aristaproto.Enum): diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/client/cv_client.py b/python-avd/pyavd/_cv/client/__init__.py similarity index 89% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/client/cv_client.py rename to python-avd/pyavd/_cv/client/__init__.py index f3f2abc8460..303861e4198 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/client/cv_client.py +++ b/python-avd/pyavd/_cv/client/__init__.py @@ -5,25 +5,15 @@ import ssl -try: - from requests import JSONDecodeError, post -except ImportError: - HAS_REQUESTS = False -else: - HAS_REQUESTS = True - -try: - from grpclib.client import Channel -except ImportError: - HAS_GRPCLIB = False -else: - HAS_GRPCLIB = True +from grpclib.client import Channel +from requests import JSONDecodeError, post from .change_control import ChangeControlMixin from .configlet import ConfigletMixin from .exceptions import CVClientException from .inventory import InventoryMixin from .studio import StudioMixin +from .swg import SwgMixin from .tag import TagMixin from .utils import UtilsMixin from .workspace import WorkspaceMixin @@ -34,6 +24,7 @@ class CVClient( ConfigletMixin, InventoryMixin, StudioMixin, + SwgMixin, TagMixin, UtilsMixin, WorkspaceMixin, @@ -101,10 +92,11 @@ def _connect(self) -> None: self._set_token() if not self._verify_certs: - context = ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH) + # Accepting SonarLint issue: We are purposely implementing no verification of certs. + context = ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH) # NOSONAR context.check_hostname = False + context.verify_mode = ssl.CERT_NONE # NOSONAR context.set_alpn_protocols(["h2"]) - context.verify_mode = ssl.CERT_NONE else: context = True @@ -113,7 +105,7 @@ def _connect(self) -> None: self._metadata = {"authorization": "Bearer " + self._token} - def _set_token(self) -> str: + def _set_token(self) -> None: """ Uses username/password for authenticating via REST. Sets the session token into self._token to be used for gRPC channel. @@ -127,10 +119,10 @@ def _set_token(self) -> str: raise CVClientException("Unable to authenticate. Missing token or username/password.") if not self._verify_certs: - context = ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH) + # Accepting SonarLint issue: We are purposely implementing no verification of certs. + context = ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH) # NOSONAR + context.verify_mode = ssl.CERT_NONE # NOSONAR context.check_hostname = False - # context.set_alpn_protocols(["h2"]) - context.verify_mode = ssl.CERT_NONE else: # None means default context which will verify certs. context = None diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/client/change_control.py b/python-avd/pyavd/_cv/client/change_control.py similarity index 98% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/client/change_control.py rename to python-avd/pyavd/_cv/client/change_control.py index 23fa647365e..2395afe4b01 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/client/change_control.py +++ b/python-avd/pyavd/_cv/client/change_control.py @@ -29,7 +29,7 @@ if TYPE_CHECKING: from aristaproto import _DateTime - from .cv_client import CVClient + from . import CVClient LOGGER = getLogger(__name__) @@ -190,7 +190,7 @@ async def wait_for_change_control_state( ) -> ChangeControl: """ Monitor a Change control using arista.changecontrol.v1.ChangeControlService.Subscribe API for a response to the given cc_id. - Blocks until a reponse is returned or timed out. + Blocks until a response is returned or timed out. Parameters: cc_id: Unique identifier of the change control. diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/client/configlet.py b/python-avd/pyavd/_cv/client/configlet.py similarity index 96% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/client/configlet.py rename to python-avd/pyavd/_cv/client/configlet.py index 1625b5748d8..097879e92d4 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/client/configlet.py +++ b/python-avd/pyavd/_cv/client/configlet.py @@ -26,11 +26,13 @@ ConfigletStreamRequest, MatchPolicy, ) +from ..api.arista.time import TimeBounds from ..api.fmp import RepeatedString +from .constants import DEFAULT_API_TIMEOUT from .exceptions import get_cv_client_exception if TYPE_CHECKING: - from .cv_client import CVClient + from . import CVClient ASSIGNMENT_MATCH_POLICY_MAP = { @@ -52,7 +54,7 @@ async def get_configlet_containers( workspace_id: str, container_ids: list[str] | None = None, time: datetime | None = None, - timeout: float = 10.0, + timeout: float = DEFAULT_API_TIMEOUT, ) -> list[ConfigletAssignment]: """ Get Configlet Containers (a.k.a. Assignments) using arista.configlet.v1.ConfigletAssignmentServiceStub.GetAll API. @@ -66,7 +68,7 @@ async def get_configlet_containers( Returns: ConfigletAssignment objects. """ - request = ConfigletAssignmentStreamRequest(partial_eq_filter=[], time=time) + request = ConfigletAssignmentStreamRequest(partial_eq_filter=[], time=TimeBounds(start=None, end=time)) if container_ids: for container_id in container_ids: request.partial_eq_filter.append( @@ -96,7 +98,7 @@ async def set_configlet_container( query: str | None = None, child_assignment_ids: list[str] | None = None, match_policy: Literal["match_first", "match_all"] = "match_all", - timeout: float = 10.0, + timeout: float = DEFAULT_API_TIMEOUT, ) -> ConfigletAssignmentConfig: """ Create/update a Configlet Container (a.k.a. Assignment) using arista.configlet.v1.ConfigletAssignmentServiceStub.Set API. @@ -134,7 +136,7 @@ async def set_configlet_containers( self: CVClient, workspace_id: str, containers: list[tuple[str, str | None, str | None, list[str] | None, str | None, list[str] | None, str | None]], - timeout: float = 30.0, + timeout: float = DEFAULT_API_TIMEOUT, ) -> list[ConfigletAssignmentKey]: """ Create/update a Configlet Container (a.k.a. Assignment) using arista.configlet.v1.ConfigletAssignmentServiceStub.Set API. @@ -179,7 +181,7 @@ async def delete_configlet_container( self: CVClient, workspace_id: str, assignment_id: str, - timeout: float = 10.0, + timeout: float = DEFAULT_API_TIMEOUT, ) -> ConfigletAssignmentConfig: """ Delete a Configlet Container (a.k.a. Assignment) using arista.configlet.v1.ConfigletAssignmentServiceStub.Set API. @@ -210,7 +212,7 @@ async def get_configlets( workspace_id: str, configlet_ids: list[str] | None = None, time: datetime | None = None, - timeout: float = 10.0, + timeout: float = DEFAULT_API_TIMEOUT, ) -> list[Configlet]: """ Get Configlets using arista.configlet.v1.ConfigletServiceStub.GetAll API. @@ -225,7 +227,7 @@ async def get_configlets( Returns: List of matching Configlet objects. """ - request = ConfigletStreamRequest(partial_eq_filter=[], time=time) + request = ConfigletStreamRequest(partial_eq_filter=[], time=TimeBounds(start=None, end=time)) if configlet_ids: for configlet_id in configlet_ids: request.partial_eq_filter.append(Configlet(key=ConfigletKey(workspace_id=workspace_id, configlet_id=configlet_id))) @@ -251,7 +253,7 @@ async def set_configlet( display_name: str | None = None, description: str | None = None, body: str | None = None, - timeout: float = 10.0, + timeout: float = DEFAULT_API_TIMEOUT, ) -> ConfigletConfig: """ Create/update a Configlet using arista.configlet.v1.ConfigletServiceStub.Set API. @@ -290,7 +292,7 @@ async def set_configlet_from_file( file: str, display_name: str | None = None, description: str | None = None, - timeout: float = 10.0, + timeout: float = DEFAULT_API_TIMEOUT, ) -> ConfigletConfig: """ Create/update a Configlet using arista.configlet.v1.ConfigletServiceStub.Set API. @@ -326,7 +328,7 @@ async def delete_configlets( self: CVClient, workspace_id: str, configlet_ids: list[str], - timeout: float = 30.0, + timeout: float = DEFAULT_API_TIMEOUT, ) -> list[ConfigletKey]: """ Delete a Configlet using arista.configlet.v1.ConfigletServiceStub.SetSome API. diff --git a/python-avd/pyavd/_cv/client/constants.py b/python-avd/pyavd/_cv/client/constants.py new file mode 100644 index 00000000000..5be833746b0 --- /dev/null +++ b/python-avd/pyavd/_cv/client/constants.py @@ -0,0 +1,6 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. + +DEFAULT_API_TIMEOUT = 600.0 +"""Default API timeout in seconds""" diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/client/exceptions.py b/python-avd/pyavd/_cv/client/exceptions.py similarity index 85% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/client/exceptions.py rename to python-avd/pyavd/_cv/client/exceptions.py index eb0c9af0b68..a1f02d86ac4 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/client/exceptions.py +++ b/python-avd/pyavd/_cv/client/exceptions.py @@ -5,16 +5,11 @@ from asyncio.exceptions import TimeoutError -try: - from grpclib.const import Status - from grpclib.exceptions import GRPCError -except ImportError: - HAS_GRPCLIB = False -else: - HAS_GRPCLIB = True +from grpclib.const import Status +from grpclib.exceptions import GRPCError -def get_cv_client_exception(exception: Exception, cv_client_details: str | None = None) -> Exception or None: +def get_cv_client_exception(exception: Exception, cv_client_details: str | None = None) -> Exception | None: """ Convert GRPCError or TimeoutError instances to an instance of the relevant subclass of CVClientException. @@ -24,11 +19,8 @@ def get_cv_client_exception(exception: Exception, cv_client_details: str | None Returns: None if If the exception is unmatched, otherwise an instance of the relevant CVClientException subclass. """ - if not HAS_GRPCLIB: - raise RuntimeError("Missing Python library 'grpclib'") - if isinstance(exception, GRPCError): - status, message, details = exception.args + status = exception.args[0] if status == Status.NOT_FOUND: return CVResourceNotFound(cv_client_details, *exception.args) if status == Status.CANCELLED: diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/client/inventory.py b/python-avd/pyavd/_cv/client/inventory.py similarity index 92% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/client/inventory.py rename to python-avd/pyavd/_cv/client/inventory.py index 66fc08667f6..ee543278f20 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/client/inventory.py +++ b/python-avd/pyavd/_cv/client/inventory.py @@ -7,10 +7,11 @@ from typing import TYPE_CHECKING, Literal from ..api.arista.inventory.v1 import Device, DeviceKey, DeviceServiceStub, DeviceStreamRequest +from ..api.arista.time import TimeBounds from .exceptions import get_cv_client_exception if TYPE_CHECKING: - from .cv_client import CVClient + from . import CVClient class InventoryMixin: @@ -39,10 +40,7 @@ async def get_inventory_devices( Returns: Device objects. """ - request = DeviceStreamRequest( - partial_eq_filter=[], - time=time, - ) + request = DeviceStreamRequest(partial_eq_filter=[], time=TimeBounds(start=None, end=time)) if devices: for serial_number, system_mac_address, hostname in devices: request.partial_eq_filter.append( diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/client/studio.py b/python-avd/pyavd/_cv/client/studio.py similarity index 79% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/client/studio.py rename to python-avd/pyavd/_cv/client/studio.py index 224e75754eb..860405589ad 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/client/studio.py +++ b/python-avd/pyavd/_cv/client/studio.py @@ -5,10 +5,10 @@ import json from datetime import datetime +from logging import getLogger from typing import TYPE_CHECKING, Any, Literal from ..api.arista.studio.v1 import ( - DeviceInfo, Inputs, InputsConfig, InputsConfigServiceStub, @@ -19,16 +19,23 @@ InputsRequest, InputsServiceStub, InputsStreamRequest, - InterfaceInfo, - InterfaceInfos, - TopologyInput, - TopologyInputKey, + Studio, + StudioConfig, + StudioConfigServiceStub, + StudioConfigStreamRequest, + StudioKey, + StudioRequest, + StudioServiceStub, ) +from ..api.arista.time import TimeBounds from ..api.fmp import RepeatedString +from .constants import DEFAULT_API_TIMEOUT from .exceptions import CVResourceNotFound, get_cv_client_exception if TYPE_CHECKING: - from .cv_client import CVClient + from . import CVClient + +LOGGER = getLogger(__name__) TOPOLOGY_STUDIO_ID = "TOPOLOGY" @@ -40,13 +47,88 @@ class StudioMixin: studio_api_version: Literal["v1"] = "v1" + async def get_studio( + self: CVClient, + studio_id: str, + workspace_id: str, + time: datetime | None = None, + timeout: float = 10.0, + ) -> Studio: + """ + Get Studio definition using arista.studio.v1.StudioService.GetOne. + + The Studio GetOne API for the workspace does not return anything from mainline and does not return deletions in the workspace. + So to produce the Workspace Studio we need to fetch from the workspace, and if we find nothing, we need to check if the studio + got deleted in the workspace by retrieving config. Finally we can fetch from mainline. + + Parameters: + studio_id: Unique identifier for the studio. + workspace_id: Unique identifier of the Workspace for which the information is fetched. Use "" for mainline. + time: Timestamp from which the information is fetched. `now()` if not set. + timeout: Timeout in seconds. + + Returns: + Studio object. + """ + request = StudioRequest( + # First attempt to fetch studio from workspace. + key=StudioKey(studio_id=studio_id, workspace_id=workspace_id), + time=time, + ) + client = StudioServiceStub(self._channel) + try: + response = await client.get_one(request, metadata=self._metadata, timeout=timeout) + return response.value + except Exception as e: # pylint: disable=broad-exception-caught + e = get_cv_client_exception(e, f"Studio ID '{studio_id}, Workspace ID '{workspace_id}'") or e + if isinstance(e, CVResourceNotFound): + # Continue execution if we did not find any state in the workspace. + # This simply means the studio itself was not changed in this workspace. + pass + else: + raise e + + # If we get here, it means no studio was returned by the workspace call. + # So now we fetch the studio config from the workspace to see if the studio was deleted in this workspace. + request = StudioConfigStreamRequest( + partial_eq_filter=[ + StudioConfig( + key=StudioKey(studio_id=studio_id, workspace_id=workspace_id), + remove=True, + ) + ], + time=TimeBounds(start=None, end=time), + ) + client = StudioConfigServiceStub(self._channel) + try: + responses = client.get_all(request, metadata=self._metadata, timeout=timeout) + async for response in responses: + # If we get here it means we got an entry with "removed: True" so no need to look further. + raise CVResourceNotFound("The studio was deleted in the workspace.", f"Studio ID '{studio_id}, Workspace ID '{workspace_id}'") + + except Exception as e: + raise get_cv_client_exception(e, f"Studio ID '{studio_id}, Workspace ID '{workspace_id}'") or e + + # If we get here, it means there are no inputs in the workspace and they are not deleted, so we can fetch from mainline. + request = StudioRequest( + # First attempt to fetch studio from workspace. + key=StudioKey(studio_id=studio_id, workspace_id=""), + time=time, + ) + client = StudioServiceStub(self._channel) + try: + response = await client.get_one(request, metadata=self._metadata, timeout=timeout) + return response.value + except Exception as e: + raise get_cv_client_exception(e, f"Studio ID '{studio_id}, Workspace ID '{workspace_id}'") or e + async def get_studio_inputs( self: CVClient, studio_id: str, workspace_id: str, default_value: Any = None, time: datetime | None = None, - timeout: float = 10.0, + timeout: float = DEFAULT_API_TIMEOUT, ) -> Any: """ Get Studio Inputs using arista.studio.v1.InputsService.GetAll and arista.studio.v1.InputsConfigServer.GetAll APIs. @@ -101,10 +183,12 @@ async def get_studio_inputs( # If we get here, it means no inputs were returned by the workspace call. # So now we fetch the inputs config from the workspace to see if the inputs were deleted in this workspace. request = InputsConfigStreamRequest( - partial_eq_filter=InputsConfig( - key=InputsKey(studio_id=studio_id, workspace_id=workspace_id), - remove=True, - ), + partial_eq_filter=[ + InputsConfig( + key=InputsKey(studio_id=studio_id, workspace_id=workspace_id), + remove=True, + ) + ], time=time, ) client = InputsConfigServiceStub(self._channel) @@ -151,7 +235,7 @@ async def get_studio_inputs_with_path( input_path: list[str], default_value: Any = None, time: datetime | None = None, - timeout: float = 10.0, + timeout: float = DEFAULT_API_TIMEOUT, ) -> Any: """ Get Studio Inputs for a specific path using arista.studio.v1.InputsService.GetOne and arista.studio.v1.InputsConfigServer.GetAll APIs. @@ -187,10 +271,9 @@ async def get_studio_inputs_with_path( # We only get a response if the inputs are set/changed in the workspace. if response.value.inputs is not None: return json.loads(response.value.inputs) - else: - return default_value + return default_value - except Exception as e: + except Exception as e: # pylint: disable=broad-exception-caught e = get_cv_client_exception(e, f"Studio ID '{studio_id}, Workspace ID '{workspace_id}', Path '{input_path}'") or e if isinstance(e, CVResourceNotFound) and workspace_id != "": # Ignore this error, since it simply means we have to check if inputs got deleted in this workspace or fetch from mainline as last resort. @@ -236,15 +319,13 @@ async def get_studio_inputs_with_path( response = await client.get_one(request, metadata=self._metadata, timeout=timeout) if response.value.inputs is not None: return json.loads(response.value.inputs) - else: - return default_value - except Exception as e: + return default_value + except Exception as e: # pylint: disable=broad-exception-caught e = get_cv_client_exception(e, f"Studio ID '{studio_id}, Workspace ID '{workspace_id}', Path '{input_path}'") or e if isinstance(e, CVResourceNotFound): # Ignore this error, since it simply means we no inputs are in the studio so we will return the default value. return default_value - else: - raise e + raise e async def set_studio_inputs( self: CVClient, @@ -252,7 +333,7 @@ async def set_studio_inputs( workspace_id: str, inputs: Any, input_path: list[str] | None = None, - timeout: float = 10.0, + timeout: float = DEFAULT_API_TIMEOUT, ) -> InputsConfig: """ Set Studio Inputs using arista.studio.v1.InputsConfigService.Set API. @@ -292,8 +373,8 @@ async def get_topology_studio_inputs( workspace_id: str, device_ids: list[str] | None = None, time: datetime | None = None, - timeout: float = 10.0, - ) -> list[TopologyInput]: + timeout: float = DEFAULT_API_TIMEOUT, + ) -> list[dict]: """ TODO: Once the topology studio inputs API is public, this function can be replaced by the _future variant. It will probably need some version detection to see if the API is supported. @@ -309,7 +390,7 @@ async def get_topology_studio_inputs( Returns: TopologyInput objects for the requested devices. """ - topology_inputs: list[TopologyInput] = [] + topology_inputs: list[dict] = [] studio_inputs: dict = await self.get_studio_inputs( studio_id=TOPOLOGY_STUDIO_ID, workspace_id=workspace_id, default_value={}, time=time, timeout=timeout ) @@ -325,28 +406,20 @@ async def get_topology_studio_inputs( device_info: dict = device_entry.get("inputs", {}).get("device", {}) interfaces: list[dict] = device_info.get("interfaces", []) topology_inputs.append( - TopologyInput( - key=TopologyInputKey( - workspace_id=workspace_id, - device_id=device_id, - ), - device_info=DeviceInfo( - device_id=device_id, - model_name=device_info.get("modelName"), - hostname=device_info.get("hostname"), - mac_address=device_info.get("macAddress"), - interface_infos=InterfaceInfos( - [ - InterfaceInfo( - name=str(interface.get("tags", {}).get("query", "")).removeprefix("interface:").split("@", maxsplit=1)[0], - neighbor_device_id=interface.get("inputs", {}).get("interface", {}).get("neighborDeviceId"), - neighbor_interface_name=interface.get("inputs", {}).get("interface", {}).get("neighborInterfaceName"), - ) - for interface in interfaces - ] - ), - ), - ) + { + "device_id": device_id, + "hostname": device_info.get("hostname"), + "mac_address": device_info.get("macAddress"), + "model_name": device_info.get("modelName"), + "interfaces": [ + { + "name": str(interface.get("tags", {}).get("query", "")).removeprefix("interface:").split("@", maxsplit=1)[0], + "neighbor_device_id": interface.get("inputs", {}).get("interface", {}).get("neighborDeviceId"), + "neighbor_interface_name": interface.get("inputs", {}).get("interface", {}).get("neighborInterfaceName"), + } + for interface in interfaces + ], + } ) return topology_inputs @@ -354,7 +427,7 @@ async def set_topology_studio_inputs( self: CVClient, workspace_id: str, device_inputs: list[tuple[str, str, str]], - timeout: float = 10.0, + timeout: float = DEFAULT_API_TIMEOUT, ) -> list[InputsKey]: """ TODO: Once the topology studio inputs API is public, this function can be replaced by the _future variant. @@ -438,7 +511,7 @@ async def set_topology_studio_inputs( # workspace_id: str, # device_ids: list[str] | None = None, # time: datetime | None = None, - # timeout: float = 10.0, + # timeout: float = DEFAULT_API_TIMEOUT, # ) -> list[TopologyInput]: # """ # TODO: Once the topology studio inputs API is public, this function can be put in place. @@ -483,7 +556,7 @@ async def set_topology_studio_inputs( # self: CVClient, # workspace_id: str, # device_inputs: list[tuple[str, str]], - # timeout: float = 30.0, + # timeout: float = DEFAULT_API_TIMEOUT, # ) -> list[TopologyInputKey]: # """ # TODO: Once the topology studio inputs API is public, this function can be put in place. diff --git a/python-avd/pyavd/_cv/client/swg.py b/python-avd/pyavd/_cv/client/swg.py new file mode 100644 index 00000000000..b9568b2b2b6 --- /dev/null +++ b/python-avd/pyavd/_cv/client/swg.py @@ -0,0 +1,118 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import annotations + +from datetime import datetime +from logging import getLogger +from typing import TYPE_CHECKING, Literal + +from ..api.arista.swg.v1 import ( + EndpointConfig, + EndpointConfigServiceStub, + EndpointConfigSetRequest, + EndpointStatus, + EndpointStatusServiceStub, + EndpointStatusStreamRequest, + ServiceName, + SwgKey, +) +from .constants import DEFAULT_API_TIMEOUT +from .exceptions import get_cv_client_exception + +if TYPE_CHECKING: + from . import CVClient + +LOGGER = getLogger(__name__) + +ELEMENT_TYPE_MAP = { + "zscaler": ServiceName.ZSCALER, + None: ServiceName.UNSPECIFIED, +} + + +class SwgMixin: + """ + Only to be used as mixin on CVClient class. + """ + + swg_api_version: Literal["v1"] = "v1" + + async def set_swg_device( + self: CVClient, + device_id: str, + service: Literal["zscaler"], + location: str, + timeout: float = DEFAULT_API_TIMEOUT, + ) -> tuple[datetime, EndpointConfig]: + """ + Set SWG Endpoints using arista.swg.v1.EndpointStatusService.Set API + + Parameters: + device_id: Unique identifier of the Device - typically serial number. + service: SWG service. Currently only supporting "zscaler". + location: Device location/address. CloudVision will resolve a location from this address. + time: Timestamp from which the information is fetched. `now()` if not set. + timeout: Timeout in seconds. + + Returns: + Tuple of timestamp for set request and EndpointConfig including any server-generated values. + """ + request = EndpointConfigSetRequest( + value=EndpointConfig( + key=SwgKey(device_id=device_id, service_name=ELEMENT_TYPE_MAP[service]), + address=location, + ) + ) + client = EndpointConfigServiceStub(self._channel) + + try: + LOGGER.info("set_swg_device: Setting location for '%s': %s", device_id, location) + response = await client.set(request, metadata=self._metadata, timeout=timeout) + return response.time, response.value + + except Exception as e: + raise get_cv_client_exception(e, f"set_swg_device: Device ID '{device_id}', service '{service}', location '{location}'") or e + + async def wait_for_swg_endpoint_status( + self: CVClient, + device_id: str, + service: Literal["zscaler"], + start_time: datetime | None = None, + timeout: float = DEFAULT_API_TIMEOUT, + ) -> EndpointStatus: + """ + Subscribe and wait for one SWG Endpoint using arista.swg.v1.EndpointStatusService.Subscribe API + + Parameters: + device_id: Unique identifier of the Device - typically serial number. + service: SWG service. Currently only supporting "zscaler". + start_time: Timestamp of earliest timestamp to fetch. `now()` if not set. + timeout: Timeout in seconds. + + Returns: + EndpointStatus object matching the device_id + """ + if start_time is None: + start_time = datetime.now() + request = EndpointStatusStreamRequest( + partial_eq_filter=[ + EndpointStatus( + key=SwgKey(device_id=device_id, service_name=ELEMENT_TYPE_MAP[service]), + ), + ], + ) + client = EndpointStatusServiceStub(self._channel) + + try: + responses = client.subscribe(request, metadata=self._metadata, timeout=timeout) + async for response in responses: + if response.time < start_time: + LOGGER.info("wait_for_swg_endpoint_status: Got stale SWG endpoints from a previous lookup.") + continue + + LOGGER.info("wait_for_swg_endpoint_status: Got SWG endpoints: %s", response.value) + return response.value + + except Exception as e: + raise get_cv_client_exception(e, f"wait_for_swg_endpoint_status: Device ID '{device_id}', service '{service}") or e diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/client/tag.py b/python-avd/pyavd/_cv/client/tag.py similarity index 98% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/client/tag.py rename to python-avd/pyavd/_cv/client/tag.py index 33695813a55..1332c672772 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/client/tag.py +++ b/python-avd/pyavd/_cv/client/tag.py @@ -26,10 +26,11 @@ TagServiceStub, TagStreamRequest, ) +from ..api.arista.time import TimeBounds from .exceptions import get_cv_client_exception if TYPE_CHECKING: - from .cv_client import CVClient + from . import CVClient ELEMENT_TYPE_MAP = { "device": ElementType.DEVICE, @@ -87,7 +88,7 @@ async def get_tags( key=TagKey(workspace_id="", element_type=ELEMENT_TYPE_MAP[element_type]), creator_type=CREATOR_TYPE_MAP[creator_type], ), - time=time, + time=TimeBounds(start=None, end=time), ) client = TagServiceStub(self._channel) try: @@ -108,7 +109,7 @@ async def get_tags( # This time fetch for the actual workspace we are interested in. key=TagKey(workspace_id=workspace_id, element_type=ELEMENT_TYPE_MAP[element_type]), ), - time=time, + time=TimeBounds(start=None, end=time), ) client = TagConfigServiceStub(self._channel) try: @@ -207,7 +208,7 @@ async def get_tag_assignments( key=TagAssignmentKey(workspace_id="", element_type=ELEMENT_TYPE_MAP[element_type]), tag_creator_type=CREATOR_TYPE_MAP[creator_type], ), - time=time, + time=TimeBounds(start=None, end=time), ) client = TagAssignmentServiceStub(self._channel) try: @@ -228,7 +229,7 @@ async def get_tag_assignments( # This time fetch for the actual workspace we are interested in. key=TagKey(workspace_id=workspace_id, element_type=ELEMENT_TYPE_MAP[element_type]), ), - time=time, + time=TimeBounds(start=None, end=time), ) client = TagAssignmentConfigServiceStub(self._channel) try: diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/client/utils.py b/python-avd/pyavd/_cv/client/utils.py similarity index 93% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/client/utils.py rename to python-avd/pyavd/_cv/client/utils.py index f6db1631ffa..9c0bcf1b7ee 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/client/utils.py +++ b/python-avd/pyavd/_cv/client/utils.py @@ -6,7 +6,7 @@ from typing import TYPE_CHECKING, Any, Callable if TYPE_CHECKING: - from .cv_client import CVClient + from . import CVClient class UtilsMixin: @@ -24,8 +24,8 @@ def _remove_item_from_list(itm, lst: list, matcher: Callable) -> None: Ignore if we are told to remove an item that is not present. This happens if you add a tag in a workspace and then remove it again. """ - for index in range(len(lst)): - if matcher(lst[index], itm): + for index, item in enumerate(lst): + if matcher(item, itm): lst.pop(index) return @@ -36,8 +36,8 @@ def _upsert_item_in_list(itm, lst: list, matcher: Callable) -> None: Used for Tags and TagAssignments. """ - for index in range(len(lst)): - if matcher(lst[index], itm): + for index, item in enumerate(lst): + if matcher(item, itm): lst[index] = itm return @@ -59,8 +59,7 @@ def _set_value_from_path(self: CVClient, path: list[str], data: list | dict, val if isinstance(value, dict) and isinstance(data, dict): data.update(value) return - else: - raise RuntimeError(f"Path '{path}', value type '{type(value)}' cannot be set on data type '{type(data)}'") + raise RuntimeError(f"Path '{path}', value type '{type(value)}' cannot be set on data type '{type(data)}'") # Convert '0' to 0. path = [int(element) if str(element).isnumeric() else element for element in path] if len(path) == 1: diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/client/workspace.py b/python-avd/pyavd/_cv/client/workspace.py similarity index 96% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/client/workspace.py rename to python-avd/pyavd/_cv/client/workspace.py index 0ebbc4f8749..d14341d1898 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/client/workspace.py +++ b/python-avd/pyavd/_cv/client/workspace.py @@ -25,7 +25,7 @@ from .exceptions import get_cv_client_exception if TYPE_CHECKING: - from .cv_client import CVClient + from . import CVClient LOGGER = getLogger(__name__) @@ -211,24 +211,22 @@ async def submit_workspace( ) client = WorkspaceConfigServiceStub(self._channel) response = await client.set(request, metadata=self._metadata, timeout=timeout) - LOGGER.debug("submit_workspace: Got reponse to submission: %s", response.value) + LOGGER.debug("submit_workspace: Got response to submission: %s", response.value) return response.value async def wait_for_workspace_response( self: CVClient, workspace_id: str, request_id: str, - time: datetime | None = None, timeout: float = 3600.0, ) -> tuple[Response, Workspace]: """ Monitor a Workspace using arista.workspace.v1.WorkspaceService.Subscribe API for a response to the given request_id. - Blocks until a reponse is returned or timed out. + Blocks until a response is returned or timed out. Parameters: workspace_id: Unique identifier the Workspace. request_id: Unique identifier for the Request. - time: Timestamp from which the information is fetched. `now()` if not set. timeout: Timeout in seconds for the Workspace to build. Returns: @@ -240,7 +238,6 @@ async def wait_for_workspace_response( key=WorkspaceKey(workspace_id=workspace_id), ) ], - time=time, ) client = WorkspaceServiceStub(self._channel) try: diff --git a/python-avd/pyavd/_cv/extra_cv_protos/arista/swg.v1/services.gen.proto b/python-avd/pyavd/_cv/extra_cv_protos/arista/swg.v1/services.gen.proto new file mode 100644 index 00000000000..24db6f12e8b --- /dev/null +++ b/python-avd/pyavd/_cv/extra_cv_protos/arista/swg.v1/services.gen.proto @@ -0,0 +1,392 @@ +// Copyright (c) 2024 Arista Networks, Inc. All rights reserved. +// Use of this source code is governed by the Apache License 2.0 +// that can be found in the LICENSE file. + +// +// Code generated by boomtown. DO NOT EDIT. +// + +syntax = "proto3"; + +package arista.swg.v1; +option go_package = "arista/resources/arista/swg.v1;swg"; + +import "arista/swg.v1/swg.proto"; +import "arista/time/time.proto"; +import "arista/subscriptions/subscriptions.proto"; +import "fmp/deletes.proto"; +import "google/protobuf/timestamp.proto"; +import "google/protobuf/wrappers.proto"; + +message MetaResponse { + // Time holds the timestamp of the last item included in the metadata calculation. + google.protobuf.Timestamp time = 1; + + // Operation indicates how the value in this response should be considered. + // Under non-subscribe requests, this value should always be INITIAL. In a subscription, + // once all initial data is streamed and the client begins to receive modification updates, + // you should not see INITIAL again. + arista.subscriptions.Operation type = 2; + + // Count is the number of items present under the conditions of the request. + google.protobuf.UInt32Value count = 3; +}; + +message EndpointConfigRequest { + // Key uniquely identifies a EndpointConfig instance to retrieve. + // This value must be populated. + SwgKey key = 1; + + // Time indicates the time for which you are interested in the data. + // If no time is given, the server will use the time at which it makes the request. + google.protobuf.Timestamp time = 2; +}; + +message EndpointConfigResponse { + // Value is the value requested. + // This structure will be fully-populated as it exists in the datastore. If + // optional fields were not given at creation, these fields will be empty or + // set to default values. + EndpointConfig value = 1; + + // Time carries the (UTC) timestamp of the last-modification of the + // EndpointConfig instance in this response. + google.protobuf.Timestamp time = 2; +}; + +message EndpointConfigSomeRequest { + repeated SwgKey keys = 1; + + // Time indicates the time for which you are interested in the data. + // If no time is given, the server will use the time at which it makes the request. + google.protobuf.Timestamp time = 2; +}; + +message EndpointConfigSomeResponse { + // Value is the value requested. + // This structure will be fully-populated as it exists in the datastore. If + // optional fields were not given at creation, these fields will be empty or + // set to default values. + EndpointConfig value = 1; + + // Error is an optional field. + // It should be filled when there is an error in the GetSome process. + google.protobuf.StringValue error = 2; + google.protobuf.Timestamp time = 3; +}; + +message EndpointConfigStreamRequest { + // PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + // This requires all provided fields to be equal to the response. + // + // While transparent to users, this field also allows services to optimize internal + // subscriptions if filter(s) are sufficiently specific. + repeated EndpointConfig partial_eq_filter = 1; + + // TimeRange allows limiting response data to within a specified time window. + // If this field is populated, at least one of the two time fields are required. + // + // For GetAll, the fields start and end can be used as follows: + // + // * end: Returns the state of each EndpointConfig at end. + // * Each EndpointConfig response is fully-specified (all fields set). + // * start: Returns the state of each EndpointConfig at start, followed by updates until now. + // * Each EndpointConfig response at start is fully-specified, but updates may be partial. + // * start and end: Returns the state of each EndpointConfig at start, followed by updates + // until end. + // * Each EndpointConfig response at start is fully-specified, but updates until end may + // be partial. + // + // This field is not allowed in the Subscribe RPC. + arista.time.TimeBounds time = 3; +}; + +message EndpointConfigStreamResponse { + // Value is a value deemed relevant to the initiating request. + // This structure will always have its key-field populated. Which other fields are + // populated, and why, depends on the value of Operation and what triggered this notification. + EndpointConfig value = 1; + + // Time holds the timestamp of this EndpointConfig's last modification. + google.protobuf.Timestamp time = 2; + + // Operation indicates how the EndpointConfig value in this response should be considered. + // Under non-subscribe requests, this value should always be INITIAL. In a subscription, + // once all initial data is streamed and the client begins to receive modification updates, + // you should not see INITIAL again. + arista.subscriptions.Operation type = 3; +}; + +message EndpointConfigBatchedStreamRequest { + // PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + // This requires all provided fields to be equal to the response. + // + // While transparent to users, this field also allows services to optimize internal + // subscriptions if filter(s) are sufficiently specific. + repeated EndpointConfig partial_eq_filter = 1; + + // TimeRange allows limiting response data to within a specified time window. + // If this field is populated, at least one of the two time fields are required. + // + // For GetAll, the fields start and end can be used as follows: + // + // * end: Returns the state of each EndpointConfig at end. + // * Each EndpointConfig response is fully-specified (all fields set). + // * start: Returns the state of each EndpointConfig at start, followed by updates until now. + // * Each EndpointConfig response at start is fully-specified, but updates may be partial. + // * start and end: Returns the state of each EndpointConfig at start, followed by updates + // until end. + // * Each EndpointConfig response at start is fully-specified, but updates until end may + // be partial. + // + // This field is not allowed in the Subscribe RPC. + arista.time.TimeBounds time = 3; + + // MaxMessages limits the maximum number of messages that can be contained in one batch. + // MaxMessages is required to be at least 1. + // The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + // INTERNAL_BATCH_LIMIT is set based on the maximum message size. + google.protobuf.UInt32Value max_messages = 4; +}; + +message EndpointConfigBatchedStreamResponse { + // Values are the values deemed relevant to the initiating request. + // The length of this structure is guaranteed to be between (inclusive) 1 and + // min(req.max_messages, INTERNAL_BATCH_LIMIT). + repeated EndpointConfigStreamResponse responses = 1; +}; + +message EndpointConfigSetRequest { + // EndpointConfig carries the value to set into the datastore. + // See the documentation on the EndpointConfig struct for which fields are required. + EndpointConfig value = 1; +}; + +message EndpointConfigSetResponse { + // Value carries all the values given in the EndpointConfigSetRequest as well + // as any server-generated values. + EndpointConfig value = 1; + + // Time indicates the (UTC) timestamp at which the system recognizes the + // creation. The only guarantees made about this timestamp are: + // + // - it is after the time the request was received + // - a time-ranged query with StartTime==CreatedAt will include this instance. + // + google.protobuf.Timestamp time = 2; +}; + +message EndpointConfigSetSomeRequest { + // value contains a list of EndpointConfig values to write. + // It is possible to provide more values than can fit within either: + // - the maxiumum send size of the client + // - the maximum receive size of the server + // If this error occurs you must reduce the number of values sent. + // See gRPC "maximum message size" documentation for more information. + repeated EndpointConfig values = 1; +}; + +message EndpointConfigSetSomeResponse { + SwgKey key = 1; + string error = 2; +}; + +message EndpointConfigDeleteRequest { + // Key indicates which EndpointConfig instance to remove. + // This field must always be set. + SwgKey key = 1; +}; + +message EndpointConfigDeleteResponse { + // Key echoes back the key of the deleted EndpointConfig instance. + SwgKey key = 1; + + // Time indicates the (UTC) timestamp at which the system recognizes the + // deletion. The only guarantees made about this timestamp are: + // + // - it is after the time the request was received + // - a time-ranged query with StartTime==DeletedAt will not include this instance. + // + google.protobuf.Timestamp time = 2; +}; + +message EndpointConfigDeleteSomeRequest { + // key contains a list of EndpointConfig keys to delete + repeated SwgKey keys = 1; +}; + +// EndpointConfigDeleteSomeResponse is only sent when there is an error. +message EndpointConfigDeleteSomeResponse { + SwgKey key = 1; + string error = 2; +}; + +message EndpointConfigDeleteAllRequest { + // PartialEqFilter provides a way to server-side filter a DeleteAll. + // This requires all provided fields to be equal to the response. + // A filtered DeleteAll will use GetAll with filter to find things to delete. + repeated EndpointConfig partial_eq_filter = 1; +}; + +message EndpointConfigDeleteAllResponse { + // This describes the class of delete error. + // A DeleteAllResponse is only sent when there is an error. + fmp.DeleteError type = 1; + // This indicates the error message from the delete failure. + google.protobuf.StringValue error = 2; + // This is the key of the EndpointConfig instance that failed to be deleted. + SwgKey key = 3; + // Time indicates the (UTC) timestamp when the key was being deleted. + google.protobuf.Timestamp time = 4; +}; + +service EndpointConfigService { + rpc GetOne (EndpointConfigRequest) returns (EndpointConfigResponse); + rpc GetSome (EndpointConfigSomeRequest) returns (stream EndpointConfigSomeResponse); + rpc GetAll (EndpointConfigStreamRequest) returns (stream EndpointConfigStreamResponse); + rpc Subscribe (EndpointConfigStreamRequest) returns (stream EndpointConfigStreamResponse); + rpc GetMeta (EndpointConfigStreamRequest) returns (MetaResponse); + rpc SubscribeMeta (EndpointConfigStreamRequest) returns (stream MetaResponse); + rpc Set (EndpointConfigSetRequest) returns (EndpointConfigSetResponse); + rpc SetSome (EndpointConfigSetSomeRequest) returns (stream EndpointConfigSetSomeResponse); + rpc Delete (EndpointConfigDeleteRequest) returns (EndpointConfigDeleteResponse); + rpc DeleteSome (EndpointConfigDeleteSomeRequest) returns (stream EndpointConfigDeleteSomeResponse); + rpc DeleteAll (EndpointConfigDeleteAllRequest) returns (stream EndpointConfigDeleteAllResponse); + rpc GetAllBatched (EndpointConfigBatchedStreamRequest) returns (stream EndpointConfigBatchedStreamResponse); + rpc SubscribeBatched (EndpointConfigBatchedStreamRequest) returns (stream EndpointConfigBatchedStreamResponse); +} + +message EndpointStatusRequest { + // Key uniquely identifies a EndpointStatus instance to retrieve. + // This value must be populated. + SwgKey key = 1; + + // Time indicates the time for which you are interested in the data. + // If no time is given, the server will use the time at which it makes the request. + google.protobuf.Timestamp time = 2; +}; + +message EndpointStatusResponse { + // Value is the value requested. + // This structure will be fully-populated as it exists in the datastore. If + // optional fields were not given at creation, these fields will be empty or + // set to default values. + EndpointStatus value = 1; + + // Time carries the (UTC) timestamp of the last-modification of the + // EndpointStatus instance in this response. + google.protobuf.Timestamp time = 2; +}; + +message EndpointStatusSomeRequest { + repeated SwgKey keys = 1; + + // Time indicates the time for which you are interested in the data. + // If no time is given, the server will use the time at which it makes the request. + google.protobuf.Timestamp time = 2; +}; + +message EndpointStatusSomeResponse { + // Value is the value requested. + // This structure will be fully-populated as it exists in the datastore. If + // optional fields were not given at creation, these fields will be empty or + // set to default values. + EndpointStatus value = 1; + + // Error is an optional field. + // It should be filled when there is an error in the GetSome process. + google.protobuf.StringValue error = 2; + google.protobuf.Timestamp time = 3; +}; + +message EndpointStatusStreamRequest { + // PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + // This requires all provided fields to be equal to the response. + // + // While transparent to users, this field also allows services to optimize internal + // subscriptions if filter(s) are sufficiently specific. + repeated EndpointStatus partial_eq_filter = 1; + + // TimeRange allows limiting response data to within a specified time window. + // If this field is populated, at least one of the two time fields are required. + // + // For GetAll, the fields start and end can be used as follows: + // + // * end: Returns the state of each EndpointStatus at end. + // * Each EndpointStatus response is fully-specified (all fields set). + // * start: Returns the state of each EndpointStatus at start, followed by updates until now. + // * Each EndpointStatus response at start is fully-specified, but updates may be partial. + // * start and end: Returns the state of each EndpointStatus at start, followed by updates + // until end. + // * Each EndpointStatus response at start is fully-specified, but updates until end may + // be partial. + // + // This field is not allowed in the Subscribe RPC. + arista.time.TimeBounds time = 3; +}; + +message EndpointStatusStreamResponse { + // Value is a value deemed relevant to the initiating request. + // This structure will always have its key-field populated. Which other fields are + // populated, and why, depends on the value of Operation and what triggered this notification. + EndpointStatus value = 1; + + // Time holds the timestamp of this EndpointStatus's last modification. + google.protobuf.Timestamp time = 2; + + // Operation indicates how the EndpointStatus value in this response should be considered. + // Under non-subscribe requests, this value should always be INITIAL. In a subscription, + // once all initial data is streamed and the client begins to receive modification updates, + // you should not see INITIAL again. + arista.subscriptions.Operation type = 3; +}; + +message EndpointStatusBatchedStreamRequest { + // PartialEqFilter provides a way to server-side filter a GetAll/Subscribe. + // This requires all provided fields to be equal to the response. + // + // While transparent to users, this field also allows services to optimize internal + // subscriptions if filter(s) are sufficiently specific. + repeated EndpointStatus partial_eq_filter = 1; + + // TimeRange allows limiting response data to within a specified time window. + // If this field is populated, at least one of the two time fields are required. + // + // For GetAll, the fields start and end can be used as follows: + // + // * end: Returns the state of each EndpointStatus at end. + // * Each EndpointStatus response is fully-specified (all fields set). + // * start: Returns the state of each EndpointStatus at start, followed by updates until now. + // * Each EndpointStatus response at start is fully-specified, but updates may be partial. + // * start and end: Returns the state of each EndpointStatus at start, followed by updates + // until end. + // * Each EndpointStatus response at start is fully-specified, but updates until end may + // be partial. + // + // This field is not allowed in the Subscribe RPC. + arista.time.TimeBounds time = 3; + + // MaxMessages limits the maximum number of messages that can be contained in one batch. + // MaxMessages is required to be at least 1. + // The maximum number of messages in a batch is min(max_messages, INTERNAL_BATCH_LIMIT) + // INTERNAL_BATCH_LIMIT is set based on the maximum message size. + google.protobuf.UInt32Value max_messages = 4; +}; + +message EndpointStatusBatchedStreamResponse { + // Values are the values deemed relevant to the initiating request. + // The length of this structure is guaranteed to be between (inclusive) 1 and + // min(req.max_messages, INTERNAL_BATCH_LIMIT). + repeated EndpointStatusStreamResponse responses = 1; +}; + +service EndpointStatusService { + rpc GetOne (EndpointStatusRequest) returns (EndpointStatusResponse); + rpc GetSome (EndpointStatusSomeRequest) returns (stream EndpointStatusSomeResponse); + rpc GetAll (EndpointStatusStreamRequest) returns (stream EndpointStatusStreamResponse); + rpc Subscribe (EndpointStatusStreamRequest) returns (stream EndpointStatusStreamResponse); + rpc GetMeta (EndpointStatusStreamRequest) returns (MetaResponse); + rpc SubscribeMeta (EndpointStatusStreamRequest) returns (stream MetaResponse); + rpc GetAllBatched (EndpointStatusBatchedStreamRequest) returns (stream EndpointStatusBatchedStreamResponse); + rpc SubscribeBatched (EndpointStatusBatchedStreamRequest) returns (stream EndpointStatusBatchedStreamResponse); +} diff --git a/python-avd/pyavd/_cv/extra_cv_protos/arista/swg.v1/swg.proto b/python-avd/pyavd/_cv/extra_cv_protos/arista/swg.v1/swg.proto new file mode 100644 index 00000000000..5ad0d7eaea1 --- /dev/null +++ b/python-avd/pyavd/_cv/extra_cv_protos/arista/swg.v1/swg.proto @@ -0,0 +1,84 @@ +// Copyright (c) 2024 Arista Networks, Inc. All rights reserved. +// Use of this source code is governed by the Apache License 2.0 +// that can be found in the LICENSE file. + +syntax = "proto3"; + +package arista.swg.v1; + +option go_package = "arista/resources/arista/swg.v1;swg"; + +import "google/protobuf/wrappers.proto"; +import "fmp/extensions.proto"; +import "fmp/inet.proto"; + +// ServiceName represents the name of the secure web gateway service +enum ServiceName { + // SERVICE_NAME_UNSPECIFIED indicates service name is unknown + SERVICE_NAME_UNSPECIFIED = 0; + // SERVICE_NAME_ZSCALER indicates service name as "zscaler" + SERVICE_NAME_ZSCALER = 1; +} + +// SwgKey identifies a device and a secure web gateway service +message SwgKey { + option (fmp.model_key) = true; + // device_id is id of a device + google.protobuf.StringValue device_id = 1; + // service_name is the name of the secure web gateway service. + ServiceName service_name = 2; +} + +// Location represents a device's or an endpoint's location +message Location { + // city is the city where a device or endpoint is located + google.protobuf.StringValue city = 1; + // region is the region where device or endpoint is located + google.protobuf.StringValue region = 2; + // country is the country where a device or endpoint is located + google.protobuf.StringValue country = 3; + // latitude is the latitude of a device's or an endpoint's location + google.protobuf.FloatValue latitude = 4; + // longitude is the longitude of a device's or an endpoint's location + google.protobuf.FloatValue longitude = 5; +} + +// VpnEndpoint represents the secure web gateway endpoint +message VpnEndpoint { + // ip_address is the IP address of a SWG endpoint + fmp.IPAddress ip_address = 1; + // datacenter of a SWG endpoint + google.protobuf.StringValue datacenter = 2; + // endpoint_location represents the location of a SWG endpoint + Location endpoint_location = 3; +} + +// VpnEndpoints represents a collection of SWG endpoints +message VpnEndpoints { + // values is a map of vpn endpoints. + // Valid keys are "primary", "secondary" and "tertiary" + map values = 1; +} + +// EndpointStatus represents the status of a SWG endpoint +message EndpointStatus { + option (fmp.model) = "ro"; + // key represents a device and a SWG service + SwgKey key = 1; + // vpn_endpoints represents a collection of SWG endpoints + VpnEndpoints vpn_endpoints = 2; + // cloud_name represents the cloud name assigned to the user + // by the SWG administrator + google.protobuf.StringValue cloud_name = 3; + // device_location is the location of the device + Location device_location = 4; +} + +// EndpointConfig represents the configuration of a device endpoint +message EndpointConfig { + option (fmp.model) = "rw"; + // key represents a device and a SWG service + SwgKey key = 1; + // address is the physical address of a device + google.protobuf.StringValue address = 2; +} diff --git a/python-avd/pyavd/_cv/workflows/__init__.py b/python-avd/pyavd/_cv/workflows/__init__.py new file mode 100644 index 00000000000..b17ca7c745d --- /dev/null +++ b/python-avd/pyavd/_cv/workflows/__init__.py @@ -0,0 +1,3 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/workflows/create_workspace_on_cv.py b/python-avd/pyavd/_cv/workflows/create_workspace_on_cv.py similarity index 100% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/workflows/create_workspace_on_cv.py rename to python-avd/pyavd/_cv/workflows/create_workspace_on_cv.py diff --git a/python-avd/pyavd/_cv/workflows/deploy_configs_to_cv.py b/python-avd/pyavd/_cv/workflows/deploy_configs_to_cv.py new file mode 100644 index 00000000000..3c92e3bd48e --- /dev/null +++ b/python-avd/pyavd/_cv/workflows/deploy_configs_to_cv.py @@ -0,0 +1,177 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import annotations + +from asyncio import gather +from logging import getLogger + +from ..._utils import batch +from ..client import CVClient +from .models import CVEosConfig, DeployToCvResult + +LOGGER = getLogger(__name__) + +CONFIGLET_ID_PREFIX = "avd-" +CONFIGLET_NAME_PREFIX = "AVD_" +CONFIGLET_CONTAINER_ID = f"{CONFIGLET_ID_PREFIX}configlets" +STATIC_CONFIGLET_STUDIO_ID = "studio-static-configlet" +PARALLEL_COROUTINES = 20 + + +async def deploy_configs_to_cv(configs: list[CVEosConfig], result: DeployToCvResult, cv_client: CVClient) -> None: + """ + Deploy given configs using "Static Configlet Studio" + + - Create/verify a single configuration container named "AVD Configurations". + - Upload Configlets and assign to devices. + + TODO: See if this can be optimized to check if the configlets are already in place and correct. A hash would have been nice. + TODO: Split long configs into multiple configlets for 990KB chunks. Need to figure out how to batch it. + """ + + LOGGER.info("deploy_configs_to_cv: %s", len(configs)) + + if not configs: + return + + # Build Todo with CVEosConfig objects that exist on CloudVision. Add the rest to skipped. + result.skipped_configs.extend(config for config in configs if not config.device._exists_on_cv) + LOGGER.info("deploy_configs_to_cv: %s skipped configs because the devices are missing from CloudVision.", len(result.skipped_configs)) + todo_configs = [config for config in configs if config.device._exists_on_cv] + LOGGER.info("deploy_configs_to_cv: %s todo configs.", len(todo_configs)) + + # No need to continue if we have nothing to do. + if not todo_configs: + return + + # First create all configlets in parallel coroutines. + await deploy_configlets_to_cv(todo_configs, result.workspace.id, cv_client) + # Next create all containers in parallel coroutines. + await deploy_configlet_containers_to_cv(todo_configs, result.workspace.id, cv_client) + + result.deployed_configs.extend(todo_configs) + + +async def deploy_configlets_to_cv(configs: list[CVEosConfig], workspace_id: str, cv_client: CVClient) -> None: + """ + Bluntly setting configs like nothing was there. Only create missing containers + TODO: Fetch config checksums for existing configs and only upload what is needed. + """ + configlet_coroutines = [] + for config in configs: + configlet_id = f"{CONFIGLET_ID_PREFIX}{config.device.serial_number}" + configlet_coroutines.append( + cv_client.set_configlet_from_file( + workspace_id=workspace_id, + configlet_id=configlet_id, + file=config.file, + display_name=config.configlet_name or f"{CONFIGLET_NAME_PREFIX}{config.device.hostname}", + description=f"Configuration created and uploaded by AVD for {config.device.hostname}", + ) + ) + + LOGGER.info("deploy_configs_to_cv: Deploying %s configlets in batches of %s.", len(configlet_coroutines), PARALLEL_COROUTINES) + for index, coroutines in enumerate(batch(configlet_coroutines, PARALLEL_COROUTINES), start=1): + LOGGER.info("deploy_configs_to_cv: Batch %s", index) + await gather(*coroutines) + + +async def get_existing_device_container_ids_from_root_container(workspace_id: str, cv_client: CVClient) -> list[str]: + """ + Get or create root level container for AVD configurations. Using the hardcoded id from CONFIGLET_CONTAINER_ID. + Then return the list of existing device container ids. (Always empty if we just created the root container) + """ + root_cv_containers = await cv_client.get_configlet_containers(workspace_id=workspace_id, container_ids=[CONFIGLET_CONTAINER_ID]) + LOGGER.info("get_or_create_configlet_root_container: Got AVD root container? %s", bool(root_cv_containers)) + if root_cv_containers: + return root_cv_containers[0].child_assignment_ids.values + + # Create the root level container + LOGGER.info("deploy_configs_to_cv: Creating AVD root container '%s'", CONFIGLET_CONTAINER_ID) + await cv_client.set_configlet_container( + workspace_id=workspace_id, + container_id=CONFIGLET_CONTAINER_ID, + display_name="AVD Configurations", + description="Configurations created and uploaded by AVD", + query="device:*", + ) + # Add the root level container to the list of root level containers using the studio inputs API (!?!) + root_containers: list = await cv_client.get_studio_inputs_with_path( + studio_id=STATIC_CONFIGLET_STUDIO_ID, workspace_id=workspace_id, input_path=["configletAssignmentRoots"], default_value=[] + ) + LOGGER.info("deploy_configs_to_cv: Found %s root containers.", len(root_containers)) + if CONFIGLET_CONTAINER_ID not in root_containers: + LOGGER.info("deploy_configs_to_cv: AVD root container not assigned as root container in Static Config Studio. Fixing...") + root_containers.append(CONFIGLET_CONTAINER_ID) + await cv_client.set_studio_inputs( + studio_id=STATIC_CONFIGLET_STUDIO_ID, + workspace_id=workspace_id, + input_path=["configletAssignmentRoots"], + inputs=root_containers, + ) + return [] + + +async def deploy_configlet_containers_to_cv(configs: list[CVEosConfig], workspace_id: str, cv_client: CVClient) -> None: + """ + Identify existing containers and ensure they have the correct configuration. + Then update/create as needed. + + TODO: Refactor to set_some on supported CV versions + """ + if existing_device_container_ids := await get_existing_device_container_ids_from_root_container(workspace_id, cv_client): + existing_device_containers = await cv_client.get_configlet_containers( + workspace_id=workspace_id, + container_ids=existing_device_container_ids, + ) + LOGGER.info("deploy_configs_to_cv: %s existing device containers under AVD root container.", len(existing_device_containers)) + # Create dict keyed by container id with value of tuple containing key container parameters. Used later to detect changes. + existing_device_containers_by_id = { + cv_container.key.configlet_assignment_id: ( + cv_container.display_name, + cv_container.description, + cv_container.query, + cv_container.configlet_ids.values, + ) + for cv_container in existing_device_containers + } + else: + existing_device_containers = [] + existing_device_containers_by_id = {} + + container_coroutines = [] + update_device_container_ids = set() + for config in configs: + # For now we reuse configlet_id as container_id. + container_id = configlet_id = f"{CONFIGLET_ID_PREFIX}{config.device.serial_number}" + display_name = f"{config.device.hostname}" + description = f"Configuration created and uploaded by AVD for {config.device.hostname}" + query = f"device:{config.device.serial_number}" + configlet_ids = [configlet_id] + if existing_device_containers_by_id.get(container_id) != (display_name, description, query, configlet_ids): + update_device_container_ids.add(container_id) + container_coroutines.append( + cv_client.set_configlet_container( + workspace_id=workspace_id, + container_id=container_id, + display_name=display_name, + description=description, + query=query, + configlet_ids=configlet_ids, + ) + ) + + LOGGER.info("deploy_configs_to_cv: Deploying %s configlet assignments / containers in batches of %s.", len(container_coroutines), PARALLEL_COROUTINES) + for index, coroutines in enumerate(batch(container_coroutines, PARALLEL_COROUTINES), start=1): + LOGGER.info("deploy_configs_to_cv: Batch %s", index) + await gather(*coroutines) + + # Update any missing update_device_container_ids on the root level container. + if not update_device_container_ids.issubset(existing_device_containers_by_id): + LOGGER.info("deploy_configs_to_cv: Updating root container children.") + await cv_client.set_configlet_container( + workspace_id=workspace_id, + container_id=CONFIGLET_CONTAINER_ID, + child_assignment_ids=list(update_device_container_ids.union(existing_device_containers_by_id)), + ) diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/workflows/deploy_cv_pathfinder_metadata_to_cv.py b/python-avd/pyavd/_cv/workflows/deploy_cv_pathfinder_metadata_to_cv.py similarity index 60% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/workflows/deploy_cv_pathfinder_metadata_to_cv.py rename to python-avd/pyavd/_cv/workflows/deploy_cv_pathfinder_metadata_to_cv.py index b2463bb42a5..8b5d89c27d4 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/workflows/deploy_cv_pathfinder_metadata_to_cv.py +++ b/python-avd/pyavd/_cv/workflows/deploy_cv_pathfinder_metadata_to_cv.py @@ -6,8 +6,11 @@ from copy import deepcopy from logging import getLogger -from ...utils import get +from ..._utils import get, get_v2 +from ..._utils.password_utils.password import simple_7_decrypt +from ..api.arista.studio.v1 import InputSchema from ..client import CVClient +from ..client.exceptions import CVResourceNotFound from .models import CVDevice, CVPathfinderMetadata, DeployToCvResult LOGGER = getLogger(__name__) @@ -22,6 +25,39 @@ } +def is_pathfinder_location_supported(studio_schema: InputSchema) -> bool: + """Detect if pathfinder location is supported by the metadata studio""" + pathfinder_group_fields = get_v2(studio_schema, "fields.values.pathfinderGroup.group_props.members.values") + if pathfinder_group_fields is None: + return False + attributes = {"pathfinderRegion", "pathfinderAddress", "pathfinderSite"} + return attributes.issubset(pathfinder_group_fields) + + +def is_internet_exit_zscaler_supported(studio_schema: InputSchema) -> bool: + """Detect if zscaler internet exit is supported by the metadata studio""" + return bool(get_v2(studio_schema, "fields.values.zscaler")) + + +async def get_metadata_studio_schema(result: DeployToCvResult, cv_client: CVClient) -> InputSchema | None: + """ + Download and return the input schema for the cv pathfinder metadata studio. + Returns None if the metadata studio is not found. + """ + try: + studio = await cv_client.get_studio(CV_PATHFINDER_METADATA_STUDIO_ID, result.workspace.id) + except CVResourceNotFound: + warning = "deploy_cv_pathfinder_metadata_to_cv: Did not find metadata studio." + LOGGER.info(warning) + result.warnings.append(warning) + return None + + studio_schema: InputSchema = studio.input_schema + studio_version = get_v2(studio_schema, "fields.values.studioVersion.string_props.default_value") + LOGGER.info("deploy_cv_pathfinder_metadata_to_cv: Found metadata studio version: %s", studio_version) + return studio_schema + + def update_general_metadata(metadata: dict, studio_inputs: dict) -> None: """ In-place update general metadata in studio_inputs. @@ -50,18 +86,21 @@ def update_general_metadata(metadata: dict, studio_inputs: dict) -> None: ) -def upsert_pathfinder(metadata: dict, device: CVDevice, studio_inputs: dict) -> None: +def upsert_pathfinder(metadata: dict, device: CVDevice, studio_inputs: dict, studio_schema: InputSchema) -> list[str]: """ In-place insert / update metadata for one pathfinder device in studio_inputs. + + Returns any warnings raised. """ LOGGER.info("deploy_cv_pathfinder_metadata_to_cv: upsert_pathfinder %s", device.hostname) + warnings = [] + pathfinder_metadata = { "inputs": { "value": { "sslProfileName": metadata.get("ssl_profile", ""), "vtepIp": metadata.get("vtep_ip", ""), - "region": metadata.get("region", ""), "wanInterfaces": [ { "inputs": { @@ -81,6 +120,15 @@ def upsert_pathfinder(metadata: dict, device: CVDevice, studio_inputs: dict) -> "tags": {"query": f"device:{device.serial_number}"}, } + pathfinder_location = {key: metadata.get(key) for key in ("region", "site", "address")} + if any(pathfinder_location): + if is_pathfinder_location_supported(studio_schema): + pathfinder_metadata["inputs"]["value"].update(pathfinder_location) + else: + warning = "deploy_cv_pathfinder_metadata_to_cv: Ignoring Pathfinder location information since it is not supported by the metadata studio." + LOGGER.info(warning) + warnings.append(warning) + found_index = None for index, router in enumerate(studio_inputs.get("pathfinders", [])): if get(router, "tags.query") == f"device:{device.serial_number}": @@ -94,12 +142,18 @@ def upsert_pathfinder(metadata: dict, device: CVDevice, studio_inputs: dict) -> LOGGER.info("deploy_cv_pathfinder_metadata_to_cv: Existing pathfinder device, updating %s", device.hostname) studio_inputs["pathfinders"][found_index] = pathfinder_metadata + return warnings + -def upsert_edge(metadata: dict, device: CVDevice, studio_inputs: dict) -> None: +def upsert_edge(metadata: dict, device: CVDevice, studio_inputs: dict, studio_schema: InputSchema) -> list[str]: """ In-place insert / update metadata for one edge device in studio_inputs. + + Returns any warnings raised. """ LOGGER.info("deploy_cv_pathfinder_metadata_to_cv: upsert_edge %s", device.hostname) + + warnings = [] edge_metadata = { "inputs": { "router": { @@ -127,6 +181,10 @@ def upsert_edge(metadata: dict, device: CVDevice, studio_inputs: dict) -> None: }, "tags": {"query": f"device:{device.serial_number}"}, } + internet_exit_metadata, ie_warnings = generate_internet_exit_metadata(metadata, device, studio_schema) + warnings.extend(ie_warnings) + if internet_exit_metadata: + edge_metadata["inputs"]["router"]["services"] = internet_exit_metadata found_index = None for index, router in enumerate(studio_inputs.get("routers", [])): @@ -141,6 +199,8 @@ def upsert_edge(metadata: dict, device: CVDevice, studio_inputs: dict) -> None: LOGGER.info("deploy_cv_pathfinder_metadata_to_cv: Existing edge/transit device, updating %s", device.hostname) studio_inputs["routers"][found_index] = edge_metadata + return warnings + async def deploy_cv_pathfinder_metadata_to_cv(cv_pathfinder_metadata: list[CVPathfinderMetadata], result: DeployToCvResult, cv_client: CVClient) -> None: """ @@ -220,22 +280,13 @@ async def deploy_cv_pathfinder_metadata_to_cv(cv_pathfinder_metadata: list[CVPat if not cv_pathfinder_metadata: return + if (studio_schema := await get_metadata_studio_schema(result, cv_client)) is None: + return + # Get existing studio inputs existing_studio_inputs = await cv_client.get_studio_inputs( studio_id=CV_PATHFINDER_METADATA_STUDIO_ID, workspace_id=result.workspace.id, default_value=CV_PATHFINDER_DEFAULT_STUDIO_INPUTS ) - - # TODO: Ensure the metadata studio schema match our supported version - # if (studio_version := existing_studio_inputs.get("version")) != "3.2": - # LOGGER.warning( - # ( - # "deploy_cv_pathfinder_metadata_to_cv: Got invalid metadata studio version '%s'. " - # "This plugin only accepts version '3.2'. Skipping upload of metadata." - # ), - # studio_version, - # ) - # return - studio_inputs = deepcopy(existing_studio_inputs) # Walk through given metadata, skip missing devices or invalid roles. @@ -281,12 +332,86 @@ async def deploy_cv_pathfinder_metadata_to_cv(cv_pathfinder_metadata: list[CVPat update_general_metadata(metadata=pathfinders[0].metadata, studio_inputs=studio_inputs) for pathfinder in pathfinders: - upsert_pathfinder(metadata=pathfinder.metadata, device=pathfinder.device, studio_inputs=studio_inputs) + result.warnings.extend( + upsert_pathfinder(metadata=pathfinder.metadata, device=pathfinder.device, studio_inputs=studio_inputs, studio_schema=studio_schema) + ) for edge in edges: - upsert_edge(metadata=edge.metadata, device=edge.device, studio_inputs=studio_inputs) + result.warnings.extend(upsert_edge(metadata=edge.metadata, device=edge.device, studio_inputs=studio_inputs, studio_schema=studio_schema)) if studio_inputs != existing_studio_inputs: await cv_client.set_studio_inputs(studio_id=CV_PATHFINDER_METADATA_STUDIO_ID, workspace_id=result.workspace.id, inputs=studio_inputs) result.deployed_cv_pathfinder_metadata.extend(pathfinders + edges) + + +def generate_internet_exit_metadata(metadata: dict, device: CVDevice, studio_schema: InputSchema) -> tuple[dict, list[str]]: + """ + Generate internet-exit related metadata for one device. + To be inserted into edge router metadata under "services" + + Returns metadata dict and list of any warnings raised. + """ + if (internet_exit_policies := get(metadata, "internet_exit_policies")) is None: + LOGGER.debug("deploy_cv_pathfinder_metadata_to_cv: Did not find 'internet_exit_policies' for device: %s", device.hostname) + return {}, [] + + LOGGER.info("deploy_cv_pathfinder_metadata_to_cv: Found %s 'internet_exit_policies' for device: %s", len(internet_exit_policies), device.hostname) + + services_dict = {} + warnings = [] + + for internet_exit_policy in internet_exit_policies: + # We currently only support "zscaler" and ignore "direct". + if internet_exit_policy.get("type") not in ["zscaler", "direct"]: + warning = ( + f"deploy_cv_pathfinder_metadata_to_cv: Ignoring unsupported internet exit policy '{internet_exit_policies.get('name')}' " + f"with type '{internet_exit_policy.get('type')}' for device: {device.hostname}." + ) + LOGGER.info(warning) + warnings.append(warning) + continue + + if internet_exit_policy["type"] == "direct": + # No metadata needed for direct internet-exit. + continue + + if not is_internet_exit_zscaler_supported(studio_schema): + warning = "deploy_cv_pathfinder_metadata_to_cv: Ignoring Zscaler internet-exit information since it is not supported by metadata studio." + LOGGER.info(warning) + warnings.append(warning) + continue + + policy_name = internet_exit_policy["name"] + services_dict.setdefault("zscaler", {"locations": [], "tunnels": []}) + services_dict["zscaler"]["locations"].append( + { + "name": f"{device.hostname}_{policy_name}", + "description": f"Location corresponding to {device.hostname} for internet-exit policy {policy_name}.", + "city": internet_exit_policy["city"], + "country": internet_exit_policy["country"], + "uploadBandwidth": internet_exit_policy.get("upload_bandwidth"), + "downloadBandwidth": internet_exit_policy.get("download_bandwidth"), + "firewallEnabled": internet_exit_policy["firewall"], + "ipsControl": internet_exit_policy["ips_control"], + "aupEnabled": internet_exit_policy["acceptable_use_policy"], + "vpnCredentials": [ + { + "fqdn": vpn_credential["fqdn"], + "comments": f"Credential for {device.hostname} internet-exit policy {policy_name}", + "vpnType": vpn_credential["vpn_type"], + "presharedKey": simple_7_decrypt(vpn_credential["pre_shared_key"]), + } + for vpn_credential in internet_exit_policy["vpn_credentials"] + ], + } + ) + services_dict["zscaler"]["tunnels"].extend( + { + "name": tunnel["name"], + "preference": tunnel["preference"], + } + for tunnel in internet_exit_policy["tunnels"] + ) + + return services_dict, warnings diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/workflows/deploy_studio_inputs_to_cv.py b/python-avd/pyavd/_cv/workflows/deploy_studio_inputs_to_cv.py similarity index 99% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/workflows/deploy_studio_inputs_to_cv.py rename to python-avd/pyavd/_cv/workflows/deploy_studio_inputs_to_cv.py index f8934c86fd2..c89e922e1cf 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/workflows/deploy_studio_inputs_to_cv.py +++ b/python-avd/pyavd/_cv/workflows/deploy_studio_inputs_to_cv.py @@ -6,7 +6,7 @@ from asyncio import gather from logging import getLogger -from ...utils import batch +from ..._utils import batch from ..client import CVClient from .models import CVStudioInputs, DeployToCvResult diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/workflows/deploy_tags_to_cv.py b/python-avd/pyavd/_cv/workflows/deploy_tags_to_cv.py similarity index 99% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/workflows/deploy_tags_to_cv.py rename to python-avd/pyavd/_cv/workflows/deploy_tags_to_cv.py index a9dac435c3f..1e66153dd0e 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/workflows/deploy_tags_to_cv.py +++ b/python-avd/pyavd/_cv/workflows/deploy_tags_to_cv.py @@ -112,7 +112,7 @@ async def deploy_tags_to_cv( devices_by_serial_number = {tag.device.serial_number: tag.device for tag in deployed_tags if tag.device is not None} # If strict, we remove any assignments not specified in the inputs. - # If not strict, we remove any assignments with the same labels but not sepcified in the inputs. + # If not strict, we remove any assignments with the same labels but not specified in the inputs. if strict: assignments_to_unassign = [ (label, value, device_serial_number, interface) diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/workflows/deploy_to_cv.py b/python-avd/pyavd/_cv/workflows/deploy_to_cv.py similarity index 99% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/workflows/deploy_to_cv.py rename to python-avd/pyavd/_cv/workflows/deploy_to_cv.py index dec82153d4d..bb2c7d9f904 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/workflows/deploy_to_cv.py +++ b/python-avd/pyavd/_cv/workflows/deploy_to_cv.py @@ -42,7 +42,7 @@ async def deploy_to_cv( cv_pathfinder_metadata: list[CVPathfinderMetadata] | None = None, skip_missing_devices: bool = False, strict_tags: bool = True, - timeouts: CVTimeOuts | None = None, + timeouts: CVTimeOuts | None = None, # pylint: disable=unused-argument ) -> DeployToCvResult: """ Deploy various objects to CloudVision. diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/workflows/finalize_change_control_on_cv.py b/python-avd/pyavd/_cv/workflows/finalize_change_control_on_cv.py similarity index 100% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/workflows/finalize_change_control_on_cv.py rename to python-avd/pyavd/_cv/workflows/finalize_change_control_on_cv.py diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/workflows/finalize_workspace_on_cv.py b/python-avd/pyavd/_cv/workflows/finalize_workspace_on_cv.py similarity index 97% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/workflows/finalize_workspace_on_cv.py rename to python-avd/pyavd/_cv/workflows/finalize_workspace_on_cv.py index 6ba4e5ef3dd..d9ed0a3fa86 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/workflows/finalize_workspace_on_cv.py +++ b/python-avd/pyavd/_cv/workflows/finalize_workspace_on_cv.py @@ -31,7 +31,7 @@ async def finalize_workspace_on_cv(workspace: CVWorkspace, cv_client: CVClient) LOGGER.info("finalize_workspace_on_cv: %s", workspace) - if workspace.requested_state == workspace.state or workspace.requested_state == "pending": + if workspace.requested_state in (workspace.state, "pending"): return workspace_config = await cv_client.build_workspace(workspace_id=workspace.id) diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/workflows/models.py b/python-avd/pyavd/_cv/workflows/models.py similarity index 100% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/workflows/models.py rename to python-avd/pyavd/_cv/workflows/models.py diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/workflows/verify_devices_on_cv.py b/python-avd/pyavd/_cv/workflows/verify_devices_on_cv.py similarity index 97% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/workflows/verify_devices_on_cv.py rename to python-avd/pyavd/_cv/workflows/verify_devices_on_cv.py index 6b75a9bb1c3..b9806e29206 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/workflows/verify_devices_on_cv.py +++ b/python-avd/pyavd/_cv/workflows/verify_devices_on_cv.py @@ -52,7 +52,7 @@ async def verify_devices_in_cloudvision_inventory( LOGGER.info("verify_devices_in_cloudvision_inventory: %s unique devices.", len(device_tuples)) found_devices = await cv_client.get_inventory_devices(devices=device_tuples) - LOGGER.info("verify_devices_in_cloudvision_inventory: got %s maching devices on CV.", len(found_devices)) + LOGGER.info("verify_devices_in_cloudvision_inventory: got %s matching devices on CV.", len(found_devices)) found_device_dict_by_serial = {found_device.key.device_id: found_device for found_device in found_devices} found_device_dict_by_system_mac = {found_device.system_mac_address: found_device for found_device in found_devices} found_device_dict_by_hostname = {found_device.hostname: found_device for found_device in found_devices} @@ -126,7 +126,7 @@ async def verify_devices_in_topology_studio(existing_devices: list[CVDevice], wo ) LOGGER.info("verify_devices_in_topology_studio: %s unique devices for %s device objects.", len(existing_device_tuples), len(existing_devices)) LOGGER.info("verify_devices_in_topology_studio: got %s devices from I&T Studio.", len(cv_topology_inputs)) - topology_inputs_dict_by_serial = {topology_input.key.device_id: topology_input for topology_input in cv_topology_inputs} + topology_inputs_dict_by_serial = {topology_input["device_id"]: topology_input for topology_input in cv_topology_inputs} # List of tuples holding the info we need to update in I&T Studio # [(, , )] @@ -136,8 +136,8 @@ async def verify_devices_in_topology_studio(existing_devices: list[CVDevice], wo if serial_number not in topology_inputs_dict_by_serial: update_topology_inputs.append((serial_number, hostname, system_mac_address)) elif ( - hostname != topology_inputs_dict_by_serial[serial_number].device_info.hostname - or system_mac_address != topology_inputs_dict_by_serial[serial_number].device_info.mac_address + hostname != topology_inputs_dict_by_serial[serial_number]["hostname"] + or system_mac_address != topology_inputs_dict_by_serial[serial_number]["mac_address"] ): update_topology_inputs.append((serial_number, hostname, system_mac_address)) diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/aaa-accounting.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/aaa-accounting.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/aaa-accounting.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/aaa-accounting.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/aaa-authentication.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/aaa-authentication.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/aaa-authentication.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/aaa-authentication.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/aaa-authorization.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/aaa-authorization.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/aaa-authorization.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/aaa-authorization.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/aaa-server-groups.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/aaa-server-groups.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/aaa-server-groups.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/aaa-server-groups.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/access-lists.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/access-lists.j2 similarity index 84% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/access-lists.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/access-lists.j2 index c7f511c545c..98acf791f58 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/access-lists.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/access-lists.j2 @@ -22,6 +22,9 @@ ACL has counting mode `counters per-entry` enabled! {% for sequence in access_list.sequence_numbers | arista.avd.natural_sort('sequence') %} | {{ sequence.sequence }} | {{ sequence.action }} | {% endfor %} +{% if access_list.permit_response_traffic is arista.avd.defined %} +| - | permit response traffic {{ access_list.permit_response_traffic }} | +{% endif %} {% endfor %} #### Extended Access-lists Device Configuration diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/acl.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/acl.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/acl.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/acl.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/address-locking.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/address-locking.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/address-locking.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/address-locking.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/agents.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/agents.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/agents.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/agents.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/aliases.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/aliases.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/aliases.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/aliases.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/application-traffic-recognition.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/application-traffic-recognition.j2 similarity index 80% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/application-traffic-recognition.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/application-traffic-recognition.j2 index cdddec7120f..109a5577cfc 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/application-traffic-recognition.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/application-traffic-recognition.j2 @@ -28,6 +28,22 @@ | {{ application.name }} | {{ src_prefix }} | {{ dest_prefix }} | {{ protocol }} | {{ protocol_ranges }} | {{ tcp_src_port }} | {{ tcp_dest_port }} | {{ udp_src_port }} | {{ udp_dest_port }} | {% endfor %} {% endif %} +{% if application_traffic_recognition.applications.l4_applications is arista.avd.defined %} + +#### Layer 4 Applications + +| Name | Protocols | Protocol Ranges | TCP Source Port Set | TCP Destination Port Set | UDP Source Port Set | UDP Destination Port Set | +| ---- | --------- | --------------- | ------------------- | ------------------------ | ------------------- | ------------------------ | +{% for application in application_traffic_recognition.applications.l4_applications | arista.avd.natural_sort('name') %} +{% set tcp_src_port = application.tcp_src_port_set_name | arista.avd.default("-") %} +{% set tcp_dest_port = application.tcp_dest_port_set_name | arista.avd.default("-") %} +{% set udp_src_port = application.udp_src_port_set_name | arista.avd.default("-") %} +{% set udp_dest_port = application.udp_dest_port_set_name | arista.avd.default("-") %} +{% set protocol_ranges = ", ".join(application.protocol_ranges | arista.avd.default(["-"])) %} +{% set protocol = ", ".join(application.protocols | arista.avd.default(["-"])) %} +| {{ application.name }} | {{ protocol }} | {{ protocol_ranges }} | {{ tcp_src_port }} | {{ tcp_dest_port }} | {{ udp_src_port }} | {{ udp_dest_port }} | +{% endfor %} +{% endif %} {% endif %} {% if application_traffic_recognition.application_profiles is arista.avd.defined %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/arp.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/arp.j2 similarity index 71% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/arp.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/arp.j2 index 07de1e8fb6c..5372f73d1f3 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/arp.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/arp.j2 @@ -4,9 +4,17 @@ that can be found in the LICENSE file. #} {# doc - arp #} -{% if arp.aging.timeout_default is arista.avd.defined or arp.static_entries is arista.avd.defined %} +{% if arp.aging.timeout_default is arista.avd.defined or arp.static_entries is arista.avd.defined or arp.persistent is arista.avd.defined %} ### ARP +{% if arp.persistent.enabled is arista.avd.defined(true) %} +{% set persistent_doc = "ARP cache persistency is enabled." %} +{% if arp.persistent.refresh_delay is arista.avd.defined %} +{% set persistent_doc = persistent_doc ~ " The refresh-delay is " ~ arp.persistent.refresh_delay ~ " seconds after reboot." %} +{% endif %} + +{{ persistent_doc }} +{% endif %} {% if arp.aging.timeout_default is arista.avd.defined %} Global ARP timeout: {{ arp.aging.timeout_default }} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/as-path.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/as-path.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/as-path.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/as-path.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/authentication.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/authentication.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/authentication.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/authentication.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/bfd-interfaces.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/bfd-interfaces.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/bfd-interfaces.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/bfd-interfaces.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/bfd.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/bfd.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/bfd.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/bfd.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/bgp-groups.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/bgp-groups.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/bgp-groups.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/bgp-groups.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/boot.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/boot.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/boot.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/boot.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/class-maps.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/class-maps.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/class-maps.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/class-maps.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/clock.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/clock.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/clock.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/clock.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/community-lists.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/community-lists.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/community-lists.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/community-lists.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/cvx.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/cvx.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/cvx.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/cvx.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/daemon-terminattr.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/daemon-terminattr.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/daemon-terminattr.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/daemon-terminattr.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/daemons.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/daemons.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/daemons.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/daemons.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/dhcp-relay.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/dhcp-relay.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/dhcp-relay.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/dhcp-relay.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/dhcp-server.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/dhcp-server.j2 similarity index 82% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/dhcp-server.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/dhcp-server.j2 index c954db99741..051d570cda2 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/dhcp-server.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/dhcp-server.j2 @@ -17,10 +17,17 @@ ### DHCP Servers Summary -| DHCP Server Enabled | VRF | IPv4 DNS Domain | IPv6 DNS Domain | -| ------------------- | --- | --------------- | --------------- | +| DHCP Server Enabled | VRF | IPv4 DNS Domain | IPv4 DNS Servers | IPv4 Bootfile | IPv6 DNS Domain | IPv6 DNS Servers | IPv6 Bootfile | +| ------------------- | --- | --------------- | ---------------- | ------------- | --------------- | ---------------- | ------------- | {% for dhcp_server in dhcp_servers | arista.avd.natural_sort("vrf") %} -| {{ not dhcp_server.disabled | arista.avd.default(false) }} | {{ dhcp_server.vrf }} | {{ dhcp_server.dns_domain_name_ipv4 | arista.avd.default("-") }} | {{ dhcp_server.dns_domain_name_ipv6 | arista.avd.default("-") }} | +{% set enabled = not dhcp_server.disabled | arista.avd.default(false) %} +{% set dns_domain_ipv4 = dhcp_server.dns_domain_name_ipv4 | arista.avd.default("-") %} +{% set dns_servers_ipv4 = dhcp_server.dns_servers_ipv4 | arista.avd.default(["-"]) | join(", ") %} +{% set tftp_server_file_ipv4 = dhcp_server.tftp_server.file_ipv4 | arista.avd.default("-") %} +{% set dns_domain_ipv6 = dhcp_server.dns_domain_name_ipv6 | arista.avd.default("-") %} +{% set dns_servers_ipv6 = dhcp_server.dns_servers_ipv6 | arista.avd.default(["-"]) | join(", ") %} +{% set tftp_server_file_ipv6 = dhcp_server.tftp_server.file_ipv6 | arista.avd.default("-") %} +| {{ enabled }} | {{ dhcp_server.vrf }} | {{ dns_domain_ipv4 }} | {{ dns_servers_ipv4 }} | {{ tftp_server_file_ipv4 }} | {{ dns_domain_ipv6 }} | {{ dns_servers_ipv6 }} | {{ tftp_server_file_ipv6 }} | {% endfor %} {% for dhcp_server in dhcp_servers | arista.avd.natural_sort("vrf") %} {% set dhcp_server_subnets = [] %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/dns-domain.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/dns-domain.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/dns-domain.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/dns-domain.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/domain-list.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/domain-list.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/domain-list.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/domain-list.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/dot1x.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/dot1x.j2 similarity index 68% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/dot1x.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/dot1x.j2 index 0d21566cd89..940165b4b68 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/dot1x.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/dot1x.j2 @@ -45,6 +45,48 @@ {% set framed_mtu = dot1x.radius_av_pair.framed_mtu | arista.avd.default('-') %} | {{ radius_av_pair_service }} | {{ framed_mtu }} | {% endif %} +{% if dot1x.captive_portal.enabled is arista.avd.defined(true) %} + +#### 802.1X Captive-portal authentication + +| Authentication Attribute | Value | +| ------------------------ | ----- | +{% if dot1x.captive_portal.url is arista.avd.defined %} +| URL | {{ dot1x.captive_portal.url }} | +{% endif %} +{% if dot1x.captive_portal.ssl_profile is arista.avd.defined %} +| SSL profile | {{ dot1x.captive_portal.ssl_profile }} | +{% endif %} +{% if dot1x.captive_portal.access_list_ipv4 is arista.avd.defined %} +| IPv4 Access-list | {{ dot1x.captive_portal.access_list_ipv4 }} | +{% endif %} +{% if dot1x.captive_portal.start_limit_infinite is arista.avd.defined(true) %} +| Start limit | Infinite | +{% endif %} +{% endif %} +{% if dot1x.supplicant is arista.avd.defined %} + +#### 802.1X Supplicant + +| Attribute | Value | +| --------- | ----- | +{% if dot1x.supplicant.logging is arista.avd.defined %} +| Logging | {{ dot1x.supplicant.logging }} | +{% endif %} +{% if dot1x.supplicant.disconnect_cached_results_timeout is arista.avd.defined %} +| Disconnect cached-results timeout | {{ dot1x.supplicant.disconnect_cached_results_timeout }} seconds | +{% endif %} +{% if dot1x.supplicant.profiles is arista.avd.defined %} + +##### 802.1X Supplicant profiles + +| Profile | EAP Method | Identity | SSL Profile | +| ------- | ---------- | -------- | ----------- | +{% for profile in dot1x.supplicant.profiles | arista.avd.natural_sort("name") %} +| {{ profile.name }} | {{ profile.eap_method | arista.avd.default("-") }} | {{ profile.identity | arista.avd.default("-") }} | {{ profile.ssl_profile | arista.avd.default("-") }} | +{% endfor %} +{% endif %} +{% endif %} {% endif %} {% if ethernet_interfaces_dot1x | length > 0 %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/dps-interfaces.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/dps-interfaces.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/dps-interfaces.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/dps-interfaces.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/dynamic-prefix-lists.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/dynamic-prefix-lists.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/dynamic-prefix-lists.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/dynamic-prefix-lists.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/enable-password.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/enable-password.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/enable-password.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/enable-password.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/eos-cli.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/eos-cli.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/eos-cli.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/eos-cli.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/errdisable.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/errdisable.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/errdisable.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/errdisable.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ethernet-interfaces.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ethernet-interfaces.j2 similarity index 91% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ethernet-interfaces.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ethernet-interfaces.j2 index ebc319ba4e4..020dec87b0f 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ethernet-interfaces.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ethernet-interfaces.j2 @@ -159,12 +159,63 @@ {% for vlan_translation in ethernet_interface.vlan_translations | arista.avd.natural_sort %} {% if vlan_translation.from is arista.avd.defined and vlan_translation.to is arista.avd.defined %} {% set row_direction = vlan_translation.direction | arista.avd.default('both') %} -| {{ ethernet_interface.name }} | {{ vlan_translation.from }} | {{ vlan_translation.to }} | {{ row_direction }} +| {{ ethernet_interface.name }} | {{ vlan_translation.from }} | {{ vlan_translation.to }} | {{ row_direction }} | {% endif %} {% endfor %} {% endif %} {% endfor %} {% endif %} +{# TCP MSS Clamping #} +{% set tcp_mss_clampings = [] %} +{% for ethernet_interface in ethernet_interfaces | arista.avd.natural_sort('name') %} +{% if ethernet_interface.tcp_mss_ceiling is arista.avd.defined %} +{% do tcp_mss_clampings.append(ethernet_interface) %} +{% endif %} +{% endfor %} +{% if tcp_mss_clampings | length > 0 %} + +##### TCP MSS Clamping + +| Interface | Ipv4 Segment Size | Ipv6 Segment Size | Direction | +| --------- | ----------------- | ----------------- | --------- | +{% for tcp_mss_clamping in tcp_mss_clampings | arista.avd.natural_sort('name') %} +{% set interface = tcp_mss_clamping.name %} +{% if tcp_mss_clamping.tcp_mss_ceiling.ipv4_segment_size is arista.avd.defined %} +{% set ipv4_segment_size = tcp_mss_clamping.tcp_mss_ceiling.ipv4_segment_size %} +{% endif %} +{% if tcp_mss_clamping.tcp_mss_ceiling.ipv6_segment_size is arista.avd.defined %} +{% set ipv6_segment_size = tcp_mss_clamping.tcp_mss_ceiling.ipv6_segment_size %} +{% endif %} +| {{ interface }} | {{ ipv4_segment_size | arista.avd.default("-") }} | {{ ipv6_segment_size | arista.avd.default("-") }} | {{ tcp_mss_clamping.tcp_mss_ceiling.direction | arista.avd.default("-") }} | +{% endfor %} +{% endif %} +{# Transceiver Settings #} +{% set transceiver_settings = [] %} +{% for ethernet_interface in ethernet_interfaces | arista.avd.natural_sort('name') %} +{% if ethernet_interface.transceiver is arista.avd.defined %} +{% do transceiver_settings.append(ethernet_interface) %} +{% endif %} +{% endfor %} +{% if transceiver_settings | length > 0 %} + +##### Transceiver Settings + +| Interface | Transceiver Frequency | Media Override | +| --------- | --------------------- | -------------- | +{% for transceiver_setting in transceiver_settings | arista.avd.natural_sort('name') %} +{% set interface = transceiver_setting.name %} +{% if transceiver_setting.transceiver.frequency is arista.avd.defined %} +{% set frequency = "%.3f" | format(transceiver_setting.transceiver.frequency | float) %} +{% if transceiver_setting.transceiver.frequency_unit is arista.avd.defined %} +{% set frequency = frequency ~ ' ' ~ transceiver_setting.transceiver.frequency_unit %} +{% endif %} +{% else %} +{% set frequency = '-' %} +{% endif %} +{% set m_override = transceiver_setting.transceiver.media.override | arista.avd.default('-') %} +| {{ interface }} | {{ frequency }} | {{ m_override }} | +{% endfor %} +{% endif %} {# Link Tracking Groups #} {% set link_tracking_interfaces = [] %} {% for ethernet_interface in ethernet_interfaces | arista.avd.natural_sort('name') %} @@ -303,6 +354,7 @@ {% endfor %} {% endif %} {% if port_channel_interface_ipv4.configured == true %} + *Inherited from Port-Channel Interface {% endif %} {# IP NAT Documentation #} @@ -374,12 +426,14 @@ {% endfor %} {% endif %} {% if port_channel_interface_ipv6.configured == true %} - *Inherited from Port-Channel Interface + +*Inherited from Port-Channel Interface {% endif %} {# ISIS #} {% set ethernet_interfaces_isis = [] %} {% for ethernet_interface in ethernet_interfaces | arista.avd.natural_sort('name') %} {% if ethernet_interface.isis_enable is arista.avd.defined or + ethernet_interface.isis_bfd is arista.avd.defined or ethernet_interface.isis_metric is arista.avd.defined or ethernet_interface.isis_circuit_type is arista.avd.defined or ethernet_interface.isis_network_point_to_point is arista.avd.defined or @@ -392,6 +446,7 @@ {% set port_channel_interfaces_isis = [] %} {% for port_channel_interface in port_channel_interfaces | arista.avd.natural_sort('name') %} {% if port_channel_interface.isis_enable is arista.avd.defined or + port_channel_interface.isis_bfd is arista.avd.defined or port_channel_interface.isis_metric is arista.avd.defined or port_channel_interface.isis_circuit_type is arista.avd.defined or port_channel_interface.isis_network_point_to_point is arista.avd.defined or @@ -448,8 +503,8 @@ ##### ISIS -| Interface | Channel Group | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Interface | Channel Group | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | {% for ethernet_interface in ethernet_interfaces | arista.avd.natural_sort('name') %} {% if ethernet_interface.channel_group.id is arista.avd.defined %} {% set port_channel_interface_name = 'Port-Channel' ~ ethernet_interface.channel_group.id %} @@ -458,6 +513,7 @@ {% if port_channel_interface is arista.avd.defined %} {% set channel_group = ethernet_interface.channel_group.id | arista.avd.default("-") %} {% set isis_instance = port_channel_interface.isis_enable | arista.avd.default("-") %} +{% set isis_bfd = port_channel_interface.isis_bfd | arista.avd.default("-") %} {% set isis_metric = port_channel_interface.isis_metric | arista.avd.default("-") %} {% set isis_circuit_type = port_channel_interface.isis_circuit_type | arista.avd.default("-") %} {% set isis_hello_padding = port_channel_interface.isis_hello_padding | arista.avd.default("-") %} @@ -469,12 +525,13 @@ {% else %} {% set mode = "-" %} {% endif %} -| {{ ethernet_interface.name }} | {{ channel_group }} | *{{ isis_instance }} | *{{ isis_metric }} | *{{ mode }} | *{{ isis_circuit_type }} | *{{ isis_hello_padding }} | *{{ isis_authentication_mode }} | +| {{ ethernet_interface.name }} | {{ channel_group }} | *{{ isis_instance }} | {{ isis_bfd }} | *{{ isis_metric }} | *{{ mode }} | *{{ isis_circuit_type }} | *{{ isis_hello_padding }} | *{{ isis_authentication_mode }} | {% endif %} {% else %} {% if ethernet_interface in ethernet_interfaces_isis %} {% set channel_group = ethernet_interface.channel_group.id | arista.avd.default("-") %} {% set isis_instance = ethernet_interface.isis_enable | arista.avd.default("-") %} +{% set isis_bfd = ethernet_interface.isis_bfd | arista.avd.default("-") %} {% set isis_metric = ethernet_interface.isis_metric | arista.avd.default("-") %} {% set isis_circuit_type = ethernet_interface.isis_circuit_type | arista.avd.default("-") %} {% set isis_hello_padding = ethernet_interface.isis_hello_padding | arista.avd.default("-") %} @@ -486,13 +543,14 @@ {% else %} {% set mode = "-" %} {% endif %} -| {{ ethernet_interface.name }} | {{ channel_group }} | {{ isis_instance }} | {{ isis_metric }} | {{ mode }} | {{ isis_circuit_type }} | {{ isis_hello_padding }} | {{ isis_authentication_mode }} | +| {{ ethernet_interface.name }} | {{ channel_group }} | {{ isis_instance }} | {{ isis_bfd }} | {{ isis_metric }} | {{ mode }} | {{ isis_circuit_type }} | {{ isis_hello_padding }} | {{ isis_authentication_mode }} | {% endif %} {% endif %} {% endfor %} {% endif %} {% if port_channel_interfaces_isis | length > 0 %} - *Inherited from Port-Channel Interface + +*Inherited from Port-Channel Interface {% endif %} {# EVPN Multihoming #} {% set evpn_es_ethernet_interfaces = [] %} diff --git a/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/event-handlers.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/event-handlers.j2 new file mode 100644 index 00000000000..0cbbec7830c --- /dev/null +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/event-handlers.j2 @@ -0,0 +1,108 @@ +{# + Copyright (c) 2023-2024 Arista Networks, Inc. + Use of this source code is governed by the Apache License 2.0 + that can be found in the LICENSE file. +#} +{# doc - event handlers #} +{% if event_handlers is arista.avd.defined %} + +### Event Handler + +#### Event Handler Summary + +| Handler | Actions | Trigger | Trigger Config | +| ------- | ------- | ------- | -------------- | +{% for handler in event_handlers | arista.avd.natural_sort('name') %} +{% if handler.action_type is arista.avd.defined %} +{% set actions = handler.action_type %} +{% if handler.action is arista.avd.defined %} +{% set action = handler.action | replace('|', '\|') %} +{% set actions = actions ~ ' ' ~ action ~ '' %} +{% endif %} +{% endif %} +{% if handler.actions is arista.avd.defined %} +{% set actions = [] %} +{% if handler.actions.bash_command is arista.avd.defined %} +{% set bash_command = handler.actions.bash_command | replace('\n', '\\n') | replace('|', '\|') %} +{% set bash_command = '' ~ bash_command ~ '' %} +{% set bash_command = "bash " ~ bash_command %} +{% do actions.append(bash_command) %} +{% elif handler.actions.log is arista.avd.defined %} +{% do actions.append("log") %} +{% endif %} +{% if handler.actions.increment_device_health_metric is arista.avd.defined %} +{% set metric = "increment device health metric " ~ handler.actions.increment_device_health_metric %} +{% do actions.append(metric) %} +{% endif %} +{% set actions = actions | join("
") %} +{% endif %} +{% if handler.trigger is arista.avd.defined("on-maintenance") + and handler.trigger_on_maintenance.operation is arista.avd.defined + and handler.trigger_on_maintenance.action is arista.avd.defined %} +{% set trigger_cli = "trigger " ~ handler.trigger ~ " " ~ handler.trigger_on_maintenance.operation %} +{% if handler.trigger_on_maintenance.bgp_peer is arista.avd.defined %} +{% set on_maintenance_cli = "bgp " ~ handler.trigger_on_maintenance.bgp_peer %} +{% if handler.trigger_on_maintenance.vrf is arista.avd.defined %} +{% set on_maintenance_cli = on_maintenance_cli ~ " vrf " ~ handler.trigger_on_maintenance.vrf %} +{% endif %} +{% elif handler.trigger_on_maintenance.interface is arista.avd.defined %} +{% set on_maintenance_cli = "interface " ~ handler.trigger_on_maintenance.interface %} +{% elif handler.trigger_on_maintenance.unit is arista.avd.defined %} +{% set on_maintenance_cli = "unit " ~ handler.trigger_on_maintenance.unit %} +{% endif %} +{% if on_maintenance_cli is arista.avd.defined %} +{% if handler.trigger_on_maintenance.action is arista.avd.defined %} +{% if handler.trigger_on_maintenance.action in ["after", "before"] and handler.trigger_on_maintenance.stage is arista.avd.defined %} +{% set trigger_config = trigger_cli ~ " " ~ on_maintenance_cli ~ " " ~ handler.trigger_on_maintenance.action ~ " stage " ~ handler.trigger_on_maintenance.stage %} +{% elif handler.trigger_on_maintenance.action in ["all", "begin", "end"] %} +{% set trigger_config = trigger_cli ~ " " ~ on_maintenance_cli ~ " " ~ handler.trigger_on_maintenance.action %} +{% endif %} +{% endif %} +{% endif %} +{% elif handler.trigger is arista.avd.defined("on-counters") and handler.trigger_on_counters is arista.avd.defined %} +{% set trigger_config = [] %} +{% if handler.trigger_on_counters.poll_interval is arista.avd.defined %} +{% do trigger_config.append("poll interval " ~ handler.trigger_on_counters.poll_interval) %} +{% endif %} +{% if handler.trigger_on_counters.condition is arista.avd.defined %} +{% do trigger_config.append("condition " ~ handler.trigger_on_counters.condition) %} +{% endif %} +{% if handler.trigger_on_counters.granularity_per_source is arista.avd.defined(true) %} +{% do trigger_config.append("granularity per-source") %} +{% endif %} +{% set trigger_config = trigger_config | join("
") %} +{% elif handler.trigger is arista.avd.defined("on-logging") and handler.trigger_on_logging is arista.avd.defined %} +{% set trigger_config = [] %} +{% if handler.trigger_on_logging.poll_interval is arista.avd.defined %} +{% do trigger_config.append("poll interval " ~ handler.trigger_on_logging.poll_interval) %} +{% endif %} +{% if handler.trigger_on_logging.regex is arista.avd.defined %} +{% do trigger_config.append("regex " ~ handler.trigger_on_logging.regex) %} +{% endif %} +{% set trigger_config = trigger_config | join("
") %} +{% elif handler.trigger is arista.avd.defined("on-intf") %} +{% if handler.trigger_on_intf.interface is arista.avd.defined and + (handler.trigger_on_intf.ip is arista.avd.defined(true) or + handler.trigger_on_intf.ipv6 is arista.avd.defined(true) or + handler.trigger_on_intf.operstatus is arista.avd.defined(true)) %} +{% set trigger_config = "trigger on-intf " ~ handler.trigger_on_intf.interface %} +{% if handler.trigger_on_intf.operstatus is arista.avd.defined(true) %} +{% set trigger_config = trigger_config ~ " operstatus" %} +{% endif %} +{% if handler.trigger_on_intf.ip is arista.avd.defined(true) %} +{% set trigger_config = trigger_config ~ " ip" %} +{% endif %} +{% if handler.trigger_on_intf.ipv6 is arista.avd.defined(true) %} +{% set trigger_config = trigger_config ~ " ip6" %} +{% endif %} +{% endif %} +{% endif %} +| {{ handler.name }} | {{ actions | arista.avd.default("-") }} | {{ handler.trigger | arista.avd.default("-") }} | {{ trigger_config | arista.avd.default("-") }} | +{% endfor %} + +#### Event Handler Device Configuration + +```eos +{% include 'eos/event-handlers.j2' %} +``` +{% endif %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/filters.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/filters.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/filters.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/filters.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/flow-tracking.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/flow-tracking.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/flow-tracking.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/flow-tracking.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/hardware-counters.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/hardware-counters.j2 similarity index 96% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/hardware-counters.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/hardware-counters.j2 index 25b78cff431..e991b2d72c9 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/hardware-counters.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/hardware-counters.j2 @@ -13,7 +13,7 @@ ##### Hardware Counter Features -**NOTE:** Not all options (columns) in the table below are compatible with every available feature, it is the user responsability to configure valid options for each feature. +**NOTE:** Not all options (columns) in the table below are compatible with every available feature, it is the user responsibility to configure valid options for each feature. | Feature | Flow Direction | Address Type | Layer3 | VRF | Prefix | Units Packets | | ------- | -------------- | ------------ | ------ | --- | ------ | ------------- | diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/interface-defaults.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/interface-defaults.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/interface-defaults.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/interface-defaults.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/interface-groups.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/interface-groups.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/interface-groups.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/interface-groups.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/interface-profiles.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/interface-profiles.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/interface-profiles.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/interface-profiles.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/interfaces-ip-nat.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/interfaces-ip-nat.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/interfaces-ip-nat.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/interfaces-ip-nat.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/interfaces.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/interfaces.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/interfaces.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/interfaces.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ip-access-lists.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ip-access-lists.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ip-access-lists.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ip-access-lists.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ip-client-source-interfaces.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ip-client-source-interfaces.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ip-client-source-interfaces.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ip-client-source-interfaces.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ip-community-lists.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ip-community-lists.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ip-community-lists.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ip-community-lists.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ip-dhcp-relay.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ip-dhcp-relay.j2 similarity index 60% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ip-dhcp-relay.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ip-dhcp-relay.j2 index 8c3a1a42cdb..c9da1f18003 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ip-dhcp-relay.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ip-dhcp-relay.j2 @@ -8,11 +8,19 @@ ## IP DHCP Relay -### IP DHCP Relay +### IP DHCP Relay Summary {% if ip_dhcp_relay.information_option is arista.avd.defined(true) %} IP DHCP Relay Option 82 is enabled. {% endif %} +{% if ip_dhcp_relay.always_on is arista.avd.defined(true) %} + +DhcpRelay Agent is in always-on mode. +{% endif %} +{% if ip_dhcp_relay.all_subnets is arista.avd.defined(true) %} + +Forwarding requests with secondary IP addresses in the "giaddr" field is allowed. +{% endif %} ### IP DHCP Relay Device Configuration diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ip-dhcp-snooping.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ip-dhcp-snooping.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ip-dhcp-snooping.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ip-dhcp-snooping.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ip-domain-lookup.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ip-domain-lookup.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ip-domain-lookup.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ip-domain-lookup.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ip-extcommunity-lists-regexp.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ip-extcommunity-lists-regexp.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ip-extcommunity-lists-regexp.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ip-extcommunity-lists-regexp.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ip-extcommunity-lists.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ip-extcommunity-lists.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ip-extcommunity-lists.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ip-extcommunity-lists.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ip-igmp-snooping.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ip-igmp-snooping.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ip-igmp-snooping.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ip-igmp-snooping.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ip-name-servers.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ip-name-servers.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ip-name-servers.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ip-name-servers.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ip-nat.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ip-nat.j2 similarity index 87% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ip-nat.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ip-nat.j2 index 1aa3adeaa70..0c6d0f1f109 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ip-nat.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ip-nat.j2 @@ -130,34 +130,39 @@ NAT profile VRF is: {{ profile.vrf }} {% if ip_nat.pools is arista.avd.defined %} ### NAT Pools -{% for pool in ip_nat.pools %} -#### Pool: {{ pool.name }} - -| Setting | Value | -| -------- | ----- | -| Pool Prefix Length | {{ pool.prefix_length }} | -{% if pool.utilization_log_threshold is arista.avd.defined %} -| Pool Utilization Threshold | {{ pool.utilization_log_threshold }} % (action: log) | +| Pool Name | Pool Type | Prefix Length | Utilization Log Threshold | First-Last IP Addresses | First-Last Ports | +| --------- | --------- | ------------- | ------------------------- | ----------------------- | ---------------- | +{% for pool in ip_nat.pools | arista.avd.natural_sort('name') %} +{% set pool_name = pool.name %} +{% set pool_type = pool.type | arista.avd.default('ip-port') %} +{% if pool_type == 'ip-port' %} +{% set prefix_length = pool.prefix_length | arista.avd.default('-') %} +{% set utilization_log_threshold = pool.utilization_log_threshold | arista.avd.default('-') %} {% endif %} - -##### Pool Ranges - -| First IP Address | Last IP Address | First Port | Last Port | -| ----------------- | --------------- | ---------- | --------- | +{% set first_last_ip = [] %} +{% set first_last_port = [] %} {% for range in pool.ranges | arista.avd.default([]) %} -| {{ range.first_ip }} | {{ range.last_ip }} | {{ range.first_port | arista.avd.default('-') }} | {{ range.last_port | arista.avd.default('-') }} | +{% if pool_type == 'ip-port' %} +{% do first_last_ip.append(range.first_ip | arista.avd.default('') ~ '-' ~ range.last_ip | arista.avd.default('')) %} +{% endif %} +{% do first_last_port.append(range.first_port | arista.avd.default('') ~ '-' ~ range.last_port | arista.avd.default('')) %} {% endfor %} +{% if first_last_ip == [] %} +{% set first_last_ip = '-' %} +{% endif %} +{% if first_last_port == [] %} +{% set first_last_port = '-' %} +{% endif %} +| {{ pool_name }} | {{ pool_type }} | {{ prefix_length | arista.avd.default('-') }} | {{ utilization_log_threshold | arista.avd.default('-') }} | {{ first_last_ip | join('
') }} | {{ first_last_port | join('
') }} | {% endfor %} -{% endif %} -{% if ip_nat.synchronization is arista.avd.defined %} ### NAT Synchronization | Setting | Value | | -------- | ----- | {% if ip_nat.synchronization.shutdown | arista.avd.default(false) %} -| State | Disabled ! +| State | Disabled | {% else %} | State | Enabled ! {% endif %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ip-radius-source-interfaces.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ip-radius-source-interfaces.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ip-radius-source-interfaces.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ip-radius-source-interfaces.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ip-routing.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ip-routing.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ip-routing.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ip-routing.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ip-security.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ip-security.j2 similarity index 85% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ip-security.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ip-security.j2 index 424e2219701..aabcc77660b 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ip-security.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ip-security.j2 @@ -25,10 +25,13 @@ ### Security Association policies -| Policy name | ESP Integrity | ESP Encryption | PFS DH Group | -| ----------- | ------------- | -------------- | ------------ | +| Policy name | ESP Integrity | ESP Encryption | Lifetime | PFS DH Group | +| ----------- | ------------- | -------------- | -------- | ------------ | {% for sa_policy in ip_security.sa_policies | arista.avd.default([]) %} -| {{ sa_policy.name }} | {{ sa_policy.esp.integrity | arista.avd.default("-") }} | {{ sa_policy.esp.encryption | arista.avd.default("-") }} | {{ sa_policy.pfs_dh_group | arista.avd.default("-") }} | +{% if sa_policy.sa_lifetime.value is arista.avd.defined %} +{% set lifetime = sa_policy.sa_lifetime.value ~ " " ~ sa_policy.sa_lifetime.unit | arista.avd.default("hours") %} +{% endif %} +| {{ sa_policy.name }} | {{ sa_policy.esp.integrity | arista.avd.default("-") }} | {{ sa_policy.esp.encryption | arista.avd.default("-") }} | {{ lifetime | arista.avd.default("-") }} | {{ sa_policy.pfs_dh_group | arista.avd.default("-") }} | {% endfor %} {% endif %} {% if ip_security.profiles is arista.avd.defined %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ip-tacacs-source-interfaces.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ip-tacacs-source-interfaces.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ip-tacacs-source-interfaces.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ip-tacacs-source-interfaces.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ip-virtual-router-mac-address.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ip-virtual-router-mac-address.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ip-virtual-router-mac-address.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ip-virtual-router-mac-address.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ipv6-access-lists.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ipv6-access-lists.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ipv6-access-lists.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ipv6-access-lists.j2 diff --git a/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ipv6-dhcp-relay.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ipv6-dhcp-relay.j2 new file mode 100644 index 00000000000..27ab7a39cf3 --- /dev/null +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ipv6-dhcp-relay.j2 @@ -0,0 +1,41 @@ +{# + Copyright (c) 2023-2024 Arista Networks, Inc. + Use of this source code is governed by the Apache License 2.0 + that can be found in the LICENSE file. +#} +{# doc - ip dhcp relay #} +{% if ipv6_dhcp_relay is arista.avd.defined %} + +## IPv6 DHCP Relay + +### IPv6 DHCP Relay Summary +{% if ipv6_dhcp_relay.always_on is arista.avd.defined(true) %} + +DhcpRelay Agent is in always-on mode. +{% endif %} +{% if ipv6_dhcp_relay.all_subnets is arista.avd.defined(true) %} + +Forwarding requests with additional IPv6 addresses in the "giaddr" field is allowed. +{% endif %} +{% if ipv6_dhcp_relay.option is arista.avd.defined() %} +{% if ipv6_dhcp_relay.option.link_layer_address is arista.avd.defined(true) %} + +Add Option 79 - Link Layer Address Option. +{% endif %} +{% if ipv6_dhcp_relay.option.remote_id_format is arista.avd.defined() %} +{% if ipv6_dhcp_relay.option.remote_id_format == "%m:%i" %} + +Add RemoteID option 37 in format MAC address and interface ID. +{% elif ipv6_dhcp_relay.option.remote_id_format == "%m:%p" %} + +Add RemoteID option 37 in format MAC address and interface name. +{% endif %} +{% endif %} +{% endif %} + +### IPv6 DHCP Relay Device Configuration + +```eos +{% include 'eos/ipv6-dhcp-relay.j2' %} +``` +{% endif %} diff --git a/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ipv6-neighbors.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ipv6-neighbors.j2 new file mode 100644 index 00000000000..5f71047b75a --- /dev/null +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ipv6-neighbors.j2 @@ -0,0 +1,36 @@ +{# + Copyright (c) 2023-2024 Arista Networks, Inc. + Use of this source code is governed by the Apache License 2.0 + that can be found in the LICENSE file. +#} +{# doc - ipv6 neighbors #} +{% if ipv6_neighbor is arista.avd.defined %} + +### IPv6 Neighbors +{% if ipv6_neighbor.persistent.enabled is arista.avd.defined(true) %} +{% set persistent_doc = "IPv6 neighbor cache persistency is enabled." %} +{% if ipv6_neighbor.persistent.refresh_delay is arista.avd.defined %} +{% set persistent_doc = persistent_doc ~ " The refresh-delay is " ~ ipv6_neighbor.persistent.refresh_delay ~ " seconds after reboot." %} +{% endif %} + +{{ persistent_doc }} +{% endif %} +{% if ipv6_neighbor.static_entries is arista.avd.defined %} + +#### IPv6 Static Neighbors + +| VRF | IPv6 Address | Exit Interface | MAC Address | +| --- | ------------ | -------------- | ----------- | +{% for neighbor in ipv6_neighbor.static_entries %} +{% if neighbor.ipv6_address is arista.avd.defined and neighbor.interface is arista.avd.defined and neighbor.mac_address is arista.avd.defined %} +| {{ neighbor.vrf | arista.avd.default("-") }} | {{ neighbor.ipv6_address }} | {{ neighbor.interface }} | {{ neighbor.mac_address }} | +{% endif %} +{% endfor %} +{% endif %} + +#### IPv6 Neighbor Configuration + +```eos +{% include 'eos/ipv6-neighbors.j2' %} +``` +{% endif %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ipv6-prefix-lists.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ipv6-prefix-lists.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ipv6-prefix-lists.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ipv6-prefix-lists.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ipv6-standard-access-lists.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ipv6-standard-access-lists.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ipv6-standard-access-lists.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ipv6-standard-access-lists.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ipv6-static-routes.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ipv6-static-routes.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ipv6-static-routes.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ipv6-static-routes.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ipv6-unicast-routing.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ipv6-unicast-routing.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ipv6-unicast-routing.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ipv6-unicast-routing.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/l2-protocol-forwarding.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/l2-protocol-forwarding.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/l2-protocol-forwarding.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/l2-protocol-forwarding.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/lacp.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/lacp.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/lacp.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/lacp.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/link-tracking-groups.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/link-tracking-groups.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/link-tracking-groups.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/link-tracking-groups.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/lldp.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/lldp.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/lldp.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/lldp.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/local-users.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/local-users.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/local-users.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/local-users.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/logging.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/logging.j2 similarity index 88% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/logging.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/logging.j2 index f4ffd90eb43..0f8c7d0273a 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/logging.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/logging.j2 @@ -69,6 +69,16 @@ {% endif %} {% endfor %} {% endif %} +{% if logging.level is arista.avd.defined %} + +| Facility | Severity | +| -------- | -------- | +{% for level in logging.level | arista.avd.natural_sort('facility') %} +{% if level.severity is arista.avd.defined %} +| {{ level.facility }} | {{ level.severity }} | +{% endif %} +{% endfor %} +{% endif %} {% if logging.facility is arista.avd.defined %} **Syslog facility value:** {{ logging.facility }} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/loopback-interfaces.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/loopback-interfaces.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/loopback-interfaces.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/loopback-interfaces.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/mac-access-lists.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/mac-access-lists.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/mac-access-lists.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/mac-access-lists.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/mac-address-table.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/mac-address-table.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/mac-address-table.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/mac-address-table.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/mac-security.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/mac-security.j2 similarity index 80% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/mac-security.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/mac-security.j2 index 58e1d04bb0f..4e43c9a5ee9 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/mac-security.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/mac-security.j2 @@ -28,13 +28,17 @@ FIPS restrictions enabled. ###### Settings -| Cipher | Key-Server Priority | Rekey-Period | SCI | -| ------ | ------------------- | ------------ | --- | +| Cipher | Key-Server Priority | Rekey-Period | SCI | Traffic Unprotected Fallback | +| ------ | ------------------- | ------------ | --- | ---------------------------- | {% set cipher = profile.cipher | arista.avd.default('-') %} {% set key_server_priority = profile.mka.key_server_priority | arista.avd.default('-') %} {% set rekey_period = profile.mka.session.rekey_period | arista.avd.default('-') %} {% set sci = profile.sci | arista.avd.default('-') %} -| {{ cipher }} | {{ key_server_priority }} | {{ rekey_period }} | {{ sci }} | +{% set traffic_unprotected = profile.traffic_unprotected.action | arista.avd.default('-') %} +{% if traffic_unprotected == "allow" and profile.traffic_unprotected.allow_active_sak is arista.avd.defined(true) %} +{% set traffic_unprotected = traffic_unprotected ~ " active-sak" %} +{% endif %} +| {{ cipher }} | {{ key_server_priority }} | {{ rekey_period }} | {{ sci }} | {{ traffic_unprotected }} | {% if profile.connection_keys is arista.avd.defined %} ###### Keys diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/maintenance-mode.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/maintenance-mode.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/maintenance-mode.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/maintenance-mode.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/maintenance.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/maintenance.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/maintenance.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/maintenance.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/management-accounts.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/management-accounts.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/management-accounts.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/management-accounts.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/management-api-gnmi.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/management-api-gnmi.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/management-api-gnmi.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/management-api-gnmi.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/management-api-http.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/management-api-http.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/management-api-http.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/management-api-http.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/management-api-models.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/management-api-models.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/management-api-models.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/management-api-models.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/management-console.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/management-console.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/management-console.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/management-console.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/management-cvx.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/management-cvx.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/management-cvx.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/management-cvx.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/management-defaults.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/management-defaults.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/management-defaults.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/management-defaults.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/management-interfaces.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/management-interfaces.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/management-interfaces.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/management-interfaces.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/management-security.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/management-security.j2 similarity index 73% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/management-security.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/management-security.j2 index bb369e3015c..aeacba5b5c7 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/management-security.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/management-security.j2 @@ -15,6 +15,15 @@ {% if management_security.entropy_source is arista.avd.defined %} | Entropy source | {{ management_security.entropy_source }} | {% endif %} +{% if management_security.entropy_sources is arista.avd.defined %} +{% set entropy_sources = [] %} +{% for source in ['hardware', 'haveged', 'cpu_jitter', 'hardware_exclusive'] %} +{% if management_security.entropy_sources[source] is arista.avd.defined(true) %} +{% do entropy_sources.append(source.replace("_", " ")) %} +{% endif %} +{% endfor %} +| Entropy sources | {{ entropy_sources | join(", ") }} | +{% endif %} {% if management_security.password.encryption_key_common is arista.avd.defined %} | Common password encryption key | {{ management_security.password.encryption_key_common }} | {% endif %} @@ -120,6 +129,41 @@ | {{ policy.name }} | > {{ min_digits }} | > {{ min_length }} | > {{ min_lower }} | > {{ min_special }} | > {{ min_upper }} | < {{ max_repetitive }} | < {{ max_sequential }} | {% endfor %} {% endif %} +{% if management_security.shared_secret_profiles is arista.avd.defined %} + +### Session Shared-secret Profiles +{% for profile in management_security.shared_secret_profiles | arista.avd.natural_sort("profile") %} + +#### {{ profile.profile }} + +| Secret Name | Receive Lifetime | Transmit Lifetime | Timezone | +| ----------- | ---------------- | ----------------- | -------- | +{% for secret in profile.secrets | arista.avd.natural_sort("name") %} +{% if secret.secret is arista.avd.defined and + ((secret.receive_lifetime.infinite is arista.avd.defined(true) or + (secret.receive_lifetime.start_date_time and secret.receive_lifetime.end_date_time is arista.avd.defined)) and + (secret.transmit_lifetime.infinite is arista.avd.defined(true) or + (secret.transmit_lifetime.start_date_time and secret.transmit_lifetime.end_date_time is arista.avd.defined))) %} +{% if secret.local_time is arista.avd.defined(true) %} +{% set timezone = "Local Time" %} +{% else %} +{% set timezone = "UTC" %} +{% endif %} +{% if secret.receive_lifetime.infinite is arista.avd.defined(true) %} +{% set receive_lifetime = "Infinite" %} +{% else %} +{% set receive_lifetime = secret.receive_lifetime.start_date_time ~ " - " ~ secret.receive_lifetime.end_date_time %} +{% endif %} +{% if secret.transmit_lifetime.infinite is arista.avd.defined(true) %} +{% set transmit_lifetime = "Infinite" %} +{% else %} +{% set transmit_lifetime = secret.transmit_lifetime.start_date_time ~ " - " ~ secret.transmit_lifetime.end_date_time %} +{% endif %} +| {{ secret.name }} | {{ receive_lifetime | arista.avd.default("-") }} | {{ transmit_lifetime | arista.avd.default("-") }} | {{ timezone }} | +{% endif %} +{% endfor %} +{% endfor %} +{% endif %} ### Management Security Device Configuration diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/management-ssh.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/management-ssh.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/management-ssh.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/management-ssh.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/management-tech-support.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/management-tech-support.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/management-tech-support.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/management-tech-support.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/management.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/management.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/management.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/management.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/match-list-input.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/match-list-input.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/match-list-input.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/match-list-input.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/mcs-client.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/mcs-client.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/mcs-client.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/mcs-client.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/mlag-configuration.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/mlag-configuration.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/mlag-configuration.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/mlag-configuration.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/monitor-connectivity.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/monitor-connectivity.j2 similarity index 80% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/monitor-connectivity.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/monitor-connectivity.j2 index befe103938f..0e1f86db500 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/monitor-connectivity.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/monitor-connectivity.j2 @@ -24,18 +24,18 @@ #### Probing Configuration -| Enabled | Interval | Default Interface Set | -| ------- | -------- | --------------------- | -| {{ not monitor_connectivity.shutdown | arista.avd.default(true) }} | {{ monitor_connectivity.interval | arista.avd.default('-') }} | {{ monitor_connectivity.local_interfaces | arista.avd.default('-') }} | +| Enabled | Interval | Default Interface Set | Address Only | +| ------- | -------- | --------------------- | ------------ | +| {{ not monitor_connectivity.shutdown | arista.avd.default(true) }} | {{ monitor_connectivity.interval | arista.avd.default('-') }} | {{ monitor_connectivity.local_interfaces | arista.avd.default('-') }} | {{ monitor_connectivity.address_only | arista.avd.default(true) }} | {% if monitor_connectivity.hosts is arista.avd.defined %} #### Host Parameters -| Host Name | Description | IPv4 Address | Probing Interface Set | URL | -| --------- | ----------- | ------------ | --------------------- | --- | +| Host Name | Description | IPv4 Address | Probing Interface Set | Address Only | URL | +| --------- | ----------- | ------------ | --------------------- | ------------ | --- | {% for host in monitor_connectivity.hosts | arista.avd.natural_sort('name') %} {% if host.name is arista.avd.defined %} -| {{ host.name }} | {{ host.description | arista.avd.default('-') }} | {{ host.ip | arista.avd.default('-') }} | {{ host.local_interfaces | arista.avd.default('-') }} | {{ host.url | arista.avd.default('-') }} | +| {{ host.name }} | {{ host.description | arista.avd.default('-') }} | {{ host.ip | arista.avd.default('-') }} | {{ host.local_interfaces | arista.avd.default('-') }} | {{ host.address_only | arista.avd.default(true) }} | {{ host.url | arista.avd.default('-') }} | {% endif %} {% endfor %} {% endif %} @@ -43,11 +43,11 @@ ### VRF Configuration -| Name | Description | Default Interface Set | -| ---- | ----------- | --------------------- | +| Name | Description | Default Interface Set | Address Only | +| ---- | ----------- | --------------------- | ------------ | {% for vrf in monitor_connectivity.vrfs | arista.avd.natural_sort('name') %} {% if vrf.name is arista.avd.defined %} -| {{ vrf.name }} | {{ vrf.description | arista.avd.default('-') }} | {{ vrf.local_interfaces | arista.avd.default('-') }} | +| {{ vrf.name }} | {{ vrf.description | arista.avd.default('-') }} | {{ vrf.local_interfaces | arista.avd.default('-') }} | {{ vrf.address_only | arista.avd.default(true) }} | {% endif %} {% endfor %} {% for vrf in monitor_connectivity.vrfs | arista.avd.natural_sort('name') %} @@ -70,11 +70,11 @@ ##### Host Parameters -| Host Name | Description | IPv4 Address | Probing Interface Set | URL | -| --------- | ----------- | ------------ | --------------------- | --- | +| Host Name | Description | IPv4 Address | Probing Interface Set | Address Only | URL | +| --------- | ----------- | ------------ | --------------------- | ------------ | --- | {% for host in vrf.hosts | arista.avd.natural_sort('name') %} {% if host.name is arista.avd.defined %} -| {{ host.name }} | {{ host.description | arista.avd.default('-') }} | {{ host.ip | arista.avd.default('-') }} | {{ host.local_interfaces | arista.avd.default('-') }} | {{ host.url | arista.avd.default('-') }} | +| {{ host.name }} | {{ host.description | arista.avd.default('-') }} | {{ host.ip | arista.avd.default('-') }} | {{ host.local_interfaces | arista.avd.default('-') }} | {{ host.address_only | arista.avd.default(true) }} | {{ host.url | arista.avd.default('-') }} | {% endif %} {% endfor %} {% endif %} diff --git a/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/monitor-layer1.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/monitor-layer1.j2 new file mode 100644 index 00000000000..d3982615910 --- /dev/null +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/monitor-layer1.j2 @@ -0,0 +1,31 @@ +{# + Copyright (c) 2023-2024 Arista Networks, Inc. + Use of this source code is governed by the Apache License 2.0 + that can be found in the LICENSE file. +#} +{# doc - monitor layer1 #} +{% if monitor_layer1.enabled is arista.avd.defined(true) %} + +## Monitor Layer 1 Logging + +| Layer 1 Event | Logging | +| ------------- | ------- | +{% if monitor_layer1.logging_mac_fault is arista.avd.defined %} +| MAC fault | {{ monitor_layer1.logging_mac_fault }} | +{% endif %} +{% if monitor_layer1.logging_transceiver.enabled is arista.avd.defined %} +| Logging Transceiver | {{ monitor_layer1.logging_transceiver.enabled }} | +{% endif %} +{% if monitor_layer1.logging_transceiver.dom is arista.avd.defined %} +| Transceiver DOM | {{ monitor_layer1.logging_transceiver.dom }} | +{% endif %} +{% if monitor_layer1.logging_transceiver.communication is arista.avd.defined %} +| Transceiver communication | {{ monitor_layer1.logging_transceiver.communication }} | +{% endif %} + +### Monitor Layer 1 Device Configuration + +```eos +{% include 'eos/monitor-layer1.j2' %} +``` +{% endif %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/monitor-sessions.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/monitor-sessions.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/monitor-sessions.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/monitor-sessions.j2 diff --git a/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/monitor-telemetry-influx.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/monitor-telemetry-influx.j2 new file mode 100644 index 00000000000..8425dad2970 --- /dev/null +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/monitor-telemetry-influx.j2 @@ -0,0 +1,52 @@ +{# + Copyright (c) 2023-2024 Arista Networks, Inc. + Use of this source code is governed by the Apache License 2.0 + that can be found in the LICENSE file. +#} +{# doc - monitor telemetry influx #} +{% if monitor_telemetry_influx is arista.avd.defined %} + +## InfluxDB Telemetry + +### InfluxDB Telemetry Summary +{% if monitor_telemetry_influx.source_group_standard_disabled is arista.avd.defined(true) %} + +Source Group Standard Disabled : {{ monitor_telemetry_influx.source_group_standard_disabled }} +{% endif %} +{% if monitor_telemetry_influx.destinations is arista.avd.defined %} + +#### InfluxDB Telemetry Destinations + +| Destination | Database | URL | VRF | Username | +| ----------- | -------- | --- | --- | -------- | +{% for destination in monitor_telemetry_influx.destinations | arista.avd.natural_sort('name') %} +| {{ destination.name | arista.avd.default('-') }} | {{ destination.database | arista.avd.default('-') }} | {{ destination.url | arista.avd.default('-') }} | {{ monitor_telemetry_influx.vrf | arista.avd.default('-') }} | {{ destination.username | arista.avd.default('-') }} | +{% endfor %} +{% endif %} +{% if monitor_telemetry_influx.source_sockets is arista.avd.defined %} + +#### InfluxDB Telemetry Sources + +| Source Name | URL | Connection Limit | +| ----------- | --- | ---------------- | +{% for source in monitor_telemetry_influx.source_sockets | arista.avd.natural_sort('name') %} +| {{ source.name | arista.avd.default('-') }} | {{ source.url | arista.avd.default('-') }} | {{ source.connection_limit | arista.avd.default('-') }} | +{% endfor %} +{% endif %} +{% if monitor_telemetry_influx.tags is arista.avd.defined %} + +#### InfluxDB Telemetry Tags + +| Tag | Value | +| --- | ----- | +{% for tag in monitor_telemetry_influx.tags %} +| {{ tag.name | arista.avd.default('-') }} | {{ tag.value | arista.avd.default('-') }} | +{% endfor %} +{% endif %} + +### InfluxDB Telemetry Device Configuration + +```eos +{% include 'eos/monitor-telemetry-influx.j2' %} +``` +{% endif %} diff --git a/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/monitor-telemetry-postcard-policy.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/monitor-telemetry-postcard-policy.j2 new file mode 100644 index 00000000000..2416f56d546 --- /dev/null +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/monitor-telemetry-postcard-policy.j2 @@ -0,0 +1,65 @@ +{# + Copyright (c) 2023-2024 Arista Networks, Inc. + Use of this source code is governed by the Apache License 2.0 + that can be found in the LICENSE file. +#} +{# doc - monitor telemetry postcard policy #} +{% if monitor_telemetry_postcard_policy is arista.avd.defined %} + +### Monitor Telemetry Postcard Policy +{% if monitor_telemetry_postcard_policy.sample_policies is arista.avd.defined %} + +#### Sample Policy Summary +{% for policy in monitor_telemetry_postcard_policy.sample_policies | arista.avd.natural_sort("name") %} + +##### {{ policy.name }} +{% if policy.match_rules is arista.avd.defined %} + +###### Match rules + +| Rule Name | Rule Type | Source Prefix | Destination Prefix | Protocol | Source Ports | Destination Ports | +| --------- | --------- | ------------- | ------------------ | -------- | ------------ | ----------------- | +{% for rule in policy.match_rules | arista.avd.natural_sort("name") %} +{% set protocols_list = [] %} +{% set destination_ports = [] %} +{% set source_ports = [] %} +{% for protocol in rule.protocols | arista.avd.natural_sort("protocol") %} +{% do protocols_list.append(protocol.protocol) %} +{% if protocol.source_ports is arista.avd.defined %} +{% do source_ports.append(protocol.source_ports | join(", ")) %} +{% else %} +{% do source_ports.append("-") %} +{% endif %} +{% if protocol.destination_ports is arista.avd.defined %} +{% do destination_ports.append(protocol.destination_ports | join(", ")) %} +{% else %} +{% do destination_ports.append("-") %} +{% endif %} +{% endfor %} +{% if protocols_list == [] %} +{% do protocols_list.append("-") %} +{% do source_ports.append("-") %} +{% do destination_ports.append("-") %} +{% endif %} +| {{ rule.name }} | {{ rule.type }} | {{ rule.source_prefix | arista.avd.default("-") }} | {{ rule.destination_prefix | arista.avd.default("-") }} | {{ protocols_list | join("
") }} | {{ source_ports | join("
") }} | {{ destination_ports | join("
") }} | +{% endfor %} +{% endif %} +{% endfor %} +{% endif %} +{% if monitor_telemetry_postcard_policy.profiles is arista.avd.defined %} + +#### Telemetry Postcard Policy Profiles + +| Profile Name | Ingress Sample Policy | +| ------------ | --------------------- | +{% for profile in monitor_telemetry_postcard_policy.profiles | arista.avd.natural_sort("name") %} +| {{ profile.name }} | {{ profile.ingress_sample_policy | arista.avd.default("-") }} | +{% endfor %} +{% endif %} + +#### Monitor Telemetry Postcard Policy Configuration + +```eos +{% include 'eos/monitor-telemetry-postcard-policy.j2' %} +``` +{% endif %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/monitoring.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/monitoring.j2 similarity index 91% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/monitoring.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/monitoring.j2 index c06670c6a2e..a4e1bbae426 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/monitoring.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/monitoring.j2 @@ -29,7 +29,8 @@ or flow_trackings is arista.avd.defined or flow_tracking is arista.avd.defined or trackers is arista.avd.defined - or sflow_interfaces | length > 0 %} + or sflow_interfaces | length > 0 + or monitor_telemetry_postcard_policy is arista.avd.defined %} ## Monitoring {## TerminAttr Daemon #} @@ -58,4 +59,6 @@ {% include 'documentation/flow-tracking.j2' %} {## Object Tracking #} {% include 'documentation/trackers.j2' %} +{## Monitor Telemetry Postcard #} +{% include 'documentation/monitor-telemetry-postcard-policy.j2' %} {% endif %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/mpls-and-ldp.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/mpls-and-ldp.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/mpls-and-ldp.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/mpls-and-ldp.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/mpls-interfaces.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/mpls-interfaces.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/mpls-interfaces.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/mpls-interfaces.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/mpls.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/mpls.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/mpls.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/mpls.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/multicast.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/multicast.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/multicast.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/multicast.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ntp.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ntp.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ntp.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ntp.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/patch-panel.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/patch-panel.j2 similarity index 72% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/patch-panel.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/patch-panel.j2 index 64bccb51ee9..6d7bc14b35d 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/patch-panel.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/patch-panel.j2 @@ -9,6 +9,16 @@ ## Patch Panel ### Patch Panel Summary +{% if patch_panel.connector.interface.recovery.review_delay.min is arista.avd.defined and patch_panel.connector.interface.recovery.review_delay.max is arista.avd.defined %} + +Patch Panel Connector Interface Recovery Review Delay Min: {{ patch_panel.connector.interface.recovery.review_delay.min }}s - Max: {{ patch_panel.connector.interface.recovery.review_delay.max }}s +{% endif %} +{% if patch_panel.connector.interface.patch.bgp_vpws_remote_failure_errdisable is arista.avd.defined(true) %} + +Patch Panel Connector Interface Path BGP VPWS Remote Failure Errdisable is enabled. +{% endif %} + +#### Patch Panel Connections | Patch Name | Enabled | Connector A Type | Connector A Endpoint | Connector B Type | Connector B Endpoint | | ---------- | ------- | ---------------- | -------------------- | ---------------- | -------------------- | diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/peer-filters.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/peer-filters.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/peer-filters.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/peer-filters.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/pim-sparse-mode-interfaces.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/pim-sparse-mode-interfaces.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/pim-sparse-mode-interfaces.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/pim-sparse-mode-interfaces.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/pim-sparse-mode.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/pim-sparse-mode.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/pim-sparse-mode.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/pim-sparse-mode.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/platform.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/platform.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/platform.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/platform.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/poe.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/poe.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/poe.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/poe.j2 diff --git a/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/policy-maps-copp.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/policy-maps-copp.j2 new file mode 100644 index 00000000000..5911b355047 --- /dev/null +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/policy-maps-copp.j2 @@ -0,0 +1,28 @@ +{# + Copyright (c) 2023-2024 Arista Networks, Inc. + Use of this source code is governed by the Apache License 2.0 + that can be found in the LICENSE file. +#} +{# doc - policy map copp #} +{% if policy_maps.copp_system_policy is arista.avd.defined %} + +### Control-plane Policy Map + +#### Control-plane Policy Map Summary +{% if policy_maps.copp_system_policy.classes is arista.avd.defined %} + +##### copp-system-policy + +| Class | Shape | Bandwidth | Rate Unit | +| ----- | ----- | --------- | --------- | +{% for class in policy_maps.copp_system_policy.classes | arista.avd.natural_sort('name') %} +| {{ class.name }} | {{ class.shape | arista.avd.default("-") }} | {{ class.bandwidth | arista.avd.default("-") }} | {{ class.rate_unit | arista.avd.default("-") }} | +{% endfor %} +{% endif %} + +#### COPP Policy Maps Device Configuration + +```eos +{% include 'eos/policy-maps-copp.j2' %} +``` +{% endif %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/policy-maps-pbr.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/policy-maps-pbr.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/policy-maps-pbr.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/policy-maps-pbr.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/policy-maps-qos.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/policy-maps-qos.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/policy-maps-qos.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/policy-maps-qos.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/port-channel-interfaces.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/port-channel-interfaces.j2 similarity index 97% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/port-channel-interfaces.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/port-channel-interfaces.j2 index 0d8e0f45797..805069cd252 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/port-channel-interfaces.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/port-channel-interfaces.j2 @@ -134,7 +134,7 @@ {% for vlan_translation in port_channel_interface.vlan_translations | arista.avd.natural_sort %} {% if vlan_translation.from is arista.avd.defined and vlan_translation.to is arista.avd.defined %} {% set row_direction = vlan_translation.direction | arista.avd.default('both') %} -| {{ port_channel_interface.name }} | {{ vlan_translation.from }} | {{ vlan_translation.to }} | {{ row_direction }} +| {{ port_channel_interface.name }} | {{ vlan_translation.from }} | {{ vlan_translation.to }} | {{ row_direction }} | {% endif %} {% endfor %} {% endif %} @@ -290,6 +290,7 @@ {% set port_channel_interfaces_isis = [] %} {% for port_channel_interface in port_channel_interfaces | arista.avd.natural_sort('name') %} {% if port_channel_interface.isis_enable is arista.avd.defined or + port_channel_interface.isis_bfd is arista.avd.defined or port_channel_interface.isis_metric is arista.avd.defined or port_channel_interface.isis_circuit_type is arista.avd.defined or port_channel_interface.isis_network_point_to_point is arista.avd.defined or @@ -303,10 +304,11 @@ ##### ISIS -| Interface | ISIS Instance | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | -| --------- | ------------- | ----------- | ---- | ----------------- | ------------- | ------------------- | +| Interface | ISIS Instance | ISIS BFD | ISIS Metric | Mode | ISIS Circuit Type | Hello Padding | Authentication Mode | +| --------- | ------------- | -------- | ----------- | ---- | ----------------- | ------------- | ------------------- | {% for port_channel_interface in port_channel_interfaces_isis | arista.avd.natural_sort('name') %} {% set isis_instance = port_channel_interface.isis_enable | arista.avd.default("-") %} +{% set isis_bfd = port_channel_interface.isis_bfd | arista.avd.default("-") %} {% set isis_metric = port_channel_interface.isis_metric | arista.avd.default("-") %} {% set isis_circuit_type = port_channel_interface.isis_circuit_type | arista.avd.default("-") %} {% set isis_hello_padding = port_channel_interface.isis_hello_padding | arista.avd.default("-") %} @@ -318,7 +320,7 @@ {% else %} {% set mode = "-" %} {% endif %} -| {{ port_channel_interface.name }} | {{ isis_instance }} | {{ isis_metric }} | {{ mode }} | {{ isis_circuit_type }} | {{ isis_hello_padding }} | {{ isis_authentication_mode }} | +| {{ port_channel_interface.name }} | {{ isis_instance }} | {{ isis_bfd }} | {{ isis_metric }} | {{ mode }} | {{ isis_circuit_type }} | {{ isis_hello_padding }} | {{ isis_authentication_mode }} | {% endfor %} {% endif %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/prefix-lists.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/prefix-lists.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/prefix-lists.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/prefix-lists.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/priority-flow-control.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/priority-flow-control.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/priority-flow-control.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/priority-flow-control.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/prompt.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/prompt.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/prompt.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/prompt.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ptp.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ptp.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/ptp.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/ptp.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/qos-interfaces.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/qos-interfaces.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/qos-interfaces.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/qos-interfaces.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/qos-profiles.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/qos-profiles.j2 similarity index 99% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/qos-profiles.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/qos-profiles.j2 index 755cbb81906..31b733124c8 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/qos-profiles.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/qos-profiles.j2 @@ -156,7 +156,7 @@ {% if profile.mc_tx_queues is arista.avd.defined %} {% for mc_tx_queue in profile.mc_tx_queues | arista.avd.natural_sort('id') %} {% set type = "Multicast" %} -| {{ mc_tx_queue.id }} | {{ type }} | - | - | - | - | +| {{ mc_tx_queue.id }} | {{ type }} | - | - | - | - | - | {% endfor %} {% endif %} {% endif %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/qos.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/qos.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/qos.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/qos.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/quality-of-service.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/quality-of-service.j2 similarity index 87% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/quality-of-service.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/quality-of-service.j2 index b5cb01bf67c..68da3cf648d 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/quality-of-service.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/quality-of-service.j2 @@ -22,7 +22,8 @@ or policy_maps.qos is arista.avd.defined or qos_profiles is arista.avd.defined or ethernet_interfaces_qos | length > 0 is arista.avd.defined - or port_channel_interfaces_qos | length > 0 %} + or port_channel_interfaces_qos | length > 0 + or policy_maps.copp_system_policy is arista.avd.defined %} ## Quality Of Service {## QOS #} @@ -35,4 +36,6 @@ {% include 'documentation/qos-profiles.j2' %} {## QOS Interfaces #} {% include 'documentation/qos-interfaces.j2' %} +{## Control-plane Policy Map #} +{% include 'documentation/policy-maps-copp.j2' %} {% endif %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/queue-monitor.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/queue-monitor.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/queue-monitor.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/queue-monitor.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/radius-server.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/radius-server.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/radius-server.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/radius-server.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/roles.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/roles.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/roles.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/roles.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/route-maps.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/route-maps.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/route-maps.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/route-maps.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/router-adaptive-virtual-topology.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/router-adaptive-virtual-topology.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/router-adaptive-virtual-topology.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/router-adaptive-virtual-topology.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/router-bfd.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/router-bfd.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/router-bfd.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/router-bfd.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/router-bgp.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/router-bgp.j2 similarity index 95% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/router-bgp.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/router-bgp.j2 index 29d94d9ba8d..a428f8a6b46 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/router-bgp.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/router-bgp.j2 @@ -65,6 +65,9 @@ ASN Notation: {{ router_bgp.as_notation | arista.avd.default('asplain') }} {% elif router_bgp.bgp.default.ipv4_unicast_transport_ipv6 is arista.avd.defined(false) %} | no bgp default ipv4-unicast transport ipv6 | {% endif %} +{% if router_bgp.bgp.redistribute_internal is arista.avd.defined(false) %} +| no bgp redistribute-internal | +{% endif %} {% if router_bgp.distance.external_routes is arista.avd.defined %} {% set distance_cli = "distance bgp " ~ router_bgp.distance.external_routes %} {% if router_bgp.distance.internal_routes is arista.avd.defined and router_bgp.distance.local_routes is arista.avd.defined %} @@ -456,7 +459,7 @@ ASN Notation: {{ router_bgp.as_notation | arista.avd.default('asplain') }} {% endif %} {% endif %} {% set active_parameter_vrf.rib_in_pre_policy_retain = neighbor_rib_in_pre_policy_retain | arista.avd.default(inherited_vrf.rib_in_pre_policy_retain, '-') %} -| {{ neighbor.ip_address }} | {{ active_parameter_vrf.remote_as }} | {{ vrf.name }} | {{ active_parameter_vrf.shutdown }} | {{ active_parameter_vrf.send_community }} | {{ active_parameter_vrf.maximum_routes }} | {{ active_parameter_vrf.allowas_in }} | {{ active_parameter_vrf.bfd }} | {{ active_parameter_vrf.rib_in_pre_policy_retain }} | {{ active_parameter_vrf.route_reflector_client }} | {{ active_parameter_vrf.passive }} | +| {{ neighbor.ip_address }} | {{ active_parameter_vrf.remote_as }} | {{ vrf.name }} | {{ active_parameter_vrf.shutdown }} | {{ active_parameter_vrf.send_community }} | {{ active_parameter_vrf.maximum_routes }} | {{ active_parameter_vrf.allowas_in }} | {{ active_parameter_vrf.bfd }} | {{ active_parameter_vrf.rib_in_pre_policy_retain }} | {{ active_parameter_vrf.route_reflector_client }} | {{ active_parameter_vrf.passive }} | - | {% endfor %} {% endif %} {% endfor %} @@ -489,16 +492,14 @@ ASN Notation: {{ router_bgp.as_notation | arista.avd.default('asplain') }} #### BGP Route Aggregation -| Prefix | AS Set | Advertise Map | Supress Map | Summary Only | Attribute Map | Match Map | Advertise Only | -| ------ | ------ | ------------- | ----------- | ------------ | ------------- | --------- | -------------- | +| Prefix | AS Set | Summary Only | Attribute Map | Match Map | Advertise Only | +| ------ | ------ | ------------ | ------------- | --------- | -------------- | {% for aggregate_address in router_bgp.aggregate_addresses | arista.avd.natural_sort('prefix') %} {% if aggregate_address.as_set is arista.avd.defined(true) %} {% set as_set = true %} {% else %} {% set as_set = false %} {% endif %} -{% set advertise_map = aggregate_address.advertise_map | arista.avd.default('-') %} -{% set supress_map = aggregate_address.supress_map | arista.avd.default('-') %} {% if aggregate_address.summary_only is arista.avd.defined(true) %} {% set summary_only = true %} {% else %} @@ -511,7 +512,7 @@ ASN Notation: {{ router_bgp.as_notation | arista.avd.default('asplain') }} {% else %} {% set advertise_only = false %} {% endif %} -| {{ aggregate_address.prefix }} | {{ as_set }} | {{ advertise_map }} | {{ supress_map }} | {{ summary_only }} | {{ attribute_map }} | {{ match_map }} | {{ advertise_only }} | +| {{ aggregate_address.prefix }} | {{ as_set }} | {{ summary_only }} | {{ attribute_map }} | {{ match_map }} | {{ advertise_only }} | {% endfor %} {% endif %} {% if router_bgp.address_family_evpn is arista.avd.defined %} @@ -542,6 +543,13 @@ ASN Notation: {{ router_bgp.as_notation | arista.avd.default('asplain') }} - Next-hop MPLS resolution {{ rib_position[loop.index0] }}-RIB : {{ evpn_mpls_resolution_rib }} {% endfor %} {% endif %} +{% if router_bgp.address_family_evpn.layer_2_fec_in_place_update.enabled is arista.avd.defined(true) %} +{% if router_bgp.address_family_evpn.layer_2_fec_in_place_update.timeout is arista.avd.defined %} +- Layer-2 In-place FEC update tracking timeout: {{ router_bgp.address_family_evpn.layer_2_fec_in_place_update.timeout }} seconds +{% else %} +- Layer-2 In-place FEC update operation enabled +{% endif %} +{% endif %} {% if router_bgp.address_family_evpn.peer_groups is arista.avd.defined %} ##### EVPN Peer Groups @@ -734,24 +742,28 @@ ASN Notation: {{ router_bgp.as_notation | arista.avd.default('asplain') }} ##### VPN-IPv4 Neighbors -| Neighbor | Activate | Route-map In | Route-map Out | -| -------- | -------- | ------------ | ------------- | +| Neighbor | Activate | Route-map In | Route-map Out | RCF In | RCF Out | +| -------- | -------- | ------------ | ------------- | ------ | ------- | {% for neighbor in router_bgp.address_family_vpn_ipv4.neighbors | arista.avd.natural_sort('ip_address') %} {% set route_map_in = neighbor.route_map_in | arista.avd.default("-") %} {% set route_map_out = neighbor.route_map_out | arista.avd.default("-") %} -| {{ neighbor.ip_address }} | {{ neighbor.activate | arista.avd.default(false) }} | {{ route_map_in }} | {{ route_map_out }} | +{% set rcf_in = neighbor.rcf_in | arista.avd.default("-") %} +{% set rcf_out = neighbor.rcf_out | arista.avd.default("-") %} +| {{ neighbor.ip_address }} | {{ neighbor.activate | arista.avd.default(false) }} | {{ route_map_in }} | {{ route_map_out }} | {{ rcf_in }} | {{ rcf_out }} | {% endfor %} {% endif %} {% if router_bgp.address_family_vpn_ipv4.peer_groups is arista.avd.defined %} ##### VPN-IPv4 Peer Groups -| Peer Group | Activate | Route-map In | Route-map Out | -| ---------- | -------- | ------------ | ------------- | +| Peer Group | Activate | Route-map In | Route-map Out | RCF In | RCF Out | +| ---------- | -------- | ------------ | ------------- | ------ | ------- | {% for peer_group in router_bgp.address_family_vpn_ipv4.peer_groups | arista.avd.natural_sort('name') %} {% set route_map_in = peer_group.route_map_in | arista.avd.default("-") %} {% set route_map_out = peer_group.route_map_out | arista.avd.default("-") %} -| {{ peer_group.name }} | {{ peer_group.activate | arista.avd.default(false) }} | {{ route_map_in }} | {{ route_map_out }} | +{% set rcf_in = peer_group.rcf_in | arista.avd.default("-") %} +{% set rcf_out = peer_group.rcf_out | arista.avd.default("-") %} +| {{ peer_group.name }} | {{ peer_group.activate | arista.avd.default(false) }} | {{ route_map_in }} | {{ route_map_out }} | {{ rcf_in }} | {{ rcf_out }} | {% endfor %} {% endif %} {% endif %} @@ -766,24 +778,28 @@ ASN Notation: {{ router_bgp.as_notation | arista.avd.default('asplain') }} ##### VPN-IPv6 Neighbors -| Neighbor | Activate | Route-map In | Route-map Out | -| -------- | -------- | ------------ | ------------- | +| Neighbor | Activate | Route-map In | Route-map Out | RCF In | RCF Out | +| -------- | -------- | ------------ | ------------- | ------ | ------- | {% for neighbor in router_bgp.address_family_vpn_ipv6.neighbors | arista.avd.natural_sort('ip_address') %} {% set route_map_in = neighbor.route_map_in | arista.avd.default("-") %} {% set route_map_out = neighbor.route_map_out | arista.avd.default("-") %} -| {{ neighbor.ip_address }} | {{ neighbor.activate | arista.avd.default(false) }} | {{ route_map_in }} | {{ route_map_out }} | +{% set rcf_in = neighbor.rcf_in | arista.avd.default("-") %} +{% set rcf_out = neighbor.rcf_out | arista.avd.default("-") %} +| {{ neighbor.ip_address }} | {{ neighbor.activate | arista.avd.default(false) }} | {{ route_map_in }} | {{ route_map_out }} | {{ rcf_in }} | {{ rcf_out }} | {% endfor %} {% endif %} {% if router_bgp.address_family_vpn_ipv6.peer_groups is arista.avd.defined %} ##### VPN-IPv6 Peer Groups -| Peer Group | Activate | Route-map In | Route-map Out | -| ---------- | -------- | ------------ | ------------- | +| Peer Group | Activate | Route-map In | Route-map Out | RCF In | RCF Out | +| ---------- | -------- | ------------ | ------------- | ------ | ------- | {% for peer_group in router_bgp.address_family_vpn_ipv6.peer_groups | arista.avd.natural_sort('name') %} {% set route_map_in = peer_group.route_map_in | arista.avd.default("-") %} {% set route_map_out = peer_group.route_map_out | arista.avd.default("-") %} -| {{ peer_group.name }} | {{ peer_group.activate | arista.avd.default(false) }} | {{ route_map_in }} | {{ route_map_out }} | +{% set rcf_in = peer_group.rcf_in | arista.avd.default("-") %} +{% set rcf_out = peer_group.rcf_out | arista.avd.default("-") %} +| {{ peer_group.name }} | {{ peer_group.activate | arista.avd.default(false) }} | {{ route_map_in }} | {{ route_map_out }} | {{ rcf_in }} | {{ rcf_out }} | {% endfor %} {% endif %} {% endif %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/router-general.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/router-general.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/router-general.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/router-general.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/router-igmp.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/router-igmp.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/router-igmp.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/router-igmp.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/router-internet-exit.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/router-internet-exit.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/router-internet-exit.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/router-internet-exit.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/router-isis.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/router-isis.j2 similarity index 97% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/router-isis.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/router-isis.j2 index 4a9814d1d3a..813dc610b13 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/router-isis.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/router-isis.j2 @@ -43,9 +43,12 @@ | SR MPLS Enabled | {{ router_isis.segment_routing_mpls.enabled }} | {% endif %} {% if router_isis.spf_interval.interval is arista.avd.defined %} -| SPF Interval | {{ router_isis.spf_interval.interval }} | +| SPF Interval | {{ router_isis.spf_interval.interval }} {{ router_isis.spf_interval.interval_unit | arista.avd.default("seconds") }} | {% if router_isis.spf_interval.wait_interval is arista.avd.defined %} -| SPF Interval Wait Time| {{ router_isis.spf_interval.wait_interval }} | +| SPF Interval Wait Time| {{ router_isis.spf_interval.wait_interval }} milliseconds | +{% if router_isis.spf_interval.hold_interval is arista.avd.defined %} +| SPF Interval Hold Time| {{ router_isis.spf_interval.hold_interval }} milliseconds | +{% endif %} {% endif %} {% endif %} {% if router_isis.graceful_restart is arista.avd.defined %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/router-l2-vpn.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/router-l2-vpn.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/router-l2-vpn.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/router-l2-vpn.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/router-msdp.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/router-msdp.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/router-msdp.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/router-msdp.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/router-multicast.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/router-multicast.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/router-multicast.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/router-multicast.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/router-ospf.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/router-ospf.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/router-ospf.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/router-ospf.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/router-path-selection.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/router-path-selection.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/router-path-selection.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/router-path-selection.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/router-pim-sparse-mode.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/router-pim-sparse-mode.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/router-pim-sparse-mode.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/router-pim-sparse-mode.j2 diff --git a/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/router-segment-security.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/router-segment-security.j2 new file mode 100644 index 00000000000..080ad7ae7fa --- /dev/null +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/router-segment-security.j2 @@ -0,0 +1,78 @@ +{# + Copyright (c) 2023-2024 Arista Networks, Inc. + Use of this source code is governed by the Apache License 2.0 + that can be found in the LICENSE file. +#} +{# doc - router segment-security #} +{% if router_segment_security is arista.avd.defined %} + +## Group-Based Multi-domain Segmentation Services (MSS-Group) +{% if router_segment_security.enabled is arista.avd.defined(true) %} + +MSS-G is enabled. +{% else %} + +MSS-G is disabled. +{% endif %} +{% if router_segment_security.policies is arista.avd.defined %} + +### Segmentation Policies +{% for policy in router_segment_security.policies | arista.avd.natural_sort('name') %} +{% if policy.name is arista.avd.defined %} + +#### {{ policy.name }} + +| Sequence Number | Application Name | Action | Next-Hop | Log | Stateless | +| --------------- | ---------------- | ------ | -------- | --- | --------- | +{% for entry in policy.sequence_numbers | arista.avd.natural_sort('sequence') %} +| {{ entry.sequence | arista.avd.default('-') }} | {{ entry.application | arista.avd.default('-') }} | {{ entry.action | arista.avd.default('-') }} | {{ entry.next_hop | arista.avd.default('-') }} | {{ entry.log | arista.avd.default('-') }} | {{ entry.stateless | arista.avd.default('-') }} | +{% endfor %} +{% endif %} +{% endfor %} +{% endif %} +{% if router_segment_security.vrfs is arista.avd.defined %} + +### Segment Definitions +{% for vrf in router_segment_security.vrfs | arista.avd.natural_sort('name') %} + +#### VRF {{ vrf.name }} Segmentation +{% for segment in vrf.segments | arista.avd.natural_sort('name') %} + +##### Segment {{ segment.name }} Definitions + +| Interface | Match-List Name | Covered Prefix-List Name | Address Family | +| --------- |---------------- | ------------------------ | -------------- | +{% if segment.definition.interfaces is arista.avd.defined %} +{% for interface in segment.definition.interfaces | arista.avd.natural_sort %} +| {{ interface }} | - | - | - | +{% endfor %} +{% endif %} +{% if segment.definition.match_lists is arista.avd.defined %} +{% for match_list in segment.definition.match_lists %} +| - | {{ match_list.prefix | arista.avd.default('-') }} | {{ match_list.covered_prefix_list | arista.avd.default('-') }} | {{ match_list.address_family }} | +{% endfor %} +{% endif %} + +##### Segment {{ segment.name }} Policies + +| Source Segment | Policy Applied | +| -------------- | -------------- | +{% for policy in segment.policies | arista.avd.natural_sort('from') %} +{% if policy.from is arista.avd.defined and policy.policy is arista.avd.defined %} +| {{ policy.from }} | {{ policy.policy }} | +{% endif %} +{% endfor %} +{% if segment.fallback_policy is arista.avd.defined %} + +Configured Fallback Policy: {{ segment.fallback_policy }} +{% endif %} +{% endfor %} +{% endfor %} +{% endif %} + +### Router MSS-G Device Configuration + +```eos +{% include 'eos/router-segment-security.j2' %} +``` +{% endif %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/router-service-insertion.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/router-service-insertion.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/router-service-insertion.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/router-service-insertion.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/router-traffic-engineering.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/router-traffic-engineering.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/router-traffic-engineering.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/router-traffic-engineering.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/routing.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/routing.j2 similarity index 95% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/routing.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/routing.j2 index b8450d0b975..71787cd5fbb 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/routing.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/routing.j2 @@ -11,6 +11,7 @@ or ipv6_unicast_routing is arista.avd.defined or static_routes is arista.avd.defined or ipv6_static_routes is arista.avd.defined + or ipv6_neighbor is arista.avd.defined or arp is arista.avd.defined or router_general is arista.avd.defined or router_service_insertion is arista.avd.defined @@ -36,6 +37,8 @@ {% include 'documentation/static-routes.j2' %} {## IPv6 Static Routes #} {% include 'documentation/ipv6-static-routes.j2' %} +{## IPv6 Neighbors #} +{% include 'documentation/ipv6-neighbors.j2' %} {## ARP #} {% include 'documentation/arp.j2' %} {## Router Adaptive Virtual Topology #} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/service-routing-configuration-bgp.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/service-routing-configuration-bgp.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/service-routing-configuration-bgp.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/service-routing-configuration-bgp.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/service-routing-protocols-model.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/service-routing-protocols-model.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/service-routing-protocols-model.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/service-routing-protocols-model.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/sflow.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/sflow.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/sflow.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/sflow.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/snmp-server.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/snmp-server.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/snmp-server.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/snmp-server.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/spanning-tree.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/spanning-tree.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/spanning-tree.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/spanning-tree.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/standard-access-lists.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/standard-access-lists.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/standard-access-lists.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/standard-access-lists.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/static-routes.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/static-routes.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/static-routes.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/static-routes.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/stun.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/stun.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/stun.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/stun.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/switchport-default.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/switchport-default.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/switchport-default.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/switchport-default.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/switchport-port-security.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/switchport-port-security.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/switchport-port-security.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/switchport-port-security.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/system-l1.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/system-l1.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/system-l1.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/system-l1.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/system.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/system.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/system.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/system.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/tacacs-servers.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/tacacs-servers.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/tacacs-servers.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/tacacs-servers.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/tap-aggregation.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/tap-aggregation.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/tap-aggregation.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/tap-aggregation.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/tcam-profile.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/tcam-profile.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/tcam-profile.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/tcam-profile.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/trackers.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/trackers.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/trackers.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/trackers.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/traffic-policies.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/traffic-policies.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/traffic-policies.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/traffic-policies.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/tunnel-interfaces.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/tunnel-interfaces.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/tunnel-interfaces.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/tunnel-interfaces.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/virtual-source-nat-vrfs.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/virtual-source-nat-vrfs.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/virtual-source-nat-vrfs.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/virtual-source-nat-vrfs.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/vlan-interfaces.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/vlan-interfaces.j2 similarity index 95% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/vlan-interfaces.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/vlan-interfaces.j2 index e0b4c0b8e25..8e38cfb8ac3 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/vlan-interfaces.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/vlan-interfaces.j2 @@ -69,8 +69,8 @@ ##### IPv6 -| Interface | VRF | IPv6 Address | IPv6 Virtual Addresses | Virtual Router Address | VRRP | ND RA Disabled | Managed Config Flag | IPv6 ACL In | IPv6 ACL Out | -| --------- | --- | ------------ | ---------------------- | ---------------------- | ---- | -------------- | ------------------- | ----------- | ------------ | +| Interface | VRF | IPv6 Address | IPv6 Virtual Addresses | Virtual Router Address | VRRP | ND RA Disabled | Managed Config Flag | Other Config Flag | IPv6 ACL In | IPv6 ACL Out | +| --------- | --- | ------------ | ---------------------- | ---------------------- | ---- | -------------- | ------------------- | ----------------- | ----------- | ------------ | {% for vlan_interface in vlan_interfaces_ipv6 | arista.avd.natural_sort('name') %} {% set row_vrf = vlan_interface.vrf | arista.avd.default('default') %} {% set row_ip_addr = vlan_interface.ipv6_address | arista.avd.default('-') %} @@ -87,9 +87,10 @@ {% set row_vrrp = vlan_interface.vrrp.ipv6 | arista.avd.default('-') %} {% set row_nd_ra_disabled = vlan_interface.ipv6_nd_ra_disabled | arista.avd.default('-') %} {% set row_nd_man_cfg = vlan_interface.ipv6_nd_managed_config_flag | arista.avd.default('-') %} +{% set row_nd_oth_cfg = vlan_interface.ipv6_nd_other_config_flag | arista.avd.default('-') %} {% set row_acl_in = vlan_interface.ipv6_access_group_in | arista.avd.default('-') %} {% set row_acl_out = vlan_interface.ipv6_access_group_out | arista.avd.default('-') %} -| {{ vlan_interface.name }} | {{ row_vrf }} | {{ row_ip_addr }} | {{ row_ip_vaddr }} | {{ row_varp }} | {{ row_vrrp }} | {{ row_nd_ra_disabled }} | {{ row_nd_man_cfg }} | {{ row_acl_in }} | {{ row_acl_out }} | +| {{ vlan_interface.name }} | {{ row_vrf }} | {{ row_ip_addr }} | {{ row_ip_vaddr }} | {{ row_varp }} | {{ row_vrrp }} | {{ row_nd_ra_disabled }} | {{ row_nd_man_cfg }} | {{ row_nd_oth_cfg }} | {{ row_acl_in }} | {{ row_acl_out }} | {% endfor %} {% endif %} {# VRRP #} @@ -148,8 +149,8 @@ ##### ISIS -| Interface | ISIS Instance | ISIS Metric | Mode | -| --------- | ------------- | ----------- | ---- | +| Interface | ISIS Instance | ISIS BFD | ISIS Metric | Mode | +| --------- | ------------- | -------- | ----------- | ---- | {% for vlan_interface in vlan_interfaces | arista.avd.natural_sort('name') %} {% if vlan_interface.isis_enable is arista.avd.defined %} {% set isis_metric = vlan_interface.isis_metric | arista.avd.default('-') %} @@ -160,7 +161,7 @@ {% else %} {% set mode = "-" %} {% endif %} -| {{ vlan_interface.name }} | {{ vlan_interface.isis_enable }} | {{ isis_metric }} | {{ mode }} | +| {{ vlan_interface.name }} | {{ vlan_interface.isis_enable }} | {{ vlan_interface.isis_bfd | arista.avd.default("-") }} | {{ isis_metric }} | {{ mode }} | {% endif %} {% endfor %} {% endif %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/vlan-internal-order.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/vlan-internal-order.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/vlan-internal-order.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/vlan-internal-order.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/vlans.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/vlans.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/vlans.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/vlans.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/vmtracer-sessions.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/vmtracer-sessions.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/vmtracer-sessions.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/vmtracer-sessions.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/vrfs.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/vrfs.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/vrfs.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/vrfs.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/vxlan-interface.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/vxlan-interface.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/documentation/vxlan-interface.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/documentation/vxlan-interface.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos-device-documentation.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos-device-documentation.j2 similarity index 94% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos-device-documentation.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos-device-documentation.j2 index 33f36390bdf..50963548180 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos-device-documentation.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos-device-documentation.j2 @@ -93,6 +93,8 @@ {% include 'documentation/system-l1.j2' %} {# Application traffic recognition #} {% include 'documentation/application-traffic-recognition.j2' %} +{# Router Segment-Security #} +{% include 'documentation/router-segment-security.j2' %} {# Router path-selection #} {% include 'documentation/router-path-selection.j2' %} {# Router internet-exit #} @@ -101,6 +103,8 @@ {% include 'documentation/router-l2-vpn.j2' %} {# IP DHCP Relay #} {% include 'documentation/ip-dhcp-relay.j2' %} +{# IPv6 DHCP Relay #} +{% include 'documentation/ipv6-dhcp-relay.j2' %} {# IP DHCP Snooping #} {% include 'documentation/ip-dhcp-snooping.j2' %} {# IP NAT #} @@ -113,6 +117,8 @@ {% include 'documentation/traffic-policies.j2' %} {# Quality Of Service #} {% include 'documentation/quality-of-service.j2' %} +{# InfluxDB Telemetry #} +{% include 'documentation/monitor-telemetry-influx.j2' %} {# Priority Flow Control #} {% include 'documentation/priority-flow-control.j2' %} {# STUN #} @@ -121,5 +127,3 @@ {% include 'documentation/maintenance-mode.j2' %} {# EOS CLI #} {% include 'documentation/eos-cli.j2' %} -{# Custom Templates #} -{% include 'documentation/custom-templates.j2' %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos-intended-config.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos-intended-config.j2 similarity index 95% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos-intended-config.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos-intended-config.j2 index 68636fa00fa..a8e522957d4 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos-intended-config.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos-intended-config.j2 @@ -30,6 +30,8 @@ {% include 'eos/dhcp-relay.j2' %} {# IP DHCP Relay #} {% include 'eos/ip-dhcp-relay.j2' %} +{# IPv6 DHCP Relay #} +{% include 'eos/ipv6-dhcp-relay.j2' %} {# IP DHCP Snooping #} {% include 'eos/ip-dhcp-snooping.j2' %} {# dhcp servers #} @@ -159,6 +161,8 @@ {% include 'eos/link-tracking-groups.j2' %} {# CVX #} {% include 'eos/cvx.j2' %} +{# influxDB Telemetry #} +{% include 'eos/monitor-telemetry-influx.j2' %} {# IP Security #} {% include 'eos/ip-security.j2' %} {# Port-Channel Interfaces #} @@ -237,7 +241,7 @@ {% include 'eos/ip-extcommunity-lists.j2' %} {# IP Extended Community Lists Regexp #} {% include 'eos/ip-extcommunity-lists-regexp.j2' %} -{# Dynmaic Prefix-lists #} +{# Dynamic Prefix-lists #} {% include 'eos/dynamic-prefix-lists.j2' %} {# Prefix-lists #} {% include 'eos/prefix-lists.j2' %} @@ -251,6 +255,8 @@ {% include 'eos/maintenance.j2' %} {# mlag configuration #} {% include 'eos/mlag-configuration.j2' %} +{# IPv6 Neighbors #} +{% include 'eos/ipv6-neighbors.j2' %} {# Static Route #} {% include 'eos/static-routes.j2' %} {# IPv6 Static Route #} @@ -259,8 +265,12 @@ {% include 'eos/ip-nat-part2.j2' %} {# QOS class-map #} {% include 'eos/class-maps.j2' %} +{# COPP policy-map #} +{% include 'eos/policy-maps-copp.j2' %} {# PBR policy-map #} {% include 'eos/policy-maps-pbr.j2' %} +{# Monitor telemetry postcard #} +{% include 'eos/monitor-telemetry-postcard-policy.j2' %} {# QOS policy-map #} {% include 'eos/policy-maps-qos.j2' %} {# ARP #} @@ -279,6 +289,8 @@ {% include 'eos/router-multicast.j2' %} {# router general configuration #} {% include 'eos/router-general.j2' %} +{# router segment-security #} +{% include 'eos/router-segment-security.j2' %} {# router traffic-engineering configuration #} {% include 'eos/router-traffic-engineering.j2' %} {# router ospf configuration #} @@ -335,7 +347,5 @@ {% include 'eos/platform-apply.j2' %} {# EOS CLI #} {% include 'eos/eos-cli.j2' %} -{# custom templates #} -{% include 'eos/custom-templates.j2' %} {# end #} {% include 'eos/end.j2' %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/aaa-accounting.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/aaa-accounting.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/aaa-accounting.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/aaa-accounting.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/aaa-authentication.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/aaa-authentication.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/aaa-authentication.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/aaa-authentication.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/aaa-authorization.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/aaa-authorization.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/aaa-authorization.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/aaa-authorization.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/aaa-root.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/aaa-root.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/aaa-root.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/aaa-root.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/aaa-server-groups.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/aaa-server-groups.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/aaa-server-groups.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/aaa-server-groups.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/aaa.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/aaa.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/aaa.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/aaa.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/access-lists.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/access-lists.j2 similarity index 80% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/access-lists.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/access-lists.j2 index e1834822bf0..1e09187beaa 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/access-lists.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/access-lists.j2 @@ -15,4 +15,7 @@ ip access-list {{ access_list.name }} {{ sequence.sequence }} {{ sequence.action }} {% endif %} {% endfor %} +{% if access_list.permit_response_traffic is arista.avd.defined %} + permit response traffic {{ access_list.permit_response_traffic }} +{% endif %} {% endfor %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/address-locking.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/address-locking.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/address-locking.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/address-locking.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/agents.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/agents.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/agents.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/agents.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/aliases.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/aliases.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/aliases.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/aliases.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/application-traffic-recognition.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/application-traffic-recognition.j2 similarity index 75% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/application-traffic-recognition.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/application-traffic-recognition.j2 index e284e620665..3820dcbf0b1 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/application-traffic-recognition.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/application-traffic-recognition.j2 @@ -41,6 +41,33 @@ application traffic recognition protocol {{ application.protocol_ranges | arista.avd.natural_sort('name') | join(", ") }} {% endif %} {% endfor %} +{% for application in application_traffic_recognition.applications.l4_applications | arista.avd.natural_sort('name') %} + ! + application l4 {{ application.name }} +{% for protocol in application.protocols | arista.avd.natural_sort() %} +{% set config = [protocol] %} +{% if protocol == "tcp" %} +{% if application.tcp_src_port_set_name is arista.avd.defined %} +{% do config.append("source port field-set " + application.tcp_src_port_set_name) %} +{% endif %} +{% if application.tcp_dest_port_set_name is arista.avd.defined %} +{% do config.append("destination port field-set " + application.tcp_dest_port_set_name) %} +{% endif %} +{% endif %} +{% if protocol == "udp" %} +{% if application.udp_src_port_set_name is arista.avd.defined %} +{% do config.append("source port field-set " + application.udp_src_port_set_name) %} +{% endif %} +{% if application.udp_dest_port_set_name is arista.avd.defined %} +{% do config.append("destination port field-set " + application.udp_dest_port_set_name) %} +{% endif %} +{% endif %} + protocol {{ config | join(" ") }} +{% endfor %} +{% if application.protocol_ranges is arista.avd.defined %} + protocol {{ application.protocol_ranges | arista.avd.natural_sort('name') | join(", ") }} +{% endif %} +{% endfor %} {% endif %} {# categories #} {% for category in application_traffic_recognition.categories | arista.avd.natural_sort('name') %} diff --git a/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/arp.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/arp.j2 new file mode 100644 index 00000000000..840e86e5ce1 --- /dev/null +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/arp.j2 @@ -0,0 +1,37 @@ +{# + Copyright (c) 2023-2024 Arista Networks, Inc. + Use of this source code is governed by the Apache License 2.0 + that can be found in the LICENSE file. +#} +{# eos - arp #} +{% if arp.aging.timeout_default is arista.avd.defined or arp.static_entries is arista.avd.defined or arp.persistent is arista.avd.defined %} +! +{% if arp.persistent.enabled is arista.avd.defined(true) %} +{% set persistent_cli = "arp persistent" %} +{% if arp.persistent.refresh_delay is arista.avd.defined %} +{% set persistent_cli = persistent_cli ~ " refresh-delay " ~ arp.persistent.refresh_delay %} +{% endif %} +{{ persistent_cli }} +{% endif %} +{% if arp.aging.timeout_default is arista.avd.defined %} +arp aging timeout default {{ arp.aging.timeout_default }} +{% endif %} +{% if arp.static_entries is arista.avd.defined %} +{# TODO - remove when dropping support for ansible 2.12.6 and its jinja2 hack #} +{% for entry in arp.static_entries %} +{% if entry.vrf is not arista.avd.defined %} +{% do entry.update({"vrf": "default"}) %} +{% endif %} +{% endfor %} +{% for vrf, entries in arp.static_entries | groupby("vrf") | arista.avd.natural_sort %} +{# TODO {% for vrf, entries in arp.static_entries | arista.avd.default([]) | groupby("vrf", default="default") | arista.avd.natural_sort %} #} +{% for entry in entries | arista.avd.natural_sort("ipv4_address") %} +{% set arp_entry_prefix = "arp" %} +{% if vrf != "default" %} +{% set arp_entry_prefix = arp_entry_prefix ~ " vrf " ~ vrf %} +{% endif %} +{{ arp_entry_prefix }} {{ entry.ipv4_address }} {{ entry.mac_address }} arpa +{% endfor %} +{% endfor %} +{% endif %} +{% endif %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/as-path.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/as-path.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/as-path.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/as-path.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/banners.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/banners.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/banners.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/banners.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/bgp-groups.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/bgp-groups.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/bgp-groups.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/bgp-groups.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/boot.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/boot.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/boot.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/boot.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/class-maps.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/class-maps.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/class-maps.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/class-maps.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/clock.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/clock.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/clock.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/clock.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/community-lists.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/community-lists.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/community-lists.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/community-lists.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/config-comment.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/config-comment.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/config-comment.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/config-comment.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/cvx.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/cvx.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/cvx.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/cvx.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/daemon-terminattr.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/daemon-terminattr.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/daemon-terminattr.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/daemon-terminattr.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/daemons.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/daemons.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/daemons.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/daemons.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/dhcp-relay.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/dhcp-relay.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/dhcp-relay.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/dhcp-relay.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/dhcp-servers.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/dhcp-servers.j2 similarity index 79% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/dhcp-servers.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/dhcp-servers.j2 index 22b657b9eb3..23cc5c57cb6 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/dhcp-servers.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/dhcp-servers.j2 @@ -18,6 +18,18 @@ {% if dhcp_server.dns_domain_name_ipv6 is arista.avd.defined %} dns domain name ipv6 {{ dhcp_server.dns_domain_name_ipv6 }} {% endif %} +{% if dhcp_server.dns_servers_ipv4 is arista.avd.defined %} + dns server ipv4 {{ dhcp_server.dns_servers_ipv4 | arista.avd.natural_sort | join(" ") }} +{% endif %} +{% if dhcp_server.dns_servers_ipv6 is arista.avd.defined %} + dns server ipv6 {{ dhcp_server.dns_servers_ipv6 | arista.avd.natural_sort | join(" ") }} +{% endif %} +{% if dhcp_server.tftp_server.file_ipv4 is arista.avd.defined %} + tftp server file ipv4 {{ dhcp_server.tftp_server.file_ipv4 }} +{% endif %} +{% if dhcp_server.tftp_server.file_ipv6 is arista.avd.defined %} + tftp server file ipv6 {{ dhcp_server.tftp_server.file_ipv6 }} +{% endif %} {% for subnet in dhcp_server.subnets | arista.avd.natural_sort %} ! subnet {{ subnet.subnet }} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/dns-domain.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/dns-domain.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/dns-domain.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/dns-domain.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/domain-list.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/domain-list.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/domain-list.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/domain-list.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/dot1x.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/dot1x.j2 similarity index 67% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/dot1x.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/dot1x.j2 index c9bfabedbda..0984da4544e 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/dot1x.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/dot1x.j2 @@ -18,8 +18,28 @@ dot1x protocol bpdu bypass {% if dot1x.dynamic_authorization is arista.avd.defined(true) %} dot1x dynamic-authorization {% endif %} -{% if dot1x.mac_based_authentication is arista.avd.defined or dot1x.radius_av_pair is arista.avd.defined or dot1x.aaa.unresponsive is arista.avd.defined %} +{% if dot1x.mac_based_authentication is arista.avd.defined or dot1x.radius_av_pair is arista.avd.defined or + dot1x.aaa.unresponsive is arista.avd.defined or dot1x.captive_portal is arista.avd.defined + or dot1x.supplicant is arista.avd.defined %} dot1x +{% for profile in dot1x.supplicant.profiles | arista.avd.natural_sort("name") %} + supplicant profile {{ profile.name }} +{% if profile.identity is arista.avd.defined %} + identity {{ profile.identity }} +{% endif %} +{% if profile.eap_method is arista.avd.defined %} + eap-method {{ profile.eap_method }} +{% endif %} +{% if profile.passphrase is arista.avd.defined %} + passphrase {{ profile.passphrase_type | arista.avd.default("7") }} {{ profile.passphrase | arista.avd.hide_passwords(hide_passwords) }} +{% endif %} +{% if profile.ssl_profile is arista.avd.defined %} + ssl profile {{ profile.ssl_profile }} +{% endif %} +{% if not loop.last %} + ! +{% endif %} +{% endfor %} {% if dot1x.aaa.unresponsive is arista.avd.defined %} {% set aaa_config = "aaa unresponsive" %} {% if dot1x.aaa.unresponsive.phone_action is arista.avd.defined or dot1x.aaa.unresponsive.action is arista.avd.defined %} @@ -60,6 +80,9 @@ dot1x {{ aaa_config }} recovery action reauthenticate {% endif %} {% endif %} +{% if dot1x.aaa.accounting_update_interval is arista.avd.defined %} + aaa accounting update interval {{ dot1x.aaa.accounting_update_interval }} seconds +{% endif %} {% if dot1x.mac_based_authentication is arista.avd.defined %} {% if dot1x.mac_based_authentication.delay is arista.avd.defined %} mac based authentication delay {{ dot1x.mac_based_authentication.delay }} seconds @@ -76,5 +99,27 @@ dot1x radius av-pair framed-mtu {{ dot1x.radius_av_pair.framed_mtu }} {% endif %} {% endif %} +{% if dot1x.supplicant.disconnect_cached_results_timeout is arista.avd.defined %} + supplicant disconnect cached-results timeout {{ dot1x.supplicant.disconnect_cached_results_timeout }} seconds +{% endif %} +{% if dot1x.captive_portal.enabled is arista.avd.defined(true) %} +{% set captive_portal_cli = "captive-portal" %} +{% if dot1x.captive_portal.url is arista.avd.defined %} +{% set captive_portal_cli = captive_portal_cli ~ " url " ~ dot1x.captive_portal.url %} +{% endif %} +{% if dot1x.captive_portal.ssl_profile is arista.avd.defined %} +{% set captive_portal_cli = captive_portal_cli ~ " ssl profile " ~ dot1x.captive_portal.ssl_profile %} +{% endif %} + {{ captive_portal_cli }} +{% if dot1x.captive_portal.access_list_ipv4 is arista.avd.defined %} + captive-portal access-list ipv4 {{ dot1x.captive_portal.access_list_ipv4 }} +{% endif %} +{% if dot1x.captive_portal.start_limit_infinite is arista.avd.defined(true) %} + captive-portal start limit infinite +{% endif %} +{% endif %} +{% if dot1x.supplicant.logging is arista.avd.defined(true) %} + supplicant logging +{% endif %} {% endif %} {% endif %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/dps-interfaces.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/dps-interfaces.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/dps-interfaces.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/dps-interfaces.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/dynamic-prefix-lists.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/dynamic-prefix-lists.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/dynamic-prefix-lists.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/dynamic-prefix-lists.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/enable-password.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/enable-password.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/enable-password.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/enable-password.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/end.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/end.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/end.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/end.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/eos-cli.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/eos-cli.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/eos-cli.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/eos-cli.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/errdisable.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/errdisable.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/errdisable.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/errdisable.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ethernet-interface-tx-queues.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ethernet-interface-tx-queues.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ethernet-interface-tx-queues.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ethernet-interface-tx-queues.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ethernet-interface-uc-tx-queues.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ethernet-interface-uc-tx-queues.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ethernet-interface-uc-tx-queues.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ethernet-interface-uc-tx-queues.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ethernet-interfaces.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ethernet-interfaces.j2 similarity index 96% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ethernet-interfaces.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ethernet-interfaces.j2 index 8bcb81b0e9a..2d563d36c6a 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ethernet-interfaces.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ethernet-interfaces.j2 @@ -438,6 +438,19 @@ interface {{ ethernet_interface.name }} {% endif %} {{ destination_cli }} {% endfor %} +{% if ethernet_interface.tcp_mss_ceiling.ipv4_segment_size is arista.avd.defined or ethernet_interface.tcp_mss_ceiling.ipv6_segment_size is arista.avd.defined %} +{% set tcp_mss_ceiling_cli = "tcp mss ceiling" %} +{% if ethernet_interface.tcp_mss_ceiling.ipv4_segment_size is arista.avd.defined %} +{% set tcp_mss_ceiling_cli = tcp_mss_ceiling_cli ~ " ipv4 " ~ ethernet_interface.tcp_mss_ceiling.ipv4_segment_size %} +{% endif %} +{% if ethernet_interface.tcp_mss_ceiling.ipv6_segment_size is arista.avd.defined %} +{% set tcp_mss_ceiling_cli = tcp_mss_ceiling_cli ~ " ipv6 " ~ ethernet_interface.tcp_mss_ceiling.ipv6_segment_size %} +{% endif %} +{% if ethernet_interface.tcp_mss_ceiling.direction is arista.avd.defined %} +{% set tcp_mss_ceiling_cli = tcp_mss_ceiling_cli ~ " " ~ ethernet_interface.tcp_mss_ceiling.direction %} +{% endif %} + {{ tcp_mss_ceiling_cli }} +{% endif %} {% if ethernet_interface.channel_group.id is arista.avd.defined and ethernet_interface.channel_group.mode is arista.avd.defined %} channel-group {{ ethernet_interface.channel_group.id }} mode {{ ethernet_interface.channel_group.mode }} {% if ethernet_interface.lacp_timer.mode is arista.avd.defined %} @@ -708,6 +721,9 @@ interface {{ ethernet_interface.name }} {% if ethernet_interface.isis_enable is arista.avd.defined %} isis enable {{ ethernet_interface.isis_enable }} {% endif %} +{% if ethernet_interface.isis_bfd is arista.avd.defined(true) %} + isis bfd +{% endif %} {% if ethernet_interface.isis_circuit_type is arista.avd.defined %} isis circuit-type {{ ethernet_interface.isis_circuit_type }} {% endif %} @@ -777,6 +793,13 @@ interface {{ ethernet_interface.name }} {% if ethernet_interface.transceiver.media.override is arista.avd.defined %} transceiver media override {{ ethernet_interface.transceiver.media.override }} {% endif %} +{% if ethernet_interface.transceiver.frequency is arista.avd.defined %} +{% set frequency_cli = 'transceiver frequency ' ~ "%.3f" | format(ethernet_interface.transceiver.frequency | float) %} +{% if ethernet_interface.transceiver.frequency_unit is arista.avd.defined %} +{% set frequency_cli = frequency_cli ~ ' ' ~ ethernet_interface.transceiver.frequency_unit %} +{% endif %} + {{ frequency_cli }} +{% endif %} {% for link_tracking_group in ethernet_interface.link_tracking_groups | arista.avd.natural_sort %} {% if link_tracking_group.name is arista.avd.defined and link_tracking_group.direction is arista.avd.defined %} link tracking group {{ link_tracking_group.name }} {{ link_tracking_group.direction }} diff --git a/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/event-handlers.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/event-handlers.j2 new file mode 100644 index 00000000000..5e9f82cbfba --- /dev/null +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/event-handlers.j2 @@ -0,0 +1,103 @@ +{# + Copyright (c) 2023-2024 Arista Networks, Inc. + Use of this source code is governed by the Apache License 2.0 + that can be found in the LICENSE file. +#} +{# eos - event handlers #} +{% if event_handlers is arista.avd.defined %} +{% for handler in event_handlers | arista.avd.natural_sort('name') %} +! +event-handler {{ handler.name }} +{% if handler.trigger is arista.avd.defined %} +{% if handler.trigger is arista.avd.defined("on-maintenance") + and handler.trigger_on_maintenance.operation is arista.avd.defined + and handler.trigger_on_maintenance.action is arista.avd.defined %} +{% set trigger_cli = "trigger " ~ handler.trigger ~ " " ~ handler.trigger_on_maintenance.operation %} +{% if handler.trigger_on_maintenance.bgp_peer is arista.avd.defined %} +{% set on_maintenance_cli = "bgp " ~ handler.trigger_on_maintenance.bgp_peer %} +{% if handler.trigger_on_maintenance.vrf is arista.avd.defined %} +{% set on_maintenance_cli = on_maintenance_cli ~ " vrf " ~ handler.trigger_on_maintenance.vrf %} +{% endif %} +{% elif handler.trigger_on_maintenance.interface is arista.avd.defined %} +{% set on_maintenance_cli = "interface " ~ handler.trigger_on_maintenance.interface %} +{% elif handler.trigger_on_maintenance.unit is arista.avd.defined %} +{% set on_maintenance_cli = "unit " ~ handler.trigger_on_maintenance.unit %} +{% endif %} +{% if on_maintenance_cli is arista.avd.defined %} +{% if handler.trigger_on_maintenance.action in ["after", "before"] and handler.trigger_on_maintenance.stage is arista.avd.defined %} + {{ trigger_cli }} {{ on_maintenance_cli }} {{ handler.trigger_on_maintenance.action }} stage {{ handler.trigger_on_maintenance.stage }} +{% elif handler.trigger_on_maintenance.action in ["all", "begin", "end"] %} + {{ trigger_cli }} {{ on_maintenance_cli }} {{ handler.trigger_on_maintenance.action }} +{% endif %} +{% endif %} +{% elif handler.trigger is arista.avd.defined("on-counters") %} + trigger on-counters +{% if handler.trigger_on_counters.poll_interval is arista.avd.defined %} + poll interval {{ handler.trigger_on_counters.poll_interval }} +{% endif %} +{% if handler.trigger_on_counters.condition is arista.avd.defined %} + condition {{ handler.trigger_on_counters.condition }} +{% endif %} +{% if handler.trigger_on_counters.granularity_per_source is arista.avd.defined(true) %} + granularity per-source +{% endif %} +{% elif handler.trigger is arista.avd.defined("on-logging") %} + trigger on-logging +{% if handler.trigger_on_logging.poll_interval is arista.avd.defined %} + poll interval {{ handler.trigger_on_logging.poll_interval }} +{% endif %} +{% if handler.trigger_on_logging.regex is arista.avd.defined %} + regex {{ handler.trigger_on_logging.regex }} +{% endif %} +{% elif handler.trigger is arista.avd.defined("on-intf") %} +{% if handler.trigger_on_intf.interface is arista.avd.defined and + (handler.trigger_on_intf.ip is arista.avd.defined(true) or + handler.trigger_on_intf.ipv6 is arista.avd.defined(true) or + handler.trigger_on_intf.operstatus is arista.avd.defined(true)) %} +{% set trigger_on_intf_cli = "trigger on-intf " ~ handler.trigger_on_intf.interface %} +{% if handler.trigger_on_intf.operstatus is arista.avd.defined(true) %} +{% set trigger_on_intf_cli = trigger_on_intf_cli ~ " operstatus" %} +{% endif %} +{% if handler.trigger_on_intf.ip is arista.avd.defined(true) %} +{% set trigger_on_intf_cli = trigger_on_intf_cli ~ " ip" %} +{% endif %} +{% if handler.trigger_on_intf.ipv6 is arista.avd.defined(true) %} +{% set trigger_on_intf_cli = trigger_on_intf_cli ~ " ip6" %} +{% endif %} + {{ trigger_on_intf_cli }} +{% endif %} +{% else %} + trigger {{ handler.trigger }} +{% endif %} +{% if handler.regex is arista.avd.defined %} + regex {{ handler.regex }} +{% endif %} +{% endif %} +{% if handler.action is arista.avd.defined and handler.action_type is arista.avd.defined %} + action {{ handler.action_type }} {{ handler.action }} +{% endif %} +{% if handler.actions.bash_command is arista.avd.defined %} +{% set bash_command = handler.actions.bash_command %} +{% if bash_command.count('\n') > 0 %} +{% if not bash_command.rstrip().endswith('\nEOF') %} +{% set bash_command = bash_command.rstrip() ~ "\nEOF" %} +{% endif %} + action bash + {{ bash_command | indent(width=6, first=false) }} +{% else %} + action bash {{ bash_command }} +{% endif %} +{% elif handler.actions.log is arista.avd.defined(true) %} + action log +{% endif %} +{% if handler.actions.increment_device_health_metric is arista.avd.defined %} + action increment device-health metric {{ handler.actions.increment_device_health_metric }} +{% endif %} +{% if handler.delay is arista.avd.defined %} + delay {{ handler.delay }} +{% endif %} +{% if handler.asynchronous is arista.avd.defined(true) %} + asynchronous +{% endif %} +{% endfor %} +{% endif %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/event-monitor.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/event-monitor.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/event-monitor.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/event-monitor.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/flow-tracking.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/flow-tracking.j2 similarity index 97% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/flow-tracking.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/flow-tracking.j2 index 7e1f1786e72..af988276df7 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/flow-tracking.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/flow-tracking.j2 @@ -36,7 +36,7 @@ flow tracking sampled hardware offload threshold minimum {{ flow_tracking.sampled.hardware_offload.threshold_minimum }} samples {% endif %} {% endif %} -{% for tracker in flow_tracking.sampled.trackers %} +{% for tracker in flow_tracking.sampled.trackers | arista.avd.natural_sort %} tracker {{ tracker.name }} {% if tracker.record_export.on_inactive_timeout is arista.avd.defined %} record export on inactive timeout {{ tracker.record_export.on_inactive_timeout }} @@ -80,7 +80,7 @@ flow tracking sampled {% if flow_tracking.hardware is arista.avd.defined %} ! flow tracking hardware -{% for tracker in flow_tracking.hardware.trackers %} +{% for tracker in flow_tracking.hardware.trackers | arista.avd.natural_sort %} tracker {{ tracker.name }} {% if tracker.record_export.on_inactive_timeout is arista.avd.defined %} record export on inactive timeout {{ tracker.record_export.on_inactive_timeout }} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/flow-trackings.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/flow-trackings.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/flow-trackings.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/flow-trackings.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/hardware-counters.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/hardware-counters.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/hardware-counters.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/hardware-counters.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/hardware.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/hardware.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/hardware.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/hardware.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/hostname.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/hostname.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/hostname.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/hostname.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/interface-defaults.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/interface-defaults.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/interface-defaults.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/interface-defaults.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/interface-groups.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/interface-groups.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/interface-groups.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/interface-groups.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/interface-ip-nat.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/interface-ip-nat.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/interface-ip-nat.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/interface-ip-nat.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/interface-profiles.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/interface-profiles.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/interface-profiles.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/interface-profiles.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-access-lists.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-access-lists.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-access-lists.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-access-lists.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-client-source-interfaces.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-client-source-interfaces.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-client-source-interfaces.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-client-source-interfaces.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-community-lists.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-community-lists.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-community-lists.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-community-lists.j2 diff --git a/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-dhcp-relay.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-dhcp-relay.j2 new file mode 100644 index 00000000000..3b973c47233 --- /dev/null +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-dhcp-relay.j2 @@ -0,0 +1,18 @@ +{# + Copyright (c) 2023-2024 Arista Networks, Inc. + Use of this source code is governed by the Apache License 2.0 + that can be found in the LICENSE file. +#} +{# eos - ip dhcp relay #} +{% if ip_dhcp_relay is arista.avd.defined() %} +! +{% if ip_dhcp_relay.information_option is arista.avd.defined(true) %} +ip dhcp relay information option +{% endif %} +{% if ip_dhcp_relay.always_on is arista.avd.defined(true) %} +ip dhcp relay always-on +{% endif %} +{% if ip_dhcp_relay.all_subnets is arista.avd.defined(true) %} +ip dhcp relay all-subnets default +{% endif %} +{% endif %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-dhcp-snooping.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-dhcp-snooping.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-dhcp-snooping.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-dhcp-snooping.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-domain-lookup.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-domain-lookup.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-domain-lookup.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-domain-lookup.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-extcommunity-lists-regexp.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-extcommunity-lists-regexp.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-extcommunity-lists-regexp.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-extcommunity-lists-regexp.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-extcommunity-lists.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-extcommunity-lists.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-extcommunity-lists.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-extcommunity-lists.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-hardware.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-hardware.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-hardware.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-hardware.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-icmp-redirect.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-icmp-redirect.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-icmp-redirect.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-icmp-redirect.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-igmp-snooping.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-igmp-snooping.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-igmp-snooping.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-igmp-snooping.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-name-servers.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-name-servers.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-name-servers.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-name-servers.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-nat-part1.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-nat-part1.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-nat-part1.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-nat-part1.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-nat-part2.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-nat-part2.j2 similarity index 53% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-nat-part2.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-nat-part2.j2 index bc99dc6cc15..5d2d1c9ebf2 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-nat-part2.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-nat-part2.j2 @@ -6,18 +6,37 @@ {# eos - ip nat part 2 (pools, synchronization) #} {% if ip_nat is arista.avd.defined %} ! -{% for pool in ip_nat.pools | arista.avd.default([]) %} -{% if pool.name is arista.avd.defined and pool.prefix_length is arista.avd.defined %} +{% for pool in ip_nat.pools | arista.avd.natural_sort('name') %} +{% set pool_type = pool.type | arista.avd.default('ip-port') %} +{% if pool_type == 'ip-port' %} +{% if pool.name is arista.avd.defined and pool.prefix_length is arista.avd.defined %} ip nat pool {{ pool.name }} prefix-length {{ pool.prefix_length }} -{% for range in pool.ranges | arista.avd.default([]) %} -{% set range_cli = 'range ' ~ range.first_ip ~ ' ' ~ range.last_ip %} -{% if range.first_port is arista.avd.defined and range.last_port is arista.avd.defined %} -{% set range_cli = range_cli ~ ' ' ~ range.first_port ~ ' ' ~ range.last_port %} -{% endif %} +{% for range in pool.ranges | arista.avd.default([]) %} +{% if range.first_ip is arista.avd.defined and range.last_ip is arista.avd.defined %} +{% set range_cli = 'range ' ~ range.first_ip ~ ' ' ~ range.last_ip %} +{% if range.first_port is arista.avd.defined and range.last_port is arista.avd.defined %} +{% set range_cli = range_cli ~ ' ' ~ range.first_port ~ ' ' ~ range.last_port %} +{% endif %} {{ range_cli }} -{% endfor %} -{% if pool.utilization_log_threshold is arista.avd.defined %} +{% endif %} +{% endfor %} +{% if pool.utilization_log_threshold is arista.avd.defined %} utilization threshold {{ pool.utilization_log_threshold }} action log +{% endif %} +{% endif %} +{% endif %} +{% endfor %} +{% for pool in ip_nat.pools | arista.avd.natural_sort('name') %} +{% set pool_type = pool.type | arista.avd.default('ip-port') %} +{% if pool_type == 'port-only' %} +{% if pool.name is arista.avd.defined %} +ip nat pool {{ pool.name }} port-only +{% for range in pool.ranges | arista.avd.default([]) %} +{% if range.first_port is arista.avd.defined and range.last_port is arista.avd.defined %} +{% set range_cli = 'port range ' ~ range.first_port ~ ' ' ~ range.last_port %} + {{ range_cli }} +{% endif %} +{% endfor %} {% endif %} {% endif %} {% endfor %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-radius-source-interfaces.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-radius-source-interfaces.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-radius-source-interfaces.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-radius-source-interfaces.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-routing-vrfs.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-routing-vrfs.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-routing-vrfs.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-routing-vrfs.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-routing.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-routing.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-routing.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-routing.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-security.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-security.j2 similarity index 94% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-security.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-security.j2 index 06c7a7c409f..d9b47798724 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-security.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-security.j2 @@ -42,6 +42,9 @@ ip security esp encryption {{ sa_policy.esp.encryption }} {% endif %} {% endif %} +{% if sa_policy.sa_lifetime.value is arista.avd.defined %} + sa lifetime {{ sa_policy.sa_lifetime.value }} {{ sa_policy.sa_lifetime.unit | arista.avd.default("hours") }} +{% endif %} {% if sa_policy.pfs_dh_group is arista.avd.defined %} pfs dh-group {{ sa_policy.pfs_dh_group }} {% endif %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-tacacs-source-interfaces.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-tacacs-source-interfaces.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-tacacs-source-interfaces.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-tacacs-source-interfaces.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-virtual-router-mac-address.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-virtual-router-mac-address.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ip-virtual-router-mac-address.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ip-virtual-router-mac-address.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ipv6-access-lists.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ipv6-access-lists.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ipv6-access-lists.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ipv6-access-lists.j2 diff --git a/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ipv6-dhcp-relay.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ipv6-dhcp-relay.j2 new file mode 100644 index 00000000000..54a374e0cf0 --- /dev/null +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ipv6-dhcp-relay.j2 @@ -0,0 +1,27 @@ +{# + Copyright (c) 2023-2024 Arista Networks, Inc. + Use of this source code is governed by the Apache License 2.0 + that can be found in the LICENSE file. +#} +{# eos - ipv6 dhcp relay #} +{% if ipv6_dhcp_relay is arista.avd.defined() %} +! +{% if ipv6_dhcp_relay.always_on is arista.avd.defined(true) %} +ipv6 dhcp relay always-on +{% endif %} +{% if ipv6_dhcp_relay.all_subnets is arista.avd.defined(true) %} +ipv6 dhcp relay all-subnets default +{% endif %} +{% if ipv6_dhcp_relay.option is arista.avd.defined() %} +{% if ipv6_dhcp_relay.option.link_layer_address is arista.avd.defined(true) %} +ipv6 dhcp relay option link-layer address +{% endif %} +{% if ipv6_dhcp_relay.option.remote_id_format is arista.avd.defined() %} +{% if ipv6_dhcp_relay.option.remote_id_format == "%m:%i" %} +ipv6 dhcp relay option remote-id format %m:%i +{% elif ipv6_dhcp_relay.option.remote_id_format == "%m:%p" %} +ipv6 dhcp relay option remote-id format %m:%p +{% endif %} +{% endif %} +{% endif %} +{% endif %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ipv6-hardware.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ipv6-hardware.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ipv6-hardware.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ipv6-hardware.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ipv6-icmp-redirect.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ipv6-icmp-redirect.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ipv6-icmp-redirect.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ipv6-icmp-redirect.j2 diff --git a/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ipv6-neighbors.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ipv6-neighbors.j2 new file mode 100644 index 00000000000..e1b1cf8e31d --- /dev/null +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ipv6-neighbors.j2 @@ -0,0 +1,29 @@ +{# + Copyright (c) 2023-2024 Arista Networks, Inc. + Use of this source code is governed by the Apache License 2.0 + that can be found in the LICENSE file. +#} +{# eos - ipv6 neighbors #} +{% if ipv6_neighbor.persistent.enabled is arista.avd.defined(true) or ipv6_neighbor.static_entries is arista.avd.defined %} +! +{% if ipv6_neighbor.persistent.enabled is arista.avd.defined(true) %} +{% set persistent_cli = "ipv6 neighbor persistent" %} +{% if ipv6_neighbor.persistent.refresh_delay is arista.avd.defined %} +{% set persistent_cli = persistent_cli ~ " refresh-delay " ~ ipv6_neighbor.persistent.refresh_delay %} +{% endif %} +{{ persistent_cli }} +{% endif %} +{% if ipv6_neighbor.static_entries is arista.avd.defined %} +{% for neighbor in ipv6_neighbor.static_entries %} +{% if neighbor.ipv6_address is arista.avd.defined and neighbor.interface is arista.avd.defined and neighbor.mac_address is arista.avd.defined %} +{% set neighbor_cli = neighbor.ipv6_address ~ " " ~ neighbor.interface ~ " " ~ neighbor.mac_address %} +{% if neighbor.vrf is arista.avd.defined %} +{% set neighbor_cli = "ipv6 neighbor vrf " ~ neighbor.vrf ~ " " ~ neighbor_cli %} +{% else %} +{% set neighbor_cli = "ipv6 neighbor " ~ neighbor_cli %} +{% endif %} +{{ neighbor_cli }} +{% endif %} +{% endfor %} +{% endif %} +{% endif %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ipv6-prefix-lists.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ipv6-prefix-lists.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ipv6-prefix-lists.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ipv6-prefix-lists.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ipv6-standard-access-lists.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ipv6-standard-access-lists.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ipv6-standard-access-lists.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ipv6-standard-access-lists.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ipv6-static-routes.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ipv6-static-routes.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ipv6-static-routes.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ipv6-static-routes.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ipv6-unicast-routing-vrfs.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ipv6-unicast-routing-vrfs.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ipv6-unicast-routing-vrfs.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ipv6-unicast-routing-vrfs.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ipv6-unicast-routing.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ipv6-unicast-routing.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ipv6-unicast-routing.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ipv6-unicast-routing.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/l2-protocol-forwarding.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/l2-protocol-forwarding.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/l2-protocol-forwarding.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/l2-protocol-forwarding.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/lacp.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/lacp.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/lacp.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/lacp.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/link-tracking-groups.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/link-tracking-groups.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/link-tracking-groups.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/link-tracking-groups.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/lldp.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/lldp.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/lldp.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/lldp.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/load-interval.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/load-interval.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/load-interval.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/load-interval.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/local-users.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/local-users.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/local-users.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/local-users.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/logging.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/logging.j2 similarity index 95% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/logging.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/logging.j2 index ee50ebcb55c..23b28d5665c 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/logging.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/logging.j2 @@ -93,4 +93,9 @@ logging source-interface {{ logging.source_interface }} {% for match_list in logging.policy.match.match_lists | arista.avd.natural_sort('name') %} logging policy match match-list {{ match_list.name }} {{ match_list.action }} {% endfor %} +{% for level in logging.level | arista.avd.natural_sort('facility') %} +{% if level.severity is arista.avd.defined %} +logging level {{ level.facility }} {{ level.severity }} +{% endif %} +{% endfor %} {% endif %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/loopback-interfaces.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/loopback-interfaces.j2 similarity index 96% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/loopback-interfaces.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/loopback-interfaces.j2 index ecc7b77dc93..dc7938624e1 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/loopback-interfaces.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/loopback-interfaces.j2 @@ -39,6 +39,9 @@ interface {{ loopback_interface.name }} {% if loopback_interface.isis_enable is arista.avd.defined %} isis enable {{ loopback_interface.isis_enable }} {% endif %} +{% if loopback_interface.isis_bfd is arista.avd.defined %} + isis bfd +{% endif %} {% if loopback_interface.isis_passive is arista.avd.defined(true) %} isis passive {% endif %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/mac-access-lists.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/mac-access-lists.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/mac-access-lists.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/mac-access-lists.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/mac-address-table-aging-time.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/mac-address-table-aging-time.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/mac-address-table-aging-time.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/mac-address-table-aging-time.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/mac-address-table-notification.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/mac-address-table-notification.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/mac-address-table-notification.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/mac-address-table-notification.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/mac-security.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/mac-security.j2 similarity index 75% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/mac-security.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/mac-security.j2 index ffa7ec52fd5..9e319d3481c 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/mac-security.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/mac-security.j2 @@ -34,13 +34,20 @@ mac security {% if profile.mka.session.rekey_period is arista.avd.defined %} mka session rekey-period {{ profile.mka.session.rekey_period }} {% endif %} +{% if profile.traffic_unprotected.action is arista.avd.defined %} +{% set traffic_unprotected_cli = "traffic unprotected " ~ profile.traffic_unprotected.action %} +{% if profile.traffic_unprotected.action == "allow" and profile.traffic_unprotected.allow_active_sak is arista.avd.defined(true) %} +{% set traffic_unprotected_cli = traffic_unprotected_cli ~ " active-sak" %} +{% endif %} + {{ traffic_unprotected_cli }} +{% endif %} {% if profile.sci is arista.avd.defined(true) %} sci {% endif %} -{% if profile.l2_protocols.ethernet_flow_control is arista.avd.defined %} +{% if profile.l2_protocols.ethernet_flow_control.mode is arista.avd.defined %} l2-protocol ethernet-flow-control {{ profile.l2_protocols.ethernet_flow_control.mode }} {% endif %} -{% if profile.l2_protocols.lldp is arista.avd.defined %} +{% if profile.l2_protocols.lldp.mode is arista.avd.defined %} l2-protocol lldp {{ profile.l2_protocols.lldp.mode }} {% endif %} {% endfor %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/maintenance.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/maintenance.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/maintenance.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/maintenance.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/management-accounts.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/management-accounts.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/management-accounts.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/management-accounts.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/management-api-gnmi.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/management-api-gnmi.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/management-api-gnmi.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/management-api-gnmi.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/management-api-http.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/management-api-http.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/management-api-http.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/management-api-http.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/management-api-models.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/management-api-models.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/management-api-models.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/management-api-models.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/management-console.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/management-console.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/management-console.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/management-console.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/management-cvx.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/management-cvx.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/management-cvx.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/management-cvx.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/management-defaults.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/management-defaults.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/management-defaults.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/management-defaults.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/management-interfaces.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/management-interfaces.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/management-interfaces.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/management-interfaces.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/management-security.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/management-security.j2 similarity index 65% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/management-security.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/management-security.j2 index 6c9bff198a3..eb6d48e776d 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/management-security.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/management-security.j2 @@ -10,6 +10,20 @@ management security {% if management_security.entropy_source is arista.avd.defined %} entropy source {{ management_security.entropy_source }} {% endif %} +{% if management_security.entropy_sources is arista.avd.defined %} +{% set entropy_sources = [] %} +{% for source in ['hardware', 'haveged', 'cpu_jitter'] %} +{% if management_security.entropy_sources[source] is arista.avd.defined(true) %} +{% do entropy_sources.append(source.replace("_", " ")) %} +{% endif %} +{% endfor %} +{% if entropy_sources %} + entropy source {{ entropy_sources | join(" ") }} +{% endif %} +{% if management_security.entropy_sources.hardware_exclusive is arista.avd.defined(true) %} + entropy source hardware exclusive +{% endif %} +{% endif %} {% if management_security.password.encryption_key_common is arista.avd.defined(true) %} password encryption-key common {% endif %} @@ -49,6 +63,31 @@ management security {% endif %} {% endfor %} {% endif %} +{% for profile in management_security.shared_secret_profiles | arista.avd.natural_sort("profile") %} + ! + session shared-secret profile {{ profile.profile }} +{% for secret in profile.secrets | arista.avd.natural_sort("name") %} +{% if secret.secret is arista.avd.defined and + ((secret.receive_lifetime.infinite is arista.avd.defined(true) or (secret.receive_lifetime.start_date_time and secret.receive_lifetime.end_date_time is arista.avd.defined)) and + (secret.transmit_lifetime.infinite is arista.avd.defined(true) or (secret.transmit_lifetime.start_date_time and secret.transmit_lifetime.end_date_time is arista.avd.defined))) %} +{% set secret_cli = "secret " ~ secret.name ~ " " ~ secret.secret_type | arista.avd.default("7") ~ " " ~ secret.secret | arista.avd.hide_passwords(hide_passwords) %} +{% if secret.receive_lifetime.infinite is arista.avd.defined(true) %} +{% set secret_cli = secret_cli ~ " receive-lifetime infinite" %} +{% else %} +{% set secret_cli = secret_cli ~ " receive-lifetime " ~ secret.receive_lifetime.start_date_time ~ " " ~ secret.receive_lifetime.end_date_time %} +{% endif %} +{% if secret.transmit_lifetime.infinite is arista.avd.defined(true) %} +{% set secret_cli = secret_cli ~ " transmit-lifetime infinite" %} +{% else %} +{% set secret_cli = secret_cli ~ " transmit-lifetime " ~ secret.transmit_lifetime.start_date_time ~ " " ~ secret.transmit_lifetime.end_date_time %} +{% endif %} +{% if secret.local_time is arista.avd.defined(true) %} +{% set secret_cli = secret_cli ~ " local-time" %} +{% endif %} + {{ secret_cli }} +{% endif %} +{% endfor %} +{% endfor %} {% for ssl_profile in management_security.ssl_profiles | arista.avd.natural_sort %} ssl profile {{ ssl_profile.name }} {% if ssl_profile.tls_versions is arista.avd.defined %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/management-ssh.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/management-ssh.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/management-ssh.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/management-ssh.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/management-tech-support.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/management-tech-support.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/management-tech-support.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/management-tech-support.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/match-list-input.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/match-list-input.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/match-list-input.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/match-list-input.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/mcs-client.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/mcs-client.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/mcs-client.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/mcs-client.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/mlag-configuration.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/mlag-configuration.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/mlag-configuration.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/mlag-configuration.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/monitor-connectivity.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/monitor-connectivity.j2 similarity index 65% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/monitor-connectivity.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/monitor-connectivity.j2 index b83d32642b7..c9cd0188cda 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/monitor-connectivity.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/monitor-connectivity.j2 @@ -21,7 +21,12 @@ monitor connectivity {% endif %} {% endfor %} {% if monitor_connectivity.local_interfaces is arista.avd.defined %} - local-interfaces {{ monitor_connectivity.local_interfaces }} address-only default +{% set local_interfaces_cli = "local-interfaces " ~ monitor_connectivity.local_interfaces %} +{# In AVD 4.x address_only default is true - TODO reevaluate for AVD 5.0.0 #} +{% if monitor_connectivity.address_only | arista.avd.default(true) %} +{% set local_interfaces_cli = local_interfaces_cli ~ " address-only" %} +{% endif %} + {{ local_interfaces_cli }} default {% endif %} {% for host in monitor_connectivity.hosts | arista.avd.natural_sort('name') %} {% if host.name is arista.avd.defined %} @@ -32,7 +37,12 @@ monitor connectivity {{ host.description }} {% endif %} {% if host.local_interfaces is arista.avd.defined %} - local-interfaces {{ host.local_interfaces }} address-only +{% set local_interfaces_cli = "local-interfaces " ~ host.local_interfaces %} +{# In AVD 4.x address_only default is true - TODO reevaluate for AVD 5.0.0 #} +{% if host.address_only | arista.avd.default(true) %} +{% set local_interfaces_cli = local_interfaces_cli ~ " address-only" %} +{% endif %} + {{ local_interfaces_cli }} {% endif %} {% if host.ip is arista.avd.defined %} ip {{ host.ip }} @@ -51,7 +61,12 @@ monitor connectivity {% endif %} {% endfor %} {% if vrf.local_interfaces is arista.avd.defined %} - local-interfaces {{ vrf.local_interfaces }} address-only default +{% set local_interfaces_cli = "local-interfaces " ~ vrf.local_interfaces %} +{# In AVD 4.x address_only default is true - TODO reevaluate for AVD 5.0.0 #} +{% if vrf.address_only | arista.avd.default(true) %} +{% set local_interfaces_cli = local_interfaces_cli ~ " address-only" %} +{% endif %} + {{ local_interfaces_cli }} default {% endif %} {% if vrf.description is arista.avd.defined %} description @@ -66,7 +81,12 @@ monitor connectivity {{ host.description }} {% endif %} {% if host.local_interfaces is arista.avd.defined %} - local-interfaces {{ host.local_interfaces }} address-only +{% set local_interfaces_cli = "local-interfaces " ~ host.local_interfaces %} +{# In AVD 4.x address_only default is true - TODO reevaluate for AVD 5.0.0 #} +{% if host.address_only | arista.avd.default(true) %} +{% set local_interfaces_cli = local_interfaces_cli ~ " address-only" %} +{% endif %} + {{ local_interfaces_cli }} {% endif %} {% if host.ip is arista.avd.defined %} ip {{ host.ip }} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/monitor-layer1.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/monitor-layer1.j2 similarity index 84% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/monitor-layer1.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/monitor-layer1.j2 index 68555bc5d00..8c750a9cfe9 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/monitor-layer1.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/monitor-layer1.j2 @@ -7,6 +7,9 @@ {% if monitor_layer1.enabled is arista.avd.defined(true) %} ! monitor layer1 +{% if monitor_layer1.logging_transceiver.enabled is arista.avd.defined(true) %} + logging transceiver +{% endif %} {% if monitor_layer1.logging_transceiver.dom is arista.avd.defined(true) %} logging transceiver dom {% endif %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/monitor-sessions.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/monitor-sessions.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/monitor-sessions.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/monitor-sessions.j2 diff --git a/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/monitor-telemetry-influx.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/monitor-telemetry-influx.j2 new file mode 100644 index 00000000000..74c12a1da4d --- /dev/null +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/monitor-telemetry-influx.j2 @@ -0,0 +1,51 @@ +{# + Copyright (c) 2023-2024 Arista Networks, Inc. + Use of this source code is governed by the Apache License 2.0 + that can be found in the LICENSE file. +#} +{# eos - monitor telemetry influx #} +{% if monitor_telemetry_influx is arista.avd.defined %} +! +monitor telemetry influx +{% for destination in monitor_telemetry_influx.destinations | arista.avd.natural_sort('name') %} + destination influxdb {{ destination.name }} +{% if destination.url is arista.avd.defined %} + url {{ destination.url }} +{% endif %} +{% if destination.database is arista.avd.defined %} + database name {{ destination.database }} +{% endif %} +{% if destination.data_retention_policy is arista.avd.defined %} + retention policy {{ destination.data_retention_policy }} +{% endif %} +{% if monitor_telemetry_influx.vrf is arista.avd.defined %} + vrf {{ monitor_telemetry_influx.vrf }} +{% endif %} +{% if destination.username is arista.avd.defined and destination.password is arista.avd.defined %} + username {{ destination.username }} password {{ destination.password_type | arista.avd.default("7") }} {{ destination.password | arista.avd.hide_passwords(hide_passwords) }} +{% endif %} +{% if not loop.last or monitor_telemetry_influx.source_sockets is arista.avd.defined %} + ! +{% endif %} +{% endfor %} +{% for socket in monitor_telemetry_influx.source_sockets | arista.avd.natural_sort('name') %} + source socket {{ socket.name }} +{% if socket.url is arista.avd.defined %} + url {{ socket.url }} +{% endif %} +{% if socket.connection_limit is arista.avd.defined %} + connection limit {{ socket.connection_limit }} +{% endif %} +{% if not loop.last %} + ! +{% endif %} +{% endfor %} +{% for tag in monitor_telemetry_influx.tags | arista.avd.natural_sort('name') %} +{% if tag.value is arista.avd.defined %} + tag global {{ tag.name }} {{ tag.value }} +{% endif %} +{% endfor %} +{% if monitor_telemetry_influx.source_group_standard_disabled is arista.avd.defined(true) %} + source group standard disabled +{% endif %} +{% endif %} diff --git a/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/monitor-telemetry-postcard-policy.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/monitor-telemetry-postcard-policy.j2 new file mode 100644 index 00000000000..3bde516bfe4 --- /dev/null +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/monitor-telemetry-postcard-policy.j2 @@ -0,0 +1,71 @@ +{# + Copyright (c) 2023-2024 Arista Networks, Inc. + Use of this source code is governed by the Apache License 2.0 + that can be found in the LICENSE file. +#} +{# eos - monitor telemetry postcard policy #} +{% if monitor_telemetry_postcard_policy is arista.avd.defined %} +! +monitor telemetry postcard policy +{% if monitor_telemetry_postcard_policy.disabled is arista.avd.defined(false) %} + no disabled +{% elif monitor_telemetry_postcard_policy.disabled is arista.avd.defined(true) %} + disabled +{% endif %} +{% if monitor_telemetry_postcard_policy.ingress.sample.rate is arista.avd.defined %} + ingress sample rate {{ monitor_telemetry_postcard_policy.ingress.sample.rate }} +{% elif monitor_telemetry_postcard_policy.ingress.sample.tcp_udp_checksum.value is arista.avd.defined and monitor_telemetry_postcard_policy.ingress.sample.tcp_udp_checksum.mask is arista.avd.defined %} + ingress sample tcp-udp-checksum value {{ monitor_telemetry_postcard_policy.ingress.sample.tcp_udp_checksum.value }} mask {{ monitor_telemetry_postcard_policy.ingress.sample.tcp_udp_checksum.mask }} +{% endif %} +{% if monitor_telemetry_postcard_policy.marker_vxlan.enabled is arista.avd.defined(true) %} +{% set marker_cli = "marker vxlan" %} +{% if monitor_telemetry_postcard_policy.marker_vxlan.header_word_zero_bit is arista.avd.defined %} +{% set marker_cli = marker_cli ~ " header word 0 bit " ~ monitor_telemetry_postcard_policy.marker_vxlan.header_word_zero_bit %} +{% endif %} + {{ marker_cli }} +{% endif %} +{% if monitor_telemetry_postcard_policy.ingress.collection.source is arista.avd.defined and monitor_telemetry_postcard_policy.ingress.collection.destination is arista.avd.defined %} +{% set ingress_cli = "ingress collection gre source " ~ monitor_telemetry_postcard_policy.ingress.collection.source ~ " destination " ~ monitor_telemetry_postcard_policy.ingress.collection.destination %} +{% if monitor_telemetry_postcard_policy.ingress.collection.version is arista.avd.defined %} +{% set ingress_cli = ingress_cli ~ " version " ~ monitor_telemetry_postcard_policy.ingress.collection.version %} +{% endif %} + {{ ingress_cli }} +{% endif %} +{% for policy in monitor_telemetry_postcard_policy.sample_policies | arista.avd.natural_sort("name") %} + ! + sample policy {{ policy.name }} +{% for rule in policy.match_rules | arista.avd.natural_sort("name") %} +{% if rule.type is arista.avd.defined %} + match {{ rule.name }} {{ rule.type }} +{% if rule.source_prefix is arista.avd.defined %} + source prefix {{ rule.source_prefix }} +{% endif %} +{% if rule.destination_prefix is arista.avd.defined %} + destination prefix {{ rule.destination_prefix }} +{% endif %} +{% for protocol in rule.protocols | arista.avd.natural_sort('protocol') %} +{% if protocol.protocol is arista.avd.defined %} +{% set protocol_cli = "protocol " ~ protocol.protocol %} +{% if protocol.source_ports is arista.avd.defined %} +{% set protocol_cli = protocol_cli ~ " source port " ~ protocol.source_ports | join(", ") %} +{% endif %} +{% if protocol.destination_ports is arista.avd.defined %} +{% set protocol_cli = protocol_cli ~ " destination port " ~ protocol.destination_ports | join(", ") %} +{% endif %} + {{ protocol_cli }} +{% endif %} +{% endfor %} +{% endif %} +{% if not loop.last %} + ! +{% endif %} +{% endfor %} +{% endfor %} +{% for profile in monitor_telemetry_postcard_policy.profiles | arista.avd.natural_sort("name") %} + ! + profile {{ profile.name }} +{% if profile.ingress_sample_policy is arista.avd.defined %} + ingress sample policy {{ profile.ingress_sample_policy }} +{% endif %} +{% endfor %} +{% endif %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/mpls.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/mpls.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/mpls.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/mpls.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ntp.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ntp.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ntp.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ntp.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/patch-panel.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/patch-panel.j2 similarity index 63% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/patch-panel.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/patch-panel.j2 index b718628d3e7..846e2f19671 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/patch-panel.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/patch-panel.j2 @@ -7,6 +7,15 @@ {% if patch_panel is arista.avd.defined %} ! patch panel +{% if patch_panel.connector.interface is arista.avd.defined %} +{% if patch_panel.connector.interface.recovery.review_delay.min is arista.avd.defined and patch_panel.connector.interface.recovery.review_delay.max is arista.avd.defined %} + connector interface recovery review delay {{ patch_panel.connector.interface.recovery.review_delay.min }} {{ patch_panel.connector.interface.recovery.review_delay.max }} +{% endif %} +{% if patch_panel.connector.interface.patch.bgp_vpws_remote_failure_errdisable is arista.avd.defined(true) %} + connector interface patch bgp vpws remote-failure errdisable +{% endif %} + ! +{% endif %} {% for patch in patch_panel.patches | arista.avd.default([]) %} {% if patch.name is arista.avd.defined %} patch {{ patch.name }} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/peer-filters.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/peer-filters.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/peer-filters.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/peer-filters.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/platform-apply.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/platform-apply.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/platform-apply.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/platform-apply.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/platform-trident.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/platform-trident.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/platform-trident.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/platform-trident.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/platform.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/platform.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/platform.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/platform.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/poe.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/poe.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/poe.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/poe.j2 diff --git a/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/policy-maps-copp.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/policy-maps-copp.j2 new file mode 100644 index 00000000000..6479e535933 --- /dev/null +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/policy-maps-copp.j2 @@ -0,0 +1,24 @@ +{# + Copyright (c) 2023-2024 Arista Networks, Inc. + Use of this source code is governed by the Apache License 2.0 + that can be found in the LICENSE file. +#} +{# eos - policy map copp #} +{% if policy_maps.copp_system_policy.classes is arista.avd.defined %} +! +policy-map type copp copp-system-policy +{% for class in policy_maps.copp_system_policy.classes %} + class {{ class.name }} +{% if class.rate_unit is arista.avd.defined %} +{% if class.shape is arista.avd.defined %} + shape {{ class.rate_unit }} {{ class.shape }} +{% endif %} +{% if class.bandwidth is arista.avd.defined %} + bandwidth {{ class.rate_unit }} {{ class.bandwidth }} +{% endif %} +{% endif %} +{% if not loop.last %} + ! +{% endif %} +{% endfor %} +{% endif %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/policy-maps-pbr.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/policy-maps-pbr.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/policy-maps-pbr.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/policy-maps-pbr.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/policy-maps-qos.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/policy-maps-qos.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/policy-maps-qos.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/policy-maps-qos.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/port-channel-interfaces.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/port-channel-interfaces.j2 similarity index 98% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/port-channel-interfaces.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/port-channel-interfaces.j2 index af6f72abb3a..3c506c9764a 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/port-channel-interfaces.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/port-channel-interfaces.j2 @@ -64,7 +64,7 @@ interface {{ port_channel_interface.name }} {% elif port_channel_interface.type | arista.avd.default("switched") == 'switched' %} switchport {% endif %} -{% if port_channel_interface.vlans is arista.avd.defined and port_channel_interface.mode is arista.avd.defined("access") %} +{% if port_channel_interface.vlans is arista.avd.defined and port_channel_interface.mode is arista.avd.defined and port_channel_interface.mode in ["access", "dot1q-tunnel"] %} switchport access vlan {{ port_channel_interface.vlans }} {% endif %} {% if port_channel_interface.vlans is arista.avd.defined and port_channel_interface.mode is arista.avd.defined("trunk") %} @@ -364,6 +364,9 @@ interface {{ port_channel_interface.name }} {% if port_channel_interface.ptp.enable is arista.avd.defined(true) %} ptp enable {% endif %} +{% if port_channel_interface.ptp.mpass is arista.avd.defined(true) %} + ptp mpass +{% endif %} {% if port_channel_interface.ptp.announce.interval is arista.avd.defined %} ptp announce interval {{ port_channel_interface.ptp.announce.interval }} {% endif %} @@ -449,6 +452,9 @@ interface {{ port_channel_interface.name }} {% if port_channel_interface.isis_enable is arista.avd.defined %} isis enable {{ port_channel_interface.isis_enable }} {% endif %} +{% if port_channel_interface.isis_bfd is arista.avd.defined(true) %} + isis bfd +{% endif %} {% if port_channel_interface.isis_circuit_type is arista.avd.defined %} isis circuit-type {{ port_channel_interface.isis_circuit_type }} {% endif %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/prefix-lists.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/prefix-lists.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/prefix-lists.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/prefix-lists.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/priority-flow-control.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/priority-flow-control.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/priority-flow-control.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/priority-flow-control.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/prompt.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/prompt.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/prompt.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/prompt.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ptp.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ptp.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/ptp.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/ptp.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/qos-profiles.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/qos-profiles.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/qos-profiles.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/qos-profiles.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/qos.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/qos.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/qos.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/qos.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/queue-monitor-length.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/queue-monitor-length.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/queue-monitor-length.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/queue-monitor-length.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/queue-monitor-streaming.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/queue-monitor-streaming.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/queue-monitor-streaming.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/queue-monitor-streaming.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/radius-server.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/radius-server.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/radius-server.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/radius-server.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/radius-servers.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/radius-servers.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/radius-servers.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/radius-servers.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/rancid-content-type.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/rancid-content-type.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/rancid-content-type.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/rancid-content-type.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/redundancy.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/redundancy.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/redundancy.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/redundancy.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/roles.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/roles.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/roles.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/roles.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/route-maps.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/route-maps.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/route-maps.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/route-maps.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-adaptive-virtual-topology.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-adaptive-virtual-topology.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-adaptive-virtual-topology.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-adaptive-virtual-topology.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-bfd.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-bfd.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-bfd.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-bfd.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-bgp.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-bgp.j2 similarity index 77% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-bgp.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-bgp.j2 index 6d1065aba8f..4391c12cd14 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-bgp.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-bgp.j2 @@ -201,6 +201,9 @@ router bgp {{ router_bgp.as }} {% if peer_group.session_tracker is arista.avd.defined %} neighbor {{ peer_group.name }} session tracker {{ peer_group.session_tracker }} {% endif %} +{% if peer_group.shared_secret.profile is arista.avd.defined and peer_group.shared_secret.hash_algorithm is arista.avd.defined %} + neighbor {{ peer_group.name }} password shared-secret profile {{ peer_group.shared_secret.profile }} algorithm {{ peer_group.shared_secret.hash_algorithm }} +{% endif %} {% if peer_group.send_community is arista.avd.defined('all') %} neighbor {{ peer_group.name }} send-community {% elif peer_group.send_community is arista.avd.defined %} @@ -216,6 +219,29 @@ router bgp {{ router_bgp.as }} {% endif %} {{ maximum_routes_cli }} {% endif %} +{% if peer_group.missing_policy is arista.avd.defined %} +{% for direction in ['in', 'out'] %} +{% set dir = 'direction_' ~ direction %} +{% set policy = peer_group.missing_policy[dir] %} +{% if policy.action is arista.avd.defined %} +{% set missing_policy_cli = "neighbor " ~ peer_group.name ~ " missing-policy address-family all" %} +{% if policy.include_community_list is arista.avd.defined(true) or policy.include_prefix_list is arista.avd.defined(true) or policy.include_sub_route_map is arista.avd.defined(true) %} +{% set missing_policy_cli = missing_policy_cli ~ " include" %} +{% if policy.include_community_list is arista.avd.defined(true) %} +{% set missing_policy_cli = missing_policy_cli ~ " community-list" %} +{% endif %} +{% if policy.include_prefix_list is arista.avd.defined(true) %} +{% set missing_policy_cli = missing_policy_cli ~ " prefix-list" %} +{% endif %} +{% if policy.include_sub_route_map is arista.avd.defined(true) %} +{% set missing_policy_cli = missing_policy_cli ~ " sub-route-map" %} +{% endif %} +{% endif %} +{% set missing_policy_cli = missing_policy_cli ~ " direction " ~ direction ~ " action " ~ policy.action %} + {{ missing_policy_cli }} +{% endif %} +{% endfor %} +{% endif %} {% if peer_group.link_bandwidth.enabled is arista.avd.defined(true) %} {% set link_bandwidth_cli = "neighbor " ~ peer_group.name ~ " link-bandwidth" %} {% if peer_group.link_bandwidth.default is arista.avd.defined %} @@ -351,6 +377,9 @@ router bgp {{ router_bgp.as }} {% if neighbor.route_map_out is arista.avd.defined %} neighbor {{ neighbor.ip_address }} route-map {{ neighbor.route_map_out }} out {% endif %} +{% if neighbor.shared_secret.profile is arista.avd.defined and neighbor.shared_secret.hash_algorithm is arista.avd.defined %} + neighbor {{ neighbor.ip_address }} password shared-secret profile {{ neighbor.shared_secret.profile }} algorithm {{ neighbor.shared_secret.hash_algorithm }} +{% endif %} {% if neighbor.default_originate.enabled is arista.avd.defined(true) %} {% set default_originate_cli = "neighbor " ~ neighbor.ip_address ~ " default-originate" %} {% if neighbor.default_originate.route_map is arista.avd.defined %} @@ -376,6 +405,29 @@ router bgp {{ router_bgp.as }} {% endif %} {{ maximum_routes_cli }} {% endif %} +{% if neighbor.missing_policy is arista.avd.defined %} +{% for direction in ['in', 'out'] %} +{% set dir = 'direction_' ~ direction %} +{% set policy = neighbor.missing_policy[dir] %} +{% if policy.action is arista.avd.defined %} +{% set missing_policy_cli = "neighbor " ~ neighbor.ip_address ~ " missing-policy address-family all" %} +{% if policy.include_community_list is arista.avd.defined(true) or policy.include_prefix_list is arista.avd.defined(true) or policy.include_sub_route_map is arista.avd.defined(true) %} +{% set missing_policy_cli = missing_policy_cli ~ " include" %} +{% if policy.include_community_list is arista.avd.defined(true) %} +{% set missing_policy_cli = missing_policy_cli ~ " community-list" %} +{% endif %} +{% if policy.include_prefix_list is arista.avd.defined(true) %} +{% set missing_policy_cli = missing_policy_cli ~ " prefix-list" %} +{% endif %} +{% if policy.include_sub_route_map is arista.avd.defined(true) %} +{% set missing_policy_cli = missing_policy_cli ~ " sub-route-map" %} +{% endif %} +{% endif %} +{% set missing_policy_cli = missing_policy_cli ~ " direction " ~ direction ~ " action " ~ policy.action %} + {{ missing_policy_cli }} +{% endif %} +{% endfor %} +{% endif %} {% if neighbor.link_bandwidth.enabled is arista.avd.defined(true) %} {% set link_bandwidth_cli = "neighbor " ~ neighbor.ip_address ~ " link-bandwidth" %} {% if neighbor.link_bandwidth.default is arista.avd.defined %} @@ -384,17 +436,16 @@ router bgp {{ router_bgp.as }} {{ link_bandwidth_cli }} {% endif %} {% endfor %} +{% if router_bgp.bgp.redistribute_internal is arista.avd.defined(true) %} + bgp redistribute-internal +{% elif router_bgp.bgp.redistribute_internal is arista.avd.defined(false) %} + no bgp redistribute-internal +{% endif %} {% for aggregate_address in router_bgp.aggregate_addresses | arista.avd.natural_sort('prefix') %} {% set aggregate_address_cli = "aggregate-address " ~ aggregate_address.prefix %} {% if aggregate_address.as_set is arista.avd.defined(true) %} {% set aggregate_address_cli = aggregate_address_cli ~ " as-set" %} {% endif %} -{% if aggregate_address.advertise_map is arista.avd.defined %} -{% set aggregate_address_cli = aggregate_address_cli ~ " advertise-map " ~ aggregate_address.advertise_map %} -{% endif %} -{% if aggregate_address.supress_map is arista.avd.defined %} -{% set aggregate_address_cli = aggregate_address_cli ~ " supress-map " ~ aggregate_address.supress_map %} -{% endif %} {% if aggregate_address.summary_only is arista.avd.defined(true) %} {% set aggregate_address_cli = aggregate_address_cli ~ " summary-only" %} {% endif %} @@ -412,6 +463,11 @@ router bgp {{ router_bgp.as }} {% for redistribute_route in router_bgp.redistribute_routes | arista.avd.natural_sort('source_protocol') %} {% if redistribute_route.source_protocol is arista.avd.defined %} {% set redistribute_route_cli = "redistribute " ~ redistribute_route.source_protocol %} +{% if redistribute_route.source_protocol in ["ospf", "ospfv3"] %} +{% if redistribute_route.ospf_route_type is arista.avd.defined %} +{% set redistribute_route_cli = redistribute_route_cli ~ " match " ~ redistribute_route.ospf_route_type %} +{% endif %} +{% endif %} {% if redistribute_route.source_protocol == "bgp" %} {% set redistribute_route_cli = redistribute_route_cli ~ " leaked" %} {% elif redistribute_route.include_leaked is arista.avd.defined %} @@ -419,6 +475,10 @@ router bgp {{ router_bgp.as }} {% endif %} {% if redistribute_route.route_map is arista.avd.defined %} {% set redistribute_route_cli = redistribute_route_cli ~ " route-map " ~ redistribute_route.route_map %} +{% elif redistribute_route.source_protocol in ["connected", "static", "isis", "user", "dynamic"] %} +{% if redistribute_route.rcf is arista.avd.defined %} +{% set redistribute_route_cli = redistribute_route_cli ~ " rcf " ~ redistribute_route.rcf %} +{% endif %} {% endif %} {{ redistribute_route_cli }} {% endif %} @@ -545,6 +605,20 @@ router bgp {{ router_bgp.as }} {% if router_bgp.address_family_evpn is arista.avd.defined %} ! address-family evpn +{% if router_bgp.address_family_evpn.bgp_additional_paths.receive is arista.avd.defined(true) %} + bgp additional-paths receive +{% endif %} +{% if router_bgp.address_family_evpn.bgp_additional_paths.send.any is arista.avd.defined(true) %} + bgp additional-paths send any +{% elif router_bgp.address_family_evpn.bgp_additional_paths.send.backup is arista.avd.defined(true) %} + bgp additional-paths send backup +{% elif router_bgp.address_family_evpn.bgp_additional_paths.send.ecmp is arista.avd.defined(true) %} + bgp additional-paths send ecmp +{% elif router_bgp.address_family_evpn.bgp_additional_paths.send.ecmp_limit is arista.avd.defined %} + bgp additional-paths send ecmp limit {{ router_bgp.address_family_evpn.bgp_additional_paths.send.ecmp_limit }} +{% elif router_bgp.address_family_evpn.bgp_additional_paths.send.limit is arista.avd.defined %} + bgp additional-paths send limit {{ router_bgp.address_family_evpn.bgp_additional_paths.send.limit }} +{% endif %} {% if router_bgp.address_family_evpn.next_hop_unchanged is arista.avd.defined(true) %} bgp next-hop-unchanged {% endif %} @@ -597,6 +671,21 @@ router bgp {{ router_bgp.as }} {% if peer_group.route_map_out is arista.avd.defined %} neighbor {{ peer_group.name }} route-map {{ peer_group.route_map_out }} out {% endif %} +{% if peer_group.rcf_in is arista.avd.defined %} + neighbor {{ peer_group.name }} rcf in {{ peer_group.rcf_in }} +{% endif %} +{% if peer_group.rcf_out is arista.avd.defined %} + neighbor {{ peer_group.name }} rcf out {{ peer_group.rcf_out }} +{% endif %} +{% if peer_group.default_route.enabled is arista.avd.defined(true) %} +{% set peer_group_default_route_cli = "neighbor " ~ peer_group.name ~ " default-route" %} +{% if peer_group.default_route.rcf is arista.avd.defined %} +{% set peer_group_default_route_cli = peer_group_default_route_cli ~ " rcf " ~ peer_group.default_route.rcf %} +{% elif peer_group.default_route.route_map is arista.avd.defined %} +{% set peer_group_default_route_cli = peer_group_default_route_cli ~ " route-map " ~ peer_group.default_route.route_map %} +{% endif %} + {{ peer_group_default_route_cli }} +{% endif %} {% if peer_group.activate is arista.avd.defined(true) %} neighbor {{ peer_group.name }} activate {% elif peer_group.activate is arista.avd.defined(false) %} @@ -631,6 +720,21 @@ router bgp {{ router_bgp.as }} {% elif neighbor.activate is arista.avd.defined(false) %} no neighbor {{ neighbor.ip_address }} activate {% endif %} +{% if neighbor.rcf_in is arista.avd.defined %} + neighbor {{ neighbor.ip_address }} rcf in {{ neighbor.rcf_in }} +{% endif %} +{% if neighbor.rcf_out is arista.avd.defined %} + neighbor {{ neighbor.ip_address }} rcf out {{ neighbor.rcf_out }} +{% endif %} +{% if neighbor.default_route.enabled is arista.avd.defined(true) %} +{% set neighbor_default_route_cli = "neighbor " ~ neighbor.ip_address ~ " default-route" %} +{% if neighbor.default_route.rcf is arista.avd.defined %} +{% set neighbor_default_route_cli = neighbor_default_route_cli ~ " rcf " ~ neighbor.default_route.rcf %} +{% elif neighbor.default_route.route_map is arista.avd.defined %} +{% set neighbor_default_route_cli = neighbor_default_route_cli ~ " route-map " ~ neighbor.default_route.route_map %} +{% endif %} + {{ neighbor_default_route_cli }} +{% endif %} {% endfor %} {% if router_bgp.address_family_evpn.next_hop.resolution_disabled is arista.avd.defined(true) %} next-hop resolution disabled @@ -651,6 +755,16 @@ router bgp {{ router_bgp.as }} {% if router_bgp.address_family_evpn.route.export_ethernet_segment_ip_mass_withdraw is arista.avd.defined(true) %} route export ethernet-segment ip mass-withdraw {% endif %} +{% if router_bgp.address_family_evpn.layer_2_fec_in_place_update.enabled is arista.avd.defined(true) %} +{% set layer2_cli = "layer-2 fec in-place update" %} +{% if router_bgp.address_family_evpn.layer_2_fec_in_place_update.timeout is arista.avd.defined %} +{% set layer2_cli = layer2_cli ~ " timeout " ~ router_bgp.address_family_evpn.layer_2_fec_in_place_update.timeout ~ " seconds" %} +{% endif %} + {{ layer2_cli }} +{% endif %} +{% if router_bgp.address_family_evpn.route.import_overlay_index_gateway is arista.avd.defined(true) %} + route import overlay-index gateway +{% endif %} {% endif %} {# address family flow-spec ipv4 activation #} {% if router_bgp.address_family_flow_spec_ipv4 is arista.avd.defined %} @@ -731,6 +845,12 @@ router bgp {{ router_bgp.as }} {% if peer_group.route_map_out is arista.avd.defined %} neighbor {{ peer_group.name }} route-map {{ peer_group.route_map_out }} out {% endif %} +{% if peer_group.rcf_in is arista.avd.defined %} + neighbor {{ peer_group.name }} rcf in {{ peer_group.rcf_in }} +{% endif %} +{% if peer_group.rcf_out is arista.avd.defined %} + neighbor {{ peer_group.name }} rcf out {{ peer_group.rcf_out }} +{% endif %} {% if peer_group.prefix_list_in is arista.avd.defined %} neighbor {{ peer_group.name }} prefix-list {{ peer_group.prefix_list_in }} in {% endif %} @@ -769,6 +889,12 @@ router bgp {{ router_bgp.as }} {% if neighbor.route_map_out is arista.avd.defined %} neighbor {{ neighbor.ip_address }} route-map {{ neighbor.route_map_out }} out {% endif %} +{% if neighbor.rcf_in is arista.avd.defined %} + neighbor {{ neighbor.ip_address }} rcf in {{ neighbor.rcf_in }} +{% endif %} +{% if neighbor.rcf_out is arista.avd.defined %} + neighbor {{ neighbor.ip_address }} rcf out {{ neighbor.rcf_out }} +{% endif %} {% if neighbor.prefix_list_in is arista.avd.defined %} neighbor {{ neighbor.ip_address }} prefix-list {{ neighbor.prefix_list_in }} in {% endif %} @@ -798,6 +924,34 @@ router bgp {{ router_bgp.as }} network {{ network.prefix }} {% endif %} {% endfor %} +{% if router_bgp.address_family_ipv4.bgp.redistribute_internal is arista.avd.defined(true) %} + bgp redistribute-internal +{% elif router_bgp.address_family_ipv4.bgp.redistribute_internal is arista.avd.defined(false) %} + no bgp redistribute-internal +{% endif %} +{% for redistribute_route in router_bgp.address_family_ipv4.redistribute_routes | arista.avd.natural_sort('source_protocol') %} +{% if redistribute_route.source_protocol is arista.avd.defined %} +{% set redistribute_route_cli = "redistribute " ~ redistribute_route.source_protocol %} +{% if redistribute_route.source_protocol in ["ospf", "ospfv3"] %} +{% if redistribute_route.ospf_route_type is arista.avd.defined %} +{% set redistribute_route_cli = redistribute_route_cli ~ " match " ~ redistribute_route.ospf_route_type %} +{% endif %} +{% endif %} +{% if redistribute_route.source_protocol == "bgp" %} +{% set redistribute_route_cli = redistribute_route_cli ~ " leaked" %} +{% elif redistribute_route.include_leaked is arista.avd.defined and redistribute_route.source_protocol in ["connected", "static", "isis", "ospf", "ospfv3"] %} +{% set redistribute_route_cli = redistribute_route_cli ~ " include leaked" %} +{% endif %} +{% if redistribute_route.route_map is arista.avd.defined %} +{% set redistribute_route_cli = redistribute_route_cli ~ " route-map " ~ redistribute_route.route_map %} +{% elif redistribute_route.source_protocol in ["connected", "static", "isis", "user", "dynamic"] %} +{% if redistribute_route.rcf is arista.avd.defined %} +{% set redistribute_route_cli = redistribute_route_cli ~ " rcf " ~ redistribute_route.rcf %} +{% endif %} +{% endif %} + {{ redistribute_route_cli }} +{% endif %} +{% endfor %} {% endif %} {# address family ipv4 multicast activation #} {% if router_bgp.address_family_ipv4_multicast is arista.avd.defined %} @@ -832,8 +986,18 @@ router bgp {{ router_bgp.as }} {% for redistribute_route in router_bgp.address_family_ipv4_multicast.redistribute_routes | arista.avd.natural_sort('source_protocol') %} {% if redistribute_route.source_protocol is arista.avd.defined %} {% set redistribute_route_cli = "redistribute " ~ redistribute_route.source_protocol %} +{% if redistribute_route.source_protocol in ["ospf", "ospfv3"] %} +{% if redistribute_route.ospf_route_type is arista.avd.defined %} +{% set redistribute_route_cli = redistribute_route_cli ~ " match " ~ redistribute_route.ospf_route_type %} +{% endif %} +{% endif %} +{% if redistribute_route.include_leaked is arista.avd.defined and redistribute_route.source_protocol == "isis" %} +{% set redistribute_route_cli = redistribute_route_cli ~ " include leaked" %} +{% endif %} {% if redistribute_route.route_map is arista.avd.defined %} {% set redistribute_route_cli = redistribute_route_cli ~ " route-map " ~ redistribute_route.route_map %} +{% elif redistribute_route.source_protocol == "isis" and redistribute_route.rcf is arista.avd.defined %} +{% set redistribute_route_cli = redistribute_route_cli ~ " rcf " ~ redistribute_route.rcf %} {% endif %} {{ redistribute_route_cli }} {% endif %} @@ -881,6 +1045,12 @@ router bgp {{ router_bgp.as }} {% if peer_group.route_map_out is arista.avd.defined %} neighbor {{ peer_group.name }} route-map {{ peer_group.route_map_out }} out {% endif %} +{% if peer_group.rcf_in is arista.avd.defined %} + neighbor {{ peer_group.name }} rcf in {{ peer_group.rcf_in }} +{% endif %} +{% if peer_group.rcf_out is arista.avd.defined %} + neighbor {{ peer_group.name }} rcf out {{ peer_group.rcf_out }} +{% endif %} {% if peer_group.prefix_list_in is arista.avd.defined %} neighbor {{ peer_group.name }} prefix-list {{ peer_group.prefix_list_in }} in {% endif %} @@ -900,6 +1070,12 @@ router bgp {{ router_bgp.as }} {% if neighbor.route_map_out is arista.avd.defined %} neighbor {{ neighbor.ip_address }} route-map {{ neighbor.route_map_out }} out {% endif %} +{% if neighbor.rcf_in is arista.avd.defined %} + neighbor {{ neighbor.ip_address }} rcf in {{ neighbor.rcf_in }} +{% endif %} +{% if neighbor.rcf_out is arista.avd.defined %} + neighbor {{ neighbor.ip_address }} rcf out {{ neighbor.rcf_out }} +{% endif %} {% if neighbor.prefix_list_in is arista.avd.defined %} neighbor {{ neighbor.ip_address }} prefix-list {{ neighbor.prefix_list_in }} in {% endif %} @@ -919,9 +1095,19 @@ router bgp {{ router_bgp.as }} network {{ network.prefix }} {% endif %} {% endfor %} +{% if router_bgp.address_family_ipv6.bgp.redistribute_internal is arista.avd.defined(true) %} + bgp redistribute-internal +{% elif router_bgp.address_family_ipv6.bgp.redistribute_internal is arista.avd.defined(false) %} + no bgp redistribute-internal +{% endif %} {% for redistribute_route in router_bgp.address_family_ipv6.redistribute_routes | arista.avd.natural_sort('source_protocol') %} {% if redistribute_route.source_protocol is arista.avd.defined %} {% set redistribute_route_cli = "redistribute " ~ redistribute_route.source_protocol %} +{% if redistribute_route.source_protocol == "ospfv3" %} +{% if redistribute_route.ospf_route_type is arista.avd.defined %} +{% set redistribute_route_cli = redistribute_route_cli ~ " match " ~ redistribute_route.ospf_route_type %} +{% endif %} +{% endif %} {% if redistribute_route.source_protocol == "bgp" %} {% set redistribute_route_cli = redistribute_route_cli ~ " leaked" %} {% elif redistribute_route.include_leaked is arista.avd.defined %} @@ -929,6 +1115,10 @@ router bgp {{ router_bgp.as }} {% endif %} {% if redistribute_route.route_map is arista.avd.defined %} {% set redistribute_route_cli = redistribute_route_cli ~ " route-map " ~ redistribute_route.route_map %} +{% elif redistribute_route.source_protocol in ["connected", "static", "isis", "user", "dynamic"] %} +{% if redistribute_route.rcf is arista.avd.defined %} +{% set redistribute_route_cli = redistribute_route_cli ~ " rcf " ~ redistribute_route.rcf %} +{% endif %} {% endif %} {{ redistribute_route_cli }} {% endif %} @@ -972,6 +1162,25 @@ router bgp {{ router_bgp.as }} {% endif %} {{ network_cli }} {% endfor %} +{% for redistribute_route in router_bgp.address_family_ipv6_multicast.redistribute_routes | arista.avd.natural_sort('source_protocol') %} +{% if redistribute_route.source_protocol is arista.avd.defined %} +{% set redistribute_route_cli = "redistribute " ~ redistribute_route.source_protocol %} +{% if redistribute_route.source_protocol in ["ospf", "ospfv3"] %} +{% if redistribute_route.ospf_route_type is arista.avd.defined %} +{% set redistribute_route_cli = redistribute_route_cli ~ " match " ~ redistribute_route.ospf_route_type %} +{% endif %} +{% endif %} +{% if redistribute_route.include_leaked is arista.avd.defined and redistribute_route.source_protocol == "isis" %} +{% set redistribute_route_cli = redistribute_route_cli ~ " include leaked" %} +{% endif %} +{% if redistribute_route.route_map is arista.avd.defined %} +{% set redistribute_route_cli = redistribute_route_cli ~ " route-map " ~ redistribute_route.route_map %} +{% elif redistribute_route.source_protocol == "isis" and redistribute_route.rcf is arista.avd.defined %} +{% set redistribute_route_cli = redistribute_route_cli ~ " rcf " ~ redistribute_route.rcf %} +{% endif %} + {{ redistribute_route_cli }} +{% endif %} +{% endfor %} {% endif %} {# address family ipv6 sr-te activation #} {% if router_bgp.address_family_ipv6_sr_te is arista.avd.defined %} @@ -1134,6 +1343,21 @@ router bgp {{ router_bgp.as }} {% if peer_group.route_map_out is arista.avd.defined %} neighbor {{ peer_group.name }} route-map {{ peer_group.route_map_out }} out {% endif %} +{% if peer_group.rcf_in is arista.avd.defined %} + neighbor {{ peer_group.name }} rcf in {{ peer_group.rcf_in }} +{% endif %} +{% if peer_group.rcf_out is arista.avd.defined %} + neighbor {{ peer_group.name }} rcf out {{ peer_group.rcf_out }} +{% endif %} +{% if peer_group.default_route.enabled is arista.avd.defined(true) %} +{% set peer_group_default_route_cli = "neighbor " ~ peer_group.name ~ " default-route" %} +{% if peer_group.default_route.rcf is arista.avd.defined %} +{% set peer_group_default_route_cli = peer_group_default_route_cli ~ " rcf " ~ peer_group.default_route.rcf %} +{% elif peer_group.default_route.route_map is arista.avd.defined %} +{% set peer_group_default_route_cli = peer_group_default_route_cli ~ " route-map " ~ peer_group.default_route.route_map %} +{% endif %} + {{ peer_group_default_route_cli }} +{% endif %} {% endfor %} {% for neighbor in router_bgp.address_family_vpn_ipv4.neighbors | arista.avd.natural_sort('ip_address') %} {% if neighbor.activate is arista.avd.defined(true) %} @@ -1147,6 +1371,21 @@ router bgp {{ router_bgp.as }} {% if neighbor.route_map_out is arista.avd.defined %} neighbor {{ neighbor.ip_address }} route-map {{ neighbor.route_map_out }} out {% endif %} +{% if neighbor.rcf_in is arista.avd.defined %} + neighbor {{ neighbor.ip_address }} rcf in {{ neighbor.rcf_in }} +{% endif %} +{% if neighbor.rcf_out is arista.avd.defined %} + neighbor {{ neighbor.ip_address }} rcf out {{ neighbor.rcf_out }} +{% endif %} +{% if neighbor.default_route.enabled is arista.avd.defined(true) %} +{% set neighbor_default_route_cli = "neighbor " ~ neighbor.ip_address ~ " default-route" %} +{% if neighbor.default_route.rcf is arista.avd.defined %} +{% set neighbor_default_route_cli = neighbor_default_route_cli ~ " rcf " ~ neighbor.default_route.rcf %} +{% elif neighbor.default_route.route_map is arista.avd.defined %} +{% set neighbor_default_route_cli = neighbor_default_route_cli ~ " route-map " ~ neighbor.default_route.route_map %} +{% endif %} + {{ neighbor_default_route_cli }} +{% endif %} {% endfor %} {% if router_bgp.address_family_vpn_ipv4.neighbor_default_encapsulation_mpls_next_hop_self.source_interface is arista.avd.defined %} neighbor default encapsulation mpls next-hop-self source-interface {{ router_bgp.address_family_vpn_ipv4.neighbor_default_encapsulation_mpls_next_hop_self.source_interface }} @@ -1174,6 +1413,21 @@ router bgp {{ router_bgp.as }} {% if peer_group.route_map_out is arista.avd.defined %} neighbor {{ peer_group.name }} route-map {{ peer_group.route_map_out }} out {% endif %} +{% if peer_group.rcf_in is arista.avd.defined %} + neighbor {{ peer_group.name }} rcf in {{ peer_group.rcf_in }} +{% endif %} +{% if peer_group.rcf_out is arista.avd.defined %} + neighbor {{ peer_group.name }} rcf out {{ peer_group.rcf_out }} +{% endif %} +{% if peer_group.default_route.enabled is arista.avd.defined(true) %} +{% set peer_group_default_route_cli = "neighbor " ~ peer_group.name ~ " default-route" %} +{% if peer_group.default_route.rcf is arista.avd.defined %} +{% set peer_group_default_route_cli = peer_group_default_route_cli ~ " rcf " ~ peer_group.default_route.rcf %} +{% elif peer_group.default_route.route_map is arista.avd.defined %} +{% set peer_group_default_route_cli = peer_group_default_route_cli ~ " route-map " ~ peer_group.default_route.route_map %} +{% endif %} + {{ peer_group_default_route_cli }} +{% endif %} {% endfor %} {% for neighbor in router_bgp.address_family_vpn_ipv6.neighbors | arista.avd.natural_sort('ip_address') %} {% if neighbor.activate is arista.avd.defined(true) %} @@ -1187,6 +1441,21 @@ router bgp {{ router_bgp.as }} {% if neighbor.route_map_out is arista.avd.defined %} neighbor {{ neighbor.ip_address }} route-map {{ neighbor.route_map_out }} out {% endif %} +{% if neighbor.rcf_in is arista.avd.defined %} + neighbor {{ neighbor.ip_address }} rcf in {{ neighbor.rcf_in }} +{% endif %} +{% if neighbor.rcf_out is arista.avd.defined %} + neighbor {{ neighbor.ip_address }} rcf out {{ neighbor.rcf_out }} +{% endif %} +{% if neighbor.default_route.enabled is arista.avd.defined(true) %} +{% set neighbor_default_route_cli = "neighbor " ~ neighbor.ip_address ~ " default-route" %} +{% if neighbor.default_route.rcf is arista.avd.defined %} +{% set neighbor_default_route_cli = neighbor_default_route_cli ~ " rcf " ~ neighbor.default_route.rcf %} +{% elif neighbor.default_route.route_map is arista.avd.defined %} +{% set neighbor_default_route_cli = neighbor_default_route_cli ~ " route-map " ~ neighbor.default_route.route_map %} +{% endif %} + {{ neighbor_default_route_cli }} +{% endif %} {% endfor %} {% if router_bgp.address_family_vpn_ipv6.neighbor_default_encapsulation_mpls_next_hop_self.source_interface is arista.avd.defined %} neighbor default encapsulation mpls next-hop-self source-interface {{ router_bgp.address_family_vpn_ipv6.neighbor_default_encapsulation_mpls_next_hop_self.source_interface }} @@ -1212,13 +1481,36 @@ router bgp {{ router_bgp.as }} {% endif %} {% endif %} {% endif %} +{% if vrf.default_route_exports is arista.avd.defined %} +{% for default_route_export in vrf.default_route_exports %} +{% set vrf_default_route_export_cli = "default-route export " ~ default_route_export.address_family %} +{% if default_route_export.always is arista.avd.defined(true) %} +{% set vrf_default_route_export_cli = vrf_default_route_export_cli ~ " always" %} +{% endif %} +{% if default_route_export.rcf is arista.avd.defined %} +{% set vrf_default_route_export_cli = vrf_default_route_export_cli ~ " rcf " ~ default_route_export.rcf %} +{% elif default_route_export.route_map is arista.avd.defined %} +{% set vrf_default_route_export_cli = vrf_default_route_export_cli ~ " route-map " ~ default_route_export.route_map %} +{% endif %} + {{ vrf_default_route_export_cli }} +{% endfor %} +{% endif %} {% if vrf.route_targets.import is arista.avd.defined %} {% for address_family in vrf.route_targets.import %} {% for route_target in address_family.route_targets %} route-target import {{ address_family.address_family }} {{ route_target }} {% endfor %} -{% if address_family.route_map is arista.avd.defined %} +{% if address_family.address_family in ['evpn', 'vpn-ipv4', 'vpn-ipv6'] %} +{% if address_family.rcf is arista.avd.defined %} +{% if address_family.vpn_route_filter_rcf is arista.avd.defined and address_family.address_family in ['vpn-ipv4', 'vpn-ipv6'] %} + route-target import {{ address_family.address_family }} rcf {{ address_family.rcf }} vpn-route filter-rcf {{ address_family.vpn_route_filter_rcf }} +{% else %} + route-target import {{ address_family.address_family }} rcf {{ address_family.rcf }} +{% endif %} +{% endif %} +{% if address_family.route_map is arista.avd.defined %} route-target import {{ address_family.address_family }} route-map {{ address_family.route_map }} +{% endif %} {% endif %} {% endfor %} {% endif %} @@ -1227,8 +1519,17 @@ router bgp {{ router_bgp.as }} {% for route_target in address_family.route_targets %} route-target export {{ address_family.address_family }} {{ route_target }} {% endfor %} -{% if address_family.route_map is arista.avd.defined %} +{% if address_family.address_family in ['evpn', 'vpn-ipv4', 'vpn-ipv6'] %} +{% if address_family.rcf is arista.avd.defined %} +{% if address_family.vpn_route_filter_rcf is arista.avd.defined and address_family.address_family in ['vpn-ipv4', 'vpn-ipv6'] %} + route-target export {{ address_family.address_family }} rcf {{ address_family.rcf }} vpn-route filter-rcf {{ address_family.vpn_route_filter_rcf }} +{% else %} + route-target export {{ address_family.address_family }} rcf {{ address_family.rcf }} +{% endif %} +{% endif %} +{% if address_family.route_map is arista.avd.defined %} route-target export {{ address_family.address_family }} route-map {{ address_family.route_map }} +{% endif %} {% endif %} {% endfor %} {% endif %} @@ -1422,17 +1723,16 @@ router bgp {{ router_bgp.as }} network {{ network.prefix }} {% endif %} {% endfor %} +{% if vrf.bgp.redistribute_internal is arista.avd.defined(true) %} + bgp redistribute-internal +{% elif vrf.bgp.redistribute_internal is arista.avd.defined(false) %} + no bgp redistribute-internal +{% endif %} {% for aggregate_address in vrf.aggregate_addresses | arista.avd.natural_sort('prefix') %} {% set aggregate_address_cli = "aggregate-address " ~ aggregate_address.prefix %} {% if aggregate_address.as_set is arista.avd.defined(true) %} {% set aggregate_address_cli = aggregate_address_cli ~ " as-set" %} {% endif %} -{% if aggregate_address.advertise_map is arista.avd.defined %} -{% set aggregate_address_cli = aggregate_address_cli ~ " advertise-map " ~ aggregate_address.advertise_map %} -{% endif %} -{% if aggregate_address.supress_map is arista.avd.defined %} -{% set aggregate_address_cli = aggregate_address_cli ~ " supress-map " ~ aggregate_address.supress_map %} -{% endif %} {% if aggregate_address.summary_only is arista.avd.defined(true) %} {% set aggregate_address_cli = aggregate_address_cli ~ " summary-only" %} {% endif %} @@ -1450,6 +1750,11 @@ router bgp {{ router_bgp.as }} {% for redistribute_route in vrf.redistribute_routes | arista.avd.natural_sort('source_protocol') %} {% if redistribute_route.source_protocol is arista.avd.defined %} {% set redistribute_route_cli = "redistribute " ~ redistribute_route.source_protocol %} +{% if redistribute_route.source_protocol in ["ospf", "ospfv3"] %} +{% if redistribute_route.ospf_route_type is arista.avd.defined %} +{% set redistribute_route_cli = redistribute_route_cli ~ " match " ~ redistribute_route.ospf_route_type %} +{% endif %} +{% endif %} {% if redistribute_route.source_protocol == "bgp" %} {% set redistribute_route_cli = redistribute_route_cli ~ " leaked" %} {% elif redistribute_route.include_leaked is arista.avd.defined %} @@ -1457,6 +1762,10 @@ router bgp {{ router_bgp.as }} {% endif %} {% if redistribute_route.route_map is arista.avd.defined %} {% set redistribute_route_cli = redistribute_route_cli ~ " route-map " ~ redistribute_route.route_map %} +{% elif redistribute_route.source_protocol in ["connected", "static", "isis", "user", "dynamic"] %} +{% if redistribute_route.rcf is arista.avd.defined %} +{% set redistribute_route_cli = redistribute_route_cli ~ " rcf " ~ redistribute_route.rcf %} +{% endif %} {% endif %} {{ redistribute_route_cli }} {% endif %} @@ -1530,6 +1839,12 @@ router bgp {{ router_bgp.as }} {% if neighbor.route_map_out is arista.avd.defined %} neighbor {{ neighbor.ip_address }} route-map {{ neighbor.route_map_out }} out {% endif %} +{% if neighbor.rcf_in is arista.avd.defined %} + neighbor {{ neighbor.ip_address }} rcf in {{ neighbor.rcf_in }} +{% endif %} +{% if neighbor.rcf_out is arista.avd.defined %} + neighbor {{ neighbor.ip_address }} rcf out {{ neighbor.rcf_out }} +{% endif %} {# TODO: AVD5.0 remove tmp_vrf_neighbor_prefix_list_in and tmp_vrf_neighbor_prefix_list_out #} {% if neighbor.prefix_list_in is arista.avd.defined %} neighbor {{ neighbor.ip_address }} prefix-list {{ neighbor.prefix_list_in }} in @@ -1573,6 +1888,34 @@ router bgp {{ router_bgp.as }} {% endif %} {{ network_cli }} {% endfor %} +{% if vrf.address_family_ipv4.bgp.redistribute_internal is arista.avd.defined(true) %} + bgp redistribute-internal +{% elif vrf.address_family_ipv4.bgp.redistribute_internal is arista.avd.defined(false) %} + no bgp redistribute-internal +{% endif %} +{% for redistribute_route in vrf.address_family_ipv4.redistribute_routes | arista.avd.natural_sort('source_protocol') %} +{% if redistribute_route.source_protocol is arista.avd.defined %} +{% set redistribute_route_cli = "redistribute " ~ redistribute_route.source_protocol %} +{% if redistribute_route.source_protocol in ["ospf", "ospfv3"] %} +{% if redistribute_route.ospf_route_type is arista.avd.defined %} +{% set redistribute_route_cli = redistribute_route_cli ~ " match " ~ redistribute_route.ospf_route_type %} +{% endif %} +{% endif %} +{% if redistribute_route.source_protocol == "bgp" %} +{% set redistribute_route_cli = redistribute_route_cli ~ " leaked" %} +{% elif redistribute_route.include_leaked is arista.avd.defined %} +{% set redistribute_route_cli = redistribute_route_cli ~ " include leaked" %} +{% endif %} +{% if redistribute_route.route_map is arista.avd.defined %} +{% set redistribute_route_cli = redistribute_route_cli ~ " route-map " ~ redistribute_route.route_map %} +{% elif redistribute_route.source_protocol in ["connected", "static", "isis", "user", "dynamic"] %} +{% if redistribute_route.rcf is arista.avd.defined %} +{% set redistribute_route_cli = redistribute_route_cli ~ " rcf " ~ redistribute_route.rcf %} +{% endif %} +{% endif %} + {{ redistribute_route_cli }} +{% endif %} +{% endfor %} {% endif %} {% if vrf.address_family_ipv4_multicast is arista.avd.defined %} ! @@ -1604,6 +1947,27 @@ router bgp {{ router_bgp.as }} {% endif %} {{ network_cli }} {% endfor %} +{% for redistribute_route in vrf.address_family_ipv4_multicast.redistribute_routes | arista.avd.natural_sort('source_protocol') %} +{% if redistribute_route.source_protocol is arista.avd.defined %} +{% set redistribute_route_cli = "redistribute " ~ redistribute_route.source_protocol %} +{% if redistribute_route.source_protocol in ["ospf", "ospfv3"] %} +{% if redistribute_route.ospf_route_type is arista.avd.defined %} +{% set redistribute_route_cli = redistribute_route_cli ~ " match " ~ redistribute_route.ospf_route_type %} +{% endif %} +{% endif %} +{% if redistribute_route.include_leaked is arista.avd.defined and redistribute_route.source_protocol == "isis" %} +{% set redistribute_route_cli = redistribute_route_cli ~ " include leaked" %} +{% endif %} +{% if redistribute_route.route_map is arista.avd.defined %} +{% set redistribute_route_cli = redistribute_route_cli ~ " route-map " ~ redistribute_route.route_map %} +{% elif redistribute_route.source_protocol == "isis" %} +{% if redistribute_route.rcf is arista.avd.defined %} +{% set redistribute_route_cli = redistribute_route_cli ~ " rcf " ~ redistribute_route.rcf %} +{% endif %} +{% endif %} + {{ redistribute_route_cli }} +{% endif %} +{% endfor %} {% endif %} {% if vrf.address_family_ipv6 is arista.avd.defined %} ! @@ -1643,6 +2007,12 @@ router bgp {{ router_bgp.as }} {% if neighbor.route_map_out is arista.avd.defined %} neighbor {{ neighbor.ip_address }} route-map {{ neighbor.route_map_out }} out {% endif %} +{% if neighbor.rcf_in is arista.avd.defined %} + neighbor {{ neighbor.ip_address }} rcf in {{ neighbor.rcf_in }} +{% endif %} +{% if neighbor.rcf_out is arista.avd.defined %} + neighbor {{ neighbor.ip_address }} rcf out {{ neighbor.rcf_out }} +{% endif %} {% if neighbor.prefix_list_in is arista.avd.defined %} neighbor {{ neighbor.ip_address }} prefix-list {{ neighbor.prefix_list_in }} in {% endif %} @@ -1657,6 +2027,34 @@ router bgp {{ router_bgp.as }} {% endif %} {{ network_cli }} {% endfor %} +{% if vrf.address_family_ipv6.bgp.redistribute_internal is arista.avd.defined(true) %} + bgp redistribute-internal +{% elif vrf.address_family_ipv6.bgp.redistribute_internal is arista.avd.defined(false) %} + no bgp redistribute-internal +{% endif %} +{% for redistribute_route in vrf.address_family_ipv6.redistribute_routes | arista.avd.natural_sort('source_protocol') %} +{% if redistribute_route.source_protocol is arista.avd.defined %} +{% set redistribute_route_cli = "redistribute " ~ redistribute_route.source_protocol %} +{% if redistribute_route.source_protocol == "ospfv3" %} +{% if redistribute_route.ospf_route_type is arista.avd.defined %} +{% set redistribute_route_cli = redistribute_route_cli ~ " match " ~ redistribute_route.ospf_route_type %} +{% endif %} +{% endif %} +{% if redistribute_route.source_protocol == "bgp" %} +{% set redistribute_route_cli = redistribute_route_cli ~ " leaked" %} +{% elif redistribute_route.include_leaked is arista.avd.defined %} +{% set redistribute_route_cli = redistribute_route_cli ~ " include leaked" %} +{% endif %} +{% if redistribute_route.route_map is arista.avd.defined %} +{% set redistribute_route_cli = redistribute_route_cli ~ " route-map " ~ redistribute_route.route_map %} +{% elif redistribute_route.source_protocol in ["connected", "static", "isis", "user", "dynamic"] %} +{% if redistribute_route.rcf is arista.avd.defined %} +{% set redistribute_route_cli = redistribute_route_cli ~ " rcf " ~ redistribute_route.rcf %} +{% endif %} +{% endif %} + {{ redistribute_route_cli }} +{% endif %} +{% endfor %} {% endif %} {% if vrf.address_family_ipv6_multicast is arista.avd.defined %} ! @@ -1688,6 +2086,27 @@ router bgp {{ router_bgp.as }} {% endif %} {{ network_cli }} {% endfor %} +{% for redistribute_route in vrf.address_family_ipv6_multicast.redistribute_routes | arista.avd.natural_sort('source_protocol') %} +{% if redistribute_route.source_protocol is arista.avd.defined %} +{% set redistribute_route_cli = "redistribute " ~ redistribute_route.source_protocol %} +{% if redistribute_route.source_protocol in ["ospf", "ospfv3"] %} +{% if redistribute_route.ospf_route_type is arista.avd.defined %} +{% set redistribute_route_cli = redistribute_route_cli ~ " match " ~ redistribute_route.ospf_route_type %} +{% endif %} +{% endif %} +{% if redistribute_route.include_leaked is arista.avd.defined and redistribute_route.source_protocol == "isis" %} +{% set redistribute_route_cli = redistribute_route_cli ~ " include leaked" %} +{% endif %} +{% if redistribute_route.route_map is arista.avd.defined %} +{% set redistribute_route_cli = redistribute_route_cli ~ " route-map " ~ redistribute_route.route_map %} +{% elif redistribute_route.source_protocol == "isis" %} +{% if redistribute_route.rcf is arista.avd.defined %} +{% set redistribute_route_cli = redistribute_route_cli ~ " rcf " ~ redistribute_route.rcf %} +{% endif %} +{% endif %} + {{ redistribute_route_cli }} +{% endif %} +{% endfor %} {% endif %} {% for address_family in vrf.address_families | arista.avd.natural_sort('address_family') %} ! diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-general.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-general.j2 similarity index 73% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-general.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-general.j2 index ea454fdfc75..d0b4df8a6b8 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-general.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-general.j2 @@ -39,6 +39,20 @@ router general exit ! {% endfor %} +{% if router_general.control_functions is arista.avd.defined %} + control-functions +{% for code_unit in router_general.control_functions.code_units | arista.avd.natural_sort('name') %} +{% if code_unit.content is arista.avd.defined %} +{% set content = code_unit.content %} +{% if not content.rstrip().endswith('\nEOF') %} +{% set content = content.rstrip() + "\nEOF" %} +{% endif %} + code unit {{ code_unit.name }} + {{ content | indent(width=9, first=False) }} +{% endif %} +{% endfor %} + ! +{% endif %} {# EOS issue #} exit {% endif %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-igmp.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-igmp.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-igmp.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-igmp.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-internet-exit.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-internet-exit.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-internet-exit.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-internet-exit.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-isis.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-isis.j2 similarity index 95% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-isis.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-isis.j2 index a92ad9c7855..45b289b3b8d 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-isis.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-isis.j2 @@ -78,11 +78,18 @@ router isis {{ router_isis.instance }} advertise passive-only {% endif %} {% if router_isis.spf_interval.interval is arista.avd.defined %} +{% set spf_interval_cli = "spf-interval " ~ router_isis.spf_interval.interval %} +{% if router_isis.spf_interval.interval_unit is arista.avd.defined %} +{% set spf_interval_cli = spf_interval_cli ~ " " ~ router_isis.spf_interval.interval_unit %} +{% set wait_hold_interval_unit = " milliseconds" %} +{% endif %} {% if router_isis.spf_interval.wait_interval is arista.avd.defined %} - spf-interval {{ router_isis.spf_interval.interval }} {{ router_isis.spf_interval.wait_interval }} -{% else %} - spf-interval {{ router_isis.spf_interval.interval }} +{% set spf_interval_cli = spf_interval_cli ~ " " ~ router_isis.spf_interval.wait_interval ~ wait_hold_interval_unit | arista.avd.default("") %} +{% if router_isis.spf_interval.hold_interval is arista.avd.defined %} +{% set spf_interval_cli = spf_interval_cli ~ " " ~ router_isis.spf_interval.hold_interval ~ wait_hold_interval_unit | arista.avd.default("") %} +{% endif %} {% endif %} + {{ spf_interval_cli }} {% endif %} {% if router_isis.authentication.both.mode is arista.avd.defined and (router_isis.authentication.both.mode in ["md5", "text"] diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-l2-vpn.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-l2-vpn.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-l2-vpn.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-l2-vpn.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-msdp.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-msdp.j2 similarity index 99% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-msdp.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-msdp.j2 index 20e08627eaa..6c474631c04 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-msdp.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-msdp.j2 @@ -106,7 +106,7 @@ router msdp sa-filter in list {{ peer.sa_filter.in_list }} {% endif %} {% if peer.sa_filter.out_list is arista.avd.defined %} - sa-filter out list {{ peer.sa_filter.in_list }} + sa-filter out list {{ peer.sa_filter.out_list }} {% endif %} {% if peer.description is arista.avd.defined %} description {{ peer.description }} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-multicast.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-multicast.j2 similarity index 80% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-multicast.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-multicast.j2 index a2bb0e215fd..37196d469e0 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-multicast.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-multicast.j2 @@ -21,6 +21,9 @@ router multicast {% if router_multicast.ipv4.counters.rate_period_decay is arista.avd.defined %} counters rate period decay {{ router_multicast.ipv4.counters.rate_period_decay }} seconds {% endif %} +{% if router_multicast.ipv4.activity_polling_interval is arista.avd.defined %} + activity polling-interval {{ router_multicast.ipv4.activity_polling_interval }} +{% endif %} {% if router_multicast.ipv4.routing is arista.avd.defined(true) %} routing {% endif %} @@ -31,6 +34,13 @@ router multicast software-forwarding {{ router_multicast.ipv4.software_forwarding }} {% endif %} {% endif %} +{% if router_multicast.ipv6 is arista.avd.defined %} + ! + ipv6 +{% if router_multicast.ipv6.activity_polling_interval is arista.avd.defined %} + activity polling-interval {{ router_multicast.ipv6.activity_polling_interval }} +{% endif %} +{% endif %} {% for vrf in router_multicast.vrfs | arista.avd.natural_sort('name') %} ! vrf {{ vrf.name }} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-ospf.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-ospf.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-ospf.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-ospf.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-path-selection.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-path-selection.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-path-selection.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-path-selection.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-pim-sparse-mode.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-pim-sparse-mode.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-pim-sparse-mode.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-pim-sparse-mode.j2 diff --git a/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-segment-security.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-segment-security.j2 new file mode 100644 index 00000000000..b852359ecf0 --- /dev/null +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-segment-security.j2 @@ -0,0 +1,75 @@ +{# + Copyright (c) 2023-2024 Arista Networks, Inc. + Use of this source code is governed by the Apache License 2.0 + that can be found in the LICENSE file. +#} +{# eos - router segment-security #} +{% if router_segment_security is arista.avd.defined %} +! +router segment-security +{% if router_segment_security.enabled is arista.avd.defined(true) %} + no shutdown + ! +{% endif %} +{% for policy in router_segment_security.policies | arista.avd.natural_sort('name') %} + policy {{ policy.name }} +{% for sequence in policy.sequence_numbers | arista.avd.natural_sort('sequence') %} +{% if sequence.sequence is arista.avd.defined and sequence.action is arista.avd.defined and sequence.application is arista.avd.defined %} +{% set eos_cli = sequence.action %} +{% if sequence.action == "redirect" %} +{% if sequence.next_hop is arista.avd.defined %} +{% set eos_cli = eos_cli ~ " next-hop " ~ sequence.next_hop %} +{% else %} +{% continue %} +{% endif %} +{% endif %} +{% if sequence.stateless | arista.avd.default(true) %} +{% set eos_cli = eos_cli ~ " stateless" %} +{% endif %} +{% if sequence.log is arista.avd.defined(true) %} +{% set eos_cli = eos_cli ~ " log" %} +{% endif %} + {{ sequence.sequence }} application {{ sequence.application }} action {{ eos_cli }} +{% endif %} +{% endfor %} + ! +{% endfor %} +{% for vrf in router_segment_security.vrfs | arista.avd.natural_sort('name') %} + vrf {{ vrf.name }} +{% for segment in vrf.segments | arista.avd.natural_sort('name') %} + segment {{ segment.name }} + definition +{% for interface in segment.definition.interfaces | arista.avd.natural_sort %} + match interface {{ interface }} +{% endfor %} +{% if segment.definition.match_lists is arista.avd.defined %} +{% for match_list in segment.definition.match_lists %} +{% if match_list.address_family is arista.avd.defined and (match_list.prefix is arista.avd.defined or match_list.covered_prefix_list is arista.avd.defined ) %} +{% if match_list.prefix is arista.avd.defined %} +{% set host_cli = "match prefix-" ~ match_list.address_family ~ " " ~ match_list.prefix %} +{% elif match_list.covered_prefix_list is arista.avd.defined %} +{% set host_cli = "match covered prefix-list " ~ match_list.address_family ~ " " ~ match_list.covered_prefix_list %} +{% endif %} + {{ host_cli }} +{% endif %} +{% endfor %} +{% endif %} +{% if segment.policies is arista.avd.defined %} + ! + policies +{% for policy in segment.policies | arista.avd.natural_sort('from') %} +{% if policy.from is arista.avd.defined and policy.policy is arista.avd.defined %} + from {{ policy.from }} policy {{ policy.policy }} +{% endif %} +{% endfor %} +{% if segment.fallback_policy is arista.avd.defined %} + fallback policy {{ segment.fallback_policy }} +{% endif %} +{% endif %} +{% if not loop.last %} + ! +{% endif %} +{% endfor %} + ! +{% endfor %} +{% endif %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-service-insertion.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-service-insertion.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-service-insertion.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-service-insertion.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-traffic-engineering.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-traffic-engineering.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/router-traffic-engineering.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/router-traffic-engineering.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/service-routing-configuration-bgp.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/service-routing-configuration-bgp.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/service-routing-configuration-bgp.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/service-routing-configuration-bgp.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/service-routing-protocols-model.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/service-routing-protocols-model.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/service-routing-protocols-model.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/service-routing-protocols-model.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/service-unsupported-transceiver.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/service-unsupported-transceiver.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/service-unsupported-transceiver.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/service-unsupported-transceiver.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/sflow.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/sflow.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/sflow.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/sflow.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/snmp-server.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/snmp-server.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/snmp-server.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/snmp-server.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/spanning-tree.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/spanning-tree.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/spanning-tree.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/spanning-tree.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/standard-access-lists.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/standard-access-lists.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/standard-access-lists.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/standard-access-lists.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/static-routes.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/static-routes.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/static-routes.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/static-routes.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/stun.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/stun.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/stun.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/stun.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/switchport-default.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/switchport-default.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/switchport-default.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/switchport-default.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/switchport-port-security.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/switchport-port-security.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/switchport-port-security.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/switchport-port-security.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/system-l1.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/system-l1.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/system-l1.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/system-l1.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/system.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/system.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/system.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/system.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/tacacs-servers.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/tacacs-servers.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/tacacs-servers.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/tacacs-servers.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/tap-aggregation.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/tap-aggregation.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/tap-aggregation.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/tap-aggregation.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/tcam-profile.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/tcam-profile.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/tcam-profile.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/tcam-profile.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/terminal.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/terminal.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/terminal.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/terminal.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/trackers.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/trackers.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/trackers.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/trackers.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/traffic-policies.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/traffic-policies.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/traffic-policies.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/traffic-policies.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/transceiver-qsfp-default-mode.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/transceiver-qsfp-default-mode.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/transceiver-qsfp-default-mode.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/transceiver-qsfp-default-mode.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/tunnel-interfaces.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/tunnel-interfaces.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/tunnel-interfaces.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/tunnel-interfaces.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/virtual-source-nat-vrfs.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/virtual-source-nat-vrfs.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/virtual-source-nat-vrfs.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/virtual-source-nat-vrfs.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/vlan-interfaces.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/vlan-interfaces.j2 similarity index 95% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/vlan-interfaces.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/vlan-interfaces.j2 index 5370a1ddcec..4c2f673ec0d 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/vlan-interfaces.j2 +++ b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/vlan-interfaces.j2 @@ -41,6 +41,17 @@ interface {{ vlan_interface.name }} {% if vlan_interface.arp_cache_dynamic_capacity is arista.avd.defined %} arp cache dynamic capacity {{ vlan_interface.arp_cache_dynamic_capacity }} {% endif %} +{% if vlan_interface.ipv6_nd_cache is arista.avd.defined() %} +{% if vlan_interface.ipv6_nd_cache.expire is arista.avd.defined() %} + ipv6 nd cache expire {{ vlan_interface.ipv6_nd_cache.expire }} +{% endif %} +{% if vlan_interface.ipv6_nd_cache.dynamic_capacity is arista.avd.defined() %} + ipv6 nd cache dynamic capacity {{ vlan_interface.ipv6_nd_cache.dynamic_capacity }} +{% endif %} +{% if vlan_interface.ipv6_nd_cache.refresh_always is arista.avd.defined(true) %} + ipv6 nd cache refresh always +{% endif %} +{% endif %} {% if vlan_interface.ip_proxy_arp is arista.avd.defined(true) %} ip proxy-arp {% endif %} @@ -58,6 +69,12 @@ interface {{ vlan_interface.name }} {% if vlan_interface.ip_verify_unicast_source_reachable_via is arista.avd.defined %} ip verify unicast source reachable-via {{ vlan_interface.ip_verify_unicast_source_reachable_via }} {% endif %} +{% if vlan_interface.ip_dhcp_relay_all_subnets is arista.avd.defined(true) %} + ip dhcp relay all-subnets +{% endif %} +{% if vlan_interface.ipv6_dhcp_relay_all_subnets is arista.avd.defined(true) %} + ipv6 dhcp relay all-subnets +{% endif %} {% for ip_helper in vlan_interface.ip_helpers | arista.avd.natural_sort('ip_helper') %} {% set ip_helper_cli = "ip helper-address " ~ ip_helper.ip_helper %} {% if ip_helper.vrf is arista.avd.defined %} @@ -153,6 +170,9 @@ interface {{ vlan_interface.name }} {% if vlan_interface.ipv6_nd_managed_config_flag is arista.avd.defined(true) %} ipv6 nd managed-config-flag {% endif %} +{% if vlan_interface.ipv6_nd_other_config_flag is arista.avd.defined(true) %} + ipv6 nd other-config-flag +{% endif %} {% if vlan_interface.ipv6_nd_prefixes is arista.avd.defined %} {% for prefix in vlan_interface.ipv6_nd_prefixes %} {% set ipv6_nd_prefix_cli = "ipv6 nd prefix " ~ prefix.ipv6_prefix %} @@ -283,6 +303,9 @@ interface {{ vlan_interface.name }} {% if vlan_interface.isis_enable is arista.avd.defined %} isis enable {{ vlan_interface.isis_enable }} {% endif %} +{% if vlan_interface.isis_bfd is arista.avd.defined(true) %} + isis bfd +{% endif %} {% if vlan_interface.isis_passive is arista.avd.defined(true) %} isis passive {% endif %} diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/vlan-internal-order.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/vlan-internal-order.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/vlan-internal-order.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/vlan-internal-order.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/vlans.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/vlans.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/vlans.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/vlans.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/vmtracer-sessions.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/vmtracer-sessions.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/vmtracer-sessions.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/vmtracer-sessions.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/vrfs.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/vrfs.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/vrfs.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/vrfs.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/vxlan-interface.j2 b/python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/vxlan-interface.j2 similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/templates/eos/vxlan-interface.j2 rename to python-avd/pyavd/_eos_cli_config_gen/j2templates/eos/vxlan-interface.j2 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/eos_cli_config_gen.jsonschema.json b/python-avd/pyavd/_eos_cli_config_gen/schema/eos_cli_config_gen.jsonschema.json similarity index 83% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/eos_cli_config_gen.jsonschema.json rename to python-avd/pyavd/_eos_cli_config_gen/schema/eos_cli_config_gen.jsonschema.json index f0de20b5661..c3131464499 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/eos_cli_config_gen.jsonschema.json +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/eos_cli_config_gen.jsonschema.json @@ -20,7 +20,7 @@ "title": "Type" }, "group": { - "description": "Group Name", + "description": "Group Name.", "type": "string", "title": "Group" }, @@ -48,7 +48,7 @@ "title": "Type" }, "group": { - "description": "Group Name", + "description": "Group Name.", "type": "string", "title": "Group" }, @@ -86,7 +86,7 @@ "title": "Type" }, "group": { - "description": "Group Name", + "description": "Group Name.", "type": "string", "title": "Group" } @@ -119,7 +119,7 @@ "title": "Type" }, "group": { - "description": "Group Name", + "description": "Group Name.", "type": "string", "title": "Group" } @@ -147,7 +147,7 @@ "properties": { "commands": { "type": "string", - "description": "Privelege level 'all' or 0-15", + "description": "Privilege level 'all' or 0-15.", "title": "Commands" }, "type": { @@ -160,7 +160,7 @@ "title": "Type" }, "group": { - "description": "Group Name", + "description": "Group Name.", "type": "string", "title": "Group" }, @@ -183,7 +183,7 @@ "properties": { "commands": { "type": "string", - "description": "Privelege level 'all' or 0-15", + "description": "Privilege level 'all' or 0-15.", "title": "Commands" }, "type": { @@ -196,7 +196,7 @@ "title": "Type" }, "group": { - "description": "Group Name", + "description": "Group Name.", "type": "string", "title": "Group" }, @@ -419,7 +419,7 @@ "properties": { "level": { "type": "string", - "description": "Privilege level(s) 0-15", + "description": "Privilege level(s) 0-15.", "title": "Level" }, "default": { @@ -479,7 +479,7 @@ "type": "object", "properties": { "name": { - "description": "Group name", + "description": "Group name.", "type": "string", "title": "Name" }, @@ -499,12 +499,12 @@ "properties": { "server": { "type": "string", - "description": "Hostname or IP address", + "description": "Hostname or IP address.", "title": "Server" }, "vrf": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "VRF" } }, @@ -531,13 +531,21 @@ "properties": { "name": { "type": "string", - "description": "Access-list Name", + "description": "Access-list Name.", "title": "Name" }, "counters_per_entry": { "type": "boolean", "title": "Counters Per Entry" }, + "permit_response_traffic": { + "type": "string", + "enum": [ + "nat" + ], + "description": "Permit response traffic automatically based on NAT translations.\nMinimum EOS version requirement 4.32.2F.", + "title": "Permit Response Traffic" + }, "sequence_numbers": { "type": "array", "items": { @@ -545,12 +553,12 @@ "properties": { "sequence": { "type": "integer", - "description": "Sequence ID", + "description": "Sequence ID.", "title": "Sequence" }, "action": { "type": "string", - "description": "Action as string\nExample: \"deny ip any any\"\n", + "description": "Action as string.\nExample: \"deny ip any any\"\n", "title": "Action" } }, @@ -583,13 +591,13 @@ "type": "array", "items": { "type": "string", - "description": "DHCP server IPv4 address" + "description": "DHCP server IPv4 address." }, "title": "DHCP Servers IPv4" }, "disabled": { "type": "boolean", - "description": "Disable IP locking on configured ports", + "description": "Disable IP locking on configured ports.", "title": "Disabled" }, "leases": { @@ -599,12 +607,12 @@ "properties": { "ip": { "type": "string", - "description": "IP address", + "description": "IP address.", "title": "IP" }, "mac": { "type": "string", - "description": "MAC address (hhhh.hhhh.hhhh or hh:hh:hh:hh:hh:hh)", + "description": "MAC address (hhhh.hhhh.hhhh or hh:hh:hh:hh:hh:hh).", "title": "MAC" } }, @@ -628,17 +636,17 @@ "properties": { "expiration_mac_disabled": { "type": "boolean", - "description": "Configure deauthorizing locked addresses upon MAC aging out", + "description": "Configure deauthorizing locked addresses upon MAC aging out.", "title": "Expiration MAC Disabled" }, "ipv4_enforcement_disabled": { "type": "boolean", - "description": "Configure enforcement for locked IPv4 addresses", + "description": "Configure enforcement for locked IPv4 addresses.", "title": "IPv4 Enforcement Disabled" }, "ipv6_enforcement_disabled": { "type": "boolean", - "description": "Configure enforcement for locked IPv6 addresses", + "description": "Configure enforcement for locked IPv6 addresses.", "title": "IPv6 Enforcement Disabled" } }, @@ -843,7 +851,7 @@ "properties": { "ipv4_applications": { "type": "array", - "description": "List of user defined IPv4 applications.", + "description": "List of user defined IPv4 applications. The name should be unique over all defined applications (ipv4 and l4).", "items": { "type": "object", "properties": { @@ -864,7 +872,7 @@ }, "protocols": { "type": "array", - "description": "List of protocols to consider for this application.\n\nTo use port field-sets (source, destination or both), the list\nmust contain only one or two protocols, either `tcp` or `udp`.\nWhen using both protocols, one line is rendered for each in the configuration,\nhence the field-sets must have the same value for `tcp_src_port_set_name` and\n`udp_src_port_set_name` and for `tcp_dest_port_set_name` and `udp_dest_port_set_name`\nif set in order to generate valid configuration in EOS.", + "description": "List of protocols to consider for this application.\nTo use port field-sets (source, destination or both), the list\nmust contain only one or two protocols, either `tcp` or `udp`.\nWhen using both protocols, one line is rendered for each in the configuration,\nhence the field-sets must have the same value for `tcp_src_port_set_name` and\n`udp_src_port_set_name` and for `tcp_dest_port_set_name` and `udp_dest_port_set_name`\nif set in order to generate valid configuration in EOS.", "items": { "type": "string", "enum": [ @@ -884,7 +892,7 @@ }, "protocol_ranges": { "type": "array", - "description": "Acccept protocol value(s) or range(s).\nProtocol values can be between 1 and 255.", + "description": "Accept protocol value(s) or range(s).\nProtocol values can be between 1 and 255.", "items": { "type": "string" }, @@ -892,22 +900,22 @@ }, "udp_src_port_set_name": { "type": "string", - "description": "Name of field set for UDP source ports.\n\nWhen the `protocols` list contain both `tcp` and `udp`, this key value\nmust be the same as `tcp_src_port_set_name`.", + "description": "Name of field set for UDP source ports.\nWhen the `protocols` list contain both `tcp` and `udp`, this key value\nmust be the same as `tcp_src_port_set_name`.", "title": "UDP Src Port Set Name" }, "tcp_src_port_set_name": { "type": "string", - "description": "Name of field set for TCP source ports.\n\nWhen the `protocols` list contain both `tcp` and `udp`, this key value\nmust be the same as `udp_src_port_set_name`.", + "description": "Name of field set for TCP source ports.\nWhen the `protocols` list contain both `tcp` and `udp`, this key value\nmust be the same as `udp_src_port_set_name`.", "title": "TCP Src Port Set Name" }, "udp_dest_port_set_name": { "type": "string", - "description": "Name of field set for UDP destination ports.\n\nWhen the `protocols` list contain both `tcp` and `udp`, this key value\nmust be the same as `tcp_dest_port_set_name`.", + "description": "Name of field set for UDP destination ports.\nWhen the `protocols` list contain both `tcp` and `udp`, this key value\nmust be the same as `tcp_dest_port_set_name`.", "title": "UDP Dest Port Set Name" }, "tcp_dest_port_set_name": { "type": "string", - "description": "Name of field set for TCP destination ports.\n\nWhen the `protocols` list contain both `tcp` and `udp`, this key value\nmust be the same as `udp_dest_port_set_name`.", + "description": "Name of field set for TCP destination ports.\nWhen the `protocols` list contain both `tcp` and `udp`, this key value\nmust be the same as `udp_dest_port_set_name`.", "title": "TCP Dest Port Set Name" } }, @@ -920,6 +928,76 @@ ] }, "title": "IPv4 Applications" + }, + "l4_applications": { + "type": "array", + "description": "List of user defined L4 applications. The name should be unique over all defined applications (ipv4 and l4).", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Application name.", + "title": "Name" + }, + "protocols": { + "type": "array", + "description": "List of protocols to consider for this application.\nTo use port field-sets (source, destination or both), the list\nmust contain only one or two protocols, either `tcp` or `udp`.\nWhen using both protocols, one line is rendered for each in the configuration,\nhence the field-sets must have the same value for `tcp_src_port_set_name` and\n`udp_src_port_set_name` and for `tcp_dest_port_set_name` and `udp_dest_port_set_name`\nif set in order to generate valid configuration in EOS.", + "items": { + "type": "string", + "enum": [ + "ahp", + "esp", + "icmp", + "igmp", + "ospf", + "pim", + "rsvp", + "tcp", + "udp", + "vrrp" + ] + }, + "title": "Protocols" + }, + "protocol_ranges": { + "type": "array", + "description": "Accept protocol value(s) or range(s).\nProtocol values can be between 1 and 255.", + "items": { + "type": "string" + }, + "title": "Protocol Ranges" + }, + "udp_src_port_set_name": { + "type": "string", + "description": "Name of field set for UDP source ports.\nWhen the `protocols` list contain both `tcp` and `udp`, this key value\nmust be the same as `tcp_src_port_set_name`.", + "title": "UDP Src Port Set Name" + }, + "tcp_src_port_set_name": { + "type": "string", + "description": "Name of field set for TCP source ports.\nWhen the `protocols` list contain both `tcp` and `udp`, this key value\nmust be the same as `udp_src_port_set_name`.", + "title": "TCP Src Port Set Name" + }, + "udp_dest_port_set_name": { + "type": "string", + "description": "Name of field set for UDP destination ports.\nWhen the `protocols` list contain both `tcp` and `udp`, this key value\nmust be the same as `tcp_dest_port_set_name`.", + "title": "UDP Dest Port Set Name" + }, + "tcp_dest_port_set_name": { + "type": "string", + "description": "Name of field set for TCP destination ports.\nWhen the `protocols` list contain both `tcp` and `udp`, this key value\nmust be the same as `udp_dest_port_set_name`.", + "title": "TCP Dest Port Set Name" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "title": "L4 Applications" } }, "additionalProperties": false, @@ -1044,11 +1122,36 @@ "arp": { "type": "object", "properties": { + "persistent": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Restore the ARP cache after reboot.", + "title": "Enabled" + }, + "refresh_delay": { + "type": "integer", + "description": "Time to wait in seconds before refreshing the ARP cache after reboot (EOS default 600).", + "minimum": 600, + "maximum": 3600, + "title": "Refresh Delay" + } + }, + "required": [ + "enabled" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Persistent" + }, "aging": { "type": "object", "properties": { "timeout_default": { - "description": "Timeout in seconds", + "description": "Timeout in seconds.", "type": "integer", "minimum": 60, "maximum": 65535, @@ -1120,7 +1223,7 @@ "properties": { "name": { "type": "string", - "description": "Access List Name", + "description": "Access List Name.", "title": "Name" }, "entries": { @@ -1138,7 +1241,7 @@ }, "match": { "type": "string", - "description": "Regex To Match", + "description": "Regex To Match.", "title": "Match" }, "origin": { @@ -1186,7 +1289,7 @@ "quiet" ], "default": "debug", - "description": "Conversion Mode for AVD input data conversion.\nInput data conversion will perform type conversion of input variables as defined in the schema.\nThe type conversion is intended to help the user to identify minor issues with the input data, while still allowing the data to be validated.\nDuring conversion, messages will generated with information about the host(s) and key(s) which required conversion.\n\"disabled\" means that conversion will not run - avoid this since conversion is also handling data deprecation and upgrade.\n\"error\" will produce error messages and fail the task.\n\"warning\" will produce warning messages.\n\"info\" will produce regular log messages.\n\"debug\" will produce hidden debug messages viewable with -v.\n\"quiet\" will not produce any messages\n", + "description": "Conversion Mode for AVD input data conversion.\nInput data conversion will perform type conversion of input variables as defined in the schema.\nThe type conversion is intended to help the user to identify minor issues with the input data, while still allowing the data to be validated.\nDuring conversion, messages will generated with information about the host(s) and key(s) which required conversion.\n\"disabled\" means that conversion will not run - avoid this since conversion is also handling data deprecation and upgrade.\n\"error\" will produce error messages and fail the task.\n\"warning\" will produce warning messages.\n\"info\" will produce regular log messages.\n\"debug\" will produce hidden debug messages viewable with -v.\n\"quiet\" will not produce any messages.\n", "title": "AVD Data Conversion Mode" }, "avd_data_validation_mode": { @@ -1207,12 +1310,12 @@ "properties": { "login": { "type": "string", - "description": "Multiline string ending with EOF on the last line", + "description": "Multiline string ending with EOF on the last line.", "title": "Login" }, "motd": { "type": "string", - "description": "Multiline string ending with EOF on the last line", + "description": "Multiline string ending with EOF on the last line.", "title": "Motd" } }, @@ -1229,7 +1332,7 @@ "properties": { "name": { "type": "string", - "description": "Group Name", + "description": "Group Name.", "title": "Name" }, "vrf": { @@ -1247,7 +1350,7 @@ "type": "array", "items": { "type": "string", - "description": "Profile Name" + "description": "Profile Name." }, "title": "BGP Maintenance Profiles" } @@ -1264,7 +1367,7 @@ }, "boot": { "title": "System Boot Settings", - "description": "Set the Aboot password\n", + "description": "Set the Aboot password.\n", "type": "object", "properties": { "secret": { @@ -1280,7 +1383,7 @@ "title": "Hash Algorithm" }, "key": { - "description": "Hashed Password", + "description": "Hashed Password.", "type": "string", "title": "Key" } @@ -1308,7 +1411,7 @@ "properties": { "name": { "type": "string", - "description": "Class-Map Name", + "description": "Class-Map Name.", "title": "Name" }, "ip": { @@ -1316,7 +1419,7 @@ "properties": { "access_group": { "type": "string", - "description": "Standard Access-List Name", + "description": "Standard Access-List Name.", "title": "Access Group" } }, @@ -1344,17 +1447,17 @@ "properties": { "name": { "type": "string", - "description": "Class-Map Name", + "description": "Class-Map Name.", "title": "Name" }, "vlan": { "type": "string", - "description": "VLAN value(s) or range(s) of VLAN values", + "description": "VLAN value(s) or range(s) of VLAN values.", "title": "VLAN" }, "cos": { "type": "string", - "description": "CoS value(s) or range(s) of CoS values", + "description": "CoS value(s) or range(s) of CoS values.", "title": "COS" }, "ip": { @@ -1362,7 +1465,7 @@ "properties": { "access_group": { "type": "string", - "description": "IPv4 Access-List Name", + "description": "IPv4 Access-List Name.", "title": "Access Group" } }, @@ -1377,7 +1480,7 @@ "properties": { "access_group": { "type": "string", - "description": "IPv6 Access-List Name", + "description": "IPv6 Access-List Name.", "title": "Access Group" } }, @@ -1426,12 +1529,12 @@ "properties": { "name": { "type": "string", - "description": "Community-list Name", + "description": "Community-list Name.", "title": "Name" }, "action": { "type": "string", - "description": "Action as string\nExample: \"permit GSHUT 65123:123\"\n", + "description": "Action as string.\nExample: \"permit GSHUT 65123:123\"\n", "title": "Action" } }, @@ -1456,7 +1559,7 @@ "description": "- Custom templates can be added below the playbook directory.\n- If a location above the directory is desired, a symbolic link can be used.\n- Example under the `playbooks` directory create symbolic link with the following command:\n\n ```bash\n ln -s ../../shared_repo/custom_avd_templates/ ./custom_avd_templates\n ```\n\n- The output will be rendered at the end of the configuration.\n- The order of custom templates in the list can be important if they overlap.\n- It is recommended to use a `!` delimiter at the top of each custom template.\n\nAdd `custom_templates` to group/host variables:\n", "items": { "type": "string", - "description": "Template relative path below playbook directory" + "description": "Template relative path below playbook directory." } }, "cvx": { @@ -1471,7 +1574,7 @@ "type": "array", "items": { "type": "string", - "description": "IP address or hostname" + "description": "IP address or hostname." }, "title": "Peer Hosts" }, @@ -1486,7 +1589,7 @@ "properties": { "password": { "type": "string", - "description": "Hashed password using the password_type", + "description": "Hashed password using the password_type.", "title": "Password" }, "password_type": { @@ -1519,7 +1622,7 @@ }, "vxlan": { "type": "object", - "description": "VXLAN Controller service", + "description": "VXLAN Controller service.", "properties": { "shutdown": { "type": "boolean", @@ -1560,36 +1663,36 @@ "properties": { "cvaddrs": { "type": "array", - "description": "Streaming address(es) for CloudVision single cluster\n- TCP 9910 is used for CV on-prem\n- TCP 443 is used for CV as a Service\n", + "description": "Streaming address(es) for CloudVision single cluster.\n- TCP 9910 is used for CV on-prem\n- TCP 443 is used for CV as a Service\n", "items": { "type": "string", - "description": "Server address in the format `:`" + "description": "Server address in the format `:`." }, "title": "Cvaddrs" }, "clusters": { "type": "array", - "description": "Multiple CloudVision clusters\n", + "description": "Multiple CloudVision clusters.\n", "items": { "type": "object", "properties": { "name": { "type": "string", - "description": "Cluster Name", + "description": "Cluster Name.", "title": "Name" }, "cvaddrs": { "type": "array", - "description": "Streaming address(es) for CloudVision cluster\n- TCP 9910 is used for CV on-prem\n- TCP 443 is used for CV as a Service\n", + "description": "Streaming address(es) for CloudVision cluster.\n- TCP 9910 is used for CV on-prem\n- TCP 443 is used for CV as a Service\n", "items": { "type": "string", - "description": "Server address in the format `:`" + "description": "Server address in the format `:`." }, "title": "Cvaddrs" }, "cvauth": { "type": "object", - "description": "Authentication scheme used to connect to CloudVision\n", + "description": "Authentication scheme used to connect to CloudVision.\n", "properties": { "method": { "type": "string", @@ -1607,22 +1710,22 @@ }, "token_file": { "type": "string", - "description": "Token file path\ne.g. \"/tmp/token\"\n", + "description": "Token file path.\ne.g. \"/tmp/token\"\n", "title": "Token File" }, "cert_file": { "type": "string", - "description": "Client certificate file path\ne.g. \"/persist/secure/ssl/terminattr/primary/certs/client.crt\"\n", + "description": "Client certificate file path.\ne.g. \"/persist/secure/ssl/terminattr/primary/certs/client.crt\"\n", "title": "Cert File" }, "ca_file": { "type": "string", - "description": "CA certificate file path (on-prem only)\ne.g. \"/persist/secure/ssl/terminattr/primary/certs/ca.crt\"\n", + "description": "CA certificate file path (on-prem only).\ne.g. \"/persist/secure/ssl/terminattr/primary/certs/ca.crt\"\n", "title": "Ca File" }, "key_file": { "type": "string", - "description": "Client certificate key file path\ne.g. \"/persist/secure/ssl/terminattr/primary/keys/client.key\"\n", + "description": "Client certificate key file path.\ne.g. \"/persist/secure/ssl/terminattr/primary/keys/client.key\"\n", "title": "Key File" } }, @@ -1634,27 +1737,27 @@ }, "cvobscurekeyfile": { "type": "boolean", - "description": "Encrypt the private key used for authentication to CloudVision\n", + "description": "Encrypt the private key used for authentication to CloudVision.\n", "title": "Cvobscurekeyfile" }, "cvproxy": { "type": "string", - "description": "Proxy server through which CloudVision is reachable. Useful when the CloudVision server is hosted in the cloud.\nThe expected form is http://[user:password@]ip:port, e.g.: `http://arista:arista@10.83.12.78:3128`. Available as of TerminAttr v1.13.0\n", + "description": "Proxy server through which CloudVision is reachable. Useful when the CloudVision server is hosted in the cloud.\nThe expected form is http://[user:password@]ip:port, e.g.: `http://arista:arista@10.83.12.78:3128`. Available as of TerminAttr v1.13.0.\n", "title": "Cvproxy" }, "cvsourceip": { "type": "string", - "description": "Set source IP address in case of in-band managament\n", + "description": "Set source IP address in case of in-band management.\n", "title": "Cvsourceip" }, "cvsourceintf": { "type": "string", - "description": "Set source interface in case of in-band managament. Available as of TerminAttr v1.23.0.\nThe interface name is case sensitive and has to match the interface name in the running-config, e.g.:Vlan100.\n", + "description": "Set source interface in case of in-band management. Available as of TerminAttr v1.23.0.\nThe interface name is case sensitive and has to match the interface name in the running-config, e.g.:Vlan100.\n", "title": "Cvsourceintf" }, "cvvrf": { "type": "string", - "description": "The VRF to use to connect to CloudVision\n", + "description": "The VRF to use to connect to CloudVision.\n", "title": "Cvvrf" } }, @@ -1670,7 +1773,7 @@ }, "cvauth": { "type": "object", - "description": "Authentication scheme used to connect to CloudVision\n", + "description": "Authentication scheme used to connect to CloudVision.\n", "properties": { "method": { "type": "string", @@ -1688,22 +1791,22 @@ }, "token_file": { "type": "string", - "description": "Token file path\ne.g. \"/tmp/token\"\n", + "description": "Token file path.\ne.g. \"/tmp/token\"\n", "title": "Token File" }, "cert_file": { "type": "string", - "description": "Client certificate file path\ne.g. \"/persist/secure/ssl/terminattr/primary/certs/client.crt\"\n", + "description": "Client certificate file path.\ne.g. \"/persist/secure/ssl/terminattr/primary/certs/client.crt\"\n", "title": "Cert File" }, "ca_file": { "type": "string", - "description": "CA certificate file path (on-prem only)\ne.g. \"/persist/secure/ssl/terminattr/primary/certs/ca.crt\"\n", + "description": "CA certificate file path (on-prem only).\ne.g. \"/persist/secure/ssl/terminattr/primary/certs/ca.crt\"\n", "title": "Ca File" }, "key_file": { "type": "string", - "description": "Client certificate key file path\ne.g. \"/persist/secure/ssl/terminattr/primary/keys/client.key\"\n", + "description": "Client certificate key file path.\ne.g. \"/persist/secure/ssl/terminattr/primary/keys/client.key\"\n", "title": "Key File" } }, @@ -1715,47 +1818,47 @@ }, "cvobscurekeyfile": { "type": "boolean", - "description": "Encrypt the private key used for authentication to CloudVision\n", + "description": "Encrypt the private key used for authentication to CloudVision.\n", "title": "Cvobscurekeyfile" }, "cvproxy": { "type": "string", - "description": "Proxy server through which CloudVision is reachable. Useful when the CloudVision server is hosted in the cloud.\nThe expected form is http://[user:password@]ip:port, e.g.: `http://arista:arista@10.83.12.78:3128`. Available as of TerminAttr v1.13.0\n", + "description": "Proxy server through which CloudVision is reachable. Useful when the CloudVision server is hosted in the cloud.\nThe expected form is http://[user:password@]ip:port, e.g.: `http://arista:arista@10.83.12.78:3128`. Available as of TerminAttr v1.13.0.\n", "title": "Cvproxy" }, "cvsourceip": { "type": "string", - "description": "Set source IP address in case of in-band managament\n", + "description": "Set source IP address in case of in-band management.\n", "title": "Cvsourceip" }, "cvsourceintf": { "type": "string", - "description": "Set source interface in case of in-band managament.\nThe interface name is case sensitive and has to match the interface name in the running-config, e.g.:Vlan100.\n", + "description": "Set source interface in case of in-band management.\nThe interface name is case sensitive and has to match the interface name in the running-config, e.g.:Vlan100.\n", "title": "Cvsourceintf" }, "cvvrf": { "type": "string", - "description": "The VRF to use to connect to CloudVision\n", + "description": "The VRF to use to connect to CloudVision.\n", "title": "Cvvrf" }, "cvgnmi": { "type": "boolean", - "description": "Stream states from EOS gNMI servers (Openconfig) to CloudVision. Available as of TerminAttr v1.13.1\n", + "description": "Stream states from EOS gNMI servers (Openconfig) to CloudVision. Available as of TerminAttr v1.13.1.\n", "title": "Cvgnmi" }, "disable_aaa": { "type": "boolean", - "description": "Disable AAA authorization and accounting.\nWhen setting this flag, all commands pushed from CloudVision are applied directly to the CLI without authorization\n", + "description": "Disable AAA authorization and accounting.\nWhen setting this flag, all commands pushed from CloudVision are applied directly to the CLI without authorization.\n", "title": "Disable AAA" }, "grpcaddr": { "type": "string", - "description": "Set the gRPC server address, the default is 127.0.0.1:6042\ne.g. \"MGMT/0.0.0.0:6042\"\n", + "description": "Set the gRPC server address, the default is 127.0.0.1:6042.\ne.g. \"MGMT/0.0.0.0:6042\"\n", "title": "Grpcaddr" }, "grpcreadonly": { "type": "boolean", - "description": "gNMI read-only mode - Disable gnmi.Set()\n", + "description": "gNMI read-only mode - Disable gnmi.Set().\n", "title": "Grpcreadonly" }, "ingestexclude": { @@ -1775,7 +1878,7 @@ }, "ecodhcpaddr": { "type": "string", - "description": "ECO DHCP Collector address or ECO DHCP Fingerprint listening address in standalone mode (default \"127.0.0.1:67\")\n", + "description": "ECO DHCP Collector address or ECO DHCP Fingerprint listening address in standalone mode (default \"127.0.0.1:67\").\n", "title": "Ecodhcpaddr" }, "ipfix": { @@ -1825,12 +1928,12 @@ "properties": { "name": { "type": "string", - "description": "Daemon Name", + "description": "Daemon Name.", "title": "Name" }, "exec": { "type": "string", - "description": "command to run as a daemon\n", + "description": "command to run as a daemon.\n", "title": "Exec" }, "enabled": { @@ -1856,7 +1959,7 @@ "type": "array", "items": { "type": "string", - "description": "Server IP or Hostname" + "description": "Server IP or Hostname." }, "title": "Servers" }, @@ -1897,6 +2000,50 @@ "type": "string", "title": "DNS Domain Name IPv6" }, + "dns_servers_ipv4": { + "type": "array", + "minItems": 1, + "description": "List of DNS servers for IPv4 clients.", + "items": { + "type": "string", + "description": "IPv4 address of DNS server." + }, + "title": "DNS Servers IPv4" + }, + "dns_servers_ipv6": { + "type": "array", + "minItems": 1, + "description": "List of DNS servers for IPv6 clients.", + "items": { + "type": "string", + "description": "IPv6 address of DNS server." + }, + "title": "DNS Servers IPv6" + }, + "tftp_server": { + "type": "object", + "properties": { + "file_ipv4": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "description": "Name of TFTP file for IPv4 clients.", + "title": "File IPv4" + }, + "file_ipv6": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "description": "Name of TFTP file for IPv6 clients.", + "title": "File IPv6" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Tftp Server" + }, "ipv4_vendor_options": { "type": "array", "items": { @@ -2063,15 +2210,15 @@ }, "dns_domain": { "type": "string", - "description": "Domain Name", + "description": "Domain Name.", "title": "DNS Domain" }, "domain_list": { "type": "array", - "description": "Search list of DNS domains", + "description": "Search list of DNS domains.", "items": { "type": "string", - "description": "Domain name" + "description": "Domain name." }, "title": "Domain List" }, @@ -2280,6 +2427,13 @@ "^_.+$": {} }, "title": "Unresponsive" + }, + "accounting_update_interval": { + "type": "integer", + "minimum": 5, + "maximum": 65535, + "description": "Interval period in seconds.", + "title": "Accounting Update Interval" } }, "additionalProperties": false, @@ -2287,6 +2441,119 @@ "^_.+$": {} }, "title": "AAA" + }, + "captive_portal": { + "type": "object", + "description": "Web authentication feature authenticates a supplicant through a web page, referred to as a captive portal.", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "url": { + "type": "string", + "description": "Supported URL type:\n - http: http://[:]\n - https: https://[:]", + "title": "URL" + }, + "ssl_profile": { + "type": "string", + "title": "SSL Profile" + }, + "start_limit_infinite": { + "type": "boolean", + "description": "Set captive-portal start limit to infinte.", + "title": "Start Limit Infinite" + }, + "access_list_ipv4": { + "type": "string", + "description": "Standard access-list name.", + "title": "Access List IPv4" + } + }, + "required": [ + "enabled" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Captive Portal" + }, + "supplicant": { + "type": "object", + "properties": { + "profiles": { + "description": "Dot1x supplicant profiles.", + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "eap_method": { + "type": "string", + "description": "Extensible Authentication Protocol method:\n - EAP Flexible Authentication via Secure Tunneling.\n - EAP with Transport Layer Security.", + "enum": [ + "fast", + "tls" + ], + "title": "Eap Method" + }, + "identity": { + "type": "string", + "description": "User identity.", + "title": "Identity" + }, + "passphrase_type": { + "type": "string", + "enum": [ + "0", + "7", + "8a" + ], + "default": "7", + "title": "Passphrase Type" + }, + "passphrase": { + "type": "string", + "description": "Extensible Authentication Protocol password.", + "title": "Passphrase" + }, + "ssl_profile": { + "type": "string", + "title": "SSL Profile" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "title": "Profiles" + }, + "logging": { + "type": "boolean", + "description": "Enable supplicant logging.", + "title": "Logging" + }, + "disconnect_cached_results_timeout": { + "type": "integer", + "minimum": 60, + "maximum": 65535, + "description": "Timeout in seconds for removing a disconnected supplicant.", + "title": "Disconnect Cached Results Timeout" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Supplicant" } }, "additionalProperties": false, @@ -2405,12 +2672,12 @@ "properties": { "name": { "type": "string", - "description": "Dynamic prefix-list name", + "description": "Dynamic prefix-list name.", "title": "Name" }, "match_map": { "type": "string", - "description": "Route-map name", + "description": "Route-map name.", "title": "Match Map" }, "prefix_list": { @@ -2418,12 +2685,12 @@ "properties": { "ipv4": { "type": "string", - "description": "Prefix-list name", + "description": "Prefix-list name.", "title": "IPv4" }, "ipv6": { "type": "string", - "description": "Prefix-list name", + "description": "Prefix-list name.", "title": "IPv6" } }, @@ -2466,7 +2733,7 @@ }, "eos_cli": { "type": "string", - "description": "Multiline string with EOS CLI rendered directly on the root level of the final EOS configuration", + "description": "Multiline string with EOS CLI rendered directly on the root level of the final EOS configuration.", "title": "EOS CLI" }, "eos_cli_config_gen_configuration": { @@ -2474,7 +2741,7 @@ "properties": { "hide_passwords": { "type": "boolean", - "description": "Replace the input data using the `hide_passwords` filter in the Jinja2 templates by '' in the configruation if true\n", + "description": "Replace the input data using the `hide_passwords` filter in the Jinja2 templates by '' in the configuration if true.\n", "default": false, "title": "Hide Passwords" } @@ -2490,7 +2757,7 @@ "properties": { "hide_passwords": { "type": "boolean", - "description": "Replace the input data using the `hide_passwords` filter in the Jinja2 templates by '' in the documentation if true\n", + "description": "Replace the input data using the `hide_passwords` filter in the Jinja2 templates by '' in the documentation if true.\n", "default": true, "title": "Hide Passwords" } @@ -2562,7 +2829,7 @@ }, "interval": { "type": "integer", - "description": "Interval in seconds", + "description": "Interval in seconds.", "default": 300, "minimum": 30, "maximum": 86400, @@ -2603,7 +2870,7 @@ "type": "integer", "minimum": 0, "maximum": 600, - "description": "Interval in seconds for updating interface counters\"", + "description": "Interval in seconds for updating interface counters.", "title": "Load Interval" }, "speed": { @@ -2621,19 +2888,19 @@ "type": "integer", "minimum": 68, "maximum": 65535, - "description": "\"l2_mtu\" should only be defined for platforms supporting the \"l2 mtu\" CLI\n", + "description": "\"l2_mtu\" should only be defined for platforms supporting the \"l2 mtu\" CLI.\n", "title": "L2 MTU" }, "l2_mru": { "type": "integer", "minimum": 68, "maximum": 65535, - "description": "\"l2_mru\" should only be defined for platforms supporting the \"l2 mru\" CLI\n", + "description": "\"l2_mru\" should only be defined for platforms supporting the \"l2 mru\" CLI.\n", "title": "L2 MRU" }, "vlans": { "type": "string", - "description": "List of switchport vlans as string\nFor a trunk port this would be a range like \"1-200,300\"\nFor an access port this would be a single vlan \"123\"\n", + "description": "List of switchport vlans as string.\nFor a trunk port this would be a range like \"1-200,300\".\nFor an access port this would be a single vlan \"123\".\n", "title": "VLANs" }, "native_vlan": { @@ -2642,7 +2909,7 @@ }, "native_vlan_tag": { "type": "boolean", - "description": "If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence", + "description": "If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence.", "title": "Native VLAN Tag" }, "mode": { @@ -2686,12 +2953,12 @@ "properties": { "encapsulation_dot1q_vlan": { "type": "integer", - "description": "Vlan tag to configure on sub-interface", + "description": "Vlan tag to configure on sub-interface.", "title": "Encapsulation Dot1Q VLAN" }, "forwarding_profile": { "type": "string", - "description": "L2 protocol forwarding profile", + "description": "L2 protocol forwarding profile.", "title": "Forwarding Profile" } }, @@ -2729,12 +2996,12 @@ "properties": { "ipv4": { "type": "boolean", - "description": "Enable address locking for IPv4", + "description": "Enable address locking for IPv4.", "title": "IPv4" }, "ipv6": { "type": "boolean", - "description": "Enable address locking for IPv6", + "description": "Enable address locking for IPv6.", "title": "IPv6" } }, @@ -2765,7 +3032,7 @@ }, "vrf": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "VRF" }, "flow_tracker": { @@ -2818,7 +3085,7 @@ "properties": { "name": { "type": "string", - "description": "Group name", + "description": "Group name.", "title": "Name" }, "direction": { @@ -2845,7 +3112,7 @@ "properties": { "identifier": { "type": "string", - "description": "EVPN Ethernet Segment Identifier (Type 1 format)", + "description": "EVPN Ethernet Segment Identifier (Type 1 format).", "title": "Identifier" }, "redundancy": { @@ -2871,12 +3138,12 @@ "type": "integer", "minimum": 0, "maximum": 65535, - "description": "Preference_value is only used when \"algorithm\" is \"preference\"", + "description": "Preference_value is only used when \"algorithm\" is \"preference\".", "title": "Preference Value" }, "dont_preempt": { "type": "boolean", - "description": "Dont_preempt is only used when \"algorithm\" is \"preference\"", + "description": "Dont_preempt is only used when \"algorithm\" is \"preference\".", "title": "Dont Preempt" }, "hold_time": { @@ -2920,7 +3187,7 @@ }, "route_target": { "type": "string", - "description": "EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx", + "description": "EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx.", "title": "Route Target" } }, @@ -2932,7 +3199,7 @@ }, "encapsulation_dot1q_vlan": { "type": "integer", - "description": "VLAN tag to configure on sub-interface", + "description": "VLAN tag to configure on sub-interface.", "title": "Encapsulation Dot1Q VLAN" }, "encapsulation_vlan": { @@ -2946,17 +3213,17 @@ "properties": { "vlan": { "type": "integer", - "description": "Client VLAN ID", + "description": "Client VLAN ID.", "title": "VLAN" }, "outer": { "type": "integer", - "description": "Client Outer VLAN ID", + "description": "Client Outer VLAN ID.", "title": "Outer" }, "inner": { "type": "integer", - "description": "Client Inner VLAN ID", + "description": "Client Inner VLAN ID.", "title": "Inner" } }, @@ -2979,24 +3246,24 @@ }, "network": { "type": "object", - "description": "Network encapsulations are all optional and skipped if using client unmatched", + "description": "Network encapsulations are all optional and skipped if using client unmatched.", "properties": { "dot1q": { "type": "object", "properties": { "vlan": { "type": "integer", - "description": "Network VLAN ID", + "description": "Network VLAN ID.", "title": "VLAN" }, "outer": { "type": "integer", - "description": "Network outer VLAN ID", + "description": "Network outer VLAN ID.", "title": "Outer" }, "inner": { "type": "integer", - "description": "Network inner VLAN ID", + "description": "Network inner VLAN ID.", "title": "Inner" } }, @@ -3032,7 +3299,7 @@ }, "ip_address": { "type": "string", - "description": "IPv4 address/mask or \"dhcp\"", + "description": "IPv4 address/mask or \"dhcp\".", "title": "IP Address" }, "ip_address_secondaries": { @@ -3052,7 +3319,7 @@ }, "dhcp_client_accept_default_route": { "type": "boolean", - "description": "Install default-route obtained via DHCP", + "description": "Install default-route obtained via DHCP.", "title": "DHCP Client Accept Default Route" }, "dhcp_server_ipv4": { @@ -3076,12 +3343,12 @@ }, "source_interface": { "type": "string", - "description": "Source interface name", + "description": "Source interface name.", "title": "Source Interface" }, "vrf": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "VRF" } }, @@ -3148,7 +3415,7 @@ "properties": { "access_list": { "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Access List" }, "comment": { @@ -3168,16 +3435,17 @@ "type": "integer", "minimum": 1, "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Group" }, "original_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address. The combination of `original_ip` and `original_port` must be unique.", "title": "Original IP" }, "original_port": { "type": "integer", + "description": "TCP/UDP port. The combination of `original_ip` and `original_port` must be unique.", "minimum": 1, "maximum": 65535, "title": "Original Port" @@ -3198,20 +3466,19 @@ }, "translated_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.", "title": "Translated IP" }, "translated_port": { "type": "integer", "minimum": 1, "maximum": 65535, - "description": "requires 'original_port'", + "description": "requires 'original_port'.", "title": "Translated Port" } }, "required": [ - "translated_ip", - "original_ip" + "translated_ip" ], "additionalProperties": false, "patternProperties": { @@ -3255,7 +3522,7 @@ }, "pool_name": { "type": "string", - "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone\nignored if 'nat_type' is overload\n", + "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone.\nignored if 'nat_type' is overload.\n", "title": "Pool Name" }, "priority": { @@ -3283,7 +3550,7 @@ "properties": { "access_list": { "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Access List" }, "comment": { @@ -3303,16 +3570,17 @@ "type": "integer", "minimum": 1, "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Group" }, "original_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address. The combination of `original_ip` and `original_port` must be unique.", "title": "Original IP" }, "original_port": { "type": "integer", + "description": "TCP/UDP port. The combination of `original_ip` and `original_port` must be unique.", "minimum": 1, "maximum": 65535, "title": "Original Port" @@ -3333,20 +3601,19 @@ }, "translated_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.", "title": "Translated IP" }, "translated_port": { "type": "integer", "minimum": 1, "maximum": 65535, - "description": "requires 'original_port'", + "description": "requires 'original_port'.", "title": "Translated Port" } }, "required": [ - "translated_ip", - "original_ip" + "translated_ip" ], "additionalProperties": false, "patternProperties": { @@ -3379,7 +3646,7 @@ }, "ipv6_address_link_local": { "type": "string", - "description": "Link local IPv6 address/mask", + "description": "Link local IPv6 address/mask.", "title": "IPv6 Address Link Local" }, "ipv6_nd_ra_disabled": { @@ -3401,12 +3668,12 @@ }, "valid_lifetime": { "type": "string", - "description": "Infinite or lifetime in seconds", + "description": "Infinite or lifetime in seconds.", "title": "Valid Lifetime" }, "preferred_lifetime": { "type": "string", - "description": "Infinite or lifetime in seconds", + "description": "Infinite or lifetime in seconds.", "title": "Preferred Lifetime" }, "no_autoconfig_flag": { @@ -3431,7 +3698,7 @@ "properties": { "address": { "type": "string", - "description": "DHCP server's IPv6 address", + "description": "DHCP server's IPv6 address.", "title": "Address" }, "vrf": { @@ -3440,17 +3707,17 @@ }, "local_interface": { "type": "string", - "description": "Local interface to communicate with DHCP server - mutually exclusive to source_address", + "description": "Local interface to communicate with DHCP server - mutually exclusive to source_address.", "title": "Local Interface" }, "source_address": { "type": "string", - "description": "Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface", + "description": "Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface.", "title": "Source Address" }, "link_address": { "type": "string", - "description": "Override the default link address specified in the relayed DHCP packet", + "description": "Override the default link address specified in the relayed DHCP packet.", "title": "Link Address" } }, @@ -3466,37 +3733,37 @@ }, "access_group_in": { "type": "string", - "description": "Access list name", + "description": "Access list name.", "title": "Access Group In" }, "access_group_out": { "type": "string", - "description": "Access list name", + "description": "Access list name.", "title": "Access Group Out" }, "ipv6_access_group_in": { "type": "string", - "description": "IPv6 access list name", + "description": "IPv6 access list name.", "title": "IPv6 Access Group In" }, "ipv6_access_group_out": { "type": "string", - "description": "IPv6 access list name", + "description": "IPv6 access list name.", "title": "IPv6 Access Group Out" }, "mac_access_group_in": { "type": "string", - "description": "MAC access list name", + "description": "MAC access list name.", "title": "MAC Access Group In" }, "mac_access_group_out": { "type": "string", - "description": "MAC access list name", + "description": "MAC access list name.", "title": "MAC Access Group Out" }, "multicast": { "type": "object", - "description": "Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both", + "description": "Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both.", "properties": { "ipv4": { "type": "object", @@ -3508,7 +3775,7 @@ "properties": { "boundary": { "type": "string", - "description": "ACL name or multicast IP subnet", + "description": "ACL name or multicast IP subnet.", "title": "Boundary" }, "out": { @@ -3544,7 +3811,7 @@ "properties": { "boundary": { "type": "string", - "description": "ACL name or multicast IP subnet", + "description": "ACL name or multicast IP subnet.", "title": "Boundary" } }, @@ -3596,7 +3863,7 @@ }, "ospf_authentication_key": { "type": "string", - "description": "Encrypted password - only type 7 supported", + "description": "Encrypted password - only type 7 supported.", "title": "OSPF Authentication Key" }, "ospf_message_digest_keys": { @@ -3621,7 +3888,7 @@ }, "key": { "type": "string", - "description": "Encrypted password - only type 7 supported", + "description": "Encrypted password - only type 7 supported.", "title": "Key" } }, @@ -3715,6 +3982,37 @@ }, "title": "MAC Security" }, + "tcp_mss_ceiling": { + "type": "object", + "description": "The TCP MSS clamping feature involves clamping the maximum segment size (MSS) in the TCP header\nof TCP SYN packets if it exceeds the configured MSS ceiling limit for the interface.", + "properties": { + "ipv4_segment_size": { + "type": "integer", + "minimum": 64, + "maximum": 65475, + "title": "IPv4 Segment Size" + }, + "ipv6_segment_size": { + "type": "integer", + "minimum": 64, + "maximum": 65475, + "title": "IPv6 Segment Size" + }, + "direction": { + "type": "string", + "enum": [ + "egress", + "ingress" + ], + "title": "Direction" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "TCP Mss Ceiling" + }, "channel_group": { "type": "object", "properties": { @@ -3740,9 +4038,14 @@ }, "isis_enable": { "type": "string", - "description": "ISIS instance", + "description": "ISIS instance.", "title": "ISIS Enable" }, + "isis_bfd": { + "type": "boolean", + "description": "Enable BFD for ISIS.", + "title": "ISIS BFD" + }, "isis_passive": { "type": "boolean", "title": "ISIS Passive" @@ -3778,7 +4081,7 @@ }, "isis_authentication_key": { "type": "string", - "description": "Type-7 encrypted password", + "description": "Type-7 encrypted password.", "title": "ISIS Authentication Key" }, "poe": { @@ -3798,11 +4101,11 @@ "medium", "low" ], - "description": "Prioritize a port's power in the event that one of the switch's power supplies loses power", + "description": "Prioritize a port's power in the event that one of the switch's power supplies loses power.", "title": "Priority" }, "reboot": { - "description": "Set the PoE power behavior for a PoE port when the system is rebooted", + "description": "Set the PoE power behavior for a PoE port when the system is rebooted.", "type": "object", "properties": { "action": { @@ -3811,7 +4114,7 @@ "maintain", "power-off" ], - "description": "PoE action for interface", + "description": "PoE action for interface.", "title": "Action" } }, @@ -3822,7 +4125,7 @@ "title": "Reboot" }, "link_down": { - "description": "Set the PoE power behavior for a PoE port when the port goes down", + "description": "Set the PoE power behavior for a PoE port when the port goes down.", "type": "object", "properties": { "action": { @@ -3831,7 +4134,7 @@ "maintain", "power-off" ], - "description": "PoE action for interface", + "description": "PoE action for interface.", "title": "Action" }, "power_off_delay": { @@ -3849,7 +4152,7 @@ "title": "Link Down" }, "shutdown": { - "description": "Set the PoE power behavior for a PoE port when the port is admin down", + "description": "Set the PoE power behavior for a PoE port when the port is admin down.", "type": "object", "properties": { "action": { @@ -3858,7 +4161,7 @@ "maintain", "power-off" ], - "description": "PoE action for interface", + "description": "PoE action for interface.", "title": "Action" } }, @@ -3884,7 +4187,7 @@ }, "fixed": { "type": "boolean", - "description": "Set to ignore hardware classification", + "description": "Set to ignore hardware classification.", "title": "Fixed" } }, @@ -3972,7 +4275,7 @@ }, "vlan": { "type": "string", - "description": "VLAN can be 'all' or list of vlans as string", + "description": "VLAN can be 'all' or list of vlans as string.", "title": "VLAN" }, "transport": { @@ -3993,7 +4296,7 @@ }, "profile": { "type": "string", - "description": "Interface profile", + "description": "Interface profile.", "title": "Profile" }, "storm_control": { @@ -4004,7 +4307,7 @@ "properties": { "level": { "type": "string", - "description": "Configure maximum storm-control level", + "description": "Configure maximum storm-control level.", "title": "Level" }, "unit": { @@ -4014,7 +4317,7 @@ "percent", "pps" ], - "description": "Optional field and is hardware dependent", + "description": "Optional field and is hardware dependent.", "title": "Unit" } }, @@ -4029,7 +4332,7 @@ "properties": { "level": { "type": "string", - "description": "Configure maximum storm-control level", + "description": "Configure maximum storm-control level.", "title": "Level" }, "unit": { @@ -4039,7 +4342,7 @@ "percent", "pps" ], - "description": "Optional field and is hardware dependent", + "description": "Optional field and is hardware dependent.", "title": "Unit" } }, @@ -4054,7 +4357,7 @@ "properties": { "level": { "type": "string", - "description": "Configure maximum storm-control level", + "description": "Configure maximum storm-control level.", "title": "Level" }, "unit": { @@ -4064,7 +4367,7 @@ "percent", "pps" ], - "description": "Optional field and is hardware dependent", + "description": "Optional field and is hardware dependent.", "title": "Unit" } }, @@ -4079,7 +4382,7 @@ "properties": { "level": { "type": "string", - "description": "Configure maximum storm-control level", + "description": "Configure maximum storm-control level.", "title": "Level" }, "unit": { @@ -4089,7 +4392,7 @@ "percent", "pps" ], - "description": "Optional field and is hardware dependent", + "description": "Optional field and is hardware dependent.", "title": "Unit" } }, @@ -4156,7 +4459,7 @@ }, "ztp_vlan": { "type": "integer", - "description": "ZTP vlan number", + "description": "ZTP vlan number.", "title": "ZTP VLAN" } }, @@ -4172,7 +4475,7 @@ }, "pvlan_mapping": { "type": "string", - "description": "List of vlans as string", + "description": "List of vlans as string.", "title": "PVLAN Mapping" }, "vlan_translations": { @@ -4182,12 +4485,12 @@ "properties": { "from": { "type": "string", - "description": "List of vlans as string (only one vlan if direction is \"both\")", + "description": "List of vlans as string (only one vlan if direction is \"both\").", "title": "From" }, "to": { "type": "integer", - "description": "VLAN ID", + "description": "VLAN ID.", "title": "To" }, "direction": { @@ -4330,7 +4633,7 @@ }, "reauth_period": { "type": "string", - "description": "Value can be 60-4294967295 or 'server'", + "description": "Value can be 60-4294967295 or 'server'.", "title": "Reauth Period" }, "reauth_timeout_ignore": { @@ -4417,7 +4720,7 @@ }, "service_profile": { "type": "string", - "description": "QOS profile", + "description": "QOS profile.", "title": "Service Profile" }, "shape": { @@ -4425,7 +4728,7 @@ "properties": { "rate": { "type": "string", - "description": "Rate in kbps, pps or percent\nSupported options are platform dependent\nExamples:\n- \"5000 kbps\"\n- \"1000 pps\"\n- \"20 percent\"\n", + "description": "Rate in kbps, pps or percent.\nSupported options are platform dependent.\nExamples:\n- \"5000 kbps\"\n- \"1000 pps\"\n- \"20 percent\"\n", "title": "Rate" } }, @@ -4449,12 +4752,12 @@ }, "dscp": { "type": "integer", - "description": "DSCP value", + "description": "DSCP value.", "title": "DSCP" }, "cos": { "type": "integer", - "description": "COS value", + "description": "COS value.", "title": "COS" } }, @@ -4558,12 +4861,12 @@ }, "interval": { "type": "integer", - "description": "Interval in milliseconds", + "description": "Interval in milliseconds.", "title": "Interval" }, "min_rx": { "type": "integer", - "description": "Rate in milliseconds", + "description": "Rate in milliseconds.", "title": "Min RX" }, "multiplier": { @@ -4587,7 +4890,7 @@ "properties": { "input": { "type": "string", - "description": "Policy Based Routing Policy-map name", + "description": "Policy Based Routing Policy-map name.", "title": "Input" } }, @@ -4602,7 +4905,7 @@ "properties": { "input": { "type": "string", - "description": "Quality of Service Policy-map name", + "description": "Quality of Service Policy-map name.", "title": "Input" } }, @@ -4687,12 +4990,25 @@ "transceiver": { "type": "object", "properties": { + "frequency": { + "type": "string", + "description": "Transceiver Laser Frequency in GHz (min 190000, max 200000).", + "title": "Frequency" + }, + "frequency_unit": { + "type": "string", + "enum": [ + "ghz" + ], + "description": "Unit of Transceiver Laser Frequency.", + "title": "Frequency Unit" + }, "media": { "type": "object", "properties": { "override": { "type": "string", - "description": "Transceiver type", + "description": "Transceiver type.", "title": "Override" } }, @@ -4718,12 +5034,12 @@ "properties": { "input": { "type": "string", - "description": "Ingress traffic policy", + "description": "Ingress traffic policy.", "title": "Input" }, "output": { "type": "string", - "description": "Egress traffic policy", + "description": "Egress traffic policy.", "title": "Output" } }, @@ -4738,7 +5054,7 @@ "properties": { "session_tracker": { "type": "string", - "description": "Name of session tracker", + "description": "Name of session tracker.", "title": "Session Tracker" } }, @@ -4862,17 +5178,17 @@ }, "peer": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Peer" }, "peer_interface": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Peer Interface" }, "peer_type": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Peer Type" }, "sflow": { @@ -4909,7 +5225,7 @@ }, "port_profile": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Port Profile" }, "uc_tx_queues": { @@ -4919,19 +5235,19 @@ "properties": { "id": { "type": "integer", - "description": "TX-Queue ID", + "description": "TX-Queue ID.", "title": "ID" }, "random_detect": { "type": "object", "properties": { "ecn": { - "description": "Explicit Congestion Notification", + "description": "Explicit Congestion Notification.", "type": "object", "properties": { "count": { "type": "boolean", - "description": "Enable counter for random-detect ECNs", + "description": "Enable counter for random-detect ECNs.", "title": "Count" }, "threshold": { @@ -4946,35 +5262,35 @@ "mbytes", "milliseconds" ], - "description": "Indicate the units to be used for the threshold values", + "description": "Indicate the units to be used for the threshold values.", "title": "Units" }, "min": { "type": "integer", "minimum": 1, "maximum": 256000000, - "description": "Set the random-detect ECN minimum-threshold", + "description": "Set the random-detect ECN minimum-threshold.", "title": "Min" }, "max": { "type": "integer", "minimum": 1, "maximum": 256000000, - "description": "Set the random-detect ECN maximum-threshold", + "description": "Set the random-detect ECN maximum-threshold.", "title": "Max" }, "max_probability": { "type": "integer", "minimum": 1, "maximum": 100, - "description": "Set the random-detect ECN max-mark-probability", + "description": "Set the random-detect ECN max-mark-probability.", "title": "Max Probability" }, "weight": { "type": "integer", "minimum": 0, "maximum": 15, - "description": "Set the random-detect ECN weight", + "description": "Set the random-detect ECN weight.", "title": "Weight" } }, @@ -5021,19 +5337,19 @@ "properties": { "id": { "type": "integer", - "description": "TX-Queue ID", + "description": "TX-Queue ID.", "title": "ID" }, "random_detect": { "type": "object", "properties": { "ecn": { - "description": "Explicit Congestion Notification", + "description": "Explicit Congestion Notification.", "type": "object", "properties": { "count": { "type": "boolean", - "description": "Enable counter for random-detect ECNs", + "description": "Enable counter for random-detect ECNs.", "title": "Count" }, "threshold": { @@ -5048,35 +5364,35 @@ "mbytes", "milliseconds" ], - "description": "Indicate the units to be used for the threshold values", + "description": "Indicate the units to be used for the threshold values.", "title": "Units" }, "min": { "type": "integer", "minimum": 1, "maximum": 256000000, - "description": "Set the random-detect ECN minimum-threshold", + "description": "Set the random-detect ECN minimum-threshold.", "title": "Min" }, "max": { "type": "integer", "minimum": 1, "maximum": 256000000, - "description": "Set the random-detect ECN maximum-threshold", + "description": "Set the random-detect ECN maximum-threshold.", "title": "Max" }, "max_probability": { "type": "integer", "minimum": 1, "maximum": 100, - "description": "Set the random-detect ECN max-mark-probability", + "description": "Set the random-detect ECN max-mark-probability.", "title": "Max Probability" }, "weight": { "type": "integer", "minimum": 0, "maximum": 15, - "description": "Set the random-detect ECN weight", + "description": "Set the random-detect ECN weight.", "title": "Weight" } }, @@ -5124,12 +5440,12 @@ "properties": { "id": { "type": "integer", - "description": "VRID", + "description": "VRID.", "title": "ID" }, "priority_level": { "type": "integer", - "description": "Instance priority", + "description": "Instance priority.", "minimum": 1, "maximum": 254, "title": "Priority Level" @@ -5139,7 +5455,7 @@ "properties": { "interval": { "type": "integer", - "description": "Interval in seconds", + "description": "Interval in seconds.", "minimum": 1, "maximum": 255, "title": "Interval" @@ -5163,14 +5479,14 @@ "properties": { "minimum": { "type": "integer", - "description": "Minimum preempt delay in seconds", + "description": "Minimum preempt delay in seconds.", "minimum": 0, "maximum": 3600, "title": "Minimum" }, "reload": { "type": "integer", - "description": "Reload preempt delay in seconds", + "description": "Reload preempt delay in seconds.", "minimum": 0, "maximum": 3600, "title": "Reload" @@ -5226,14 +5542,14 @@ "properties": { "name": { "type": "string", - "description": "Tracked object name", + "description": "Tracked object name.", "title": "Name" }, "decrement": { "type": "integer", "minimum": 1, "maximum": 254, - "description": "Decrement VRRP priority by 1-254", + "description": "Decrement VRRP priority by 1-254.", "title": "Decrement" }, "shutdown": { @@ -5256,7 +5572,7 @@ "properties": { "address": { "type": "string", - "description": "Virtual IPv4 address", + "description": "Virtual IPv4 address.", "title": "Address" }, "version": { @@ -5282,7 +5598,7 @@ "properties": { "address": { "type": "string", - "description": "Virtual IPv6 address", + "description": "Virtual IPv6 address.", "title": "Address" } }, @@ -5308,7 +5624,7 @@ }, "validate_state": { "type": "boolean", - "description": "Set to false to disable interface validation by the `eos_validate_state` role", + "description": "Set to false to disable interface validation by the `eos_validate_state` role.", "title": "Validate State" }, "switchport": { @@ -5417,7 +5733,7 @@ }, "eos_cli": { "type": "string", - "description": "Multiline EOS CLI rendered directly on the ethernet interface in the final EOS configuration", + "description": "Multiline EOS CLI rendered directly on the ethernet interface in the final EOS configuration.", "title": "EOS CLI" } }, @@ -5439,7 +5755,7 @@ "properties": { "name": { "type": "string", - "description": "Event Handler Name", + "description": "Event Handler Name.", "title": "Name" }, "action_type": { @@ -5453,12 +5769,39 @@ }, "action": { "type": "string", - "description": "Command to execute\n", + "description": "Command to execute.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use event_handlers.actions instead.", + "deprecated": true, "title": "Action" }, + "actions": { + "type": "object", + "description": "Note: `bash_command` and `log` are mutually exclusive. `bash_command` takes precedence over `log`.", + "properties": { + "bash_command": { + "type": "string", + "description": "Define BASH command action. Command could be multiline also.", + "title": "Bash Command" + }, + "log": { + "type": "boolean", + "description": "Log a message when the event is triggered.", + "title": "Log" + }, + "increment_device_health_metric": { + "type": "string", + "description": "Name of device-health metric.", + "title": "Increment Device Health Metric" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Actions" + }, "delay": { "type": "integer", - "description": "Event-handler delay in seconds\n", + "description": "Event-handler delay in seconds.\n", "title": "Delay" }, "trigger": { @@ -5466,40 +5809,126 @@ "description": "Configure event trigger condition.\n", "enum": [ "on-boot", + "on-counters", + "on-intf", "on-logging", + "on-maintenance", "on-startup-config", - "on-maintenance" + "vm-tracer vm" ], "title": "Trigger" }, - "trigger_on_maintenance": { - "description": "Settings required for trigger 'on-maintenance'.", + "trigger_on_counters": { "type": "object", "properties": { - "operation": { + "condition": { "type": "string", - "enum": [ - "enter", - "exit" - ], - "title": "Operation" + "description": "Set the logical expression to evaluate.", + "title": "Condition" }, - "bgp_peer": { - "description": "Ipv4/Ipv6 address or peer group name.\nTrigger condition occurs on maintenance operation of specified BGP peer.", - "type": "string", - "title": "BGP Peer" + "granularity_per_source": { + "type": "boolean", + "description": "Set the granularity of event counting for a wildcarded condition.\nExample -\n condition ( Arad*.IptCrcErrCnt.delta > 100 ) and ( Arad*.UcFifoFullDrop.delta > 100 )\n [* wildcard is used here]", + "title": "Granularity Per Source" }, - "action": { - "type": "string", - "description": "Action for maintenance operation.", - "enum": [ - "after", - "before", - "all", - "begin", - "end" - ], - "title": "Action" + "poll_interval": { + "type": "integer", + "minimum": 1, + "maximum": 1000000, + "description": "Set the polling interval in seconds.", + "title": "Poll Interval" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Trigger On Counters" + }, + "trigger_on_logging": { + "type": "object", + "properties": { + "poll_interval": { + "type": "integer", + "minimum": 1, + "maximum": 1000000, + "description": "Set the polling interval in seconds.", + "title": "Poll Interval" + }, + "regex": { + "type": "string", + "description": "Regular expression to use for searching log messages.", + "title": "Regex" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Trigger On Logging" + }, + "trigger_on_intf": { + "type": "object", + "description": "Trigger condition occurs on specified interface changes.\nNote: Any one of the `ip`, `ipv6` and `operstatus` key needs to be defined along with the `interface`.", + "properties": { + "interface": { + "type": "string", + "description": "Interface name.\nExample - Ethernet4\n Loopback4-6\n Port-channel4,7", + "title": "Interface" + }, + "ip": { + "type": "boolean", + "description": "Action is triggered upon changes to interface IP address assignment.", + "title": "IP" + }, + "ipv6": { + "type": "boolean", + "description": "Action is triggered upon changes to interface ipv6 address assignment.", + "title": "IPv6" + }, + "operstatus": { + "type": "boolean", + "description": "Action is triggered upon changes to interface operStatus.", + "title": "Operstatus" + } + }, + "required": [ + "interface" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Trigger On Intf" + }, + "trigger_on_maintenance": { + "description": "Settings required for trigger 'on-maintenance'.", + "type": "object", + "properties": { + "operation": { + "type": "string", + "enum": [ + "enter", + "exit" + ], + "title": "Operation" + }, + "bgp_peer": { + "description": "Ipv4/Ipv6 address or peer group name.\nTrigger condition occurs on maintenance operation of specified BGP peer.", + "type": "string", + "title": "BGP Peer" + }, + "action": { + "type": "string", + "description": "Action for maintenance operation.", + "enum": [ + "after", + "before", + "all", + "begin", + "end" + ], + "title": "Action" }, "stage": { "type": "string", @@ -5540,7 +5969,8 @@ }, "regex": { "type": "string", - "description": "Regular expression to use for searching log messages. Required for on-logging trigger\n", + "description": "Regular expression to use for searching log messages. Required for on-logging trigger.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use event_handlers.trigger_on_logging.regex instead.", + "deprecated": true, "title": "Regex" }, "asynchronous": { @@ -5655,14 +6085,14 @@ "type": "integer", "minimum": 3000, "maximum": 900000, - "description": "Flow record inactive export timeout in milliseconds", + "description": "Flow record inactive export timeout in milliseconds.", "title": "On Inactive Timeout" }, "on_interval": { "type": "integer", "minimum": 1000, "maximum": 36000000, - "description": "Flow record export interval in milliseconds", + "description": "Flow record export interval in milliseconds.", "title": "On Interval" } }, @@ -5674,7 +6104,7 @@ }, "name": { "type": "string", - "description": "Tracker Name", + "description": "Tracker Name.", "title": "Name" }, "exporters": { @@ -5684,7 +6114,7 @@ "properties": { "name": { "type": "string", - "description": "Exporter Name", + "description": "Exporter Name.", "title": "Name" }, "collector": { @@ -5692,12 +6122,12 @@ "properties": { "host": { "type": "string", - "description": "Collector IPv4 address or IPv6 address or fully qualified domain name", + "description": "Collector IPv4 address or IPv6 address or fully qualified domain name.", "title": "Host" }, "port": { "type": "integer", - "description": "Collector Port Number", + "description": "Collector Port Number.", "minimum": 1, "maximum": 65535, "title": "Port" @@ -5725,14 +6155,14 @@ }, "local_interface": { "type": "string", - "description": "Local Source Interface", + "description": "Local Source Interface.", "title": "Local Interface" }, "template_interval": { "type": "integer", "minimum": 5000, "maximum": 3600000, - "description": "Template interval in milliseconds", + "description": "Template interval in milliseconds.", "title": "Template Interval" } }, @@ -5794,7 +6224,7 @@ "properties": { "name": { "type": "string", - "description": "Tracker Name", + "description": "Tracker Name.", "title": "Name" }, "record_export": { @@ -5804,14 +6234,14 @@ "type": "integer", "minimum": 3000, "maximum": 900000, - "description": "Flow record inactive export timeout in milliseconds", + "description": "Flow record inactive export timeout in milliseconds.", "title": "On Inactive Timeout" }, "on_interval": { "type": "integer", "minimum": 1000, "maximum": 36000000, - "description": "Flow record export interval in milliseconds", + "description": "Flow record export interval in milliseconds.", "title": "On Interval" } }, @@ -5828,7 +6258,7 @@ "properties": { "name": { "type": "string", - "description": "Exporter Name", + "description": "Exporter Name.", "title": "Name" }, "collector": { @@ -5836,12 +6266,12 @@ "properties": { "host": { "type": "string", - "description": "Collector IPv4 address or IPv6 address or fully qualified domain name", + "description": "Collector IPv4 address or IPv6 address or fully qualified domain name.", "title": "Host" }, "port": { "type": "integer", - "description": "Collector Port Number", + "description": "Collector Port Number.", "minimum": 1, "maximum": 65535, "title": "Port" @@ -5869,14 +6299,14 @@ }, "local_interface": { "type": "string", - "description": "Local Source Interface", + "description": "Local Source Interface.", "title": "Local Interface" }, "template_interval": { "type": "integer", "minimum": 5000, "maximum": 3600000, - "description": "Template interval in milliseconds", + "description": "Template interval in milliseconds.", "title": "Template Interval" } }, @@ -5930,7 +6360,7 @@ "enum": [ "sampled" ], - "description": "Flow Tracking Type - only 'sampled' supported for now", + "description": "Flow Tracking Type - only 'sampled' supported for now.", "title": "Type" }, "sample": { @@ -5946,7 +6376,7 @@ "properties": { "name": { "type": "string", - "description": "Tracker Name", + "description": "Tracker Name.", "title": "Name" }, "record_export": { @@ -5956,19 +6386,19 @@ "type": "integer", "minimum": 3000, "maximum": 900000, - "description": "Flow record inactive export timeout in milliseconds", + "description": "Flow record inactive export timeout in milliseconds.", "title": "On Inactive Timeout" }, "on_interval": { "type": "integer", "minimum": 1000, "maximum": 36000000, - "description": "Flow record export interval in milliseconds", + "description": "Flow record export interval in milliseconds.", "title": "On Interval" }, "mpls": { "type": "boolean", - "description": "Export MPLS forwarding information", + "description": "Export MPLS forwarding information.", "title": "MPLS" } }, @@ -5985,7 +6415,7 @@ "properties": { "name": { "type": "string", - "description": "Exporter Name", + "description": "Exporter Name.", "title": "Name" }, "collector": { @@ -5993,12 +6423,12 @@ "properties": { "host": { "type": "string", - "description": "Collector IPv4 address or IPv6 address or fully qualified domain name", + "description": "Collector IPv4 address or IPv6 address or fully qualified domain name.", "title": "Host" }, "port": { "type": "integer", - "description": "Collector Port Number", + "description": "Collector Port Number.", "minimum": 1, "maximum": 65535, "title": "Port" @@ -6026,14 +6456,14 @@ }, "local_interface": { "type": "string", - "description": "Local Source Interface", + "description": "Local Source Interface.", "title": "Local Interface" }, "template_interval": { "type": "integer", "minimum": 5000, "maximum": 3600000, - "description": "Template interval in milliseconds", + "description": "Template interval in milliseconds.", "title": "Template Interval" } }, @@ -6125,7 +6555,7 @@ }, "serdes": { "type": "string", - "description": "Serdes speed like \"10g\" or \"25g\"", + "description": "Serdes speed like \"10g\" or \"25g\".", "title": "Serdes" } }, @@ -6151,7 +6581,7 @@ "properties": { "features": { "type": "array", - "description": "This data model allows to configure the list of hardware counters feature\navailable on Arista platforms.\n\nThe `name` key accepts a list of valid_values which MUST be updated to support\nnew feature as they are released in EOS.\n\nThe available values of the different keys like 'direction' or 'address_type'\nare feature and hardware dependent and this model DOES NOT validate that the\ncombinations are valid. It is the responsability of the user of this data model\nto make sure that the rendered CLI is accepted by the targeted device.\n\nExamples:\n\n * Use:\n ```yaml\n hardware_counters:\n features:\n - name: ip\n direction: out\n layer3: true\n units_packets: true\n ```\n\n to render:\n ```eos\n hardware counter feature ip out layer3 units packets\n ```\n * Use:\n ```yaml\n hardware_counters:\n features:\n - name: route\n address_type: ipv4\n vrf: test\n prefix: 192.168.0.0/24\n ```\n\n to render:\n ```eos\n hardware counter feature route ipv4 vrf test 192.168.0.0/24\n ```\n", + "description": "This data model allows to configure the list of hardware counters feature\navailable on Arista platforms.\n\nThe `name` key accepts a list of valid_values which MUST be updated to support\nnew feature as they are released in EOS.\n\nThe available values of the different keys like 'direction' or 'address_type'\nare feature and hardware dependent and this model DOES NOT validate that the\ncombinations are valid. It is the responsibility of the user of this data model\nto make sure that the rendered CLI is accepted by the targeted device.\n\nExamples:\n\n * Use:\n ```yaml\n hardware_counters:\n features:\n - name: ip\n direction: out\n layer3: true\n units_packets: true\n ```\n\n to render:\n ```eos\n hardware counter feature ip out layer3 units packets\n ```\n * Use:\n ```yaml\n hardware_counters:\n features:\n - name: route\n address_type: ipv4\n vrf: test\n prefix: 192.168.0.0/24\n ```\n\n to render:\n ```eos\n hardware counter feature route ipv4 vrf test 192.168.0.0/24\n ```\n", "items": { "type": "object", "properties": { @@ -6177,6 +6607,7 @@ "qos dual-rate-policer", "route", "routed-port", + "segment-security", "subinterface", "tapagg", "traffic-class", @@ -6212,7 +6643,7 @@ }, "layer3": { "type": "boolean", - "description": "Supported only for the 'ip' feature\n", + "description": "Supported only for the 'ip' feature.\n", "title": "Layer3" }, "vrf": { @@ -6284,14 +6715,14 @@ "properties": { "name": { "type": "string", - "description": "Interface-Group name", + "description": "Interface-Group name.", "title": "Name" }, "interfaces": { "type": "array", "items": { "type": "string", - "description": "Interface Name" + "description": "Interface Name." }, "title": "Interfaces" }, @@ -6299,7 +6730,7 @@ "type": "array", "items": { "type": "string", - "description": "Name of BGP Maintenance Profile" + "description": "Name of BGP Maintenance Profile." }, "title": "BGP Maintenance Profiles" }, @@ -6307,7 +6738,7 @@ "type": "array", "items": { "type": "string", - "description": "Name of Interface Maintenance Profile" + "description": "Name of Interface Maintenance Profile." }, "title": "Interface Maintenance Profiles" } @@ -6328,14 +6759,14 @@ "properties": { "name": { "type": "string", - "description": "Interface-Profile Name", + "description": "Interface-Profile Name.", "title": "Name" }, "commands": { "type": "array", "items": { "type": "string", - "description": "EOS CLI interface command\nExample: \"switchport mode access\"\n" + "description": "EOS CLI interface command.\nExample: \"switchport mode access\"\n" }, "title": "Commands" } @@ -6466,7 +6897,7 @@ }, "ttl": { "type": "integer", - "description": "TTL value", + "description": "TTL value.", "minimum": 0, "maximum": 255, "title": "TTL" @@ -6547,13 +6978,13 @@ "ip_community_lists": { "type": "array", "title": "IP Community Lists", - "description": "Communities and regexp entries MUST not be configured in the same community-list\n", + "description": "Communities and regexp entries MUST not be configured in the same community-list.\n", "items": { "type": "object", "properties": { "name": { "type": "string", - "description": "IP Community-list Name", + "description": "IP Community-list Name.", "title": "Name" }, "entries": { @@ -6579,7 +7010,7 @@ }, "regexp": { "type": "string", - "description": "Regular Expression\nIf defined, a regex community-list will be configured\n", + "description": "Regular Expression.\nIf defined, a regex community-list will be configured.\n", "title": "RegExp" } }, @@ -6607,9 +7038,19 @@ "ip_dhcp_relay": { "type": "object", "properties": { + "always_on": { + "type": "boolean", + "description": "DhcpRelay Agent will be in always-on mode.", + "title": "Always On" + }, + "all_subnets": { + "type": "boolean", + "description": "Allow forwarding requests with secondary IP addresses in the gateway address \"giaddr\" field.", + "title": "All Subnets" + }, "information_option": { "type": "boolean", - "description": "Insert Option-82 information", + "description": "Insert Option-82 information.", "title": "Information Option" } }, @@ -6635,12 +7076,12 @@ "properties": { "enabled": { "type": "boolean", - "description": "Enable insertion of option-82 in DHCP request packets", + "description": "Enable insertion of option-82 in DHCP request packets.", "title": "Enabled" }, "circuit_id_type": { "type": "string", - "description": "\"none\" or <0 - 255>", + "description": "\"none\" or <0 - 255>.", "title": "Circuit ID Type" }, "circuit_id_format": { @@ -6681,7 +7122,7 @@ "properties": { "name": { "type": "string", - "description": "Source Interface\n", + "description": "Source Interface.\n", "title": "Name" }, "vrf": { @@ -6714,7 +7155,7 @@ "properties": { "name": { "type": "string", - "description": "Community-list Name", + "description": "Community-list Name.", "title": "Name" }, "entries": { @@ -6732,7 +7173,7 @@ }, "extcommunities": { "type": "string", - "description": "Communities as string\nExample: \"65000:65000\"\n", + "description": "Communities as string.\nExample: \"65000:65000\"\n", "title": "Extcommunities" } }, @@ -6766,7 +7207,7 @@ "properties": { "name": { "type": "string", - "description": "Community-list Name", + "description": "Community-list Name.", "title": "Name" }, "entries": { @@ -6784,7 +7225,7 @@ }, "regexp": { "type": "string", - "description": "Regular Expression", + "description": "Regular Expression.", "title": "RegExp" } }, @@ -6817,12 +7258,12 @@ "properties": { "name": { "type": "string", - "description": "Interface Name", + "description": "Interface Name.", "title": "Name" }, "vrf": { "type": "string", - "description": "VRF Name", + "description": "VRF Name.", "title": "VRF" } }, @@ -6890,7 +7331,7 @@ "type": "object", "properties": { "name": { - "description": "Interface Name", + "description": "Interface Name.", "type": "string", "title": "Name" }, @@ -6944,7 +7385,7 @@ }, "address": { "type": "string", - "description": "IP Address", + "description": "IP Address.", "title": "Address" }, "query_interval": { @@ -6993,7 +7434,7 @@ "properties": { "id": { "type": "integer", - "description": "VLAN ID", + "description": "VLAN ID.", "title": "ID" }, "enabled": { @@ -7009,7 +7450,7 @@ }, "address": { "type": "string", - "description": "IP Address", + "description": "IP Address.", "title": "Address" }, "query_interval": { @@ -7057,7 +7498,7 @@ }, "proxy": { "type": "boolean", - "description": "Global proxy settings should be enabled before enabling per-vlan\n", + "description": "Global proxy settings should be enabled before enabling per-vlan.\n", "title": "Proxy" } }, @@ -7085,16 +7526,16 @@ "properties": { "ip_address": { "type": "string", - "description": "IPv4 or IPv6 address for DNS server", + "description": "IPv4 or IPv6 address for DNS server.", "title": "IP Address" }, "vrf": { - "description": "VRF Name", + "description": "VRF Name.", "type": "string", "title": "VRF" }, "priority": { - "description": "Priority value (lower is first)", + "description": "Priority value (lower is first).", "type": "integer", "minimum": 0, "maximum": 4, @@ -7115,7 +7556,7 @@ "type": "integer", "minimum": 1, "maximum": 64, - "description": "Buffer size in MB", + "description": "Buffer size in MB.", "title": "Kernel Buffer Size" }, "profiles": { @@ -7177,7 +7618,7 @@ "properties": { "access_list": { "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Access List" }, "comment": { @@ -7197,16 +7638,17 @@ "type": "integer", "minimum": 1, "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Group" }, "original_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address. The combination of `original_ip` and `original_port` must be unique.", "title": "Original IP" }, "original_port": { "type": "integer", + "description": "TCP/UDP port. The combination of `original_ip` and `original_port` must be unique.", "minimum": 1, "maximum": 65535, "title": "Original Port" @@ -7227,20 +7669,19 @@ }, "translated_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.", "title": "Translated IP" }, "translated_port": { "type": "integer", "minimum": 1, "maximum": 65535, - "description": "requires 'original_port'", + "description": "requires 'original_port'.", "title": "Translated Port" } }, "required": [ - "translated_ip", - "original_ip" + "translated_ip" ], "additionalProperties": false, "patternProperties": { @@ -7284,7 +7725,7 @@ }, "pool_name": { "type": "string", - "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone\nignored if 'nat_type' is overload\n", + "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone.\nignored if 'nat_type' is overload.\n", "title": "Pool Name" }, "priority": { @@ -7312,7 +7753,7 @@ "properties": { "access_list": { "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Access List" }, "comment": { @@ -7332,16 +7773,17 @@ "type": "integer", "minimum": 1, "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Group" }, "original_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address. The combination of `original_ip` and `original_port` must be unique.", "title": "Original IP" }, "original_port": { "type": "integer", + "description": "TCP/UDP port. The combination of `original_ip` and `original_port` must be unique.", "minimum": 1, "maximum": 65535, "title": "Original Port" @@ -7362,20 +7804,19 @@ }, "translated_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.", "title": "Translated IP" }, "translated_port": { "type": "integer", "minimum": 1, "maximum": 65535, - "description": "requires 'original_port'", + "description": "requires 'original_port'.", "title": "Translated Port" } }, "required": [ - "translated_ip", - "original_ip" + "translated_ip" ], "additionalProperties": false, "patternProperties": { @@ -7411,10 +7852,20 @@ "type": "string", "title": "Name" }, + "type": { + "type": "string", + "enum": [ + "ip-port", + "port-only" + ], + "default": "ip-port", + "title": "Type" + }, "prefix_length": { "type": "integer", "minimum": 16, "maximum": 32, + "description": "It is only used and required when `type` is `ip-port`.", "title": "Prefix Length" }, "ranges": { @@ -7424,12 +7875,12 @@ "properties": { "first_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.\nRequired when `type` is `ip-port` and ignored otherwise.", "title": "First IP" }, "last_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.\nRequired when `type` is `ip-port` and ignored otherwise.\n`first_ip` and `last_ip` ip addresses should lie in same subnet.", "title": "Last IP" }, "first_port": { @@ -7442,13 +7893,10 @@ "type": "integer", "minimum": 1, "maximum": 65535, + "description": "Required when `first_port` is set.\n`last_port` must be greater than or equal to `first_port`.", "title": "Last Port" } }, - "required": [ - "first_ip", - "last_ip" - ], "additionalProperties": false, "patternProperties": { "^_.+$": {} @@ -7463,14 +7911,13 @@ "title": "Utilization Log Threshold" } }, - "required": [ - "prefix_length", - "name" - ], "additionalProperties": false, "patternProperties": { "^_.+$": {} - } + }, + "required": [ + "name" + ] }, "title": "Pools" }, @@ -7485,17 +7932,17 @@ "type": "integer", "minimum": 60, "maximum": 3600, - "description": "in seconds", + "description": "In seconds.", "title": "Expiry Interval" }, "local_interface": { "type": "string", - "description": "EOS interface name", + "description": "EOS interface name.", "title": "Local Interface" }, "peer_address": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.", "title": "Peer Address" }, "port_range": { @@ -7511,7 +7958,7 @@ "type": "integer", "minimum": 1024, "maximum": 65535, - "description": ">= first_port", + "description": ">= first_port.", "title": "Last Port" }, "split_disabled": { @@ -7568,14 +8015,14 @@ "type": "integer", "minimum": 1, "maximum": 99, - "description": "Used to render 'ip nat translation low-mark '", + "description": "Used to render 'ip nat translation low-mark '.", "title": "Percentage" }, "host_percentage": { "type": "integer", "minimum": 1, "maximum": 99, - "description": "Used to render 'ip nat translation low-mark host'", + "description": "Used to render 'ip nat translation low-mark host'.", "title": "Host Percentage" } }, @@ -7607,7 +8054,7 @@ "properties": { "ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.", "title": "IP" }, "limit": { @@ -7652,7 +8099,7 @@ "type": "integer", "minimum": 0, "maximum": 4294967295, - "description": "in seconds", + "description": "In seconds.", "title": "Timeout" } }, @@ -7688,12 +8135,12 @@ "properties": { "name": { "type": "string", - "description": "Interface Name", + "description": "Interface Name.", "title": "Name" }, "vrf": { "type": "string", - "description": "VRF Name", + "description": "VRF Name.", "title": "VRF" } }, @@ -7789,9 +8236,35 @@ "properties": { "name": { "type": "string", - "description": "Name of the SA policy. The \"null\" value is deprecated and will be removed in AVD 5.0.0", + "description": "Name of the SA policy. The \"null\" value is deprecated and will be removed in AVD 5.0.0.", "title": "Name" }, + "sa_lifetime": { + "type": "object", + "properties": { + "value": { + "type": "integer", + "description": "Lifetime value for this SA.\nValid range depends on the unit.\n<1-24> Lifetime in hours ( default )\n<1-4000000> Packet limit in thousands\n<1-6000> Byte limit in GB ( 1024 MB )\n<1-6144000> Byte limit in MB ( 1024 KB )", + "title": "Value" + }, + "unit": { + "type": "string", + "enum": [ + "gigabytes", + "hours", + "megabytes", + "thousand-packets" + ], + "default": "hours", + "title": "Unit" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Sa Lifetime" + }, "esp": { "type": "object", "properties": { @@ -7908,7 +8381,7 @@ }, "action": { "type": "string", - "description": "Action to apply\n\n* 'clear': Delete all connections\n* 'hold': Re-negotiate connection on demand\n* 'restart': Restart connection immediately\n", + "description": "Action to apply.\n\n* 'clear': Delete all connections\n* 'hold': Re-negotiate connection on demand\n* 'restart': Restart connection immediately\n", "enum": [ "clear", "hold", @@ -7987,7 +8460,7 @@ "type": "object", "properties": { "name": { - "description": "Interface Name", + "description": "Interface Name.", "type": "string", "title": "Name" }, @@ -8012,7 +8485,7 @@ "properties": { "name": { "type": "string", - "description": "Interface name", + "description": "Interface name.", "title": "Name" }, "vrf": { @@ -8033,12 +8506,12 @@ "properties": { "name": { "type": "string", - "description": "Interface Name", + "description": "Interface Name.", "title": "Name" }, "vrf": { "type": "string", - "description": "VRF Name", + "description": "VRF Name.", "title": "VRF" } }, @@ -8059,12 +8532,12 @@ "properties": { "name": { "type": "string", - "description": "Interface Name", + "description": "Interface Name.", "title": "Name" }, "vrf": { "type": "string", - "description": "VRF Name", + "description": "VRF Name.", "title": "VRF" } }, @@ -8080,7 +8553,7 @@ }, "ip_virtual_router_mac_address": { "type": "string", - "description": "MAC address (hh:hh:hh:hh:hh:hh)", + "description": "MAC address (hh:hh:hh:hh:hh:hh).", "title": "IP Virtual Router MAC Address" }, "ipv6_access_lists": { @@ -8091,7 +8564,7 @@ "properties": { "name": { "type": "string", - "description": "IPv6 Access-list Name", + "description": "IPv6 Access-list Name.", "title": "Name" }, "counters_per_entry": { @@ -8105,12 +8578,12 @@ "properties": { "sequence": { "type": "integer", - "description": "Sequence ID", + "description": "Sequence ID.", "title": "Sequence" }, "action": { "type": "string", - "description": "Action as string\nExample: \"deny ipv6 any any\"\n", + "description": "Action as string.\nExample: \"deny ipv6 any any\"\n", "title": "Action" } }, @@ -8136,6 +8609,51 @@ } } }, + "ipv6_dhcp_relay": { + "type": "object", + "properties": { + "always_on": { + "type": "boolean", + "description": "DhcpRelay Agent will be in always-on mode, off by default.", + "title": "Always On" + }, + "all_subnets": { + "type": "boolean", + "description": "Allow forwarding requests with additional IPv6 addresses in the gateway address \"giaddr\" field.", + "title": "All Subnets" + }, + "option": { + "type": "object", + "description": "Insert DHCP Option.", + "properties": { + "link_layer_address": { + "type": "boolean", + "description": "Add Option 79 (Link Layer Address Option).", + "title": "Link Layer Address" + }, + "remote_id_format": { + "type": "string", + "enum": [ + "%m:%i", + "%m:%p" + ], + "description": "Add RemoteID option 37 in format MAC address and interface ID (`%m:%i`) or MAC address and interface name (`%m:%p`).", + "title": "Remote ID Format" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Option" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IPv6 DHCP Relay" + }, "ipv6_hardware": { "type": "object", "properties": { @@ -8150,7 +8668,7 @@ "properties": { "profile": { "type": "string", - "description": "Pre-defined profile 'internet' or user-defined profile name", + "description": "Pre-defined profile 'internet' or user-defined profile name.", "title": "Profile" } }, @@ -8185,6 +8703,80 @@ "type": "boolean", "title": "IPv6 ICMP Redirect" }, + "ipv6_neighbor": { + "type": "object", + "properties": { + "static_entries": { + "type": "array", + "description": "Static IPv6 neighbor entries.", + "items": { + "type": "object", + "properties": { + "ipv6_address": { + "type": "string", + "description": "IPv6 address of neighbor.", + "title": "IPv6 Address" + }, + "vrf": { + "type": "string", + "title": "VRF" + }, + "interface": { + "type": "string", + "description": "Interface name.", + "title": "Interface" + }, + "mac_address": { + "type": "string", + "description": "MAC address of neighbor like 'aa:af:12:34:bc:bf'", + "pattern": "^([0-9a-f]{2}:){5}[0-9a-f]{2}$", + "title": "MAC Address" + } + }, + "required": [ + "ipv6_address", + "interface", + "mac_address" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Static Entries" + }, + "persistent": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Restore the IPv6 neighbor cache after reboot.", + "title": "Enabled" + }, + "refresh_delay": { + "type": "integer", + "description": "Time to wait in seconds before refreshing the IPv6 neighbor cache after reboot (EOS default 600).\nIt will require setting the `enabled` key to true.\n", + "minimum": 600, + "maximum": 3600, + "title": "Refresh Delay" + } + }, + "required": [ + "enabled" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Persistent" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IPv6 Neighbor" + }, "ipv6_prefix_lists": { "type": "array", "items": { @@ -8192,7 +8784,7 @@ "properties": { "name": { "type": "string", - "description": "Prefix-list Name", + "description": "Prefix-list Name.", "title": "Name" }, "sequence_numbers": { @@ -8202,12 +8794,12 @@ "properties": { "sequence": { "type": "integer", - "description": "Sequence ID", + "description": "Sequence ID.", "title": "Sequence" }, "action": { "type": "string", - "description": "Action as string\nExample: \"permit 1b11:3a00:22b0:0082::/64 eq 128\"\n", + "description": "Action as string.\nExample: \"permit 1b11:3a00:22b0:0082::/64 eq 128\"\n", "title": "Action" } }, @@ -8241,7 +8833,7 @@ "properties": { "name": { "type": "string", - "description": "Access-list Name", + "description": "Access-list Name.", "title": "Name" }, "counters_per_entry": { @@ -8255,12 +8847,12 @@ "properties": { "sequence": { "type": "integer", - "description": "Sequence ID", + "description": "Sequence ID.", "title": "Sequence" }, "action": { "type": "string", - "description": "Action as string\nExample: \"deny ipv6 any any\"\n", + "description": "Action as string.\nExample: \"deny ipv6 any any\"\n", "title": "Action" } }, @@ -8298,7 +8890,7 @@ }, "destination_address_prefix": { "type": "string", - "description": "IPv6 Network/Mask", + "description": "IPv6 Network/Mask.", "title": "Destination Address Prefix" }, "interface": { @@ -8307,12 +8899,12 @@ }, "gateway": { "type": "string", - "description": "IPv6 Address", + "description": "IPv6 Address.", "title": "Gateway" }, "track_bfd": { "type": "boolean", - "description": "Track next-hop using BFD", + "description": "Track next-hop using BFD.", "title": "Track BFD" }, "distance": { @@ -8329,7 +8921,7 @@ }, "name": { "type": "string", - "description": "Description", + "description": "Description.", "title": "Name" }, "metric": { @@ -8351,7 +8943,7 @@ "title": "IPv6 Unicast Routing" }, "is_deployed": { - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "type": "boolean", "default": true, "title": "Is Deployed" @@ -8605,7 +9197,7 @@ "properties": { "default": { "type": "integer", - "description": "Default load interval in seconds", + "description": "Default load interval in seconds.", "title": "Default" } }, @@ -8621,7 +9213,7 @@ "type": "object", "properties": { "name": { - "description": "Username", + "description": "Username.", "type": "string", "title": "Name" }, @@ -8639,12 +9231,12 @@ }, "role": { "type": "string", - "description": "EOS RBAC Role to be assigned to the user such as \"network-admin\" or \"network-operator\"\n", + "description": "EOS RBAC Role to be assigned to the user such as \"network-admin\" or \"network-operator\".\n", "title": "Role" }, "sha512_password": { "type": "string", - "description": "SHA512 Hash of Password\nMust be the hash of the password. By default EOS salts the password with the username, so the simplest is to generate the hash on an EOS device using the same username.\n", + "description": "SHA512 Hash of Password.\nMust be the hash of the password. By default EOS salts the password with the username, so the simplest is to generate the hash on an EOS device using the same username.\n", "title": "SHA512 Password" }, "no_password": { @@ -8662,7 +9254,7 @@ }, "shell": { "type": "string", - "description": "Specify shell for the user\n", + "description": "Specify shell for the user.\n", "enum": [ "/bin/bash", "/bin/sh", @@ -8697,7 +9289,7 @@ "emergencies", "disabled" ], - "description": "Console logging severity level\n", + "description": "Console logging severity level.\n", "title": "Console" }, "monitor": { @@ -8713,7 +9305,7 @@ "emergencies", "disabled" ], - "description": "Monitor logging severity level\n", + "description": "Monitor logging severity level.\n", "title": "Monitor" }, "buffered": { @@ -8738,7 +9330,7 @@ "warnings", "disabled" ], - "description": "Buffer logging severity level\n", + "description": "Buffer logging severity level.\n", "title": "Level" } }, @@ -8762,7 +9354,7 @@ "warnings", "disabled" ], - "description": "Trap logging severity level\n", + "description": "Trap logging severity level.\n", "title": "Trap" }, "synchronous": { @@ -8782,7 +9374,7 @@ "warnings", "disabled" ], - "description": "Synchronous logging severity level\n", + "description": "Synchronous logging severity level.\n", "default": "critical", "title": "Level" } @@ -8806,7 +9398,7 @@ "traditional timezone year", "traditional year timezone" ], - "description": "Timestamp format", + "description": "Timestamp format.", "title": "Timestamp" }, "hostname": { @@ -8820,12 +9412,12 @@ }, "sequence_numbers": { "type": "boolean", - "description": "Add sequence numbers to log messages\n", + "description": "Add sequence numbers to log messages.\n", "title": "Sequence Numbers" }, "rfc5424": { "type": "boolean", - "description": "Forward logs in RFC5424 format\n", + "description": "Forward logs in RFC5424 format.\n", "title": "Rfc5424" } }, @@ -8867,7 +9459,7 @@ }, "source_interface": { "type": "string", - "description": "Source Interface Name", + "description": "Source Interface Name.", "title": "Source Interface" }, "vrfs": { @@ -8877,12 +9469,12 @@ "properties": { "name": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "Name" }, "source_interface": { "type": "string", - "description": "Source interface name", + "description": "Source interface name.", "title": "Source Interface" }, "hosts": { @@ -8892,7 +9484,7 @@ "properties": { "name": { "type": "string", - "description": "Syslog server name", + "description": "Syslog server name.", "title": "Name" }, "protocol": { @@ -8946,7 +9538,7 @@ "properties": { "name": { "type": "string", - "description": "Match list", + "description": "Match list.", "title": "Name" }, "action": { @@ -8998,7 +9590,7 @@ "type": "integer", "minimum": 10, "maximum": 65535, - "description": "Logging interval in seconds", + "description": "Logging interval in seconds.", "title": "Interval" } }, @@ -9021,6 +9613,50 @@ "^_.+$": {} }, "title": "Event" + }, + "level": { + "type": "array", + "description": "Configure logging severity.", + "items": { + "type": "object", + "properties": { + "facility": { + "type": "string", + "title": "Facility" + }, + "severity": { + "type": "string", + "description": "Severity of facility. Below are the supported severites.\nemergencies System is unusable (severity=0)\nalerts Immediate action needed (severity=1)\ncritical Critical conditions (severity=2)\nerrors Error conditions (severity=3)\nwarnings Warning conditions (severity=4)\nnotifications Normal but significant conditions (severity=5)\ninformational Informational messages (severity=6)\ndebugging Debugging messages (severity=7)\n<0-7> Severity level value", + "enum": [ + "alerts", + "critical", + "debugging", + "emergencies", + "errors", + "informational", + "notifications", + "warnings", + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7" + ], + "title": "Severity" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "facility" + ] + }, + "title": "Level" } }, "additionalProperties": false, @@ -9036,7 +9672,7 @@ "properties": { "name": { "type": "string", - "description": "Loopback interface name e.g. \"Loopback0\"", + "description": "Loopback interface name e.g. \"Loopback0\".", "title": "Name" }, "description": { @@ -9049,19 +9685,19 @@ }, "vrf": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "VRF" }, "ip_address": { "type": "string", - "description": "IPv4_address/Mask", + "description": "IPv4_address/Mask.", "title": "IP Address" }, "ip_address_secondaries": { "type": "array", "items": { "type": "string", - "description": "IPv4_address/Mask" + "description": "IPv4_address/Mask." }, "title": "IP Address Secondaries" }, @@ -9071,7 +9707,7 @@ }, "ipv6_address": { "type": "string", - "description": "IPv6_address/Mask", + "description": "IPv6_address/Mask.", "title": "IPv6 Address" }, "ip_proxy_arp": { @@ -9108,9 +9744,14 @@ }, "isis_enable": { "type": "string", - "description": "ISIS instance name", + "description": "ISIS instance name.", "title": "ISIS Enable" }, + "isis_bfd": { + "type": "boolean", + "description": "Enable BFD for ISIS.", + "title": "ISIS BFD" + }, "isis_passive": { "type": "boolean", "title": "ISIS Passive" @@ -9143,7 +9784,7 @@ }, "eos_cli": { "type": "string", - "description": "EOS CLI rendered directly on the loopback interface in the final EOS configuration", + "description": "EOS CLI rendered directly on the loopback interface in the final EOS configuration.", "title": "EOS CLI" } }, @@ -9164,7 +9805,7 @@ "properties": { "name": { "type": "string", - "description": "MAC Access-list Name", + "description": "MAC Access-list Name.", "title": "Name" }, "counters_per_entry": { @@ -9208,7 +9849,7 @@ "properties": { "aging_time": { "type": "integer", - "description": "Aging time in seconds", + "description": "Aging time in seconds.", "title": "Aging Time" }, "notification_host_flap": { @@ -9291,7 +9932,7 @@ "properties": { "name": { "type": "string", - "description": "Profile-Name", + "description": "Profile-Name.", "title": "Name" }, "cipher": { @@ -9348,7 +9989,7 @@ "type": "integer", "minimum": 30, "maximum": 100000, - "description": "Rekey period in seconds", + "description": "Rekey period in seconds.", "title": "Rekey Period" } }, @@ -9420,6 +10061,33 @@ "^_.+$": {} }, "title": "L2 Protocols" + }, + "traffic_unprotected": { + "type": "object", + "properties": { + "action": { + "type": "string", + "description": "Allow/drop the transmit/receive of unprotected traffic.", + "enum": [ + "allow", + "drop" + ], + "title": "Action" + }, + "allow_active_sak": { + "type": "boolean", + "description": "Allow transmit/receive of encrypted traffic using operational SAK and block otherwise.", + "title": "Allow Active Sak" + } + }, + "required": [ + "action" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Traffic Unprotected" } }, "additionalProperties": false, @@ -9444,17 +10112,17 @@ "properties": { "default_interface_profile": { "type": "string", - "description": "Name of default Interface Profile\n", + "description": "Name of default Interface Profile.\n", "title": "Default Interface Profile" }, "default_bgp_profile": { "type": "string", - "description": "Name of default BGP Profile\n", + "description": "Name of default BGP Profile.\n", "title": "Default BGP Profile" }, "default_unit_profile": { "type": "string", - "description": "Name of default Unit Profile\n", + "description": "Name of default Unit Profile.\n", "title": "Default Unit Profile" }, "interface_profiles": { @@ -9471,12 +10139,12 @@ "properties": { "load_interval": { "type": "integer", - "description": "Load Interval in Seconds\n", + "description": "Load Interval in Seconds.\n", "title": "Load Interval" }, "threshold": { "type": "integer", - "description": "Threshold in kbps\n", + "description": "Threshold in kbps.\n", "title": "Threshold" } }, @@ -9491,7 +10159,7 @@ "properties": { "max_delay": { "type": "integer", - "description": "Max delay in seconds\n", + "description": "Max delay in seconds.\n", "title": "Max Delay" } }, @@ -9519,7 +10187,7 @@ "properties": { "name": { "type": "string", - "description": "BGP Profile Name", + "description": "BGP Profile Name.", "title": "Name" }, "initiator": { @@ -9527,7 +10195,7 @@ "properties": { "route_map_inout": { "type": "string", - "description": "Route Map", + "description": "Route Map.", "title": "Route Map Inout" } }, @@ -9555,7 +10223,7 @@ "properties": { "name": { "type": "string", - "description": "Unit Profile Name", + "description": "Unit Profile Name.", "title": "Name" }, "on_boot": { @@ -9565,7 +10233,7 @@ "type": "integer", "minimum": 300, "maximum": 3600, - "description": "On-boot in seconds\n", + "description": "On-boot in seconds.\n", "title": "Duration" } }, @@ -9593,7 +10261,7 @@ "properties": { "name": { "type": "string", - "description": "Unit Name", + "description": "Unit Name.", "title": "Name" }, "quiesce": { @@ -9602,7 +10270,7 @@ }, "profile": { "type": "string", - "description": "Name of Unit Profile\n", + "description": "Name of Unit Profile.\n", "title": "Profile" }, "groups": { @@ -9612,7 +10280,7 @@ "type": "array", "items": { "type": "string", - "description": "Name of BGP Group\n" + "description": "Name of BGP Group.\n" }, "title": "BGP Groups" }, @@ -9620,7 +10288,7 @@ "type": "array", "items": { "type": "string", - "description": "Name of Interface Group\n" + "description": "Name of Interface Group.\n" }, "title": "Interface Groups" } @@ -9690,17 +10358,17 @@ "properties": { "name": { "type": "string", - "description": "Transport name", + "description": "Transport name.", "title": "Name" }, "ssl_profile": { "type": "string", - "description": "SSL profile name", + "description": "SSL profile name.", "title": "SSL Profile" }, "vrf": { "type": "string", - "description": "VRF name is optional", + "description": "VRF name is optional.", "title": "VRF" }, "notification_timestamp": { @@ -9714,7 +10382,7 @@ }, "ip_access_group": { "type": "string", - "description": "ACL name", + "description": "ACL name.", "title": "IP Access Group" }, "port": { @@ -9737,27 +10405,27 @@ "properties": { "name": { "type": "string", - "description": "Transport name", + "description": "Transport name.", "title": "Name" }, "shutdown": { "type": "boolean", - "description": "Operational status of the gRPC tunnel", + "description": "Operational status of the gRPC tunnel.", "title": "Shutdown" }, "tunnel_ssl_profile": { "type": "string", - "description": "Tunnel SSL profile name", + "description": "Tunnel SSL profile name.", "title": "Tunnel SSL Profile" }, "gnmi_ssl_profile": { "type": "string", - "description": "gNMI SSL profile name", + "description": "gNMI SSL profile name.", "title": "gNMI SSL Profile" }, "vrf": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "VRF" }, "destination": { @@ -9765,14 +10433,14 @@ "properties": { "address": { "type": "string", - "description": "IP address or hostname", + "description": "IP address or hostname.", "title": "Address" }, "port": { "type": "integer", "minimum": 1, "maximum": 65535, - "description": "TCP Port", + "description": "TCP Port.", "title": "Port" } }, @@ -9791,14 +10459,14 @@ "properties": { "name": { "type": "string", - "description": "Interface name", + "description": "Interface name.", "title": "Name" }, "port": { "type": "integer", "minimum": 1, "maximum": 65535, - "description": "TCP Port", + "description": "TCP Port.", "title": "Port" } }, @@ -9817,7 +10485,7 @@ "properties": { "use_serial_number": { "type": "boolean", - "description": "Use serial number as the Target ID", + "description": "Use serial number as the Target ID.", "title": "Use Serial Number" }, "target_ids": { @@ -9862,12 +10530,12 @@ "properties": { "name": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "Name" }, "access_group": { "type": "string", - "description": "Standard IPv4 ACL name", + "description": "Standard IPv4 ACL name.", "title": "Access Group" } }, @@ -9906,13 +10574,13 @@ "title": "Enable Https" }, "https_ssl_profile": { - "description": "SSL Profile Name", + "description": "SSL Profile Name.", "type": "string", "title": "Https SSL Profile" }, "default_services": { "type": "boolean", - "description": "Enable default services: capi-doc and tapagg", + "description": "Enable default services: capi-doc and tapagg.", "title": "Default Services" }, "enable_vrfs": { @@ -9921,17 +10589,17 @@ "type": "object", "properties": { "name": { - "description": "VRF Name", + "description": "VRF Name.", "type": "string", "title": "Name" }, "access_group": { - "description": "Standard IPv4 ACL name", + "description": "Standard IPv4 ACL name.", "type": "string", "title": "Access Group" }, "ipv6_access_group": { - "description": "Standard IPv6 ACL name", + "description": "Standard IPv6 ACL name.", "type": "string", "title": "IPv6 Access Group" } @@ -9951,12 +10619,12 @@ "properties": { "certificate": { "type": "string", - "description": "Name of certificate; private key must also be specified", + "description": "Name of certificate; private key must also be specified.", "title": "Certificate" }, "private_key": { "type": "string", - "description": "Name of private key; certificate must also be specified", + "description": "Name of private key; certificate must also be specified.", "title": "Private Key" } }, @@ -10053,18 +10721,18 @@ "type": "array", "items": { "type": "string", - "description": "IP or hostname" + "description": "IP or hostname." }, "title": "Server Hosts" }, "source_interface": { "type": "string", - "description": "Interface name", + "description": "Interface name.", "title": "Source Interface" }, "vrf": { "type": "string", - "description": "VRF Name", + "description": "VRF Name.", "title": "VRF" } }, @@ -10109,7 +10777,7 @@ "properties": { "name": { "type": "string", - "description": "Management Interface Name", + "description": "Management Interface Name.", "title": "Name" }, "description": { @@ -10131,12 +10799,12 @@ }, "vrf": { "type": "string", - "description": "VRF Name", + "description": "VRF Name.", "title": "VRF" }, "ip_address": { "type": "string", - "description": "IPv4_address/Mask", + "description": "IPv4_address/Mask.", "title": "IP Address" }, "ipv6_enable": { @@ -10145,7 +10813,7 @@ }, "ipv6_address": { "type": "string", - "description": "IPv6_address/Mask", + "description": "IPv6_address/Mask.", "title": "IPv6 Address" }, "type": { @@ -10155,22 +10823,22 @@ "inband" ], "default": "oob", - "description": "For documentation purposes only", + "description": "For documentation purposes only.", "title": "Type" }, "gateway": { "type": "string", - "description": "IPv4 address of default gateway in management VRF", + "description": "IPv4 address of default gateway in management VRF.", "title": "Gateway" }, "ipv6_gateway": { "type": "string", - "description": "IPv6 address of default gateway in management VRF", + "description": "IPv6 address of default gateway in management VRF.", "title": "IPv6 Gateway" }, "mac_address": { "type": "string", - "description": "MAC address", + "description": "MAC address.", "title": "MAC Address" }, "lldp": { @@ -10186,7 +10854,7 @@ }, "ztp_vlan": { "type": "integer", - "description": "ZTP vlan number", + "description": "ZTP vlan number.", "title": "ZTP VLAN" } }, @@ -10198,7 +10866,7 @@ }, "eos_cli": { "type": "string", - "description": "Multiline EOS CLI rendered directly on the management interface in the final EOS configuration", + "description": "Multiline EOS CLI rendered directly on the management interface in the final EOS configuration.", "title": "EOS CLI" } }, @@ -10219,22 +10887,53 @@ "type": "string", "title": "Entropy Source" }, - "password": { + "entropy_sources": { "type": "object", + "description": "Source of entropy.", "properties": { - "minimum_length": { - "type": "integer", - "minimum": 1, - "maximum": 32, - "title": "Minimum Length" + "hardware": { + "type": "boolean", + "description": "Use a hardware based source.", + "title": "Hardware" }, - "encryption_key_common": { + "haveged": { "type": "boolean", - "title": "Encryption Key Common" + "description": "Use the HAVEGE algorithm.", + "title": "Haveged" }, - "encryption_reversible": { - "type": "string", - "title": "Encryption Reversible" + "cpu_jitter": { + "type": "boolean", + "description": "Use the Jitter RNG algorithm of a CPU based source.", + "title": "CPU Jitter" + }, + "hardware_exclusive": { + "type": "boolean", + "description": "Only use entropy from the hardware source.", + "title": "Hardware Exclusive" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Entropy Sources" + }, + "password": { + "type": "object", + "properties": { + "minimum_length": { + "type": "integer", + "minimum": 1, + "maximum": 32, + "title": "Minimum Length" + }, + "encryption_key_common": { + "type": "boolean", + "title": "Encryption Key Common" + }, + "encryption_reversible": { + "type": "string", + "title": "Encryption Reversible" }, "policies": { "type": "array", @@ -10336,12 +11035,12 @@ }, "tls_versions": { "type": "string", - "description": "List of allowed TLS versions as string\nExamples:\n - \"1.0\"\n - \"1.0 1.1\"\n", + "description": "List of allowed TLS versions as string.\nExamples:\n - \"1.0\"\n - \"1.0 1.1\"\n", "title": "TLS Versions" }, "cipher_list": { "type": "string", - "description": "cipher_list syntax follows the openssl cipher strings format.\nColon (:) separated list of allowed ciphers as a string\n", + "description": "cipher_list syntax follows the openssl cipher strings format.\nColon (:) separated list of allowed ciphers as a string.\n", "title": "Cipher List" }, "trust_certificate": { @@ -10349,7 +11048,7 @@ "properties": { "certificates": { "type": "array", - "description": "List of trust certificate names\nExamples:\n - test1.crt\n - test2.crt\n", + "description": "List of trust certificate names.\nExamples:\n - test1.crt\n - test2.crt\n", "items": { "type": "string" }, @@ -10395,7 +11094,7 @@ "properties": { "certificates": { "type": "array", - "description": "List of chain certificate names\nExamples:\n - chain1.crt\n - chain2.crt\n", + "description": "List of chain certificate names.\nExamples:\n - chain1.crt\n - chain2.crt\n", "items": { "type": "string" }, @@ -10459,6 +11158,116 @@ } }, "title": "SSL Profiles" + }, + "shared_secret_profiles": { + "type": "array", + "items": { + "type": "object", + "properties": { + "profile": { + "type": "string", + "title": "Profile" + }, + "secrets": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "secret": { + "type": "string", + "title": "Secret" + }, + "secret_type": { + "type": "string", + "default": "7", + "enum": [ + "0", + "7", + "8a" + ], + "title": "Secret Type" + }, + "receive_lifetime": { + "type": "object", + "properties": { + "infinite": { + "type": "boolean", + "title": "Infinite" + }, + "start_date_time": { + "type": "string", + "description": "Start date and time of lifetime of the secret. End date should be greater than start date.\nFormats supported:\n1. mm/dd/yyyy hh:mm:ss\n2. yyyy-mm-dd hh:mm:ss\ne.g 2024-12-20 10:00:00", + "title": "Start Date Time" + }, + "end_date_time": { + "type": "string", + "description": "End date and time of lifetime of the secret. End date should be greater than start date.\nFormats supported:\n1. mm/dd/yyyy hh:mm:ss\n2. yyyy-mm-dd hh:mm:ss\ne.g 2024-12-20 10:00:00", + "title": "End Date Time" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Receive Lifetime" + }, + "transmit_lifetime": { + "type": "object", + "properties": { + "infinite": { + "type": "boolean", + "title": "Infinite" + }, + "start_date_time": { + "type": "string", + "description": "Start date and time of lifetime of the secret. End date should be greater than start date.\nFormats supported:\n1. mm/dd/yyyy hh:mm:ss\n2. yyyy-mm-dd hh:mm:ss\ne.g 2024-12-20 10:00:00", + "title": "Start Date Time" + }, + "end_date_time": { + "type": "string", + "description": "End date and time of lifetime of the secret. End date should be greater than start date.\nFormats supported:\n1. mm/dd/yyyy hh:mm:ss\n2. yyyy-mm-dd hh:mm:ss\ne.g 2024-12-20 10:00:00", + "title": "End Date Time" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Transmit Lifetime" + }, + "local_time": { + "type": "boolean", + "description": "Configuring secret using the local timezone from system clock. Default is UTC.", + "title": "Local Time" + } + }, + "required": [ + "secret", + "receive_lifetime", + "transmit_lifetime", + "name" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Secrets" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "profile" + ] + }, + "title": "Shared Secret Profiles" } }, "additionalProperties": false, @@ -10477,12 +11286,12 @@ "properties": { "name": { "type": "string", - "description": "Standard ACL Name", + "description": "Standard ACL Name.", "title": "Name" }, "vrf": { "type": "string", - "description": "VRF Name", + "description": "VRF Name.", "title": "VRF" } }, @@ -10500,12 +11309,12 @@ "properties": { "name": { "type": "string", - "description": "Standard ACL Name", + "description": "Standard ACL Name.", "title": "Name" }, "vrf": { "type": "string", - "description": "VRF Name", + "description": "VRF Name.", "title": "VRF" } }, @@ -10520,11 +11329,11 @@ "type": "integer", "minimum": 0, "maximum": 86400, - "description": "Idle timeout in minutes", + "description": "Idle timeout in minutes.", "title": "Idle Timeout" }, "cipher": { - "description": "Cryptographic ciphers for SSH to use", + "description": "Cryptographic ciphers for SSH to use.", "type": "array", "items": { "type": "string" @@ -10532,7 +11341,7 @@ "title": "Cipher" }, "key_exchange": { - "description": "Cryptographic key exchange methods for SSH to use", + "description": "Cryptographic key exchange methods for SSH to use.", "type": "array", "items": { "type": "string" @@ -10540,7 +11349,7 @@ "title": "Key Exchange" }, "mac": { - "description": "Cryptographic MAC algorithms for SSH to use", + "description": "Cryptographic MAC algorithms for SSH to use.", "type": "array", "items": { "type": "string" @@ -10581,7 +11390,7 @@ "title": "Hostkey" }, "enable": { - "description": "Enable SSH daemon", + "description": "Enable SSH daemon.", "type": "boolean", "title": "Enable" }, @@ -10592,14 +11401,14 @@ "type": "integer", "minimum": 1, "maximum": 100, - "description": "Maximum total number of SSH sessions to device", + "description": "Maximum total number of SSH sessions to device.", "title": "Limit" }, "per_host": { "type": "integer", "minimum": 1, "maximum": 20, - "description": "Maximum number of SSH sessions to device from a single host", + "description": "Maximum number of SSH sessions to device from a single host.", "title": "Per Host" } }, @@ -10616,11 +11425,11 @@ "properties": { "name": { "type": "string", - "description": "VRF Name", + "description": "VRF Name.", "title": "Name" }, "enable": { - "description": "Enable SSH in VRF", + "description": "Enable SSH in VRF.", "type": "boolean", "title": "Enable" } @@ -10637,7 +11446,7 @@ }, "log_level": { "type": "string", - "description": "SSH daemon log level", + "description": "SSH daemon log level.", "title": "Log Level" }, "client_alive": { @@ -10684,7 +11493,7 @@ "properties": { "command": { "type": "string", - "description": "Command to exclude from tech-support", + "description": "Command to exclude from tech-support.", "title": "Command" }, "type": { @@ -10712,7 +11521,7 @@ "properties": { "command": { "type": "string", - "description": "Command to include in tech-support", + "description": "Command to include in tech-support.", "title": "Command" } }, @@ -10810,7 +11619,7 @@ "properties": { "name": { "type": "string", - "description": "Match-list Name", + "description": "Match-list Name.", "title": "Name" }, "sequence_numbers": { @@ -10820,12 +11629,12 @@ "properties": { "sequence": { "type": "integer", - "description": "Sequence ID", + "description": "Sequence ID.", "title": "Sequence" }, "match_regex": { "type": "string", - "description": "Regular Expression", + "description": "Regular Expression.", "title": "Match Regex" } }, @@ -10880,7 +11689,7 @@ "type": "array", "items": { "type": "string", - "description": "IP or hostname" + "description": "IP or hostname." }, "title": "Server Hosts" } @@ -10992,7 +11801,7 @@ }, "cv_pathfinder": { "type": "object", - "description": "Metadata used for CV Pathfinder visualization on CloudVision", + "description": "Metadata used for CV Pathfinder visualization on CloudVision.", "properties": { "role": { "type": "string", @@ -11018,6 +11827,10 @@ "type": "string", "title": "SSL Profile" }, + "address": { + "type": "string", + "title": "Address" + }, "pathfinders": { "type": "array", "items": { @@ -11028,6 +11841,9 @@ "title": "Vtep IP" } }, + "required": [ + "vtep_ip" + ], "additionalProperties": false, "patternProperties": { "^_.+$": {} @@ -11112,6 +11928,9 @@ "title": "Imported Carriers" } }, + "required": [ + "name" + ], "additionalProperties": false, "patternProperties": { "^_.+$": {} @@ -11284,6 +12103,121 @@ } }, "title": "VRFs" + }, + "internet_exit_policies": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "type": { + "type": "string", + "title": "Type" + }, + "city": { + "type": "string", + "title": "City" + }, + "country": { + "type": "string", + "title": "Country" + }, + "upload_bandwidth": { + "type": "integer", + "title": "Upload Bandwidth" + }, + "download_bandwidth": { + "type": "integer", + "title": "Download Bandwidth" + }, + "firewall": { + "type": "boolean", + "title": "Firewall" + }, + "ips_control": { + "type": "boolean", + "title": "Ips Control" + }, + "acceptable_use_policy": { + "type": "boolean", + "title": "Acceptable Use Policy" + }, + "vpn_credentials": { + "type": "array", + "items": { + "type": "object", + "properties": { + "fqdn": { + "type": "string", + "title": "Fqdn" + }, + "vpn_type": { + "type": "string", + "title": "VPN Type" + }, + "pre_shared_key": { + "type": "string", + "title": "Pre Shared Key" + } + }, + "required": [ + "fqdn", + "vpn_type", + "pre_shared_key" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "VPN Credentials" + }, + "tunnels": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "preference": { + "type": "string", + "title": "Preference" + } + }, + "required": [ + "name", + "preference" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Tunnels" + } + }, + "required": [ + "name", + "type", + "city", + "country", + "firewall", + "ips_control", + "acceptable_use_policy", + "vpn_credentials", + "tunnels" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Internet Exit Policies" } }, "additionalProperties": false, @@ -11309,17 +12243,17 @@ }, "heartbeat_interval": { "type": "integer", - "description": "Heartbeat interval in milliseconds", + "description": "Heartbeat interval in milliseconds.", "title": "Heartbeat Interval" }, "local_interface": { - "description": "Local Interface Name", + "description": "Local Interface Name.", "type": "string", "title": "Local Interface" }, "peer_address": { "type": "string", - "description": "IPv4 Address", + "description": "IPv4 or IPv6 Address.", "title": "Peer Address" }, "peer_address_heartbeat": { @@ -11327,11 +12261,11 @@ "properties": { "peer_ip": { "type": "string", - "description": "IPv4 Address", + "description": "IPv4 or IPv6 Address.", "title": "Peer IP" }, "vrf": { - "description": "VRF Name", + "description": "VRF Name.", "type": "string", "title": "VRF" } @@ -11344,38 +12278,38 @@ }, "dual_primary_detection_delay": { "type": "integer", - "description": "Delay in seconds", + "description": "Delay in seconds.", "minimum": 0, "maximum": 86400, "title": "Dual Primary Detection Delay" }, "dual_primary_recovery_delay_mlag": { "type": "integer", - "description": "Delay in seconds", + "description": "Delay in seconds.", "minimum": 0, "maximum": 86400, "title": "Dual Primary Recovery Delay MLAG" }, "dual_primary_recovery_delay_non_mlag": { "type": "integer", - "description": "Delay in seconds", + "description": "Delay in seconds.", "minimum": 0, "maximum": 86400, "title": "Dual Primary Recovery Delay Non MLAG" }, "peer_link": { - "description": "Port-Channel interface name", + "description": "Port-Channel interface name.", "type": "string", "title": "Peer Link" }, "reload_delay_mlag": { "type": "string", - "description": "Delay in seconds <0-86400> or 'infinity'", + "description": "Delay in seconds <0-86400> or 'infinity'.", "title": "Reload Delay MLAG" }, "reload_delay_non_mlag": { "type": "string", - "description": "Delay in seconds <0-86400> or 'infinity'", + "description": "Delay in seconds <0-86400> or 'infinity'.", "title": "Reload Delay Non MLAG" } }, @@ -11406,7 +12340,7 @@ }, "interfaces": { "type": "string", - "description": "Interface range(s) should be of same type, Ethernet, Loopback, Management etc.\nMultiple interface ranges can be specified separated by \",\"\n", + "description": "Interface range(s) should be of same type, Ethernet, Loopback, Management etc.\nMultiple interface ranges can be specified separated by \",\".\n", "title": "Interfaces" } }, @@ -11421,13 +12355,19 @@ "type": "string", "title": "Local Interfaces" }, + "address_only": { + "type": "boolean", + "description": "PREVIEW: This key is in preview.\nWhen address-only is configured, the source IP of the packet is set to the interface\nIP but the packet may exit the device via a different interface.\nWhen set to `false`, the probe uses the interface to exit the device.\nNot supported yet in EOS.", + "default": true, + "title": "Address Only" + }, "hosts": { "type": "array", "items": { "type": "object", "properties": { "name": { - "description": "Host Name", + "description": "Host Name.", "type": "string", "title": "Name" }, @@ -11443,6 +12383,12 @@ "type": "string", "title": "Local Interfaces" }, + "address_only": { + "type": "boolean", + "description": "PREVIEW: This key is in preview.\nWhen address-only is configured, the source IP of the packet is set to the interface\nIP but the packet may exit the device via a different interface.\nWhen set to `false`, the probe uses the interface to exit the device.\nNot supported yet in EOS.", + "default": true, + "title": "Address Only" + }, "url": { "type": "string", "title": "URL" @@ -11461,7 +12407,7 @@ "type": "object", "properties": { "name": { - "description": "VRF Name", + "description": "VRF Name.", "type": "string", "title": "Name" }, @@ -11494,13 +12440,19 @@ "type": "string", "title": "Local Interfaces" }, + "address_only": { + "type": "boolean", + "description": "PREVIEW: This key is in preview.\nWhen address-only is configured, the source IP of the packet is set to the interface\nIP but the packet may exit the device via a different interface.\nWhen set to `false`, the probe uses the interface to exit the device.\nNot supported yet in EOS.", + "default": true, + "title": "Address Only" + }, "hosts": { "type": "array", "items": { "type": "object", "properties": { "name": { - "description": "Host name", + "description": "Host name.", "type": "string", "title": "Name" }, @@ -11516,6 +12468,12 @@ "type": "string", "title": "Local Interfaces" }, + "address_only": { + "type": "boolean", + "description": "PREVIEW: This key is in preview.\nWhen address-only is configured, the source IP of the packet is set to the interface\nIP but the packet may exit the device via a different interface.\nWhen set to `false`, the probe uses the interface to exit the device.\nNot supported yet in EOS.", + "default": true, + "title": "Address Only" + }, "url": { "type": "string", "title": "URL" @@ -11552,7 +12510,7 @@ "properties": { "enabled": { "type": "boolean", - "description": "Enable monitor layer1", + "description": "Enable monitor layer1.", "title": "Enabled" }, "logging_mac_fault": { @@ -11573,6 +12531,11 @@ "type": "boolean", "description": "Enable transceiver SMBus fail and reset logging.", "title": "Communication" + }, + "enabled": { + "type": "boolean", + "description": "Some platforms support only the `logging transceiver` command. `enabled` key configures this command.", + "title": "Enabled" } }, "additionalProperties": false, @@ -11598,7 +12561,7 @@ "properties": { "name": { "type": "string", - "description": "Session Name", + "description": "Session Name.", "title": "Name" }, "sources": { @@ -11608,7 +12571,7 @@ "properties": { "name": { "type": "string", - "description": "Interface name, range or comma separated list", + "description": "Interface name, range or comma separated list.", "title": "Name" }, "direction": { @@ -11633,7 +12596,7 @@ "title": "Type" }, "name": { - "description": "ACL Name", + "description": "ACL Name.", "type": "string", "title": "Name" }, @@ -11660,7 +12623,7 @@ "type": "array", "items": { "type": "string", - "description": "'cpu' or interface name, range or comma separated list" + "description": "'cpu' or interface name, range or comma separated list." }, "title": "Destinations" }, @@ -11670,7 +12633,7 @@ }, "header_remove_size": { "type": "integer", - "description": "Number of bytes to remove from header", + "description": "Number of bytes to remove from header.", "title": "Header Remove Size" }, "access_group": { @@ -11686,7 +12649,7 @@ "title": "Type" }, "name": { - "description": "ACL Name", + "description": "ACL Name.", "type": "string", "title": "Name" } @@ -11720,7 +12683,7 @@ }, "size": { "type": "integer", - "description": "Size in bytes", + "description": "Size in bytes.", "title": "Size" } }, @@ -11741,32 +12704,414 @@ }, "title": "Monitor Sessions" }, - "mpls": { + "monitor_telemetry_influx": { "type": "object", "properties": { - "ip": { - "type": "boolean", - "title": "IP" + "vrf": { + "type": "string", + "title": "VRF" }, - "ldp": { - "type": "object", - "properties": { - "interface_disabled_default": { - "type": "boolean", - "title": "Interface Disabled Default" - }, - "router_id": { - "type": "string", - "title": "Router ID" + "destinations": { + "type": "array", + "description": "Configure telemetry output destinations.", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "InfluxDB connection name.", + "title": "Name" + }, + "database": { + "type": "string", + "description": "Set name of the database.", + "title": "Database" + }, + "data_retention_policy": { + "type": "string", + "title": "Data Retention Policy" + }, + "url": { + "type": "string", + "description": "It only accepts http(s), udp and unix domain destination URL.", + "pattern": "(http(s)?|udp|unix)://.+", + "title": "URL" + }, + "username": { + "type": "string", + "title": "Username" + }, + "password": { + "type": "string", + "title": "Password" + }, + "password_type": { + "type": "string", + "enum": [ + "0", + "7", + "8a" + ], + "default": "7", + "title": "Password Type" + } }, - "shutdown": { - "type": "boolean", - "title": "Shutdown" + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} }, - "transport_address_interface": { - "description": "Interface Name", - "type": "string", - "title": "Transport Address Interface" + "required": [ + "name" + ] + }, + "title": "Destinations" + }, + "source_group_standard_disabled": { + "type": "boolean", + "description": "Disable standard set of telemetry.", + "title": "Source Group Standard Disabled" + }, + "source_sockets": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Label of the socket connection.", + "title": "Name" + }, + "connection_limit": { + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "title": "Connection Limit" + }, + "url": { + "type": "string", + "description": "It only accepts http(s), udp and unix domain socket URL.", + "pattern": "(http(s)?|udp|unix)://.+", + "title": "URL" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "title": "Source Sockets" + }, + "tags": { + "type": "array", + "description": "Extra tags added to the telemetry output.", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Key of the global tag pair.", + "title": "Name" + }, + "value": { + "type": "string", + "description": "Value of the global tag pair.", + "title": "Value" + } + }, + "required": [ + "value", + "name" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Tags" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Monitor Telemetry Influx" + }, + "monitor_telemetry_postcard_policy": { + "type": "object", + "properties": { + "disabled": { + "type": "boolean", + "default": true, + "description": "Enable or disable the postcard telemetry feature.", + "title": "Disabled" + }, + "ingress": { + "type": "object", + "properties": { + "collection": { + "type": "object", + "description": "Collector configuration.", + "properties": { + "source": { + "type": "string", + "description": "Source IP address of GRE tunnel.", + "title": "Source" + }, + "destination": { + "type": "string", + "description": "Destination IP address of GRE tunnel.", + "title": "Destination" + }, + "version": { + "type": "integer", + "description": "Postcard version.", + "enum": [ + 1, + 2 + ], + "title": "Version" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Collection" + }, + "sample": { + "type": "object", + "description": "Sampling parameters.", + "properties": { + "rate": { + "type": "integer", + "description": "Sampling rate. `rate` is preferred when both `rate` and `tcp_udp_checksum` are defined.", + "enum": [ + 16384, + 32768, + 65536 + ], + "title": "Rate" + }, + "tcp_udp_checksum": { + "type": "object", + "description": "TCP/UDP parameters.", + "properties": { + "value": { + "type": "integer", + "description": "TCP/UDP checksum or IP ID value.", + "minimum": 0, + "maximum": 65535, + "title": "Value" + }, + "mask": { + "type": "string", + "description": "16 bit hexadecimal mask for TCP/UDP or IP ID with atmost 2 unset bits.", + "title": "Mask" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "TCP UDP Checksum" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Sample" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Ingress" + }, + "marker_vxlan": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Enable vxlan marking using default bit 0.", + "title": "Enabled" + }, + "header_word_zero_bit": { + "type": "integer", + "minimum": 1, + "maximum": 31, + "title": "Header Word Zero Bit" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Marker VxLAN" + }, + "profiles": { + "type": "array", + "description": "Postcard telemetry profiles.", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Profile name.", + "title": "Name" + }, + "ingress_sample_policy": { + "type": "string", + "title": "Ingress Sample Policy" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "title": "Profiles" + }, + "sample_policies": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "match_rules": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "type": { + "type": "string", + "description": "IP address version.", + "enum": [ + "ipv4", + "ipv6" + ], + "title": "Type" + }, + "destination_prefix": { + "type": "string", + "description": "IPv4 Network/Mask or IPv6 Network/Mask. Host part of prefix must be zero.\neg. 10.3.3.0/24", + "title": "Destination Prefix" + }, + "source_prefix": { + "type": "string", + "description": "IPv4 Network/Mask or IPv6 Network/Mask. Host part of prefix must be zero.\neg. 10.3.3.0/24", + "title": "Source Prefix" + }, + "protocols": { + "type": "array", + "items": { + "type": "object", + "properties": { + "protocol": { + "type": "string", + "enum": [ + "tcp", + "udp" + ], + "title": "Protocol" + }, + "source_ports": { + "type": "array", + "description": "A list of port numbers or port range or port name. Combination of port numbers or range and port name is not supported on EOS. The port numbers should be in range of 0-65535.\ne.g.\n [ \"12\", \"14-20\" ]\n [ \"www\" ]", + "items": { + "type": "string" + }, + "title": "Source Ports" + }, + "destination_ports": { + "type": "array", + "description": "A list of port numbers or port range or port name. Combination of port numbers or range and port name is not supported on EOS. The port numbers should be in range of 0-65535.\ne.g.\n [ \"12\", \"14-20\", \"80\" ]\n [ \"https\" ]", + "items": { + "type": "string" + }, + "title": "Destination Ports" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "protocol" + ] + }, + "title": "Protocols" + } + }, + "required": [ + "type", + "name" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Match Rules" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "title": "Sample Policies" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Monitor Telemetry Postcard Policy" + }, + "mpls": { + "type": "object", + "properties": { + "ip": { + "type": "boolean", + "title": "IP" + }, + "ldp": { + "type": "object", + "properties": { + "interface_disabled_default": { + "type": "boolean", + "title": "Interface Disabled Default" + }, + "router_id": { + "type": "string", + "title": "Router ID" + }, + "shutdown": { + "type": "boolean", + "title": "Shutdown" + }, + "transport_address_interface": { + "description": "Interface Name.", + "type": "string", + "title": "Transport Address Interface" } }, "additionalProperties": false, @@ -11789,7 +13134,7 @@ "type": "object", "properties": { "vrf": { - "description": "VRF Name", + "description": "VRF Name.", "type": "string", "title": "VRF" } @@ -11822,12 +13167,12 @@ "properties": { "name": { "type": "string", - "description": "Source interface", + "description": "Source interface.", "title": "Name" }, "vrf": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "VRF" } }, @@ -11844,7 +13189,7 @@ "properties": { "name": { "type": "string", - "description": "IP or hostname e.g., 2.2.2.55, ie.pool.ntp.org", + "description": "IP or hostname e.g., 2.2.2.55, 2001:db8::55, ie.pool.ntp.org.", "title": "Name" }, "burst": { @@ -11863,21 +13208,21 @@ }, "local_interface": { "type": "string", - "description": "Source interface", + "description": "Source interface.", "title": "Local Interface" }, "maxpoll": { "type": "integer", "minimum": 3, "maximum": 17, - "description": "Value of maxpoll between 3 - 17 (Logarithmic)", + "description": "Value of maxpoll between 3 - 17 (Logarithmic).", "title": "Maxpoll" }, "minpoll": { "type": "integer", "minimum": 3, "maximum": 17, - "description": "Value of minpoll between 3 - 17 (Logarithmic)", + "description": "Value of minpoll between 3 - 17 (Logarithmic).", "title": "Minpoll" }, "preferred": { @@ -11892,7 +13237,7 @@ }, "vrf": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "VRF" } }, @@ -11920,7 +13265,7 @@ "type": "integer", "minimum": 1, "maximum": 65534, - "description": "Key identifier", + "description": "Key identifier.", "title": "ID" }, "hash_algorithm": { @@ -11933,7 +13278,7 @@ }, "key": { "type": "string", - "description": "Obfuscated key", + "description": "Obfuscated key.", "title": "Key" }, "key_type": { @@ -11958,7 +13303,7 @@ }, "trusted_keys": { "type": "string", - "description": "List of trusted-keys as string ex. 10-12,15", + "description": "List of trusted-keys as string ex. 10-12,15.", "title": "Trusted Keys" } }, @@ -11971,6 +13316,78 @@ "patch_panel": { "type": "object", "properties": { + "connector": { + "type": "object", + "properties": { + "interface": { + "type": "object", + "properties": { + "patch": { + "type": "object", + "properties": { + "bgp_vpws_remote_failure_errdisable": { + "type": "boolean", + "title": "BGP Vpws Remote Failure Errdisable" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Patch" + }, + "recovery": { + "type": "object", + "properties": { + "review_delay": { + "type": "object", + "properties": { + "min": { + "type": "integer", + "minimum": 10, + "maximum": 600, + "description": "Minimum delay.", + "title": "Min" + }, + "max": { + "type": "integer", + "minimum": 15, + "maximum": 900, + "description": "Maximum delay.", + "title": "Max" + } + }, + "required": [ + "min", + "max" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Review Delay" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Recovery" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Interface" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Connector" + }, "patches": { "type": "array", "items": { @@ -11988,7 +13405,7 @@ "type": "array", "minItems": 2, "maxItems": 2, - "description": "Must have exactly two connectors to a patch of which at least one must be of type \"interface\"", + "description": "Must have exactly two connectors to a patch of which at least one must be of type \"interface\".", "items": { "type": "object", "properties": { @@ -12047,7 +13464,7 @@ "properties": { "name": { "type": "string", - "description": "Peer-filter Name", + "description": "Peer-filter Name.", "title": "Name" }, "sequence_numbers": { @@ -12057,12 +13474,12 @@ "properties": { "sequence": { "type": "integer", - "description": "Sequence ID", + "description": "Sequence ID.", "title": "Sequence" }, "match": { "type": "string", - "description": "Match as string\nExample: \"as-range 1-100 result accept\"\n", + "description": "Match as string.\nExample: \"as-range 1-100 result accept\"\n", "title": "Match" } }, @@ -12161,7 +13578,7 @@ }, "threshold": { "type": "string", - "description": "Drop Treshold. This value may also be fractions.\nExample: 7/8 or 3/4 or 1/2\n", + "description": "Drop Threshold. This value may also be fractions.\nExample: 7/8 or 3/4 or 1/2\n", "title": "Threshold" } }, @@ -12229,7 +13646,7 @@ }, "threshold": { "type": "string", - "description": "Drop Treshold. This value may also be fractions.\nExample: 7/8 or 3/4 or 1/2\n", + "description": "Drop Threshold. This value may also be fractions.\nExample: 7/8 or 3/4 or 1/2\n", "title": "Threshold" } }, @@ -12281,7 +13698,7 @@ }, "sand": { "type": "object", - "description": "Most of the platform sand options are hardware dependent and optional", + "description": "Most of the platform sand options are hardware dependent and optional.", "properties": { "qos_maps": { "type": "array", @@ -12418,7 +13835,7 @@ }, "interface_shutdown": { "type": "object", - "description": "Set the global PoE power behavior for PoE ports when ports are admin down", + "description": "Set the global PoE power behavior for PoE ports when ports are admin down.", "properties": { "action": { "type": "string", @@ -12448,13 +13865,13 @@ "properties": { "pbr": { "type": "array", - "description": "PBR Policy-Maps", + "description": "PBR Policy-Maps.", "items": { "type": "object", "properties": { "name": { "type": "string", - "description": "Policy-Map Name", + "description": "Policy-Map Name.", "title": "Name" }, "classes": { @@ -12464,7 +13881,7 @@ "properties": { "name": { "type": "string", - "description": "Class Name", + "description": "Class Name.", "title": "Name" }, "index": { @@ -12472,12 +13889,12 @@ "title": "Index" }, "drop": { - "description": "'drop' and 'set' are mutually exclusive", + "description": "'drop' and 'set' are mutually exclusive.", "type": "boolean", "title": "Drop" }, "set": { - "description": "Set Nexthop\n'drop' and 'set' are mutually exclusive\n", + "description": "Set Nexthop\n'drop' and 'set' are mutually exclusive.\n", "type": "object", "properties": { "nexthop": { @@ -12485,7 +13902,7 @@ "properties": { "ip_address": { "type": "string", - "description": "IPv4 or IPv6 Address", + "description": "IPv4 or IPv6 Address.", "title": "IP Address" }, "recursive": { @@ -12530,13 +13947,13 @@ }, "qos": { "type": "array", - "description": "QOS Policy-Maps", + "description": "QOS Policy-Maps.", "items": { "type": "object", "properties": { "name": { "type": "string", - "description": "Policy-Map Name", + "description": "Policy-Map Name.", "title": "Name" }, "classes": { @@ -12546,7 +13963,7 @@ "properties": { "name": { "type": "string", - "description": "Class Name", + "description": "Class Name.", "title": "Name" }, "set": { @@ -12694,6 +14111,60 @@ ] }, "title": "QOS" + }, + "copp_system_policy": { + "type": "object", + "description": "Control-plane policy configuration.", + "properties": { + "classes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "shape": { + "type": "integer", + "description": "Maximum rate limit.", + "minimum": 0, + "maximum": 10000000, + "title": "Shape" + }, + "bandwidth": { + "type": "integer", + "description": "Minimum bandwidth.", + "minimum": 0, + "maximum": 10000000, + "title": "Bandwidth" + }, + "rate_unit": { + "type": "string", + "description": "The `rate_unit` must be defined for `shape` and `bandwidth`.", + "enum": [ + "pps", + "kbps" + ], + "title": "Rate Unit" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "title": "Classes" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Copp System Policy" } }, "additionalProperties": false, @@ -12752,19 +14223,19 @@ "type": "integer", "minimum": 68, "maximum": 65535, - "description": "\"l2_mtu\" should only be defined for platforms supporting the \"l2 mtu\" CLI\n", + "description": "\"l2_mtu\" should only be defined for platforms supporting the \"l2 mtu\" CLI.\n", "title": "L2 MTU" }, "l2_mru": { "type": "integer", "minimum": 68, "maximum": 65535, - "description": "\"l2_mru\" should only be defined for platforms supporting the \"l2 mru\" CLI\n", + "description": "\"l2_mru\" should only be defined for platforms supporting the \"l2 mru\" CLI.\n", "title": "L2 MRU" }, "vlans": { "type": "string", - "description": "List of switchport vlans as string\nFor a trunk port this would be a range like \"1-200,300\"\nFor an access port this would be a single vlan \"123\"\n", + "description": "List of switchport vlans as string.\nFor a trunk port this would be a range like \"1-200,300\".\nFor an access port this would be a single vlan \"123\".\n", "title": "VLANs" }, "snmp_trap_link_change": { @@ -12784,12 +14255,12 @@ }, "encapsulation_dot1q_vlan": { "type": "integer", - "description": "VLAN tag to configure on sub-interface", + "description": "VLAN tag to configure on sub-interface.", "title": "Encapsulation Dot1Q VLAN" }, "vrf": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "VRF" }, "encapsulation_vlan": { @@ -12803,17 +14274,17 @@ "properties": { "vlan": { "type": "integer", - "description": "Client VLAN ID", + "description": "Client VLAN ID.", "title": "VLAN" }, "outer": { "type": "integer", - "description": "Client Outer VLAN ID", + "description": "Client Outer VLAN ID.", "title": "Outer" }, "inner": { "type": "integer", - "description": "Client Inner VLAN ID", + "description": "Client Inner VLAN ID.", "title": "Inner" } }, @@ -12836,24 +14307,24 @@ }, "network": { "type": "object", - "description": "Network encapsulation are all optional, and skipped if using client unmatched", + "description": "Network encapsulation are all optional, and skipped if using client unmatched.", "properties": { "dot1q": { "type": "object", "properties": { "vlan": { "type": "integer", - "description": "Network VLAN ID", + "description": "Network VLAN ID.", "title": "VLAN" }, "outer": { "type": "integer", - "description": "Network Outer VLAN ID", + "description": "Network Outer VLAN ID.", "title": "Outer" }, "inner": { "type": "integer", - "description": "Network Inner VLAN ID", + "description": "Network Inner VLAN ID.", "title": "Inner" } }, @@ -12899,13 +14370,13 @@ }, "native_vlan": { "type": "integer", - "description": "If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence", + "description": "If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence.", "title": "Native VLAN" }, "native_vlan_tag": { "type": "boolean", "default": false, - "description": "If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence", + "description": "If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence.", "title": "Native VLAN Tag" }, "link_tracking_groups": { @@ -12915,7 +14386,7 @@ "properties": { "name": { "type": "string", - "description": "Group name", + "description": "Group name.", "title": "Name" }, "direction": { @@ -12966,12 +14437,12 @@ "properties": { "encapsulation_dot1q_vlan": { "type": "integer", - "description": "Vlan tag to configure on sub-interface", + "description": "Vlan tag to configure on sub-interface.", "title": "Encapsulation Dot1Q VLAN" }, "forwarding_profile": { "type": "string", - "description": "L2 protocol forwarding profile", + "description": "L2 protocol forwarding profile.", "title": "Forwarding Profile" } }, @@ -12989,7 +14460,7 @@ }, "mlag": { "type": "integer", - "description": "MLAG ID", + "description": "MLAG ID.", "minimum": 1, "maximum": 2000, "title": "MLAG" @@ -13003,7 +14474,7 @@ }, "lacp_fallback_timeout": { "type": "integer", - "description": "Timeout in seconds", + "description": "Timeout in seconds.", "default": 90, "minimum": 0, "maximum": 300, @@ -13031,12 +14502,12 @@ }, "dscp": { "type": "integer", - "description": "DSCP value", + "description": "DSCP value.", "title": "DSCP" }, "cos": { "type": "integer", - "description": "COS value", + "description": "COS value.", "title": "COS" } }, @@ -13055,12 +14526,12 @@ }, "interval": { "type": "integer", - "description": "Interval in milliseconds", + "description": "Interval in milliseconds.", "title": "Interval" }, "min_rx": { "type": "integer", - "description": "Rate in milliseconds", + "description": "Rate in milliseconds.", "title": "Min RX" }, "multiplier": { @@ -13107,7 +14578,7 @@ "properties": { "input": { "type": "string", - "description": "Policy Based Routing Policy-map name", + "description": "Policy Based Routing Policy-map name.", "title": "Input" } }, @@ -13122,7 +14593,7 @@ "properties": { "input": { "type": "string", - "description": "Quality of Service Policy-map name", + "description": "Quality of Service Policy-map name.", "title": "Input" } }, @@ -13180,7 +14651,7 @@ }, "pvlan_mapping": { "type": "string", - "description": "List of vlans as string", + "description": "List of vlans as string.", "title": "PVLAN Mapping" }, "vlan_translations": { @@ -13190,12 +14661,12 @@ "properties": { "from": { "type": "string", - "description": "List of vlans as string (only one vlan if direction is \"both\")", + "description": "List of vlans as string (only one vlan if direction is \"both\").", "title": "From" }, "to": { "type": "integer", - "description": "VLAN ID", + "description": "VLAN ID.", "title": "To" }, "direction": { @@ -13221,7 +14692,7 @@ "properties": { "rate": { "type": "string", - "description": "Rate in kbps, pps or percent\nSupported options are platform dependent\nExamples:\n- \"5000 kbps\"\n- \"1000 pps\"\n- \"20 percent\"\n", + "description": "Rate in kbps, pps or percent.\nSupported options are platform dependent.\nExamples:\n- \"5000 kbps\"\n- \"1000 pps\"\n- \"20 percent\"\n", "title": "Rate" } }, @@ -13239,7 +14710,7 @@ "properties": { "level": { "type": "string", - "description": "Configure maximum storm-control level", + "description": "Configure maximum storm-control level.", "title": "Level" }, "unit": { @@ -13249,7 +14720,7 @@ "percent", "pps" ], - "description": "Optional field and is hardware dependent", + "description": "Optional field and is hardware dependent.", "title": "Unit" } }, @@ -13264,7 +14735,7 @@ "properties": { "level": { "type": "string", - "description": "Configure maximum storm-control level", + "description": "Configure maximum storm-control level.", "title": "Level" }, "unit": { @@ -13274,7 +14745,7 @@ "percent", "pps" ], - "description": "Optional field and is hardware dependent", + "description": "Optional field and is hardware dependent.", "title": "Unit" } }, @@ -13289,7 +14760,7 @@ "properties": { "level": { "type": "string", - "description": "Configure maximum storm-control level", + "description": "Configure maximum storm-control level.", "title": "Level" }, "unit": { @@ -13299,7 +14770,7 @@ "percent", "pps" ], - "description": "Optional field and is hardware dependent", + "description": "Optional field and is hardware dependent.", "title": "Unit" } }, @@ -13314,7 +14785,7 @@ "properties": { "level": { "type": "string", - "description": "Configure maximum storm-control level", + "description": "Configure maximum storm-control level.", "title": "Level" }, "unit": { @@ -13324,7 +14795,7 @@ "percent", "pps" ], - "description": "Optional field and is hardware dependent", + "description": "Optional field and is hardware dependent.", "title": "Unit" } }, @@ -13347,9 +14818,14 @@ }, "isis_enable": { "type": "string", - "description": "ISIS instance", + "description": "ISIS instance.", "title": "ISIS Enable" }, + "isis_bfd": { + "type": "boolean", + "description": "Enable BFD for ISIS.", + "title": "ISIS BFD" + }, "isis_passive": { "type": "boolean", "title": "ISIS Passive" @@ -13385,7 +14861,7 @@ }, "isis_authentication_key": { "type": "string", - "description": "Type-7 encrypted password", + "description": "Type-7 encrypted password.", "title": "ISIS Authentication Key" }, "traffic_policy": { @@ -13393,12 +14869,12 @@ "properties": { "input": { "type": "string", - "description": "Ingress traffic policy", + "description": "Ingress traffic policy.", "title": "Input" }, "output": { "type": "string", - "description": "Egress traffic policy", + "description": "Egress traffic policy.", "title": "Output" } }, @@ -13413,7 +14889,7 @@ "properties": { "identifier": { "type": "string", - "description": "EVPN Ethernet Segment Identifier (Type 1 format)", + "description": "EVPN Ethernet Segment Identifier (Type 1 format).", "title": "Identifier" }, "redundancy": { @@ -13439,12 +14915,12 @@ "type": "integer", "minimum": 0, "maximum": 65535, - "description": "Preference_value is only used when \"algorithm\" is \"preference\"", + "description": "Preference_value is only used when \"algorithm\" is \"preference\".", "title": "Preference Value" }, "dont_preempt": { "type": "boolean", - "description": "Dont_preempt is only used when \"algorithm\" is \"preference\"", + "description": "Dont_preempt is only used when \"algorithm\" is \"preference\".", "default": false, "title": "Dont Preempt" }, @@ -13489,7 +14965,7 @@ }, "route_target": { "type": "string", - "description": "EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx", + "description": "EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx.", "title": "Route Target" } }, @@ -13501,19 +14977,19 @@ }, "esi": { "type": "string", - "description": "EVPN Ethernet Segment Identifier (Type 1 format)\nIf both \"esi\" and \"evpn_ethernet_segment.identifier\" are defined, the new variable takes precedence\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use evpn_ethernet_segment.identifier instead.", + "description": "EVPN Ethernet Segment Identifier (Type 1 format).\nIf both \"esi\" and \"evpn_ethernet_segment.identifier\" are defined, the new variable takes precedence.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use evpn_ethernet_segment.identifier instead.", "deprecated": true, "title": "Esi" }, "rt": { "type": "string", - "description": "EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx\nIf both \"rt\" and \"evpn_ethernet_segment.route_target\" are defined, the new variable takes precedence\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use evpn_ethernet_segment.route_target instead.", + "description": "EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx.\nIf both \"rt\" and \"evpn_ethernet_segment.route_target\" are defined, the new variable takes precedence.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use evpn_ethernet_segment.route_target instead.", "deprecated": true, "title": "Rt" }, "lacp_id": { "type": "string", - "description": "LACP ID with format xxxx.xxxx.xxxx", + "description": "LACP ID with format xxxx.xxxx.xxxx.", "title": "LACP ID" }, "spanning_tree_bpdufilter": { @@ -13622,7 +15098,7 @@ }, "vlan": { "type": "string", - "description": "VLAN can be 'all' or list of vlans as string", + "description": "VLAN can be 'all' or list of vlans as string.", "title": "VLAN" }, "transport": { @@ -13633,6 +15109,11 @@ "layer2" ], "title": "Transport" + }, + "mpass": { + "type": "boolean", + "description": "When MPASS is enabled on an MLAG port-channel, MLAG peers coordinate to function as a single PTP logical device.\nArista PTP enabled devices always place PTP messages on the same physical link within the port-channel.\nHence, MPASS is needed only on MLAG port-channels connected to non-Arista devices.", + "title": "Mpass" } }, "additionalProperties": false, @@ -13643,7 +15124,7 @@ }, "ip_address": { "type": "string", - "description": "IPv4 address/mask", + "description": "IPv4 address/mask.", "title": "IP Address" }, "ip_verify_unicast_source_reachable_via": { @@ -13702,7 +15183,7 @@ "properties": { "access_list": { "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Access List" }, "comment": { @@ -13722,16 +15203,17 @@ "type": "integer", "minimum": 1, "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Group" }, "original_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address. The combination of `original_ip` and `original_port` must be unique.", "title": "Original IP" }, "original_port": { "type": "integer", + "description": "TCP/UDP port. The combination of `original_ip` and `original_port` must be unique.", "minimum": 1, "maximum": 65535, "title": "Original Port" @@ -13752,20 +15234,19 @@ }, "translated_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.", "title": "Translated IP" }, "translated_port": { "type": "integer", "minimum": 1, "maximum": 65535, - "description": "requires 'original_port'", + "description": "requires 'original_port'.", "title": "Translated Port" } }, "required": [ - "translated_ip", - "original_ip" + "translated_ip" ], "additionalProperties": false, "patternProperties": { @@ -13809,7 +15290,7 @@ }, "pool_name": { "type": "string", - "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone\nignored if 'nat_type' is overload\n", + "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone.\nignored if 'nat_type' is overload.\n", "title": "Pool Name" }, "priority": { @@ -13837,7 +15318,7 @@ "properties": { "access_list": { "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Access List" }, "comment": { @@ -13857,16 +15338,17 @@ "type": "integer", "minimum": 1, "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Group" }, "original_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address. The combination of `original_ip` and `original_port` must be unique.", "title": "Original IP" }, "original_port": { "type": "integer", + "description": "TCP/UDP port. The combination of `original_ip` and `original_port` must be unique.", "minimum": 1, "maximum": 65535, "title": "Original Port" @@ -13887,20 +15369,19 @@ }, "translated_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.", "title": "Translated IP" }, "translated_port": { "type": "integer", "minimum": 1, "maximum": 65535, - "description": "requires 'original_port'", + "description": "requires 'original_port'.", "title": "Translated Port" } }, "required": [ - "translated_ip", - "original_ip" + "translated_ip" ], "additionalProperties": false, "patternProperties": { @@ -13929,12 +15410,12 @@ }, "ipv6_address": { "type": "string", - "description": "IPv6 address/mask", + "description": "IPv6 address/mask.", "title": "IPv6 Address" }, "ipv6_address_link_local": { "type": "string", - "description": "Link local IPv6 address/mask", + "description": "Link local IPv6 address/mask.", "title": "IPv6 Address Link Local" }, "ipv6_nd_ra_disabled": { @@ -13956,12 +15437,12 @@ }, "valid_lifetime": { "type": "string", - "description": "Infinite or lifetime in seconds", + "description": "Infinite or lifetime in seconds.", "title": "Valid Lifetime" }, "preferred_lifetime": { "type": "string", - "description": "Infinite or lifetime in seconds", + "description": "Infinite or lifetime in seconds.", "title": "Preferred Lifetime" }, "no_autoconfig_flag": { @@ -13981,32 +15462,32 @@ }, "access_group_in": { "type": "string", - "description": "Access list name", + "description": "Access list name.", "title": "Access Group In" }, "access_group_out": { "type": "string", - "description": "Access list name", + "description": "Access list name.", "title": "Access Group Out" }, "ipv6_access_group_in": { "type": "string", - "description": "IPv6 access list name", + "description": "IPv6 access list name.", "title": "IPv6 Access Group In" }, "ipv6_access_group_out": { "type": "string", - "description": "IPv6 access list name", + "description": "IPv6 access list name.", "title": "IPv6 Access Group Out" }, "mac_access_group_in": { "type": "string", - "description": "MAC access list name", + "description": "MAC access list name.", "title": "MAC Access Group In" }, "mac_access_group_out": { "type": "string", - "description": "MAC access list name", + "description": "MAC access list name.", "title": "MAC Access Group Out" }, "pim": { @@ -14077,7 +15558,7 @@ }, "service_profile": { "type": "string", - "description": "QOS profile", + "description": "QOS profile.", "title": "Service Profile" }, "ospf_network_point_to_point": { @@ -14103,7 +15584,7 @@ }, "ospf_authentication_key": { "type": "string", - "description": "Encrypted password", + "description": "Encrypted password.", "title": "OSPF Authentication Key" }, "ospf_message_digest_keys": { @@ -14128,7 +15609,7 @@ }, "key": { "type": "string", - "description": "Encrypted password", + "description": "Encrypted password.", "title": "Key" } }, @@ -14167,7 +15648,7 @@ "properties": { "session_tracker": { "type": "string", - "description": "Name of session tracker", + "description": "Name of session tracker.", "title": "Session Tracker" } }, @@ -14291,17 +15772,17 @@ }, "peer": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Peer" }, "peer_interface": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Peer Interface" }, "peer_type": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Peer Type" }, "sflow": { @@ -14338,12 +15819,12 @@ }, "validate_state": { "type": "boolean", - "description": "Set to false to disable interface validation by the `eos_validate_state` role", + "description": "Set to false to disable interface validation by the `eos_validate_state` role.", "title": "Validate State" }, "eos_cli": { "type": "string", - "description": "Multiline EOS CLI rendered directly on the port-channel interface in the final EOS configuration", + "description": "Multiline EOS CLI rendered directly on the port-channel interface in the final EOS configuration.", "title": "EOS CLI" } }, @@ -14364,7 +15845,7 @@ "properties": { "name": { "type": "string", - "description": "Prefix-list Name", + "description": "Prefix-list Name.", "title": "Name" }, "sequence_numbers": { @@ -14374,12 +15855,12 @@ "properties": { "sequence": { "type": "integer", - "description": "Sequence ID", + "description": "Sequence ID.", "title": "Sequence" }, "action": { "type": "string", - "description": "Action as string\nExample: \"permit 10.255.0.0/27 eq 32\"\n", + "description": "Action as string.\nExample: \"permit 10.255.0.0/27 eq 32\"\n", "title": "Action" } }, @@ -14492,14 +15973,14 @@ }, "clock_identity": { "type": "string", - "description": "The clock-id in xx:xx:xx:xx:xx:xx format", + "description": "The clock-id in xx:xx:xx:xx:xx:xx format.", "title": "Clock Identity" }, "source": { "type": "object", "properties": { "ip": { - "description": "Source IP", + "description": "Source IP.", "type": "string", "title": "IP" } @@ -14765,11 +16246,11 @@ }, "random_detect": { "type": "object", - "description": "Global random-detect settings", + "description": "Global random-detect settings.", "properties": { "ecn": { "type": "object", - "description": "Global ECN Configuration", + "description": "Global ECN Configuration.", "properties": { "allow_non_ect": { "type": "object", @@ -14781,7 +16262,7 @@ }, "chip_based": { "type": "boolean", - "description": "Allow non-ect chip-based", + "description": "Allow non-ect chip-based.", "title": "Chip Based" } }, @@ -14819,7 +16300,7 @@ "properties": { "name": { "type": "string", - "description": "Profile-Name", + "description": "Profile-Name.", "title": "Name" }, "trust": { @@ -14844,7 +16325,7 @@ "properties": { "rate": { "type": "string", - "description": "Supported options are platform dependent\nExample: \"< rate > kbps\", \"1-100 percent\", \"< rate > pps\"\n", + "description": "Supported options are platform dependent.\nExample: \"< rate > kbps\", \"1-100 percent\", \"< rate > pps\"\n", "title": "Rate" } }, @@ -14862,7 +16343,7 @@ "properties": { "qos_input": { "type": "string", - "description": "Policy-map name", + "description": "Policy-map name.", "title": "QOS Input" } }, @@ -14886,7 +16367,7 @@ "properties": { "id": { "type": "integer", - "description": "TX-Queue ID", + "description": "TX-Queue ID.", "title": "ID" }, "bandwidth_percent": { @@ -14910,7 +16391,7 @@ "properties": { "rate": { "type": "string", - "description": "Supported options are platform dependent\nExample: \"< rate > kbps\", \"1-100 percent\", \"< rate > pps\"\n", + "description": "Supported options are platform dependent.\nExample: \"< rate > kbps\", \"1-100 percent\", \"< rate > pps\"\n", "title": "Rate" } }, @@ -14922,19 +16403,19 @@ }, "comment": { "type": "string", - "description": "Text comment added to queue", + "description": "Text comment added to queue.", "title": "Comment" }, "random_detect": { "type": "object", "properties": { "ecn": { - "description": "Explicit Congestion Notification", + "description": "Explicit Congestion Notification.", "type": "object", "properties": { "count": { "type": "boolean", - "description": "Enable counter for random-detect ECNs", + "description": "Enable counter for random-detect ECNs.", "title": "Count" }, "threshold": { @@ -14955,27 +16436,27 @@ "min": { "type": "integer", "minimum": 1, - "description": "Random-detect ECN minimum-threshold", + "description": "Random-detect ECN minimum-threshold.", "title": "Min" }, "max": { "type": "integer", "minimum": 1, - "description": "Random-detect ECN maximum-threshold", + "description": "Random-detect ECN maximum-threshold.", "title": "Max" }, "max_probability": { "type": "integer", "minimum": 1, "maximum": 100, - "description": "Random-detect ECN maximum mark probability", + "description": "Random-detect ECN maximum mark probability.", "title": "Max Probability" }, "weight": { "type": "integer", "minimum": 0, "maximum": 15, - "description": "Random-detect ECN weight", + "description": "Random-detect ECN weight.", "title": "Weight" } }, @@ -14998,7 +16479,7 @@ "title": "Ecn" }, "drop": { - "description": "Set WRED parameters", + "description": "Set WRED parameters.", "type": "object", "properties": { "threshold": { @@ -15021,19 +16502,19 @@ "type": "integer", "minimum": 0, "maximum": 2, - "description": "Specify Drop Precendence value", + "description": "Specify Drop Precedence value.", "title": "Drop Precedence" }, "min": { "type": "integer", "minimum": 1, - "description": "WRED minimum-threshold", + "description": "WRED minimum-threshold.", "title": "Min" }, "max": { "type": "integer", "minimum": 1, - "description": "WRED maximum-threshold", + "description": "WRED maximum-threshold.", "title": "Max" }, "drop_probability": { @@ -15047,7 +16528,7 @@ "type": "integer", "minimum": 0, "maximum": 15, - "description": "WRED weight", + "description": "WRED weight.", "title": "Weight" } }, @@ -15095,7 +16576,7 @@ "properties": { "id": { "type": "integer", - "description": "UC TX queue ID", + "description": "UC TX queue ID.", "title": "ID" }, "bandwidth_percent": { @@ -15119,7 +16600,7 @@ "properties": { "rate": { "type": "string", - "description": "Supported options are platform dependent\nExample: \"< rate > kbps\", \"1-100 percent\", \"< rate > pps\"\n", + "description": "Supported options are platform dependent.\nExample: \"< rate > kbps\", \"1-100 percent\", \"< rate > pps\"\n", "title": "Rate" } }, @@ -15131,19 +16612,19 @@ }, "comment": { "type": "string", - "description": "Text comment added to queue", + "description": "Text comment added to queue.", "title": "Comment" }, "random_detect": { "type": "object", "properties": { "ecn": { - "description": "Explicit Congestion Notification", + "description": "Explicit Congestion Notification.", "type": "object", "properties": { "count": { "type": "boolean", - "description": "Enable counter for random-detect ECNs", + "description": "Enable counter for random-detect ECNs.", "title": "Count" }, "threshold": { @@ -15158,33 +16639,33 @@ "mbytes", "milliseconds" ], - "description": "Unit to be used for the threshold values", + "description": "Unit to be used for the threshold values.", "title": "Units" }, "min": { "type": "integer", "minimum": 1, - "description": "Random-detect ECN minimum-threshold", + "description": "Random-detect ECN minimum-threshold.", "title": "Min" }, "max": { "type": "integer", "minimum": 1, - "description": "Random-detect ECN maximum-threshold", + "description": "Random-detect ECN maximum-threshold.", "title": "Max" }, "max_probability": { "type": "integer", "minimum": 1, "maximum": 100, - "description": "Random-detect ECN maximum mark probability", + "description": "Random-detect ECN maximum mark probability.", "title": "Max Probability" }, "weight": { "type": "integer", "minimum": 0, "maximum": 15, - "description": "Random-detect ECN weight", + "description": "Random-detect ECN weight.", "title": "Weight" } }, @@ -15207,7 +16688,7 @@ "title": "Ecn" }, "drop": { - "description": "Set WRED parameters", + "description": "Set WRED parameters.", "type": "object", "properties": { "threshold": { @@ -15230,19 +16711,19 @@ "type": "integer", "minimum": 0, "maximum": 2, - "description": "Specify Drop Precendence value", + "description": "Specify Drop Precedence value.", "title": "Drop Precedence" }, "min": { "type": "integer", "minimum": 1, - "description": "WRED minimum-threshold", + "description": "WRED minimum-threshold.", "title": "Min" }, "max": { "type": "integer", "minimum": 1, - "description": "WRED maximum-threshold", + "description": "WRED maximum-threshold.", "title": "Max" }, "drop_probability": { @@ -15256,7 +16737,7 @@ "type": "integer", "minimum": 0, "maximum": 15, - "description": "WRED weight", + "description": "WRED weight.", "title": "Weight" } }, @@ -15304,7 +16785,7 @@ "properties": { "id": { "type": "integer", - "description": "MC TX queue ID", + "description": "MC TX queue ID.", "title": "ID" }, "bandwidth_percent": { @@ -15328,7 +16809,7 @@ "properties": { "rate": { "type": "string", - "description": "Supported options are platform dependent\nExample: \"< rate > kbps\", \"1-100 percent\", \"< rate > pps\"\n", + "description": "Supported options are platform dependent.\nExample: \"< rate > kbps\", \"1-100 percent\", \"< rate > pps\"\n", "title": "Rate" } }, @@ -15356,7 +16837,7 @@ }, "priority_flow_control": { "type": "object", - "description": "Priority Flow Control settings\n", + "description": "Priority Flow Control settings.\n", "properties": { "enabled": { "type": "boolean", @@ -15388,7 +16869,7 @@ "timeout": { "type": "string", "pattern": "^\\d+(\\.\\d{1,2})?$", - "description": "Timeout in seconds after which port should be errdisabled or\nshould start dropping on congested priorities.\nThis should be decimal with up to 2 decimal point\nExample: 0.01 or 60\n", + "description": "Timeout in seconds after which port should be errdisabled or\nshould start dropping on congested priorities.\nThis should be decimal with up to 2 decimal point.\nExample: 0.01 or 60\n", "title": "Timeout" }, "polling_interval": { @@ -15432,7 +16913,7 @@ }, "priorities": { "type": "array", - "description": "Set the drop/no_drop on each queue\n", + "description": "Set the drop/no_drop on each queue.\n", "items": { "type": "object", "properties": { @@ -15440,12 +16921,12 @@ "type": "integer", "minimum": 0, "maximum": 7, - "description": "Priority queue number (COS value)\n", + "description": "Priority queue number (COS value).\n", "title": "Priority" }, "no_drop": { "type": "boolean", - "description": "Enable Priority Flow Control frames on this queue\n", + "description": "Enable Priority Flow Control frames on this queue.\n", "title": "No Drop" } }, @@ -15510,12 +16991,12 @@ }, "log": { "type": "integer", - "description": "Logging interval in seconds", + "description": "Logging interval in seconds.", "title": "Log" }, "notifying": { "type": "boolean", - "description": "Should only be used for platforms supporting the \"queue-monitor length notifying\" CLI", + "description": "Should only be used for platforms supporting the \"queue-monitor length notifying\" CLI.", "title": "Notifying" }, "cpu": { @@ -15551,7 +17032,7 @@ }, "tx_latency": { "type": "boolean", - "description": "Enable tx-latency mode", + "description": "Enable tx-latency mode.", "title": "TX Latency" } }, @@ -15573,12 +17054,12 @@ }, "ip_access_group": { "type": "string", - "description": "Name of IP ACL", + "description": "Name of IP ACL.", "title": "IP Access Group" }, "ipv6_access_group": { "type": "string", - "description": "Name of IPv6 ACL", + "description": "Name of IPv6 ACL.", "title": "IPv6 Access Group" }, "max_connections": { @@ -15627,12 +17108,12 @@ "type": "integer", "minimum": 0, "maximum": 65535, - "description": "TCP Port", + "description": "TCP Port.", "title": "Port" }, "tls_ssl_profile": { "type": "string", - "description": "Name of TLS profile", + "description": "Name of TLS profile.", "title": "TLS SSL Profile" } }, @@ -15649,7 +17130,7 @@ "properties": { "host": { "type": "string", - "description": "Host IP address or name", + "description": "Host IP address or name.", "title": "Host" }, "vrf": { @@ -15670,7 +17151,7 @@ }, "key": { "type": "string", - "description": "Encrypted key", + "description": "Encrypted key.", "title": "Key" } }, @@ -15698,7 +17179,7 @@ "properties": { "host": { "type": "string", - "description": "Host IP address or name", + "description": "Host IP address or name.", "title": "Host" }, "vrf": { @@ -15707,7 +17188,7 @@ }, "key": { "type": "string", - "description": "Encrypted key", + "description": "Encrypted key.", "title": "Key" } }, @@ -15723,7 +17204,7 @@ "properties": { "protocol": { "type": "string", - "description": "Redundancy Protocol", + "description": "Redundancy Protocol.", "title": "Protocol" } }, @@ -15740,7 +17221,7 @@ "properties": { "name": { "type": "string", - "description": "Role name", + "description": "Role name.", "title": "Name" }, "sequence_numbers": { @@ -15750,7 +17231,7 @@ "properties": { "sequence": { "type": "integer", - "description": "Sequence number", + "description": "Sequence number.", "title": "Sequence" }, "action": { @@ -15763,12 +17244,12 @@ }, "mode": { "type": "string", - "description": "\"config\", \"config-all\", \"exec\" or mode key as string\n", + "description": "\"config\", \"config-all\", \"exec\" or mode key as string.\n", "title": "Mode" }, "command": { "type": "string", - "description": "Command as string", + "description": "Command as string.", "title": "Command" } }, @@ -15794,7 +17275,7 @@ "properties": { "name": { "type": "string", - "description": "Route-map Name", + "description": "Route-map Name.", "title": "Name" }, "sequence_numbers": { @@ -15804,7 +17285,7 @@ "properties": { "sequence": { "type": "integer", - "description": "Sequence ID", + "description": "Sequence ID.", "title": "Sequence" }, "type": { @@ -15821,25 +17302,25 @@ }, "match": { "type": "array", - "description": "List of \"match\" statements", + "description": "List of \"match\" statements.", "items": { "type": "string", - "description": "Match as string\nExample: \"ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY\"\n" + "description": "Match as string.\nExample: \"ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY\"\n" }, "title": "Match" }, "set": { "type": "array", - "description": "List of \"set\" statements", + "description": "List of \"set\" statements.", "items": { "type": "string", - "description": "Set as string\nExample: \"origin incomplete\"\n" + "description": "Set as string.\nExample: \"origin incomplete\"\n" }, "title": "Set" }, "sub_route_map": { "type": "string", - "description": "Name of Sub-Route-map", + "description": "Name of Sub-Route-map.", "title": "Sub Route Map" }, "continue": { @@ -15904,6 +17385,7 @@ "properties": { "name": { "type": "string", + "pattern": "^[A-Za-z0-9_.:{}\\[\\]-]+$", "title": "Name" }, "id": { @@ -15929,6 +17411,7 @@ "properties": { "name": { "type": "string", + "pattern": "^[A-Za-z0-9_.:{}\\[\\]-]+$", "title": "Name" }, "id": { @@ -15954,6 +17437,7 @@ "properties": { "name": { "type": "string", + "pattern": "^[A-Za-z0-9_.:{}\\[\\]-]+$", "title": "Name" }, "id": { @@ -16130,17 +17614,17 @@ "properties": { "interval": { "type": "integer", - "description": "Rate in milliseconds", + "description": "Rate in milliseconds.", "title": "Interval" }, "local_address": { "type": "string", - "description": "Configure BFD local IP/IPv6 address", + "description": "Configure BFD local IP/IPv6 address.", "title": "Local Address" }, "min_rx": { "type": "integer", - "description": "Rate in milliseconds", + "description": "Rate in milliseconds.", "title": "Min RX" }, "multiplier": { @@ -16154,12 +17638,12 @@ "properties": { "interval": { "type": "integer", - "description": "Rate in milliseconds", + "description": "Rate in milliseconds.", "title": "Interval" }, "min_rx": { "type": "integer", - "description": "Rate in milliseconds", + "description": "Rate in milliseconds.", "title": "Min RX" }, "multiplier": { @@ -16194,7 +17678,7 @@ "properties": { "name": { "type": "string", - "description": "Interface Name", + "description": "Interface Name.", "title": "Name" }, "protocols": { @@ -16224,7 +17708,7 @@ }, "initiator_interval": { "type": "integer", - "description": "Rate in milliseconds", + "description": "Rate in milliseconds.", "title": "Initiator Interval" }, "initiator_multiplier": { @@ -16235,7 +17719,7 @@ }, "initiator_measurement_round_trip": { "type": "boolean", - "description": "Enable round-trip delay measurement", + "description": "Enable round-trip delay measurement.", "title": "Initiator Measurement Round Trip" }, "reflector": { @@ -16243,12 +17727,12 @@ "properties": { "min_rx": { "type": "integer", - "description": "Rate in milliseconds", + "description": "Rate in milliseconds.", "title": "Min RX" }, "local_discriminator": { "type": "string", - "description": "IPv4 address or 32 bit integer", + "description": "IPv4 address or 32 bit integer.", "title": "Local Discriminator" } }, @@ -16291,7 +17775,7 @@ }, "router_id": { "type": "string", - "description": "In IP address format A.B.C.D", + "description": "In IP address format A.B.C.D.", "title": "Router ID" }, "distance": { @@ -16338,14 +17822,14 @@ "type": "integer", "minimum": 1, "maximum": 3600, - "description": "Number of seconds", + "description": "Number of seconds.", "title": "Restart Time" }, "stalepath_time": { "type": "integer", "minimum": 1, "maximum": 3600, - "description": "Number of seconds", + "description": "Number of seconds.", "title": "Stalepath Time" } }, @@ -16428,12 +17912,12 @@ }, "bgp_cluster_id": { "type": "string", - "description": "IP Address A.B.C.D", + "description": "IP Address A.B.C.D.", "title": "BGP Cluster ID" }, "bgp_defaults": { "type": "array", - "description": "BGP command as string", + "description": "BGP command as string.", "items": { "type": "string" }, @@ -16493,6 +17977,11 @@ "^_.+$": {} }, "title": "Bestpath" + }, + "redistribute_internal": { + "type": "boolean", + "description": "Allow redistribution of iBGP routes into an Interior Gateway Protocol (IGP). EOS default is true.", + "title": "Redistribute Internal" } }, "additionalProperties": false, @@ -16503,28 +17992,28 @@ }, "listen_ranges": { "type": "array", - "description": "Improved \"listen_ranges\" data model to support multiple listen ranges and additional filter capabilities\n", + "description": "Improved \"listen_ranges\" data model to support multiple listen ranges and additional filter capabilities.\n", "items": { "type": "object", "properties": { "prefix": { "type": "string", - "description": "IPv4 prefix \"A.B.C.D/E\" or IPv6 prefix \"A:B:C:D:E:F:G:H/I\"", + "description": "IPv4 prefix \"A.B.C.D/E\" or IPv6 prefix \"A:B:C:D:E:F:G:H/I\".", "title": "Prefix" }, "peer_id_include_router_id": { "type": "boolean", - "description": "Include router ID as part of peer filter", + "description": "Include router ID as part of peer filter.", "title": "Peer ID Include Router ID" }, "peer_group": { "type": "string", - "description": "Peer group name", + "description": "Peer group name.", "title": "Peer Group" }, "peer_filter": { "type": "string", - "description": "Peer-filter name\nnote: `peer_filter` or `remote_as` is required but mutually exclusive.\nIf both are defined, `peer_filter` takes precedence\n", + "description": "Peer-filter name.\nnote: `peer_filter` or `remote_as` is required but mutually exclusive.\nIf both are defined, `peer_filter` takes precedence\n", "title": "Peer Filter" }, "remote_as": { @@ -16547,12 +18036,12 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "type": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Type" }, "remote_as": { @@ -16575,16 +18064,16 @@ }, "as_path": { "type": "object", - "description": "BGP AS-PATH options", + "description": "BGP AS-PATH options.", "properties": { "remote_as_replace_out": { "type": "boolean", - "description": "Replace AS number with local AS number", + "description": "Replace AS number with local AS number.", "title": "Remote As Replace Out" }, "prepend_own_disabled": { "type": "boolean", - "description": "Disable prepending own AS number to AS path", + "description": "Disable prepending own AS number to AS path.", "title": "Prepend Own Disabled" } }, @@ -16596,7 +18085,7 @@ }, "remove_private_as": { "type": "object", - "description": "Remove private AS numbers in outbound AS path", + "description": "Remove private AS numbers in outbound AS path.", "properties": { "enabled": { "type": "boolean", @@ -16637,7 +18126,7 @@ }, "peer_filter": { "type": "string", - "description": "Peer-filter name\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", + "description": "Peer-filter name.\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", "deprecated": true, "title": "Peer Filter" }, @@ -16647,7 +18136,7 @@ }, "update_source": { "type": "string", - "description": "IP address or interface name", + "description": "IP address or interface name.", "title": "Update Source" }, "route_reflector_client": { @@ -16699,7 +18188,7 @@ "type": "integer", "minimum": 1, "maximum": 255, - "description": "Time-to-live in range of hops", + "description": "Time-to-live in range of hops.", "title": "Ebgp Multihop" }, "next_hop_self": { @@ -16727,7 +18216,7 @@ }, "route_map": { "type": "string", - "description": "Route-map name", + "description": "Route-map name.", "title": "Route Map" } }, @@ -16739,25 +18228,114 @@ }, "send_community": { "type": "string", - "description": "'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'", + "description": "'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'.", "title": "Send Community" }, "maximum_routes": { "type": "integer", - "description": "Maximum number of routes (0 means unlimited)", + "description": "Maximum number of routes (0 means unlimited).", "minimum": 0, "maximum": 4294967294, "title": "Maximum Routes" }, "maximum_routes_warning_limit": { "type": "string", - "description": "Maximum number of routes after which a warning is issued (0 means never warn) or\nPercentage of maximum number of routes at which to warn (\"<1-100> percent\")\n", + "description": "Maximum number of routes after which a warning is issued (0 means never warn) or\nPercentage of maximum number of routes at which to warn (\"<1-100> percent\").\n", "title": "Maximum Routes Warning Limit" }, "maximum_routes_warning_only": { "type": "boolean", "title": "Maximum Routes Warning Only" }, + "missing_policy": { + "type": "object", + "description": "Missing policy configuration for all address-families.", + "properties": { + "direction_in": { + "description": "Missing policy inbound direction.", + "type": "object", + "properties": { + "action": { + "description": "Missing policy action.", + "type": "string", + "enum": [ + "deny", + "permit", + "deny-in-out" + ], + "title": "Action" + }, + "include_community_list": { + "type": "boolean", + "description": "Include community-list references in missing policy decision.", + "title": "Include Community List" + }, + "include_prefix_list": { + "type": "boolean", + "description": "Include prefix-list references in missing policy decision.", + "title": "Include Prefix List" + }, + "include_sub_route_map": { + "type": "boolean", + "description": "Include sub-route-map references in missing policy decision.", + "title": "Include Sub Route Map" + } + }, + "required": [ + "action" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Direction In" + }, + "direction_out": { + "description": "Missing policy outbound direction.", + "type": "object", + "properties": { + "action": { + "description": "Missing policy action.", + "type": "string", + "enum": [ + "deny", + "permit", + "deny-in-out" + ], + "title": "Action" + }, + "include_community_list": { + "type": "boolean", + "description": "Include community-list references in missing policy decision.", + "title": "Include Community List" + }, + "include_prefix_list": { + "type": "boolean", + "description": "Include prefix-list references in missing policy decision.", + "title": "Include Prefix List" + }, + "include_sub_route_map": { + "type": "boolean", + "description": "Include sub-route-map references in missing policy decision.", + "title": "Include Sub Route Map" + } + }, + "required": [ + "action" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Direction Out" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Missing Policy" + }, "link_bandwidth": { "type": "object", "properties": { @@ -16767,7 +18345,7 @@ }, "default": { "type": "string", - "description": "nn.nn(K|M|G) link speed in bits/second", + "description": "nn.nn(K|M|G) link speed in bits/second.", "title": "Default" } }, @@ -16786,7 +18364,7 @@ }, "times": { "type": "integer", - "description": "Number of local ASNs allowed in a BGP update", + "description": "Number of local ASNs allowed in a BGP update.", "minimum": 1, "maximum": 10, "title": "Times" @@ -16806,7 +18384,7 @@ }, "timers": { "type": "string", - "description": "BGP Keepalive and Hold Timer values in seconds as string \"<0-3600> <0-3600>\"", + "description": "BGP Keepalive and Hold Timer values in seconds as string \"<0-3600> <0-3600>\".", "title": "Timers" }, "rib_in_pre_policy_retain": { @@ -16829,17 +18407,17 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" }, "bgp_listen_range_prefix": { "type": "string", - "description": "IP prefix range\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", + "description": "IP prefix range.\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", "deprecated": true, "title": "BGP Listen Range Prefix" }, @@ -16847,6 +18425,35 @@ "type": "string", "title": "Session Tracker" }, + "shared_secret": { + "type": "object", + "properties": { + "profile": { + "type": "string", + "description": "Name of profile defined under `management_security`.", + "title": "Profile" + }, + "hash_algorithm": { + "type": "string", + "description": "Note: Algorithm hmac-sha-256 requires EOS version 4.31.1F and above.", + "enum": [ + "aes-128-cmac-96", + "hmac-sha-256", + "hmac-sha1-96" + ], + "title": "Hash Algorithm" + } + }, + "required": [ + "profile", + "hash_algorithm" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Shared Secret" + }, "ttl_maximum_hops": { "type": "integer", "minimum": 0, @@ -16890,16 +18497,16 @@ }, "as_path": { "type": "object", - "description": "BGP AS-PATH options", + "description": "BGP AS-PATH options.", "properties": { "remote_as_replace_out": { "type": "boolean", - "description": "Replace AS number with local AS number", + "description": "Replace AS number with local AS number.", "title": "Remote As Replace Out" }, "prepend_own_disabled": { "type": "boolean", - "description": "Disable prepending own AS number to AS path", + "description": "Disable prepending own AS number to AS path.", "title": "Prepend Own Disabled" } }, @@ -16911,7 +18518,7 @@ }, "peer": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Peer" }, "description": { @@ -16936,7 +18543,7 @@ }, "update_source": { "type": "string", - "description": "Source Interface", + "description": "Source Interface.", "title": "Update Source" }, "bfd": { @@ -16988,17 +18595,17 @@ }, "timers": { "type": "string", - "description": "BGP Keepalive and Hold Timer values in seconds as string \"<0-3600> <0-3600>\"", + "description": "BGP Keepalive and Hold Timer values in seconds as string \"<0-3600> <0-3600>\".", "title": "Timers" }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" }, "default_originate": { @@ -17025,25 +18632,114 @@ }, "send_community": { "type": "string", - "description": "'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'", + "description": "'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'.", "title": "Send Community" }, "maximum_routes": { "type": "integer", - "description": "Maximum number of routes (0 means unlimited)", + "description": "Maximum number of routes (0 means unlimited).", "minimum": 0, "maximum": 4294967294, "title": "Maximum Routes" }, "maximum_routes_warning_limit": { "type": "string", - "description": "Maximum number of routes after which a warning is issued (0 means never warn) or\nPercentage of maximum number of routes at which to warn (\"<1-100> percent\")\n", + "description": "Maximum number of routes after which a warning is issued (0 means never warn) or\nPercentage of maximum number of routes at which to warn (\"<1-100> percent\").\n", "title": "Maximum Routes Warning Limit" }, "maximum_routes_warning_only": { "type": "boolean", "title": "Maximum Routes Warning Only" }, + "missing_policy": { + "type": "object", + "description": "Missing policy configuration for all address-families.", + "properties": { + "direction_in": { + "description": "Missing policy inbound direction.", + "type": "object", + "properties": { + "action": { + "description": "Missing policy action.", + "type": "string", + "enum": [ + "deny", + "permit", + "deny-in-out" + ], + "title": "Action" + }, + "include_community_list": { + "type": "boolean", + "description": "Include community-list references in missing policy decision.", + "title": "Include Community List" + }, + "include_prefix_list": { + "type": "boolean", + "description": "Include prefix-list references in missing policy decision.", + "title": "Include Prefix List" + }, + "include_sub_route_map": { + "type": "boolean", + "description": "Include sub-route-map references in missing policy decision.", + "title": "Include Sub Route Map" + } + }, + "required": [ + "action" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Direction In" + }, + "direction_out": { + "description": "Missing policy outbound direction.", + "type": "object", + "properties": { + "action": { + "description": "Missing policy action.", + "type": "string", + "enum": [ + "deny", + "permit", + "deny-in-out" + ], + "title": "Action" + }, + "include_community_list": { + "type": "boolean", + "description": "Include community-list references in missing policy decision.", + "title": "Include Community List" + }, + "include_prefix_list": { + "type": "boolean", + "description": "Include prefix-list references in missing policy decision.", + "title": "Include Prefix List" + }, + "include_sub_route_map": { + "type": "boolean", + "description": "Include sub-route-map references in missing policy decision.", + "title": "Include Sub Route Map" + } + }, + "required": [ + "action" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Direction Out" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Missing Policy" + }, "allowas_in": { "type": "object", "properties": { @@ -17055,7 +18751,7 @@ "type": "integer", "minimum": 1, "maximum": 10, - "description": "Number of local ASNs allowed in a BGP update", + "description": "Number of local ASNs allowed in a BGP update.", "title": "Times" } }, @@ -17069,7 +18765,7 @@ "type": "integer", "minimum": 1, "maximum": 255, - "description": "Time-to-live in range of hops", + "description": "Time-to-live in range of hops.", "title": "Ebgp Multihop" }, "next_hop_self": { @@ -17085,7 +18781,7 @@ }, "default": { "type": "string", - "description": "nn.nn(K|M|G) link speed in bits/second", + "description": "nn.nn(K|M|G) link speed in bits/second.", "title": "Default" } }, @@ -17115,7 +18811,7 @@ }, "remove_private_as": { "type": "object", - "description": "Remove private AS numbers in outbound AS path", + "description": "Remove private AS numbers in outbound AS path.", "properties": { "enabled": { "type": "boolean", @@ -17158,6 +18854,35 @@ "type": "string", "title": "Session Tracker" }, + "shared_secret": { + "type": "object", + "properties": { + "profile": { + "type": "string", + "description": "Name of profile defined under `management_security`.", + "title": "Profile" + }, + "hash_algorithm": { + "type": "string", + "description": "Note: Algorithm hmac-sha-256 requires EOS version 4.31.1F and above.", + "enum": [ + "aes-128-cmac-96", + "hmac-sha-256", + "hmac-sha1-96" + ], + "title": "Hash Algorithm" + } + }, + "required": [ + "profile", + "hash_algorithm" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Shared Secret" + }, "ttl_maximum_hops": { "type": "integer", "minimum": 0, @@ -17183,7 +18908,7 @@ "properties": { "name": { "type": "string", - "description": "Interface name", + "description": "Interface name.", "title": "Name" }, "remote_as": { @@ -17193,7 +18918,7 @@ }, "peer": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Peer" }, "peer_group": { @@ -17207,7 +18932,7 @@ }, "peer_filter": { "type": "string", - "description": "Peer-filter name", + "description": "Peer-filter name.", "title": "Peer Filter" } }, @@ -17228,7 +18953,7 @@ "properties": { "prefix": { "type": "string", - "description": "IPv4 prefix \"A.B.C.D/E\" or IPv6 prefix \"A:B:C:D:E:F:G:H/I\"", + "description": "IPv4 prefix \"A.B.C.D/E\" or IPv6 prefix \"A:B:C:D:E:F:G:H/I\".", "title": "Prefix" }, "advertise_only": { @@ -17239,28 +18964,18 @@ "type": "boolean", "title": "As Set" }, - "advertise_map": { - "type": "string", - "description": "Route-map name", - "title": "Advertise Map" - }, - "supress_map": { - "type": "string", - "description": "Route-map name", - "title": "Supress Map" - }, "summary_only": { "type": "boolean", "title": "Summary Only" }, "attribute_map": { "type": "string", - "description": "Route-map name", + "description": "Route-map name.", "title": "Attribute Map" }, "match_map": { "type": "string", - "description": "Route-map name", + "description": "Route-map name.", "title": "Match Map" } }, @@ -17281,15 +18996,44 @@ "properties": { "source_protocol": { "type": "string", + "enum": [ + "attached-host", + "bgp", + "connected", + "dynamic", + "isis", + "ospf", + "ospfv3", + "rip", + "static", + "user" + ], "title": "Source Protocol" }, "route_map": { "type": "string", "title": "Route Map" }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).\n`route_map` and `rcf` are mutually exclusive. `route_map` takes precedence.\nOnly applicable if `source_protocol` is one of `connected`, `static`, `isis`, `user`, `dynamic`.", + "title": "RCF" + }, "include_leaked": { "type": "boolean", "title": "Include Leaked" + }, + "ospf_route_type": { + "type": "string", + "enum": [ + "external", + "internal", + "nssa-external", + "nssa-external 1", + "nssa-external 2" + ], + "description": "Routes learned by the OSPF protocol.\nThe `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'.\n", + "title": "OSPF Route Type" } }, "additionalProperties": false, @@ -17309,21 +19053,21 @@ "properties": { "name": { "type": "string", - "description": "VLAN aware bundle name", + "description": "VLAN aware bundle name.", "title": "Name" }, "tenant": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Tenant" }, "description": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Description" }, "rd": { - "description": "Route distinguisher", + "description": "Route distinguisher.", "type": "string", "title": "Rd" }, @@ -17340,7 +19084,7 @@ }, "rd": { "type": "string", - "description": "Route distinguisher", + "description": "Route distinguisher.", "title": "Rd" } }, @@ -17472,12 +19216,12 @@ }, "vlan": { "type": "string", - "description": "VLAN range as string. Example \"100-200,300\"", + "description": "VLAN range as string. Example \"100-200,300\".", "title": "VLAN" }, "eos_cli": { "type": "string", - "description": "Multiline EOS CLI rendered directly on the Router BGP, VLAN-aware-bundle definition in the final EOS configuration", + "description": "Multiline EOS CLI rendered directly on the Router BGP, VLAN-aware-bundle definition in the final EOS configuration.", "title": "EOS CLI" } }, @@ -17502,11 +19246,11 @@ }, "tenant": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Tenant" }, "rd": { - "description": "Route distinguisher", + "description": "Route distinguisher.", "type": "string", "title": "Rd" }, @@ -17523,7 +19267,7 @@ }, "rd": { "type": "string", - "description": "Route distinguisher", + "description": "Route distinguisher.", "title": "Rd" } }, @@ -17535,7 +19279,7 @@ }, "eos_cli": { "type": "string", - "description": "Multiline EOS CLI rendered directly on the Router BGP, VLAN definition in the final EOS configuration", + "description": "Multiline EOS CLI rendered directly on the Router BGP, VLAN definition in the final EOS configuration.", "title": "EOS CLI" }, "route_targets": { @@ -17676,11 +19420,11 @@ "properties": { "name": { "type": "string", - "description": "VPWS instance name", + "description": "VPWS instance name.", "title": "Name" }, "rd": { - "description": "Route distinguisher", + "description": "Route distinguisher.", "type": "string", "title": "Rd" }, @@ -17689,7 +19433,7 @@ "properties": { "import_export": { "type": "string", - "description": "Route Target", + "description": "Route Target.", "title": "Import Export" } }, @@ -17718,17 +19462,17 @@ "properties": { "name": { "type": "string", - "description": "Pseudowire name", + "description": "Pseudowire name.", "title": "Name" }, "id_local": { "type": "integer", - "description": "Must match id_remote on other pe", + "description": "Must match id_remote on other pe.", "title": "ID Local" }, "id_remote": { "type": "integer", - "description": "Must match id_local on other pe", + "description": "Must match id_local on other pe.", "title": "ID Remote" } }, @@ -17772,7 +19516,7 @@ "title": "Encapsulation" }, "next_hop_self_source_interface": { - "description": "Source interface name", + "description": "Source interface name.", "type": "string", "title": "Next Hop Self Source Interface" }, @@ -17847,6 +19591,39 @@ "activate": { "type": "boolean", "title": "Activate" + }, + "rcf_in": { + "type": "string", + "description": "Inbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF In" + }, + "rcf_out": { + "type": "string", + "description": "Outbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF Out" + }, + "default_route": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF" + }, + "route_map": { + "type": "string", + "title": "Route Map" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Default Route" } }, "additionalProperties": false, @@ -17866,7 +19643,7 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "activate": { @@ -17875,14 +19652,47 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" }, + "rcf_in": { + "type": "string", + "description": "Inbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF In" + }, + "rcf_out": { + "type": "string", + "description": "Outbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF Out" + }, + "default_route": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF" + }, + "route_map": { + "type": "string", + "title": "Route Map" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Default Route" + }, "domain_remote": { "type": "boolean", "title": "Domain Remote" @@ -17919,14 +19729,14 @@ }, "ecmp_limit": { "type": "integer", - "description": "Amount of ECMP paths to send", + "description": "Amount of ECMP paths to send.", "minimum": 2, "maximum": 64, "title": "ECMP Limit" }, "limit": { "type": "integer", - "description": "Amount of paths to send", + "description": "Amount of paths to send.", "minimum": 2, "maximum": 64, "title": "Limit" @@ -17965,7 +19775,7 @@ }, "window": { "type": "integer", - "description": "Time (in seconds) to detect a MAC duplication issue", + "description": "Time (in seconds) to detect a MAC duplication issue.", "minimum": 0, "maximum": 4294967295, "title": "Window" @@ -17974,14 +19784,14 @@ "type": "integer", "minimum": 0, "maximum": 4294967295, - "description": "Minimum number of MAC moves that indicate a MAC Duplication issue", + "description": "Minimum number of MAC moves that indicate a MAC Duplication issue.", "title": "Threshold" }, "expiry_timeout": { "type": "integer", "minimum": 0, "maximum": 4294967295, - "description": "Time (in seconds) to purge a MAC duplication issue", + "description": "Time (in seconds) to purge a MAC duplication issue.", "title": "Expiry Timeout" } }, @@ -18019,6 +19829,10 @@ "type": "boolean", "title": "Import Ethernet Segment IP Mass Withdraw" }, + "import_overlay_index_gateway": { + "type": "boolean", + "title": "Import Overlay Index Gateway" + }, "export_ethernet_segment_ip_mass_withdraw": { "type": "boolean", "title": "Export Ethernet Segment IP Mass Withdraw" @@ -18033,6 +19847,87 @@ "next_hop_unchanged": { "type": "boolean", "title": "Next Hop Unchanged" + }, + "bgp_additional_paths": { + "type": "object", + "description": "BGP additional-paths commands.", + "properties": { + "receive": { + "type": "boolean", + "description": "Receive multiple paths.", + "title": "Receive" + }, + "send": { + "type": "object", + "description": "Send multiple paths.", + "properties": { + "any": { + "type": "boolean", + "description": "Any eligible path.", + "title": "Any" + }, + "backup": { + "type": "boolean", + "description": "Best path and installed backup path.", + "title": "Backup" + }, + "ecmp": { + "type": "boolean", + "description": "All paths in best path ECMP group.", + "title": "ECMP" + }, + "ecmp_limit": { + "type": "integer", + "description": "Amount of ECMP paths to send.", + "minimum": 2, + "maximum": 64, + "title": "ECMP Limit" + }, + "limit": { + "type": "integer", + "description": "Amount of paths to send.", + "minimum": 2, + "maximum": 64, + "title": "Limit" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Send" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "BGP Additional Paths" + }, + "layer_2_fec_in_place_update": { + "type": "object", + "description": "BGP layer-2 in-place FEC operation.", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "timeout": { + "type": "integer", + "description": "In-place FEC update tracking timeout in seconds.", + "minimum": 0, + "maximum": 300, + "title": "Timeout" + } + }, + "required": [ + "enabled" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Layer 2 Fec In Place Update" } }, "additionalProperties": false, @@ -18051,7 +19946,7 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "activate": { @@ -18103,12 +19998,12 @@ "type": "object", "properties": { "prefix": { - "description": "IPv4 prefix \"A.B.C.D/E\" or IPv6 prefix \"A:B:C:D:E:F:G:H/I\"", + "description": "IPv4 prefix \"A.B.C.D/E\" or IPv6 prefix \"A:B:C:D:E:F:G:H/I\".", "type": "string", "title": "Prefix" }, "route_map": { - "description": "Route-map name", + "description": "Route-map name.", "type": "string", "title": "Route Map" } @@ -18123,6 +20018,21 @@ }, "title": "Networks" }, + "bgp": { + "type": "object", + "properties": { + "redistribute_internal": { + "type": "boolean", + "description": "Allow redistribution of iBGP routes into an Interior Gateway Protocol (IGP). EOS default is true.", + "title": "Redistribute Internal" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "BGP" + }, "peer_groups": { "type": "array", "items": { @@ -18130,7 +20040,7 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "activate": { @@ -18139,14 +20049,24 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" }, + "rcf_in": { + "type": "string", + "description": "Inbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF In" + }, + "rcf_out": { + "type": "string", + "description": "Outbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF Out" + }, "default_originate": { "type": "object", "properties": { @@ -18155,7 +20075,7 @@ "title": "Always" }, "route_map": { - "description": "Route-map name", + "description": "Route-map name.", "type": "string", "title": "Route Map" } @@ -18203,12 +20123,12 @@ }, "prefix_list_in": { "type": "string", - "description": "Inbound prefix-list name", + "description": "Inbound prefix-list name.", "title": "Prefix List In" }, "prefix_list_out": { "type": "string", - "description": "Outbound prefix-list name", + "description": "Outbound prefix-list name.", "title": "Prefix List Out" } }, @@ -18237,22 +20157,32 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" }, + "rcf_in": { + "type": "string", + "description": "Inbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF In" + }, + "rcf_out": { + "type": "string", + "description": "Outbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF Out" + }, "prefix_list_in": { "type": "string", - "description": "Inbound prefix-list name", + "description": "Inbound prefix-list name.", "title": "Prefix List In" }, "prefix_list_out": { "type": "string", - "description": "Prefix-list name", + "description": "Prefix-list name.", "title": "Prefix List Out" }, "default_originate": { @@ -18283,6 +20213,64 @@ ] }, "title": "Neighbors" + }, + "redistribute_routes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "source_protocol": { + "type": "string", + "enum": [ + "attached-host", + "bgp", + "connected", + "dynamic", + "isis", + "ospf", + "ospfv3", + "rip", + "static", + "user" + ], + "title": "Source Protocol" + }, + "route_map": { + "type": "string", + "title": "Route Map" + }, + "include_leaked": { + "type": "boolean", + "description": "Only applicable if `source_protocol` is one of `connected`, `static`, `isis`, `ospf`, `ospfv3`.", + "title": "Include Leaked" + }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).\n`route_map` and `rcf` are mutually exclusive. `route_map` takes precedence.\nOnly applicable if `source_protocol` is one of `connected`, `static`, `isis`, `user`, `dynamic`.", + "title": "RCF" + }, + "ospf_route_type": { + "type": "string", + "enum": [ + "external", + "internal", + "nssa-external", + "nssa-external 1", + "nssa-external 2" + ], + "description": "Routes learned by the OSPF protocol.\nThe `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'.\n", + "title": "OSPF Route Type" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "source_protocol" + ] + }, + "title": "Redistribute Routes" } }, "additionalProperties": false, @@ -18301,7 +20289,7 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "activate": { @@ -18310,12 +20298,12 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" } }, @@ -18344,12 +20332,12 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" } }, @@ -18375,6 +20363,28 @@ "route_map": { "type": "string", "title": "Route Map" + }, + "include_leaked": { + "type": "boolean", + "description": "Only applicable if `source_protocol` is `isis`.", + "title": "Include Leaked" + }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).\n`route_map` and `rcf` are mutually exclusive. `route_map` takes precedence.\nOnly applicable if `source_protocol` is `isis`.", + "title": "RCF" + }, + "ospf_route_type": { + "type": "string", + "enum": [ + "external", + "internal", + "nssa-external", + "nssa-external 1", + "nssa-external 2" + ], + "description": "Routes learned by the OSPF protocol.\nThe `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'.\n", + "title": "OSPF Route Type" } }, "additionalProperties": false, @@ -18412,12 +20422,12 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" } }, @@ -18438,7 +20448,7 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "activate": { @@ -18447,12 +20457,12 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" } }, @@ -18482,12 +20492,12 @@ "type": "object", "properties": { "prefix": { - "description": "IPv4 prefix \"A.B.C.D/E\" or IPv6 prefix \"A:B:C:D:E:F:G:H/I\"", + "description": "IPv4 prefix \"A.B.C.D/E\" or IPv6 prefix \"A:B:C:D:E:F:G:H/I\".", "type": "string", "title": "Prefix" }, "route_map": { - "description": "Route-map name", + "description": "Route-map name.", "type": "string", "title": "Route Map" } @@ -18502,6 +20512,21 @@ }, "title": "Networks" }, + "bgp": { + "type": "object", + "properties": { + "redistribute_internal": { + "type": "boolean", + "description": "Allow redistribution of iBGP routes into an Interior Gateway Protocol (IGP). EOS default is true.", + "title": "Redistribute Internal" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "BGP" + }, "peer_groups": { "type": "array", "items": { @@ -18509,7 +20534,7 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "activate": { @@ -18518,22 +20543,32 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" }, + "rcf_in": { + "type": "string", + "description": "Inbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF In" + }, + "rcf_out": { + "type": "string", + "description": "Outbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF Out" + }, "prefix_list_in": { "type": "string", - "description": "Inbound prefix-list name", + "description": "Inbound prefix-list name.", "title": "Prefix List In" }, "prefix_list_out": { "type": "string", - "description": "Outbound prefix-list name", + "description": "Outbound prefix-list name.", "title": "Prefix List Out" } }, @@ -18562,22 +20597,32 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" }, + "rcf_in": { + "type": "string", + "description": "Inbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF In" + }, + "rcf_out": { + "type": "string", + "description": "Outbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF Out" + }, "prefix_list_in": { "type": "string", - "description": "Inbound prefix-list name", + "description": "Inbound prefix-list name.", "title": "Prefix List In" }, "prefix_list_out": { "type": "string", - "description": "Outbound prefix-list name", + "description": "Outbound prefix-list name.", "title": "Prefix List Out" } }, @@ -18607,6 +20652,23 @@ "include_leaked": { "type": "boolean", "title": "Include Leaked" + }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).\n`route_map` and `rcf` are mutually exclusive. `route_map` takes precedence.\nOnly used if `source_protocol` is one of `connected`, `static`, `isis`, `user`, `dynamic`.", + "title": "RCF" + }, + "ospf_route_type": { + "type": "string", + "enum": [ + "external", + "internal", + "nssa-external", + "nssa-external 1", + "nssa-external 2" + ], + "description": "Routes learned by the OSPF protocol.\nThe `ospf_route_type` is valid for source_protocols 'ospfv3'.\n", + "title": "OSPF Route Type" } }, "additionalProperties": false, @@ -18696,12 +20758,12 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" } }, @@ -18722,7 +20784,7 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "activate": { @@ -18747,7 +20809,7 @@ "properties": { "prefix": { "type": "string", - "description": "IPv6 prefix \"A:B:C:D:E:F:G:H/I\"", + "description": "IPv6 prefix \"A:B:C:D:E:F:G:H/I\".", "title": "Prefix" }, "route_map": { @@ -18764,6 +20826,59 @@ ] }, "title": "Networks" + }, + "redistribute_routes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "source_protocol": { + "type": "string", + "enum": [ + "connected", + "isis", + "ospf", + "ospfv3", + "static" + ], + "title": "Source Protocol" + }, + "include_leaked": { + "type": "boolean", + "description": "Only applicable if `source_protocol` is `isis`.", + "title": "Include Leaked" + }, + "route_map": { + "type": "string", + "title": "Route Map" + }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).\n`route_map` and `rcf` are mutually exclusive. `route_map` takes precedence.\nOnly applicable if `source_protocol` is `isis`.", + "title": "RCF" + }, + "ospf_route_type": { + "type": "string", + "enum": [ + "external", + "internal", + "nssa-external", + "nssa-external 1", + "nssa-external 2" + ], + "description": "Routes learned by the OSPF protocol.\nThe `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'.\n", + "title": "OSPF Route Type" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "source_protocol" + ] + }, + "title": "Redistribute Routes" } }, "additionalProperties": false, @@ -18790,12 +20905,12 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" } }, @@ -18816,7 +20931,7 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "activate": { @@ -18825,12 +20940,12 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" } }, @@ -18899,7 +21014,7 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "activate": { @@ -19108,7 +21223,7 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "activate": { @@ -19205,7 +21320,7 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "activate": { @@ -19260,14 +21375,14 @@ }, "ecmp_limit": { "type": "integer", - "description": "Amount of ECMP paths to send", + "description": "Amount of ECMP paths to send.", "minimum": 2, "maximum": 64, "title": "ECMP Limit" }, "limit": { "type": "integer", - "description": "Amount of paths to send", + "description": "Amount of paths to send.", "minimum": 2, "maximum": 64, "title": "Limit" @@ -19338,14 +21453,14 @@ }, "ecmp_limit": { "type": "integer", - "description": "Amount of ECMP paths to send", + "description": "Amount of ECMP paths to send.", "minimum": 2, "maximum": 64, "title": "ECMP Limit" }, "limit": { "type": "integer", - "description": "Amount of paths to send", + "description": "Amount of paths to send.", "minimum": 2, "maximum": 64, "title": "Limit" @@ -19382,7 +21497,7 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "activate": { @@ -19421,14 +21536,14 @@ }, "ecmp_limit": { "type": "integer", - "description": "Amount of ECMP paths to send", + "description": "Amount of ECMP paths to send.", "minimum": 2, "maximum": 64, "title": "ECMP Limit" }, "limit": { "type": "integer", - "description": "Amount of paths to send", + "description": "Amount of paths to send.", "minimum": 2, "maximum": 64, "title": "Limit" @@ -19479,7 +21594,7 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "activate": { @@ -19488,13 +21603,46 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" + }, + "rcf_in": { + "type": "string", + "description": "Inbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF In" + }, + "rcf_out": { + "type": "string", + "description": "Outbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF Out" + }, + "default_route": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF" + }, + "route_map": { + "type": "string", + "title": "Route Map" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Default Route" } }, "additionalProperties": false, @@ -19539,13 +21687,46 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" + }, + "rcf_in": { + "type": "string", + "description": "Inbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF In" + }, + "rcf_out": { + "type": "string", + "description": "Outbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF Out" + }, + "default_route": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF" + }, + "route_map": { + "type": "string", + "title": "Route Map" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Default Route" } }, "additionalProperties": false, @@ -19593,7 +21774,7 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "activate": { @@ -19602,13 +21783,46 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" + }, + "rcf_in": { + "type": "string", + "description": "Inbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF In" + }, + "rcf_out": { + "type": "string", + "description": "Outbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF Out" + }, + "default_route": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF" + }, + "route_map": { + "type": "string", + "title": "Route Map" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Default Route" } }, "additionalProperties": false, @@ -19653,13 +21867,46 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" + }, + "rcf_in": { + "type": "string", + "description": "Inbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF In" + }, + "rcf_out": { + "type": "string", + "description": "Outbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF Out" + }, + "default_route": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF" + }, + "route_map": { + "type": "string", + "title": "Route Map" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Default Route" } }, "additionalProperties": false, @@ -19700,12 +21947,27 @@ "properties": { "name": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "Name" }, + "bgp": { + "type": "object", + "properties": { + "redistribute_internal": { + "type": "boolean", + "description": "Allow redistribution of iBGP routes into an Interior Gateway Protocol (IGP). EOS default is true.", + "title": "Redistribute Internal" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "BGP" + }, "rd": { "type": "string", - "description": "Route distinguisher", + "description": "Route distinguisher.", "title": "Rd" }, "evpn_multicast": { @@ -19714,14 +21976,14 @@ }, "evpn_multicast_address_family": { "type": "object", - "description": "Enable per-AF EVPN multicast settings", + "description": "Enable per-AF EVPN multicast settings.", "properties": { "ipv4": { "type": "object", "properties": { "transit": { "type": "boolean", - "description": "Enable EVPN multicast transit mode", + "description": "Enable EVPN multicast transit mode.", "title": "Transit" } }, @@ -19738,6 +22000,45 @@ }, "title": "EVPN Multicast Address Family" }, + "default_route_exports": { + "type": "array", + "description": "Enable default-originate per VRF/address-family.", + "items": { + "type": "object", + "properties": { + "address_family": { + "type": "string", + "enum": [ + "evpn", + "vpn-ipv4", + "vpn-ipv6" + ], + "title": "Address Family" + }, + "always": { + "type": "boolean", + "title": "Always" + }, + "route_map": { + "type": "string", + "title": "Route Map" + }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "address_family" + ] + }, + "title": "Default Route Exports" + }, "route_targets": { "type": "object", "properties": { @@ -19759,7 +22060,18 @@ }, "route_map": { "type": "string", + "description": "Only applicable if `address_family` is one of `evpn`, `vpn-ipv4` or `vpn-ipv6`.", "title": "Route Map" + }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).\nOnly applicable if `address_family` is one of `evpn`, `vpn-ipv4` or `vpn-ipv6`.", + "title": "RCF" + }, + "vpn_route_filter_rcf": { + "type": "string", + "description": "RCF function name with parenthesis for filtering VPN routes. Also requires `rcf` to be set.\nExample: MyFunction(myarg).\nOnly applicable if `address_family` is one of `vpn-ipv4` or `vpn-ipv6`.", + "title": "VPN Route Filter RCF" } }, "additionalProperties": false, @@ -19790,7 +22102,18 @@ }, "route_map": { "type": "string", + "description": "Only applicable if `address_family` is one of `evpn`, `vpn-ipv4` or `vpn-ipv6`.", "title": "Route Map" + }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).\nOnly applicable if `address_family` is one of `evpn`, `vpn-ipv4` or `vpn-ipv6`.", + "title": "RCF" + }, + "vpn_route_filter_rcf": { + "type": "string", + "description": "RCF function name with parenthesis for filtering VPN routes. Also requires `rcf` to be set.\nExample: MyFunction(myarg).\nOnly applicable if `address_family` is one of `vpn-ipv4` or `vpn-ipv6`.", + "title": "VPN Route Filter RCF" } }, "additionalProperties": false, @@ -19811,13 +22134,13 @@ "title": "Route Targets" }, "router_id": { - "description": "in IP address format A.B.C.D", + "description": "in IP address format A.B.C.D.", "type": "string", "title": "Router ID" }, "timers": { "type": "string", - "description": "BGP Keepalive and Hold Timer values in seconds as string \"<0-3600> <0-3600>\"", + "description": "BGP Keepalive and Hold Timer values in seconds as string \"<0-3600> <0-3600>\".", "title": "Timers" }, "networks": { @@ -19827,7 +22150,7 @@ "properties": { "prefix": { "type": "string", - "description": "IPv4 prefix \"A.B.C.D/E\" or IPv6 prefix \"A:B:C:D:E:F:G:H/I\"", + "description": "IPv4 prefix \"A.B.C.D/E\" or IPv6 prefix \"A:B:C:D:E:F:G:H/I\".", "title": "Prefix" }, "route_map": { @@ -19867,28 +22190,28 @@ }, "listen_ranges": { "type": "array", - "description": "Improved \"listen_ranges\" data model to support multiple listen ranges and additional filter capabilities\n", + "description": "Improved \"listen_ranges\" data model to support multiple listen ranges and additional filter capabilities.\n", "items": { "type": "object", "properties": { "prefix": { "type": "string", - "description": "IPv4 prefix \"A.B.C.D/E\" or IPv6 prefix \"A:B:C:D:E:F:G:H/I\"", + "description": "IPv4 prefix \"A.B.C.D/E\" or IPv6 prefix \"A:B:C:D:E:F:G:H/I\".", "title": "Prefix" }, "peer_id_include_router_id": { "type": "boolean", - "description": "Include router ID as part of peer filter", + "description": "Include router ID as part of peer filter.", "title": "Peer ID Include Router ID" }, "peer_group": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Peer Group" }, "peer_filter": { "type": "string", - "description": "Peer-filter name\nnote: `peer_filter`` or `remote_as` is required but mutually exclusive.\nIf both are defined, peer_filter takes precedence\n", + "description": "Peer-filter name.\nnote: `peer_filter`` or `remote_as` is required but mutually exclusive.\nIf both are defined, peer_filter takes precedence.\n", "title": "Peer Filter" }, "remote_as": { @@ -19915,7 +22238,7 @@ }, "peer_group": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Peer Group" }, "remote_as": { @@ -19933,7 +22256,7 @@ }, "remove_private_as": { "type": "object", - "description": "Remove private AS numbers in outbound AS path", + "description": "Remove private AS numbers in outbound AS path.", "properties": { "enabled": { "type": "boolean", @@ -19985,16 +22308,16 @@ }, "as_path": { "type": "object", - "description": "BGP AS-PATH options", + "description": "BGP AS-PATH options.", "properties": { "remote_as_replace_out": { "type": "boolean", - "description": "Replace AS number with local AS number", + "description": "Replace AS number with local AS number.", "title": "Remote As Replace Out" }, "prepend_own_disabled": { "type": "boolean", - "description": "Disable prepending own AS number to AS path", + "description": "Disable prepending own AS number to AS path.", "title": "Prepend Own Disabled" } }, @@ -20016,7 +22339,7 @@ "type": "integer", "minimum": 1, "maximum": 255, - "description": "Time-to-live in range of hops", + "description": "Time-to-live in range of hops.", "title": "Ebgp Multihop" }, "next_hop_self": { @@ -20070,7 +22393,7 @@ }, "timers": { "type": "string", - "description": "BGP Keepalive and Hold Timer values in seconds as string \"<0-3600> <0-3600>\"", + "description": "BGP Keepalive and Hold Timer values in seconds as string \"<0-3600> <0-3600>\".", "title": "Timers" }, "rib_in_pre_policy_retain": { @@ -20093,7 +22416,7 @@ }, "send_community": { "type": "string", - "description": "'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'", + "description": "'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'.", "title": "Send Community" }, "maximum_routes": { @@ -20102,7 +22425,7 @@ }, "maximum_routes_warning_limit": { "type": "string", - "description": "Maximum number of routes after which a warning is issued (0 means never warn) or\nPercentage of maximum number of routes at which to warn (\"<1-100> percent\")\n", + "description": "Maximum number of routes after which a warning is issued (0 means never warn) or\nPercentage of maximum number of routes at which to warn (\"<1-100> percent\").\n", "title": "Maximum Routes Warning Limit" }, "maximum_routes_warning_only": { @@ -20120,7 +22443,7 @@ "type": "integer", "minimum": 1, "maximum": 10, - "description": "Number of local ASNs allowed in a BGP update", + "description": "Number of local ASNs allowed in a BGP update.", "title": "Times" } }, @@ -20158,23 +22481,23 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" }, "prefix_list_in": { "type": "string", - "description": "Inbound prefix-list name\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use router_bgp.vrfs[].address_family_ipv4.neighbors[].prefix_list_in or router_bgp.vrfs[].address_family_ipv6.neighbors[].prefix_list_in instead.", + "description": "Inbound prefix-list name.\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use router_bgp.vrfs[].address_family_ipv4.neighbors[].prefix_list_in or router_bgp.vrfs[].address_family_ipv6.neighbors[].prefix_list_in instead.", "deprecated": true, "title": "Prefix List In" }, "prefix_list_out": { "type": "string", - "description": "Outbound prefix-list name\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use router_bgp.vrfs[].address_family_ipv4.neighbors[].prefix_list_out or router_bgp.vrfs[].address_family_ipv6.neighbors[].prefix_list_out instead.", + "description": "Outbound prefix-list name.\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use router_bgp.vrfs[].address_family_ipv4.neighbors[].prefix_list_out or router_bgp.vrfs[].address_family_ipv6.neighbors[].prefix_list_out instead.", "deprecated": true, "title": "Prefix List Out" } @@ -20196,7 +22519,7 @@ "properties": { "name": { "type": "string", - "description": "Interface name", + "description": "Interface name.", "title": "Name" }, "remote_as": { @@ -20206,12 +22529,12 @@ }, "peer_group": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Peer Group" }, "peer_filter": { "type": "string", - "description": "Peer-filter name", + "description": "Peer-filter name.", "title": "Peer Filter" }, "description": { @@ -20245,6 +22568,23 @@ "include_leaked": { "type": "boolean", "title": "Include Leaked" + }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).\n`route_map` and `rcf` are mutually exclusive. `route_map` takes precedence.\nOnly applicable if `source_protocol` is one of `connected`, `dynamic`, `isis`, `static` and `user`.", + "title": "RCF" + }, + "ospf_route_type": { + "type": "string", + "enum": [ + "external", + "internal", + "nssa-external", + "nssa-external 1", + "nssa-external 2" + ], + "description": "Routes learned by the OSPF protocol.\nThe `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'.\n", + "title": "OSPF Route Type" } }, "additionalProperties": false, @@ -20264,7 +22604,7 @@ "properties": { "prefix": { "type": "string", - "description": "IPv4 prefix \"A.B.C.D/E\" or IPv6 prefix \"A:B:C:D:E:F:G:H/I\"", + "description": "IPv4 prefix \"A.B.C.D/E\" or IPv6 prefix \"A:B:C:D:E:F:G:H/I\".", "title": "Prefix" }, "advertise_only": { @@ -20275,16 +22615,6 @@ "type": "boolean", "title": "As Set" }, - "advertise_map": { - "type": "string", - "description": "Route-map name", - "title": "Advertise Map" - }, - "supress_map": { - "type": "string", - "description": "Route-map name", - "title": "Supress Map" - }, "summary_only": { "type": "boolean", "title": "Summary Only" @@ -20374,14 +22704,14 @@ }, "ecmp_limit": { "type": "integer", - "description": "Amount of ECMP paths to send", + "description": "Amount of ECMP paths to send.", "minimum": 2, "maximum": 64, "title": "ECMP Limit" }, "limit": { "type": "integer", - "description": "Amount of paths to send", + "description": "Amount of paths to send.", "minimum": 2, "maximum": 64, "title": "Limit" @@ -20399,6 +22729,11 @@ "^_.+$": {} }, "title": "Additional Paths" + }, + "redistribute_internal": { + "type": "boolean", + "description": "Allow redistribution of iBGP routes into an Interior Gateway Protocol (IGP). EOS default is true.", + "title": "Redistribute Internal" } }, "additionalProperties": false, @@ -20422,22 +22757,32 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" }, + "rcf_in": { + "type": "string", + "description": "Inbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF In" + }, + "rcf_out": { + "type": "string", + "description": "Outbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF Out" + }, "prefix_list_in": { "type": "string", - "description": "Inbound prefix-list name", + "description": "Inbound prefix-list name.", "title": "Prefix List In" }, "prefix_list_out": { "type": "string", - "description": "Outbound prefix-list name", + "description": "Outbound prefix-list name.", "title": "Prefix List Out" }, "next_hop": { @@ -20489,7 +22834,7 @@ "properties": { "prefix": { "type": "string", - "description": "IPv4 prefix \"A.B.C.D/E\"", + "description": "IPv4 prefix \"A.B.C.D/E\".", "title": "Prefix" }, "route_map": { @@ -20506,6 +22851,63 @@ ] }, "title": "Networks" + }, + "redistribute_routes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "source_protocol": { + "type": "string", + "enum": [ + "attached-host", + "bgp", + "connected", + "dynamic", + "isis", + "ospf", + "ospfv3", + "rip", + "static", + "user" + ], + "title": "Source Protocol" + }, + "route_map": { + "type": "string", + "title": "Route Map" + }, + "include_leaked": { + "type": "boolean", + "title": "Include Leaked" + }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).\n`route_map` and `rcf` are mutually exclusive. `route_map` takes precedence.\nOnly applicable if `source_protocol` is one of `connected`, `dynamic`, `isis`, `static` and `user`.", + "title": "RCF" + }, + "ospf_route_type": { + "type": "string", + "enum": [ + "external", + "internal", + "nssa-external", + "nssa-external 1", + "nssa-external 2" + ], + "description": "Routes learned by the OSPF protocol.\nThe `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'.\n", + "title": "OSPF Route Type" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "source_protocol" + ] + }, + "title": "Redistribute Routes" } }, "additionalProperties": false, @@ -20580,14 +22982,14 @@ }, "ecmp_limit": { "type": "integer", - "description": "Amount of ECMP paths to send", + "description": "Amount of ECMP paths to send.", "minimum": 2, "maximum": 64, "title": "ECMP Limit" }, "limit": { "type": "integer", - "description": "Amount of paths to send", + "description": "Amount of paths to send.", "minimum": 2, "maximum": 64, "title": "Limit" @@ -20605,6 +23007,11 @@ "^_.+$": {} }, "title": "Additional Paths" + }, + "redistribute_internal": { + "type": "boolean", + "description": "Allow redistribution of iBGP routes into an Interior Gateway Protocol (IGP). EOS default is true.", + "title": "Redistribute Internal" } }, "additionalProperties": false, @@ -20628,22 +23035,32 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" }, + "rcf_in": { + "type": "string", + "description": "Inbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF In" + }, + "rcf_out": { + "type": "string", + "description": "Outbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF Out" + }, "prefix_list_in": { "type": "string", - "description": "Inbound prefix-list name", + "description": "Inbound prefix-list name.", "title": "Prefix List In" }, "prefix_list_out": { "type": "string", - "description": "Outbound prefix-list name", + "description": "Outbound prefix-list name.", "title": "Prefix List Out" } }, @@ -20664,7 +23081,7 @@ "properties": { "prefix": { "type": "string", - "description": "IPv6 prefix \"A:B:C:D:E:F:G:H/I\"", + "description": "IPv6 prefix \"A:B:C:D:E:F:G:H/I\".", "title": "Prefix" }, "route_map": { @@ -20681,6 +23098,62 @@ ] }, "title": "Networks" + }, + "redistribute_routes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "source_protocol": { + "type": "string", + "enum": [ + "attached-host", + "bgp", + "connected", + "dhcp", + "dynamic", + "isis", + "ospfv3", + "static", + "user" + ], + "title": "Source Protocol" + }, + "route_map": { + "type": "string", + "title": "Route Map" + }, + "include_leaked": { + "type": "boolean", + "title": "Include Leaked" + }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).\n`route_map` and `rcf` are mutually exclusive. `route_map` takes precedence.\nOnly applicable if `source_protocol` is one of `connected`, `dynamic`, `isis`, `static` and `user`.", + "title": "RCF" + }, + "ospf_route_type": { + "type": "string", + "enum": [ + "external", + "internal", + "nssa-external", + "nssa-external 1", + "nssa-external 2" + ], + "description": "Routes learned by the OSPF protocol.\nThe `ospf_route_type` is valid for source_protocols 'ospfv3'.\n", + "title": "OSPF Route Type" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "source_protocol" + ] + }, + "title": "Redistribute Routes" } }, "additionalProperties": false, @@ -20759,12 +23232,12 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" } }, @@ -20785,7 +23258,7 @@ "properties": { "prefix": { "type": "string", - "description": "IPv6 prefix \"A.B.C.D/E\"", + "description": "IPv6 prefix \"A.B.C.D/E\".", "title": "Prefix" }, "route_map": { @@ -20802,6 +23275,60 @@ ] }, "title": "Networks" + }, + "redistribute_routes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "source_protocol": { + "type": "string", + "enum": [ + "attached-host", + "connected", + "isis", + "ospf", + "ospfv3", + "static" + ], + "title": "Source Protocol" + }, + "route_map": { + "type": "string", + "title": "Route Map" + }, + "include_leaked": { + "type": "boolean", + "description": "Only applicable if `source_protocol` is `isis`.", + "title": "Include Leaked" + }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).\n`route_map` and `rcf` are mutually exclusive. `route_map` takes precedence.\nOnly applicable if `source_protocol` is `isis`.", + "title": "RCF" + }, + "ospf_route_type": { + "type": "string", + "enum": [ + "external", + "internal", + "nssa-external", + "nssa-external 1", + "nssa-external 2" + ], + "description": "Routes learned by the OSPF protocol.\nThe `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'.\n", + "title": "OSPF Route Type" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "source_protocol" + ] + }, + "title": "Redistribute Routes" } }, "additionalProperties": false, @@ -20880,12 +23407,12 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" } }, @@ -20906,12 +23433,65 @@ "properties": { "prefix": { "type": "string", - "description": "IPv6 prefix \"A:B:C:D:E:F:G:H/I\"", - "title": "Prefix" + "description": "IPv6 prefix \"A:B:C:D:E:F:G:H/I\".", + "title": "Prefix" + }, + "route_map": { + "type": "string", + "title": "Route Map" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "prefix" + ] + }, + "title": "Networks" + }, + "redistribute_routes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "source_protocol": { + "type": "string", + "enum": [ + "connected", + "isis", + "ospf", + "ospfv3", + "static" + ], + "title": "Source Protocol" }, "route_map": { "type": "string", "title": "Route Map" + }, + "include_leaked": { + "type": "boolean", + "description": "Only applicable if `source_protocol` is `isis`.", + "title": "Include Leaked" + }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).\n`route_map` and `rcf` are mutually exclusive. `route_map` takes precedence.\nOnly applicable if `source_protocol` is `isis`.", + "title": "RCF" + }, + "ospf_route_type": { + "type": "string", + "enum": [ + "external", + "internal", + "nssa-external", + "nssa-external 1", + "nssa-external 2" + ], + "description": "Routes learned by the OSPF protocol.\nThe `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'.\n", + "title": "OSPF Route Type" } }, "additionalProperties": false, @@ -20919,10 +23499,10 @@ "^_.+$": {} }, "required": [ - "prefix" + "source_protocol" ] }, - "title": "Networks" + "title": "Redistribute Routes" } }, "additionalProperties": false, @@ -21144,12 +23724,12 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" } }, @@ -21170,7 +23750,7 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "activate": { @@ -21209,7 +23789,7 @@ "properties": { "prefix": { "type": "string", - "description": "IPv4 prefix \"A.B.C.D/E\" or IPv6 prefix \"A:B:C:D:E:F:G:H/I\"", + "description": "IPv4 prefix \"A.B.C.D/E\" or IPv6 prefix \"A:B:C:D:E:F:G:H/I\".", "title": "Prefix" }, "route_map": { @@ -21240,7 +23820,7 @@ }, "eos_cli": { "type": "string", - "description": "Multiline EOS CLI rendered directly on the Router BGP, VRF definition in the final EOS configuration\n", + "description": "Multiline EOS CLI rendered directly on the Router BGP, VRF definition in the final EOS configuration.\n", "title": "EOS CLI" } }, @@ -21261,12 +23841,12 @@ "properties": { "name": { "type": "string", - "description": "Name of session tracker", + "description": "Name of session tracker.", "title": "Name" }, "recovery_delay": { "type": "integer", - "description": "Recovery delay in seconds", + "description": "Recovery delay in seconds.", "minimum": 1, "maximum": 3600, "title": "Recovery Delay" @@ -21303,12 +23883,12 @@ "properties": { "ipv4": { "type": "string", - "description": "IPv4 Address", + "description": "IPv4 Address.", "title": "IPv4" }, "ipv6": { "type": "string", - "description": "IPv6 Address", + "description": "IPv6 Address.", "title": "IPv6" } }, @@ -21330,7 +23910,7 @@ "properties": { "name": { "type": "string", - "description": "Destination-VRF", + "description": "Destination-VRF.", "title": "Name" }, "leak_routes": { @@ -21344,7 +23924,7 @@ }, "subscribe_policy": { "type": "string", - "description": "Route-Map Policy", + "description": "Route-Map Policy.", "title": "Subscribe Policy" } }, @@ -21365,7 +23945,7 @@ "properties": { "name": { "type": "string", - "description": "Dynamic Prefix List Name", + "description": "Dynamic Prefix List Name.", "title": "Name" } }, @@ -21393,6 +23973,44 @@ ] }, "title": "VRFs" + }, + "control_functions": { + "type": "object", + "description": "Routing control functions (RCF) used to filter and update routes from a peer or during redistributions.\nWarning:\nThis configuration cannot be pushed with `eos_config_deploy_eapi`, because of limitations in `arista.eos` and `ansible.netcommon` plugins.\nThe configuration can be pushed via CloudVision with `eos_config_deploy_cvp` or `cv_deploy`.", + "properties": { + "code_units": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the code unit.", + "title": "Name" + }, + "content": { + "type": "string", + "description": "Content of route control function.\ne.g.\nfunction ACCEPT_ALL() {\n return true;\n }\nEOF", + "title": "Content" + } + }, + "required": [ + "content", + "name" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Code Units" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Control Functions" } }, "additionalProperties": false, @@ -21406,7 +24024,7 @@ "properties": { "host_proxy_match_mroute": { "type": "string", - "description": "Specify conditions for sending IGMP joins for host-proxy\n'iif' will enable igmp host-proxy to work in iif aware\n'all' will enable igmp host-proxy to work in iif unaware mode (EOS default)\n", + "description": "Specify conditions for sending IGMP joins for host-proxy.\n'iif' will enable igmp host-proxy to work in iif aware.\n'all' will enable igmp host-proxy to work in iif unaware mode (EOS default).\n", "enum": [ "all", "iif" @@ -21425,12 +24043,12 @@ "properties": { "name": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "Name" }, "host_proxy_match_mroute": { "type": "string", - "description": "Specify conditions for sending IGMP joins for host-proxy\n'iif' will enable igmp host-proxy to work in iif aware\n'all' will enable igmp host-proxy to work in iif unaware mode (EOS default)\n", + "description": "Specify conditions for sending IGMP joins for host-proxy.\n'iif' will enable igmp host-proxy to work in iif aware.\n'all' will enable igmp host-proxy to work in iif unaware mode (EOS default).\n", "enum": [ "all", "iif" @@ -21553,17 +24171,17 @@ "properties": { "instance": { "type": "string", - "description": "ISIS Instance Name", + "description": "ISIS Instance Name.", "title": "Instance" }, "net": { "type": "string", - "description": "CLNS Address like \"49.0001.0001.0000.0001.00\"", + "description": "CLNS Address like \"49.0001.0001.0000.0001.00\".", "title": "Net" }, "router_id": { "type": "string", - "description": "IPv4 Address", + "description": "IPv4 Address.", "title": "Router ID" }, "is_type": { @@ -22142,7 +24760,7 @@ "ipv4 unicast", "ipv6 unicast" ], - "description": "Address Family\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use address_family_ipv4.enabled or address_family_ipv6.enabled instead.", + "description": "Address Family.\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use address_family_ipv4.enabled or address_family_ipv6.enabled instead.", "deprecated": true }, "title": "Address Family" @@ -22151,7 +24769,7 @@ "type": "array", "items": { "type": "string", - "description": "EOS CLI rendered under the address families\nExample \"maximum-paths 64\"\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use address_family_ipv4/address_family_ipv6 instead.", + "description": "EOS CLI rendered under the address families.\nExample \"maximum-paths 64\"\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use address_family_ipv4/address_family_ipv6 instead.", "deprecated": true }, "title": "ISIS AF Defaults" @@ -22175,7 +24793,7 @@ }, "route_map": { "type": "string", - "description": "Route-map name", + "description": "Route-map name.", "title": "Route Map" }, "include_leaked": { @@ -22189,7 +24807,7 @@ "internal", "nssa-external" ], - "description": "ospf_route_type is required with source_protocols 'ospf' and 'ospfv3'", + "description": "ospf_route_type is required with source_protocols 'ospf' and 'ospfv3'.", "title": "OSPF Route Type" } }, @@ -22242,7 +24860,7 @@ }, "srlg": { "type": "object", - "description": "Shared Risk Link Group", + "description": "Shared Risk Link Group.", "properties": { "enable": { "type": "boolean", @@ -22275,7 +24893,7 @@ }, "rcf": { "type": "string", - "description": "Route Control Function", + "description": "Route Control Function.", "title": "RCF" } }, @@ -22332,7 +24950,7 @@ }, "srlg": { "type": "object", - "description": "Shared Risk Link Group", + "description": "Shared Risk Link Group.", "properties": { "enable": { "type": "boolean", @@ -22407,17 +25025,31 @@ "properties": { "interval": { "type": "integer", - "minimum": 1, - "maximum": 300, - "description": "Maximum interval between two SPFs in seconds.", + "description": "Maximum interval between two SPFs in seconds or milliseconds.\nRange in seconds: <1-300>\nRange in milliseconds: <1-300000>", "title": "Interval" }, + "interval_unit": { + "type": "string", + "enum": [ + "seconds", + "milliseconds" + ], + "description": "If interval unit is not defined EOS takes `seconds` by default.", + "title": "Interval Unit" + }, "wait_interval": { "type": "integer", "minimum": 1, "maximum": 300000, "description": "Initial wait interval for SPF in milliseconds.", "title": "Wait Interval" + }, + "hold_interval": { + "type": "integer", + "minimum": 1, + "maximum": 300000, + "description": "Hold interval between the first and second SPF runs in milliseconds.", + "title": "Hold Interval" } }, "additionalProperties": false, @@ -22521,7 +25153,7 @@ "properties": { "prefix_list": { "type": "string", - "description": "Prefix-list name. ND Proxying is disabled for IPv6 addresses defined in the prefix-list.", + "description": "Prefix-list name. Neighbor Discovery Proxying is disabled for IPv6 addresses defined in the prefix-list.", "title": "Prefix List" } }, @@ -22551,12 +25183,12 @@ "properties": { "originator_id_local_interface": { "type": "string", - "description": "Interface to use for originator ID", + "description": "Interface to use for originator ID.", "title": "Originator ID Local Interface" }, "rejected_limit": { "type": "integer", - "description": "Maximum number of rejected SA messages allowed in cache", + "description": "Maximum number of rejected SA messages allowed in cache.", "minimum": 0, "maximum": 40000, "title": "Rejected Limit" @@ -22578,12 +25210,12 @@ "properties": { "source_prefix": { "type": "string", - "description": "Source address prefix", + "description": "Source address prefix.", "title": "Source Prefix" }, "limit": { "type": "integer", - "description": "Limit for SAs matching the source address prefix", + "description": "Limit for SAs matching the source address prefix.", "minimum": 0, "maximum": 40000, "title": "Limit" @@ -22607,7 +25239,7 @@ "properties": { "ipv4_address": { "type": "string", - "description": "Peer IP Address", + "description": "Peer IP Address.", "title": "IPv4 Address" }, "default_peer": { @@ -22619,7 +25251,7 @@ }, "prefix_list": { "type": "string", - "description": "Prefix list to filter source of SA messages", + "description": "Prefix list to filter source of SA messages.", "title": "Prefix List" } }, @@ -22639,12 +25271,12 @@ }, "disabled": { "type": "boolean", - "description": "Disable the MSDP peer", + "description": "Disable the MSDP peer.", "title": "Disabled" }, "sa_limit": { "type": "integer", - "description": "Maximum number of SA messages allowed in cache", + "description": "Maximum number of SA messages allowed in cache.", "minimum": 0, "maximum": 40000, "title": "Sa Limit" @@ -22656,7 +25288,7 @@ "properties": { "name": { "type": "string", - "description": "Mesh group name", + "description": "Mesh group name.", "title": "Name" } }, @@ -22681,7 +25313,7 @@ }, "hold_timer": { "type": "integer", - "description": "Must be greater than keepalive timer", + "description": "Must be greater than keepalive timer.", "minimum": 1, "maximum": 65535, "title": "Hold Timer" @@ -22702,12 +25334,12 @@ "properties": { "in_list": { "type": "string", - "description": "ACL to filter inbound SA messages", + "description": "ACL to filter inbound SA messages.", "title": "In List" }, "out_list": { "type": "string", - "description": "ACL to filter outbound SA messages", + "description": "ACL to filter outbound SA messages.", "title": "Out List" } }, @@ -22735,17 +25367,17 @@ "properties": { "name": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "Name" }, "originator_id_local_interface": { "type": "string", - "description": "Interface to use for originator ID", + "description": "Interface to use for originator ID.", "title": "Originator ID Local Interface" }, "rejected_limit": { "type": "integer", - "description": "Maximum number of rejected SA messages allowed in cache", + "description": "Maximum number of rejected SA messages allowed in cache.", "minimum": 0, "maximum": 40000, "title": "Rejected Limit" @@ -22767,12 +25399,12 @@ "properties": { "source_prefix": { "type": "string", - "description": "Source address prefix", + "description": "Source address prefix.", "title": "Source Prefix" }, "limit": { "type": "integer", - "description": "Limit for SAs matching the source address prefix", + "description": "Limit for SAs matching the source address prefix.", "minimum": 0, "maximum": 40000, "title": "Limit" @@ -22796,7 +25428,7 @@ "properties": { "ipv4_address": { "type": "string", - "description": "Peer IP Address", + "description": "Peer IP Address.", "title": "IPv4 Address" }, "default_peer": { @@ -22808,7 +25440,7 @@ }, "prefix_list": { "type": "string", - "description": "Prefix list to filter source of SA messages", + "description": "Prefix list to filter source of SA messages.", "title": "Prefix List" } }, @@ -22828,12 +25460,12 @@ }, "disabled": { "type": "boolean", - "description": "Disable the MSDP peer", + "description": "Disable the MSDP peer.", "title": "Disabled" }, "sa_limit": { "type": "integer", - "description": "Maximum number of SA messages allowed in cache", + "description": "Maximum number of SA messages allowed in cache.", "minimum": 0, "maximum": 40000, "title": "Sa Limit" @@ -22845,7 +25477,7 @@ "properties": { "name": { "type": "string", - "description": "Mesh group name", + "description": "Mesh group name.", "title": "Name" } }, @@ -22870,7 +25502,7 @@ }, "hold_timer": { "type": "integer", - "description": "Must be greater than keepalive timer", + "description": "Must be greater than keepalive timer.", "minimum": 1, "maximum": 65535, "title": "Hold Timer" @@ -22891,12 +25523,12 @@ "properties": { "in_list": { "type": "string", - "description": "ACL to filter inbound SA messages", + "description": "ACL to filter inbound SA messages.", "title": "In List" }, "out_list": { "type": "string", - "description": "ACL to filter outbound SA messages", + "description": "ACL to filter outbound SA messages.", "title": "Out List" } }, @@ -22941,11 +25573,18 @@ "ipv4": { "type": "object", "properties": { + "activity_polling_interval": { + "type": "integer", + "minimum": 1, + "maximum": 60, + "description": "MFIB entry activity polling interval.", + "title": "Activity Polling Interval" + }, "counters": { "type": "object", "properties": { "rate_period_decay": { - "description": "Rate in seconds", + "description": "Rate in seconds.", "type": "integer", "minimum": 0, "maximum": 600, @@ -22989,7 +25628,7 @@ "type": "object", "properties": { "source_prefix": { - "description": "Source address A.B.C.D or Source prefix A.B.C.D/E", + "description": "Source address A.B.C.D or Source prefix A.B.C.D/E.", "type": "string", "title": "Source Prefix" }, @@ -22999,12 +25638,12 @@ "type": "object", "properties": { "nexthop": { - "description": "Next-hop IP address or interface name", + "description": "Next-hop IP address or interface name.", "type": "string", "title": "Nexthop" }, "distance": { - "description": "Administrative distance for this route", + "description": "Administrative distance for this route.", "type": "integer", "minimum": 1, "maximum": 255, @@ -23047,6 +25686,23 @@ }, "title": "IPv4" }, + "ipv6": { + "type": "object", + "properties": { + "activity_polling_interval": { + "type": "integer", + "minimum": 1, + "maximum": 60, + "description": "MFIB entry activity polling interval.", + "title": "Activity Polling Interval" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IPv6" + }, "vrfs": { "type": "array", "items": { @@ -23099,12 +25755,12 @@ "properties": { "id": { "type": "integer", - "description": "OSPF Process ID", + "description": "OSPF Process ID.", "title": "ID" }, "vrf": { "type": "string", - "description": "VRF Name for OSPF Process", + "description": "VRF Name for OSPF Process.", "title": "VRF" }, "passive_interface_default": { @@ -23113,7 +25769,7 @@ }, "router_id": { "type": "string", - "description": "IPv4 Address", + "description": "IPv4 Address.", "title": "Router ID" }, "distance": { @@ -23184,7 +25840,7 @@ "type": "array", "items": { "type": "string", - "description": "Interface Name" + "description": "Interface Name." }, "title": "No Passive Interfaces" }, @@ -23214,7 +25870,7 @@ "properties": { "rx_min_interval": { "type": "integer", - "description": "Min interval in msecs between accepting the same LSA", + "description": "Min interval in msecs between accepting the same LSA.", "minimum": 0, "maximum": 600000, "title": "RX Min Interval" @@ -23224,21 +25880,21 @@ "properties": { "initial": { "type": "integer", - "description": "Delay to generate first occurrence of LSA in msecs", + "description": "Delay to generate first occurrence of LSA in msecs.", "minimum": 0, "maximum": 600000, "title": "Initial" }, "min": { "type": "integer", - "description": "Min delay between originating the same LSA in msecs", + "description": "Min delay between originating the same LSA in msecs.", "minimum": 1, "maximum": 600000, "title": "Min" }, "max": { "type": "integer", - "description": "1-600000 Maximum delay between originating the same LSA in msec", + "description": "1-600000 Maximum delay between originating the same LSA in msec.", "minimum": 1, "maximum": 600000, "title": "Max" @@ -23262,21 +25918,21 @@ "properties": { "initial": { "type": "integer", - "description": "Initial SPF schedule delay in msecs", + "description": "Initial SPF schedule delay in msecs.", "minimum": 0, "maximum": 600000, "title": "Initial" }, "min": { "type": "integer", - "description": "Min Hold time between two SPFs in msecs", + "description": "Min Hold time between two SPFs in msecs.", "minimum": 0, "maximum": 65535000, "title": "Min" }, "max": { "type": "integer", - "description": "Max wait time between two SPFs in msecs", + "description": "Max wait time between two SPFs in msecs.", "minimum": 0, "maximum": 65535000, "title": "Max" @@ -23304,7 +25960,7 @@ }, "metric": { "type": "integer", - "description": "Metric for default route", + "description": "Metric for default route.", "minimum": 1, "maximum": 65535, "title": "Metric" @@ -23315,7 +25971,7 @@ 1, 2 ], - "description": "OSPF metric type for default route", + "description": "OSPF metric type for default route.", "title": "Metric Type" } }, @@ -23332,7 +25988,7 @@ "properties": { "prefix": { "type": "string", - "description": "Summary Prefix Address", + "description": "Summary Prefix Address.", "title": "Prefix" }, "tag": { @@ -23366,7 +26022,7 @@ "properties": { "route_map": { "type": "string", - "description": "Route Map Name", + "description": "Route Map Name.", "title": "Route Map" }, "include_leaked": { @@ -23385,7 +26041,7 @@ "properties": { "route_map": { "type": "string", - "description": "Route Map Name", + "description": "Route Map Name.", "title": "Route Map" }, "include_leaked": { @@ -23404,7 +26060,7 @@ "properties": { "route_map": { "type": "string", - "description": "Route Map Name", + "description": "Route Map Name.", "title": "Route Map" }, "include_leaked": { @@ -23427,7 +26083,7 @@ }, "auto_cost_reference_bandwidth": { "type": "integer", - "description": "Bandwidth in mbps", + "description": "Bandwidth in mbps.", "title": "Auto Cost Reference Bandwidth" }, "areas": { @@ -23446,13 +26102,13 @@ "type": "array", "items": { "type": "string", - "description": "IPv4 Prefix" + "description": "IPv4 Prefix." }, "title": "Networks" }, "prefix_list": { "type": "string", - "description": "Prefix-List Name", + "description": "Prefix-List Name.", "title": "Prefix List" } }, @@ -23485,7 +26141,7 @@ "properties": { "metric": { "type": "integer", - "description": "Metric for default route", + "description": "Metric for default route.", "minimum": 1, "maximum": 65535, "title": "Metric" @@ -23496,7 +26152,7 @@ 1, 2 ], - "description": "OSPF metric type for default route", + "description": "OSPF metric type for default route.", "title": "Metric Type" } }, @@ -23551,7 +26207,7 @@ }, "on_startup": { "type": "string", - "description": "\"wait-for-bgp\" or Integer 5-86400\nExample: \"wait-for-bgp\" Or \"222\"\n", + "description": "\"wait-for-bgp\" or Integer 5-86400.\nExample: \"wait-for-bgp\" Or \"222\"\n", "title": "On Startup" }, "summary_lsa": { @@ -23590,7 +26246,7 @@ }, "eos_cli": { "type": "string", - "description": "Multiline EOS CLI rendered directly on the Router OSPF process ID in the final EOS configuration", + "description": "Multiline EOS CLI rendered directly on the Router OSPF process ID in the final EOS configuration.", "title": "EOS CLI" } }, @@ -23649,7 +26305,7 @@ "enum": [ "lan" ], - "description": "Flow assignement `lan` can not be configured in a path group with dynamic peers.", + "description": "Flow assignment `lan` can not be configured in a path group with dynamic peers.", "title": "Flow Assignment" }, "local_interfaces": { @@ -23752,7 +26408,7 @@ }, "dynamic_peers": { "type": "object", - "description": "Flow assignement `lan` can not be configured in a path group with dynamic peers.", + "description": "Flow assignment `lan` can not be configured in a path group with dynamic peers.", "properties": { "enabled": { "type": "boolean", @@ -23894,7 +26550,7 @@ "properties": { "name": { "type": "string", - "description": "Path-group name", + "description": "Path-group name.", "title": "Name" }, "priority": { @@ -24060,12 +26716,12 @@ "properties": { "bfd": { "type": "boolean", - "description": "Enable/Disable BFD", + "description": "Enable/Disable BFD.", "title": "BFD" }, "ssm_range": { "type": "string", - "description": "IPv4 Prefix associated with SSM", + "description": "IPv4 Prefix associated with SSM.", "title": "Ssm Range" }, "rp_addresses": { @@ -24075,7 +26731,7 @@ "properties": { "address": { "type": "string", - "description": "RP Address", + "description": "RP Address.", "title": "Address" }, "groups": { @@ -24126,7 +26782,7 @@ "properties": { "address": { "type": "string", - "description": "Anycast RP Address", + "description": "Anycast RP Address.", "title": "Address" }, "other_anycast_rp_addresses": { @@ -24136,7 +26792,7 @@ "properties": { "address": { "type": "string", - "description": "Other Anycast RP Address", + "description": "Other Anycast RP Address.", "title": "Address" }, "register_count": { @@ -24179,7 +26835,7 @@ "properties": { "name": { "type": "string", - "description": "VRF Name", + "description": "VRF Name.", "title": "Name" }, "ipv4": { @@ -24187,7 +26843,7 @@ "properties": { "bfd": { "type": "boolean", - "description": "Enable/Disable BFD", + "description": "Enable/Disable BFD.", "title": "BFD" }, "rp_addresses": { @@ -24197,7 +26853,7 @@ "properties": { "address": { "type": "string", - "description": "RP Address", + "description": "RP Address.", "title": "Address" }, "groups": { @@ -24266,6 +26922,231 @@ }, "title": "Router PIM Sparse Mode" }, + "router_segment_security": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "policies": { + "type": "array", + "description": "Customised application policies.\nUsing the Application Traffic Recognition L4 profiles, custom policies can be defined. The built-in application 'app-match-all' can be used to match any packets.\nNote that this is stateless, so both the source and destination flows need to be considered.", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Policy name.", + "title": "Name" + }, + "sequence_numbers": { + "type": "array", + "items": { + "type": "object", + "properties": { + "sequence": { + "type": "integer", + "description": "Sequence ID.", + "minimum": 1, + "maximum": 1023, + "title": "Sequence" + }, + "application": { + "type": "string", + "description": "The name of the application.", + "title": "Application" + }, + "action": { + "type": "string", + "description": "The action to take - note that platform support for the redirect action is limited. The \"redirect\" action also requires the 'next_hop' to be configured.", + "enum": [ + "forward", + "drop", + "redirect" + ], + "title": "Action" + }, + "log": { + "type": "boolean", + "description": "Enable logging - note that platform support is limited.", + "title": "Log" + }, + "stateless": { + "type": "boolean", + "description": "Take action, regardless of state. Should be set to 'true' for MSS-G.", + "default": true, + "title": "Stateless" + }, + "next_hop": { + "type": "string", + "description": "When the action is 'redirect', this indicates the IPv4 next hop to redirect to.", + "title": "Next Hop" + } + }, + "required": [ + "application", + "action", + "sequence" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Sequence Numbers" + } + }, + "required": [ + "sequence_numbers", + "name" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Policies" + }, + "vrfs": { + "type": "array", + "description": "The name of the VRF that the segments and policies are defined in.", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "segments": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Segment name.", + "title": "Name" + }, + "definition": { + "type": "object", + "properties": { + "interfaces": { + "type": "array", + "description": "The names of the source interface e.g. Port-Channel1 - note that platform support is limited.", + "minItems": 1, + "items": { + "type": "string" + }, + "title": "Interfaces" + }, + "match_lists": { + "type": "array", + "description": "The set of lists that define the segment. These can be a mix of IPv4 and IPv6 prefix or match lists.", + "maxItems": 2, + "minItems": 1, + "items": { + "type": "object", + "properties": { + "address_family": { + "type": "string", + "description": "Indicate which address-family the match list belongs to e.g. ipv4 or ipv6.", + "enum": [ + "ipv4", + "ipv6" + ], + "title": "Address Family" + }, + "covered_prefix_list": { + "type": "string", + "description": "The name of the prefix-list. You can have a maximum of one per address-family. Mutually exclusive to the use of match_list. If both are configured prefix takes precedence.", + "title": "Covered Prefix List" + }, + "prefix": { + "type": "string", + "description": "The name of the match-list. You can have a maximum of one per address-family. Mutually exclusive to the use of covered_prefix_list. If both are configured prefix takes precedence.", + "title": "Prefix" + } + }, + "required": [ + "address_family" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Match Lists" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Definition" + }, + "policies": { + "type": "array", + "description": "The policies controlling traffic into the segment.", + "items": { + "type": "object", + "properties": { + "from": { + "type": "string", + "description": "The name of the source segment or 'forwarding-segments' for all segments.", + "title": "From" + }, + "policy": { + "type": "string", + "description": "The name of the policy to apply. The built-in policies are 'policy-forward-all' and 'policy-drop-all'.", + "title": "Policy" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "from" + ] + }, + "title": "Policies" + }, + "fallback_policy": { + "type": "string", + "description": "Only supported on the R3 series platforms, this allows a per-segment default policy to be specified by name.", + "title": "Fallback Policy" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "title": "Segments" + } + }, + "required": [ + "segments", + "name" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "VRFs" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Router Segment Security" + }, "router_service_insertion": { "type": "object", "description": "Configure network services inserted to data forwarding.", @@ -24392,7 +27273,7 @@ "properties": { "address": { "type": "string", - "description": "IPv4 or IPv6 address", + "description": "IPv4 or IPv6 address.", "title": "Address" }, "colors": { @@ -24418,7 +27299,7 @@ }, "sbfd_remote_discriminator": { "type": "string", - "description": "IPv4 address or 32 bit integer", + "description": "IPv4 address or 32 bit integer.", "title": "SBFD Remote Discriminator" }, "path_group": { @@ -24568,7 +27449,7 @@ }, "polling_interval": { "type": "integer", - "description": "Polling interval in seconds", + "description": "Polling interval in seconds.", "title": "Polling Interval" }, "vrfs": { @@ -24587,7 +27468,7 @@ "properties": { "destination": { "type": "string", - "description": "Sflow Destination IP Address", + "description": "Sflow Destination IP Address.", "title": "Destination" }, "port": { @@ -24613,7 +27494,7 @@ }, "source_interface": { "type": "string", - "description": "Source Interface", + "description": "Source Interface.", "title": "Source Interface" } }, @@ -24634,12 +27515,12 @@ "properties": { "destination": { "type": "string", - "description": "Sflow Destination IP Address", + "description": "Sflow Destination IP Address.", "title": "Destination" }, "port": { "type": "integer", - "description": "Port Number", + "description": "Port Number.", "title": "Port" } }, @@ -24660,7 +27541,7 @@ }, "source_interface": { "type": "string", - "description": "Source Interface", + "description": "Source Interface.", "title": "Source Interface" }, "extensions": { @@ -24670,12 +27551,12 @@ "properties": { "name": { "type": "string", - "description": "Extension Name", + "description": "Extension Name.", "title": "Name" }, "enabled": { "type": "boolean", - "description": "Enable or Disable Extension", + "description": "Enable or Disable Extension.", "title": "Enabled" } }, @@ -24790,14 +27671,14 @@ }, "snmp_server": { "type": "object", - "description": "SNMP settings", + "description": "SNMP settings.", "properties": { "engine_ids": { "type": "object", "properties": { "local": { "type": "string", - "description": "Engine ID in hexadecimal\n", + "description": "Engine ID in hexadecimal.\n", "title": "Local" }, "remotes": { @@ -24807,12 +27688,12 @@ "properties": { "id": { "type": "string", - "description": "Remote engine ID in hexadecimal\n", + "description": "Remote engine ID in hexadecimal.\n", "title": "ID" }, "address": { "type": "string", - "description": "Hostname or IP of remote engine\n", + "description": "Hostname or IP of remote engine.\n", "title": "Address" }, "udp_port": { @@ -24836,12 +27717,12 @@ }, "contact": { "type": "string", - "description": "SNMP contact", + "description": "SNMP contact.", "title": "Contact" }, "location": { "type": "string", - "description": "SNMP location", + "description": "SNMP location.", "title": "Location" }, "communities": { @@ -24851,7 +27732,7 @@ "properties": { "name": { "type": "string", - "description": "Community name", + "description": "Community name.", "title": "Name" }, "access": { @@ -24867,7 +27748,7 @@ "properties": { "name": { "type": "string", - "description": "IPv4 access list name", + "description": "IPv4 access list name.", "title": "Name" } }, @@ -24882,7 +27763,7 @@ "properties": { "name": { "type": "string", - "description": "IPv6 access list name", + "description": "IPv6 access list name.", "title": "Name" } }, @@ -24914,7 +27795,7 @@ "properties": { "name": { "type": "string", - "description": "IPv4 access list name", + "description": "IPv4 access list name.", "title": "Name" }, "vrf": { @@ -24936,7 +27817,7 @@ "properties": { "name": { "type": "string", - "description": "IPv6 access list name", + "description": "IPv6 access list name.", "title": "Name" }, "vrf": { @@ -24958,7 +27839,7 @@ "properties": { "name": { "type": "string", - "description": "Interface name", + "description": "Interface name.", "title": "Name" }, "vrf": { @@ -24983,7 +27864,7 @@ "properties": { "name": { "type": "string", - "description": "SNMP view name", + "description": "SNMP view name.", "title": "Name" }, "mib_family_name": { @@ -25013,7 +27894,7 @@ "properties": { "name": { "type": "string", - "description": "Group name", + "description": "Group name.", "title": "Name" }, "version": { @@ -25036,17 +27917,17 @@ }, "read": { "type": "string", - "description": "Read view", + "description": "Read view.", "title": "Read" }, "write": { "type": "string", - "description": "Write view", + "description": "Write view.", "title": "Write" }, "notify": { "type": "string", - "description": "Notify view", + "description": "Notify view.", "title": "Notify" } }, @@ -25064,22 +27945,22 @@ "properties": { "name": { "type": "string", - "description": "Username", + "description": "Username.", "title": "Name" }, "group": { "type": "string", - "description": "Group name", + "description": "Group name.", "title": "Group" }, "remote_address": { "type": "string", - "description": "Hostname or ip of remote engine\nThe remote_address and udp_port are used for remote users\n", + "description": "Hostname or ip of remote engine.\nThe remote_address and udp_port are used for remote users.\n", "title": "Remote Address" }, "udp_port": { "type": "integer", - "description": "udp_port will not be used if no remote_address is configured\n", + "description": "udp_port will not be used if no remote_address is configured.\n", "title": "UDP Port" }, "version": { @@ -25093,27 +27974,27 @@ }, "localized": { "type": "string", - "description": "Engine ID in hexadecimal for localizing auth and/or priv\n", + "description": "Engine ID in hexadecimal for localizing auth and/or priv.\n", "title": "Localized" }, "auth": { "type": "string", - "description": "Hash algorithm\n", + "description": "Hash algorithm.\n", "title": "Auth" }, "auth_passphrase": { "type": "string", - "description": "Hashed authentication passphrase if localized is used else cleartext authentication passphrase\n", + "description": "Hashed authentication passphrase if localized is used else cleartext authentication passphrase.\n", "title": "Auth Passphrase" }, "priv": { "type": "string", - "description": "Encryption algorithm\n", + "description": "Encryption algorithm.\n", "title": "Priv" }, "priv_passphrase": { "type": "string", - "description": "Hashed privacy passphrase if localized is used else cleartext privacy passphrase\n", + "description": "Hashed privacy passphrase if localized is used else cleartext privacy passphrase.\n", "title": "Priv Passphrase" } }, @@ -25131,7 +28012,7 @@ "properties": { "host": { "type": "string", - "description": "Host IP address or name", + "description": "Host IP address or name.", "title": "Host" }, "vrf": { @@ -25149,7 +28030,7 @@ }, "community": { "type": "string", - "description": "Community name", + "description": "Community name.", "title": "Community" }, "users": { @@ -25192,7 +28073,7 @@ "enable": { "type": "boolean", "default": false, - "description": "Enable or disable all snmp-traps\n", + "description": "Enable or disable all snmp-traps.\n", "title": "Enable" }, "snmp_traps": { @@ -25202,7 +28083,7 @@ "properties": { "name": { "type": "string", - "description": "Enable or disable specific snmp-traps and their sub_traps\nExamples:\n- \"bgp\"\n- \"bgp established\"\n", + "description": "Enable or disable specific snmp-traps and their sub_traps.\nExamples:\n- \"bgp\"\n- \"bgp established\"\n", "title": "Name" }, "enabled": { @@ -25232,7 +28113,7 @@ "properties": { "name": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "Name" }, "enable": { @@ -25301,7 +28182,7 @@ }, "count": { "type": "integer", - "description": "Maximum number of BPDUs per timer interval", + "description": "Maximum number of BPDUs per timer interval.", "title": "Count" } }, @@ -25331,7 +28212,7 @@ }, "revision": { "type": "integer", - "description": "0-65535", + "description": "0-65535.", "title": "Revision" }, "instances": { @@ -25341,7 +28222,7 @@ "properties": { "id": { "type": "integer", - "description": "Instance ID", + "description": "Instance ID.", "title": "ID" }, "vlans": { @@ -25381,7 +28262,7 @@ "properties": { "id": { "type": "string", - "description": "Instance ID", + "description": "Instance ID.", "title": "ID" }, "priority": { @@ -25443,7 +28324,7 @@ "properties": { "name": { "type": "string", - "description": "Access-list Name", + "description": "Access-list Name.", "title": "Name" }, "counters_per_entry": { @@ -25457,12 +28338,12 @@ "properties": { "sequence": { "type": "integer", - "description": "Sequence ID", + "description": "Sequence ID.", "title": "Sequence" }, "action": { "type": "string", - "description": "Action as string\nExample: \"deny ip any any\"\n", + "description": "Action as string.\nExample: \"deny ip any any\"\n", "title": "Action" } }, @@ -25496,12 +28377,12 @@ "properties": { "vrf": { "type": "string", - "description": "VRF Name", + "description": "VRF Name.", "title": "VRF" }, "destination_address_prefix": { "type": "string", - "description": "IPv4_network/Mask", + "description": "IPv4_network/Mask.", "title": "Destination Address Prefix" }, "interface": { @@ -25510,12 +28391,12 @@ }, "gateway": { "type": "string", - "description": "IPv4 Address", + "description": "IPv4 Address.", "title": "Gateway" }, "track_bfd": { "type": "boolean", - "description": "Track next-hop using BFD", + "description": "Track next-hop using BFD.", "title": "Track BFD" }, "distance": { @@ -25532,7 +28413,7 @@ }, "name": { "type": "string", - "description": "Description", + "description": "Description.", "title": "Name" }, "metric": { @@ -25705,7 +28586,7 @@ }, "vlan": { "type": "integer", - "description": "VLAN ID", + "description": "VLAN ID.", "minimum": 1, "maximum": 4094, "title": "VLAN" @@ -25771,12 +28652,12 @@ "properties": { "ipv4": { "type": "integer", - "description": "Segment size", + "description": "Segment size.", "title": "IPv4" }, "ipv6": { "type": "integer", - "description": "Segment size", + "description": "Segment size.", "title": "IPv6" } }, @@ -25879,7 +28760,7 @@ "properties": { "timeout": { "type": "integer", - "description": "Timeout in seconds", + "description": "Timeout in seconds.", "minimum": 1, "maximum": 1000, "title": "Timeout" @@ -25891,7 +28772,7 @@ "properties": { "host": { "type": "string", - "description": "Host IP address or name", + "description": "Host IP address or name.", "title": "Host" }, "vrf": { @@ -25900,7 +28781,7 @@ }, "key": { "type": "string", - "description": "Encrypted key", + "description": "Encrypted key.", "title": "Key" }, "key_type": { @@ -25919,7 +28800,7 @@ }, "timeout": { "type": "integer", - "description": "Timeout in seconds", + "description": "Timeout in seconds.", "minimum": 1, "maximum": 1000, "title": "Timeout" @@ -25957,7 +28838,7 @@ "title": "Enabled" }, "profile": { - "description": "Profile Name", + "description": "Profile Name.", "type": "string", "title": "Profile" }, @@ -25965,7 +28846,7 @@ "type": "array", "items": { "type": "string", - "description": "Interface name e.g Ethernet1, Port-Channel1" + "description": "Interface name e.g Ethernet1, Port-Channel1." }, "title": "No Errdisable" } @@ -25997,7 +28878,7 @@ }, "truncation_size": { "type": "integer", - "description": "Allowed truncation_size values vary depending on the platform\n", + "description": "Allowed truncation_size values vary depending on the platform.\n", "title": "Truncation Size" }, "mac": { @@ -26005,7 +28886,7 @@ "properties": { "timestamp": { "type": "object", - "description": "mac.timestamp.replace_source_mac and mac.timestamp.header.format are mutually exclsuive. If both are defined, replace_source_mac takes precedence\n", + "description": "mac.timestamp.replace_source_mac and mac.timestamp.header.format are mutually exclsuive. If both are defined, replace_source_mac takes precedence.\n", "properties": { "replace_source_mac": { "type": "boolean", @@ -26023,7 +28904,7 @@ "title": "Format" }, "eth_type": { - "description": "EtherType", + "description": "EtherType.", "type": "integer", "title": "Eth Type" } @@ -26043,7 +28924,7 @@ }, "fcs_append": { "type": "boolean", - "description": "mac.fcs_append and mac.fcs_error are mutually exclusive. If both are defined, mac.fcs_append takes precedence\n", + "description": "mac.fcs_append and mac.fcs_error are mutually exclusive. If both are defined, mac.fcs_append takes precedence.\n", "title": "FCS Append" }, "fcs_error": { @@ -26075,7 +28956,7 @@ "properties": { "system": { "type": "string", - "description": "TCAM profile name to activate\n", + "description": "TCAM profile name to activate.\n", "title": "System" }, "profiles": { @@ -26085,7 +28966,7 @@ "properties": { "name": { "type": "string", - "description": "Tcam-Profile Name", + "description": "Tcam-Profile Name.", "title": "Name" }, "config": { @@ -26144,18 +29025,18 @@ "properties": { "name": { "type": "string", - "description": "Name of tracker object", + "description": "Name of tracker object.", "title": "Name" }, "interface": { "type": "string", - "description": "Name of tracked interface", + "description": "Name of tracked interface.", "title": "Interface" }, "tracked_property": { "type": "string", "default": "line-protocol", - "description": "Property to track", + "description": "Property to track.", "title": "Tracked Property" } }, @@ -26197,14 +29078,14 @@ "properties": { "name": { "type": "string", - "description": "IPv4 Prefix Field Set Name", + "description": "IPv4 Prefix Field Set Name.", "title": "Name" }, "prefixes": { "type": "array", "items": { "type": "string", - "description": "IPv4 Prefix" + "description": "IPv4 Prefix." }, "title": "Prefixes" } @@ -26226,14 +29107,14 @@ "properties": { "name": { "type": "string", - "description": "IPv6 Prefix Field Set Name", + "description": "IPv6 Prefix Field Set Name.", "title": "Name" }, "prefixes": { "type": "array", "items": { "type": "string", - "description": "IPv6 Prefix" + "description": "IPv6 Prefix." }, "title": "Prefixes" } @@ -26255,7 +29136,7 @@ "properties": { "name": { "type": "string", - "description": "L4 Port Field Set Name", + "description": "L4 Port Field Set Name.", "title": "Name" }, "port_range": { @@ -26288,7 +29169,7 @@ "properties": { "name": { "type": "string", - "description": "Traffic Policy Name", + "description": "Traffic Policy Name.", "title": "Name" }, "matches": { @@ -26298,7 +29179,7 @@ "properties": { "name": { "type": "string", - "description": "Traffic Policy Item", + "description": "Traffic Policy Item.", "title": "Name" }, "type": { @@ -26316,13 +29197,13 @@ "type": "array", "items": { "type": "string", - "description": "IP address or prefix" + "description": "IP address or prefix." }, "title": "Prefixes" }, "prefix_lists": { "type": "array", - "description": "Field-set prefix lists", + "description": "Field-set prefix lists.", "items": { "type": "string" }, @@ -26342,13 +29223,13 @@ "type": "array", "items": { "type": "string", - "description": "IP address or prefix" + "description": "IP address or prefix." }, "title": "Prefixes" }, "prefix_lists": { "type": "array", - "description": "Field-set prefix lists", + "description": "Field-set prefix lists.", "items": { "type": "string" }, @@ -26363,16 +29244,16 @@ }, "ttl": { "type": "string", - "description": "TTL range", + "description": "TTL range.", "title": "TTL" }, "fragment": { "type": "object", - "description": "The 'fragment' command is not supported when 'source port'\nor 'destination port' command is configured\n", + "description": "The 'fragment' command is not supported when 'source port'\nor 'destination port' command is configured.\n", "properties": { "offset": { "type": "string", - "description": "Fragment offset range", + "description": "Fragment offset range.", "title": "Offset" } }, @@ -26393,22 +29274,22 @@ }, "src_port": { "type": "string", - "description": "Port range", + "description": "Port range.", "title": "Src Port" }, "dst_port": { "type": "string", - "description": "Port range", + "description": "Port range.", "title": "Dst Port" }, "src_field": { "type": "string", - "description": "L4 port range field set", + "description": "L4 port range field set.", "title": "Src Field" }, "dst_field": { "type": "string", - "description": "L4 port range field set", + "description": "L4 port range field set.", "title": "Dst Field" }, "flags": { @@ -26449,12 +29330,12 @@ }, "traffic_class": { "type": "integer", - "description": "Traffic class ID", + "description": "Traffic class ID.", "title": "Traffic Class" }, "count": { "type": "string", - "description": "Counter name", + "description": "Counter name.", "title": "Count" }, "drop": { @@ -26463,7 +29344,7 @@ }, "log": { "type": "boolean", - "description": "Only supported when action is set to drop", + "description": "Only supported when action is set to drop.", "title": "Log" } }, @@ -26496,12 +29377,12 @@ }, "traffic_class": { "type": "integer", - "description": "Traffic class ID", + "description": "Traffic class ID.", "title": "Traffic Class" }, "count": { "type": "string", - "description": "Counter name", + "description": "Counter name.", "title": "Count" }, "drop": { @@ -26510,7 +29391,7 @@ }, "log": { "type": "boolean", - "description": "Only supported when action is set to drop", + "description": "Only supported when action is set to drop.", "title": "Log" } }, @@ -26529,12 +29410,12 @@ }, "traffic_class": { "type": "integer", - "description": "Traffic class ID", + "description": "Traffic class ID.", "title": "Traffic Class" }, "count": { "type": "string", - "description": "Counter name", + "description": "Counter name.", "title": "Count" }, "drop": { @@ -26543,7 +29424,7 @@ }, "log": { "type": "boolean", - "description": "Only supported when action is set to drop", + "description": "Only supported when action is set to drop.", "title": "Log" } }, @@ -26591,7 +29472,7 @@ "properties": { "name": { "type": "string", - "description": "Tunnel Interface Name", + "description": "Tunnel Interface Name.", "title": "Name" }, "description": { @@ -26610,12 +29491,12 @@ }, "vrf": { "type": "string", - "description": "VRF Name", + "description": "VRF Name.", "title": "VRF" }, "ip_address": { "type": "string", - "description": "IPv4_address/Mask", + "description": "IPv4_address/Mask.", "title": "IP Address" }, "ipv6_enable": { @@ -26624,26 +29505,26 @@ }, "ipv6_address": { "type": "string", - "description": "IPv6_address/Mask", + "description": "IPv6_address/Mask.", "title": "IPv6 Address" }, "access_group_in": { - "description": "IPv4 ACL Name for ingress", + "description": "IPv4 ACL Name for ingress.", "type": "string", "title": "Access Group In" }, "access_group_out": { - "description": "IPv4 ACL Name for egress", + "description": "IPv4 ACL Name for egress.", "type": "string", "title": "Access Group Out" }, "ipv6_access_group_in": { - "description": "IPv6 ACL Name for ingress", + "description": "IPv6 ACL Name for ingress.", "type": "string", "title": "IPv6 Access Group In" }, "ipv6_access_group_out": { - "description": "IPv6 ACL Name for egress", + "description": "IPv6 ACL Name for egress.", "type": "string", "title": "IPv6 Access Group Out" }, @@ -26652,14 +29533,14 @@ "properties": { "ipv4": { "type": "integer", - "description": "Segment Size for IPv4", + "description": "Segment Size for IPv4.", "minimum": 64, "maximum": 65495, "title": "IPv4" }, "ipv6": { "type": "integer", - "description": "Segment Size for IPv6", + "description": "Segment Size for IPv6.", "minimum": 64, "maximum": 65475, "title": "IPv6" @@ -26670,7 +29551,7 @@ "ingress", "egress" ], - "description": "Optional direction ('ingress', 'egress') for tcp mss ceiling\n", + "description": "Optional direction ('ingress', 'egress') for tcp mss ceiling.\n", "title": "Direction" } }, @@ -26691,17 +29572,17 @@ }, "source_interface": { "type": "string", - "description": "Tunnel Source Interface Name", + "description": "Tunnel Source Interface Name.", "title": "Source Interface" }, "destination": { "type": "string", - "description": "IPv4 or IPv6 Address Tunnel Destination", + "description": "IPv4 or IPv6 Address Tunnel Destination.", "title": "Destination" }, "path_mtu_discovery": { "type": "boolean", - "description": "Enable Path MTU Discovery On Tunnel", + "description": "Enable Path MTU Discovery On Tunnel.", "title": "Path MTU Discovery" }, "ipsec_profile": { @@ -26737,12 +29618,12 @@ "properties": { "name": { "type": "string", - "description": "VRF Name", + "description": "VRF Name.", "title": "Name" }, "ip_address": { "type": "string", - "description": "IPv4 Address", + "description": "IPv4 Address.", "title": "IP Address" } }, @@ -26763,7 +29644,7 @@ "properties": { "name": { "type": "string", - "description": "VLAN interface name like \"Vlan123\"", + "description": "VLAN interface name like \"Vlan123\".", "title": "Name" }, "description": { @@ -26800,12 +29681,12 @@ }, "vrf": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "VRF" }, "arp_aging_timeout": { "type": "integer", - "description": "In seconds", + "description": "In seconds.", "minimum": 1, "maximum": 65535, "title": "ARP Aging Timeout" @@ -26834,14 +29715,14 @@ }, "ip_address": { "type": "string", - "description": "IPv4_address/Mask", + "description": "IPv4_address/Mask.", "title": "IP Address" }, "ip_address_secondaries": { "type": "array", "items": { "type": "string", - "description": "IPv4_address/Mask" + "description": "IPv4_address/Mask." }, "title": "IP Address Secondaries" }, @@ -26849,20 +29730,20 @@ "type": "array", "items": { "type": "string", - "description": "IPv4 address or IPv4_address/Mask" + "description": "IPv4 address or IPv4_address/Mask." }, "title": "IP Virtual Router Addresses" }, "ip_address_virtual": { "type": "string", - "description": "IPv4_address/Mask", + "description": "IPv4_address/Mask.", "title": "IP Address Virtual" }, "ip_address_virtual_secondaries": { "type": "array", "items": { "type": "string", - "description": "IPv4_address/Mask" + "description": "IPv4_address/Mask." }, "title": "IP Address Virtual Secondaries" }, @@ -26998,23 +29879,23 @@ }, "ip_helpers": { "type": "array", - "description": "List of DHCP servers", + "description": "List of DHCP servers.", "items": { "type": "object", "properties": { "ip_helper": { "type": "string", - "description": "IP address or hostname of DHCP server", + "description": "IP address or hostname of DHCP server.", "title": "IP Helper" }, "source_interface": { "type": "string", - "description": "Interface used as source for forwarded DHCP packets", + "description": "Interface used as source for forwarded DHCP packets.", "title": "Source Interface" }, "vrf": { "type": "string", - "description": "VRF where DHCP server can be reached", + "description": "VRF where DHCP server can be reached.", "title": "VRF" } }, @@ -27028,6 +29909,11 @@ }, "title": "IP Helpers" }, + "ip_dhcp_relay_all_subnets": { + "type": "boolean", + "description": "Allow forwarding requests with secondary IP addresses in the gateway address \"giaddr\" field.", + "title": "IP DHCP Relay All Subnets" + }, "ip_nat": { "type": "object", "properties": { @@ -27076,7 +29962,7 @@ "properties": { "access_list": { "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Access List" }, "comment": { @@ -27096,16 +29982,17 @@ "type": "integer", "minimum": 1, "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Group" }, "original_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address. The combination of `original_ip` and `original_port` must be unique.", "title": "Original IP" }, "original_port": { "type": "integer", + "description": "TCP/UDP port. The combination of `original_ip` and `original_port` must be unique.", "minimum": 1, "maximum": 65535, "title": "Original Port" @@ -27126,20 +30013,19 @@ }, "translated_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.", "title": "Translated IP" }, "translated_port": { "type": "integer", "minimum": 1, "maximum": 65535, - "description": "requires 'original_port'", + "description": "requires 'original_port'.", "title": "Translated Port" } }, "required": [ - "translated_ip", - "original_ip" + "translated_ip" ], "additionalProperties": false, "patternProperties": { @@ -27183,7 +30069,7 @@ }, "pool_name": { "type": "string", - "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone\nignored if 'nat_type' is overload\n", + "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone.\nignored if 'nat_type' is overload.\n", "title": "Pool Name" }, "priority": { @@ -27211,7 +30097,7 @@ "properties": { "access_list": { "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Access List" }, "comment": { @@ -27231,16 +30117,17 @@ "type": "integer", "minimum": 1, "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Group" }, "original_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address. The combination of `original_ip` and `original_port` must be unique.", "title": "Original IP" }, "original_port": { "type": "integer", + "description": "TCP/UDP port. The combination of `original_ip` and `original_port` must be unique.", "minimum": 1, "maximum": 65535, "title": "Original Port" @@ -27261,20 +30148,19 @@ }, "translated_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.", "title": "Translated IP" }, "translated_port": { "type": "integer", "minimum": 1, "maximum": 65535, - "description": "requires 'original_port'", + "description": "requires 'original_port'.", "title": "Translated Port" } }, "required": [ - "translated_ip", - "original_ip" + "translated_ip" ], "additionalProperties": false, "patternProperties": { @@ -27303,12 +30189,12 @@ }, "ipv6_address": { "type": "string", - "description": "IPv6_address/Mask", + "description": "IPv6_address/Mask.", "title": "IPv6 Address" }, "ipv6_address_virtual": { "type": "string", - "description": "IPv6_address/Mask\nIf both \"ipv6_address_virtual\" and \"ipv6_address_virtuals\" are set, all addresses will be configured\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use ipv6_address_virtuals instead.", + "description": "IPv6_address/Mask.\nIf both \"ipv6_address_virtual\" and \"ipv6_address_virtuals\" are set, all addresses will be configured.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use ipv6_address_virtuals instead.", "deprecated": true, "title": "IPv6 Address Virtual" }, @@ -27317,13 +30203,13 @@ "description": "The new \"ipv6_address_virtuals\" key support multiple virtual ipv6 addresses.", "items": { "type": "string", - "description": "IPv6_address/Mask" + "description": "IPv6_address/Mask." }, "title": "IPv6 Address Virtuals" }, "ipv6_address_link_local": { "type": "string", - "description": "IPv6_address/Mask", + "description": "IPv6_address/Mask.", "title": "IPv6 Address Link Local" }, "ipv6_virtual_router_address": { @@ -27337,7 +30223,7 @@ "description": "Improved \"VARPv6\" data model to support multiple VARPv6 addresses.", "items": { "type": "string", - "description": "IPv6 address or IPv6_address/Mask" + "description": "IPv6 address or IPv6_address/Mask." }, "title": "IPv6 Virtual Router Addresses" }, @@ -27349,6 +30235,41 @@ "type": "boolean", "title": "IPv6 ND Managed Config Flag" }, + "ipv6_nd_other_config_flag": { + "type": "boolean", + "description": "Set the \"other stateful configuration\" flag in IPv6 router advertisements.", + "title": "IPv6 ND Other Config Flag" + }, + "ipv6_nd_cache": { + "type": "object", + "description": "IPv6 neighbor cache options.", + "properties": { + "dynamic_capacity": { + "type": "integer", + "description": "Capacity of dynamic cache entries.", + "minimum": 0, + "maximum": 4294967295, + "title": "Dynamic Capacity" + }, + "expire": { + "type": "integer", + "description": "Cache entries expirery in seconds.", + "minimum": 1, + "maximum": 65535, + "title": "Expire" + }, + "refresh_always": { + "type": "boolean", + "description": "Force refresh on cache expiry.", + "title": "Refresh Always" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IPv6 ND Cache" + }, "ipv6_nd_prefixes": { "type": "array", "items": { @@ -27356,17 +30277,17 @@ "properties": { "ipv6_prefix": { "type": "string", - "description": "IPv6_address/Mask", + "description": "IPv6_address/Mask.", "title": "IPv6 Prefix" }, "valid_lifetime": { "type": "string", - "description": "In seconds <0-4294967295> or infinite", + "description": "In seconds <0-4294967295> or infinite.", "title": "Valid Lifetime" }, "preferred_lifetime": { "type": "string", - "description": "In seconds <0-4294967295> or infinite", + "description": "In seconds <0-4294967295> or infinite.", "title": "Preferred Lifetime" }, "no_autoconfig_flag": { @@ -27391,7 +30312,7 @@ "properties": { "address": { "type": "string", - "description": "DHCP server's IPv6 address", + "description": "DHCP server's IPv6 address.", "title": "Address" }, "vrf": { @@ -27400,17 +30321,17 @@ }, "local_interface": { "type": "string", - "description": "Local interface to communicate with DHCP server - mutually exclusive to source_address", + "description": "Local interface to communicate with DHCP server - mutually exclusive to source_address.", "title": "Local Interface" }, "source_address": { "type": "string", - "description": "Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface", + "description": "Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface.", "title": "Source Address" }, "link_address": { "type": "string", - "description": "Override the default link address specified in the relayed DHCP packet", + "description": "Override the default link address specified in the relayed DHCP packet.", "title": "Link Address" } }, @@ -27424,24 +30345,29 @@ }, "title": "IPv6 DHCP Relay Destinations" }, + "ipv6_dhcp_relay_all_subnets": { + "type": "boolean", + "description": "Allow forwarding requests with additional IPv6 addresses in the gateway address \"giaddr\" field.", + "title": "IPv6 DHCP Relay All Subnets" + }, "access_group_in": { "type": "string", - "description": "IPv4 access-list name", + "description": "IPv4 access-list name.", "title": "Access Group In" }, "access_group_out": { "type": "string", - "description": "IPv4 access-list name", + "description": "IPv4 access-list name.", "title": "Access Group Out" }, "ipv6_access_group_in": { "type": "string", - "description": "IPv6 access-list name", + "description": "IPv6 access-list name.", "title": "IPv6 Access Group In" }, "ipv6_access_group_out": { "type": "string", - "description": "IPv6 access-list name", + "description": "IPv6 access-list name.", "title": "IPv6 Access Group Out" }, "multicast": { @@ -27452,13 +30378,13 @@ "properties": { "boundaries": { "type": "array", - "description": "Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both", + "description": "Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both.", "items": { "type": "object", "properties": { "boundary": { "type": "string", - "description": "IPv4 access-list name or IPv4 multicast group prefix with mask", + "description": "IPv4 access-list name or IPv4 multicast group prefix with mask.", "title": "Boundary" }, "out": { @@ -27515,13 +30441,13 @@ "properties": { "boundaries": { "type": "array", - "description": "Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both", + "description": "Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both.", "items": { "type": "object", "properties": { "boundary": { "type": "string", - "description": "IPv6 access-list name or IPv6 multicast group prefix with mask", + "description": "IPv6 access-list name or IPv6 multicast group prefix with mask.", "title": "Boundary" } }, @@ -27599,12 +30525,12 @@ }, "ospf_authentication_key": { "type": "string", - "description": "Encrypted password used for simple authentication", + "description": "Encrypted password used for simple authentication.", "title": "OSPF Authentication Key" }, "ospf_message_digest_keys": { "type": "array", - "description": "Keys used for message-digest authentication", + "description": "Keys used for message-digest authentication.", "items": { "type": "object", "properties": { @@ -27625,7 +30551,7 @@ }, "key": { "type": "string", - "description": "Encrypted password", + "description": "Encrypted password.", "title": "Key" } }, @@ -27711,9 +30637,14 @@ }, "isis_enable": { "type": "string", - "description": "ISIS instance name", + "description": "ISIS instance name.", "title": "ISIS Enable" }, + "isis_bfd": { + "type": "boolean", + "description": "Enable BFD for ISIS.", + "title": "ISIS BFD" + }, "isis_passive": { "type": "boolean", "title": "ISIS Passive" @@ -27736,18 +30667,18 @@ }, "vrrp_ids": { "type": "array", - "description": "Improved \"vrrp\" data model to support multiple VRRP IDs", + "description": "Improved \"vrrp\" data model to support multiple VRRP IDs.", "items": { "type": "object", "properties": { "id": { "type": "integer", - "description": "VRID", + "description": "VRID.", "title": "ID" }, "priority_level": { "type": "integer", - "description": "Instance priority", + "description": "Instance priority.", "minimum": 1, "maximum": 254, "title": "Priority Level" @@ -27757,7 +30688,7 @@ "properties": { "interval": { "type": "integer", - "description": "Interval in seconds", + "description": "Interval in seconds.", "minimum": 1, "maximum": 255, "title": "Interval" @@ -27781,14 +30712,14 @@ "properties": { "minimum": { "type": "integer", - "description": "Minimum preempt delay in seconds", + "description": "Minimum preempt delay in seconds.", "minimum": 0, "maximum": 3600, "title": "Minimum" }, "reload": { "type": "integer", - "description": "Reload preempt delay in seconds", + "description": "Reload preempt delay in seconds.", "minimum": 0, "maximum": 3600, "title": "Reload" @@ -27844,14 +30775,14 @@ "properties": { "name": { "type": "string", - "description": "Tracked object name", + "description": "Tracked object name.", "title": "Name" }, "decrement": { "type": "integer", "minimum": 1, "maximum": 254, - "description": "Decrement VRRP priority by 1-254", + "description": "Decrement VRRP priority by 1-254.", "title": "Decrement" }, "shutdown": { @@ -27874,7 +30805,7 @@ "properties": { "address": { "type": "string", - "description": "Virtual IPv4 address", + "description": "Virtual IPv4 address.", "title": "Address" }, "version": { @@ -27900,7 +30831,7 @@ "properties": { "address": { "type": "string", - "description": "Virtual IPv6 address", + "description": "Virtual IPv6 address.", "title": "Address" } }, @@ -27931,12 +30862,12 @@ "properties": { "virtual_router": { "type": "string", - "description": "Virtual Router ID", + "description": "Virtual Router ID.", "title": "Virtual Router" }, "priority": { "type": "integer", - "description": "Instance priority", + "description": "Instance priority.", "title": "Priority" }, "advertisement_interval": { @@ -27949,12 +30880,12 @@ }, "ipv4": { "type": "string", - "description": "Virtual IPv4 address", + "description": "Virtual IPv4 address.", "title": "IPv4" }, "ipv6": { "type": "string", - "description": "Virtual IPv6 address", + "description": "Virtual IPv6 address.", "title": "IPv6" } }, @@ -28027,12 +30958,12 @@ }, "interval": { "type": "integer", - "description": "Rate in milliseconds", + "description": "Rate in milliseconds.", "title": "Interval" }, "min_rx": { "type": "integer", - "description": "Minimum RX hold time in milliseconds", + "description": "Minimum RX hold time in milliseconds.", "title": "Min RX" }, "multiplier": { @@ -28056,7 +30987,7 @@ "properties": { "input": { "type": "string", - "description": "Name of policy-map used for policy based routing", + "description": "Name of policy-map used for policy based routing.", "title": "Input" } }, @@ -28075,12 +31006,12 @@ }, "pvlan_mapping": { "type": "string", - "description": "List of VLANs as string", + "description": "List of VLANs as string.", "title": "PVLAN Mapping" }, "tenant": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Tenant" }, "tags": { @@ -28088,17 +31019,17 @@ "items": { "type": "string" }, - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Tags" }, "type": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Type" }, "eos_cli": { "type": "string", - "description": "Multiline EOS CLI rendered directly on the VLAN interface in the final EOS configuration", + "description": "Multiline EOS CLI rendered directly on the VLAN interface in the final EOS configuration.", "title": "EOS CLI" } }, @@ -28169,12 +31100,12 @@ "properties": { "id": { "type": "integer", - "description": "VLAN ID", + "description": "VLAN ID.", "title": "ID" }, "name": { "type": "string", - "description": "VLAN Name", + "description": "VLAN Name.", "title": "Name" }, "state": { @@ -28189,7 +31120,7 @@ "type": "array", "items": { "type": "string", - "description": "Trunk Group Name" + "description": "Trunk Group Name." }, "title": "Trunk Groups" }, @@ -28206,7 +31137,7 @@ }, "primary_vlan": { "type": "integer", - "description": "Primary VLAN ID", + "description": "Primary VLAN ID.", "title": "Primary VLAN" } }, @@ -28218,7 +31149,7 @@ }, "tenant": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Tenant" } }, @@ -28239,7 +31170,7 @@ "properties": { "name": { "type": "string", - "description": "Vmtracer Session Name", + "description": "Vmtracer Session Name.", "title": "Name" }, "url": { @@ -28252,7 +31183,7 @@ }, "password": { "type": "string", - "description": "Type 7 Password Hash", + "description": "Type 7 Password Hash.", "title": "Password" }, "autovlan_disable": { @@ -28276,13 +31207,13 @@ }, "vrfs": { "type": "array", - "description": "These keys are ignored if the name of the vrf is 'default'\n", + "description": "These keys are ignored if the name of the vrf is 'default'.\n", "items": { "type": "object", "properties": { "name": { "type": "string", - "description": "VRF Name", + "description": "VRF Name.", "title": "Name" }, "description": { @@ -28303,7 +31234,7 @@ }, "tenant": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Tenant" } }, @@ -28332,7 +31263,7 @@ "properties": { "source_interface": { "type": "string", - "description": "Source Interface Name", + "description": "Source Interface Name.", "title": "Source Interface" }, "multicast": { @@ -28351,7 +31282,7 @@ }, "controller_client": { "type": "object", - "description": "Client to CVX Controllers", + "description": "Client to CVX Controllers.", "properties": { "enabled": { "type": "boolean", @@ -28379,7 +31310,7 @@ }, "virtual_router_encapsulation_mac_address": { "type": "string", - "description": "\"mlag-system-id\" or ethernet_address (H.H.H)\n", + "description": "\"mlag-system-id\" or ethernet_address (H.H.H).\n", "title": "Virtual Router Encapsulation MAC Address" }, "bfd_vtep_evpn": { @@ -28441,7 +31372,7 @@ "properties": { "id": { "type": "integer", - "description": "VLAN ID", + "description": "VLAN ID.", "title": "ID" }, "vni": { @@ -28450,14 +31381,14 @@ }, "multicast_group": { "type": "string", - "description": "IP Multicast Group Address", + "description": "IP Multicast Group Address.", "title": "Multicast Group" }, "flood_vteps": { "type": "array", "items": { "type": "string", - "description": "Remote VTEP IP Address" + "description": "Remote VTEP IP Address." }, "title": "Flood Vteps" } @@ -28479,7 +31410,7 @@ "properties": { "name": { "type": "string", - "description": "VRF Name", + "description": "VRF Name.", "title": "Name" }, "vni": { @@ -28488,7 +31419,7 @@ }, "multicast_group": { "type": "string", - "description": "IP Multicast Group Address", + "description": "IP Multicast Group Address.", "title": "Multicast Group" } }, @@ -28506,7 +31437,7 @@ "type": "array", "items": { "type": "string", - "description": "Remote VTEP IP Address" + "description": "Remote VTEP IP Address." }, "title": "Flood Vteps" }, diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/eos_cli_config_gen.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/eos_cli_config_gen.schema.yml similarity index 78% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/eos_cli_config_gen.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/eos_cli_config_gen.schema.yml index be9e3da6b04..1737cb2fe56 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/eos_cli_config_gen.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/eos_cli_config_gen.schema.yml @@ -1,7 +1,11 @@ # Copyright (c) 2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. +# yaml-language-server: $schema=../../../plugins/plugin_utils/schema/avd_meta_schema.json +# Line above is used by RedHat's YAML Schema vscode extension +# Use Ctrl + Space to get suggestions for every field. Autocomplete will pop up after typing 2 letters. $id: eos_cli_config_gen +$schema: avd_meta_schema type: dict allow_other_keys: true keys: @@ -21,7 +25,7 @@ keys: - start-stop - stop-only group: - description: Group Name + description: Group Name. type: str logging: type: bool @@ -35,7 +39,7 @@ keys: - start-stop - stop-only group: - description: Group Name + description: Group Name. type: str logging: type: bool @@ -52,7 +56,7 @@ keys: - start-stop - stop-only group: - description: Group Name + description: Group Name. type: str dot1x: type: dict @@ -66,7 +70,7 @@ keys: - start-stop - stop-only group: - description: Group Name + description: Group Name. type: str commands: type: dict @@ -80,7 +84,7 @@ keys: type: str convert_types: - int - description: Privelege level 'all' or 0-15 + description: Privilege level 'all' or 0-15. type: type: str valid_values: @@ -88,7 +92,7 @@ keys: - start-stop - stop-only group: - description: Group Name + description: Group Name. type: str logging: type: bool @@ -101,7 +105,7 @@ keys: type: str convert_types: - int - description: Privelege level 'all' or 0-15 + description: Privilege level 'all' or 0-15. type: type: str valid_values: @@ -109,7 +113,7 @@ keys: - start-stop - stop-only group: - description: Group Name + description: Group Name. type: str logging: type: bool @@ -267,7 +271,7 @@ keys: keys: level: type: str - description: Privilege level(s) 0-15 + description: Privilege level(s) 0-15. convert_types: - int default: @@ -297,7 +301,7 @@ keys: type: dict keys: name: - description: Group name + description: Group name. type: str type: type: str @@ -312,10 +316,10 @@ keys: keys: server: type: str - description: Hostname or IP address + description: Hostname or IP address. vrf: type: str - description: VRF name + description: VRF name. convert_types: - int access_lists: @@ -329,11 +333,18 @@ keys: keys: name: type: str - description: Access-list Name + description: Access-list Name. convert_types: - int counters_per_entry: type: bool + permit_response_traffic: + type: str + valid_values: + - nat + description: 'Permit response traffic automatically based on NAT translations. + + Minimum EOS version requirement 4.32.2F.' sequence_numbers: type: list required: true @@ -345,13 +356,13 @@ keys: keys: sequence: type: int - description: Sequence ID + description: Sequence ID. convert_types: - str action: type: str required: true - description: 'Action as string + description: 'Action as string. Example: "deny ip any any" @@ -363,10 +374,10 @@ keys: type: list items: type: str - description: DHCP server IPv4 address + description: DHCP server IPv4 address. disabled: type: bool - description: Disable IP locking on configured ports + description: Disable IP locking on configured ports. leases: type: list items: @@ -375,11 +386,11 @@ keys: ip: type: str required: true - description: IP address + description: IP address. mac: type: str required: true - description: MAC address (hhhh.hhhh.hhhh or hh:hh:hh:hh:hh:hh) + description: MAC address (hhhh.hhhh.hhhh or hh:hh:hh:hh:hh:hh). local_interface: type: str locked_address: @@ -387,13 +398,13 @@ keys: keys: expiration_mac_disabled: type: bool - description: Configure deauthorizing locked addresses upon MAC aging out + description: Configure deauthorizing locked addresses upon MAC aging out. ipv4_enforcement_disabled: type: bool - description: Configure enforcement for locked IPv4 addresses + description: Configure enforcement for locked IPv4 addresses. ipv6_enforcement_disabled: type: bool - description: Configure enforcement for locked IPv6 addresses + description: Configure enforcement for locked IPv6 addresses. agents: type: list primary_key: name @@ -509,10 +520,12 @@ keys: keys: ipv4_applications: type: list - description: List of user defined IPv4 applications. + description: List of user defined IPv4 applications. The name should be + unique over all defined applications (ipv4 and l4). primary_key: name items: type: dict + $ref: eos_cli_config_gen#/$defs/application_traffic_recognition_application keys: name: type: str @@ -523,82 +536,18 @@ keys: dest_prefix_set_name: type: str description: Destination prefix set name. - protocols: - type: list - description: 'List of protocols to consider for this application. - - - To use port field-sets (source, destination or both), the list - - must contain only one or two protocols, either `tcp` or `udp`. - - When using both protocols, one line is rendered for each in the - configuration, - - hence the field-sets must have the same value for `tcp_src_port_set_name` - and - - `udp_src_port_set_name` and for `tcp_dest_port_set_name` and `udp_dest_port_set_name` - - if set in order to generate valid configuration in EOS.' - items: - type: str - valid_values: - - ahp - - esp - - icmp - - igmp - - ospf - - pim - - rsvp - - tcp - - udp - - vrrp - protocol_ranges: - type: list - description: 'Acccept protocol value(s) or range(s). - - Protocol values can be between 1 and 255.' - items: - type: str - convert_types: - - int - udp_src_port_set_name: - type: str - description: 'Name of field set for UDP source ports. - - - When the `protocols` list contain both `tcp` and `udp`, this key - value - - must be the same as `tcp_src_port_set_name`.' - tcp_src_port_set_name: - type: str - description: 'Name of field set for TCP source ports. - - - When the `protocols` list contain both `tcp` and `udp`, this key - value - - must be the same as `udp_src_port_set_name`.' - udp_dest_port_set_name: - type: str - description: 'Name of field set for UDP destination ports. - - - When the `protocols` list contain both `tcp` and `udp`, this key - value - - must be the same as `tcp_dest_port_set_name`.' - tcp_dest_port_set_name: + l4_applications: + type: list + description: List of user defined L4 applications. The name should be + unique over all defined applications (ipv4 and l4). + primary_key: name + items: + type: dict + $ref: eos_cli_config_gen#/$defs/application_traffic_recognition_application + keys: + name: type: str - description: 'Name of field set for TCP destination ports. - - - When the `protocols` list contain both `tcp` and `udp`, this key - value - - must be the same as `udp_dest_port_set_name`.' + description: Application name. application_profiles: type: list description: Group of applications. @@ -684,11 +633,26 @@ keys: arp: type: dict keys: + persistent: + type: dict + keys: + enabled: + type: bool + required: true + description: Restore the ARP cache after reboot. + refresh_delay: + type: int + description: Time to wait in seconds before refreshing the ARP cache after + reboot (EOS default 600). + min: 600 + max: 3600 + convert_types: + - str aging: type: dict keys: timeout_default: - description: Timeout in seconds + description: Timeout in seconds. type: int min: 60 max: 65535 @@ -727,7 +691,7 @@ keys: keys: name: type: str - description: Access List Name + description: Access List Name. entries: type: list items: @@ -740,7 +704,7 @@ keys: - deny match: type: str - description: Regex To Match + description: Regex To Match. origin: type: str valid_values: @@ -783,7 +747,7 @@ keys: "debug" will produce hidden debug messages viewable with -v. - "quiet" will not produce any messages + "quiet" will not produce any messages. ' avd_data_validation_mode: @@ -820,10 +784,10 @@ keys: keys: login: type: str - description: Multiline string ending with EOF on the last line + description: Multiline string ending with EOF on the last line. motd: type: str - description: Multiline string ending with EOF on the last line + description: Multiline string ending with EOF on the last line. bgp_groups: type: list primary_key: name @@ -834,7 +798,7 @@ keys: keys: name: type: str - description: Group Name + description: Group Name. vrf: type: str convert_types: @@ -847,10 +811,10 @@ keys: type: list items: type: str - description: Profile Name + description: Profile Name. boot: display_name: System Boot Settings - description: 'Set the Aboot password + description: 'Set the Aboot password. ' type: dict @@ -865,7 +829,7 @@ keys: - sha512 default: sha512 key: - description: Hashed Password + description: Hashed Password. type: str class_maps: type: dict @@ -881,13 +845,13 @@ keys: keys: name: type: str - description: Class-Map Name + description: Class-Map Name. ip: type: dict keys: access_group: type: str - description: Standard Access-List Name + description: Standard Access-List Name. convert_types: - int qos: @@ -900,23 +864,23 @@ keys: keys: name: type: str - description: Class-Map Name + description: Class-Map Name. vlan: type: str convert_types: - int - description: VLAN value(s) or range(s) of VLAN values + description: VLAN value(s) or range(s) of VLAN values. cos: type: str convert_types: - int - description: CoS value(s) or range(s) of CoS values + description: CoS value(s) or range(s) of CoS values. ip: type: dict keys: access_group: type: str - description: IPv4 Access-List Name + description: IPv4 Access-List Name. convert_types: - int ipv6: @@ -924,7 +888,7 @@ keys: keys: access_group: type: str - description: IPv6 Access-List Name + description: IPv6 Access-List Name. convert_types: - int clock: @@ -943,11 +907,11 @@ keys: keys: name: type: str - description: Community-list Name + description: Community-list Name. action: type: str required: true - description: 'Action as string + description: 'Action as string. Example: "permit GSHUT 65123:123" @@ -970,7 +934,7 @@ keys: `custom_templates` to group/host variables:\n" items: type: str - description: Template relative path below playbook directory + description: Template relative path below playbook directory. cvx: type: dict description: CVX server features are not supported on physical switches. See `management_cvx` @@ -982,7 +946,7 @@ keys: type: list items: type: str - description: IP address or hostname + description: IP address or hostname. services: type: dict keys: @@ -994,7 +958,7 @@ keys: keys: password: type: str - description: Hashed password using the password_type + description: Hashed password using the password_type. password_type: type: str convert_types: @@ -1008,7 +972,7 @@ keys: type: bool vxlan: type: dict - description: VXLAN Controller service + description: VXLAN Controller service. keys: shutdown: type: bool @@ -1028,7 +992,7 @@ keys: keys: cvaddrs: type: list - description: 'Streaming address(es) for CloudVision single cluster + description: 'Streaming address(es) for CloudVision single cluster. - TCP 9910 is used for CV on-prem @@ -1037,10 +1001,10 @@ keys: ' items: type: str - description: Server address in the format `:` + description: Server address in the format `:`. clusters: type: list - description: 'Multiple CloudVision clusters + description: 'Multiple CloudVision clusters. ' primary_key: name @@ -1051,10 +1015,10 @@ keys: keys: name: type: str - description: Cluster Name + description: Cluster Name. cvaddrs: type: list - description: 'Streaming address(es) for CloudVision cluster + description: 'Streaming address(es) for CloudVision cluster. - TCP 9910 is used for CV on-prem @@ -1063,10 +1027,10 @@ keys: ' items: type: str - description: Server address in the format `:` + description: Server address in the format `:`. cvauth: type: dict - description: 'Authentication scheme used to connect to CloudVision + description: 'Authentication scheme used to connect to CloudVision. ' keys: @@ -1081,35 +1045,35 @@ keys: type: str token_file: type: str - description: 'Token file path + description: 'Token file path. e.g. "/tmp/token" ' cert_file: type: str - description: 'Client certificate file path + description: 'Client certificate file path. e.g. "/persist/secure/ssl/terminattr/primary/certs/client.crt" ' ca_file: type: str - description: 'CA certificate file path (on-prem only) + description: 'CA certificate file path (on-prem only). e.g. "/persist/secure/ssl/terminattr/primary/certs/ca.crt" ' key_file: type: str - description: 'Client certificate key file path + description: 'Client certificate key file path. e.g. "/persist/secure/ssl/terminattr/primary/keys/client.key" ' cvobscurekeyfile: type: bool - description: 'Encrypt the private key used for authentication to CloudVision + description: 'Encrypt the private key used for authentication to CloudVision. ' cvproxy: @@ -1118,17 +1082,17 @@ keys: when the CloudVision server is hosted in the cloud. The expected form is http://[user:password@]ip:port, e.g.: `http://arista:arista@10.83.12.78:3128`. - Available as of TerminAttr v1.13.0 + Available as of TerminAttr v1.13.0. ' cvsourceip: type: str - description: 'Set source IP address in case of in-band managament + description: 'Set source IP address in case of in-band management. ' cvsourceintf: type: str - description: 'Set source interface in case of in-band managament. Available + description: 'Set source interface in case of in-band management. Available as of TerminAttr v1.23.0. The interface name is case sensitive and has to match the interface @@ -1137,14 +1101,14 @@ keys: ' cvvrf: type: str - description: 'The VRF to use to connect to CloudVision + description: 'The VRF to use to connect to CloudVision. ' convert_types: - int cvauth: type: dict - description: 'Authentication scheme used to connect to CloudVision + description: 'Authentication scheme used to connect to CloudVision. ' keys: @@ -1159,35 +1123,35 @@ keys: type: str token_file: type: str - description: 'Token file path + description: 'Token file path. e.g. "/tmp/token" ' cert_file: type: str - description: 'Client certificate file path + description: 'Client certificate file path. e.g. "/persist/secure/ssl/terminattr/primary/certs/client.crt" ' ca_file: type: str - description: 'CA certificate file path (on-prem only) + description: 'CA certificate file path (on-prem only). e.g. "/persist/secure/ssl/terminattr/primary/certs/ca.crt" ' key_file: type: str - description: 'Client certificate key file path + description: 'Client certificate key file path. e.g. "/persist/secure/ssl/terminattr/primary/keys/client.key" ' cvobscurekeyfile: type: bool - description: 'Encrypt the private key used for authentication to CloudVision + description: 'Encrypt the private key used for authentication to CloudVision. ' cvproxy: @@ -1196,17 +1160,17 @@ keys: when the CloudVision server is hosted in the cloud. The expected form is http://[user:password@]ip:port, e.g.: `http://arista:arista@10.83.12.78:3128`. - Available as of TerminAttr v1.13.0 + Available as of TerminAttr v1.13.0. ' cvsourceip: type: str - description: 'Set source IP address in case of in-band managament + description: 'Set source IP address in case of in-band management. ' cvsourceintf: type: str - description: 'Set source interface in case of in-band managament. + description: 'Set source interface in case of in-band management. The interface name is case sensitive and has to match the interface name in the running-config, e.g.:Vlan100. @@ -1214,7 +1178,7 @@ keys: ' cvvrf: type: str - description: 'The VRF to use to connect to CloudVision + description: 'The VRF to use to connect to CloudVision. ' convert_types: @@ -1222,7 +1186,7 @@ keys: cvgnmi: type: bool description: 'Stream states from EOS gNMI servers (Openconfig) to CloudVision. - Available as of TerminAttr v1.13.1 + Available as of TerminAttr v1.13.1. ' disable_aaa: @@ -1230,19 +1194,19 @@ keys: description: 'Disable AAA authorization and accounting. When setting this flag, all commands pushed from CloudVision are applied - directly to the CLI without authorization + directly to the CLI without authorization. ' grpcaddr: type: str - description: 'Set the gRPC server address, the default is 127.0.0.1:6042 + description: 'Set the gRPC server address, the default is 127.0.0.1:6042. e.g. "MGMT/0.0.0.0:6042" ' grpcreadonly: type: bool - description: 'gNMI read-only mode - Disable gnmi.Set() + description: 'gNMI read-only mode - Disable gnmi.Set(). ' ingestexclude: @@ -1270,7 +1234,7 @@ keys: ecodhcpaddr: type: str description: 'ECO DHCP Collector address or ECO DHCP Fingerprint listening - address in standalone mode (default "127.0.0.1:67") + address in standalone mode (default "127.0.0.1:67"). ' ipfix: @@ -1328,11 +1292,11 @@ keys: keys: name: type: str - description: Daemon Name + description: Daemon Name. exec: type: str required: true - description: 'command to run as a daemon + description: 'command to run as a daemon. ' enabled: @@ -1345,7 +1309,7 @@ keys: type: list items: type: str - description: Server IP or Hostname + description: Server IP or Hostname. tunnel_requests_disabled: type: bool mlag_peerlink_requests_disabled: @@ -1368,6 +1332,35 @@ keys: type: str dns_domain_name_ipv6: type: str + dns_servers_ipv4: + type: list + min_length: 1 + description: List of DNS servers for IPv4 clients. + items: + type: str + required: true + description: IPv4 address of DNS server. + dns_servers_ipv6: + type: list + min_length: 1 + description: List of DNS servers for IPv6 clients. + items: + type: str + required: true + description: IPv6 address of DNS server. + tftp_server: + type: dict + keys: + file_ipv4: + type: str + min_length: 1 + max_length: 255 + description: Name of TFTP file for IPv4 clients. + file_ipv6: + type: str + min_length: 1 + max_length: 255 + description: Name of TFTP file for IPv6 clients. ipv4_vendor_options: type: list primary_key: vendor_id @@ -1476,13 +1469,13 @@ keys: - str dns_domain: type: str - description: Domain Name + description: Domain Name. domain_list: type: list - description: Search list of DNS domains + description: Search list of DNS domains. items: type: str - description: Domain name + description: Domain name. dot1x: type: dict display_name: Global 802.1x Authentication @@ -1627,6 +1620,80 @@ keys: type: bool recovery_action_reauthenticate: type: bool + accounting_update_interval: + type: int + convert_types: + - str + min: 5 + max: 65535 + description: Interval period in seconds. + captive_portal: + type: dict + description: Web authentication feature authenticates a supplicant through + a web page, referred to as a captive portal. + keys: + enabled: + type: bool + required: true + url: + type: str + description: "Supported URL type:\n - http: http://[:]\n + \ - https: https://[:]" + ssl_profile: + type: str + start_limit_infinite: + type: bool + description: Set captive-portal start limit to infinte. + access_list_ipv4: + type: str + description: Standard access-list name. + supplicant: + type: dict + keys: + profiles: + description: Dot1x supplicant profiles. + type: list + primary_key: name + items: + type: dict + keys: + name: + type: str + eap_method: + type: str + description: "Extensible Authentication Protocol method:\n - EAP + Flexible Authentication via Secure Tunneling.\n - EAP with Transport + Layer Security." + valid_values: + - fast + - tls + identity: + type: str + description: User identity. + passphrase_type: + type: str + convert_types: + - int + valid_values: + - '0' + - '7' + - 8a + default: '7' + passphrase: + type: str + description: Extensible Authentication Protocol password. + ssl_profile: + type: str + logging: + type: bool + description: Enable supplicant logging. + disconnect_cached_results_timeout: + type: int + convert_types: + - str + min: 60 + max: 65535 + description: Timeout in seconds for removing a disconnected supplicant. dps_interfaces: type: list primary_key: name @@ -1697,19 +1764,19 @@ keys: keys: name: type: str - description: Dynamic prefix-list name + description: Dynamic prefix-list name. match_map: type: str - description: Route-map name + description: Route-map name. prefix_list: type: dict keys: ipv4: type: str - description: Prefix-list name + description: Prefix-list name. ipv6: type: str - description: Prefix-list name + description: Prefix-list name. enable_password: type: dict keys: @@ -1729,14 +1796,14 @@ keys: eos_cli: type: str description: Multiline string with EOS CLI rendered directly on the root level - of the final EOS configuration + of the final EOS configuration. eos_cli_config_gen_configuration: type: dict keys: hide_passwords: type: bool description: 'Replace the input data using the `hide_passwords` filter in - the Jinja2 templates by '''' in the configruation if true + the Jinja2 templates by '''' in the configuration if true. ' default: false @@ -1746,7 +1813,7 @@ keys: hide_passwords: type: bool description: 'Replace the input data using the `hide_passwords` filter in - the Jinja2 templates by '''' in the documentation if true + the Jinja2 templates by '''' in the documentation if true. ' default: true @@ -1798,7 +1865,7 @@ keys: type: int convert_types: - str - description: Interval in seconds + description: Interval in seconds. default: 300 min: 30 max: 86400 @@ -1822,7 +1889,7 @@ keys: max: 600 convert_types: - str - description: Interval in seconds for updating interface counters" + description: Interval in seconds for updating interface counters. speed: type: str description: Speed should be set in the format `` or `forced @@ -1840,7 +1907,7 @@ keys: convert_types: - str description: '"l2_mtu" should only be defined for platforms supporting the - "l2 mtu" CLI + "l2 mtu" CLI. ' l2_mru: @@ -1850,18 +1917,18 @@ keys: convert_types: - str description: '"l2_mru" should only be defined for platforms supporting the - "l2 mru" CLI + "l2 mru" CLI. ' vlans: type: str convert_types: - int - description: 'List of switchport vlans as string + description: 'List of switchport vlans as string. - For a trunk port this would be a range like "1-200,300" + For a trunk port this would be a range like "1-200,300". - For an access port this would be a single vlan "123" + For an access port this would be a single vlan "123". ' native_vlan: @@ -1871,7 +1938,7 @@ keys: native_vlan_tag: type: bool description: If setting both native_vlan and native_vlan_tag, native_vlan_tag - takes precedence + takes precedence. mode: type: str valid_values: @@ -1902,10 +1969,10 @@ keys: type: int convert_types: - str - description: Vlan tag to configure on sub-interface + description: Vlan tag to configure on sub-interface. forwarding_profile: type: str - description: L2 protocol forwarding profile + description: L2 protocol forwarding profile. trunk_groups: type: list items: @@ -1932,10 +1999,10 @@ keys: keys: ipv4: type: bool - description: Enable address locking for IPv4 + description: Enable address locking for IPv4. ipv6: type: bool - description: Enable address locking for IPv6 + description: Enable address locking for IPv6. flowcontrol: type: dict keys: @@ -1947,7 +2014,7 @@ keys: - 'off' vrf: type: str - description: VRF name + description: VRF name. convert_types: - int flow_tracker: @@ -1977,7 +2044,7 @@ keys: keys: name: type: str - description: Group name + description: Group name. direction: type: str valid_values: @@ -1988,7 +2055,7 @@ keys: keys: identifier: type: str - description: EVPN Ethernet Segment Identifier (Type 1 format) + description: EVPN Ethernet Segment Identifier (Type 1 format). redundancy: type: str valid_values: @@ -2008,10 +2075,10 @@ keys: max: 65535 convert_types: - str - description: Preference_value is only used when "algorithm" is "preference" + description: Preference_value is only used when "algorithm" is "preference". dont_preempt: type: bool - description: Dont_preempt is only used when "algorithm" is "preference" + description: Dont_preempt is only used when "algorithm" is "preference". hold_time: type: int convert_types: @@ -2037,12 +2104,12 @@ keys: - str route_target: type: str - description: EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx + description: EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx. encapsulation_dot1q_vlan: type: int convert_types: - str - description: VLAN tag to configure on sub-interface + description: VLAN tag to configure on sub-interface. encapsulation_vlan: type: dict keys: @@ -2056,23 +2123,23 @@ keys: type: int convert_types: - str - description: Client VLAN ID + description: Client VLAN ID. outer: type: int convert_types: - str - description: Client Outer VLAN ID + description: Client Outer VLAN ID. inner: type: int convert_types: - str - description: Client Inner VLAN ID + description: Client Inner VLAN ID. unmatched: type: bool network: type: dict description: Network encapsulations are all optional and skipped if - using client unmatched + using client unmatched. keys: dot1q: type: dict @@ -2081,17 +2148,17 @@ keys: type: int convert_types: - str - description: Network VLAN ID + description: Network VLAN ID. outer: type: int convert_types: - str - description: Network outer VLAN ID + description: Network outer VLAN ID. inner: type: int convert_types: - str - description: Network inner VLAN ID + description: Network inner VLAN ID. client: type: bool vlan_id: @@ -2102,7 +2169,7 @@ keys: - str ip_address: type: str - description: IPv4 address/mask or "dhcp" + description: IPv4 address/mask or "dhcp". ip_address_secondaries: type: list items: @@ -2114,7 +2181,7 @@ keys: - rx dhcp_client_accept_default_route: type: bool - description: Install default-route obtained via DHCP + description: Install default-route obtained via DHCP. dhcp_server_ipv4: type: bool description: Enable IPv4 DHCP server. @@ -2133,10 +2200,10 @@ keys: type: str source_interface: type: str - description: Source interface name + description: Source interface name. vrf: type: str - description: VRF name + description: VRF name. convert_types: - int ip_nat: @@ -2152,7 +2219,7 @@ keys: type: str ipv6_address_link_local: type: str - description: Link local IPv6 address/mask + description: Link local IPv6 address/mask. ipv6_nd_ra_disabled: type: bool ipv6_nd_managed_config_flag: @@ -2171,12 +2238,12 @@ keys: type: str convert_types: - int - description: Infinite or lifetime in seconds + description: Infinite or lifetime in seconds. preferred_lifetime: type: str convert_types: - int - description: Infinite or lifetime in seconds + description: Infinite or lifetime in seconds. no_autoconfig_flag: type: bool ipv6_dhcp_relay_destinations: @@ -2187,7 +2254,7 @@ keys: keys: address: type: str - description: DHCP server's IPv6 address + description: DHCP server's IPv6 address. vrf: type: str convert_types: @@ -2195,37 +2262,37 @@ keys: local_interface: type: str description: Local interface to communicate with DHCP server - mutually - exclusive to source_address + exclusive to source_address. source_address: type: str description: Source IPv6 address to communicate with DHCP server - - mutually exclusive to local_interface + mutually exclusive to local_interface. link_address: type: str description: Override the default link address specified in the relayed - DHCP packet + DHCP packet. access_group_in: type: str - description: Access list name + description: Access list name. access_group_out: type: str - description: Access list name + description: Access list name. ipv6_access_group_in: type: str - description: IPv6 access list name + description: IPv6 access list name. ipv6_access_group_out: type: str - description: IPv6 access list name + description: IPv6 access list name. mac_access_group_in: type: str - description: MAC access list name + description: MAC access list name. mac_access_group_out: type: str - description: MAC access list name + description: MAC access list name. multicast: type: dict description: Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix - but not combination of both + but not combination of both. keys: ipv4: type: dict @@ -2237,7 +2304,7 @@ keys: keys: boundary: type: str - description: ACL name or multicast IP subnet + description: ACL name or multicast IP subnet. out: type: bool static: @@ -2252,7 +2319,7 @@ keys: keys: boundary: type: str - description: ACL name or multicast IP subnet + description: ACL name or multicast IP subnet. static: type: bool ospf_network_point_to_point: @@ -2273,7 +2340,7 @@ keys: - message-digest ospf_authentication_key: type: str - description: Encrypted password - only type 7 supported + description: Encrypted password - only type 7 supported. ospf_message_digest_keys: type: list primary_key: id @@ -2296,7 +2363,7 @@ keys: - sha512 key: type: str - description: Encrypted password - only type 7 supported + description: Encrypted password - only type 7 supported. pim: type: dict keys: @@ -2342,6 +2409,31 @@ keys: keys: profile: type: str + tcp_mss_ceiling: + type: dict + description: 'The TCP MSS clamping feature involves clamping the maximum + segment size (MSS) in the TCP header + + of TCP SYN packets if it exceeds the configured MSS ceiling limit for + the interface.' + keys: + ipv4_segment_size: + type: int + convert_types: + - str + min: 64 + max: 65475 + ipv6_segment_size: + type: int + convert_types: + - str + min: 64 + max: 65475 + direction: + type: str + valid_values: + - egress + - ingress channel_group: type: dict keys: @@ -2357,7 +2449,10 @@ keys: - passive isis_enable: type: str - description: ISIS instance + description: ISIS instance. + isis_bfd: + type: bool + description: Enable BFD for ISIS. isis_passive: type: bool isis_metric: @@ -2381,7 +2476,7 @@ keys: - md5 isis_authentication_key: type: str - description: Type-7 encrypted password + description: Type-7 encrypted password. poe: type: dict keys: @@ -2398,10 +2493,10 @@ keys: - medium - low description: Prioritize a port's power in the event that one of the - switch's power supplies loses power + switch's power supplies loses power. reboot: description: Set the PoE power behavior for a PoE port when the system - is rebooted + is rebooted. type: dict keys: action: @@ -2409,10 +2504,10 @@ keys: valid_values: - maintain - power-off - description: PoE action for interface + description: PoE action for interface. link_down: description: Set the PoE power behavior for a PoE port when the port - goes down + goes down. type: dict keys: action: @@ -2420,7 +2515,7 @@ keys: valid_values: - maintain - power-off - description: PoE action for interface + description: PoE action for interface. power_off_delay: type: int min: 1 @@ -2431,7 +2526,7 @@ keys: a link down event occurs. Default value is 5 seconds in EOS. shutdown: description: Set the PoE power behavior for a PoE port when the port - is admin down + is admin down. type: dict keys: action: @@ -2439,7 +2534,7 @@ keys: valid_values: - maintain - power-off - description: PoE action for interface + description: PoE action for interface. limit: type: dict description: Override the hardware-negotiated power limit using either @@ -2460,7 +2555,7 @@ keys: - float fixed: type: bool - description: Set to ignore hardware classification + description: Set to ignore hardware classification. negotiation_lldp: type: bool description: Disable to prevent port from negotiating power with powered @@ -2510,7 +2605,7 @@ keys: type: str convert_types: - int - description: VLAN can be 'all' or list of vlans as string + description: VLAN can be 'all' or list of vlans as string. transport: type: str valid_values: @@ -2519,7 +2614,7 @@ keys: - layer2 profile: type: str - description: Interface profile + description: Interface profile. storm_control: type: dict keys: @@ -2531,14 +2626,14 @@ keys: convert_types: - int - float - description: Configure maximum storm-control level + description: Configure maximum storm-control level. unit: type: str default: percent valid_values: - percent - pps - description: Optional field and is hardware dependent + description: Optional field and is hardware dependent. broadcast: type: dict keys: @@ -2547,14 +2642,14 @@ keys: convert_types: - int - float - description: Configure maximum storm-control level + description: Configure maximum storm-control level. unit: type: str default: percent valid_values: - percent - pps - description: Optional field and is hardware dependent + description: Optional field and is hardware dependent. multicast: type: dict keys: @@ -2563,14 +2658,14 @@ keys: convert_types: - int - float - description: Configure maximum storm-control level + description: Configure maximum storm-control level. unit: type: str default: percent valid_values: - percent - pps - description: Optional field and is hardware dependent + description: Optional field and is hardware dependent. unknown_unicast: type: dict keys: @@ -2579,14 +2674,14 @@ keys: convert_types: - int - float - description: Configure maximum storm-control level + description: Configure maximum storm-control level. unit: type: str default: percent valid_values: - percent - pps - description: Optional field and is hardware dependent + description: Optional field and is hardware dependent. logging: type: dict keys: @@ -2615,14 +2710,14 @@ keys: type: int convert_types: - str - description: ZTP vlan number + description: ZTP vlan number. trunk_private_vlan_secondary: type: bool pvlan_mapping: type: str convert_types: - int - description: List of vlans as string + description: List of vlans as string. vlan_translations: type: list items: @@ -2633,12 +2728,12 @@ keys: convert_types: - int description: List of vlans as string (only one vlan if direction is - "both") + "both"). to: type: int convert_types: - str - description: VLAN ID + description: VLAN ID. direction: type: str valid_values: @@ -2718,7 +2813,7 @@ keys: type: str convert_types: - int - description: Value can be 60-4294967295 or 'server' + description: Value can be 60-4294967295 or 'server'. reauth_timeout_ignore: type: bool tx_period: @@ -2758,15 +2853,15 @@ keys: - str service_profile: type: str - description: QOS profile + description: QOS profile. shape: type: dict keys: rate: type: str - description: 'Rate in kbps, pps or percent + description: 'Rate in kbps, pps or percent. - Supported options are platform dependent + Supported options are platform dependent. Examples: @@ -2790,12 +2885,12 @@ keys: type: int convert_types: - str - description: DSCP value + description: DSCP value. cos: type: int convert_types: - str - description: COS value + description: COS value. spanning_tree_bpdufilter: type: str convert_types: @@ -2859,12 +2954,12 @@ keys: type: int convert_types: - str - description: Interval in milliseconds + description: Interval in milliseconds. min_rx: type: int convert_types: - str - description: Rate in milliseconds + description: Rate in milliseconds. multiplier: type: int min: 3 @@ -2879,14 +2974,14 @@ keys: keys: input: type: str - description: Policy Based Routing Policy-map name + description: Policy Based Routing Policy-map name. qos: type: dict keys: input: type: str required: true - description: Quality of Service Policy-map name + description: Quality of Service Policy-map name. mpls: type: dict keys: @@ -2922,12 +3017,24 @@ keys: transceiver: type: dict keys: + frequency: + type: str + convert_types: + - int + - float + description: Transceiver Laser Frequency in GHz (min 190000, max 200000). + frequency_unit: + type: str + required: false + valid_values: + - ghz + description: Unit of Transceiver Laser Frequency. media: type: dict keys: override: type: str - description: Transceiver type + description: Transceiver type. ip_proxy_arp: type: bool traffic_policy: @@ -2935,16 +3042,16 @@ keys: keys: input: type: str - description: Ingress traffic policy + description: Ingress traffic policy. output: type: str - description: Egress traffic policy + description: Egress traffic policy. bgp: type: dict keys: session_tracker: type: str - description: Name of session tracker + description: Name of session tracker. ip_igmp_host_proxy: type: dict keys: @@ -3004,13 +3111,13 @@ keys: description: IGMP version on IGMP host-proxy interface. peer: type: str - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. peer_interface: type: str - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. peer_type: type: str - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. sflow: type: dict keys: @@ -3025,7 +3132,7 @@ keys: type: bool port_profile: type: str - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. uc_tx_queues: type: list primary_key: id @@ -3039,17 +3146,17 @@ keys: convert_types: - str required: true - description: TX-Queue ID + description: TX-Queue ID. random_detect: type: dict keys: ecn: - description: Explicit Congestion Notification + description: Explicit Congestion Notification. type: dict keys: count: type: bool - description: Enable counter for random-detect ECNs + description: Enable counter for random-detect ECNs. threshold: type: dict keys: @@ -3063,7 +3170,7 @@ keys: - mbytes - milliseconds description: Indicate the units to be used for the threshold - values + values. min: type: int required: true @@ -3071,7 +3178,7 @@ keys: max: 256000000 convert_types: - str - description: Set the random-detect ECN minimum-threshold + description: Set the random-detect ECN minimum-threshold. max: type: int required: true @@ -3079,21 +3186,21 @@ keys: - str min: 1 max: 256000000 - description: Set the random-detect ECN maximum-threshold + description: Set the random-detect ECN maximum-threshold. max_probability: type: int min: 1 max: 100 convert_types: - str - description: Set the random-detect ECN max-mark-probability + description: Set the random-detect ECN max-mark-probability. weight: type: int min: 0 max: 15 convert_types: - str - description: Set the random-detect ECN weight + description: Set the random-detect ECN weight. tx_queues: type: list primary_key: id @@ -3107,17 +3214,17 @@ keys: convert_types: - str required: true - description: TX-Queue ID + description: TX-Queue ID. random_detect: type: dict keys: ecn: - description: Explicit Congestion Notification + description: Explicit Congestion Notification. type: dict keys: count: type: bool - description: Enable counter for random-detect ECNs + description: Enable counter for random-detect ECNs. threshold: type: dict keys: @@ -3131,14 +3238,14 @@ keys: - mbytes - milliseconds description: Indicate the units to be used for the threshold - values + values. min: type: int min: 1 max: 256000000 convert_types: - str - description: Set the random-detect ECN minimum-threshold + description: Set the random-detect ECN minimum-threshold. max: type: int required: true @@ -3146,7 +3253,7 @@ keys: - str min: 1 max: 256000000 - description: Set the random-detect ECN maximum-threshold + description: Set the random-detect ECN maximum-threshold. max_probability: type: int required: true @@ -3154,14 +3261,14 @@ keys: max: 100 convert_types: - str - description: Set the random-detect ECN max-mark-probability + description: Set the random-detect ECN max-mark-probability. weight: type: int min: 0 max: 15 convert_types: - str - description: Set the random-detect ECN weight + description: Set the random-detect ECN weight. vrrp_ids: type: list description: VRRP model. @@ -3173,12 +3280,12 @@ keys: type: int convert_types: - str - description: VRID + description: VRID. priority_level: type: int convert_types: - str - description: Instance priority + description: Instance priority. min: 1 max: 254 advertisement: @@ -3188,7 +3295,7 @@ keys: type: int convert_types: - str - description: Interval in seconds + description: Interval in seconds. min: 1 max: 255 preempt: @@ -3204,14 +3311,14 @@ keys: type: int convert_types: - str - description: Minimum preempt delay in seconds + description: Minimum preempt delay in seconds. min: 0 max: 3600 reload: type: int convert_types: - str - description: Reload preempt delay in seconds + description: Reload preempt delay in seconds. min: 0 max: 3600 timers: @@ -3235,14 +3342,14 @@ keys: keys: name: type: str - description: Tracked object name + description: Tracked object name. decrement: type: int convert_types: - str min: 1 max: 254 - description: Decrement VRRP priority by 1-254 + description: Decrement VRRP priority by 1-254. shutdown: type: bool ipv4: @@ -3251,7 +3358,7 @@ keys: address: type: str required: true - description: Virtual IPv4 address + description: Virtual IPv4 address. version: type: int convert_types: @@ -3265,11 +3372,11 @@ keys: address: type: str required: true - description: Virtual IPv6 address + description: Virtual IPv6 address. validate_state: type: bool description: Set to false to disable interface validation by the `eos_validate_state` - role + role. switchport: type: dict keys: @@ -3335,7 +3442,7 @@ keys: eos_cli: type: str description: Multiline EOS CLI rendered directly on the ethernet interface - in the final EOS configuration + in the final EOS configuration. event_handlers: type: list description: 'Gives the ability to monitor and react to Syslog messages. @@ -3355,23 +3462,48 @@ keys: keys: name: type: str - description: Event Handler Name + description: Event Handler Name. action_type: type: str valid_values: - bash - increment - log + deprecation: + warning: true + removed: false + remove_in_version: 5.0.0 + new_key: event_handlers.actions action: type: str - description: 'Command to execute + description: 'Command to execute. ' + deprecation: + warning: true + removed: false + remove_in_version: 5.0.0 + new_key: event_handlers.actions + actions: + type: dict + description: 'Note: `bash_command` and `log` are mutually exclusive. `bash_command` + takes precedence over `log`.' + keys: + bash_command: + type: str + description: Define BASH command action. Command could be multiline + also. + log: + type: bool + description: Log a message when the event is triggered. + increment_device_health_metric: + type: str + description: Name of device-health metric. delay: type: int convert_types: - str - description: 'Event-handler delay in seconds + description: 'Event-handler delay in seconds. ' trigger: @@ -3381,9 +3513,67 @@ keys: ' valid_values: - on-boot + - on-counters + - on-intf - on-logging - - on-startup-config - on-maintenance + - on-startup-config + - vm-tracer vm + trigger_on_counters: + type: dict + keys: + condition: + type: str + description: Set the logical expression to evaluate. + granularity_per_source: + type: bool + description: "Set the granularity of event counting for a wildcarded + condition.\nExample -\n condition ( Arad*.IptCrcErrCnt.delta > 100 + ) and ( Arad*.UcFifoFullDrop.delta > 100 )\n [* wildcard is used + here]" + poll_interval: + type: int + convert_types: + - str + min: 1 + max: 1000000 + description: Set the polling interval in seconds. + trigger_on_logging: + type: dict + keys: + poll_interval: + type: int + convert_types: + - str + min: 1 + max: 1000000 + description: Set the polling interval in seconds. + regex: + type: str + description: Regular expression to use for searching log messages. + trigger_on_intf: + type: dict + description: 'Trigger condition occurs on specified interface changes. + + Note: Any one of the `ip`, `ipv6` and `operstatus` key needs to be defined + along with the `interface`.' + keys: + interface: + type: str + required: true + description: "Interface name.\nExample - Ethernet4\n Loopback4-6\n + \ Port-channel4,7" + ip: + type: bool + description: Action is triggered upon changes to interface IP address + assignment. + ipv6: + type: bool + description: Action is triggered upon changes to interface ipv6 address + assignment. + operstatus: + type: bool + description: Action is triggered upon changes to interface operStatus. trigger_on_maintenance: description: Settings required for trigger 'on-maintenance'. type: dict @@ -3431,8 +3621,13 @@ keys: of specified unit regex: type: str + deprecation: + warning: true + removed: false + remove_in_version: 5.0.0 + new_key: event_handlers.trigger_on_logging.regex description: 'Regular expression to use for searching log messages. Required - for on-logging trigger + for on-logging trigger. ' asynchronous: @@ -3529,7 +3724,7 @@ keys: type: str valid_values: - sampled - description: Flow Tracking Type - only 'sampled' supported for now + description: Flow Tracking Type - only 'sampled' supported for now. sample: type: int convert_types: @@ -3544,7 +3739,7 @@ keys: keys: name: type: str - description: Tracker Name + description: Tracker Name. record_export: type: dict keys: @@ -3554,17 +3749,17 @@ keys: - str min: 3000 max: 900000 - description: Flow record inactive export timeout in milliseconds + description: Flow record inactive export timeout in milliseconds. on_interval: type: int convert_types: - str min: 1000 max: 36000000 - description: Flow record export interval in milliseconds + description: Flow record export interval in milliseconds. mpls: type: bool - description: Export MPLS forwarding information + description: Export MPLS forwarding information. exporters: type: list primary_key: name @@ -3573,17 +3768,17 @@ keys: keys: name: type: str - description: Exporter Name + description: Exporter Name. collector: type: dict keys: host: type: str description: Collector IPv4 address or IPv6 address or fully - qualified domain name + qualified domain name. port: type: int - description: Collector Port Number + description: Collector Port Number. min: 1 max: 65535 convert_types: @@ -3597,14 +3792,14 @@ keys: - str local_interface: type: str - description: Local Source Interface + description: Local Source Interface. template_interval: type: int convert_types: - str min: 5000 max: 3600000 - description: Template interval in milliseconds + description: Template interval in milliseconds. table_size: type: int convert_types: @@ -3672,7 +3867,7 @@ keys: - int serdes: type: str - description: Serdes speed like "10g" or "25g" + description: Serdes speed like "10g" or "25g". hardware_counters: type: dict keys: @@ -3683,7 +3878,7 @@ keys: of valid_values which MUST be updated to support\nnew feature as they are released in EOS.\n\nThe available values of the different keys like 'direction' or 'address_type'\nare feature and hardware dependent and this model DOES - NOT validate that the\ncombinations are valid. It is the responsability + NOT validate that the\ncombinations are valid. It is the responsibility of the user of this data model\nto make sure that the rendered CLI is accepted by the targeted device.\n\nExamples:\n\n * Use:\n ```yaml\n hardware_counters:\n \ features:\n - name: ip\n direction: out\n layer3: @@ -3718,6 +3913,7 @@ keys: - qos dual-rate-policer - route - routed-port + - segment-security - subinterface - tapagg - traffic-class @@ -3761,7 +3957,7 @@ keys: ' layer3: type: bool - description: 'Supported only for the ''ip'' feature + description: 'Supported only for the ''ip'' feature. ' vrf: @@ -3809,22 +4005,22 @@ keys: keys: name: type: str - description: Interface-Group name + description: Interface-Group name. interfaces: type: list items: type: str - description: Interface Name + description: Interface Name. bgp_maintenance_profiles: type: list items: type: str - description: Name of BGP Maintenance Profile + description: Name of BGP Maintenance Profile. interface_maintenance_profiles: type: list items: type: str - description: Name of Interface Maintenance Profile + description: Name of Interface Maintenance Profile. interface_profiles: type: list primary_key: name @@ -3835,13 +4031,13 @@ keys: keys: name: type: str - description: Interface-Profile Name + description: Interface-Profile Name. commands: type: list required: true items: type: str - description: 'EOS CLI interface command + description: 'EOS CLI interface command. Example: "switchport mode access" @@ -3951,7 +4147,7 @@ keys: description: Log matches against this rule. ttl: type: int - description: TTL value + description: TTL value. convert_types: - str min: 0 @@ -4008,7 +4204,7 @@ keys: - dict display_name: IP Community Lists description: 'Communities and regexp entries MUST not be configured in the same - community-list + community-list. ' items: @@ -4016,7 +4212,7 @@ keys: keys: name: type: str - description: IP Community-list Name + description: IP Community-list Name. entries: type: list required: true @@ -4054,17 +4250,24 @@ keys: ' regexp: type: str - description: 'Regular Expression + description: 'Regular Expression. - If defined, a regex community-list will be configured + If defined, a regex community-list will be configured. ' ip_dhcp_relay: type: dict keys: + always_on: + type: bool + description: DhcpRelay Agent will be in always-on mode. + all_subnets: + type: bool + description: Allow forwarding requests with secondary IP addresses in the + gateway address "giaddr" field. information_option: type: bool - description: Insert Option-82 information + description: Insert Option-82 information. ip_dhcp_snooping: type: dict keys: @@ -4077,12 +4280,12 @@ keys: keys: enabled: type: bool - description: Enable insertion of option-82 in DHCP request packets + description: Enable insertion of option-82 in DHCP request packets. circuit_id_type: type: str convert_types: - int - description: '"none" or <0 - 255>' + description: '"none" or <0 - 255>.' circuit_id_format: type: str description: 'Required if `circuit_id_type` is set. @@ -4115,7 +4318,7 @@ keys: keys: name: type: str - description: 'Source Interface + description: 'Source Interface. ' vrf: @@ -4134,7 +4337,7 @@ keys: keys: name: type: str - description: Community-list Name + description: Community-list Name. entries: type: list required: true @@ -4150,7 +4353,7 @@ keys: extcommunities: type: str required: true - description: 'Communities as string + description: 'Communities as string. Example: "65000:65000" @@ -4167,7 +4370,7 @@ keys: keys: name: type: str - description: Community-list Name + description: Community-list Name. entries: type: list required: true @@ -4183,7 +4386,7 @@ keys: regexp: type: str required: true - description: Regular Expression + description: Regular Expression. ip_ftp_client_source_interfaces: type: list items: @@ -4192,10 +4395,10 @@ keys: name: type: str required: true - description: Interface Name + description: Interface Name. vrf: type: str - description: VRF Name + description: VRF Name. ip_hardware: type: dict keys: @@ -4219,7 +4422,7 @@ keys: type: dict keys: name: - description: Interface Name + description: Interface Name. type: str vrf: type: str @@ -4256,7 +4459,7 @@ keys: type: bool address: type: str - description: IP Address + description: IP Address. query_interval: type: int convert_types: @@ -4299,7 +4502,7 @@ keys: type: int convert_types: - str - description: VLAN ID + description: VLAN ID. enabled: type: bool querier: @@ -4309,7 +4512,7 @@ keys: type: bool address: type: str - description: IP Address + description: IP Address. query_interval: type: int convert_types: @@ -4347,7 +4550,7 @@ keys: proxy: type: bool description: 'Global proxy settings should be enabled before enabling - per-vlan + per-vlan. ' ip_name_servers: @@ -4357,14 +4560,14 @@ keys: keys: ip_address: type: str - description: IPv4 or IPv6 address for DNS server + description: IPv4 or IPv6 address for DNS server. vrf: - description: VRF Name + description: VRF Name. type: str convert_types: - int priority: - description: Priority value (lower is first) + description: Priority value (lower is first). type: int convert_types: - str @@ -4379,7 +4582,7 @@ keys: - str min: 1 max: 64 - description: Buffer size in MB + description: Buffer size in MB. profiles: type: list primary_key: name @@ -4402,13 +4605,19 @@ keys: keys: name: type: str + type: + type: str + valid_values: + - ip-port + - port-only + default: ip-port prefix_length: type: int - required: true convert_types: - str min: 16 max: 32 + description: It is only used and required when `type` is `ip-port`. ranges: type: list items: @@ -4416,12 +4625,16 @@ keys: keys: first_ip: type: str - required: true - description: IPv4 address + description: 'IPv4 address. + + Required when `type` is `ip-port` and ignored otherwise.' last_ip: type: str - required: true - description: IPv4 address + description: 'IPv4 address. + + Required when `type` is `ip-port` and ignored otherwise. + + `first_ip` and `last_ip` ip addresses should lie in same subnet.' first_port: type: int convert_types: @@ -4434,6 +4647,9 @@ keys: - str min: 1 max: 65535 + description: 'Required when `first_port` is set. + + `last_port` must be greater than or equal to `first_port`.' utilization_log_threshold: type: int convert_types: @@ -4451,13 +4667,13 @@ keys: - str min: 60 max: 3600 - description: in seconds + description: In seconds. local_interface: type: str - description: EOS interface name + description: EOS interface name. peer_address: type: str - description: IPv4 address + description: IPv4 address. port_range: type: dict keys: @@ -4473,7 +4689,7 @@ keys: - str min: 1024 max: 65535 - description: '>= first_port' + description: '>= first_port.' split_disabled: type: bool shutdown: @@ -4499,7 +4715,7 @@ keys: - str min: 1 max: 99 - description: Used to render 'ip nat translation low-mark ' + description: Used to render 'ip nat translation low-mark '. host_percentage: type: int convert_types: @@ -4507,7 +4723,7 @@ keys: min: 1 max: 99 description: Used to render 'ip nat translation low-mark - host' + host'. max_entries: type: dict keys: @@ -4531,7 +4747,7 @@ keys: keys: ip: type: str - description: IPv4 address + description: IPv4 address. limit: type: int required: true @@ -4557,7 +4773,7 @@ keys: - str min: 0 max: 4294967295 - description: in seconds + description: In seconds. ip_radius_source_interfaces: type: list items: @@ -4565,10 +4781,10 @@ keys: keys: name: type: str - description: Interface Name + description: Interface Name. vrf: type: str - description: VRF Name + description: VRF Name. convert_types: - int ip_routing: @@ -4642,7 +4858,31 @@ keys: name: type: str description: Name of the SA policy. The "null" value is deprecated and - will be removed in AVD 5.0.0 + will be removed in AVD 5.0.0. + sa_lifetime: + type: dict + keys: + value: + type: int + description: 'Lifetime value for this SA. + + Valid range depends on the unit. + + <1-24> Lifetime in hours ( default ) + + <1-4000000> Packet limit in thousands + + <1-6000> Byte limit in GB ( 1024 MB ) + + <1-6144000> Byte limit in MB ( 1024 KB )' + unit: + type: str + valid_values: + - gigabytes + - hours + - megabytes + - thousand-packets + default: hours esp: type: dict keys: @@ -4726,7 +4966,7 @@ keys: max: 3600 action: type: str - description: 'Action to apply + description: 'Action to apply. * ''clear'': Delete all connections @@ -4771,7 +5011,7 @@ keys: type: dict keys: name: - description: Interface Name + description: Interface Name. type: str vrf: type: str @@ -4786,7 +5026,7 @@ keys: keys: name: type: str - description: Interface name + description: Interface name. vrf: type: str display_name: VRF @@ -4800,10 +5040,10 @@ keys: name: type: str required: true - description: Interface Name + description: Interface Name. vrf: type: str - description: VRF Name + description: VRF Name. ip_tftp_client_source_interfaces: type: list items: @@ -4812,13 +5052,13 @@ keys: name: type: str required: true - description: Interface Name + description: Interface Name. vrf: type: str - description: VRF Name + description: VRF Name. ip_virtual_router_mac_address: type: str - description: MAC address (hh:hh:hh:hh:hh:hh) + description: MAC address (hh:hh:hh:hh:hh:hh). ipv6_access_lists: type: list primary_key: name @@ -4830,7 +5070,7 @@ keys: keys: name: type: str - description: IPv6 Access-list Name + description: IPv6 Access-list Name. convert_types: - int counters_per_entry: @@ -4846,17 +5086,41 @@ keys: keys: sequence: type: int - description: Sequence ID + description: Sequence ID. convert_types: - str action: type: str required: true - description: 'Action as string + description: 'Action as string. Example: "deny ipv6 any any" ' + ipv6_dhcp_relay: + type: dict + keys: + always_on: + type: bool + description: DhcpRelay Agent will be in always-on mode, off by default. + all_subnets: + type: bool + description: Allow forwarding requests with additional IPv6 addresses in the + gateway address "giaddr" field. + option: + type: dict + description: Insert DHCP Option. + keys: + link_layer_address: + type: bool + description: Add Option 79 (Link Layer Address Option). + remote_id_format: + type: str + valid_values: + - '%m:%i' + - '%m:%p' + description: Add RemoteID option 37 in format MAC address and interface + ID (`%m:%i`) or MAC address and interface name (`%m:%p`). ipv6_hardware: type: dict keys: @@ -4872,9 +5136,52 @@ keys: profile: type: str description: Pre-defined profile 'internet' or user-defined profile - name + name. ipv6_icmp_redirect: type: bool + ipv6_neighbor: + type: dict + keys: + static_entries: + type: list + description: Static IPv6 neighbor entries. + items: + type: dict + keys: + ipv6_address: + type: str + required: true + description: IPv6 address of neighbor. + vrf: + type: str + interface: + type: str + required: true + description: Interface name. + mac_address: + type: str + required: true + description: MAC address of neighbor like 'aa:af:12:34:bc:bf' + pattern: ^([0-9a-f]{2}:){5}[0-9a-f]{2}$ + persistent: + type: dict + keys: + enabled: + type: bool + required: true + description: Restore the IPv6 neighbor cache after reboot. + refresh_delay: + type: int + description: 'Time to wait in seconds before refreshing the IPv6 neighbor + cache after reboot (EOS default 600). + + It will require setting the `enabled` key to true. + + ' + min: 600 + max: 3600 + convert_types: + - str ipv6_prefix_lists: type: list primary_key: name @@ -4885,7 +5192,7 @@ keys: keys: name: type: str - description: Prefix-list Name + description: Prefix-list Name. sequence_numbers: type: list required: true @@ -4897,13 +5204,13 @@ keys: keys: sequence: type: int - description: Sequence ID + description: Sequence ID. convert_types: - str action: type: str required: true - description: 'Action as string + description: 'Action as string. Example: "permit 1b11:3a00:22b0:0082::/64 eq 128" @@ -4918,7 +5225,7 @@ keys: keys: name: type: str - description: Access-list Name + description: Access-list Name. convert_types: - int counters_per_entry: @@ -4934,13 +5241,13 @@ keys: keys: sequence: type: int - description: Sequence ID + description: Sequence ID. convert_types: - str action: type: str required: true - description: 'Action as string + description: 'Action as string. Example: "deny ipv6 any any" @@ -4956,15 +5263,15 @@ keys: - int destination_address_prefix: type: str - description: IPv6 Network/Mask + description: IPv6 Network/Mask. interface: type: str gateway: type: str - description: IPv6 Address + description: IPv6 Address. track_bfd: type: bool - description: Track next-hop using BFD + description: Track next-hop using BFD. distance: type: int convert_types: @@ -4979,7 +5286,7 @@ keys: max: 4294967295 name: type: str - description: Description + description: Description. metric: type: int convert_types: @@ -4989,7 +5296,7 @@ keys: ipv6_unicast_routing: type: bool is_deployed: - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. type: bool default: true l2_protocol: @@ -5121,7 +5428,7 @@ keys: keys: default: type: int - description: Default load interval in seconds + description: Default load interval in seconds. convert_types: - str local_users: @@ -5133,7 +5440,7 @@ keys: type: dict keys: name: - description: Username + description: Username. type: str disabled: type: bool @@ -5155,12 +5462,12 @@ keys: role: type: str description: 'EOS RBAC Role to be assigned to the user such as "network-admin" - or "network-operator" + or "network-operator". ' sha512_password: type: str - description: 'SHA512 Hash of Password + description: 'SHA512 Hash of Password. Must be the hash of the password. By default EOS salts the password with the username, so the simplest is to generate the hash on an EOS device @@ -5179,7 +5486,7 @@ keys: type: str shell: type: str - description: 'Specify shell for the user + description: 'Specify shell for the user. ' valid_values: @@ -5201,7 +5508,7 @@ keys: - alerts - emergencies - disabled - description: 'Console logging severity level + description: 'Console logging severity level. ' monitor: @@ -5216,7 +5523,7 @@ keys: - alerts - emergencies - disabled - description: 'Monitor logging severity level + description: 'Monitor logging severity level. ' buffered: @@ -5240,7 +5547,7 @@ keys: - notifications - warnings - disabled - description: 'Buffer logging severity level + description: 'Buffer logging severity level. ' trap: @@ -5256,7 +5563,7 @@ keys: - system - warnings - disabled - description: 'Trap logging severity level + description: 'Trap logging severity level. ' synchronous: @@ -5275,7 +5582,7 @@ keys: - notifications - warnings - disabled - description: 'Synchronous logging severity level + description: 'Synchronous logging severity level. ' default: critical @@ -5291,7 +5598,7 @@ keys: - traditional year - traditional timezone year - traditional year timezone - description: Timestamp format + description: Timestamp format. hostname: type: str valid_values: @@ -5301,12 +5608,12 @@ keys: line. (default EOS CLI behaviour). sequence_numbers: type: bool - description: 'Add sequence numbers to log messages + description: 'Add sequence numbers to log messages. ' rfc5424: type: bool - description: 'Forward logs in RFC5424 format + description: 'Forward logs in RFC5424 format. ' facility: @@ -5338,7 +5645,7 @@ keys: - uucp source_interface: type: str - description: Source Interface Name + description: Source Interface Name. vrfs: type: list primary_key: name @@ -5351,10 +5658,10 @@ keys: type: str convert_types: - int - description: VRF name + description: VRF name. source_interface: type: str - description: Source interface name + description: Source interface name. hosts: type: list primary_key: name @@ -5365,7 +5672,7 @@ keys: keys: name: type: str - description: Syslog server name + description: Syslog server name. protocol: type: str valid_values: @@ -5394,7 +5701,7 @@ keys: keys: name: type: str - description: Match list + description: Match list. action: type: str valid_values: @@ -5416,40 +5723,91 @@ keys: - str min: 10 max: 65535 - description: Logging interval in seconds - loopback_interfaces: - type: list - primary_key: name - convert_types: - - dict - items: - type: dict - keys: - name: - type: str - description: Loopback interface name e.g. "Loopback0" - description: - type: str + description: Logging interval in seconds. + level: + type: list + description: Configure logging severity. + primary_key: facility + convert_types: + - dict + items: + type: dict + keys: + facility: + type: str + severity: + type: str + convert_types: + - int + description: 'Severity of facility. Below are the supported severites. + + emergencies System is unusable (severity=0) + + alerts Immediate action needed (severity=1) + + critical Critical conditions (severity=2) + + errors Error conditions (severity=3) + + warnings Warning conditions (severity=4) + + notifications Normal but significant conditions (severity=5) + + informational Informational messages (severity=6) + + debugging Debugging messages (severity=7) + + <0-7> Severity level value' + valid_values: + - alerts + - critical + - debugging + - emergencies + - errors + - informational + - notifications + - warnings + - '0' + - '1' + - '2' + - '3' + - '4' + - '5' + - '6' + - '7' + loopback_interfaces: + type: list + primary_key: name + convert_types: + - dict + items: + type: dict + keys: + name: + type: str + description: Loopback interface name e.g. "Loopback0". + description: + type: str shutdown: type: bool vrf: type: str - description: VRF name + description: VRF name. convert_types: - int ip_address: type: str - description: IPv4_address/Mask + description: IPv4_address/Mask. ip_address_secondaries: type: list items: type: str - description: IPv4_address/Mask + description: IPv4_address/Mask. ipv6_enable: type: bool ipv6_address: type: str - description: IPv6_address/Mask + description: IPv6_address/Mask. ip_proxy_arp: type: bool ospf_area: @@ -5466,7 +5824,10 @@ keys: type: bool isis_enable: type: str - description: ISIS instance name + description: ISIS instance name. + isis_bfd: + type: bool + description: Enable BFD for ISIS. isis_passive: type: bool isis_metric: @@ -5489,7 +5850,7 @@ keys: eos_cli: type: str description: EOS CLI rendered directly on the loopback interface in the - final EOS configuration + final EOS configuration. mac_access_lists: type: list primary_key: name @@ -5500,7 +5861,7 @@ keys: keys: name: type: str - description: MAC Access-list Name + description: MAC Access-list Name. convert_types: - int counters_per_entry: @@ -5521,7 +5882,7 @@ keys: keys: aging_time: type: int - description: Aging time in seconds + description: Aging time in seconds. convert_types: - str notification_host_flap: @@ -5569,7 +5930,7 @@ keys: keys: name: type: str - description: Profile-Name + description: Profile-Name. cipher: type: str valid_values: @@ -5609,7 +5970,7 @@ keys: - str min: 30 max: 100000 - description: Rekey period in seconds + description: Rekey period in seconds. sci: type: bool l2_protocols: @@ -5633,23 +5994,37 @@ keys: valid_values: - bypass - bypass unauthorized + traffic_unprotected: + type: dict + keys: + action: + type: str + required: true + description: Allow/drop the transmit/receive of unprotected traffic. + valid_values: + - allow + - drop + allow_active_sak: + type: bool + description: Allow transmit/receive of encrypted traffic using operational + SAK and block otherwise. maintenance: type: dict display_name: Maintenance Mode keys: default_interface_profile: type: str - description: 'Name of default Interface Profile + description: 'Name of default Interface Profile. ' default_bgp_profile: type: str - description: 'Name of default BGP Profile + description: 'Name of default BGP Profile. ' default_unit_profile: type: str - description: 'Name of default Unit Profile + description: 'Name of default Unit Profile. ' interface_profiles: @@ -5669,14 +6044,14 @@ keys: type: int convert_types: - str - description: 'Load Interval in Seconds + description: 'Load Interval in Seconds. ' threshold: type: int convert_types: - str - description: 'Threshold in kbps + description: 'Threshold in kbps. ' shutdown: @@ -5686,7 +6061,7 @@ keys: type: int convert_types: - str - description: 'Max delay in seconds + description: 'Max delay in seconds. ' bgp_profiles: @@ -5699,13 +6074,13 @@ keys: keys: name: type: str - description: BGP Profile Name + description: BGP Profile Name. initiator: type: dict keys: route_map_inout: type: str - description: Route Map + description: Route Map. unit_profiles: type: list primary_key: name @@ -5716,7 +6091,7 @@ keys: keys: name: type: str - description: Unit Profile Name + description: Unit Profile Name. on_boot: type: dict keys: @@ -5726,7 +6101,7 @@ keys: - str min: 300 max: 3600 - description: 'On-boot in seconds + description: 'On-boot in seconds. ' units: @@ -5739,12 +6114,12 @@ keys: keys: name: type: str - description: Unit Name + description: Unit Name. quiesce: type: bool profile: type: str - description: 'Name of Unit Profile + description: 'Name of Unit Profile. ' groups: @@ -5754,14 +6129,14 @@ keys: type: list items: type: str - description: 'Name of BGP Group + description: 'Name of BGP Group. ' interface_groups: type: list items: type: str - description: 'Name of Interface Group + description: 'Name of Interface Group. ' management_accounts: @@ -5788,13 +6163,13 @@ keys: keys: name: type: str - description: Transport name + description: Transport name. ssl_profile: type: str - description: SSL profile name + description: SSL profile name. vrf: type: str - description: VRF name is optional + description: VRF name is optional. convert_types: - int notification_timestamp: @@ -5817,7 +6192,7 @@ keys: ' ip_access_group: type: str - description: ACL name + description: ACL name. port: type: int description: 'GNMI port. @@ -5836,19 +6211,19 @@ keys: keys: name: type: str - description: Transport name + description: Transport name. shutdown: type: bool - description: Operational status of the gRPC tunnel + description: Operational status of the gRPC tunnel. tunnel_ssl_profile: type: str - description: Tunnel SSL profile name + description: Tunnel SSL profile name. gnmi_ssl_profile: type: str - description: gNMI SSL profile name + description: gNMI SSL profile name. vrf: type: str - description: VRF name + description: VRF name. convert_types: - int destination: @@ -5857,7 +6232,7 @@ keys: address: type: str required: true - description: IP address or hostname + description: IP address or hostname. port: type: int min: 1 @@ -5865,14 +6240,14 @@ keys: required: true convert_types: - str - description: TCP Port + description: TCP Port. local_interface: type: dict keys: name: type: str required: true - description: Interface name + description: Interface name. port: type: int min: 1 @@ -5880,13 +6255,13 @@ keys: required: true convert_types: - str - description: TCP Port + description: TCP Port. target: type: dict keys: use_serial_number: type: bool - description: Use serial number as the Target ID + description: Use serial number as the Target ID. target_ids: type: list description: 'Target IDs as a list. @@ -5911,12 +6286,12 @@ keys: keys: name: type: str - description: VRF name + description: VRF name. convert_types: - int access_group: type: str - description: Standard IPv4 ACL name + description: Standard IPv4 ACL name. octa: type: dict deprecation: @@ -5937,11 +6312,11 @@ keys: enable_https: type: bool https_ssl_profile: - description: SSL Profile Name + description: SSL Profile Name. type: str default_services: type: bool - description: 'Enable default services: capi-doc and tapagg' + description: 'Enable default services: capi-doc and tapagg.' enable_vrfs: type: list primary_key: name @@ -5951,25 +6326,25 @@ keys: type: dict keys: name: - description: VRF Name + description: VRF Name. type: str convert_types: - int access_group: - description: Standard IPv4 ACL name + description: Standard IPv4 ACL name. type: str ipv6_access_group: - description: Standard IPv6 ACL name + description: Standard IPv6 ACL name. type: str protocol_https_certificate: type: dict keys: certificate: type: str - description: Name of certificate; private key must also be specified + description: Name of certificate; private key must also be specified. private_key: type: str - description: Name of private key; certificate must also be specified + description: Name of private key; certificate must also be specified. management_api_models: type: dict keys: @@ -6011,13 +6386,13 @@ keys: type: list items: type: str - description: IP or hostname + description: IP or hostname. source_interface: type: str - description: Interface name + description: Interface name. vrf: type: str - description: VRF Name + description: VRF Name. convert_types: - int management_defaults: @@ -6041,7 +6416,7 @@ keys: keys: name: type: str - description: Management Interface Name + description: Management Interface Name. description: type: str shutdown: @@ -6054,33 +6429,33 @@ keys: type: int vrf: type: str - description: VRF Name + description: VRF Name. convert_types: - int ip_address: type: str - description: IPv4_address/Mask + description: IPv4_address/Mask. ipv6_enable: type: bool ipv6_address: type: str - description: IPv6_address/Mask + description: IPv6_address/Mask. type: type: str valid_values: - oob - inband default: oob - description: For documentation purposes only + description: For documentation purposes only. gateway: type: str - description: IPv4 address of default gateway in management VRF + description: IPv4 address of default gateway in management VRF. ipv6_gateway: type: str - description: IPv6 address of default gateway in management VRF + description: IPv6 address of default gateway in management VRF. mac_address: type: str - description: MAC address + description: MAC address. lldp: type: dict keys: @@ -6092,16 +6467,36 @@ keys: type: int convert_types: - str - description: ZTP vlan number + description: ZTP vlan number. eos_cli: type: str description: Multiline EOS CLI rendered directly on the management interface - in the final EOS configuration + in the final EOS configuration. management_security: type: dict keys: entropy_source: type: str + deprecation: + warning: true + remove_in_version: v5.0.0 + new_key: entropy_sources + entropy_sources: + type: dict + description: Source of entropy. + keys: + hardware: + type: bool + description: Use a hardware based source. + haveged: + type: bool + description: Use the HAVEGE algorithm. + cpu_jitter: + type: bool + description: Use the Jitter RNG algorithm of a CPU based source. + hardware_exclusive: + type: bool + description: Only use entropy from the hardware source. password: type: dict keys: @@ -6180,7 +6575,7 @@ keys: type: str tls_versions: type: str - description: "List of allowed TLS versions as string\nExamples:\n - + description: "List of allowed TLS versions as string.\nExamples:\n - \"1.0\"\n - \"1.0 1.1\"\n" convert_types: - float @@ -6189,7 +6584,7 @@ keys: description: 'cipher_list syntax follows the openssl cipher strings format. - Colon (:) separated list of allowed ciphers as a string + Colon (:) separated list of allowed ciphers as a string. ' trust_certificate: @@ -6197,7 +6592,7 @@ keys: keys: certificates: type: list - description: "List of trust certificate names\nExamples:\n - test1.crt\n + description: "List of trust certificate names.\nExamples:\n - test1.crt\n \ - test2.crt\n" items: type: str @@ -6223,7 +6618,7 @@ keys: keys: certificates: type: list - description: "List of chain certificate names\nExamples:\n - chain1.crt\n + description: "List of chain certificate names.\nExamples:\n - chain1.crt\n \ - chain2.crt\n" items: type: str @@ -6251,6 +6646,98 @@ keys: ' items: type: str + shared_secret_profiles: + type: list + primary_key: profile + items: + type: dict + keys: + profile: + type: str + secrets: + type: list + primary_key: name + items: + type: dict + keys: + name: + type: str + secret: + type: str + required: true + secret_type: + type: str + default: '7' + valid_values: + - '0' + - '7' + - 8a + convert_types: + - int + receive_lifetime: + type: dict + required: true + keys: + infinite: + type: bool + start_date_time: + type: str + description: 'Start date and time of lifetime of the secret. + End date should be greater than start date. + + Formats supported: + + 1. mm/dd/yyyy hh:mm:ss + + 2. yyyy-mm-dd hh:mm:ss + + e.g 2024-12-20 10:00:00' + end_date_time: + type: str + description: 'End date and time of lifetime of the secret. + End date should be greater than start date. + + Formats supported: + + 1. mm/dd/yyyy hh:mm:ss + + 2. yyyy-mm-dd hh:mm:ss + + e.g 2024-12-20 10:00:00' + transmit_lifetime: + type: dict + required: true + keys: + infinite: + type: bool + start_date_time: + type: str + description: 'Start date and time of lifetime of the secret. + End date should be greater than start date. + + Formats supported: + + 1. mm/dd/yyyy hh:mm:ss + + 2. yyyy-mm-dd hh:mm:ss + + e.g 2024-12-20 10:00:00' + end_date_time: + type: str + description: 'End date and time of lifetime of the secret. + End date should be greater than start date. + + Formats supported: + + 1. mm/dd/yyyy hh:mm:ss + + 2. yyyy-mm-dd hh:mm:ss + + e.g 2024-12-20 10:00:00' + local_time: + type: bool + description: Configuring secret using the local timezone from + system clock. Default is UTC. management_ssh: type: dict keys: @@ -6261,10 +6748,10 @@ keys: keys: name: type: str - description: Standard ACL Name + description: Standard ACL Name. vrf: type: str - description: VRF Name + description: VRF Name. convert_types: - int ipv6_access_groups: @@ -6274,10 +6761,10 @@ keys: keys: name: type: str - description: Standard ACL Name + description: Standard ACL Name. vrf: type: str - description: VRF Name + description: VRF Name. convert_types: - int idle_timeout: @@ -6286,19 +6773,19 @@ keys: - str min: 0 max: 86400 - description: Idle timeout in minutes + description: Idle timeout in minutes. cipher: - description: Cryptographic ciphers for SSH to use + description: Cryptographic ciphers for SSH to use. type: list items: type: str key_exchange: - description: Cryptographic key exchange methods for SSH to use + description: Cryptographic key exchange methods for SSH to use. type: list items: type: str mac: - description: Cryptographic MAC algorithms for SSH to use + description: Cryptographic MAC algorithms for SSH to use. type: list items: type: str @@ -6320,7 +6807,7 @@ keys: type: bool description: Enforce strict host key checking. enable: - description: Enable SSH daemon + description: Enable SSH daemon. type: bool connection: type: dict @@ -6331,14 +6818,14 @@ keys: - str min: 1 max: 100 - description: Maximum total number of SSH sessions to device + description: Maximum total number of SSH sessions to device. per_host: type: int convert_types: - str min: 1 max: 20 - description: Maximum number of SSH sessions to device from a single host + description: Maximum number of SSH sessions to device from a single host. vrfs: type: list primary_key: name @@ -6349,15 +6836,15 @@ keys: keys: name: type: str - description: VRF Name + description: VRF Name. convert_types: - int enable: - description: Enable SSH in VRF + description: Enable SSH in VRF. type: bool log_level: type: str - description: SSH daemon log level + description: SSH daemon log level. client_alive: type: dict keys: @@ -6389,7 +6876,7 @@ keys: keys: command: type: str - description: Command to exclude from tech-support + description: Command to exclude from tech-support. type: type: str valid_values: @@ -6404,7 +6891,7 @@ keys: keys: command: type: str - description: Command to include in tech-support + description: Command to include in tech-support. match_list_input: type: dict display_name: Match Lists @@ -6451,7 +6938,7 @@ keys: keys: name: type: str - description: Match-list Name + description: Match-list Name. sequence_numbers: type: list required: true @@ -6463,13 +6950,13 @@ keys: keys: sequence: type: int - description: Sequence ID + description: Sequence ID. convert_types: - str match_regex: type: str required: true - description: Regular Expression + description: Regular Expression. mcs_client: type: dict keys: @@ -6486,7 +6973,7 @@ keys: type: list items: type: str - description: IP or hostname + description: IP or hostname. metadata: type: dict description: 'The data under `metadata` is used for documentation, validation @@ -6533,7 +7020,7 @@ keys: required: true cv_pathfinder: type: dict - description: Metadata used for CV Pathfinder visualization on CloudVision + description: Metadata used for CV Pathfinder visualization on CloudVision. keys: role: type: str @@ -6547,6 +7034,8 @@ keys: type: str ssl_profile: type: str + address: + type: str pathfinders: type: list items: @@ -6554,6 +7043,7 @@ keys: keys: vtep_ip: type: str + required: true interfaces: type: list items: @@ -6576,6 +7066,7 @@ keys: keys: name: type: str + required: true carriers: type: list items: @@ -6662,6 +7153,63 @@ keys: type: str preference: type: str + internet_exit_policies: + type: list + items: + type: dict + keys: + name: + type: str + required: true + type: + type: str + required: true + city: + type: str + required: true + country: + type: str + required: true + upload_bandwidth: + type: int + download_bandwidth: + type: int + firewall: + type: bool + required: true + ips_control: + type: bool + required: true + acceptable_use_policy: + type: bool + required: true + vpn_credentials: + type: list + required: true + items: + type: dict + keys: + fqdn: + type: str + required: true + vpn_type: + type: str + required: true + pre_shared_key: + type: str + required: true + tunnels: + type: list + required: true + items: + type: dict + keys: + name: + type: str + required: true + preference: + type: str + required: true mlag_configuration: type: dict display_name: Multi-Chassis Link Aggregation (MLAG) Configuration @@ -6670,58 +7218,58 @@ keys: type: str heartbeat_interval: type: int - description: Heartbeat interval in milliseconds + description: Heartbeat interval in milliseconds. convert_types: - str local_interface: - description: Local Interface Name + description: Local Interface Name. type: str peer_address: type: str - description: IPv4 Address + description: IPv4 or IPv6 Address. peer_address_heartbeat: type: dict keys: peer_ip: type: str - description: IPv4 Address + description: IPv4 or IPv6 Address. vrf: - description: VRF Name + description: VRF Name. type: str convert_types: - int dual_primary_detection_delay: type: int - description: Delay in seconds + description: Delay in seconds. min: 0 max: 86400 convert_types: - str dual_primary_recovery_delay_mlag: type: int - description: Delay in seconds + description: Delay in seconds. min: 0 max: 86400 convert_types: - str dual_primary_recovery_delay_non_mlag: type: int - description: Delay in seconds + description: Delay in seconds. min: 0 max: 86400 convert_types: - str peer_link: - description: Port-Channel interface name + description: Port-Channel interface name. type: str reload_delay_mlag: type: str - description: Delay in seconds <0-86400> or 'infinity' + description: Delay in seconds <0-86400> or 'infinity'. convert_types: - int reload_delay_non_mlag: type: str - description: Delay in seconds <0-86400> or 'infinity' + description: Delay in seconds <0-86400> or 'infinity'. convert_types: - int monitor_connectivity: @@ -6745,18 +7293,31 @@ keys: description: 'Interface range(s) should be of same type, Ethernet, Loopback, Management etc. - Multiple interface ranges can be specified separated by "," + Multiple interface ranges can be specified separated by ",". ' local_interfaces: type: str + address_only: + type: bool + description: 'PREVIEW: This key is in preview. + + When address-only is configured, the source IP of the packet is set to the + interface + + IP but the packet may exit the device via a different interface. + + When set to `false`, the probe uses the interface to exit the device. + + Not supported yet in EOS.' + default: true hosts: type: list items: type: dict keys: name: - description: Host Name + description: Host Name. type: str description: type: str @@ -6764,6 +7325,19 @@ keys: type: str local_interfaces: type: str + address_only: + type: bool + description: 'PREVIEW: This key is in preview. + + When address-only is configured, the source IP of the packet is set + to the interface + + IP but the packet may exit the device via a different interface. + + When set to `false`, the probe uses the interface to exit the device. + + Not supported yet in EOS.' + default: true url: type: str vrfs: @@ -6773,7 +7347,7 @@ keys: type: dict keys: name: - description: VRF Name + description: VRF Name. type: str convert_types: - int @@ -6790,13 +7364,26 @@ keys: type: str local_interfaces: type: str + address_only: + type: bool + description: 'PREVIEW: This key is in preview. + + When address-only is configured, the source IP of the packet is set + to the interface + + IP but the packet may exit the device via a different interface. + + When set to `false`, the probe uses the interface to exit the device. + + Not supported yet in EOS.' + default: true hosts: type: list items: type: dict keys: name: - description: Host name + description: Host name. type: str description: type: str @@ -6804,6 +7391,20 @@ keys: type: str local_interfaces: type: str + address_only: + type: bool + description: 'PREVIEW: This key is in preview. + + When address-only is configured, the source IP of the packet + is set to the interface + + IP but the packet may exit the device via a different interface. + + When set to `false`, the probe uses the interface to exit the + device. + + Not supported yet in EOS.' + default: true url: type: str monitor_layer1: @@ -6813,7 +7414,7 @@ keys: enabled: type: bool required: true - description: Enable monitor layer1 + description: Enable monitor layer1. logging_mac_fault: type: bool description: Enable MAC fault logging. @@ -6827,6 +7428,10 @@ keys: communication: type: bool description: Enable transceiver SMBus fail and reset logging. + enabled: + type: bool + description: Some platforms support only the `logging transceiver` command. + `enabled` key configures this command. monitor_sessions: type: list convert_types: @@ -6837,7 +7442,7 @@ keys: name: type: str required: true - description: Session Name + description: Session Name. sources: type: list items: @@ -6845,7 +7450,7 @@ keys: keys: name: type: str - description: Interface name, range or comma separated list + description: Interface name, range or comma separated list. direction: type: str valid_values: @@ -6862,7 +7467,7 @@ keys: - ipv6 - mac name: - description: ACL Name + description: ACL Name. type: str priority: type: int @@ -6872,12 +7477,12 @@ keys: type: list items: type: str - description: '''cpu'' or interface name, range or comma separated list' + description: '''cpu'' or interface name, range or comma separated list.' encapsulation_gre_metadata_tx: type: bool header_remove_size: type: int - description: Number of bytes to remove from header + description: Number of bytes to remove from header. convert_types: - str access_group: @@ -6890,7 +7495,7 @@ keys: - ipv6 - mac name: - description: ACL Name + description: ACL Name. type: str rate_limit_per_ingress_chip: type: str @@ -6911,9 +7516,232 @@ keys: type: bool size: type: int - description: Size in bytes + description: Size in bytes. + convert_types: + - str + monitor_telemetry_influx: + type: dict + keys: + vrf: + type: str + destinations: + type: list + primary_key: name + description: Configure telemetry output destinations. + items: + type: dict + keys: + name: + type: str + description: InfluxDB connection name. + database: + type: str + description: Set name of the database. + data_retention_policy: + type: str + url: + type: str + description: It only accepts http(s), udp and unix domain destination + URL. + pattern: (http(s)?|udp|unix)://.+ + username: + type: str + password: + type: str + password_type: + type: str + convert_types: + - int + valid_values: + - '0' + - '7' + - 8a + default: '7' + source_group_standard_disabled: + type: bool + description: Disable standard set of telemetry. + source_sockets: + type: list + primary_key: name + items: + type: dict + keys: + name: + type: str + description: Label of the socket connection. + connection_limit: + type: int + min: 0 + max: 4294967295 convert_types: - str + url: + type: str + description: It only accepts http(s), udp and unix domain socket URL. + pattern: (http(s)?|udp|unix)://.+ + tags: + type: list + primary_key: name + description: Extra tags added to the telemetry output. + items: + type: dict + keys: + name: + type: str + description: Key of the global tag pair. + value: + type: str + required: true + description: Value of the global tag pair. + monitor_telemetry_postcard_policy: + type: dict + keys: + disabled: + type: bool + default: true + description: Enable or disable the postcard telemetry feature. + ingress: + type: dict + keys: + collection: + type: dict + description: Collector configuration. + keys: + source: + type: str + description: Source IP address of GRE tunnel. + destination: + type: str + description: Destination IP address of GRE tunnel. + version: + type: int + description: Postcard version. + valid_values: + - 1 + - 2 + convert_types: + - str + sample: + type: dict + description: Sampling parameters. + keys: + rate: + type: int + description: Sampling rate. `rate` is preferred when both `rate` and + `tcp_udp_checksum` are defined. + convert_types: + - str + valid_values: + - 16384 + - 32768 + - 65536 + tcp_udp_checksum: + type: dict + description: TCP/UDP parameters. + keys: + value: + type: int + description: TCP/UDP checksum or IP ID value. + min: 0 + max: 65535 + convert_types: + - str + mask: + type: str + description: 16 bit hexadecimal mask for TCP/UDP or IP ID with + atmost 2 unset bits. + marker_vxlan: + type: dict + keys: + enabled: + type: bool + description: Enable vxlan marking using default bit 0. + header_word_zero_bit: + type: int + min: 1 + max: 31 + convert_types: + - str + profiles: + type: list + description: Postcard telemetry profiles. + primary_key: name + items: + type: dict + keys: + name: + type: str + description: Profile name. + ingress_sample_policy: + type: str + sample_policies: + type: list + primary_key: name + items: + type: dict + keys: + name: + type: str + match_rules: + type: list + primary_key: name + items: + type: dict + keys: + name: + type: str + type: + type: str + description: IP address version. + required: true + valid_values: + - ipv4 + - ipv6 + destination_prefix: + type: str + description: 'IPv4 Network/Mask or IPv6 Network/Mask. Host part + of prefix must be zero. + + eg. 10.3.3.0/24' + source_prefix: + type: str + description: 'IPv4 Network/Mask or IPv6 Network/Mask. Host part + of prefix must be zero. + + eg. 10.3.3.0/24' + protocols: + type: list + primary_key: protocol + items: + type: dict + keys: + protocol: + type: str + valid_values: + - tcp + - udp + source_ports: + type: list + description: "A list of port numbers or port range or port + name. Combination of port numbers or range and port name + is not supported on EOS. The port numbers should be in + range of 0-65535.\ne.g.\n [ \"12\", \"14-20\" ]\n [ + \"www\" ]" + items: + type: str + convert_types: + - int + destination_ports: + type: list + description: "A list of port numbers or port range or port + name. Combination of port numbers or range and port name + is not supported on EOS. The port numbers should be in + range of 0-65535.\ne.g.\n [ \"12\", \"14-20\", \"80\" + ]\n [ \"https\" ]" + items: + type: str + convert_types: + - int mpls: type: dict keys: @@ -6929,7 +7757,7 @@ keys: shutdown: type: bool transport_address_interface: - description: Interface Name + description: Interface Name. type: str name_server: deprecation: @@ -6942,7 +7770,7 @@ keys: type: dict keys: vrf: - description: VRF Name + description: VRF Name. type: str convert_types: - int @@ -6958,10 +7786,10 @@ keys: keys: name: type: str - description: Source interface + description: Source interface. vrf: type: str - description: VRF name + description: VRF name. convert_types: - int servers: @@ -6971,7 +7799,7 @@ keys: keys: name: type: str - description: IP or hostname e.g., 2.2.2.55, ie.pool.ntp.org + description: IP or hostname e.g., 2.2.2.55, 2001:db8::55, ie.pool.ntp.org. burst: type: bool iburst: @@ -6984,21 +7812,21 @@ keys: - str local_interface: type: str - description: Source interface + description: Source interface. maxpoll: type: int min: 3 max: 17 convert_types: - str - description: Value of maxpoll between 3 - 17 (Logarithmic) + description: Value of maxpoll between 3 - 17 (Logarithmic). minpoll: type: int min: 3 max: 17 convert_types: - str - description: Value of minpoll between 3 - 17 (Logarithmic) + description: Value of minpoll between 3 - 17 (Logarithmic). preferred: type: bool version: @@ -7009,7 +7837,7 @@ keys: - str vrf: type: str - description: VRF name + description: VRF name. convert_types: - int authenticate: @@ -7030,7 +7858,7 @@ keys: max: 65534 convert_types: - str - description: Key identifier + description: Key identifier. hash_algorithm: type: str valid_values: @@ -7038,7 +7866,7 @@ keys: - sha1 key: type: str - description: Obfuscated key + description: Obfuscated key. key_type: type: str convert_types: @@ -7049,12 +7877,45 @@ keys: - 8a trusted_keys: type: str - description: List of trusted-keys as string ex. 10-12,15 + description: List of trusted-keys as string ex. 10-12,15. convert_types: - int patch_panel: type: dict keys: + connector: + type: dict + keys: + interface: + type: dict + keys: + patch: + type: dict + keys: + bgp_vpws_remote_failure_errdisable: + type: bool + recovery: + type: dict + keys: + review_delay: + type: dict + keys: + min: + type: int + required: true + min: 10 + max: 600 + convert_types: + - str + description: Minimum delay. + max: + type: int + required: true + min: 15 + max: 900 + convert_types: + - str + description: Maximum delay. patches: type: list primary_key: name @@ -7075,7 +7936,7 @@ keys: min_length: 2 max_length: 2 description: Must have exactly two connectors to a patch of which at - least one must be of type "interface" + least one must be of type "interface". items: type: dict keys: @@ -7115,7 +7976,7 @@ keys: keys: name: type: str - description: Peer-filter Name + description: Peer-filter Name. sequence_numbers: type: list required: true @@ -7127,13 +7988,13 @@ keys: keys: sequence: type: int - description: Sequence ID + description: Sequence ID. convert_types: - str match: type: str required: true - description: 'Match as string + description: 'Match as string. Example: "as-range 1-100 result accept" @@ -7225,8 +8086,8 @@ keys: required: true convert_types: - int - description: 'Drop Treshold. This value may also be - fractions. + description: 'Drop Threshold. This value may also + be fractions. Example: 7/8 or 3/4 or 1/2 @@ -7286,8 +8147,8 @@ keys: required: true convert_types: - int - description: 'Drop Treshold. This value may also be - fractions. + description: 'Drop Threshold. This value may also + be fractions. Example: 7/8 or 3/4 or 1/2 @@ -7295,7 +8156,7 @@ keys: sand: type: dict description: Most of the platform sand options are hardware dependent and - optional + optional. keys: qos_maps: type: list @@ -7371,7 +8232,7 @@ keys: interface_shutdown: type: dict description: Set the global PoE power behavior for PoE ports when ports are - admin down + admin down. keys: action: type: str @@ -7385,7 +8246,7 @@ keys: keys: pbr: type: list - description: PBR Policy-Maps + description: PBR Policy-Maps. primary_key: name convert_types: - dict @@ -7394,7 +8255,7 @@ keys: keys: name: type: str - description: Policy-Map Name + description: Policy-Map Name. classes: type: list primary_key: name @@ -7405,18 +8266,18 @@ keys: keys: name: type: str - description: Class Name + description: Class Name. index: type: int convert_types: - str drop: - description: '''drop'' and ''set'' are mutually exclusive' + description: '''drop'' and ''set'' are mutually exclusive.' type: bool set: description: 'Set Nexthop - ''drop'' and ''set'' are mutually exclusive + ''drop'' and ''set'' are mutually exclusive. ' type: dict @@ -7426,12 +8287,12 @@ keys: keys: ip_address: type: str - description: IPv4 or IPv6 Address + description: IPv4 or IPv6 Address. recursive: type: bool qos: type: list - description: QOS Policy-Maps + description: QOS Policy-Maps. primary_key: name convert_types: - dict @@ -7440,7 +8301,7 @@ keys: keys: name: type: str - description: Policy-Map Name + description: Policy-Map Name. classes: type: list primary_key: name @@ -7451,7 +8312,7 @@ keys: keys: name: type: str - description: Class Name + description: Class Name. set: type: dict keys: @@ -7545,6 +8406,38 @@ keys: - mbytes - packets default: bytes + copp_system_policy: + type: dict + description: Control-plane policy configuration. + keys: + classes: + type: list + primary_key: name + items: + type: dict + keys: + name: + type: str + shape: + type: int + description: Maximum rate limit. + min: 0 + max: 10000000 + convert_types: + - str + bandwidth: + type: int + description: Minimum bandwidth. + min: 0 + max: 10000000 + convert_types: + - str + rate_unit: + type: str + description: The `rate_unit` must be defined for `shape` and `bandwidth`. + valid_values: + - pps + - kbps port_channel_interfaces: type: list primary_key: name @@ -7579,7 +8472,7 @@ keys: convert_types: - str description: '"l2_mtu" should only be defined for platforms supporting the - "l2 mtu" CLI + "l2 mtu" CLI. ' l2_mru: @@ -7589,18 +8482,18 @@ keys: convert_types: - str description: '"l2_mru" should only be defined for platforms supporting the - "l2 mru" CLI + "l2 mru" CLI. ' vlans: type: str convert_types: - int - description: 'List of switchport vlans as string + description: 'List of switchport vlans as string. - For a trunk port this would be a range like "1-200,300" + For a trunk port this would be a range like "1-200,300". - For an access port this would be a single vlan "123" + For an access port this would be a single vlan "123". ' snmp_trap_link_change: @@ -7621,12 +8514,12 @@ keys: ' encapsulation_dot1q_vlan: type: int - description: VLAN tag to configure on sub-interface + description: VLAN tag to configure on sub-interface. convert_types: - str vrf: type: str - description: VRF name + description: VRF name. convert_types: - int encapsulation_vlan: @@ -7642,23 +8535,23 @@ keys: type: int convert_types: - str - description: Client VLAN ID + description: Client VLAN ID. outer: type: int convert_types: - str - description: Client Outer VLAN ID + description: Client Outer VLAN ID. inner: type: int convert_types: - str - description: Client Inner VLAN ID + description: Client Inner VLAN ID. unmatched: type: bool network: type: dict description: Network encapsulation are all optional, and skipped if - using client unmatched + using client unmatched. keys: dot1q: type: dict @@ -7667,17 +8560,17 @@ keys: type: int convert_types: - str - description: Network VLAN ID + description: Network VLAN ID. outer: type: int convert_types: - str - description: Network Outer VLAN ID + description: Network Outer VLAN ID. inner: type: int convert_types: - str - description: Network Inner VLAN ID + description: Network Inner VLAN ID. client: type: bool vlan_id: @@ -7698,12 +8591,12 @@ keys: convert_types: - str description: If setting both native_vlan and native_vlan_tag, native_vlan_tag - takes precedence + takes precedence. native_vlan_tag: type: bool default: false description: If setting both native_vlan and native_vlan_tag, native_vlan_tag - takes precedence + takes precedence. link_tracking_groups: type: list primary_key: name @@ -7712,7 +8605,7 @@ keys: keys: name: type: str - description: Group name + description: Group name. direction: type: str valid_values: @@ -7739,10 +8632,10 @@ keys: type: int convert_types: - str - description: Vlan tag to configure on sub-interface + description: Vlan tag to configure on sub-interface. forwarding_profile: type: str - description: L2 protocol forwarding profile + description: L2 protocol forwarding profile. mtu: type: int min: 68 @@ -7753,7 +8646,7 @@ keys: type: int convert_types: - str - description: MLAG ID + description: MLAG ID. min: 1 max: 2000 trunk_groups: @@ -7762,7 +8655,7 @@ keys: type: str lacp_fallback_timeout: type: int - description: Timeout in seconds + description: Timeout in seconds. convert_types: - str default: 90 @@ -7786,12 +8679,12 @@ keys: type: int convert_types: - str - description: DSCP value + description: DSCP value. cos: type: int convert_types: - str - description: COS value + description: COS value. bfd: type: dict keys: @@ -7799,12 +8692,12 @@ keys: type: bool interval: type: int - description: Interval in milliseconds + description: Interval in milliseconds. convert_types: - str min_rx: type: int - description: Rate in milliseconds + description: Rate in milliseconds. convert_types: - str multiplier: @@ -7833,14 +8726,14 @@ keys: keys: input: type: str - description: Policy Based Routing Policy-map name + description: Policy Based Routing Policy-map name. qos: type: dict keys: input: type: str required: true - description: Quality of Service Policy-map name + description: Quality of Service Policy-map name. mpls: type: dict keys: @@ -7857,7 +8750,7 @@ keys: type: bool pvlan_mapping: type: str - description: List of vlans as string + description: List of vlans as string. convert_types: - int vlan_translations: @@ -7870,12 +8763,12 @@ keys: convert_types: - int description: List of vlans as string (only one vlan if direction is - "both") + "both"). to: type: int convert_types: - str - description: VLAN ID + description: VLAN ID. direction: type: str valid_values: @@ -7888,9 +8781,9 @@ keys: keys: rate: type: str - description: 'Rate in kbps, pps or percent + description: 'Rate in kbps, pps or percent. - Supported options are platform dependent + Supported options are platform dependent. Examples: @@ -7912,14 +8805,14 @@ keys: convert_types: - int - float - description: Configure maximum storm-control level + description: Configure maximum storm-control level. unit: type: str default: percent valid_values: - percent - pps - description: Optional field and is hardware dependent + description: Optional field and is hardware dependent. broadcast: type: dict keys: @@ -7928,14 +8821,14 @@ keys: convert_types: - int - float - description: Configure maximum storm-control level + description: Configure maximum storm-control level. unit: type: str default: percent valid_values: - percent - pps - description: Optional field and is hardware dependent + description: Optional field and is hardware dependent. multicast: type: dict keys: @@ -7944,14 +8837,14 @@ keys: convert_types: - int - float - description: Configure maximum storm-control level + description: Configure maximum storm-control level. unit: type: str default: percent valid_values: - percent - pps - description: Optional field and is hardware dependent + description: Optional field and is hardware dependent. unknown_unicast: type: dict keys: @@ -7960,19 +8853,22 @@ keys: convert_types: - int - float - description: Configure maximum storm-control level + description: Configure maximum storm-control level. unit: type: str default: percent valid_values: - percent - pps - description: Optional field and is hardware dependent + description: Optional field and is hardware dependent. ip_proxy_arp: type: bool isis_enable: type: str - description: ISIS instance + description: ISIS instance. + isis_bfd: + type: bool + description: Enable BFD for ISIS. isis_passive: type: bool isis_metric: @@ -7996,22 +8892,22 @@ keys: - md5 isis_authentication_key: type: str - description: Type-7 encrypted password + description: Type-7 encrypted password. traffic_policy: type: dict keys: input: type: str - description: Ingress traffic policy + description: Ingress traffic policy. output: type: str - description: Egress traffic policy + description: Egress traffic policy. evpn_ethernet_segment: type: dict keys: identifier: type: str - description: EVPN Ethernet Segment Identifier (Type 1 format) + description: EVPN Ethernet Segment Identifier (Type 1 format). redundancy: type: str valid_values: @@ -8031,10 +8927,10 @@ keys: max: 65535 convert_types: - str - description: Preference_value is only used when "algorithm" is "preference" + description: Preference_value is only used when "algorithm" is "preference". dont_preempt: type: bool - description: Dont_preempt is only used when "algorithm" is "preference" + description: Dont_preempt is only used when "algorithm" is "preference". default: false hold_time: type: int @@ -8061,13 +8957,13 @@ keys: - str route_target: type: str - description: EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx + description: EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx. esi: type: str - description: 'EVPN Ethernet Segment Identifier (Type 1 format) + description: 'EVPN Ethernet Segment Identifier (Type 1 format). If both "esi" and "evpn_ethernet_segment.identifier" are defined, the - new variable takes precedence + new variable takes precedence. ' deprecation: @@ -8076,10 +8972,10 @@ keys: remove_in_version: 5.0.0 rt: type: str - description: 'EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx + description: 'EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx. If both "rt" and "evpn_ethernet_segment.route_target" are defined, the - new variable takes precedence + new variable takes precedence. ' deprecation: @@ -8088,7 +8984,7 @@ keys: remove_in_version: 5.0.0 lacp_id: type: str - description: LACP ID with format xxxx.xxxx.xxxx + description: LACP ID with format xxxx.xxxx.xxxx. spanning_tree_bpdufilter: type: str convert_types: @@ -8165,16 +9061,26 @@ keys: type: str convert_types: - int - description: VLAN can be 'all' or list of vlans as string + description: VLAN can be 'all' or list of vlans as string. transport: type: str valid_values: - ipv4 - ipv6 - layer2 + mpass: + type: bool + description: 'When MPASS is enabled on an MLAG port-channel, MLAG peers + coordinate to function as a single PTP logical device. + + Arista PTP enabled devices always place PTP messages on the same physical + link within the port-channel. + + Hence, MPASS is needed only on MLAG port-channels connected to non-Arista + devices.' ip_address: type: str - description: IPv4 address/mask + description: IPv4 address/mask. ip_verify_unicast_source_reachable_via: type: str valid_values: @@ -8187,10 +9093,10 @@ keys: type: bool ipv6_address: type: str - description: IPv6 address/mask + description: IPv6 address/mask. ipv6_address_link_local: type: str - description: Link local IPv6 address/mask + description: Link local IPv6 address/mask. ipv6_nd_ra_disabled: type: bool ipv6_nd_managed_config_flag: @@ -8209,32 +9115,32 @@ keys: type: str convert_types: - int - description: Infinite or lifetime in seconds + description: Infinite or lifetime in seconds. preferred_lifetime: type: str convert_types: - int - description: Infinite or lifetime in seconds + description: Infinite or lifetime in seconds. no_autoconfig_flag: type: bool access_group_in: type: str - description: Access list name + description: Access list name. access_group_out: type: str - description: Access list name + description: Access list name. ipv6_access_group_in: type: str - description: IPv6 access list name + description: IPv6 access list name. ipv6_access_group_out: type: str - description: IPv6 access list name + description: IPv6 access list name. mac_access_group_in: type: str - description: MAC access list name + description: MAC access list name. mac_access_group_out: type: str - description: MAC access list name + description: MAC access list name. pim: type: dict keys: @@ -8277,7 +9183,7 @@ keys: description: PIM hello interval in seconds. service_profile: type: str - description: QOS profile + description: QOS profile. ospf_network_point_to_point: type: bool ospf_area: @@ -8296,7 +9202,7 @@ keys: - message-digest ospf_authentication_key: type: str - description: Encrypted password + description: Encrypted password. ospf_message_digest_keys: type: list primary_key: id @@ -8319,7 +9225,7 @@ keys: - sha512 key: type: str - description: Encrypted password + description: Encrypted password. flow_tracker: type: dict keys: @@ -8334,7 +9240,7 @@ keys: keys: session_tracker: type: str - description: Name of session tracker + description: Name of session tracker. ip_igmp_host_proxy: type: dict keys: @@ -8394,13 +9300,13 @@ keys: description: IGMP version on IGMP host-proxy interface. peer: type: str - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. peer_interface: type: str - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. peer_type: type: str - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. sflow: type: dict keys: @@ -8416,11 +9322,11 @@ keys: validate_state: type: bool description: Set to false to disable interface validation by the `eos_validate_state` - role + role. eos_cli: type: str description: Multiline EOS CLI rendered directly on the port-channel interface - in the final EOS configuration + in the final EOS configuration. prefix_lists: type: list primary_key: name @@ -8431,7 +9337,7 @@ keys: keys: name: type: str - description: Prefix-list Name + description: Prefix-list Name. sequence_numbers: type: list primary_key: sequence @@ -8442,13 +9348,13 @@ keys: keys: sequence: type: int - description: Sequence ID + description: Sequence ID. convert_types: - str action: type: str required: true - description: 'Action as string + description: 'Action as string. Example: "permit 10.255.0.0/27 eq 32" @@ -8545,12 +9451,12 @@ keys: type: bool clock_identity: type: str - description: The clock-id in xx:xx:xx:xx:xx:xx format + description: The clock-id in xx:xx:xx:xx:xx:xx format. source: type: dict keys: ip: - description: Source IP + description: Source IP. type: str priority1: type: int @@ -8720,11 +9626,11 @@ keys: type: bool random_detect: type: dict - description: Global random-detect settings + description: Global random-detect settings. keys: ecn: type: dict - description: Global ECN Configuration + description: Global ECN Configuration. keys: allow_non_ect: type: dict @@ -8737,7 +9643,7 @@ keys: Check which command is required for your platform.' chip_based: type: bool - description: Allow non-ect chip-based + description: Allow non-ect chip-based. qos_profiles: type: list primary_key: name @@ -8748,7 +9654,7 @@ keys: keys: name: type: str - description: Profile-Name + description: Profile-Name. trust: type: str valid_values: @@ -8768,7 +9674,7 @@ keys: keys: rate: type: str - description: 'Supported options are platform dependent + description: 'Supported options are platform dependent. Example: "< rate > kbps", "1-100 percent", "< rate > pps" @@ -8781,7 +9687,7 @@ keys: keys: qos_input: type: str - description: Policy-map name + description: Policy-map name. tx_queues: type: list primary_key: id @@ -8794,7 +9700,7 @@ keys: type: int convert_types: - str - description: TX-Queue ID + description: TX-Queue ID. bandwidth_percent: type: int convert_types: @@ -8813,24 +9719,24 @@ keys: keys: rate: type: str - description: 'Supported options are platform dependent + description: 'Supported options are platform dependent. Example: "< rate > kbps", "1-100 percent", "< rate > pps" ' comment: type: str - description: Text comment added to queue + description: Text comment added to queue. random_detect: type: dict keys: ecn: - description: Explicit Congestion Notification + description: Explicit Congestion Notification. type: dict keys: count: type: bool - description: Enable counter for random-detect ECNs + description: Enable counter for random-detect ECNs. threshold: type: dict keys: @@ -8852,30 +9758,30 @@ keys: min: 1 convert_types: - str - description: Random-detect ECN minimum-threshold + description: Random-detect ECN minimum-threshold. max: type: int required: true min: 1 convert_types: - str - description: Random-detect ECN maximum-threshold + description: Random-detect ECN maximum-threshold. max_probability: type: int min: 1 max: 100 convert_types: - str - description: Random-detect ECN maximum mark probability + description: Random-detect ECN maximum mark probability. weight: type: int min: 0 max: 15 convert_types: - str - description: Random-detect ECN weight + description: Random-detect ECN weight. drop: - description: Set WRED parameters + description: Set WRED parameters. type: dict keys: threshold: @@ -8897,21 +9803,21 @@ keys: required: false min: 0 max: 2 - description: Specify Drop Precendence value + description: Specify Drop Precedence value. min: type: int required: true min: 1 convert_types: - str - description: WRED minimum-threshold + description: WRED minimum-threshold. max: type: int required: true min: 1 convert_types: - str - description: WRED maximum-threshold + description: WRED maximum-threshold. drop_probability: type: int required: true @@ -8926,7 +9832,7 @@ keys: max: 15 convert_types: - str - description: WRED weight + description: WRED weight. uc_tx_queues: type: list primary_key: id @@ -8939,7 +9845,7 @@ keys: type: int convert_types: - str - description: UC TX queue ID + description: UC TX queue ID. bandwidth_percent: type: int convert_types: @@ -8958,24 +9864,24 @@ keys: keys: rate: type: str - description: 'Supported options are platform dependent + description: 'Supported options are platform dependent. Example: "< rate > kbps", "1-100 percent", "< rate > pps" ' comment: type: str - description: Text comment added to queue + description: Text comment added to queue. random_detect: type: dict keys: ecn: - description: Explicit Congestion Notification + description: Explicit Congestion Notification. type: dict keys: count: type: bool - description: Enable counter for random-detect ECNs + description: Enable counter for random-detect ECNs. threshold: type: dict keys: @@ -8988,37 +9894,37 @@ keys: - kbytes - mbytes - milliseconds - description: Unit to be used for the threshold values + description: Unit to be used for the threshold values. min: type: int required: true min: 1 convert_types: - str - description: Random-detect ECN minimum-threshold + description: Random-detect ECN minimum-threshold. max: type: int required: true min: 1 convert_types: - str - description: Random-detect ECN maximum-threshold + description: Random-detect ECN maximum-threshold. max_probability: type: int min: 1 max: 100 convert_types: - str - description: Random-detect ECN maximum mark probability + description: Random-detect ECN maximum mark probability. weight: type: int min: 0 max: 15 convert_types: - str - description: Random-detect ECN weight + description: Random-detect ECN weight. drop: - description: Set WRED parameters + description: Set WRED parameters. type: dict keys: threshold: @@ -9040,21 +9946,21 @@ keys: required: false min: 0 max: 2 - description: Specify Drop Precendence value + description: Specify Drop Precedence value. min: type: int required: true min: 1 convert_types: - str - description: WRED minimum-threshold + description: WRED minimum-threshold. max: type: int required: true min: 1 convert_types: - str - description: WRED maximum-threshold + description: WRED maximum-threshold. drop_probability: type: int required: true @@ -9069,7 +9975,7 @@ keys: max: 15 convert_types: - str - description: WRED weight + description: WRED weight. mc_tx_queues: type: list primary_key: id @@ -9082,7 +9988,7 @@ keys: type: int convert_types: - str - description: MC TX queue ID + description: MC TX queue ID. bandwidth_percent: type: int convert_types: @@ -9101,7 +10007,7 @@ keys: keys: rate: type: str - description: 'Supported options are platform dependent + description: 'Supported options are platform dependent. Example: "< rate > kbps", "1-100 percent", "< rate > pps" @@ -9113,7 +10019,7 @@ keys: ' priority_flow_control: type: dict - description: 'Priority Flow Control settings + description: 'Priority Flow Control settings. ' keys: @@ -9165,7 +10071,7 @@ keys: should start dropping on congested priorities. - This should be decimal with up to 2 decimal point + This should be decimal with up to 2 decimal point. Example: 0.01 or 60 @@ -9216,7 +10122,7 @@ keys: priorities: type: list primary_key: priority - description: 'Set the drop/no_drop on each queue + description: 'Set the drop/no_drop on each queue. ' items: @@ -9229,13 +10135,13 @@ keys: required: true convert_types: - str - description: 'Priority queue number (COS value) + description: 'Priority queue number (COS value). ' no_drop: type: bool required: true - description: 'Enable Priority Flow Control frames on this queue + description: 'Enable Priority Flow Control frames on this queue. ' queue_monitor_length: @@ -9268,11 +10174,11 @@ keys: type: int convert_types: - str - description: Logging interval in seconds + description: Logging interval in seconds. notifying: type: bool description: Should only be used for platforms supporting the "queue-monitor - length notifying" CLI + length notifying" CLI. cpu: type: dict keys: @@ -9290,7 +10196,7 @@ keys: - str tx_latency: type: bool - description: Enable tx-latency mode + description: Enable tx-latency mode. queue_monitor_streaming: type: dict keys: @@ -9298,10 +10204,10 @@ keys: type: bool ip_access_group: type: str - description: Name of IP ACL + description: Name of IP ACL. ipv6_access_group: type: str - description: Name of IPv6 ACL + description: Name of IPv6 ACL. max_connections: type: int convert_types: @@ -9333,10 +10239,10 @@ keys: max: 65535 convert_types: - str - description: TCP Port + description: TCP Port. tls_ssl_profile: type: str - description: Name of TLS profile + description: Name of TLS profile. hosts: type: list primary_key: host @@ -9345,7 +10251,7 @@ keys: keys: host: type: str - description: Host IP address or name + description: Host IP address or name. vrf: type: str convert_types: @@ -9364,7 +10270,7 @@ keys: - str key: type: str - description: Encrypted key + description: Encrypted key. radius_servers: deprecation: warning: true @@ -9376,20 +10282,20 @@ keys: keys: host: type: str - description: Host IP address or name + description: Host IP address or name. vrf: type: str convert_types: - int key: type: str - description: Encrypted key + description: Encrypted key. redundancy: type: dict keys: protocol: type: str - description: Redundancy Protocol + description: Redundancy Protocol. roles: type: list items: @@ -9397,7 +10303,7 @@ keys: keys: name: type: str - description: Role name + description: Role name. sequence_numbers: type: list items: @@ -9407,7 +10313,7 @@ keys: type: int convert_types: - str - description: Sequence number + description: Sequence number. action: type: str valid_values: @@ -9415,12 +10321,12 @@ keys: - deny mode: type: str - description: '"config", "config-all", "exec" or mode key as string + description: '"config", "config-all", "exec" or mode key as string. ' command: type: str - description: Command as string + description: Command as string. route_maps: type: list primary_key: name @@ -9431,7 +10337,7 @@ keys: keys: name: type: str - description: Route-map Name + description: Route-map Name. sequence_numbers: type: list required: true @@ -9443,7 +10349,7 @@ keys: keys: sequence: type: int - description: Sequence ID + description: Sequence ID. convert_types: - str type: @@ -9456,27 +10362,27 @@ keys: type: str match: type: list - description: List of "match" statements + description: List of "match" statements. items: type: str - description: 'Match as string + description: 'Match as string. Example: "ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY" ' set: type: list - description: List of "set" statements + description: List of "set" statements. items: type: str - description: 'Set as string + description: 'Set as string. Example: "origin incomplete" ' sub_route_map: type: str - description: Name of Sub-Route-map + description: Name of Sub-Route-map. continue: type: dict keys: @@ -9504,6 +10410,7 @@ keys: name: type: str required: true + pattern: ^[A-Za-z0-9_.:{}\[\]-]+$ id: type: int convert_types: @@ -9518,6 +10425,7 @@ keys: name: type: str required: true + pattern: ^[A-Za-z0-9_.:{}\[\]-]+$ id: type: int convert_types: @@ -9532,6 +10440,7 @@ keys: name: type: str required: true + pattern: ^[A-Za-z0-9_.:{}\[\]-]+$ id: type: int convert_types: @@ -9628,13 +10537,13 @@ keys: keys: interval: type: int - description: Rate in milliseconds + description: Rate in milliseconds. local_address: type: str - description: Configure BFD local IP/IPv6 address + description: Configure BFD local IP/IPv6 address. min_rx: type: int - description: Rate in milliseconds + description: Rate in milliseconds. multiplier: type: int min: 3 @@ -9644,10 +10553,10 @@ keys: keys: interval: type: int - description: Rate in milliseconds + description: Rate in milliseconds. min_rx: type: int - description: Rate in milliseconds + description: Rate in milliseconds. multiplier: type: int min: 3 @@ -9672,7 +10581,7 @@ keys: keys: name: type: str - description: Interface Name + description: Interface Name. protocols: type: dict keys: @@ -9682,23 +10591,23 @@ keys: type: bool initiator_interval: type: int - description: Rate in milliseconds + description: Rate in milliseconds. initiator_multiplier: type: int min: 3 max: 50 initiator_measurement_round_trip: type: bool - description: Enable round-trip delay measurement + description: Enable round-trip delay measurement. reflector: type: dict keys: min_rx: type: int - description: Rate in milliseconds + description: Rate in milliseconds. local_discriminator: type: str - description: IPv4 address or 32 bit integer + description: IPv4 address or 32 bit integer. router_bgp: type: dict keys: @@ -9721,7 +10630,7 @@ keys: - asplain router_id: type: str - description: In IP address format A.B.C.D + description: In IP address format A.B.C.D. distance: type: dict keys: @@ -9757,14 +10666,14 @@ keys: - str min: 1 max: 3600 - description: Number of seconds + description: Number of seconds. stalepath_time: type: int convert_types: - str min: 1 max: 3600 - description: Number of seconds + description: Number of seconds. graceful_restart_helper: type: dict keys: @@ -9829,10 +10738,10 @@ keys: ' bgp_cluster_id: type: str - description: IP Address A.B.C.D + description: IP Address A.B.C.D. bgp_defaults: type: list - description: BGP command as string + description: BGP command as string. items: type: str bgp: @@ -9861,10 +10770,14 @@ keys: keys: d_path: type: bool + redistribute_internal: + type: bool + description: Allow redistribution of iBGP routes into an Interior Gateway + Protocol (IGP). EOS default is true. listen_ranges: type: list description: 'Improved "listen_ranges" data model to support multiple listen - ranges and additional filter capabilities + ranges and additional filter capabilities. ' items: @@ -9872,16 +10785,16 @@ keys: keys: prefix: type: str - description: IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I" + description: IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I". peer_id_include_router_id: type: bool - description: Include router ID as part of peer filter + description: Include router ID as part of peer filter. peer_group: type: str - description: Peer group name + description: Peer group name. peer_filter: type: str - description: 'Peer-filter name + description: 'Peer-filter name. note: `peer_filter` or `remote_as` is required but mutually exclusive. @@ -9906,10 +10819,10 @@ keys: keys: name: type: str - description: Peer-group name + description: Peer-group name. type: type: str - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. remote_as: type: str description: 'BGP AS <1-4294967295> or AS number in asdot notation "<1-65535>.<0-65535>". @@ -9932,17 +10845,17 @@ keys: type: bool as_path: type: dict - description: BGP AS-PATH options + description: BGP AS-PATH options. keys: remote_as_replace_out: type: bool - description: Replace AS number with local AS number + description: Replace AS number with local AS number. prepend_own_disabled: type: bool - description: Disable prepending own AS number to AS path + description: Disable prepending own AS number to AS path. remove_private_as: type: dict - description: Remove private AS numbers in outbound AS path + description: Remove private AS numbers in outbound AS path. keys: enabled: type: bool @@ -9959,7 +10872,7 @@ keys: type: bool peer_filter: type: str - description: 'Peer-filter name + description: 'Peer-filter name. note: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with @@ -9975,7 +10888,7 @@ keys: type: bool update_source: type: str - description: IP address or interface name + description: IP address or interface name. route_reflector_client: type: bool bfd: @@ -10013,7 +10926,7 @@ keys: type: int min: 1 max: 255 - description: Time-to-live in range of hops + description: Time-to-live in range of hops. convert_types: - str next_hop_self: @@ -10031,14 +10944,14 @@ keys: type: bool route_map: type: str - description: Route-map name + description: Route-map name. send_community: type: str description: '''all'' or a combination of ''standard'', ''extended'', - ''large'' and ''link-bandwidth (w/options)''' + ''large'' and ''link-bandwidth (w/options)''.' maximum_routes: type: int - description: Maximum number of routes (0 means unlimited) + description: Maximum number of routes (0 means unlimited). min: 0 max: 4294967294 convert_types: @@ -10049,13 +10962,65 @@ keys: (0 means never warn) or Percentage of maximum number of routes at which to warn ("<1-100> - percent") + percent"). ' convert_types: - int maximum_routes_warning_only: type: bool + missing_policy: + type: dict + description: Missing policy configuration for all address-families. + keys: + direction_in: + description: Missing policy inbound direction. + type: dict + keys: + action: + description: Missing policy action. + type: str + required: true + valid_values: + - deny + - permit + - deny-in-out + include_community_list: + type: bool + description: Include community-list references in missing policy + decision. + include_prefix_list: + type: bool + description: Include prefix-list references in missing policy + decision. + include_sub_route_map: + type: bool + description: Include sub-route-map references in missing policy + decision. + direction_out: + description: Missing policy outbound direction. + type: dict + keys: + action: + description: Missing policy action. + type: str + required: true + valid_values: + - deny + - permit + - deny-in-out + include_community_list: + type: bool + description: Include community-list references in missing policy + decision. + include_prefix_list: + type: bool + description: Include prefix-list references in missing policy + decision. + include_sub_route_map: + type: bool + description: Include sub-route-map references in missing policy + decision. link_bandwidth: type: dict keys: @@ -10063,7 +11028,7 @@ keys: type: bool default: type: str - description: nn.nn(K|M|G) link speed in bits/second + description: nn.nn(K|M|G) link speed in bits/second. allowas_in: type: dict keys: @@ -10071,7 +11036,7 @@ keys: type: bool times: type: int - description: Number of local ASNs allowed in a BGP update + description: Number of local ASNs allowed in a BGP update. convert_types: - str min: 1 @@ -10085,7 +11050,7 @@ keys: timers: type: str description: BGP Keepalive and Hold Timer values in seconds as string - "<0-3600> <0-3600>" + "<0-3600> <0-3600>". rib_in_pre_policy_retain: type: dict keys: @@ -10095,13 +11060,13 @@ keys: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. bgp_listen_range_prefix: type: str - description: 'IP prefix range + description: 'IP prefix range. note: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with @@ -10115,6 +11080,22 @@ keys: new_key: listen_ranges session_tracker: type: str + shared_secret: + type: dict + keys: + profile: + type: str + required: true + description: Name of profile defined under `management_security`. + hash_algorithm: + type: str + required: true + description: 'Note: Algorithm hmac-sha-256 requires EOS version + 4.31.1F and above.' + valid_values: + - aes-128-cmac-96 + - hmac-sha-256 + - hmac-sha1-96 ttl_maximum_hops: type: int convert_types: @@ -10152,17 +11133,17 @@ keys: - int as_path: type: dict - description: BGP AS-PATH options + description: BGP AS-PATH options. keys: remote_as_replace_out: type: bool - description: Replace AS number with local AS number + description: Replace AS number with local AS number. prepend_own_disabled: type: bool - description: Disable prepending own AS number to AS path + description: Disable prepending own AS number to AS path. peer: type: str - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. description: type: str route_reflector_client: @@ -10175,7 +11156,7 @@ keys: type: bool update_source: type: str - description: Source Interface + description: Source Interface. bfd: type: bool description: Enable BFD. @@ -10216,13 +11197,13 @@ keys: timers: type: str description: BGP Keepalive and Hold Timer values in seconds as string - "<0-3600> <0-3600>" + "<0-3600> <0-3600>". route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. default_originate: type: dict keys: @@ -10235,10 +11216,10 @@ keys: send_community: type: str description: '''all'' or a combination of ''standard'', ''extended'', - ''large'' and ''link-bandwidth (w/options)''' + ''large'' and ''link-bandwidth (w/options)''.' maximum_routes: type: int - description: Maximum number of routes (0 means unlimited) + description: Maximum number of routes (0 means unlimited). min: 0 max: 4294967294 convert_types: @@ -10249,13 +11230,65 @@ keys: (0 means never warn) or Percentage of maximum number of routes at which to warn ("<1-100> - percent") + percent"). ' convert_types: - int maximum_routes_warning_only: type: bool + missing_policy: + type: dict + description: Missing policy configuration for all address-families. + keys: + direction_in: + description: Missing policy inbound direction. + type: dict + keys: + action: + description: Missing policy action. + type: str + required: true + valid_values: + - deny + - permit + - deny-in-out + include_community_list: + type: bool + description: Include community-list references in missing policy + decision. + include_prefix_list: + type: bool + description: Include prefix-list references in missing policy + decision. + include_sub_route_map: + type: bool + description: Include sub-route-map references in missing policy + decision. + direction_out: + description: Missing policy outbound direction. + type: dict + keys: + action: + description: Missing policy action. + type: str + required: true + valid_values: + - deny + - permit + - deny-in-out + include_community_list: + type: bool + description: Include community-list references in missing policy + decision. + include_prefix_list: + type: bool + description: Include prefix-list references in missing policy + decision. + include_sub_route_map: + type: bool + description: Include sub-route-map references in missing policy + decision. allowas_in: type: dict keys: @@ -10267,12 +11300,12 @@ keys: - str min: 1 max: 10 - description: Number of local ASNs allowed in a BGP update + description: Number of local ASNs allowed in a BGP update. ebgp_multihop: type: int min: 1 max: 255 - description: Time-to-live in range of hops + description: Time-to-live in range of hops. convert_types: - str next_hop_self: @@ -10284,7 +11317,7 @@ keys: type: bool default: type: str - description: nn.nn(K|M|G) link speed in bits/second + description: nn.nn(K|M|G) link speed in bits/second. rib_in_pre_policy_retain: type: dict keys: @@ -10294,7 +11327,7 @@ keys: type: bool remove_private_as: type: dict - description: Remove private AS numbers in outbound AS path + description: Remove private AS numbers in outbound AS path. keys: enabled: type: bool @@ -10311,6 +11344,22 @@ keys: type: bool session_tracker: type: str + shared_secret: + type: dict + keys: + profile: + type: str + required: true + description: Name of profile defined under `management_security`. + hash_algorithm: + type: str + required: true + description: 'Note: Algorithm hmac-sha-256 requires EOS version + 4.31.1F and above.' + valid_values: + - aes-128-cmac-96 + - hmac-sha-256 + - hmac-sha1-96 ttl_maximum_hops: type: int convert_types: @@ -10328,7 +11377,7 @@ keys: keys: name: type: str - description: Interface name + description: Interface name. remote_as: type: str convert_types: @@ -10339,7 +11388,7 @@ keys: to prevent it from being interpreted as a float number.' peer: type: str - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. peer_group: type: str default: Peer-group name @@ -10347,7 +11396,7 @@ keys: type: str peer_filter: type: str - description: Peer-filter name + description: Peer-filter name. aggregate_addresses: type: list primary_key: prefix @@ -10358,28 +11407,37 @@ keys: keys: prefix: type: str - description: IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I" + description: IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I". advertise_only: type: bool as_set: type: bool advertise_map: type: str - description: Route-map name + description: Route-map name. + deprecation: + removed: true + warning: true + remove_in_version: v4.9.0 supress_map: type: str - description: Route-map name + description: Route-map name. + deprecation: + removed: true + warning: true + remove_in_version: v4.9.0 summary_only: type: bool attribute_map: type: str - description: Route-map name + description: Route-map name. match_map: type: str - description: Route-map name + description: Route-map name. redistribute_routes: type: list primary_key: source_protocol + allow_duplicate_primary_key: true convert_types: - dict - list @@ -10388,10 +11446,44 @@ keys: keys: source_protocol: type: str + valid_values: + - attached-host + - bgp + - connected + - dynamic + - isis + - ospf + - ospfv3 + - rip + - static + - user route_map: type: str + rcf: + type: str + description: 'RCF function name with parenthesis. + + Example: MyFunction(myarg). + + `route_map` and `rcf` are mutually exclusive. `route_map` takes precedence. + + Only applicable if `source_protocol` is one of `connected`, `static`, + `isis`, `user`, `dynamic`.' include_leaked: type: bool + ospf_route_type: + type: str + valid_values: + - external + - internal + - nssa-external + - nssa-external 1 + - nssa-external 2 + description: 'Routes learned by the OSPF protocol. + + The `ospf_route_type` is valid for source_protocols ''ospf'' and ''ospfv3''. + + ' vlan_aware_bundles: type: list primary_key: name @@ -10402,15 +11494,15 @@ keys: keys: name: type: str - description: VLAN aware bundle name + description: VLAN aware bundle name. tenant: type: str - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. description: type: str - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. rd: - description: Route distinguisher + description: Route distinguisher. type: str rd_evpn_domain: type: dict @@ -10422,7 +11514,7 @@ keys: - all rd: type: str - description: Route distinguisher + description: Route distinguisher. route_targets: type: dict keys: @@ -10484,13 +11576,13 @@ keys: type: str vlan: type: str - description: VLAN range as string. Example "100-200,300" + description: VLAN range as string. Example "100-200,300". convert_types: - int eos_cli: type: str description: Multiline EOS CLI rendered directly on the Router BGP, - VLAN-aware-bundle definition in the final EOS configuration + VLAN-aware-bundle definition in the final EOS configuration. vlans: type: list primary_key: id @@ -10505,9 +11597,9 @@ keys: - str tenant: type: str - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. rd: - description: Route distinguisher + description: Route distinguisher. type: str rd_evpn_domain: type: dict @@ -10519,11 +11611,11 @@ keys: - all rd: type: str - description: Route distinguisher + description: Route distinguisher. eos_cli: type: str description: Multiline EOS CLI rendered directly on the Router BGP, - VLAN definition in the final EOS configuration + VLAN definition in the final EOS configuration. route_targets: type: dict keys: @@ -10593,16 +11685,16 @@ keys: keys: name: type: str - description: VPWS instance name + description: VPWS instance name. rd: - description: Route distinguisher + description: Route distinguisher. type: str route_targets: type: dict keys: import_export: type: str - description: Route Target + description: Route Target. mpls_control_word: type: bool label_flow: @@ -10621,17 +11713,17 @@ keys: keys: name: type: str - description: Pseudowire name + description: Pseudowire name. id_local: type: int convert_types: - str - description: Must match id_remote on other pe + description: Must match id_remote on other pe. id_remote: type: int convert_types: - str - description: Must match id_local on other pe + description: Must match id_local on other pe. address_family_evpn: type: dict keys: @@ -10646,7 +11738,7 @@ keys: - vxlan - mpls next_hop_self_source_interface: - description: Source interface name + description: Source interface name. type: str next_hop_self_received_evpn_routes: type: dict @@ -10687,6 +11779,28 @@ keys: type: str activate: type: bool + rcf_in: + type: str + description: 'Inbound RCF function name with parenthesis. + + Example: MyFunction(myarg).' + rcf_out: + type: str + description: 'Outbound RCF function name with parenthesis. + + Example: MyFunction(myarg).' + default_route: + type: dict + keys: + enabled: + type: bool + rcf: + type: str + description: 'RCF function name with parenthesis. + + Example: MyFunction(myarg).' + route_map: + type: str peer_groups: type: list primary_key: name @@ -10697,15 +11811,37 @@ keys: keys: name: type: str - description: Peer-group name + description: Peer-group name. activate: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. + rcf_in: + type: str + description: 'Inbound RCF function name with parenthesis. + + Example: MyFunction(myarg).' + rcf_out: + type: str + description: 'Outbound RCF function name with parenthesis. + + Example: MyFunction(myarg).' + default_route: + type: dict + keys: + enabled: + type: bool + rcf: + type: str + description: 'RCF function name with parenthesis. + + Example: MyFunction(myarg).' + route_map: + type: str domain_remote: type: bool encapsulation: @@ -10729,14 +11865,14 @@ keys: type: bool ecmp_limit: type: int - description: Amount of ECMP paths to send + description: Amount of ECMP paths to send. convert_types: - str min: 2 max: 64 limit: type: int - description: Amount of paths to send + description: Amount of paths to send. convert_types: - str min: 2 @@ -10748,7 +11884,7 @@ keys: type: bool window: type: int - description: Time (in seconds) to detect a MAC duplication issue + description: Time (in seconds) to detect a MAC duplication issue. min: 0 max: 4294967295 convert_types: @@ -10760,14 +11896,14 @@ keys: convert_types: - str description: Minimum number of MAC moves that indicate a MAC Duplication - issue + issue. expiry_timeout: type: int min: 0 max: 4294967295 convert_types: - str - description: Time (in seconds) to purge a MAC duplication issue + description: Time (in seconds) to purge a MAC duplication issue. next_hop: type: dict keys: @@ -10782,10 +11918,60 @@ keys: - discard import_ethernet_segment_ip_mass_withdraw: type: bool + import_overlay_index_gateway: + type: bool export_ethernet_segment_ip_mass_withdraw: type: bool next_hop_unchanged: type: bool + bgp_additional_paths: + type: dict + description: BGP additional-paths commands. + keys: + receive: + type: bool + description: Receive multiple paths. + send: + type: dict + description: Send multiple paths. + keys: + any: + type: bool + description: Any eligible path. + backup: + type: bool + description: Best path and installed backup path. + ecmp: + type: bool + description: All paths in best path ECMP group. + ecmp_limit: + type: int + description: Amount of ECMP paths to send. + convert_types: + - str + min: 2 + max: 64 + limit: + type: int + description: Amount of paths to send. + convert_types: + - str + min: 2 + max: 64 + layer_2_fec_in_place_update: + type: dict + description: BGP layer-2 in-place FEC operation. + keys: + enabled: + type: bool + required: true + timeout: + type: int + description: In-place FEC update tracking timeout in seconds. + convert_types: + - str + min: 0 + max: 300 address_family_rtc: type: dict keys: @@ -10799,7 +11985,7 @@ keys: keys: name: type: str - description: Peer-group name + description: Peer-group name. activate: type: bool default_route_target: @@ -10821,11 +12007,18 @@ keys: type: dict keys: prefix: - description: IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I" + description: IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I". type: str route_map: - description: Route-map name + description: Route-map name. type: str + bgp: + type: dict + keys: + redistribute_internal: + type: bool + description: Allow redistribution of iBGP routes into an Interior + Gateway Protocol (IGP). EOS default is true. peer_groups: type: list primary_key: name @@ -10836,22 +12029,32 @@ keys: keys: name: type: str - description: Peer-group name + description: Peer-group name. activate: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. + rcf_in: + type: str + description: 'Inbound RCF function name with parenthesis. + + Example: MyFunction(myarg).' + rcf_out: + type: str + description: 'Outbound RCF function name with parenthesis. + + Example: MyFunction(myarg).' default_originate: type: dict keys: always: type: bool route_map: - description: Route-map name + description: Route-map name. type: str next_hop: type: dict @@ -10873,10 +12076,10 @@ keys: remove_in_version: 5.0.0 prefix_list_in: type: str - description: Inbound prefix-list name + description: Inbound prefix-list name. prefix_list_out: type: str - description: Outbound prefix-list name + description: Outbound prefix-list name. neighbors: type: list primary_key: ip_address @@ -10891,16 +12094,26 @@ keys: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. + rcf_in: + type: str + description: 'Inbound RCF function name with parenthesis. + + Example: MyFunction(myarg).' + rcf_out: + type: str + description: 'Outbound RCF function name with parenthesis. + + Example: MyFunction(myarg).' prefix_list_in: type: str - description: Inbound prefix-list name + description: Inbound prefix-list name. prefix_list_out: type: str - description: Prefix-list name + description: Prefix-list name. default_originate: type: dict keys: @@ -10908,6 +12121,57 @@ keys: type: bool route_map: type: str + redistribute_routes: + type: list + primary_key: source_protocol + allow_duplicate_primary_key: true + items: + type: dict + keys: + source_protocol: + type: str + valid_values: + - attached-host + - bgp + - connected + - dynamic + - isis + - ospf + - ospfv3 + - rip + - static + - user + route_map: + type: str + include_leaked: + type: bool + description: Only applicable if `source_protocol` is one of `connected`, + `static`, `isis`, `ospf`, `ospfv3`. + rcf: + type: str + description: 'RCF function name with parenthesis. + + Example: MyFunction(myarg). + + `route_map` and `rcf` are mutually exclusive. `route_map` takes + precedence. + + Only applicable if `source_protocol` is one of `connected`, `static`, + `isis`, `user`, `dynamic`.' + ospf_route_type: + type: str + valid_values: + - external + - internal + - nssa-external + - nssa-external 1 + - nssa-external 2 + description: 'Routes learned by the OSPF protocol. + + The `ospf_route_type` is valid for source_protocols ''ospf'' and + ''ospfv3''. + + ' address_family_ipv4_multicast: type: dict keys: @@ -10921,15 +12185,15 @@ keys: keys: name: type: str - description: Peer-group name + description: Peer-group name. activate: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. neighbors: type: list primary_key: ip_address @@ -10944,13 +12208,14 @@ keys: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. redistribute_routes: type: list primary_key: source_protocol + allow_duplicate_primary_key: true convert_types: - dict items: @@ -10960,6 +12225,33 @@ keys: type: str route_map: type: str + include_leaked: + type: bool + description: Only applicable if `source_protocol` is `isis`. + rcf: + type: str + description: 'RCF function name with parenthesis. + + Example: MyFunction(myarg). + + `route_map` and `rcf` are mutually exclusive. `route_map` takes + precedence. + + Only applicable if `source_protocol` is `isis`.' + ospf_route_type: + type: str + valid_values: + - external + - internal + - nssa-external + - nssa-external 1 + - nssa-external 2 + description: 'Routes learned by the OSPF protocol. + + The `ospf_route_type` is valid for source_protocols ''ospf'' and + ''ospfv3''. + + ' address_family_ipv4_sr_te: type: dict keys: @@ -10975,10 +12267,10 @@ keys: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. peer_groups: type: list primary_key: name @@ -10987,15 +12279,15 @@ keys: keys: name: type: str - description: Peer-group name + description: Peer-group name. activate: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. address_family_ipv6: type: dict keys: @@ -11008,11 +12300,18 @@ keys: type: dict keys: prefix: - description: IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I" + description: IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I". type: str route_map: - description: Route-map name + description: Route-map name. type: str + bgp: + type: dict + keys: + redistribute_internal: + type: bool + description: Allow redistribution of iBGP routes into an Interior + Gateway Protocol (IGP). EOS default is true. peer_groups: type: list primary_key: name @@ -11023,21 +12322,31 @@ keys: keys: name: type: str - description: Peer-group name + description: Peer-group name. activate: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. + rcf_in: + type: str + description: 'Inbound RCF function name with parenthesis. + + Example: MyFunction(myarg).' + rcf_out: + type: str + description: 'Outbound RCF function name with parenthesis. + + Example: MyFunction(myarg).' prefix_list_in: type: str - description: Inbound prefix-list name + description: Inbound prefix-list name. prefix_list_out: type: str - description: Outbound prefix-list name + description: Outbound prefix-list name. neighbors: type: list primary_key: ip_address @@ -11052,19 +12361,30 @@ keys: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. + rcf_in: + type: str + description: 'Inbound RCF function name with parenthesis. + + Example: MyFunction(myarg).' + rcf_out: + type: str + description: 'Outbound RCF function name with parenthesis. + + Example: MyFunction(myarg).' prefix_list_in: type: str - description: Inbound prefix-list name + description: Inbound prefix-list name. prefix_list_out: type: str - description: Outbound prefix-list name + description: Outbound prefix-list name. redistribute_routes: type: list primary_key: source_protocol + allow_duplicate_primary_key: true convert_types: - dict items: @@ -11076,6 +12396,30 @@ keys: type: str include_leaked: type: bool + rcf: + type: str + description: 'RCF function name with parenthesis. + + Example: MyFunction(myarg). + + `route_map` and `rcf` are mutually exclusive. `route_map` takes + precedence. + + Only used if `source_protocol` is one of `connected`, `static`, + `isis`, `user`, `dynamic`.' + ospf_route_type: + type: str + valid_values: + - external + - internal + - nssa-external + - nssa-external 1 + - nssa-external 2 + description: 'Routes learned by the OSPF protocol. + + The `ospf_route_type` is valid for source_protocols ''ospfv3''. + + ' address_family_ipv6_multicast: type: dict keys: @@ -11116,10 +12460,10 @@ keys: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. peer_groups: type: list primary_key: name @@ -11130,7 +12474,7 @@ keys: keys: name: type: str - description: Peer-group name + description: Peer-group name. activate: type: bool networks: @@ -11143,9 +12487,55 @@ keys: keys: prefix: type: str - description: IPv6 prefix "A:B:C:D:E:F:G:H/I" + description: IPv6 prefix "A:B:C:D:E:F:G:H/I". + route_map: + type: str + redistribute_routes: + type: list + primary_key: source_protocol + allow_duplicate_primary_key: true + convert_types: + - dict + items: + type: dict + keys: + source_protocol: + type: str + valid_values: + - connected + - isis + - ospf + - ospfv3 + - static + include_leaked: + type: bool + description: Only applicable if `source_protocol` is `isis`. route_map: type: str + rcf: + type: str + description: 'RCF function name with parenthesis. + + Example: MyFunction(myarg). + + `route_map` and `rcf` are mutually exclusive. `route_map` takes + precedence. + + Only applicable if `source_protocol` is `isis`.' + ospf_route_type: + type: str + valid_values: + - external + - internal + - nssa-external + - nssa-external 1 + - nssa-external 2 + description: 'Routes learned by the OSPF protocol. + + The `ospf_route_type` is valid for source_protocols ''ospf'' and + ''ospfv3''. + + ' address_family_ipv6_sr_te: type: dict keys: @@ -11161,10 +12551,10 @@ keys: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. peer_groups: type: list primary_key: name @@ -11173,15 +12563,15 @@ keys: keys: name: type: str - description: Peer-group name + description: Peer-group name. activate: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. address_family_link_state: type: dict keys: @@ -11211,7 +12601,7 @@ keys: keys: name: type: str - description: Peer-group name + description: Peer-group name. activate: type: bool missing_policy: @@ -11309,7 +12699,7 @@ keys: keys: name: type: str - description: Peer-group name + description: Peer-group name. activate: type: bool address_family_flow_spec_ipv6: @@ -11355,7 +12745,7 @@ keys: keys: name: type: str - description: Peer-group name + description: Peer-group name. activate: type: bool address_family_path_selection: @@ -11380,14 +12770,14 @@ keys: type: bool ecmp_limit: type: int - description: Amount of ECMP paths to send + description: Amount of ECMP paths to send. convert_types: - str min: 2 max: 64 limit: type: int - description: Amount of paths to send + description: Amount of paths to send. convert_types: - str min: 2 @@ -11424,14 +12814,14 @@ keys: type: bool ecmp_limit: type: int - description: Amount of ECMP paths to send + description: Amount of ECMP paths to send. convert_types: - str min: 2 max: 64 limit: type: int - description: Amount of paths to send + description: Amount of paths to send. convert_types: - str min: 2 @@ -11444,7 +12834,7 @@ keys: keys: name: type: str - description: Peer-group name + description: Peer-group name. activate: type: bool additional_paths: @@ -11467,14 +12857,14 @@ keys: type: bool ecmp_limit: type: int - description: Amount of ECMP paths to send + description: Amount of ECMP paths to send. convert_types: - str min: 2 max: 64 limit: type: int - description: Amount of paths to send + description: Amount of paths to send. convert_types: - str min: 2 @@ -11494,15 +12884,37 @@ keys: keys: name: type: str - description: Peer-group name + description: Peer-group name. activate: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. + rcf_in: + type: str + description: 'Inbound RCF function name with parenthesis. + + Example: MyFunction(myarg).' + rcf_out: + type: str + description: 'Outbound RCF function name with parenthesis. + + Example: MyFunction(myarg).' + default_route: + type: dict + keys: + enabled: + type: bool + rcf: + type: str + description: 'RCF function name with parenthesis. + + Example: MyFunction(myarg).' + route_map: + type: str route: type: dict keys: @@ -11524,10 +12936,32 @@ keys: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. + rcf_in: + type: str + description: 'Inbound RCF function name with parenthesis. + + Example: MyFunction(myarg).' + rcf_out: + type: str + description: 'Outbound RCF function name with parenthesis. + + Example: MyFunction(myarg).' + default_route: + type: dict + keys: + enabled: + type: bool + rcf: + type: str + description: 'RCF function name with parenthesis. + + Example: MyFunction(myarg).' + route_map: + type: str neighbor_default_encapsulation_mpls_next_hop_self: type: dict keys: @@ -11548,15 +12982,37 @@ keys: keys: name: type: str - description: Peer-group name + description: Peer-group name. activate: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. + rcf_in: + type: str + description: 'Inbound RCF function name with parenthesis. + + Example: MyFunction(myarg).' + rcf_out: + type: str + description: 'Outbound RCF function name with parenthesis. + + Example: MyFunction(myarg).' + default_route: + type: dict + keys: + enabled: + type: bool + rcf: + type: str + description: 'RCF function name with parenthesis. + + Example: MyFunction(myarg).' + route_map: + type: str route: type: dict keys: @@ -11578,10 +13034,32 @@ keys: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. + rcf_in: + type: str + description: 'Inbound RCF function name with parenthesis. + + Example: MyFunction(myarg).' + rcf_out: + type: str + description: 'Outbound RCF function name with parenthesis. + + Example: MyFunction(myarg).' + default_route: + type: dict + keys: + enabled: + type: bool + rcf: + type: str + description: 'RCF function name with parenthesis. + + Example: MyFunction(myarg).' + route_map: + type: str neighbor_default_encapsulation_mpls_next_hop_self: type: dict keys: @@ -11597,24 +13075,53 @@ keys: keys: name: type: str - description: VRF name + description: VRF name. convert_types: - int + bgp: + type: dict + keys: + redistribute_internal: + type: bool + description: Allow redistribution of iBGP routes into an Interior + Gateway Protocol (IGP). EOS default is true. rd: type: str - description: Route distinguisher + description: Route distinguisher. evpn_multicast: type: bool evpn_multicast_address_family: type: dict - description: Enable per-AF EVPN multicast settings + description: Enable per-AF EVPN multicast settings. keys: ipv4: type: dict keys: transit: type: bool - description: Enable EVPN multicast transit mode + description: Enable EVPN multicast transit mode. + default_route_exports: + type: list + primary_key: address_family + description: Enable default-originate per VRF/address-family. + items: + type: dict + keys: + address_family: + type: str + valid_values: + - evpn + - vpn-ipv4 + - vpn-ipv6 + always: + type: bool + route_map: + type: str + rcf: + type: str + description: 'RCF function name with parenthesis. + + Example: MyFunction(myarg).' route_targets: type: dict keys: @@ -11635,6 +13142,25 @@ keys: type: str route_map: type: str + description: Only applicable if `address_family` is one of + `evpn`, `vpn-ipv4` or `vpn-ipv6`. + rcf: + type: str + description: 'RCF function name with parenthesis. + + Example: MyFunction(myarg). + + Only applicable if `address_family` is one of `evpn`, `vpn-ipv4` + or `vpn-ipv6`.' + vpn_route_filter_rcf: + type: str + description: 'RCF function name with parenthesis for filtering + VPN routes. Also requires `rcf` to be set. + + Example: MyFunction(myarg). + + Only applicable if `address_family` is one of `vpn-ipv4` + or `vpn-ipv6`.' export: type: list primary_key: address_family @@ -11652,13 +13178,32 @@ keys: type: str route_map: type: str + description: Only applicable if `address_family` is one of + `evpn`, `vpn-ipv4` or `vpn-ipv6`. + rcf: + type: str + description: 'RCF function name with parenthesis. + + Example: MyFunction(myarg). + + Only applicable if `address_family` is one of `evpn`, `vpn-ipv4` + or `vpn-ipv6`.' + vpn_route_filter_rcf: + type: str + description: 'RCF function name with parenthesis for filtering + VPN routes. Also requires `rcf` to be set. + + Example: MyFunction(myarg). + + Only applicable if `address_family` is one of `vpn-ipv4` + or `vpn-ipv6`.' router_id: - description: in IP address format A.B.C.D + description: in IP address format A.B.C.D. type: str timers: type: str description: BGP Keepalive and Hold Timer values in seconds as string - "<0-3600> <0-3600>" + "<0-3600> <0-3600>". networks: type: list primary_key: prefix @@ -11669,7 +13214,7 @@ keys: keys: prefix: type: str - description: IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I" + description: IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I". route_map: type: str updates: @@ -11695,7 +13240,7 @@ keys: listen_ranges: type: list description: 'Improved "listen_ranges" data model to support multiple - listen ranges and additional filter capabilities + listen ranges and additional filter capabilities. ' items: @@ -11703,21 +13248,21 @@ keys: keys: prefix: type: str - description: IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I" + description: IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I". peer_id_include_router_id: type: bool - description: Include router ID as part of peer filter + description: Include router ID as part of peer filter. peer_group: type: str - description: Peer-group name + description: Peer-group name. peer_filter: type: str - description: 'Peer-filter name + description: 'Peer-filter name. note: `peer_filter`` or `remote_as` is required but mutually exclusive. - If both are defined, peer_filter takes precedence + If both are defined, peer_filter takes precedence. ' remote_as: @@ -11741,7 +13286,7 @@ keys: type: str peer_group: type: str - description: Peer-group name + description: Peer-group name. remote_as: type: str description: 'BGP AS <1-4294967295> or AS number in asdot notation @@ -11757,7 +13302,7 @@ keys: type: bool remove_private_as: type: dict - description: Remove private AS numbers in outbound AS path + description: Remove private AS numbers in outbound AS path. keys: enabled: type: bool @@ -11789,14 +13334,14 @@ keys: - int as_path: type: dict - description: BGP AS-PATH options + description: BGP AS-PATH options. keys: remote_as_replace_out: type: bool - description: Replace AS number with local AS number + description: Replace AS number with local AS number. prepend_own_disabled: type: bool - description: Disable prepending own AS number to AS path + description: Disable prepending own AS number to AS path. description: type: str route_reflector_client: @@ -11805,7 +13350,7 @@ keys: type: int min: 1 max: 255 - description: Time-to-live in range of hops + description: Time-to-live in range of hops. next_hop_self: type: bool shutdown: @@ -11844,7 +13389,7 @@ keys: timers: type: str description: BGP Keepalive and Hold Timer values in seconds as - string "<0-3600> <0-3600>" + string "<0-3600> <0-3600>". rib_in_pre_policy_retain: type: dict keys: @@ -11855,7 +13400,7 @@ keys: send_community: type: str description: '''all'' or a combination of ''standard'', ''extended'', - ''large'' and ''link-bandwidth (w/options)''' + ''large'' and ''link-bandwidth (w/options)''.' maximum_routes: type: int convert_types: @@ -11868,7 +13413,7 @@ keys: issued (0 means never warn) or Percentage of maximum number of routes at which to warn ("<1-100> - percent") + percent"). ' maximum_routes_warning_only: @@ -11884,7 +13429,7 @@ keys: - str min: 1 max: 10 - description: Number of local ASNs allowed in a BGP update + description: Number of local ASNs allowed in a BGP update. default_originate: type: dict keys: @@ -11898,13 +13443,13 @@ keys: type: str route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. prefix_list_in: type: str - description: Inbound prefix-list name + description: Inbound prefix-list name. deprecation: warning: true new_key: router_bgp.vrfs[].address_family_ipv4.neighbors[].prefix_list_in @@ -11912,7 +13457,7 @@ keys: remove_in_version: 5.0.0 prefix_list_out: type: str - description: Outbound prefix-list name + description: Outbound prefix-list name. deprecation: warning: true new_key: router_bgp.vrfs[].address_family_ipv4.neighbors[].prefix_list_out @@ -11928,7 +13473,7 @@ keys: keys: name: type: str - description: Interface name + description: Interface name. remote_as: type: str description: 'BGP AS <1-4294967295> or AS number in asdot notation @@ -11940,15 +13485,16 @@ keys: - int peer_group: type: str - description: Peer-group name + description: Peer-group name. peer_filter: type: str - description: Peer-filter name + description: Peer-filter name. description: type: str redistribute_routes: type: list primary_key: source_protocol + allow_duplicate_primary_key: true convert_types: - dict - list @@ -11961,6 +13507,31 @@ keys: type: str include_leaked: type: bool + rcf: + type: str + description: 'RCF function name with parenthesis. + + Example: MyFunction(myarg). + + `route_map` and `rcf` are mutually exclusive. `route_map` takes + precedence. + + Only applicable if `source_protocol` is one of `connected`, + `dynamic`, `isis`, `static` and `user`.' + ospf_route_type: + type: str + valid_values: + - external + - internal + - nssa-external + - nssa-external 1 + - nssa-external 2 + description: 'Routes learned by the OSPF protocol. + + The `ospf_route_type` is valid for source_protocols ''ospf'' + and ''ospfv3''. + + ' aggregate_addresses: type: list primary_key: prefix @@ -11971,17 +13542,25 @@ keys: keys: prefix: type: str - description: IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I" + description: IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I". advertise_only: type: bool as_set: type: bool advertise_map: type: str - description: Route-map name + description: Route-map name. + deprecation: + removed: true + warning: true + remove_in_version: v4.9.0 supress_map: type: str - description: Route-map name + description: Route-map name. + deprecation: + removed: true + warning: true + remove_in_version: v4.9.0 summary_only: type: bool attribute_map: @@ -12029,18 +13608,22 @@ keys: type: bool ecmp_limit: type: int - description: Amount of ECMP paths to send + description: Amount of ECMP paths to send. convert_types: - str min: 2 max: 64 limit: type: int - description: Amount of paths to send + description: Amount of paths to send. convert_types: - str min: 2 max: 64 + redistribute_internal: + type: bool + description: Allow redistribution of iBGP routes into an Interior + Gateway Protocol (IGP). EOS default is true. neighbors: type: list primary_key: ip_address @@ -12055,16 +13638,26 @@ keys: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. + rcf_in: + type: str + description: 'Inbound RCF function name with parenthesis. + + Example: MyFunction(myarg).' + rcf_out: + type: str + description: 'Outbound RCF function name with parenthesis. + + Example: MyFunction(myarg).' prefix_list_in: type: str - description: Inbound prefix-list name + description: Inbound prefix-list name. prefix_list_out: type: str - description: Outbound prefix-list name + description: Outbound prefix-list name. next_hop: type: dict keys: @@ -12086,9 +13679,60 @@ keys: keys: prefix: type: str - description: IPv4 prefix "A.B.C.D/E" + description: IPv4 prefix "A.B.C.D/E". + route_map: + type: str + redistribute_routes: + type: list + primary_key: source_protocol + allow_duplicate_primary_key: true + convert_types: + - dict + items: + type: dict + keys: + source_protocol: + type: str + valid_values: + - attached-host + - bgp + - connected + - dynamic + - isis + - ospf + - ospfv3 + - rip + - static + - user route_map: type: str + include_leaked: + type: bool + rcf: + type: str + description: 'RCF function name with parenthesis. + + Example: MyFunction(myarg). + + `route_map` and `rcf` are mutually exclusive. `route_map` + takes precedence. + + Only applicable if `source_protocol` is one of `connected`, + `dynamic`, `isis`, `static` and `user`.' + ospf_route_type: + type: str + valid_values: + - external + - internal + - nssa-external + - nssa-external 1 + - nssa-external 2 + description: 'Routes learned by the OSPF protocol. + + The `ospf_route_type` is valid for source_protocols ''ospf'' + and ''ospfv3''. + + ' address_family_ipv6: type: dict keys: @@ -12130,18 +13774,22 @@ keys: type: bool ecmp_limit: type: int - description: Amount of ECMP paths to send + description: Amount of ECMP paths to send. convert_types: - str min: 2 max: 64 limit: type: int - description: Amount of paths to send + description: Amount of paths to send. convert_types: - str min: 2 max: 64 + redistribute_internal: + type: bool + description: Allow redistribution of iBGP routes into an Interior + Gateway Protocol (IGP). EOS default is true. neighbors: type: list primary_key: ip_address @@ -12156,16 +13804,26 @@ keys: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. + rcf_in: + type: str + description: 'Inbound RCF function name with parenthesis. + + Example: MyFunction(myarg).' + rcf_out: + type: str + description: 'Outbound RCF function name with parenthesis. + + Example: MyFunction(myarg).' prefix_list_in: type: str - description: Inbound prefix-list name + description: Inbound prefix-list name. prefix_list_out: type: str - description: Outbound prefix-list name + description: Outbound prefix-list name. networks: type: list primary_key: prefix @@ -12176,9 +13834,58 @@ keys: keys: prefix: type: str - description: IPv6 prefix "A:B:C:D:E:F:G:H/I" + description: IPv6 prefix "A:B:C:D:E:F:G:H/I". + route_map: + type: str + redistribute_routes: + type: list + primary_key: source_protocol + allow_duplicate_primary_key: true + convert_types: + - dict + items: + type: dict + keys: + source_protocol: + type: str + valid_values: + - attached-host + - bgp + - connected + - dhcp + - dynamic + - isis + - ospfv3 + - static + - user route_map: type: str + include_leaked: + type: bool + rcf: + type: str + description: 'RCF function name with parenthesis. + + Example: MyFunction(myarg). + + `route_map` and `rcf` are mutually exclusive. `route_map` + takes precedence. + + Only applicable if `source_protocol` is one of `connected`, + `dynamic`, `isis`, `static` and `user`.' + ospf_route_type: + type: str + valid_values: + - external + - internal + - nssa-external + - nssa-external 1 + - nssa-external 2 + description: 'Routes learned by the OSPF protocol. + + The `ospf_route_type` is valid for source_protocols ''ospfv3''. + + ' address_family_ipv4_multicast: type: dict keys: @@ -12219,10 +13926,10 @@ keys: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. networks: type: list primary_key: prefix @@ -12233,9 +13940,56 @@ keys: keys: prefix: type: str - description: IPv6 prefix "A.B.C.D/E" + description: IPv6 prefix "A.B.C.D/E". + route_map: + type: str + redistribute_routes: + type: list + primary_key: source_protocol + allow_duplicate_primary_key: true + convert_types: + - dict + items: + type: dict + keys: + source_protocol: + type: str + valid_values: + - attached-host + - connected + - isis + - ospf + - ospfv3 + - static route_map: type: str + include_leaked: + type: bool + description: Only applicable if `source_protocol` is `isis`. + rcf: + type: str + description: 'RCF function name with parenthesis. + + Example: MyFunction(myarg). + + `route_map` and `rcf` are mutually exclusive. `route_map` + takes precedence. + + Only applicable if `source_protocol` is `isis`.' + ospf_route_type: + type: str + valid_values: + - external + - internal + - nssa-external + - nssa-external 1 + - nssa-external 2 + description: 'Routes learned by the OSPF protocol. + + The `ospf_route_type` is valid for source_protocols ''ospf'' + and ''ospfv3''. + + ' address_family_ipv6_multicast: type: dict keys: @@ -12276,10 +14030,10 @@ keys: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. networks: type: list primary_key: prefix @@ -12290,9 +14044,55 @@ keys: keys: prefix: type: str - description: IPv6 prefix "A:B:C:D:E:F:G:H/I" + description: IPv6 prefix "A:B:C:D:E:F:G:H/I". + route_map: + type: str + redistribute_routes: + type: list + primary_key: source_protocol + allow_duplicate_primary_key: true + convert_types: + - dict + items: + type: dict + keys: + source_protocol: + type: str + valid_values: + - connected + - isis + - ospf + - ospfv3 + - static route_map: type: str + include_leaked: + type: bool + description: Only applicable if `source_protocol` is `isis`. + rcf: + type: str + description: 'RCF function name with parenthesis. + + Example: MyFunction(myarg). + + `route_map` and `rcf` are mutually exclusive. `route_map` + takes precedence. + + Only applicable if `source_protocol` is `isis`.' + ospf_route_type: + type: str + valid_values: + - external + - internal + - nssa-external + - nssa-external 1 + - nssa-external 2 + description: 'Routes learned by the OSPF protocol. + + The `ospf_route_type` is valid for source_protocols ''ospf'' + and ''ospfv3''. + + ' address_family_flow_spec_ipv4: type: dict keys: @@ -12409,10 +14209,10 @@ keys: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. peer_groups: type: list primary_key: name @@ -12423,7 +14223,7 @@ keys: keys: name: type: str - description: Peer-group name + description: Peer-group name. activate: type: bool next_hop: @@ -12441,13 +14241,13 @@ keys: keys: prefix: type: str - description: IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I" + description: IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I". route_map: type: str eos_cli: type: str description: 'Multiline EOS CLI rendered directly on the Router BGP, - VRF definition in the final EOS configuration + VRF definition in the final EOS configuration. ' session_trackers: @@ -12458,10 +14258,10 @@ keys: keys: name: type: str - description: Name of session tracker + description: Name of session tracker. recovery_delay: type: int - description: Recovery delay in seconds + description: Recovery delay in seconds. convert_types: - str min: 1 @@ -12479,10 +14279,10 @@ keys: keys: ipv4: type: str - description: IPv4 Address + description: IPv4 Address. ipv6: type: str - description: IPv6 Address + description: IPv6 Address. nexthop_fast_failover: type: bool default: false @@ -12496,7 +14296,7 @@ keys: keys: name: type: str - description: Destination-VRF + description: Destination-VRF. convert_types: - int leak_routes: @@ -12510,7 +14310,7 @@ keys: - int subscribe_policy: type: str - description: Route-Map Policy + description: Route-Map Policy. routes: type: dict keys: @@ -12521,18 +14321,45 @@ keys: keys: name: type: str - description: Dynamic Prefix List Name + description: Dynamic Prefix List Name. + control_functions: + type: dict + description: 'Routing control functions (RCF) used to filter and update routes + from a peer or during redistributions. + + Warning: + + This configuration cannot be pushed with `eos_config_deploy_eapi`, because + of limitations in `arista.eos` and `ansible.netcommon` plugins. + + The configuration can be pushed via CloudVision with `eos_config_deploy_cvp` + or `cv_deploy`.' + keys: + code_units: + type: list + primary_key: name + items: + type: dict + keys: + name: + type: str + description: Name of the code unit. + content: + type: str + required: true + description: "Content of route control function.\ne.g.\nfunction + ACCEPT_ALL() {\n return true;\n }\nEOF" router_igmp: type: dict display_name: Router IGMP Configuration keys: host_proxy_match_mroute: type: str - description: 'Specify conditions for sending IGMP joins for host-proxy + description: 'Specify conditions for sending IGMP joins for host-proxy. - ''iif'' will enable igmp host-proxy to work in iif aware + ''iif'' will enable igmp host-proxy to work in iif aware. - ''all'' will enable igmp host-proxy to work in iif unaware mode (EOS default) + ''all'' will enable igmp host-proxy to work in iif unaware mode (EOS default). ' valid_values: @@ -12554,15 +14381,15 @@ keys: keys: name: type: str - description: VRF name + description: VRF name. host_proxy_match_mroute: type: str - description: 'Specify conditions for sending IGMP joins for host-proxy + description: 'Specify conditions for sending IGMP joins for host-proxy. - ''iif'' will enable igmp host-proxy to work in iif aware + ''iif'' will enable igmp host-proxy to work in iif aware. ''all'' will enable igmp host-proxy to work in iif unaware mode (EOS - default) + default). ' valid_values: @@ -12627,13 +14454,13 @@ keys: instance: type: str required: true - description: ISIS Instance Name + description: ISIS Instance Name. net: type: str - description: CLNS Address like "49.0001.0001.0000.0001.00" + description: CLNS Address like "49.0001.0001.0000.0001.00". router_id: type: str - description: IPv4 Address + description: IPv4 Address. is_type: display_name: IS Type type: str @@ -12807,7 +14634,7 @@ keys: - ipv6 - ipv4 unicast - ipv6 unicast - description: Address Family + description: Address Family. deprecation: warning: true new_key: address_family_ipv4.enabled or address_family_ipv6.enabled @@ -12816,7 +14643,7 @@ keys: type: list items: type: str - description: 'EOS CLI rendered under the address families + description: 'EOS CLI rendered under the address families. Example "maximum-paths 64" @@ -12842,7 +14669,7 @@ keys: - static route_map: type: str - description: Route-map name + description: Route-map name. include_leaked: type: bool ospf_route_type: @@ -12852,7 +14679,7 @@ keys: - internal - nssa-external description: ospf_route_type is required with source_protocols 'ospf' - and 'ospfv3' + and 'ospfv3'. address_family_ipv4: type: dict keys: @@ -12882,7 +14709,7 @@ keys: - level-2 srlg: type: dict - description: Shared Risk Link Group + description: Shared Risk Link Group. keys: enable: type: bool @@ -12895,7 +14722,7 @@ keys: type: bool rcf: type: str - description: Route Control Function + description: Route Control Function. address_family_ipv6: type: dict keys: @@ -12926,7 +14753,7 @@ keys: description: Optional, default is to protect all levels. srlg: type: dict - description: Shared Risk Link Group + description: Shared Risk Link Group. keys: enable: type: bool @@ -12959,9 +14786,17 @@ keys: type: int convert_types: - str - min: 1 - max: 300 - description: Maximum interval between two SPFs in seconds. + description: 'Maximum interval between two SPFs in seconds or milliseconds. + + Range in seconds: <1-300> + + Range in milliseconds: <1-300000>' + interval_unit: + type: str + valid_values: + - seconds + - milliseconds + description: If interval unit is not defined EOS takes `seconds` by default. wait_interval: type: int convert_types: @@ -12969,6 +14804,13 @@ keys: min: 1 max: 300000 description: Initial wait interval for SPF in milliseconds. + hold_interval: + type: int + convert_types: + - str + min: 1 + max: 300000 + description: Hold interval between the first and second SPF runs in milliseconds. graceful_restart: type: dict keys: @@ -13023,8 +14865,8 @@ keys: keys: prefix_list: type: str - description: Prefix-list name. ND Proxying is disabled for IPv6 addresses - defined in the prefix-list. + description: Prefix-list name. Neighbor Discovery Proxying is disabled + for IPv6 addresses defined in the prefix-list. nd_rs_flooding_disabled: type: bool virtual_router_nd_ra_flooding_disabled: @@ -13034,12 +14876,12 @@ keys: keys: originator_id_local_interface: type: str - description: Interface to use for originator ID + description: Interface to use for originator ID. rejected_limit: type: int convert_types: - str - description: Maximum number of rejected SA messages allowed in cache + description: Maximum number of rejected SA messages allowed in cache. min: 0 max: 40000 forward_register_packets: @@ -13058,12 +14900,12 @@ keys: keys: source_prefix: type: str - description: Source address prefix + description: Source address prefix. limit: type: int convert_types: - str - description: Limit for SAs matching the source address prefix + description: Limit for SAs matching the source address prefix. min: 0 max: 40000 required: true @@ -13075,7 +14917,7 @@ keys: keys: ipv4_address: type: str - description: Peer IP Address + description: Peer IP Address. default_peer: type: dict keys: @@ -13083,19 +14925,19 @@ keys: type: bool prefix_list: type: str - description: Prefix list to filter source of SA messages + description: Prefix list to filter source of SA messages. local_interface: type: str description: type: str disabled: type: bool - description: Disable the MSDP peer + description: Disable the MSDP peer. sa_limit: type: int convert_types: - str - description: Maximum number of SA messages allowed in cache + description: Maximum number of SA messages allowed in cache. min: 0 max: 40000 mesh_groups: @@ -13106,7 +14948,7 @@ keys: keys: name: type: str - description: Mesh group name + description: Mesh group name. keepalive: type: dict keys: @@ -13122,7 +14964,7 @@ keys: convert_types: - str required: true - description: Must be greater than keepalive timer + description: Must be greater than keepalive timer. min: 1 max: 65535 sa_filter: @@ -13130,10 +14972,10 @@ keys: keys: in_list: type: str - description: ACL to filter inbound SA messages + description: ACL to filter inbound SA messages. out_list: type: str - description: ACL to filter outbound SA messages + description: ACL to filter outbound SA messages. vrfs: type: list primary_key: name @@ -13142,17 +14984,17 @@ keys: keys: name: type: str - description: VRF name + description: VRF name. convert_types: - int originator_id_local_interface: type: str - description: Interface to use for originator ID + description: Interface to use for originator ID. rejected_limit: type: int convert_types: - str - description: Maximum number of rejected SA messages allowed in cache + description: Maximum number of rejected SA messages allowed in cache. min: 0 max: 40000 forward_register_packets: @@ -13171,12 +15013,12 @@ keys: keys: source_prefix: type: str - description: Source address prefix + description: Source address prefix. limit: type: int convert_types: - str - description: Limit for SAs matching the source address prefix + description: Limit for SAs matching the source address prefix. min: 0 max: 40000 required: true @@ -13188,7 +15030,7 @@ keys: keys: ipv4_address: type: str - description: Peer IP Address + description: Peer IP Address. default_peer: type: dict keys: @@ -13196,19 +15038,19 @@ keys: type: bool prefix_list: type: str - description: Prefix list to filter source of SA messages + description: Prefix list to filter source of SA messages. local_interface: type: str description: type: str disabled: type: bool - description: Disable the MSDP peer + description: Disable the MSDP peer. sa_limit: type: int convert_types: - str - description: Maximum number of SA messages allowed in cache + description: Maximum number of SA messages allowed in cache. min: 0 max: 40000 mesh_groups: @@ -13219,7 +15061,7 @@ keys: keys: name: type: str - description: Mesh group name + description: Mesh group name. keepalive: type: dict keys: @@ -13235,7 +15077,7 @@ keys: convert_types: - str required: true - description: Must be greater than keepalive timer + description: Must be greater than keepalive timer. min: 1 max: 65535 sa_filter: @@ -13243,21 +15085,28 @@ keys: keys: in_list: type: str - description: ACL to filter inbound SA messages + description: ACL to filter inbound SA messages. out_list: type: str - description: ACL to filter outbound SA messages + description: ACL to filter outbound SA messages. router_multicast: type: dict keys: ipv4: type: dict keys: + activity_polling_interval: + type: int + convert_types: + - str + min: 1 + max: 60 + description: MFIB entry activity polling interval. counters: type: dict keys: rate_period_decay: - description: Rate in seconds + description: Rate in seconds. type: int min: 0 max: 600 @@ -13286,7 +15135,7 @@ keys: type: dict keys: source_prefix: - description: Source address A.B.C.D or Source prefix A.B.C.D/E + description: Source address A.B.C.D or Source prefix A.B.C.D/E. type: str required: true destinations: @@ -13296,16 +15145,26 @@ keys: type: dict keys: nexthop: - description: Next-hop IP address or interface name + description: Next-hop IP address or interface name. type: str required: true distance: - description: Administrative distance for this route + description: Administrative distance for this route. type: int min: 1 max: 255 convert_types: - str + ipv6: + type: dict + keys: + activity_polling_interval: + type: int + convert_types: + - str + min: 1 + max: 60 + description: MFIB entry activity polling interval. vrfs: type: list primary_key: name @@ -13337,17 +15196,17 @@ keys: type: int convert_types: - str - description: OSPF Process ID + description: OSPF Process ID. vrf: type: str - description: VRF Name for OSPF Process + description: VRF Name for OSPF Process. convert_types: - int passive_interface_default: type: bool router_id: type: str - description: IPv4 Address + description: IPv4 Address. distance: type: dict keys: @@ -13391,7 +15250,7 @@ keys: type: list items: type: str - description: Interface Name + description: Interface Name. distribute_list_in: type: dict keys: @@ -13412,7 +15271,7 @@ keys: convert_types: - str description: Min interval in msecs between accepting the same - LSA + LSA. min: 0 max: 600000 tx_delay: @@ -13423,7 +15282,7 @@ keys: convert_types: - str description: Delay to generate first occurrence of LSA in - msecs + msecs. min: 0 max: 600000 min: @@ -13431,7 +15290,7 @@ keys: convert_types: - str description: Min delay between originating the same LSA - in msecs + in msecs. min: 1 max: 600000 max: @@ -13439,7 +15298,7 @@ keys: convert_types: - str description: 1-600000 Maximum delay between originating - the same LSA in msec + the same LSA in msec. min: 1 max: 600000 spf_delay: @@ -13449,21 +15308,21 @@ keys: type: int convert_types: - str - description: Initial SPF schedule delay in msecs + description: Initial SPF schedule delay in msecs. min: 0 max: 600000 min: type: int convert_types: - str - description: Min Hold time between two SPFs in msecs + description: Min Hold time between two SPFs in msecs. min: 0 max: 65535000 max: type: int convert_types: - str - description: Max wait time between two SPFs in msecs + description: Max wait time between two SPFs in msecs. min: 0 max: 65535000 default_information_originate: @@ -13475,7 +15334,7 @@ keys: type: int convert_types: - str - description: Metric for default route + description: Metric for default route. min: 1 max: 65535 metric_type: @@ -13485,7 +15344,7 @@ keys: valid_values: - 1 - 2 - description: OSPF metric type for default route + description: OSPF metric type for default route. summary_addresses: type: list primary_key: prefix @@ -13494,7 +15353,7 @@ keys: keys: prefix: type: str - description: Summary Prefix Address + description: Summary Prefix Address. tag: type: int attribute_map: @@ -13509,7 +15368,7 @@ keys: keys: route_map: type: str - description: Route Map Name + description: Route Map Name. include_leaked: type: bool connected: @@ -13517,7 +15376,7 @@ keys: keys: route_map: type: str - description: Route Map Name + description: Route Map Name. include_leaked: type: bool bgp: @@ -13525,14 +15384,14 @@ keys: keys: route_map: type: str - description: Route Map Name + description: Route Map Name. include_leaked: type: bool auto_cost_reference_bandwidth: type: int convert_types: - str - description: Bandwidth in mbps + description: Bandwidth in mbps. areas: type: list primary_key: id @@ -13552,10 +15411,10 @@ keys: type: list items: type: str - description: IPv4 Prefix + description: IPv4 Prefix. prefix_list: type: str - description: Prefix-List Name + description: Prefix-List Name. type: type: str valid_values: @@ -13574,7 +15433,7 @@ keys: type: int convert_types: - str - description: Metric for default route + description: Metric for default route. min: 1 max: 65535 metric_type: @@ -13584,7 +15443,7 @@ keys: valid_values: - 1 - 2 - description: OSPF metric type for default route + description: OSPF metric type for default route. maximum_paths: type: int convert_types: @@ -13612,7 +15471,7 @@ keys: type: str convert_types: - int - description: '"wait-for-bgp" or Integer 5-86400 + description: '"wait-for-bgp" or Integer 5-86400. Example: "wait-for-bgp" Or "222" @@ -13631,7 +15490,7 @@ keys: eos_cli: type: str description: Multiline EOS CLI rendered directly on the Router OSPF - process ID in the final EOS configuration + process ID in the final EOS configuration. router_path_selection: type: dict description: Dynamic path selection configuration. @@ -13664,8 +15523,8 @@ keys: type: str valid_values: - lan - description: Flow assignement `lan` can not be configured in a path - group with dynamic peers. + description: Flow assignment `lan` can not be configured in a path group + with dynamic peers. local_interfaces: type: list primary_key: name @@ -13714,8 +15573,8 @@ keys: type: str dynamic_peers: type: dict - description: Flow assignement `lan` can not be configured in a path - group with dynamic peers. + description: Flow assignment `lan` can not be configured in a path group + with dynamic peers. keys: enabled: type: bool @@ -13811,7 +15670,7 @@ keys: keys: name: type: str - description: Path-group name + description: Path-group name. priority: type: int description: 'Priority for this path-group. @@ -13899,10 +15758,10 @@ keys: keys: bfd: type: bool - description: Enable/Disable BFD + description: Enable/Disable BFD. ssm_range: type: str - description: IPv4 Prefix associated with SSM + description: IPv4 Prefix associated with SSM. rp_addresses: type: list primary_key: address @@ -13913,7 +15772,7 @@ keys: keys: address: type: str - description: RP Address + description: RP Address. groups: type: list convert_types: @@ -13944,7 +15803,7 @@ keys: keys: address: type: str - description: Anycast RP Address + description: Anycast RP Address. other_anycast_rp_addresses: type: list primary_key: address @@ -13955,7 +15814,7 @@ keys: keys: address: type: str - description: Other Anycast RP Address + description: Other Anycast RP Address. register_count: type: int convert_types: @@ -13968,7 +15827,7 @@ keys: keys: name: type: str - description: VRF Name + description: VRF Name. convert_types: - int ipv4: @@ -13976,7 +15835,7 @@ keys: keys: bfd: type: bool - description: Enable/Disable BFD + description: Enable/Disable BFD. rp_addresses: type: list items: @@ -13984,7 +15843,7 @@ keys: keys: address: type: str - description: RP Address + description: RP Address. required: true groups: type: list @@ -14004,6 +15863,147 @@ keys: max: 32 override: type: bool + router_segment_security: + type: dict + keys: + enabled: + type: bool + policies: + type: list + description: 'Customised application policies. + + Using the Application Traffic Recognition L4 profiles, custom policies can + be defined. The built-in application ''app-match-all'' can be used to match + any packets. + + Note that this is stateless, so both the source and destination flows need + to be considered.' + primary_key: name + items: + type: dict + keys: + name: + type: str + description: Policy name. + sequence_numbers: + type: list + required: true + primary_key: sequence + items: + type: dict + keys: + sequence: + type: int + description: Sequence ID. + convert_types: + - str + min: 1 + max: 1023 + application: + type: str + required: true + description: The name of the application. + action: + type: str + required: true + description: The action to take - note that platform support for + the redirect action is limited. The "redirect" action also requires + the 'next_hop' to be configured. + valid_values: + - forward + - drop + - redirect + log: + type: bool + description: Enable logging - note that platform support is limited. + stateless: + type: bool + description: Take action, regardless of state. Should be set to + 'true' for MSS-G. + default: true + next_hop: + type: str + description: When the action is 'redirect', this indicates the + IPv4 next hop to redirect to. + vrfs: + type: list + description: The name of the VRF that the segments and policies are defined + in. + primary_key: name + items: + type: dict + keys: + name: + type: str + segments: + type: list + primary_key: name + required: true + items: + type: dict + keys: + name: + type: str + description: Segment name. + definition: + type: dict + keys: + interfaces: + type: list + description: The names of the source interface e.g. Port-Channel1 + - note that platform support is limited. + min_length: 1 + items: + type: str + match_lists: + type: list + description: The set of lists that define the segment. These + can be a mix of IPv4 and IPv6 prefix or match lists. + max_length: 2 + min_length: 1 + primary_key: address_family + items: + type: dict + keys: + address_family: + type: str + required: true + description: Indicate which address-family the match + list belongs to e.g. ipv4 or ipv6. + valid_values: + - ipv4 + - ipv6 + covered_prefix_list: + type: str + description: The name of the prefix-list. You can have + a maximum of one per address-family. Mutually exclusive + to the use of match_list. If both are configured + prefix takes precedence. + prefix: + type: str + description: The name of the match-list. You can have + a maximum of one per address-family. Mutually exclusive + to the use of covered_prefix_list. If both are configured + prefix takes precedence. + policies: + type: list + description: The policies controlling traffic into the segment. + primary_key: from + items: + type: dict + keys: + from: + type: str + description: The name of the source segment or 'forwarding-segments' + for all segments. + policy: + type: str + description: The name of the policy to apply. The built-in + policies are 'policy-forward-all' and 'policy-drop-all'. + fallback_policy: + type: str + description: Only supported on the R3 series platforms, this allows + a per-segment default policy to be specified by name. router_service_insertion: type: dict description: Configure network services inserted to data forwarding. @@ -14076,7 +16076,7 @@ keys: keys: address: type: str - description: IPv4 or IPv6 address + description: IPv4 or IPv6 address. colors: type: list primary_key: value @@ -14099,7 +16099,7 @@ keys: type: str sbfd_remote_discriminator: type: str - description: IPv4 address or 32 bit integer + description: IPv4 address or 32 bit integer. convert_types: - int path_group: @@ -14174,7 +16174,7 @@ keys: type: int convert_types: - str - description: Polling interval in seconds + description: Polling interval in seconds. vrfs: type: list primary_key: name @@ -14197,7 +16197,7 @@ keys: keys: destination: type: str - description: Sflow Destination IP Address + description: Sflow Destination IP Address. port: type: int description: Port Number @@ -14213,7 +16213,7 @@ keys: ' source_interface: type: str - description: Source Interface + description: Source Interface. destinations: type: list primary_key: destination @@ -14224,10 +16224,10 @@ keys: keys: destination: type: str - description: Sflow Destination IP Address + description: Sflow Destination IP Address. port: type: int - description: Port Number + description: Port Number. convert_types: - str source: @@ -14240,7 +16240,7 @@ keys: ' source_interface: type: str - description: Source Interface + description: Source Interface. extensions: type: list primary_key: name @@ -14249,10 +16249,10 @@ keys: keys: name: type: str - description: Extension Name + description: Extension Name. enabled: type: bool - description: Enable or Disable Extension + description: Enable or Disable Extension. required: true interface: type: dict @@ -14301,7 +16301,7 @@ keys: default: true snmp_server: type: dict - description: SNMP settings + description: SNMP settings. keys: engine_ids: type: dict @@ -14310,7 +16310,7 @@ keys: type: str convert_types: - int - description: 'Engine ID in hexadecimal + description: 'Engine ID in hexadecimal. ' remotes: @@ -14322,12 +16322,12 @@ keys: type: str convert_types: - int - description: 'Remote engine ID in hexadecimal + description: 'Remote engine ID in hexadecimal. ' address: type: str - description: 'Hostname or IP of remote engine + description: 'Hostname or IP of remote engine. ' udp_port: @@ -14336,10 +16336,10 @@ keys: - str contact: type: str - description: SNMP contact + description: SNMP contact. location: type: str - description: SNMP location + description: SNMP location. communities: type: list primary_key: name @@ -14350,7 +16350,7 @@ keys: keys: name: type: str - description: Community name + description: Community name. access: type: str valid_values: @@ -14361,13 +16361,13 @@ keys: keys: name: type: str - description: IPv4 access list name + description: IPv4 access list name. access_list_ipv6: type: dict keys: name: type: str - description: IPv6 access list name + description: IPv6 access list name. view: type: str ipv4_acls: @@ -14377,7 +16377,7 @@ keys: keys: name: type: str - description: IPv4 access list name + description: IPv4 access list name. vrf: type: str convert_types: @@ -14389,7 +16389,7 @@ keys: keys: name: type: str - description: IPv6 access list name + description: IPv6 access list name. vrf: type: str convert_types: @@ -14404,7 +16404,7 @@ keys: keys: name: type: str - description: Interface name + description: Interface name. vrf: type: str convert_types: @@ -14416,7 +16416,7 @@ keys: keys: name: type: str - description: SNMP view name + description: SNMP view name. mib_family_name: type: str included: @@ -14434,7 +16434,7 @@ keys: keys: name: type: str - description: Group name + description: Group name. version: type: str valid_values: @@ -14449,13 +16449,13 @@ keys: - priv read: type: str - description: Read view + description: Read view. write: type: str - description: Write view + description: Write view. notify: type: str - description: Notify view + description: Notify view. users: type: list items: @@ -14463,22 +16463,22 @@ keys: keys: name: type: str - description: Username + description: Username. group: type: str - description: Group name + description: Group name. remote_address: type: str - description: 'Hostname or ip of remote engine + description: 'Hostname or ip of remote engine. - The remote_address and udp_port are used for remote users + The remote_address and udp_port are used for remote users. ' udp_port: type: int convert_types: - str - description: 'udp_port will not be used if no remote_address is configured + description: 'udp_port will not be used if no remote_address is configured. ' version: @@ -14491,29 +16491,29 @@ keys: type: str convert_types: - int - description: 'Engine ID in hexadecimal for localizing auth and/or priv + description: 'Engine ID in hexadecimal for localizing auth and/or priv. ' auth: type: str - description: 'Hash algorithm + description: 'Hash algorithm. ' auth_passphrase: type: str description: 'Hashed authentication passphrase if localized is used - else cleartext authentication passphrase + else cleartext authentication passphrase. ' priv: type: str - description: 'Encryption algorithm + description: 'Encryption algorithm. ' priv_passphrase: type: str description: 'Hashed privacy passphrase if localized is used else cleartext - privacy passphrase + privacy passphrase. ' hosts: @@ -14523,7 +16523,7 @@ keys: keys: host: type: str - description: Host IP address or name + description: Host IP address or name. vrf: type: str convert_types: @@ -14538,7 +16538,7 @@ keys: - '3' community: type: str - description: Community name + description: Community name. users: type: list items: @@ -14558,7 +16558,7 @@ keys: enable: type: bool default: false - description: 'Enable or disable all snmp-traps + description: 'Enable or disable all snmp-traps. ' snmp_traps: @@ -14568,7 +16568,7 @@ keys: keys: name: type: str - description: 'Enable or disable specific snmp-traps and their sub_traps + description: 'Enable or disable specific snmp-traps and their sub_traps. Examples: @@ -14588,7 +16588,7 @@ keys: keys: name: type: str - description: VRF name + description: VRF name. convert_types: - int enable: @@ -14621,7 +16621,7 @@ keys: type: int convert_types: - str - description: Maximum number of BPDUs per timer interval + description: Maximum number of BPDUs per timer interval. rstp_priority: type: int convert_types: @@ -14640,7 +16640,7 @@ keys: type: int convert_types: - str - description: 0-65535 + description: 0-65535. instances: type: list primary_key: id @@ -14653,7 +16653,7 @@ keys: type: int convert_types: - str - description: Instance ID + description: Instance ID. vlans: type: str convert_types: @@ -14675,7 +16675,7 @@ keys: type: str convert_types: - int - description: Instance ID + description: Instance ID. priority: type: int convert_types: @@ -14720,7 +16720,7 @@ keys: keys: name: type: str - description: Access-list Name + description: Access-list Name. convert_types: - int counters_per_entry: @@ -14736,13 +16736,13 @@ keys: keys: sequence: type: int - description: Sequence ID + description: Sequence ID. convert_types: - str action: type: str required: true - description: 'Action as string + description: 'Action as string. Example: "deny ip any any" @@ -14754,20 +16754,20 @@ keys: keys: vrf: type: str - description: VRF Name + description: VRF Name. convert_types: - int destination_address_prefix: type: str - description: IPv4_network/Mask + description: IPv4_network/Mask. interface: type: str gateway: type: str - description: IPv4 Address + description: IPv4 Address. track_bfd: type: bool - description: Track next-hop using BFD + description: Track next-hop using BFD. distance: type: int convert_types: @@ -14782,7 +16782,7 @@ keys: max: 4294967295 name: type: str - description: Description + description: Description. metric: type: int convert_types: @@ -14895,7 +16895,7 @@ keys: - untagged vlan: type: int - description: VLAN ID + description: VLAN ID. convert_types: - str min: 1 @@ -14925,10 +16925,10 @@ keys: keys: ipv4: type: int - description: Segment size + description: Segment size. ipv6: type: int - description: Segment size + description: Segment size. ipv4_access_groups: type: list primary_key: acl_name @@ -14977,7 +16977,7 @@ keys: type: int convert_types: - str - description: Timeout in seconds + description: Timeout in seconds. min: 1 max: 1000 hosts: @@ -14987,14 +16987,14 @@ keys: keys: host: type: str - description: Host IP address or name + description: Host IP address or name. vrf: type: str convert_types: - int key: type: str - description: Encrypted key + description: Encrypted key. key_type: type: str convert_types: @@ -15010,7 +17010,7 @@ keys: type: int convert_types: - str - description: Timeout in seconds + description: Timeout in seconds. min: 1 max: 1000 policy_unknown_mandatory_attribute_ignore: @@ -15027,13 +17027,13 @@ keys: enabled: type: bool profile: - description: Profile Name + description: Profile Name. type: str no_errdisable: type: list items: type: str - description: Interface name e.g Ethernet1, Port-Channel1 + description: Interface name e.g Ethernet1, Port-Channel1. encapsulation_dot1br_strip: type: bool encapsulation_vn_tag_strip: @@ -15042,7 +17042,7 @@ keys: type: bool truncation_size: type: int - description: 'Allowed truncation_size values vary depending on the platform + description: 'Allowed truncation_size values vary depending on the platform. ' mac: @@ -15052,7 +17052,7 @@ keys: type: dict description: 'mac.timestamp.replace_source_mac and mac.timestamp.header.format are mutually exclsuive. If both are defined, replace_source_mac takes - precedence + precedence. ' keys: @@ -15067,14 +17067,14 @@ keys: - 48-bit - 64-bit eth_type: - description: EtherType + description: EtherType. type: int convert_types: - str fcs_append: type: bool description: 'mac.fcs_append and mac.fcs_error are mutually exclusive. - If both are defined, mac.fcs_append takes precedence + If both are defined, mac.fcs_append takes precedence. ' fcs_error: @@ -15089,7 +17089,7 @@ keys: keys: system: type: str - description: 'TCAM profile name to activate + description: 'TCAM profile name to activate. ' profiles: @@ -15103,7 +17103,7 @@ keys: keys: name: type: str - description: Tcam-Profile Name + description: Tcam-Profile Name. config: type: str required: false @@ -15140,15 +17140,15 @@ keys: keys: name: type: str - description: Name of tracker object + description: Name of tracker object. interface: type: str - description: Name of tracked interface + description: Name of tracked interface. required: true tracked_property: type: str default: line-protocol - description: Property to track + description: Property to track. traffic_policies: type: dict keys: @@ -15171,12 +17171,12 @@ keys: keys: name: type: str - description: IPv4 Prefix Field Set Name + description: IPv4 Prefix Field Set Name. prefixes: type: list items: type: str - description: IPv4 Prefix + description: IPv4 Prefix. ipv6: type: list secondary_key: prefixes @@ -15188,12 +17188,12 @@ keys: keys: name: type: str - description: IPv6 Prefix Field Set Name + description: IPv6 Prefix Field Set Name. prefixes: type: list items: type: str - description: IPv6 Prefix + description: IPv6 Prefix. ports: type: list primary_key: name @@ -15205,7 +17205,7 @@ keys: keys: name: type: str - description: L4 Port Field Set Name + description: L4 Port Field Set Name. port_range: type: str description: 'Example: ''10,20,80,440-450''' @@ -15219,7 +17219,7 @@ keys: keys: name: type: str - description: Traffic Policy Name + description: Traffic Policy Name. matches: type: list primary_key: name @@ -15230,7 +17230,7 @@ keys: keys: name: type: str - description: Traffic Policy Item + description: Traffic Policy Item. type: type: str valid_values: @@ -15243,10 +17243,10 @@ keys: type: list items: type: str - description: IP address or prefix + description: IP address or prefix. prefix_lists: type: list - description: Field-set prefix lists + description: Field-set prefix lists. items: type: str destination: @@ -15256,27 +17256,27 @@ keys: type: list items: type: str - description: IP address or prefix + description: IP address or prefix. prefix_lists: type: list - description: Field-set prefix lists + description: Field-set prefix lists. items: type: str ttl: type: str - description: TTL range + description: TTL range. fragment: type: dict description: 'The ''fragment'' command is not supported when ''source port'' - or ''destination port'' command is configured + or ''destination port'' command is configured. ' keys: offset: type: str - description: Fragment offset range + description: Fragment offset range. protocols: type: list primary_key: protocol @@ -15289,16 +17289,16 @@ keys: type: str src_port: type: str - description: Port range + description: Port range. dst_port: type: str - description: Port range + description: Port range. src_field: type: str - description: L4 port range field set + description: L4 port range field set. dst_field: type: str - description: L4 port range field set + description: L4 port range field set. flags: type: list items: @@ -15321,15 +17321,15 @@ keys: type: int convert_types: - str - description: Traffic class ID + description: Traffic class ID. count: type: str - description: Counter name + description: Counter name. drop: type: bool log: type: bool - description: Only supported when action is set to drop + description: Only supported when action is set to drop. default_actions: type: dict keys: @@ -15344,15 +17344,15 @@ keys: type: int convert_types: - str - description: Traffic class ID + description: Traffic class ID. count: type: str - description: Counter name + description: Counter name. drop: type: bool log: type: bool - description: Only supported when action is set to drop + description: Only supported when action is set to drop. ipv6: type: dict keys: @@ -15364,15 +17364,15 @@ keys: type: int convert_types: - str - description: Traffic class ID + description: Traffic class ID. count: type: str - description: Counter name + description: Counter name. drop: type: bool log: type: bool - description: Only supported when action is set to drop + description: Only supported when action is set to drop. transceiver_qsfp_default_mode_4x10: type: bool default: true @@ -15391,7 +17391,7 @@ keys: keys: name: type: str - description: Tunnel Interface Name + description: Tunnel Interface Name. description: type: str shutdown: @@ -15404,44 +17404,44 @@ keys: - str vrf: type: str - description: VRF Name + description: VRF Name. convert_types: - int ip_address: type: str format: ipv4_cidr - description: IPv4_address/Mask + description: IPv4_address/Mask. ipv6_enable: type: bool ipv6_address: type: str format: ipv6_cidr - description: IPv6_address/Mask + description: IPv6_address/Mask. access_group_in: - description: IPv4 ACL Name for ingress + description: IPv4 ACL Name for ingress. type: str access_group_out: - description: IPv4 ACL Name for egress + description: IPv4 ACL Name for egress. type: str ipv6_access_group_in: - description: IPv6 ACL Name for ingress + description: IPv6 ACL Name for ingress. type: str ipv6_access_group_out: - description: IPv6 ACL Name for egress + description: IPv6 ACL Name for egress. type: str tcp_mss_ceiling: type: dict keys: ipv4: type: int - description: Segment Size for IPv4 + description: Segment Size for IPv4. min: 64 max: 65495 convert_types: - str ipv6: type: int - description: Segment Size for IPv6 + description: Segment Size for IPv6. min: 64 max: 65475 convert_types: @@ -15452,7 +17452,7 @@ keys: - ingress - egress description: 'Optional direction (''ingress'', ''egress'') for tcp - mss ceiling + mss ceiling. ' tunnel_mode: @@ -15467,13 +17467,13 @@ keys: `ipsec`: IPsec-over-IP encapsulation.' source_interface: type: str - description: Tunnel Source Interface Name + description: Tunnel Source Interface Name. destination: type: str - description: IPv4 or IPv6 Address Tunnel Destination + description: IPv4 or IPv6 Address Tunnel Destination. path_mtu_discovery: type: bool - description: Enable Path MTU Discovery On Tunnel + description: Enable Path MTU Discovery On Tunnel. ipsec_profile: type: str description: 'Used only when `tunnel_mode` is set to `ipsec`. @@ -15498,12 +17498,12 @@ keys: keys: name: type: str - description: VRF Name + description: VRF Name. convert_types: - int ip_address: type: str - description: IPv4 Address + description: IPv4 Address. vlan_interfaces: type: list primary_key: name @@ -15514,7 +17514,7 @@ keys: keys: name: type: str - description: VLAN interface name like "Vlan123" + description: VLAN interface name like "Vlan123". description: type: str logging: @@ -15529,14 +17529,14 @@ keys: type: bool vrf: type: str - description: VRF name + description: VRF name. convert_types: - int arp_aging_timeout: type: int convert_types: - str - description: In seconds + description: In seconds. min: 1 max: 65535 arp_cache_dynamic_capacity: @@ -15555,25 +17555,25 @@ keys: type: bool ip_address: type: str - description: IPv4_address/Mask + description: IPv4_address/Mask. ip_address_secondaries: type: list items: type: str - description: IPv4_address/Mask + description: IPv4_address/Mask. ip_virtual_router_addresses: type: list items: type: str - description: IPv4 address or IPv4_address/Mask + description: IPv4 address or IPv4_address/Mask. ip_address_virtual: type: str - description: IPv4_address/Mask + description: IPv4_address/Mask. ip_address_virtual_secondaries: type: list items: type: str - description: IPv4_address/Mask + description: IPv4_address/Mask. ip_verify_unicast_source_reachable_via: type: str valid_values: @@ -15646,7 +17646,7 @@ keys: description: IGMP version on IGMP host-proxy interface. ip_helpers: type: list - description: List of DHCP servers + description: List of DHCP servers. convert_types: - dict primary_key: ip_helper @@ -15655,15 +17655,19 @@ keys: keys: ip_helper: type: str - description: IP address or hostname of DHCP server + description: IP address or hostname of DHCP server. source_interface: type: str - description: Interface used as source for forwarded DHCP packets + description: Interface used as source for forwarded DHCP packets. vrf: type: str - description: VRF where DHCP server can be reached + description: VRF where DHCP server can be reached. convert_types: - int + ip_dhcp_relay_all_subnets: + type: bool + description: Allow forwarding requests with secondary IP addresses in the + gateway address "giaddr" field. ip_nat: type: dict $ref: eos_cli_config_gen#/$defs/interface_ip_nat @@ -15671,13 +17675,13 @@ keys: type: bool ipv6_address: type: str - description: IPv6_address/Mask + description: IPv6_address/Mask. ipv6_address_virtual: type: str - description: 'IPv6_address/Mask + description: 'IPv6_address/Mask. If both "ipv6_address_virtual" and "ipv6_address_virtuals" are set, all - addresses will be configured + addresses will be configured. ' deprecation: @@ -15690,10 +17694,10 @@ keys: ipv6 addresses. items: type: str - description: IPv6_address/Mask + description: IPv6_address/Mask. ipv6_address_link_local: type: str - description: IPv6_address/Mask + description: IPv6_address/Mask. ipv6_virtual_router_address: type: str description: '"ipv6_virtual_router_address" should not be mixed with @@ -15710,11 +17714,36 @@ keys: description: Improved "VARPv6" data model to support multiple VARPv6 addresses. items: type: str - description: IPv6 address or IPv6_address/Mask + description: IPv6 address or IPv6_address/Mask. ipv6_nd_ra_disabled: type: bool ipv6_nd_managed_config_flag: type: bool + ipv6_nd_other_config_flag: + type: bool + description: Set the "other stateful configuration" flag in IPv6 router + advertisements. + ipv6_nd_cache: + type: dict + description: IPv6 neighbor cache options. + keys: + dynamic_capacity: + type: int + description: Capacity of dynamic cache entries. + convert_types: + - str + min: 0 + max: 4294967295 + expire: + type: int + description: Cache entries expirery in seconds. + convert_types: + - str + min: 1 + max: 65535 + refresh_always: + type: bool + description: Force refresh on cache expiry. ipv6_nd_prefixes: type: list convert_types: @@ -15725,15 +17754,15 @@ keys: keys: ipv6_prefix: type: str - description: IPv6_address/Mask + description: IPv6_address/Mask. valid_lifetime: type: str - description: In seconds <0-4294967295> or infinite + description: In seconds <0-4294967295> or infinite. convert_types: - int preferred_lifetime: type: str - description: In seconds <0-4294967295> or infinite + description: In seconds <0-4294967295> or infinite. convert_types: - int no_autoconfig_flag: @@ -15746,7 +17775,7 @@ keys: keys: address: type: str - description: DHCP server's IPv6 address + description: DHCP server's IPv6 address. vrf: type: str convert_types: @@ -15754,33 +17783,37 @@ keys: local_interface: type: str description: Local interface to communicate with DHCP server - mutually - exclusive to source_address + exclusive to source_address. source_address: type: str description: Source IPv6 address to communicate with DHCP server - - mutually exclusive to local_interface + mutually exclusive to local_interface. link_address: type: str description: Override the default link address specified in the relayed - DHCP packet + DHCP packet. + ipv6_dhcp_relay_all_subnets: + type: bool + description: Allow forwarding requests with additional IPv6 addresses in + the gateway address "giaddr" field. access_group_in: type: str - description: IPv4 access-list name + description: IPv4 access-list name. convert_types: - int access_group_out: type: str - description: IPv4 access-list name + description: IPv4 access-list name. convert_types: - int ipv6_access_group_in: type: str - description: IPv6 access-list name + description: IPv6 access-list name. convert_types: - int ipv6_access_group_out: type: str - description: IPv6 access-list name + description: IPv6 access-list name. convert_types: - int multicast: @@ -15792,7 +17825,7 @@ keys: boundaries: type: list description: Boundaries can be either 1 ACL or a list of multicast - IP address_range(s)/prefix but not combination of both + IP address_range(s)/prefix but not combination of both. primary_key: boundary items: type: dict @@ -15800,7 +17833,7 @@ keys: boundary: type: str description: IPv4 access-list name or IPv4 multicast group - prefix with mask + prefix with mask. convert_types: - int out: @@ -15825,7 +17858,7 @@ keys: boundaries: type: list description: Boundaries can be either 1 ACL or a list of multicast - IP address_range(s)/prefix but not combination of both + IP address_range(s)/prefix but not combination of both. primary_key: boundary items: type: dict @@ -15833,7 +17866,7 @@ keys: boundary: type: str description: IPv6 access-list name or IPv6 multicast group - prefix with mask + prefix with mask. convert_types: - int source_route_export: @@ -15868,10 +17901,10 @@ keys: - message-digest ospf_authentication_key: type: str - description: Encrypted password used for simple authentication + description: Encrypted password used for simple authentication. ospf_message_digest_keys: type: list - description: Keys used for message-digest authentication + description: Keys used for message-digest authentication. convert_types: - dict primary_key: id @@ -15892,7 +17925,7 @@ keys: - sha512 key: type: str - description: Encrypted password + description: Encrypted password. pim: type: dict keys: @@ -15937,7 +17970,10 @@ keys: description: PIM hello interval in seconds. isis_enable: type: str - description: ISIS instance name + description: ISIS instance name. + isis_bfd: + type: bool + description: Enable BFD for ISIS. isis_passive: type: bool isis_metric: @@ -15954,7 +17990,7 @@ keys: type: bool vrrp_ids: type: list - description: Improved "vrrp" data model to support multiple VRRP IDs + description: Improved "vrrp" data model to support multiple VRRP IDs. primary_key: id items: type: dict @@ -15963,12 +17999,12 @@ keys: type: int convert_types: - str - description: VRID + description: VRID. priority_level: type: int convert_types: - str - description: Instance priority + description: Instance priority. min: 1 max: 254 advertisement: @@ -15978,7 +18014,7 @@ keys: type: int convert_types: - str - description: Interval in seconds + description: Interval in seconds. min: 1 max: 255 preempt: @@ -15994,14 +18030,14 @@ keys: type: int convert_types: - str - description: Minimum preempt delay in seconds + description: Minimum preempt delay in seconds. min: 0 max: 3600 reload: type: int convert_types: - str - description: Reload preempt delay in seconds + description: Reload preempt delay in seconds. min: 0 max: 3600 timers: @@ -16025,14 +18061,14 @@ keys: keys: name: type: str - description: Tracked object name + description: Tracked object name. decrement: type: int convert_types: - str min: 1 max: 254 - description: Decrement VRRP priority by 1-254 + description: Decrement VRRP priority by 1-254. shutdown: type: bool ipv4: @@ -16041,7 +18077,7 @@ keys: address: type: str required: true - description: Virtual IPv4 address + description: Virtual IPv4 address. version: type: int convert_types: @@ -16055,7 +18091,7 @@ keys: address: type: str required: true - description: Virtual IPv6 address + description: Virtual IPv6 address. vrrp: type: dict description: '"vrrp" should not be mixed with the new "vrrp_ids" key above @@ -16069,12 +18105,12 @@ keys: keys: virtual_router: type: str - description: Virtual Router ID + description: Virtual Router ID. priority: type: int convert_types: - str - description: Instance priority + description: Instance priority. advertisement_interval: type: int convert_types: @@ -16085,10 +18121,10 @@ keys: - str ipv4: type: str - description: Virtual IPv4 address + description: Virtual IPv4 address. ipv6: type: str - description: Virtual IPv6 address + description: Virtual IPv6 address. ip_attached_host_route_export: type: dict keys: @@ -16130,12 +18166,12 @@ keys: type: int convert_types: - str - description: Rate in milliseconds + description: Rate in milliseconds. min_rx: type: int convert_types: - str - description: Minimum RX hold time in milliseconds + description: Minimum RX hold time in milliseconds. multiplier: type: int convert_types: @@ -16150,25 +18186,25 @@ keys: keys: input: type: str - description: Name of policy-map used for policy based routing + description: Name of policy-map used for policy based routing. pvlan_mapping: type: str - description: List of VLANs as string + description: List of VLANs as string. tenant: type: str - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. tags: type: list items: type: str - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. type: type: str - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. eos_cli: type: str description: Multiline EOS CLI rendered directly on the VLAN interface in - the final EOS configuration + the final EOS configuration. vlan_internal_order: type: dict keys: @@ -16210,10 +18246,10 @@ keys: type: int convert_types: - str - description: VLAN ID + description: VLAN ID. name: type: str - description: VLAN Name + description: VLAN Name. state: type: str valid_values: @@ -16223,7 +18259,7 @@ keys: type: list items: type: str - description: Trunk Group Name + description: Trunk Group Name. private_vlan: type: dict keys: @@ -16236,10 +18272,10 @@ keys: type: int convert_types: - str - description: Primary VLAN ID + description: Primary VLAN ID. tenant: type: str - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. vmtracer_sessions: type: list primary_key: name @@ -16250,14 +18286,14 @@ keys: keys: name: type: str - description: Vmtracer Session Name + description: Vmtracer Session Name. url: type: str username: type: str password: type: str - description: Type 7 Password Hash + description: Type 7 Password Hash. autovlan_disable: type: bool source_interface: @@ -16265,7 +18301,7 @@ keys: vrfs: type: list primary_key: name - description: 'These keys are ignored if the name of the vrf is ''default'' + description: 'These keys are ignored if the name of the vrf is ''default''. ' convert_types: @@ -16275,7 +18311,7 @@ keys: keys: name: type: str - description: VRF Name + description: VRF Name. convert_types: - int description: @@ -16288,7 +18324,7 @@ keys: type: bool tenant: type: str - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. vxlan_interface: type: dict keys: @@ -16302,7 +18338,7 @@ keys: keys: source_interface: type: str - description: Source Interface Name + description: Source Interface Name. multicast: type: dict keys: @@ -16310,7 +18346,7 @@ keys: type: bool controller_client: type: dict - description: Client to CVX Controllers + description: Client to CVX Controllers. keys: enabled: type: bool @@ -16325,7 +18361,7 @@ keys: description: Enable bridging between different VTEPs in vxlan overlay. virtual_router_encapsulation_mac_address: type: str - description: '"mlag-system-id" or ethernet_address (H.H.H) + description: '"mlag-system-id" or ethernet_address (H.H.H). ' bfd_vtep_evpn: @@ -16380,19 +18416,19 @@ keys: type: int convert_types: - str - description: VLAN ID + description: VLAN ID. vni: type: int convert_types: - str multicast_group: type: str - description: IP Multicast Group Address + description: IP Multicast Group Address. flood_vteps: type: list items: type: str - description: Remote VTEP IP Address + description: Remote VTEP IP Address. vrfs: type: list primary_key: name @@ -16403,7 +18439,7 @@ keys: keys: name: type: str - description: VRF Name + description: VRF Name. convert_types: - int vni: @@ -16412,12 +18448,12 @@ keys: - str multicast_group: type: str - description: IP Multicast Group Address + description: IP Multicast Group Address. flood_vteps: type: list items: type: str - description: Remote VTEP IP Address + description: Remote VTEP IP Address. flood_vtep_learned_data_plane: type: bool eos_cli: @@ -16427,6 +18463,75 @@ keys: ' $defs: + application_traffic_recognition_application: + type: dict + keys: + protocols: + type: list + description: 'List of protocols to consider for this application. + + To use port field-sets (source, destination or both), the list + + must contain only one or two protocols, either `tcp` or `udp`. + + When using both protocols, one line is rendered for each in the configuration, + + hence the field-sets must have the same value for `tcp_src_port_set_name` + and + + `udp_src_port_set_name` and for `tcp_dest_port_set_name` and `udp_dest_port_set_name` + + if set in order to generate valid configuration in EOS.' + items: + type: str + valid_values: + - ahp + - esp + - icmp + - igmp + - ospf + - pim + - rsvp + - tcp + - udp + - vrrp + protocol_ranges: + type: list + description: 'Accept protocol value(s) or range(s). + + Protocol values can be between 1 and 255.' + items: + type: str + convert_types: + - int + udp_src_port_set_name: + type: str + description: 'Name of field set for UDP source ports. + + When the `protocols` list contain both `tcp` and `udp`, this key value + + must be the same as `tcp_src_port_set_name`.' + tcp_src_port_set_name: + type: str + description: 'Name of field set for TCP source ports. + + When the `protocols` list contain both `tcp` and `udp`, this key value + + must be the same as `udp_src_port_set_name`.' + udp_dest_port_set_name: + type: str + description: 'Name of field set for UDP destination ports. + + When the `protocols` list contain both `tcp` and `udp`, this key value + + must be the same as `tcp_dest_port_set_name`.' + tcp_dest_port_set_name: + type: str + description: 'Name of field set for TCP destination ports. + + When the `protocols` list contain both `tcp` and `udp`, this key value + + must be the same as `udp_dest_port_set_name`.' flow_tracking: type: dict keys: @@ -16438,7 +18543,7 @@ $defs: keys: name: type: str - description: Tracker Name + description: Tracker Name. record_export: type: dict keys: @@ -16448,14 +18553,14 @@ $defs: - str min: 3000 max: 900000 - description: Flow record inactive export timeout in milliseconds + description: Flow record inactive export timeout in milliseconds. on_interval: type: int convert_types: - str min: 1000 max: 36000000 - description: Flow record export interval in milliseconds + description: Flow record export interval in milliseconds. exporters: type: list primary_key: name @@ -16464,17 +18569,17 @@ $defs: keys: name: type: str - description: Exporter Name + description: Exporter Name. collector: type: dict keys: host: type: str description: Collector IPv4 address or IPv6 address or fully - qualified domain name + qualified domain name. port: type: int - description: Collector Port Number + description: Collector Port Number. min: 1 max: 65535 convert_types: @@ -16488,14 +18593,14 @@ $defs: - str local_interface: type: str - description: Local Source Interface + description: Local Source Interface. template_interval: type: int convert_types: - str min: 5000 max: 3600000 - description: Template interval in milliseconds + description: Template interval in milliseconds. shutdown: type: bool default: false @@ -16551,9 +18656,9 @@ $defs: pool_name: type: str description: 'required if ''nat_type'' is pool, pool-address-only - or pool-full-cone + or pool-full-cone. - ignored if ''nat_type'' is overload + ignored if ''nat_type'' is overload. ' priority: @@ -16567,13 +18672,12 @@ $defs: $ref: eos_cli_config_gen#/$defs/interface_ip_nat_static interface_ip_nat_static: type: list - primary_key: original_ip items: type: dict keys: access_list: type: str - description: '''access_list'' and ''group'' are mutual exclusive' + description: '''access_list'' and ''group'' are mutual exclusive.' comment: type: str direction: @@ -16594,12 +18698,15 @@ $defs: - str min: 1 max: 65535 - description: '''access_list'' and ''group'' are mutual exclusive' + description: '''access_list'' and ''group'' are mutual exclusive.' original_ip: type: str - description: IPv4 address + description: IPv4 address. The combination of `original_ip` and `original_port` + must be unique. original_port: type: int + description: TCP/UDP port. The combination of `original_ip` and `original_port` + must be unique. convert_types: - str min: 1 @@ -16618,11 +18725,11 @@ $defs: translated_ip: type: str required: true - description: IPv4 address + description: IPv4 address. translated_port: type: int convert_types: - str min: 1 max: 65535 - description: requires 'original_port' + description: requires 'original_port'. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/_defaults.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/_defaults.schema.yml similarity index 94% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/_defaults.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/_defaults.schema.yml index 84018aa54be..8c0eefd1549 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/_defaults.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/_defaults.schema.yml @@ -5,5 +5,6 @@ # Line above is used by RedHat's YAML Schema vscode extension # Use Ctrl + Space to get suggestions for every field. Autocomplete will pop up after typing 2 letters. $id: eos_cli_config_gen +$schema: avd_meta_schema type: dict allow_other_keys: true diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/aaa_accounting.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/aaa_accounting.schema.yml similarity index 87% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/aaa_accounting.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/aaa_accounting.schema.yml index 51fbad7ed29..cba821dd1c5 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/aaa_accounting.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/aaa_accounting.schema.yml @@ -19,7 +19,7 @@ keys: type: str valid_values: ["none", "start-stop", "stop-only"] group: - description: Group Name + description: Group Name. type: str logging: type: bool @@ -30,7 +30,7 @@ keys: type: str valid_values: ["none", "start-stop", "stop-only"] group: - description: Group Name + description: Group Name. type: str logging: type: bool @@ -44,7 +44,7 @@ keys: type: str valid_values: ["none", "start-stop", "stop-only"] group: - description: Group Name + description: Group Name. type: str dot1x: type: dict @@ -56,7 +56,7 @@ keys: type: str valid_values: ["start-stop", "stop-only"] group: - description: Group Name + description: Group Name. type: str commands: type: dict @@ -70,12 +70,12 @@ keys: type: str convert_types: - int - description: "Privelege level 'all' or 0-15" + description: Privilege level 'all' or 0-15. type: type: str valid_values: ["none", "start-stop", "stop-only"] group: - description: Group Name + description: Group Name. type: str logging: type: bool @@ -88,12 +88,12 @@ keys: type: str convert_types: - int - description: "Privelege level 'all' or 0-15" + description: Privilege level 'all' or 0-15. type: type: str valid_values: ["none", "start-stop", "stop-only"] group: - description: Group Name + description: Group Name. type: str logging: type: bool diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/aaa_authentication.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/aaa_authentication.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/aaa_authentication.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/aaa_authentication.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/aaa_authorization.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/aaa_authorization.schema.yml similarity index 97% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/aaa_authorization.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/aaa_authorization.schema.yml index 571fb88bcec..e3e40eab95d 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/aaa_authorization.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/aaa_authorization.schema.yml @@ -55,7 +55,7 @@ keys: keys: level: type: str - description: Privilege level(s) 0-15 + description: Privilege level(s) 0-15. convert_types: - int default: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/aaa_root.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/aaa_root.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/aaa_root.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/aaa_root.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/aaa_server_groups.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/aaa_server_groups.schema.yml similarity index 87% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/aaa_server_groups.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/aaa_server_groups.schema.yml index 5e14f0cb31c..2934cac7595 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/aaa_server_groups.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/aaa_server_groups.schema.yml @@ -12,7 +12,7 @@ keys: type: dict keys: name: - description: Group name + description: Group name. type: str type: type: str @@ -24,9 +24,9 @@ keys: keys: server: type: str - description: Hostname or IP address + description: Hostname or IP address. vrf: type: str - description: VRF name + description: VRF name. convert_types: - int diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/access_lists.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/access_lists.schema.yml similarity index 76% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/access_lists.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/access_lists.schema.yml index d7cdf277c4b..1066d76d8fe 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/access_lists.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/access_lists.schema.yml @@ -17,10 +17,17 @@ keys: keys: name: type: str - description: Access-list Name + description: Access-list Name. convert_types: [ int ] counters_per_entry: type: bool + permit_response_traffic: + type: str + valid_values: + - nat + description: |- + Permit response traffic automatically based on NAT translations. + Minimum EOS version requirement 4.32.2F. sequence_numbers: type: list required: true @@ -32,12 +39,12 @@ keys: keys: sequence: type: int - description: Sequence ID + description: Sequence ID. convert_types: - str action: type: str required: true description: | - Action as string + Action as string. Example: "deny ip any any" diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/address_locking.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/address_locking.schema.yml similarity index 86% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/address_locking.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/address_locking.schema.yml index ababb69c762..578f371de94 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/address_locking.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/address_locking.schema.yml @@ -13,10 +13,10 @@ keys: type: list items: type: str - description: DHCP server IPv4 address + description: DHCP server IPv4 address. disabled: type: bool - description: Disable IP locking on configured ports + description: Disable IP locking on configured ports. leases: type: list items: @@ -25,11 +25,11 @@ keys: ip: type: str required: true - description: IP address + description: IP address. mac: type: str required: true - description: MAC address (hhhh.hhhh.hhhh or hh:hh:hh:hh:hh:hh) + description: MAC address (hhhh.hhhh.hhhh or hh:hh:hh:hh:hh:hh). local_interface: type: str locked_address: @@ -37,10 +37,10 @@ keys: keys: expiration_mac_disabled: type: bool - description: Configure deauthorizing locked addresses upon MAC aging out + description: Configure deauthorizing locked addresses upon MAC aging out. ipv4_enforcement_disabled: type: bool - description: Configure enforcement for locked IPv4 addresses + description: Configure enforcement for locked IPv4 addresses. ipv6_enforcement_disabled: type: bool - description: Configure enforcement for locked IPv6 addresses + description: Configure enforcement for locked IPv6 addresses. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/agents.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/agents.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/agents.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/agents.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/aliases.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/aliases.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/aliases.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/aliases.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/application_traffic_recognition.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/application_traffic_recognition.schema.yml similarity index 67% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/application_traffic_recognition.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/application_traffic_recognition.schema.yml index 82e4c57b3ba..4e1313ecaa9 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/application_traffic_recognition.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/application_traffic_recognition.schema.yml @@ -80,10 +80,11 @@ keys: keys: ipv4_applications: type: list - description: List of user defined IPv4 applications. + description: List of user defined IPv4 applications. The name should be unique over all defined applications (ipv4 and l4). primary_key: name items: type: dict + $ref: "eos_cli_config_gen#/$defs/application_traffic_recognition_application" keys: name: type: str @@ -94,67 +95,17 @@ keys: dest_prefix_set_name: type: str description: Destination prefix set name. - protocols: - type: list - description: |- - List of protocols to consider for this application. - - To use port field-sets (source, destination or both), the list - must contain only one or two protocols, either `tcp` or `udp`. - When using both protocols, one line is rendered for each in the configuration, - hence the field-sets must have the same value for `tcp_src_port_set_name` and - `udp_src_port_set_name` and for `tcp_dest_port_set_name` and `udp_dest_port_set_name` - if set in order to generate valid configuration in EOS. - items: - type: str - valid_values: - - ahp - - esp - - icmp - - igmp - - ospf - - pim - - rsvp - - tcp - - udp - - vrrp - protocol_ranges: - type: list - description: |- - Acccept protocol value(s) or range(s). - Protocol values can be between 1 and 255. - items: - type: str - convert_types: - - int - udp_src_port_set_name: - type: str - description: |- - Name of field set for UDP source ports. - - When the `protocols` list contain both `tcp` and `udp`, this key value - must be the same as `tcp_src_port_set_name`. - tcp_src_port_set_name: - type: str - description: |- - Name of field set for TCP source ports. - - When the `protocols` list contain both `tcp` and `udp`, this key value - must be the same as `udp_src_port_set_name`. - udp_dest_port_set_name: - type: str - description: |- - Name of field set for UDP destination ports. - - When the `protocols` list contain both `tcp` and `udp`, this key value - must be the same as `tcp_dest_port_set_name`. - tcp_dest_port_set_name: + l4_applications: + type: list + description: List of user defined L4 applications. The name should be unique over all defined applications (ipv4 and l4). + primary_key: name + items: + type: dict + $ref: "eos_cli_config_gen#/$defs/application_traffic_recognition_application" + keys: + name: type: str - description: |- - Name of field set for TCP destination ports. - - When the `protocols` list contain both `tcp` and `udp`, this key value - must be the same as `udp_dest_port_set_name`. + description: Application name. application_profiles: type: list description: Group of applications. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/arp.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/arp.schema.yml similarity index 71% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/arp.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/arp.schema.yml index 8154871f82e..3c382443d08 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/arp.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/arp.schema.yml @@ -9,11 +9,25 @@ keys: arp: type: dict keys: + persistent: + type: dict + keys: + enabled: + type: bool + required: true + description: Restore the ARP cache after reboot. + refresh_delay: + type: int + description: Time to wait in seconds before refreshing the ARP cache after reboot (EOS default 600). + min: 600 + max: 3600 + convert_types: + - str aging: type: dict keys: timeout_default: - description: Timeout in seconds + description: Timeout in seconds. type: int min: 60 max: 65535 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/as_path.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/as_path.schema.yml similarity index 92% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/as_path.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/as_path.schema.yml index 47d0ac85be7..591688ef206 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/as_path.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/as_path.schema.yml @@ -19,7 +19,7 @@ keys: keys: name: type: str - description: Access List Name + description: Access List Name. entries: type: list items: @@ -30,7 +30,7 @@ keys: valid_values: ["permit", "deny"] match: type: str - description: Regex To Match + description: Regex To Match. origin: type: str valid_values: ["any", "egp", "igp", "incomplete"] diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/avd_data_conversion_mode.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/avd_data_conversion_mode.schema.yml similarity index 96% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/avd_data_conversion_mode.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/avd_data_conversion_mode.schema.yml index 6ac3309d093..83310010154 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/avd_data_conversion_mode.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/avd_data_conversion_mode.schema.yml @@ -22,4 +22,4 @@ keys: "warning" will produce warning messages. "info" will produce regular log messages. "debug" will produce hidden debug messages viewable with -v. - "quiet" will not produce any messages + "quiet" will not produce any messages. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/avd_data_validation_mode.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/avd_data_validation_mode.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/avd_data_validation_mode.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/avd_data_validation_mode.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/banners.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/banners.schema.yml similarity index 97% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/banners.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/banners.schema.yml index 0dc86f75db9..3c1b4c434c8 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/banners.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/banners.schema.yml @@ -11,7 +11,7 @@ keys: keys: login: type: str - description: Multiline string ending with EOF on the last line + description: Multiline string ending with EOF on the last line. motd: type: str - description: Multiline string ending with EOF on the last line + description: Multiline string ending with EOF on the last line. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/bgp_groups.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/bgp_groups.schema.yml similarity index 91% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/bgp_groups.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/bgp_groups.schema.yml index 6e0b46fbe92..fb676d26376 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/bgp_groups.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/bgp_groups.schema.yml @@ -16,7 +16,7 @@ keys: keys: name: type: str - description: Group Name + description: Group Name. vrf: type: str convert_types: @@ -29,4 +29,4 @@ keys: type: list items: type: str - description: Profile Name + description: Profile Name. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/boot.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/boot.schema.yml similarity index 90% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/boot.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/boot.schema.yml index 7322ee7f322..6f87ea6a1fb 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/boot.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/boot.schema.yml @@ -9,7 +9,7 @@ keys: boot: display_name: System Boot Settings description: | - Set the Aboot password + Set the Aboot password. type: dict keys: secret: @@ -20,5 +20,5 @@ keys: valid_values: ["md5", "sha512"] default: "sha512" key: - description: Hashed Password + description: Hashed Password. type: str diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/class_maps.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/class_maps.schema.yml similarity index 86% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/class_maps.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/class_maps.schema.yml index 1b4a0ee8168..b9a8d7e0837 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/class_maps.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/class_maps.schema.yml @@ -20,13 +20,13 @@ keys: keys: name: type: str - description: Class-Map Name + description: Class-Map Name. ip: type: dict keys: access_group: type: str - description: Standard Access-List Name + description: Standard Access-List Name. convert_types: [ int ] qos: type: list @@ -38,28 +38,28 @@ keys: keys: name: type: str - description: Class-Map Name + description: Class-Map Name. vlan: type: str convert_types: - int - description: VLAN value(s) or range(s) of VLAN values + description: VLAN value(s) or range(s) of VLAN values. cos: type: str convert_types: - int - description: CoS value(s) or range(s) of CoS values + description: CoS value(s) or range(s) of CoS values. ip: type: dict keys: access_group: type: str - description: IPv4 Access-List Name + description: IPv4 Access-List Name. convert_types: [ int ] ipv6: type: dict keys: access_group: type: str - description: IPv6 Access-List Name + description: IPv6 Access-List Name. convert_types: [ int ] diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/clock.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/clock.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/clock.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/clock.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/community_lists.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/community_lists.schema.yml similarity index 91% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/community_lists.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/community_lists.schema.yml index 6d35a027f9b..0dbe27f6b65 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/community_lists.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/community_lists.schema.yml @@ -17,10 +17,10 @@ keys: keys: name: type: str - description: Community-list Name + description: Community-list Name. action: type: str required: true description: | - Action as string + Action as string. Example: "permit GSHUT 65123:123" diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/config_comment.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/config_comment.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/config_comment.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/config_comment.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/custom_templates.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/custom_templates.schema.yml similarity index 99% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/custom_templates.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/custom_templates.schema.yml index 10cdc313c93..b99217f4508 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/custom_templates.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/custom_templates.schema.yml @@ -25,4 +25,4 @@ keys: Add `custom_templates` to group/host variables: items: type: str - description: Template relative path below playbook directory + description: Template relative path below playbook directory. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/cvx.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/cvx.schema.yml similarity index 93% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/cvx.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/cvx.schema.yml index e6dfa45e66c..9d67cdc86e2 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/cvx.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/cvx.schema.yml @@ -16,7 +16,7 @@ keys: type: list items: type: str - description: IP address or hostname + description: IP address or hostname. services: type: dict keys: @@ -28,7 +28,7 @@ keys: keys: password: type: str - description: Hashed password using the password_type + description: Hashed password using the password_type. password_type: type: str convert_types: @@ -39,7 +39,7 @@ keys: type: bool vxlan: type: dict - description: VXLAN Controller service + description: VXLAN Controller service. keys: shutdown: type: bool diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/daemon_terminattr.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/daemon_terminattr.schema.yml similarity index 84% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/daemon_terminattr.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/daemon_terminattr.schema.yml index 5ce0c9af22c..8041a5a4fda 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/daemon_terminattr.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/daemon_terminattr.schema.yml @@ -19,16 +19,16 @@ keys: cvaddrs: type: list description: | - Streaming address(es) for CloudVision single cluster + Streaming address(es) for CloudVision single cluster. - TCP 9910 is used for CV on-prem - TCP 443 is used for CV as a Service items: type: str - description: "Server address in the format `:`" + description: "Server address in the format `:`." clusters: type: list description: | - Multiple CloudVision clusters + Multiple CloudVision clusters. primary_key: name convert_types: - dict @@ -37,20 +37,20 @@ keys: keys: name: type: str - description: Cluster Name + description: Cluster Name. cvaddrs: type: list description: | - Streaming address(es) for CloudVision cluster + Streaming address(es) for CloudVision cluster. - TCP 9910 is used for CV on-prem - TCP 443 is used for CV as a Service items: type: str - description: "Server address in the format `:`" + description: "Server address in the format `:`." cvauth: type: dict description: | - Authentication scheme used to connect to CloudVision + Authentication scheme used to connect to CloudVision. keys: method: type: str @@ -60,51 +60,51 @@ keys: token_file: type: str description: | - Token file path + Token file path. e.g. "/tmp/token" cert_file: type: str description: | - Client certificate file path + Client certificate file path. e.g. "/persist/secure/ssl/terminattr/primary/certs/client.crt" ca_file: type: str description: | - CA certificate file path (on-prem only) + CA certificate file path (on-prem only). e.g. "/persist/secure/ssl/terminattr/primary/certs/ca.crt" key_file: type: str description: | - Client certificate key file path + Client certificate key file path. e.g. "/persist/secure/ssl/terminattr/primary/keys/client.key" cvobscurekeyfile: type: bool description: | - Encrypt the private key used for authentication to CloudVision + Encrypt the private key used for authentication to CloudVision. cvproxy: type: str description: | Proxy server through which CloudVision is reachable. Useful when the CloudVision server is hosted in the cloud. - The expected form is http://[user:password@]ip:port, e.g.: `http://arista:arista@10.83.12.78:3128`. Available as of TerminAttr v1.13.0 + The expected form is http://[user:password@]ip:port, e.g.: `http://arista:arista@10.83.12.78:3128`. Available as of TerminAttr v1.13.0. cvsourceip: type: str description: | - Set source IP address in case of in-band managament + Set source IP address in case of in-band management. cvsourceintf: type: str description: | - Set source interface in case of in-band managament. Available as of TerminAttr v1.23.0. + Set source interface in case of in-band management. Available as of TerminAttr v1.23.0. The interface name is case sensitive and has to match the interface name in the running-config, e.g.:Vlan100. cvvrf: type: str description: | - The VRF to use to connect to CloudVision + The VRF to use to connect to CloudVision. convert_types: - int cvauth: type: dict description: | - Authentication scheme used to connect to CloudVision + Authentication scheme used to connect to CloudVision. keys: method: type: str @@ -114,65 +114,65 @@ keys: token_file: type: str description: | - Token file path + Token file path. e.g. "/tmp/token" cert_file: type: str description: | - Client certificate file path + Client certificate file path. e.g. "/persist/secure/ssl/terminattr/primary/certs/client.crt" ca_file: type: str description: | - CA certificate file path (on-prem only) + CA certificate file path (on-prem only). e.g. "/persist/secure/ssl/terminattr/primary/certs/ca.crt" key_file: type: str description: | - Client certificate key file path + Client certificate key file path. e.g. "/persist/secure/ssl/terminattr/primary/keys/client.key" cvobscurekeyfile: type: bool description: | - Encrypt the private key used for authentication to CloudVision + Encrypt the private key used for authentication to CloudVision. cvproxy: type: str description: | Proxy server through which CloudVision is reachable. Useful when the CloudVision server is hosted in the cloud. - The expected form is http://[user:password@]ip:port, e.g.: `http://arista:arista@10.83.12.78:3128`. Available as of TerminAttr v1.13.0 + The expected form is http://[user:password@]ip:port, e.g.: `http://arista:arista@10.83.12.78:3128`. Available as of TerminAttr v1.13.0. cvsourceip: type: str description: | - Set source IP address in case of in-band managament + Set source IP address in case of in-band management. cvsourceintf: type: str description: | - Set source interface in case of in-band managament. + Set source interface in case of in-band management. The interface name is case sensitive and has to match the interface name in the running-config, e.g.:Vlan100. cvvrf: type: str description: | - The VRF to use to connect to CloudVision + The VRF to use to connect to CloudVision. convert_types: - int cvgnmi: type: bool description: | - Stream states from EOS gNMI servers (Openconfig) to CloudVision. Available as of TerminAttr v1.13.1 + Stream states from EOS gNMI servers (Openconfig) to CloudVision. Available as of TerminAttr v1.13.1. disable_aaa: type: bool description: | Disable AAA authorization and accounting. - When setting this flag, all commands pushed from CloudVision are applied directly to the CLI without authorization + When setting this flag, all commands pushed from CloudVision are applied directly to the CLI without authorization. grpcaddr: type: str description: | - Set the gRPC server address, the default is 127.0.0.1:6042 + Set the gRPC server address, the default is 127.0.0.1:6042. e.g. "MGMT/0.0.0.0:6042" grpcreadonly: type: bool description: | - gNMI read-only mode - Disable gnmi.Set() + gNMI read-only mode - Disable gnmi.Set(). ingestexclude: type: str description: | @@ -191,7 +191,7 @@ keys: ecodhcpaddr: type: str description: | - ECO DHCP Collector address or ECO DHCP Fingerprint listening address in standalone mode (default "127.0.0.1:67") + ECO DHCP Collector address or ECO DHCP Fingerprint listening address in standalone mode (default "127.0.0.1:67"). ipfix: type: bool description: | diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/daemons.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/daemons.schema.yml similarity index 92% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/daemons.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/daemons.schema.yml index aa6b97b7ff7..15bdc8ab218 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/daemons.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/daemons.schema.yml @@ -18,12 +18,12 @@ keys: keys: name: type: str - description: Daemon Name + description: Daemon Name. exec: type: str required: true description: | - command to run as a daemon + command to run as a daemon. enabled: type: bool default: true diff --git a/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/defs_application_traffic_recognition.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/defs_application_traffic_recognition.schema.yml new file mode 100644 index 00000000000..0b1ec77fd26 --- /dev/null +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/defs_application_traffic_recognition.schema.yml @@ -0,0 +1,67 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +# yaml-language-server: $schema=../../../../plugins/plugin_utils/schema/avd_meta_schema.json +# Line above is used by RedHat's YAML Schema vscode extension +# Use Ctrl + Space to get suggestions for every field. Autocomplete will pop up after typing 2 letters. +type: dict +$defs: + application_traffic_recognition_application: + type: dict + keys: + protocols: + type: list + description: |- + List of protocols to consider for this application. + To use port field-sets (source, destination or both), the list + must contain only one or two protocols, either `tcp` or `udp`. + When using both protocols, one line is rendered for each in the configuration, + hence the field-sets must have the same value for `tcp_src_port_set_name` and + `udp_src_port_set_name` and for `tcp_dest_port_set_name` and `udp_dest_port_set_name` + if set in order to generate valid configuration in EOS. + items: + type: str + valid_values: + - ahp + - esp + - icmp + - igmp + - ospf + - pim + - rsvp + - tcp + - udp + - vrrp + protocol_ranges: + type: list + description: |- + Accept protocol value(s) or range(s). + Protocol values can be between 1 and 255. + items: + type: str + convert_types: + - int + udp_src_port_set_name: + type: str + description: |- + Name of field set for UDP source ports. + When the `protocols` list contain both `tcp` and `udp`, this key value + must be the same as `tcp_src_port_set_name`. + tcp_src_port_set_name: + type: str + description: |- + Name of field set for TCP source ports. + When the `protocols` list contain both `tcp` and `udp`, this key value + must be the same as `udp_src_port_set_name`. + udp_dest_port_set_name: + type: str + description: |- + Name of field set for UDP destination ports. + When the `protocols` list contain both `tcp` and `udp`, this key value + must be the same as `tcp_dest_port_set_name`. + tcp_dest_port_set_name: + type: str + description: |- + Name of field set for TCP destination ports. + When the `protocols` list contain both `tcp` and `udp`, this key value + must be the same as `udp_dest_port_set_name`. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/defs_flow_tracking.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/defs_flow_tracking.schema.yml similarity index 89% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/defs_flow_tracking.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/defs_flow_tracking.schema.yml index 06f554f8364..fcaadcdb45e 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/defs_flow_tracking.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/defs_flow_tracking.schema.yml @@ -17,7 +17,7 @@ $defs: keys: name: type: str - description: Tracker Name + description: Tracker Name. record_export: type: dict keys: @@ -27,14 +27,14 @@ $defs: - str min: 3000 max: 900000 - description: Flow record inactive export timeout in milliseconds + description: Flow record inactive export timeout in milliseconds. on_interval: type: int convert_types: - str min: 1000 max: 36000000 - description: Flow record export interval in milliseconds + description: Flow record export interval in milliseconds. exporters: type: list primary_key: name @@ -43,16 +43,16 @@ $defs: keys: name: type: str - description: Exporter Name + description: Exporter Name. collector: type: dict keys: host: type: str - description: Collector IPv4 address or IPv6 address or fully qualified domain name + description: Collector IPv4 address or IPv6 address or fully qualified domain name. port: type: int - description: Collector Port Number + description: Collector Port Number. min: 1 max: 65535 convert_types: @@ -66,14 +66,14 @@ $defs: - str local_interface: type: str - description: Local Source Interface + description: Local Source Interface. template_interval: type: int convert_types: - str min: 5000 max: 3600000 - description: Template interval in milliseconds + description: Template interval in milliseconds. shutdown: type: bool default: false diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/defs_interface_ip_nat.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/defs_interface_ip_nat.schema.yml similarity index 96% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/defs_interface_ip_nat.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/defs_interface_ip_nat.schema.yml index bd8133ccb21..67e827c4915 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/defs_interface_ip_nat.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/defs_interface_ip_nat.schema.yml @@ -58,8 +58,8 @@ $defs: pool_name: type: str description: | - required if 'nat_type' is pool, pool-address-only or pool-full-cone - ignored if 'nat_type' is overload + required if 'nat_type' is pool, pool-address-only or pool-full-cone. + ignored if 'nat_type' is overload. priority: type: int convert_types: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/defs_interface_ip_nat_static.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/defs_interface_ip_nat_static.schema.yml similarity index 84% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/defs_interface_ip_nat_static.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/defs_interface_ip_nat_static.schema.yml index 9f0527bc8da..82c3ba05cb0 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/defs_interface_ip_nat_static.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/defs_interface_ip_nat_static.schema.yml @@ -8,13 +8,12 @@ type: dict $defs: interface_ip_nat_static: type: list - primary_key: original_ip items: type: dict keys: access_list: type: str - description: "'access_list' and 'group' are mutual exclusive" + description: "'access_list' and 'group' are mutual exclusive." comment: type: str direction: @@ -29,12 +28,13 @@ $defs: - str min: 1 max: 65535 - description: "'access_list' and 'group' are mutual exclusive" + description: "'access_list' and 'group' are mutual exclusive." original_ip: type: str - description: IPv4 address + description: IPv4 address. The combination of `original_ip` and `original_port` must be unique. original_port: type: int + description: TCP/UDP port. The combination of `original_ip` and `original_port` must be unique. convert_types: - str min: 1 @@ -51,11 +51,11 @@ $defs: translated_ip: type: str required: true - description: IPv4 address + description: IPv4 address. translated_port: type: int convert_types: - str min: 1 max: 65535 - description: "requires 'original_port'" + description: "requires 'original_port'." diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/dhcp_relay.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/dhcp_relay.schema.yml similarity index 93% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/dhcp_relay.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/dhcp_relay.schema.yml index b616fe2457e..7eb538caa29 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/dhcp_relay.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/dhcp_relay.schema.yml @@ -13,7 +13,7 @@ keys: type: list items: type: str - description: Server IP or Hostname + description: Server IP or Hostname. tunnel_requests_disabled: type: bool mlag_peerlink_requests_disabled: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/dhcp_servers.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/dhcp_servers.schema.yml similarity index 82% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/dhcp_servers.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/dhcp_servers.schema.yml index 8d72c381ecd..ff62e6da17f 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/dhcp_servers.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/dhcp_servers.schema.yml @@ -23,6 +23,35 @@ keys: type: str dns_domain_name_ipv6: type: str + dns_servers_ipv4: + type: list + min_length: 1 + description: List of DNS servers for IPv4 clients. + items: + type: str + required: true + description: IPv4 address of DNS server. + dns_servers_ipv6: + type: list + min_length: 1 + description: List of DNS servers for IPv6 clients. + items: + type: str + required: true + description: IPv6 address of DNS server. + tftp_server: + type: dict + keys: + file_ipv4: + type: str + min_length: 1 + max_length: 255 + description: Name of TFTP file for IPv4 clients. + file_ipv6: + type: str + min_length: 1 + max_length: 255 + description: Name of TFTP file for IPv6 clients. ipv4_vendor_options: type: list primary_key: vendor_id diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/dns_domain.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/dns_domain.schema.yml similarity index 93% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/dns_domain.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/dns_domain.schema.yml index d7dbb39c0d2..60cbd43b19a 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/dns_domain.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/dns_domain.schema.yml @@ -8,4 +8,4 @@ type: dict keys: dns_domain: type: str - description: Domain Name + description: Domain Name. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/domain_list.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/domain_list.schema.yml similarity index 86% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/domain_list.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/domain_list.schema.yml index 6aaa3b4839b..6deb9b0f155 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/domain_list.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/domain_list.schema.yml @@ -8,7 +8,7 @@ type: dict keys: domain_list: type: list - description: Search list of DNS domains + description: Search list of DNS domains. items: type: str - description: Domain name + description: Domain name. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/dot1x.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/dot1x.schema.yml similarity index 67% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/dot1x.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/dot1x.schema.yml index 5415e951114..dab701b2968 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/dot1x.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/dot1x.schema.yml @@ -140,3 +140,79 @@ keys: type: bool recovery_action_reauthenticate: type: bool + accounting_update_interval: + type: int + convert_types: + - str + min: 5 + max: 65535 + description: Interval period in seconds. + captive_portal: + type: dict + description: Web authentication feature authenticates a supplicant through a web page, referred to as a captive portal. + keys: + enabled: + type: bool + required: true + url: + type: str + description: |- + Supported URL type: + - http: http://[:] + - https: https://[:] + ssl_profile: + type: str + start_limit_infinite: + type: bool + description: Set captive-portal start limit to infinte. + access_list_ipv4: + type: str + description: Standard access-list name. + supplicant: + type: dict + keys: + profiles: + description: Dot1x supplicant profiles. + type: list + primary_key: name + items: + type: dict + keys: + name: + type: str + eap_method: + type: str + description: |- + Extensible Authentication Protocol method: + - EAP Flexible Authentication via Secure Tunneling. + - EAP with Transport Layer Security. + valid_values: + - "fast" + - "tls" + identity: + type: str + description: User identity. + passphrase_type: + type: str + convert_types: + - int + valid_values: + - "0" + - "7" + - "8a" + default: "7" + passphrase: + type: str + description: Extensible Authentication Protocol password. + ssl_profile: + type: str + logging: + type: bool + description: Enable supplicant logging. + disconnect_cached_results_timeout: + type: int + convert_types: + - "str" + min: 60 + max: 65535 + description: Timeout in seconds for removing a disconnected supplicant. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/dps-interfaces.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/dps-interfaces.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/dps-interfaces.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/dps-interfaces.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/dynamic_prefix_lists.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/dynamic_prefix_lists.schema.yml similarity index 80% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/dynamic_prefix_lists.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/dynamic_prefix_lists.schema.yml index f6c1cbf57cc..4f93185b9eb 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/dynamic_prefix_lists.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/dynamic_prefix_lists.schema.yml @@ -13,16 +13,16 @@ keys: keys: name: type: str - description: Dynamic prefix-list name + description: Dynamic prefix-list name. match_map: type: str - description: Route-map name + description: Route-map name. prefix_list: type: dict keys: ipv4: type: str - description: Prefix-list name + description: Prefix-list name. ipv6: type: str - description: Prefix-list name + description: Prefix-list name. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/enable_password.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/enable_password.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/enable_password.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/enable_password.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/eos_cli.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/eos_cli.schema.yml similarity index 91% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/eos_cli.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/eos_cli.schema.yml index 42b062ac64c..4657bfaea6c 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/eos_cli.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/eos_cli.schema.yml @@ -8,4 +8,4 @@ type: dict keys: eos_cli: type: str - description: Multiline string with EOS CLI rendered directly on the root level of the final EOS configuration + description: Multiline string with EOS CLI rendered directly on the root level of the final EOS configuration. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/eos_cli_config_gen_configuration.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/eos_cli_config_gen_configuration.schema.yml similarity index 89% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/eos_cli_config_gen_configuration.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/eos_cli_config_gen_configuration.schema.yml index 312ee21054f..f42a6e46225 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/eos_cli_config_gen_configuration.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/eos_cli_config_gen_configuration.schema.yml @@ -12,5 +12,5 @@ keys: hide_passwords: type: bool description: | - Replace the input data using the `hide_passwords` filter in the Jinja2 templates by '' in the configruation if true + Replace the input data using the `hide_passwords` filter in the Jinja2 templates by '' in the configuration if true. default: false diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/eos_cli_config_gen_documentation.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/eos_cli_config_gen_documentation.schema.yml similarity index 98% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/eos_cli_config_gen_documentation.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/eos_cli_config_gen_documentation.schema.yml index 94b211bba00..b9db043b36e 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/eos_cli_config_gen_documentation.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/eos_cli_config_gen_documentation.schema.yml @@ -12,5 +12,5 @@ keys: hide_passwords: type: bool description: | - Replace the input data using the `hide_passwords` filter in the Jinja2 templates by '' in the documentation if true + Replace the input data using the `hide_passwords` filter in the Jinja2 templates by '' in the documentation if true. default: true diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/errdisable.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/errdisable.schema.yml similarity index 97% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/errdisable.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/errdisable.schema.yml index 13a8e670e6d..cc6cd1164e6 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/errdisable.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/errdisable.schema.yml @@ -54,7 +54,7 @@ keys: type: int convert_types: - "str" - description: Interval in seconds + description: Interval in seconds. default: 300 min: 30 max: 86400 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ethernet_interfaces.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ethernet_interfaces.schema.yml similarity index 88% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ethernet_interfaces.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ethernet_interfaces.schema.yml index 89272f12db8..d9198550746 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ethernet_interfaces.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ethernet_interfaces.schema.yml @@ -26,7 +26,7 @@ keys: max: 600 convert_types: - str - description: Interval in seconds for updating interface counters" + description: Interval in seconds for updating interface counters. speed: type: str description: Speed should be set in the format `` or `forced ` or `auto `. @@ -43,7 +43,7 @@ keys: convert_types: - str description: | - "l2_mtu" should only be defined for platforms supporting the "l2 mtu" CLI + "l2_mtu" should only be defined for platforms supporting the "l2 mtu" CLI. l2_mru: type: int min: 68 @@ -51,22 +51,22 @@ keys: convert_types: - str description: | - "l2_mru" should only be defined for platforms supporting the "l2 mru" CLI + "l2_mru" should only be defined for platforms supporting the "l2 mru" CLI. vlans: type: str convert_types: - int description: | - List of switchport vlans as string - For a trunk port this would be a range like "1-200,300" - For an access port this would be a single vlan "123" + List of switchport vlans as string. + For a trunk port this would be a range like "1-200,300". + For an access port this would be a single vlan "123". native_vlan: type: int convert_types: - str native_vlan_tag: type: bool - description: If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence + description: If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence. mode: type: str valid_values: ["access", "dot1q-tunnel", "trunk", "trunk phone"] @@ -89,10 +89,10 @@ keys: type: int convert_types: - str - description: Vlan tag to configure on sub-interface + description: Vlan tag to configure on sub-interface. forwarding_profile: type: str - description: L2 protocol forwarding profile + description: L2 protocol forwarding profile. trunk_groups: type: list items: @@ -110,10 +110,10 @@ keys: keys: ipv4: type: bool - description: Enable address locking for IPv4 + description: Enable address locking for IPv4. ipv6: type: bool - description: Enable address locking for IPv6 + description: Enable address locking for IPv6. flowcontrol: type: dict keys: @@ -122,7 +122,7 @@ keys: valid_values: ["desired", "on", "off"] vrf: type: str - description: VRF name + description: VRF name. convert_types: - int flow_tracker: @@ -152,7 +152,7 @@ keys: keys: name: type: str - description: Group name + description: Group name. direction: type: str valid_values: ["upstream", "downstream"] @@ -161,7 +161,7 @@ keys: keys: identifier: type: str - description: EVPN Ethernet Segment Identifier (Type 1 format) + description: EVPN Ethernet Segment Identifier (Type 1 format). redundancy: type: str valid_values: ["all-active", "single-active"] @@ -177,10 +177,10 @@ keys: max: 65535 convert_types: - str - description: Preference_value is only used when "algorithm" is "preference" + description: Preference_value is only used when "algorithm" is "preference". dont_preempt: type: bool - description: Dont_preempt is only used when "algorithm" is "preference" + description: Dont_preempt is only used when "algorithm" is "preference". hold_time: type: int convert_types: @@ -206,12 +206,12 @@ keys: - str route_target: type: str - description: EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx + description: EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx. encapsulation_dot1q_vlan: type: int convert_types: - str - description: VLAN tag to configure on sub-interface + description: VLAN tag to configure on sub-interface. encapsulation_vlan: type: dict keys: @@ -225,22 +225,22 @@ keys: type: int convert_types: - str - description: Client VLAN ID + description: Client VLAN ID. outer: type: int convert_types: - str - description: Client Outer VLAN ID + description: Client Outer VLAN ID. inner: type: int convert_types: - str - description: Client Inner VLAN ID + description: Client Inner VLAN ID. unmatched: type: bool network: type: dict - description: Network encapsulations are all optional and skipped if using client unmatched + description: Network encapsulations are all optional and skipped if using client unmatched. keys: dot1q: type: dict @@ -249,17 +249,17 @@ keys: type: int convert_types: - str - description: Network VLAN ID + description: Network VLAN ID. outer: type: int convert_types: - str - description: Network outer VLAN ID + description: Network outer VLAN ID. inner: type: int convert_types: - str - description: Network inner VLAN ID + description: Network inner VLAN ID. client: type: bool vlan_id: @@ -271,7 +271,7 @@ keys: # TODO Format to validate ipv4 CIDR or "dhcp" ip_address: type: str - description: IPv4 address/mask or "dhcp" + description: IPv4 address/mask or "dhcp". ip_address_secondaries: type: list items: @@ -283,7 +283,7 @@ keys: - rx dhcp_client_accept_default_route: type: bool - description: Install default-route obtained via DHCP + description: Install default-route obtained via DHCP. dhcp_server_ipv4: type: bool description: Enable IPv4 DHCP server. @@ -302,10 +302,10 @@ keys: type: str source_interface: type: str - description: Source interface name + description: Source interface name. vrf: type: str - description: VRF name + description: VRF name. convert_types: - int ip_nat: @@ -321,7 +321,7 @@ keys: type: str ipv6_address_link_local: type: str - description: Link local IPv6 address/mask + description: Link local IPv6 address/mask. ipv6_nd_ra_disabled: type: bool ipv6_nd_managed_config_flag: @@ -340,12 +340,12 @@ keys: type: str convert_types: - int - description: Infinite or lifetime in seconds + description: Infinite or lifetime in seconds. preferred_lifetime: type: str convert_types: - int - description: Infinite or lifetime in seconds + description: Infinite or lifetime in seconds. no_autoconfig_flag: type: bool ipv6_dhcp_relay_destinations: @@ -356,41 +356,41 @@ keys: keys: address: type: str - description: DHCP server's IPv6 address + description: DHCP server's IPv6 address. vrf: type: str convert_types: - int local_interface: type: str - description: Local interface to communicate with DHCP server - mutually exclusive to source_address + description: Local interface to communicate with DHCP server - mutually exclusive to source_address. source_address: type: str - description: Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface + description: Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface. link_address: type: str - description: Override the default link address specified in the relayed DHCP packet + description: Override the default link address specified in the relayed DHCP packet. access_group_in: type: str - description: Access list name + description: Access list name. access_group_out: type: str - description: Access list name + description: Access list name. ipv6_access_group_in: type: str - description: IPv6 access list name + description: IPv6 access list name. ipv6_access_group_out: type: str - description: IPv6 access list name + description: IPv6 access list name. mac_access_group_in: type: str - description: MAC access list name + description: MAC access list name. mac_access_group_out: type: str - description: MAC access list name + description: MAC access list name. multicast: type: dict - description: Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both + description: Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both. keys: ipv4: type: dict @@ -402,7 +402,7 @@ keys: keys: boundary: type: str - description: ACL name or multicast IP subnet + description: ACL name or multicast IP subnet. out: type: bool static: @@ -417,7 +417,7 @@ keys: keys: boundary: type: str - description: ACL name or multicast IP subnet + description: ACL name or multicast IP subnet. static: type: bool ospf_network_point_to_point: @@ -435,7 +435,7 @@ keys: valid_values: ["none", "simple", "message-digest"] ospf_authentication_key: type: str - description: Encrypted password - only type 7 supported + description: Encrypted password - only type 7 supported. ospf_message_digest_keys: type: list primary_key: id @@ -453,7 +453,7 @@ keys: valid_values: ["md5", "sha1", "sha256", "sha384", "sha512"] key: type: str - description: Encrypted password - only type 7 supported + description: Encrypted password - only type 7 supported. pim: type: dict keys: @@ -497,6 +497,29 @@ keys: keys: profile: type: str + tcp_mss_ceiling: + type: dict + description: |- + The TCP MSS clamping feature involves clamping the maximum segment size (MSS) in the TCP header + of TCP SYN packets if it exceeds the configured MSS ceiling limit for the interface. + keys: + ipv4_segment_size: + type: int + convert_types: + - str + min: 64 + max: 65475 + ipv6_segment_size: + type: int + convert_types: + - str + min: 64 + max: 65475 + direction: + type: str + valid_values: + - egress + - ingress channel_group: type: dict keys: @@ -509,7 +532,10 @@ keys: valid_values: ["on", "active", "passive"] isis_enable: type: str - description: ISIS instance + description: ISIS instance. + isis_bfd: + type: bool + description: Enable BFD for ISIS. isis_passive: type: bool isis_metric: @@ -528,7 +554,7 @@ keys: valid_values: ["text", "md5"] isis_authentication_key: type: str - description: Type-7 encrypted password + description: Type-7 encrypted password. poe: type: dict keys: @@ -539,23 +565,23 @@ keys: priority: type: str valid_values: ["critical", "high", "medium", "low"] - description: Prioritize a port's power in the event that one of the switch's power supplies loses power + description: Prioritize a port's power in the event that one of the switch's power supplies loses power. reboot: - description: Set the PoE power behavior for a PoE port when the system is rebooted + description: Set the PoE power behavior for a PoE port when the system is rebooted. type: dict keys: action: type: str valid_values: ["maintain", "power-off"] - description: PoE action for interface + description: PoE action for interface. link_down: - description: Set the PoE power behavior for a PoE port when the port goes down + description: Set the PoE power behavior for a PoE port when the port goes down. type: dict keys: action: type: str valid_values: ["maintain", "power-off"] - description: PoE action for interface + description: PoE action for interface. power_off_delay: type: int min: 1 @@ -564,13 +590,13 @@ keys: - str description: Number of seconds to delay shutting the power off after a link down event occurs. Default value is 5 seconds in EOS. shutdown: - description: Set the PoE power behavior for a PoE port when the port is admin down + description: Set the PoE power behavior for a PoE port when the port is admin down. type: dict keys: action: type: str valid_values: ["maintain", "power-off"] - description: PoE action for interface + description: PoE action for interface. limit: type: dict description: Override the hardware-negotiated power limit using either wattage or a power class. Note that if using a power class, AVD will automatically convert the class value to the wattage value corresponding to that power class. @@ -588,7 +614,7 @@ keys: - float fixed: type: bool - description: Set to ignore hardware classification + description: Set to ignore hardware classification. negotiation_lldp: type: bool description: Disable to prevent port from negotiating power with powered devices over LLDP. Enabled by default in EOS. @@ -632,13 +658,13 @@ keys: type: str convert_types: - int - description: VLAN can be 'all' or list of vlans as string + description: VLAN can be 'all' or list of vlans as string. transport: type: str valid_values: ["ipv4", "ipv6", "layer2"] profile: type: str - description: Interface profile + description: Interface profile. storm_control: type: dict keys: @@ -650,12 +676,12 @@ keys: convert_types: - int - float - description: Configure maximum storm-control level + description: Configure maximum storm-control level. unit: type: str default: "percent" valid_values: [ "percent", "pps" ] - description: Optional field and is hardware dependent + description: Optional field and is hardware dependent. broadcast: type: dict keys: @@ -664,12 +690,12 @@ keys: convert_types: - int - float - description: Configure maximum storm-control level + description: Configure maximum storm-control level. unit: type: str default: "percent" valid_values: ["percent", "pps"] - description: Optional field and is hardware dependent + description: Optional field and is hardware dependent. multicast: type: dict keys: @@ -678,12 +704,12 @@ keys: convert_types: - int - float - description: Configure maximum storm-control level + description: Configure maximum storm-control level. unit: type: str default: "percent" valid_values: ["percent", "pps"] - description: Optional field and is hardware dependent + description: Optional field and is hardware dependent. unknown_unicast: type: dict keys: @@ -692,12 +718,12 @@ keys: convert_types: - int - float - description: Configure maximum storm-control level + description: Configure maximum storm-control level. unit: type: str default: "percent" valid_values: [ "percent", "pps" ] - description: Optional field and is hardware dependent + description: Optional field and is hardware dependent. logging: type: dict keys: @@ -725,14 +751,14 @@ keys: type: int convert_types: - str - description: ZTP vlan number + description: ZTP vlan number. trunk_private_vlan_secondary: type: bool pvlan_mapping: type: str convert_types: - int - description: List of vlans as string + description: List of vlans as string. vlan_translations: type: list items: @@ -742,12 +768,12 @@ keys: type: str convert_types: - int - description: List of vlans as string (only one vlan if direction is "both") + description: List of vlans as string (only one vlan if direction is "both"). to: type: int convert_types: - str - description: VLAN ID + description: VLAN ID. direction: type: str valid_values: ["in", "out", "both"] @@ -816,7 +842,7 @@ keys: type: str convert_types: - int - description: Value can be 60-4294967295 or 'server' + description: Value can be 60-4294967295 or 'server'. reauth_timeout_ignore: type: bool tx_period: @@ -856,15 +882,15 @@ keys: - str service_profile: type: str - description: QOS profile + description: QOS profile. shape: type: dict keys: rate: type: str description: | - Rate in kbps, pps or percent - Supported options are platform dependent + Rate in kbps, pps or percent. + Supported options are platform dependent. Examples: - "5000 kbps" - "1000 pps" @@ -879,12 +905,12 @@ keys: type: int convert_types: - str - description: DSCP value + description: DSCP value. cos: type: int convert_types: - str - description: COS value + description: COS value. spanning_tree_bpdufilter: type: str convert_types: @@ -931,12 +957,12 @@ keys: type: int convert_types: - str - description: Interval in milliseconds + description: Interval in milliseconds. min_rx: type: int convert_types: - str - description: Rate in milliseconds + description: Rate in milliseconds. multiplier: type: int min: 3 @@ -951,14 +977,14 @@ keys: keys: input: type: str - description: Policy Based Routing Policy-map name + description: Policy Based Routing Policy-map name. qos: type: dict keys: input: type: str required: true - description: Quality of Service Policy-map name + description: Quality of Service Policy-map name. mpls: type: dict @@ -993,12 +1019,23 @@ keys: transceiver: type: dict keys: + frequency: + type: str + convert_types: + - int + - float + description: Transceiver Laser Frequency in GHz (min 190000, max 200000). + frequency_unit: + type: str + required: false + valid_values: ["ghz"] + description: Unit of Transceiver Laser Frequency. media: type: dict keys: override: type: str - description: Transceiver type + description: Transceiver type. ip_proxy_arp: type: bool traffic_policy: @@ -1006,16 +1043,16 @@ keys: keys: input: type: str - description: Ingress traffic policy + description: Ingress traffic policy. output: type: str - description: Egress traffic policy + description: Egress traffic policy. bgp: type: dict keys: session_tracker: type: str - description: Name of session tracker + description: Name of session tracker. ip_igmp_host_proxy: type: dict keys: @@ -1073,13 +1110,13 @@ keys: description: IGMP version on IGMP host-proxy interface. peer: type: str - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. peer_interface: type: str - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. peer_type: type: str - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. sflow: type: dict keys: @@ -1094,7 +1131,7 @@ keys: type: bool port_profile: type: str - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. uc_tx_queues: type: list primary_key: id @@ -1108,17 +1145,17 @@ keys: convert_types: - str required: true - description: TX-Queue ID + description: TX-Queue ID. random_detect: type: dict keys: ecn: - description: Explicit Congestion Notification + description: Explicit Congestion Notification. type: dict keys: count: type: bool - description: Enable counter for random-detect ECNs + description: Enable counter for random-detect ECNs. threshold: type: dict keys: @@ -1126,7 +1163,7 @@ keys: required: true type: str valid_values: ["segments", "bytes", "kbytes", "mbytes", "milliseconds"] - description: Indicate the units to be used for the threshold values + description: Indicate the units to be used for the threshold values. min: type: int required: true @@ -1134,7 +1171,7 @@ keys: max: 256000000 convert_types: - str - description: Set the random-detect ECN minimum-threshold + description: Set the random-detect ECN minimum-threshold. max: type: int required: true @@ -1142,21 +1179,21 @@ keys: - str min: 1 max: 256000000 - description: Set the random-detect ECN maximum-threshold + description: Set the random-detect ECN maximum-threshold. max_probability: type: int min: 1 max: 100 convert_types: - str - description: Set the random-detect ECN max-mark-probability + description: Set the random-detect ECN max-mark-probability. weight: type: int min: 0 max: 15 convert_types: - str - description: Set the random-detect ECN weight + description: Set the random-detect ECN weight. tx_queues: type: list primary_key: id @@ -1170,17 +1207,17 @@ keys: convert_types: - str required: true - description: TX-Queue ID + description: TX-Queue ID. random_detect: type: dict keys: ecn: - description: Explicit Congestion Notification + description: Explicit Congestion Notification. type: dict keys: count: type: bool - description: Enable counter for random-detect ECNs + description: Enable counter for random-detect ECNs. threshold: type: dict keys: @@ -1188,14 +1225,14 @@ keys: type: str required: true valid_values: ["segments", "bytes", "kbytes", "mbytes", "milliseconds"] - description: Indicate the units to be used for the threshold values + description: Indicate the units to be used for the threshold values. min: type: int min: 1 max: 256000000 convert_types: - str - description: Set the random-detect ECN minimum-threshold + description: Set the random-detect ECN minimum-threshold. max: type: int required: true @@ -1203,7 +1240,7 @@ keys: - str min: 1 max: 256000000 - description: Set the random-detect ECN maximum-threshold + description: Set the random-detect ECN maximum-threshold. max_probability: type: int required: true @@ -1211,14 +1248,14 @@ keys: max: 100 convert_types: - str - description: Set the random-detect ECN max-mark-probability + description: Set the random-detect ECN max-mark-probability. weight: type: int min: 0 max: 15 convert_types: - str - description: Set the random-detect ECN weight + description: Set the random-detect ECN weight. vrrp_ids: type: list description: VRRP model. @@ -1230,12 +1267,12 @@ keys: type: int convert_types: - str - description: VRID + description: VRID. priority_level: type: int convert_types: - str - description: Instance priority + description: Instance priority. min: 1 max: 254 advertisement: @@ -1245,7 +1282,7 @@ keys: type: int convert_types: - str - description: Interval in seconds + description: Interval in seconds. min: 1 max: 255 preempt: @@ -1261,14 +1298,14 @@ keys: type: int convert_types: - str - description: Minimum preempt delay in seconds + description: Minimum preempt delay in seconds. min: 0 max: 3600 reload: type: int convert_types: - str - description: Reload preempt delay in seconds + description: Reload preempt delay in seconds. min: 0 max: 3600 timers: @@ -1292,14 +1329,14 @@ keys: keys: name: type: str - description: Tracked object name + description: Tracked object name. decrement: type: int convert_types: - str min: 1 max: 254 - description: Decrement VRRP priority by 1-254 + description: Decrement VRRP priority by 1-254. shutdown: type: bool ipv4: @@ -1308,7 +1345,7 @@ keys: address: type: str required: true - description: Virtual IPv4 address + description: Virtual IPv4 address. version: type: int convert_types: @@ -1322,10 +1359,10 @@ keys: address: type: str required: true - description: Virtual IPv6 address + description: Virtual IPv6 address. validate_state: type: bool - description: Set to false to disable interface validation by the `eos_validate_state` role + description: Set to false to disable interface validation by the `eos_validate_state` role. switchport: type: dict keys: @@ -1390,4 +1427,4 @@ keys: - str eos_cli: type: str - description: Multiline EOS CLI rendered directly on the ethernet interface in the final EOS configuration + description: Multiline EOS CLI rendered directly on the ethernet interface in the final EOS configuration. diff --git a/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/event_handlers.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/event_handlers.schema.yml new file mode 100644 index 00000000000..1d341dad0f4 --- /dev/null +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/event_handlers.schema.yml @@ -0,0 +1,184 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +# yaml-language-server: $schema=../../../../plugins/plugin_utils/schema/avd_meta_schema.json +# Line above is used by RedHat's YAML Schema vscode extension +# Use Ctrl + Space to get suggestions for every field. Autocomplete will pop up after typing 2 letters. +type: dict +keys: + event_handlers: + type: list + description: | + Gives the ability to monitor and react to Syslog messages. + Event Handlers provide a powerful and flexible tool that can be used to apply self-healing actions, + customize the system behavior, and implement workarounds to problems discovered in the field. + primary_key: name + convert_types: + - dict + items: + type: dict + keys: + name: + type: str + description: Event Handler Name. + action_type: + type: str + valid_values: ["bash", "increment", "log"] + deprecation: + warning: true + removed: false + remove_in_version: 5.0.0 + new_key: event_handlers.actions + action: + type: str + description: | + Command to execute. + deprecation: + warning: true + removed: false + remove_in_version: 5.0.0 + new_key: event_handlers.actions + actions: + type: dict + description: |- + Note: `bash_command` and `log` are mutually exclusive. `bash_command` takes precedence over `log`. + keys: + bash_command: + type: str + description: Define BASH command action. Command could be multiline also. + log: + type: bool + description: Log a message when the event is triggered. + increment_device_health_metric: + type: str + description: Name of device-health metric. + delay: + type: int + convert_types: + - str + description: | + Event-handler delay in seconds. + trigger: + type: str + description: | + Configure event trigger condition. + valid_values: + - "on-boot" + - "on-counters" + - "on-intf" + - "on-logging" + - "on-maintenance" + - "on-startup-config" + - "vm-tracer vm" + trigger_on_counters: + type: dict + keys: + condition: + type: str + description: Set the logical expression to evaluate. + granularity_per_source: + type: bool + description: |- + Set the granularity of event counting for a wildcarded condition. + Example - + condition ( Arad*.IptCrcErrCnt.delta > 100 ) and ( Arad*.UcFifoFullDrop.delta > 100 ) + [* wildcard is used here] + poll_interval: + type: int + convert_types: + - str + min: 1 + max: 1000000 + description: Set the polling interval in seconds. + trigger_on_logging: + type: dict + keys: + poll_interval: + type: int + convert_types: + - str + min: 1 + max: 1000000 + description: Set the polling interval in seconds. + regex: + type: str + description: Regular expression to use for searching log messages. + trigger_on_intf: + type: dict + description: |- + Trigger condition occurs on specified interface changes. + Note: Any one of the `ip`, `ipv6` and `operstatus` key needs to be defined along with the `interface`. + keys: + interface: + type: str + required: True + description: |- + Interface name. + Example - Ethernet4 + Loopback4-6 + Port-channel4,7 + ip: + type: bool + description: Action is triggered upon changes to interface IP address assignment. + ipv6: + type: bool + description: Action is triggered upon changes to interface ipv6 address assignment. + operstatus: + type: bool + description: Action is triggered upon changes to interface operStatus. + trigger_on_maintenance: + description: Settings required for trigger 'on-maintenance'. + type: dict + keys: + operation: + type: str + required: true + valid_values: + - "enter" + - "exit" + bgp_peer: + description: |- + Ipv4/Ipv6 address or peer group name. + Trigger condition occurs on maintenance operation of specified BGP peer. + type: str + action: + type: str + required: true + description: Action for maintenance operation. + valid_values: + - after + - before + - all + - begin + - end + stage: + type: str + description: Action is triggered after/before specified stage. + valid_values: + - "bgp" + - "linkdown" + - "mlag" + - "ratemon" + vrf: + type: str + description: VRF name. VRF can be defined for "bgp_peer" only. + interface: + type: str + description: Trigger condition occurs on maintenance operation of specified interface. + unit: + type: str + description: Name of unit. Trigger condition occurs on maintenance operation of specified unit + regex: + type: str + deprecation: + warning: true + removed: false + remove_in_version: 5.0.0 + new_key: event_handlers.trigger_on_logging.regex + description: | + Regular expression to use for searching log messages. Required for on-logging trigger. + asynchronous: + type: bool + default: False + description: | + Set the action to be non-blocking. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/event_monitor.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/event_monitor.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/event_monitor.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/event_monitor.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/flow_tracking.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/flow_tracking.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/flow_tracking.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/flow_tracking.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/flow_trackings.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/flow_trackings.schema.yml similarity index 91% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/flow_trackings.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/flow_trackings.schema.yml index c8b54482563..392a3636d55 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/flow_trackings.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/flow_trackings.schema.yml @@ -21,7 +21,7 @@ keys: type: type: str valid_values: ['sampled'] - description: Flow Tracking Type - only 'sampled' supported for now + description: Flow Tracking Type - only 'sampled' supported for now. sample: type: int convert_types: @@ -36,7 +36,7 @@ keys: keys: name: type: str - description: Tracker Name + description: Tracker Name. record_export: type: dict keys: @@ -46,17 +46,17 @@ keys: - str min: 3000 max: 900000 - description: Flow record inactive export timeout in milliseconds + description: Flow record inactive export timeout in milliseconds. on_interval: type: int convert_types: - str min: 1000 max: 36000000 - description: Flow record export interval in milliseconds + description: Flow record export interval in milliseconds. mpls: type: bool - description: Export MPLS forwarding information + description: Export MPLS forwarding information. exporters: type: list primary_key: name @@ -65,16 +65,16 @@ keys: keys: name: type: str - description: Exporter Name + description: Exporter Name. collector: type: dict keys: host: type: str - description: Collector IPv4 address or IPv6 address or fully qualified domain name + description: Collector IPv4 address or IPv6 address or fully qualified domain name. port: type: int - description: Collector Port Number + description: Collector Port Number. min: 1 max: 65535 convert_types: @@ -88,14 +88,14 @@ keys: - str local_interface: type: str - description: Local Source Interface + description: Local Source Interface. template_interval: type: int convert_types: - str min: 5000 max: 3600000 - description: Template interval in milliseconds + description: Template interval in milliseconds. table_size: type: int convert_types: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/generate_default_config.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/generate_default_config.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/generate_default_config.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/generate_default_config.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/generate_device_documentation.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/generate_device_documentation.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/generate_device_documentation.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/generate_device_documentation.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/hardware.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/hardware.schema.yml similarity index 93% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/hardware.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/hardware.schema.yml index af1f0f79e14..b0a784cf803 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/hardware.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/hardware.schema.yml @@ -29,4 +29,4 @@ keys: - int serdes: type: str - description: Serdes speed like "10g" or "25g" + description: Serdes speed like "10g" or "25g". diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/hardware_counters.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/hardware_counters.schema.yml similarity index 96% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/hardware_counters.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/hardware_counters.schema.yml index 4a32a8e242e..2531fa703e6 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/hardware_counters.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/hardware_counters.schema.yml @@ -20,7 +20,7 @@ keys: The available values of the different keys like 'direction' or 'address_type' are feature and hardware dependent and this model DOES NOT validate that the - combinations are valid. It is the responsability of the user of this data model + combinations are valid. It is the responsibility of the user of this data model to make sure that the rendered CLI is accepted by the targeted device. Examples: @@ -81,6 +81,7 @@ keys: - qos dual-rate-policer - route - routed-port + - segment-security - subinterface - tapagg - traffic-class @@ -116,7 +117,7 @@ keys: layer3: type: bool description: | - Supported only for the 'ip' feature + Supported only for the 'ip' feature. vrf: type: str description: | diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/hostname.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/hostname.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/hostname.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/hostname.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/interface_defaults.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/interface_defaults.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/interface_defaults.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/interface_defaults.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/interface_groups.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/interface_groups.schema.yml similarity index 81% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/interface_groups.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/interface_groups.schema.yml index 411748ae0f9..d06aad3c9c8 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/interface_groups.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/interface_groups.schema.yml @@ -17,19 +17,19 @@ keys: keys: name: type: str - description: Interface-Group name + description: Interface-Group name. interfaces: type: list items: type: str - description: Interface Name + description: Interface Name. bgp_maintenance_profiles: type: list items: type: str - description: Name of BGP Maintenance Profile + description: Name of BGP Maintenance Profile. interface_maintenance_profiles: type: list items: type: str - description: Name of Interface Maintenance Profile + description: Name of Interface Maintenance Profile. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/interface_profiles.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/interface_profiles.schema.yml similarity index 89% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/interface_profiles.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/interface_profiles.schema.yml index f19d04e5c9b..3198ef290dd 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/interface_profiles.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/interface_profiles.schema.yml @@ -16,12 +16,12 @@ keys: keys: name: type: str - description: Interface-Profile Name + description: Interface-Profile Name. commands: type: list required: true items: type: str description: | - EOS CLI interface command + EOS CLI interface command. Example: "switchport mode access" diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_access_lists.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_access_lists.schema.yml similarity index 99% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_access_lists.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_access_lists.schema.yml index 6c70369220a..024df92ad64 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_access_lists.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_access_lists.schema.yml @@ -108,7 +108,7 @@ keys: description: Log matches against this rule. ttl: type: int - description: TTL value + description: TTL value. convert_types: - str min: 0 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_access_lists_max_entries.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_access_lists_max_entries.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_access_lists_max_entries.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_access_lists_max_entries.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_community_lists.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_community_lists.schema.yml similarity index 93% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_community_lists.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_community_lists.schema.yml index 04beff724d4..aba0e44c838 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_community_lists.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_community_lists.schema.yml @@ -14,13 +14,13 @@ keys: - dict display_name: IP Community Lists description: | - Communities and regexp entries MUST not be configured in the same community-list + Communities and regexp entries MUST not be configured in the same community-list. items: type: dict keys: name: type: str - description: IP Community-list Name + description: IP Community-list Name. entries: type: list required: true @@ -48,5 +48,5 @@ keys: regexp: type: str description: | - Regular Expression - If defined, a regex community-list will be configured + Regular Expression. + If defined, a regex community-list will be configured. diff --git a/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_dhcp_relay.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_dhcp_relay.schema.yml new file mode 100644 index 00000000000..841b3c085ab --- /dev/null +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_dhcp_relay.schema.yml @@ -0,0 +1,20 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +# yaml-language-server: $schema=../../../../plugins/plugin_utils/schema/avd_meta_schema.json +# Line above is used by RedHat's YAML Schema vscode extension +# Use Ctrl + Space to get suggestions for every field. Autocomplete will pop up after typing 2 letters. +type: dict +keys: + ip_dhcp_relay: + type: dict + keys: + always_on: + type: bool + description: DhcpRelay Agent will be in always-on mode. + all_subnets: + type: bool + description: Allow forwarding requests with secondary IP addresses in the gateway address "giaddr" field. + information_option: + type: bool + description: Insert Option-82 information. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_dhcp_snooping.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_dhcp_snooping.schema.yml similarity index 96% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_dhcp_snooping.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_dhcp_snooping.schema.yml index 6a28f78b319..ebaf5b44b54 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_dhcp_snooping.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_dhcp_snooping.schema.yml @@ -18,13 +18,13 @@ keys: keys: enabled: type: bool - description: Enable insertion of option-82 in DHCP request packets + description: Enable insertion of option-82 in DHCP request packets. circuit_id_type: type: str convert_types: - int description: |- - "none" or <0 - 255> + "none" or <0 - 255>. circuit_id_format: type: str description: |- diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_domain_lookup.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_domain_lookup.schema.yml similarity index 95% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_domain_lookup.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_domain_lookup.schema.yml index f52fcbbe2ca..6988f208ea5 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_domain_lookup.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_domain_lookup.schema.yml @@ -20,7 +20,7 @@ keys: name: type: str description: | - Source Interface + Source Interface. vrf: type: str convert_types: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_extcommunity_lists.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_extcommunity_lists.schema.yml similarity index 92% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_extcommunity_lists.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_extcommunity_lists.schema.yml index 654011a574d..e6560109fad 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_extcommunity_lists.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_extcommunity_lists.schema.yml @@ -18,7 +18,7 @@ keys: keys: name: type: str - description: Community-list Name + description: Community-list Name. entries: type: list required: true @@ -33,5 +33,5 @@ keys: type: str required: true description: | - Communities as string + Communities as string. Example: "65000:65000" diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_extcommunity_lists_regexp.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_extcommunity_lists_regexp.schema.yml similarity index 91% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_extcommunity_lists_regexp.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_extcommunity_lists_regexp.schema.yml index f34fdd77ba8..5008b6e24fb 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_extcommunity_lists_regexp.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_extcommunity_lists_regexp.schema.yml @@ -18,7 +18,7 @@ keys: keys: name: type: str - description: Community-list Name + description: Community-list Name. entries: type: list required: true @@ -32,4 +32,4 @@ keys: regexp: type: str required: true - description: Regular Expression + description: Regular Expression. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_ftp_client_source_interfaces.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_ftp_client_source_interfaces.schema.yml similarity index 89% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_ftp_client_source_interfaces.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_ftp_client_source_interfaces.schema.yml index aa5ba855ab6..474b67a5652 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_ftp_client_source_interfaces.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_ftp_client_source_interfaces.schema.yml @@ -14,7 +14,7 @@ keys: name: type: str required: true - description: Interface Name + description: Interface Name. vrf: type: str - description: VRF Name + description: VRF Name. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_hardware.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_hardware.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_hardware.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_hardware.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_http_client_source_interfaces.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_http_client_source_interfaces.schema.yml similarity index 94% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_http_client_source_interfaces.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_http_client_source_interfaces.schema.yml index 2ff382f008c..b1dc6b88905 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_http_client_source_interfaces.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_http_client_source_interfaces.schema.yml @@ -12,7 +12,7 @@ keys: type: dict keys: name: - description: Interface Name + description: Interface Name. type: str vrf: type: str diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_icmp_redirect.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_icmp_redirect.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_icmp_redirect.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_icmp_redirect.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_igmp_snooping.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_igmp_snooping.schema.yml similarity index 96% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_igmp_snooping.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_igmp_snooping.schema.yml index 7cef1b46a0a..0ebc5cd9488 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_igmp_snooping.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_igmp_snooping.schema.yml @@ -34,7 +34,7 @@ keys: type: bool address: type: str - description: IP Address + description: IP Address. query_interval: type: int convert_types: @@ -77,7 +77,7 @@ keys: type: int convert_types: - str - description: VLAN ID + description: VLAN ID. enabled: type: bool querier: @@ -87,7 +87,7 @@ keys: type: bool address: type: str - description: IP Address + description: IP Address. query_interval: type: int convert_types: @@ -125,4 +125,4 @@ keys: proxy: type: bool description: | - Global proxy settings should be enabled before enabling per-vlan + Global proxy settings should be enabled before enabling per-vlan. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_name_servers.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_name_servers.schema.yml similarity index 83% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_name_servers.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_name_servers.schema.yml index 5c6798c6390..f527ba15a97 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_name_servers.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_name_servers.schema.yml @@ -13,14 +13,14 @@ keys: keys: ip_address: type: str - description: IPv4 or IPv6 address for DNS server + description: IPv4 or IPv6 address for DNS server. vrf: - description: VRF Name + description: VRF Name. type: str convert_types: - int priority: - description: Priority value (lower is first) + description: Priority value (lower is first). type: int convert_types: - str diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_nat.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_nat.schema.yml similarity index 81% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_nat.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_nat.schema.yml index 00492c1e44e..1e50698d6b3 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_nat.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_nat.schema.yml @@ -15,7 +15,7 @@ keys: - str min: 1 max: 64 - description: Buffer size in MB + description: Buffer size in MB. profiles: type: list primary_key: name @@ -38,13 +38,17 @@ keys: keys: name: type: str + type: + type: str + valid_values: ["ip-port", "port-only"] + default: "ip-port" prefix_length: type: int - required: true convert_types: - str min: 16 max: 32 + description: It is only used and required when `type` is `ip-port`. ranges: type: list items: @@ -52,12 +56,15 @@ keys: keys: first_ip: type: str - required: true - description: IPv4 address + description: |- + IPv4 address. + Required when `type` is `ip-port` and ignored otherwise. last_ip: type: str - required: true - description: IPv4 address + description: |- + IPv4 address. + Required when `type` is `ip-port` and ignored otherwise. + `first_ip` and `last_ip` ip addresses should lie in same subnet. first_port: type: int convert_types: @@ -70,6 +77,9 @@ keys: - str min: 1 max: 65535 + description: |- + Required when `first_port` is set. + `last_port` must be greater than or equal to `first_port`. utilization_log_threshold: type: int convert_types: @@ -87,13 +97,13 @@ keys: - str min: 60 max: 3600 - description: in seconds + description: In seconds. local_interface: type: str - description: EOS interface name + description: EOS interface name. peer_address: type: str - description: IPv4 address + description: IPv4 address. port_range: type: dict keys: @@ -109,7 +119,7 @@ keys: - str min: 1024 max: 65535 - description: '>= first_port' + description: '>= first_port.' split_disabled: type: bool shutdown: @@ -135,14 +145,14 @@ keys: - str min: 1 max: 99 - description: "Used to render 'ip nat translation low-mark '" + description: "Used to render 'ip nat translation low-mark '." host_percentage: type: int convert_types: - str min: 1 max: 99 - description: "Used to render 'ip nat translation low-mark host'" + description: "Used to render 'ip nat translation low-mark host'." max_entries: type: dict keys: @@ -166,7 +176,7 @@ keys: keys: ip: type: str - description: IPv4 address + description: IPv4 address. limit: type: int required: true @@ -190,4 +200,4 @@ keys: - str min: 0 max: 4294967295 - description: in seconds + description: In seconds. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_radius_source_interfaces.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_radius_source_interfaces.schema.yml similarity index 89% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_radius_source_interfaces.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_radius_source_interfaces.schema.yml index 506cc94d849..7490da1a5d2 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_radius_source_interfaces.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_radius_source_interfaces.schema.yml @@ -13,9 +13,9 @@ keys: keys: name: type: str - description: Interface Name + description: Interface Name. vrf: type: str - description: VRF Name + description: VRF Name. convert_types: - int diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_routing.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_routing.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_routing.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_routing.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_routing_ipv6_interfaces.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_routing_ipv6_interfaces.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_routing_ipv6_interfaces.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_routing_ipv6_interfaces.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_security.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_security.schema.yml similarity index 87% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_security.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_security.schema.yml index fbe8252e01e..6dfc65780a7 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_security.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_security.schema.yml @@ -59,7 +59,27 @@ keys: keys: name: type: str - description: Name of the SA policy. The "null" value is deprecated and will be removed in AVD 5.0.0 + description: Name of the SA policy. The "null" value is deprecated and will be removed in AVD 5.0.0. + sa_lifetime: + type: dict + keys: + value: + type: int + description: |- + Lifetime value for this SA. + Valid range depends on the unit. + <1-24> Lifetime in hours ( default ) + <1-4000000> Packet limit in thousands + <1-6000> Byte limit in GB ( 1024 MB ) + <1-6144000> Byte limit in MB ( 1024 KB ) + unit: + type: str + valid_values: + - gigabytes + - hours + - megabytes + - thousand-packets + default: hours esp: type: dict keys: @@ -134,7 +154,7 @@ keys: action: type: str description: | - Action to apply + Action to apply. * 'clear': Delete all connections * 'hold': Re-negotiate connection on demand diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_ssh_client_source_interfaces.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_ssh_client_source_interfaces.schema.yml similarity index 94% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_ssh_client_source_interfaces.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_ssh_client_source_interfaces.schema.yml index 4a12576e761..fc4457c23e3 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_ssh_client_source_interfaces.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_ssh_client_source_interfaces.schema.yml @@ -12,7 +12,7 @@ keys: type: dict keys: name: - description: Interface Name + description: Interface Name. type: str vrf: type: str diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_tacacs_source_interfaces.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_tacacs_source_interfaces.schema.yml similarity index 94% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_tacacs_source_interfaces.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_tacacs_source_interfaces.schema.yml index 8898b4d525b..c6a10125fb4 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_tacacs_source_interfaces.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_tacacs_source_interfaces.schema.yml @@ -14,7 +14,7 @@ keys: keys: name: type: str - description: Interface name + description: Interface name. vrf: type: str display_name: VRF diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_telnet_client_source_interfaces.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_telnet_client_source_interfaces.schema.yml similarity index 89% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_telnet_client_source_interfaces.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_telnet_client_source_interfaces.schema.yml index 4bdebea8d30..1685ceb499b 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_telnet_client_source_interfaces.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_telnet_client_source_interfaces.schema.yml @@ -14,7 +14,7 @@ keys: name: type: str required: true - description: Interface Name + description: Interface Name. vrf: type: str - description: VRF Name + description: VRF Name. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_tftp_client_source_interfaces.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_tftp_client_source_interfaces.schema.yml similarity index 89% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_tftp_client_source_interfaces.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_tftp_client_source_interfaces.schema.yml index 32406a122a1..45530e9e0d3 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_tftp_client_source_interfaces.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_tftp_client_source_interfaces.schema.yml @@ -14,7 +14,7 @@ keys: name: type: str required: true - description: Interface Name + description: Interface Name. vrf: type: str - description: VRF Name + description: VRF Name. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_virtual_router_mac_address.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_virtual_router_mac_address.schema.yml similarity index 90% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_virtual_router_mac_address.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_virtual_router_mac_address.schema.yml index 8e53aa5ac56..c04b5b7495e 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_virtual_router_mac_address.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ip_virtual_router_mac_address.schema.yml @@ -8,4 +8,4 @@ type: dict keys: ip_virtual_router_mac_address: type: str - description: MAC address (hh:hh:hh:hh:hh:hh) + description: MAC address (hh:hh:hh:hh:hh:hh). diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ipv6_access_lists.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ipv6_access_lists.schema.yml similarity index 90% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ipv6_access_lists.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ipv6_access_lists.schema.yml index 3582176c33b..003506e59a5 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ipv6_access_lists.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ipv6_access_lists.schema.yml @@ -17,7 +17,7 @@ keys: keys: name: type: str - description: IPv6 Access-list Name + description: IPv6 Access-list Name. convert_types: [ int ] counters_per_entry: type: bool @@ -32,12 +32,12 @@ keys: keys: sequence: type: int - description: Sequence ID + description: Sequence ID. convert_types: - str action: type: str required: true description: | - Action as string + Action as string. Example: "deny ipv6 any any" diff --git a/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ipv6_dhcp_relay.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ipv6_dhcp_relay.schema.yml new file mode 100644 index 00000000000..9f774f3fad4 --- /dev/null +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ipv6_dhcp_relay.schema.yml @@ -0,0 +1,28 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +# yaml-language-server: $schema=../../../../plugins/plugin_utils/schema/avd_meta_schema.json +# Line above is used by RedHat's YAML Schema vscode extension +# Use Ctrl + Space to get suggestions for every field. Autocomplete will pop up after typing 2 letters. +type: dict +keys: + ipv6_dhcp_relay: + type: dict + keys: + always_on: + type: bool + description: DhcpRelay Agent will be in always-on mode, off by default. + all_subnets: + type: bool + description: Allow forwarding requests with additional IPv6 addresses in the gateway address "giaddr" field. + option: + type: dict + description: Insert DHCP Option. + keys: + link_layer_address: + type: bool + description: Add Option 79 (Link Layer Address Option). + remote_id_format: + type: str + valid_values: ["%m:%i", "%m:%p"] + description: Add RemoteID option 37 in format MAC address and interface ID (`%m:%i`) or MAC address and interface name (`%m:%p`). diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ipv6_hardware.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ipv6_hardware.schema.yml similarity index 96% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ipv6_hardware.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ipv6_hardware.schema.yml index 8f4cb712952..32b242f94eb 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ipv6_hardware.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ipv6_hardware.schema.yml @@ -20,4 +20,4 @@ keys: keys: profile: type: str - description: "Pre-defined profile 'internet' or user-defined profile name" + description: "Pre-defined profile 'internet' or user-defined profile name." diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ipv6_icmp_redirect.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ipv6_icmp_redirect.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ipv6_icmp_redirect.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ipv6_icmp_redirect.schema.yml diff --git a/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ipv6_neighbors.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ipv6_neighbors.schema.yml new file mode 100644 index 00000000000..6ea2d493843 --- /dev/null +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ipv6_neighbors.schema.yml @@ -0,0 +1,48 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +# yaml-language-server: $schema=../../../../plugins/plugin_utils/schema/avd_meta_schema.json +# Line above is used by RedHat's YAML Schema vscode extension +# Use Ctrl + Space to get suggestions for every field. Autocomplete will pop up after typing 2 letters. +type: dict +keys: + ipv6_neighbor: + type: dict + keys: + static_entries: + type: list + description: Static IPv6 neighbor entries. + items: + type: dict + keys: + ipv6_address: + type: str + required: true + description: IPv6 address of neighbor. + vrf: + type: str + interface: + type: str + required: true + description: Interface name. + mac_address: + type: str + required: true + description: MAC address of neighbor like 'aa:af:12:34:bc:bf' + pattern: "^([0-9a-f]{2}:){5}[0-9a-f]{2}$" + persistent: + type: dict + keys: + enabled: + type: bool + required: true + description: Restore the IPv6 neighbor cache after reboot. + refresh_delay: + type: int + description: | + Time to wait in seconds before refreshing the IPv6 neighbor cache after reboot (EOS default 600). + It will require setting the `enabled` key to true. + min: 600 + max: 3600 + convert_types: + - str diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ipv6_prefix_lists.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ipv6_prefix_lists.schema.yml similarity index 90% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ipv6_prefix_lists.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ipv6_prefix_lists.schema.yml index e47d07c720f..ddd5a2a97e6 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ipv6_prefix_lists.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ipv6_prefix_lists.schema.yml @@ -17,7 +17,7 @@ keys: keys: name: type: str - description: Prefix-list Name + description: Prefix-list Name. sequence_numbers: type: list required: true @@ -29,12 +29,12 @@ keys: keys: sequence: type: int - description: Sequence ID + description: Sequence ID. convert_types: - str action: type: str required: true description: | - Action as string + Action as string. Example: "permit 1b11:3a00:22b0:0082::/64 eq 128" diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ipv6_standard_access_lists.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ipv6_standard_access_lists.schema.yml similarity index 90% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ipv6_standard_access_lists.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ipv6_standard_access_lists.schema.yml index 4a1e79b882d..0a802011af2 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ipv6_standard_access_lists.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ipv6_standard_access_lists.schema.yml @@ -17,7 +17,7 @@ keys: keys: name: type: str - description: Access-list Name + description: Access-list Name. convert_types: [ int ] counters_per_entry: type: bool @@ -32,12 +32,12 @@ keys: keys: sequence: type: int - description: Sequence ID + description: Sequence ID. convert_types: - str action: type: str required: true description: | - Action as string + Action as string. Example: "deny ipv6 any any" diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ipv6_static_routes.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ipv6_static_routes.schema.yml similarity index 87% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ipv6_static_routes.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ipv6_static_routes.schema.yml index 4838326b8dd..ef1c061bbc7 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ipv6_static_routes.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ipv6_static_routes.schema.yml @@ -17,15 +17,15 @@ keys: - int destination_address_prefix: type: str - description: IPv6 Network/Mask + description: IPv6 Network/Mask. interface: type: str gateway: type: str - description: IPv6 Address + description: IPv6 Address. track_bfd: type: bool - description: Track next-hop using BFD + description: Track next-hop using BFD. distance: type: int convert_types: @@ -40,7 +40,7 @@ keys: max: 4294967295 name: type: str - description: Description + description: Description. metric: type: int convert_types: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ipv6_unicast_routing.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ipv6_unicast_routing.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ipv6_unicast_routing.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ipv6_unicast_routing.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/is_deployed.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/is_deployed.schema.yml similarity index 98% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/is_deployed.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/is_deployed.schema.yml index e46538f3850..ef72e61ed32 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/is_deployed.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/is_deployed.schema.yml @@ -7,6 +7,6 @@ type: dict keys: is_deployed: - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. type: bool default: true diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/l2_protocol_forwarding.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/l2_protocol_forwarding.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/l2_protocol_forwarding.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/l2_protocol_forwarding.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/lacp.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/lacp.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/lacp.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/lacp.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/link_tracking_groups.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/link_tracking_groups.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/link_tracking_groups.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/link_tracking_groups.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/lldp.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/lldp.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/lldp.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/lldp.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/load_interval.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/load_interval.schema.yml similarity index 90% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/load_interval.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/load_interval.schema.yml index 5463d6ae49f..672d2e926b3 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/load_interval.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/load_interval.schema.yml @@ -11,6 +11,6 @@ keys: keys: default: type: int - description: Default load interval in seconds + description: Default load interval in seconds. convert_types: - str diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/local_users.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/local_users.schema.yml similarity index 92% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/local_users.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/local_users.schema.yml index e0c68bac248..5c203ba8096 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/local_users.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/local_users.schema.yml @@ -15,7 +15,7 @@ keys: type: dict keys: name: - description: Username + description: Username. type: str disabled: type: bool @@ -33,11 +33,11 @@ keys: role: type: str description: | - EOS RBAC Role to be assigned to the user such as "network-admin" or "network-operator" + EOS RBAC Role to be assigned to the user such as "network-admin" or "network-operator". sha512_password: type: str description: | - SHA512 Hash of Password + SHA512 Hash of Password. Must be the hash of the password. By default EOS salts the password with the username, so the simplest is to generate the hash on an EOS device using the same username. no_password: type: bool @@ -50,7 +50,7 @@ keys: shell: type: str description: | - Specify shell for the user + Specify shell for the user. valid_values: - /bin/bash - /bin/sh diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/logging.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/logging.schema.yml similarity index 67% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/logging.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/logging.schema.yml index 10bf1b302df..4edc3c82bbc 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/logging.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/logging.schema.yml @@ -13,12 +13,12 @@ keys: type: str valid_values: ["debugging", "informational", "notifications", "warnings", "errors", "critical", "alerts", "emergencies", "disabled"] description: | - Console logging severity level + Console logging severity level. monitor: type: str valid_values: ["debugging", "informational", "notifications", "warnings", "errors", "critical", "alerts", "emergencies", "disabled"] description: | - Monitor logging severity level + Monitor logging severity level. buffered: type: dict keys: @@ -32,12 +32,12 @@ keys: type: str valid_values: ["alerts", "critical", "debugging", "emergencies", "errors", "informational", "notifications", "warnings", "disabled"] description: | - Buffer logging severity level + Buffer logging severity level. trap: type: str valid_values: ["alerts", "critical", "debugging", "emergencies", "errors", "informational", "notifications", "system", "warnings", "disabled"] description: | - Trap logging severity level + Trap logging severity level. synchronous: type: dict keys: @@ -45,7 +45,7 @@ keys: type: str valid_values: ["alerts", "all", "critical", "debugging", "emergencies", "errors", "informational", "notifications", "warnings", "disabled"] description: | - Synchronous logging severity level + Synchronous logging severity level. default: "critical" format: type: dict @@ -53,7 +53,7 @@ keys: timestamp: type: str valid_values: ["high-resolution", "traditional", "traditional timezone", "traditional year", "traditional timezone year", "traditional year timezone"] - description: Timestamp format + description: Timestamp format. hostname: type: str valid_values: ["fqdn", "ipv4"] @@ -61,11 +61,11 @@ keys: sequence_numbers: type: bool description: | - Add sequence numbers to log messages + Add sequence numbers to log messages. rfc5424: type: bool description: | - Forward logs in RFC5424 format + Forward logs in RFC5424 format. facility: type: str valid_values: ["auth", "cron", "daemon", "kern", "local0", "local1", "local2", "local3", "local4", @@ -73,7 +73,7 @@ keys: "sys13", "sys14", "syslog", "user", "uucp"] source_interface: type: str - description: Source Interface Name + description: Source Interface Name. vrfs: type: list primary_key: name @@ -86,10 +86,10 @@ keys: type: str convert_types: - int - description: VRF name + description: VRF name. source_interface: type: str - description: Source interface name + description: Source interface name. hosts: type: list primary_key: name @@ -100,7 +100,7 @@ keys: keys: name: type: str - description: Syslog server name + description: Syslog server name. protocol: type: str valid_values: ["tcp", "udp"] @@ -127,7 +127,7 @@ keys: keys: name: type: str - description: Match list + description: Match list. action: type: str valid_values: ["discard"] @@ -148,4 +148,47 @@ keys: - str min: 10 max: 65535 - description: Logging interval in seconds + description: Logging interval in seconds. + level: + type: list + description: Configure logging severity. + primary_key: facility + convert_types: + - dict + items: + type: dict + keys: + facility: + type: str + severity: + type: str + convert_types: + - int + description: |- + Severity of facility. Below are the supported severites. + emergencies System is unusable (severity=0) + alerts Immediate action needed (severity=1) + critical Critical conditions (severity=2) + errors Error conditions (severity=3) + warnings Warning conditions (severity=4) + notifications Normal but significant conditions (severity=5) + informational Informational messages (severity=6) + debugging Debugging messages (severity=7) + <0-7> Severity level value + valid_values: + - alerts + - critical + - debugging + - emergencies + - errors + - informational + - notifications + - warnings + - '0' + - '1' + - '2' + - '3' + - '4' + - '5' + - '6' + - '7' diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/loopback_interfaces.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/loopback_interfaces.schema.yml similarity index 82% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/loopback_interfaces.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/loopback_interfaces.schema.yml index 47fff445ebc..36c4cbe618b 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/loopback_interfaces.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/loopback_interfaces.schema.yml @@ -16,29 +16,29 @@ keys: keys: name: type: str - description: Loopback interface name e.g. "Loopback0" + description: Loopback interface name e.g. "Loopback0". description: type: str shutdown: type: bool vrf: type: str - description: VRF name + description: VRF name. convert_types: - int ip_address: type: str - description: IPv4_address/Mask + description: IPv4_address/Mask. ip_address_secondaries: type: list items: type: str - description: IPv4_address/Mask + description: IPv4_address/Mask. ipv6_enable: type: bool ipv6_address: type: str - description: IPv6_address/Mask + description: IPv6_address/Mask. ip_proxy_arp: type: bool ospf_area: @@ -55,7 +55,10 @@ keys: type: bool isis_enable: type: str - description: ISIS instance name + description: ISIS instance name. + isis_bfd: + type: bool + description: Enable BFD for ISIS. isis_passive: type: bool isis_metric: @@ -77,4 +80,4 @@ keys: - str eos_cli: type: str - description: EOS CLI rendered directly on the loopback interface in the final EOS configuration + description: EOS CLI rendered directly on the loopback interface in the final EOS configuration. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/mac_access_lists.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/mac_access_lists.schema.yml similarity index 95% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/mac_access_lists.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/mac_access_lists.schema.yml index d3f9de1836f..b70d40cd89a 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/mac_access_lists.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/mac_access_lists.schema.yml @@ -16,7 +16,7 @@ keys: keys: name: type: str - description: MAC Access-list Name + description: MAC Access-list Name. convert_types: [ int ] counters_per_entry: type: bool diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/mac_address_table.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/mac_address_table.schema.yml similarity index 95% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/mac_address_table.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/mac_address_table.schema.yml index 4c24ea9f71f..a8e0957150e 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/mac_address_table.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/mac_address_table.schema.yml @@ -11,7 +11,7 @@ keys: keys: aging_time: type: int - description: Aging time in seconds + description: Aging time in seconds. convert_types: - str notification_host_flap: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/mac_security.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/mac_security.schema.yml similarity index 81% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/mac_security.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/mac_security.schema.yml index 5de86f6f923..f97cd77b2d3 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/mac_security.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/mac_security.schema.yml @@ -31,7 +31,7 @@ keys: keys: name: type: str - description: Profile-Name + description: Profile-Name. cipher: type: str valid_values: @@ -71,7 +71,7 @@ keys: - str min: 30 max: 100000 - description: Rekey period in seconds + description: Rekey period in seconds. sci: type: bool l2_protocols: @@ -95,3 +95,16 @@ keys: valid_values: - bypass - "bypass unauthorized" + traffic_unprotected: + type: dict + keys: + action: + type: str + required: true + description: Allow/drop the transmit/receive of unprotected traffic. + valid_values: + - "allow" + - "drop" + allow_active_sak: + type: bool + description: Allow transmit/receive of encrypted traffic using operational SAK and block otherwise. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/maintenance.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/maintenance.schema.yml similarity index 83% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/maintenance.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/maintenance.schema.yml index 9d882b276dc..9e7cf3de525 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/maintenance.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/maintenance.schema.yml @@ -14,15 +14,15 @@ keys: default_interface_profile: type: str description: | - Name of default Interface Profile + Name of default Interface Profile. default_bgp_profile: type: str description: | - Name of default BGP Profile + Name of default BGP Profile. default_unit_profile: type: str description: | - Name of default Unit Profile + Name of default Unit Profile. interface_profiles: type: list primary_key: name @@ -41,13 +41,13 @@ keys: convert_types: - str description: | - Load Interval in Seconds + Load Interval in Seconds. threshold: type: int convert_types: - str description: | - Threshold in kbps + Threshold in kbps. shutdown: type: dict keys: @@ -56,7 +56,7 @@ keys: convert_types: - str description: | - Max delay in seconds + Max delay in seconds. bgp_profiles: type: list primary_key: name @@ -67,13 +67,13 @@ keys: keys: name: type: str - description: BGP Profile Name + description: BGP Profile Name. initiator: type: dict keys: route_map_inout: type: str - description: Route Map + description: Route Map. unit_profiles: type: list primary_key: name @@ -84,7 +84,7 @@ keys: keys: name: type: str - description: Unit Profile Name + description: Unit Profile Name. on_boot: type: dict keys: @@ -95,7 +95,7 @@ keys: min: 300 max: 3600 description: | - On-boot in seconds + On-boot in seconds. units: type: list primary_key: name @@ -106,13 +106,13 @@ keys: keys: name: type: str - description: Unit Name + description: Unit Name. quiesce: type: bool profile: type: str description: | - Name of Unit Profile + Name of Unit Profile. groups: type: dict keys: @@ -121,10 +121,10 @@ keys: items: type: str description: | - Name of BGP Group + Name of BGP Group. interface_groups: type: list items: type: str description: | - Name of Interface Group + Name of Interface Group. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/management_accounts.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/management_accounts.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/management_accounts.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/management_accounts.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/management_api_gnmi.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/management_api_gnmi.schema.yml similarity index 86% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/management_api_gnmi.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/management_api_gnmi.schema.yml index 9246b4bbc95..030f890b734 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/management_api_gnmi.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/management_api_gnmi.schema.yml @@ -22,13 +22,13 @@ keys: keys: name: type: str - description: Transport name + description: Transport name. ssl_profile: type: str - description: SSL profile name + description: SSL profile name. vrf: type: str - description: VRF name is optional + description: VRF name is optional. convert_types: - int notification_timestamp: @@ -41,7 +41,7 @@ keys: an option to support overriding the timestamp field to the send-time is available from EOS 4.27.0F. ip_access_group: type: str - description: ACL name + description: ACL name. port: type: int description: | @@ -57,19 +57,19 @@ keys: keys: name: type: str - description: Transport name + description: Transport name. shutdown: type: bool - description: Operational status of the gRPC tunnel + description: Operational status of the gRPC tunnel. tunnel_ssl_profile: type: str - description: Tunnel SSL profile name + description: Tunnel SSL profile name. gnmi_ssl_profile: type: str - description: gNMI SSL profile name + description: gNMI SSL profile name. vrf: type: str - description: VRF name + description: VRF name. convert_types: - int destination: @@ -78,7 +78,7 @@ keys: address: type: str required: true - description: IP address or hostname + description: IP address or hostname. port: type: int min: 1 @@ -86,14 +86,14 @@ keys: required: true convert_types: - str - description: TCP Port + description: TCP Port. local_interface: type: dict keys: name: type: str required: true - description: Interface name + description: Interface name. port: type: int min: 1 @@ -101,13 +101,13 @@ keys: required: true convert_types: - str - description: TCP Port + description: TCP Port. target: type: dict keys: use_serial_number: type: bool - description: Use serial number as the Target ID + description: Use serial number as the Target ID. target_ids: type: list description: | @@ -130,12 +130,12 @@ keys: keys: name: type: str - description: VRF name + description: VRF name. convert_types: - int access_group: type: str - description: Standard IPv4 ACL name + description: Standard IPv4 ACL name. octa: type: dict deprecation: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/management_api_http.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/management_api_http.schema.yml similarity index 85% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/management_api_http.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/management_api_http.schema.yml index 72c476ecb5d..68dbfabd8e5 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/management_api_http.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/management_api_http.schema.yml @@ -14,11 +14,11 @@ keys: enable_https: type: bool https_ssl_profile: - description: SSL Profile Name + description: SSL Profile Name. type: str default_services: type: bool - description: "Enable default services: capi-doc and tapagg" + description: "Enable default services: capi-doc and tapagg." enable_vrfs: type: list primary_key: name @@ -28,22 +28,22 @@ keys: type: dict keys: name: - description: VRF Name + description: VRF Name. type: str convert_types: - int access_group: - description: Standard IPv4 ACL name + description: Standard IPv4 ACL name. type: str ipv6_access_group: - description: Standard IPv6 ACL name + description: Standard IPv6 ACL name. type: str protocol_https_certificate: type: dict keys: certificate: type: str - description: Name of certificate; private key must also be specified + description: Name of certificate; private key must also be specified. private_key: type: str - description: Name of private key; certificate must also be specified + description: Name of private key; certificate must also be specified. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/management_api_models.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/management_api_models.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/management_api_models.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/management_api_models.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/management_console.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/management_console.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/management_console.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/management_console.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/management_cvx.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/management_cvx.schema.yml similarity index 86% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/management_cvx.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/management_cvx.schema.yml index 939dc90a00e..9a6d241981b 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/management_cvx.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/management_cvx.schema.yml @@ -15,12 +15,12 @@ keys: type: list items: type: str - description: IP or hostname + description: IP or hostname. source_interface: type: str - description: Interface name + description: Interface name. vrf: type: str - description: VRF Name + description: VRF Name. convert_types: - int diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/management_defaults.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/management_defaults.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/management_defaults.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/management_defaults.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/management_interfaces.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/management_interfaces.schema.yml similarity index 82% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/management_interfaces.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/management_interfaces.schema.yml index b2b54137f17..375ff520882 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/management_interfaces.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/management_interfaces.schema.yml @@ -16,7 +16,7 @@ keys: keys: name: type: str - description: Management Interface Name + description: Management Interface Name. description: type: str shutdown: @@ -29,31 +29,31 @@ keys: type: int vrf: type: str - description: VRF Name + description: VRF Name. convert_types: - int ip_address: type: str - description: IPv4_address/Mask + description: IPv4_address/Mask. ipv6_enable: type: bool ipv6_address: type: str - description: IPv6_address/Mask + description: IPv6_address/Mask. type: type: str valid_values: ["oob", "inband"] default: "oob" - description: For documentation purposes only + description: For documentation purposes only. gateway: type: str - description: IPv4 address of default gateway in management VRF + description: IPv4 address of default gateway in management VRF. ipv6_gateway: type: str - description: IPv6 address of default gateway in management VRF + description: IPv6 address of default gateway in management VRF. mac_address: type: str - description: MAC address + description: MAC address. lldp: type: dict keys: @@ -65,7 +65,7 @@ keys: type: int convert_types: - str - description: ZTP vlan number + description: ZTP vlan number. eos_cli: type: str - description: Multiline EOS CLI rendered directly on the management interface in the final EOS configuration + description: Multiline EOS CLI rendered directly on the management interface in the final EOS configuration. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/management_security.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/management_security.schema.yml similarity index 57% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/management_security.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/management_security.schema.yml index d36c16c6047..b301fcbc7ce 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/management_security.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/management_security.schema.yml @@ -11,6 +11,26 @@ keys: keys: entropy_source: type: str + deprecation: + warning: true + remove_in_version: v5.0.0 + new_key: entropy_sources + entropy_sources: + type: dict + description: Source of entropy. + keys: + hardware: + type: bool + description: Use a hardware based source. + haveged: + type: bool + description: Use the HAVEGE algorithm. + cpu_jitter: + type: bool + description: Use the Jitter RNG algorithm of a CPU based source. + hardware_exclusive: + type: bool + description: Only use entropy from the hardware source. password: type: dict keys: @@ -90,7 +110,7 @@ keys: tls_versions: type: str description: | - List of allowed TLS versions as string + List of allowed TLS versions as string. Examples: - "1.0" - "1.0 1.1" @@ -100,14 +120,14 @@ keys: type: str description: | cipher_list syntax follows the openssl cipher strings format. - Colon (:) separated list of allowed ciphers as a string + Colon (:) separated list of allowed ciphers as a string. trust_certificate: type: dict keys: certificates: type: list description: | - List of trust certificate names + List of trust certificate names. Examples: - test1.crt - test2.crt @@ -134,7 +154,7 @@ keys: certificates: type: list description: | - List of chain certificate names + List of chain certificate names. Examples: - chain1.crt - chain2.crt @@ -161,3 +181,75 @@ keys: If specified, one CRL needs to be provided for every certificate in the chain, even if the revocation list in the CRL is empty. items: type: str + shared_secret_profiles: + type: list + primary_key: profile + items: + type: dict + keys: + profile: + type: str + secrets: + type: list + primary_key: name + items: + type: dict + keys: + name: + type: str + secret: + type: str + required: true + secret_type: + type: str + default: "7" + valid_values: [ "0", "7", "8a" ] + convert_types: + - int + receive_lifetime: + type: dict + required: true + keys: + infinite: + type: bool + start_date_time: + type: str + description: |- + Start date and time of lifetime of the secret. End date should be greater than start date. + Formats supported: + 1. mm/dd/yyyy hh:mm:ss + 2. yyyy-mm-dd hh:mm:ss + e.g 2024-12-20 10:00:00 + end_date_time: + type: str + description: |- + End date and time of lifetime of the secret. End date should be greater than start date. + Formats supported: + 1. mm/dd/yyyy hh:mm:ss + 2. yyyy-mm-dd hh:mm:ss + e.g 2024-12-20 10:00:00 + transmit_lifetime: + type: dict + required: true + keys: + infinite: + type: bool + start_date_time: + type: str + description: |- + Start date and time of lifetime of the secret. End date should be greater than start date. + Formats supported: + 1. mm/dd/yyyy hh:mm:ss + 2. yyyy-mm-dd hh:mm:ss + e.g 2024-12-20 10:00:00 + end_date_time: + type: str + description: |- + End date and time of lifetime of the secret. End date should be greater than start date. + Formats supported: + 1. mm/dd/yyyy hh:mm:ss + 2. yyyy-mm-dd hh:mm:ss + e.g 2024-12-20 10:00:00 + local_time: + type: bool + description: Configuring secret using the local timezone from system clock. Default is UTC. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/management_ssh.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/management_ssh.schema.yml similarity index 87% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/management_ssh.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/management_ssh.schema.yml index b6eee6199c6..84acbccdcc0 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/management_ssh.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/management_ssh.schema.yml @@ -17,10 +17,10 @@ keys: keys: name: type: str - description: Standard ACL Name + description: Standard ACL Name. vrf: type: str - description: VRF Name + description: VRF Name. convert_types: - int ipv6_access_groups: @@ -30,10 +30,10 @@ keys: keys: name: type: str - description: Standard ACL Name + description: Standard ACL Name. vrf: type: str - description: VRF Name + description: VRF Name. convert_types: - int idle_timeout: @@ -42,19 +42,19 @@ keys: - str min: 0 max: 86400 - description: Idle timeout in minutes + description: Idle timeout in minutes. cipher: - description: Cryptographic ciphers for SSH to use + description: Cryptographic ciphers for SSH to use. type: list items: type: str key_exchange: - description: Cryptographic key exchange methods for SSH to use + description: Cryptographic key exchange methods for SSH to use. type: list items: type: str mac: - description: Cryptographic MAC algorithms for SSH to use + description: Cryptographic MAC algorithms for SSH to use. type: list items: type: str @@ -76,7 +76,7 @@ keys: type: bool description: Enforce strict host key checking. enable: - description: Enable SSH daemon + description: Enable SSH daemon. type: bool connection: type: dict @@ -87,14 +87,14 @@ keys: - str min: 1 max: 100 - description: Maximum total number of SSH sessions to device + description: Maximum total number of SSH sessions to device. per_host: type: int convert_types: - str min: 1 max: 20 - description: Maximum number of SSH sessions to device from a single host + description: Maximum number of SSH sessions to device from a single host. vrfs: type: list primary_key: name @@ -105,15 +105,15 @@ keys: keys: name: type: str - description: VRF Name + description: VRF Name. convert_types: - int enable: - description: Enable SSH in VRF + description: Enable SSH in VRF. type: bool log_level: type: str - description: SSH daemon log level + description: SSH daemon log level. client_alive: type: dict keys: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/management_tech_support.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/management_tech_support.schema.yml similarity index 99% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/management_tech_support.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/management_tech_support.schema.yml index f1bf2449588..5aecba7c749 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/management_tech_support.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/management_tech_support.schema.yml @@ -19,7 +19,7 @@ keys: keys: command: type: str - description: Command to exclude from tech-support + description: Command to exclude from tech-support. type: type: str valid_values: @@ -34,4 +34,4 @@ keys: keys: command: type: str - description: Command to include in tech-support + description: Command to include in tech-support. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/match_list_input.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/match_list_input.schema.yml similarity index 93% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/match_list_input.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/match_list_input.schema.yml index 7f9b2a811eb..13b1cd51462 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/match_list_input.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/match_list_input.schema.yml @@ -52,7 +52,7 @@ keys: keys: name: type: str - description: Match-list Name + description: Match-list Name. sequence_numbers: type: list required: true @@ -64,10 +64,10 @@ keys: keys: sequence: type: int - description: Sequence ID + description: Sequence ID. convert_types: - str match_regex: type: str required: true - description: Regular Expression + description: Regular Expression. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/mcs_client.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/mcs_client.schema.yml similarity index 94% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/mcs_client.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/mcs_client.schema.yml index aa6fad086e2..6045880e05d 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/mcs_client.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/mcs_client.schema.yml @@ -22,4 +22,4 @@ keys: type: list items: type: str - description: IP or hostname + description: IP or hostname. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/metadata.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/metadata.schema.yml similarity index 73% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/metadata.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/metadata.schema.yml index 8521aeb5d21..11de6a17dca 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/metadata.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/metadata.schema.yml @@ -51,7 +51,7 @@ keys: required: true cv_pathfinder: type: dict - description: Metadata used for CV Pathfinder visualization on CloudVision + description: Metadata used for CV Pathfinder visualization on CloudVision. keys: role: type: str @@ -65,6 +65,9 @@ keys: type: str ssl_profile: type: str + address: + # Only used by pathfinders and only if 'cv_pathfinder_site' is set. + type: str pathfinders: type: list items: @@ -72,6 +75,7 @@ keys: keys: vtep_ip: type: str + required: true interfaces: type: list items: @@ -94,6 +98,7 @@ keys: keys: name: type: str + required: true carriers: type: list items: @@ -180,3 +185,60 @@ keys: type: str preference: type: str + internet_exit_policies: + type: list + items: + type: dict + keys: + name: + type: str + required: true + type: + type: str + required: true + city: + type: str + required: true + country: + type: str + required: true + upload_bandwidth: + type: int + download_bandwidth: + type: int + firewall: + type: bool + required: true + ips_control: + type: bool + required: true + acceptable_use_policy: + type: bool + required: true + vpn_credentials: + type: list + required: true + items: + type: dict + keys: + fqdn: + type: str + required: true + vpn_type: + type: str + required: true + pre_shared_key: + type: str + required: true + tunnels: + type: list + required: true + items: + type: dict + keys: + name: + type: str + required: true + preference: + type: str + required: true diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/mlag_configuration.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/mlag_configuration.schema.yml similarity index 74% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/mlag_configuration.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/mlag_configuration.schema.yml index 9712a4af325..06f222ed394 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/mlag_configuration.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/mlag_configuration.schema.yml @@ -14,57 +14,57 @@ keys: type: str heartbeat_interval: type: int - description: Heartbeat interval in milliseconds + description: Heartbeat interval in milliseconds. convert_types: - str local_interface: - description: Local Interface Name + description: Local Interface Name. type: str peer_address: type: str - description: IPv4 Address + description: IPv4 or IPv6 Address. peer_address_heartbeat: type: dict keys: peer_ip: type: str - description: IPv4 Address + description: IPv4 or IPv6 Address. vrf: - description: VRF Name + description: VRF Name. type: str convert_types: - int dual_primary_detection_delay: type: int - description: Delay in seconds + description: Delay in seconds. min: 0 max: 86400 convert_types: - str dual_primary_recovery_delay_mlag: type: int - description: Delay in seconds + description: Delay in seconds. min: 0 max: 86400 convert_types: - str dual_primary_recovery_delay_non_mlag: type: int - description: Delay in seconds + description: Delay in seconds. min: 0 max: 86400 convert_types: - str peer_link: - description: Port-Channel interface name + description: Port-Channel interface name. type: str reload_delay_mlag: type: str - description: Delay in seconds <0-86400> or 'infinity' + description: Delay in seconds <0-86400> or 'infinity'. convert_types: - int reload_delay_non_mlag: type: str - description: Delay in seconds <0-86400> or 'infinity' + description: Delay in seconds <0-86400> or 'infinity'. convert_types: - int diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/monitor_connectivity.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/monitor_connectivity.schema.yml similarity index 52% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/monitor_connectivity.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/monitor_connectivity.schema.yml index 45cd216710e..8f649eaad4c 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/monitor_connectivity.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/monitor_connectivity.schema.yml @@ -26,16 +26,25 @@ keys: type: str description: | Interface range(s) should be of same type, Ethernet, Loopback, Management etc. - Multiple interface ranges can be specified separated by "," + Multiple interface ranges can be specified separated by ",". local_interfaces: type: str + address_only: + type: bool + description: |- + PREVIEW: This key is in preview. + When address-only is configured, the source IP of the packet is set to the interface + IP but the packet may exit the device via a different interface. + When set to `false`, the probe uses the interface to exit the device. + Not supported yet in EOS. + default: true hosts: type: list items: type: dict keys: name: - description: Host Name + description: Host Name. type: str description: type: str @@ -43,6 +52,15 @@ keys: type: str local_interfaces: type: str + address_only: + type: bool + description: |- + PREVIEW: This key is in preview. + When address-only is configured, the source IP of the packet is set to the interface + IP but the packet may exit the device via a different interface. + When set to `false`, the probe uses the interface to exit the device. + Not supported yet in EOS. + default: true url: type: str vrfs: @@ -52,7 +70,7 @@ keys: type: dict keys: name: - description: VRF Name + description: VRF Name. type: str convert_types: - int @@ -69,13 +87,22 @@ keys: type: str local_interfaces: type: str + address_only: + type: bool + description: |- + PREVIEW: This key is in preview. + When address-only is configured, the source IP of the packet is set to the interface + IP but the packet may exit the device via a different interface. + When set to `false`, the probe uses the interface to exit the device. + Not supported yet in EOS. + default: true hosts: type: list items: type: dict keys: name: - description: Host name + description: Host name. type: str description: type: str @@ -83,5 +110,14 @@ keys: type: str local_interfaces: type: str + address_only: + type: bool + description: |- + PREVIEW: This key is in preview. + When address-only is configured, the source IP of the packet is set to the interface + IP but the packet may exit the device via a different interface. + When set to `false`, the probe uses the interface to exit the device. + Not supported yet in EOS. + default: true url: type: str diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/monitor_layer1.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/monitor_layer1.schema.yml similarity index 83% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/monitor_layer1.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/monitor_layer1.schema.yml index 8925256c514..4a1a2e8fee2 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/monitor_layer1.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/monitor_layer1.schema.yml @@ -13,7 +13,7 @@ keys: enabled: type: bool required: true - description: "Enable monitor layer1" + description: "Enable monitor layer1." logging_mac_fault: type: bool description: "Enable MAC fault logging." @@ -27,3 +27,6 @@ keys: communication: type: bool description: "Enable transceiver SMBus fail and reset logging." + enabled: + type: bool + description: Some platforms support only the `logging transceiver` command. `enabled` key configures this command. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/monitor_sessions.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/monitor_sessions.schema.yml similarity index 90% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/monitor_sessions.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/monitor_sessions.schema.yml index e87b6561d7f..87ef1283d46 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/monitor_sessions.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/monitor_sessions.schema.yml @@ -16,7 +16,7 @@ keys: name: type: str required: true - description: Session Name + description: Session Name. sources: type: list items: @@ -24,7 +24,7 @@ keys: keys: name: type: str - description: Interface name, range or comma separated list + description: Interface name, range or comma separated list. direction: type: str valid_values: ["rx", "tx", "both"] @@ -35,7 +35,7 @@ keys: type: str valid_values: ["ip", "ipv6", "mac"] name: - description: ACL Name + description: ACL Name. type: str priority: type: int @@ -45,12 +45,12 @@ keys: type: list items: type: str - description: "'cpu' or interface name, range or comma separated list" + description: "'cpu' or interface name, range or comma separated list." encapsulation_gre_metadata_tx: type: bool header_remove_size: type: int - description: Number of bytes to remove from header + description: Number of bytes to remove from header. convert_types: - str access_group: @@ -60,7 +60,7 @@ keys: type: str valid_values: ["ip", "ipv6", "mac"] name: - description: ACL Name + description: ACL Name. type: str rate_limit_per_ingress_chip: type: str @@ -89,6 +89,6 @@ keys: type: bool size: type: int - description: Size in bytes + description: Size in bytes. convert_types: - str diff --git a/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/monitor_telemetry_influx.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/monitor_telemetry_influx.schema.yml new file mode 100644 index 00000000000..c6ec59f739a --- /dev/null +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/monitor_telemetry_influx.schema.yml @@ -0,0 +1,78 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +# yaml-language-server: $schema=../../../../plugins/plugin_utils/schema/avd_meta_schema.json +# Line above is used by RedHat's YAML Schema vscode extension +# Use Ctrl + Space to get suggestions for every field. Autocomplete will pop up after typing 2 letters. +type: dict +keys: + monitor_telemetry_influx: + type: dict + keys: + vrf: + type: str + destinations: + type: list + primary_key: name + description: Configure telemetry output destinations. + items: + type: dict + keys: + name: + type: str + description: InfluxDB connection name. + database: + type: str + description: Set name of the database. + data_retention_policy: + type: str + url: + type: str + description: It only accepts http(s), udp and unix domain destination URL. + pattern: '(http(s)?|udp|unix)://.+' + username: + type: str + password: + type: str + password_type: + type: str + convert_types: + - int + valid_values: ["0", "7", "8a"] + default: "7" + source_group_standard_disabled: + type: bool + description: Disable standard set of telemetry. + source_sockets: + type: list + primary_key: name + items: + type: dict + keys: + name: + type: str + description: Label of the socket connection. + connection_limit: + type: int + min: 0 + max: 4294967295 + convert_types: + - str + url: + type: str + description: It only accepts http(s), udp and unix domain socket URL. + pattern: '(http(s)?|udp|unix)://.+' + tags: + type: list + primary_key: name + description: Extra tags added to the telemetry output. + items: + type: dict + keys: + name: + type: str + description: Key of the global tag pair. + value: + type: str + required: true + description: Value of the global tag pair. diff --git a/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/monitor_telemetry_postcard_policy.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/monitor_telemetry_postcard_policy.schema.yml new file mode 100644 index 00000000000..4f9f34781d2 --- /dev/null +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/monitor_telemetry_postcard_policy.schema.yml @@ -0,0 +1,144 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +# yaml-language-server: $schema=../../../../plugins/plugin_utils/schema/avd_meta_schema.json +# Line above is used by RedHat's YAML Schema vscode extension +# Use Ctrl + Space to get suggestions for every field. Autocomplete will pop up after typing 2 letters. +type: dict +keys: + monitor_telemetry_postcard_policy: + type: dict + keys: + disabled: + type: bool + default: true + description: Enable or disable the postcard telemetry feature. + ingress: + type: dict + keys: + collection: + type: dict + description: Collector configuration. + keys: + source: + type: str + description: Source IP address of GRE tunnel. + destination: + type: str + description: Destination IP address of GRE tunnel. + version: + type: int + description: Postcard version. + valid_values: [ 1, 2 ] + convert_types: + - str + sample: + type: dict + description: Sampling parameters. + keys: + rate: + type: int + description: Sampling rate. `rate` is preferred when both `rate` and `tcp_udp_checksum` are defined. + convert_types: + - str + valid_values: [ 16384, 32768, 65536 ] + tcp_udp_checksum: + type: dict + description: TCP/UDP parameters. + keys: + value: + type: int + description: TCP/UDP checksum or IP ID value. + min: 0 + max: 65535 + convert_types: + - str + mask: + type: str + description: 16 bit hexadecimal mask for TCP/UDP or IP ID with atmost 2 unset bits. + marker_vxlan: + type: dict + keys: + enabled: + type: bool + description: Enable vxlan marking using default bit 0. + header_word_zero_bit: + type: int + min: 1 + max: 31 + convert_types: + - str + profiles: + type: list + description: Postcard telemetry profiles. + primary_key: name + items: + type: dict + keys: + name: + type: str + description: Profile name. + ingress_sample_policy: + type: str + sample_policies: + type: list + primary_key: name + items: + type: dict + keys: + name: + type: str + match_rules: + type: list + primary_key: name + items: + type: dict + keys: + name: + type: str + type: + type: str + description: IP address version. + required: true + valid_values: [ ipv4, ipv6 ] + destination_prefix: + type: str + description: |- + IPv4 Network/Mask or IPv6 Network/Mask. Host part of prefix must be zero. + eg. 10.3.3.0/24 + source_prefix: + type: str + description: |- + IPv4 Network/Mask or IPv6 Network/Mask. Host part of prefix must be zero. + eg. 10.3.3.0/24 + protocols: + type: list + primary_key: protocol + items: + type: dict + keys: + protocol: + type: str + valid_values: [ tcp, udp ] + source_ports: + type: list + description: |- + A list of port numbers or port range or port name. Combination of port numbers or range and port name is not supported on EOS. The port numbers should be in range of 0-65535. + e.g. + [ "12", "14-20" ] + [ "www" ] + items: + type: str + convert_types: + - int + destination_ports: + type: list + description: |- + A list of port numbers or port range or port name. Combination of port numbers or range and port name is not supported on EOS. The port numbers should be in range of 0-65535. + e.g. + [ "12", "14-20", "80" ] + [ "https" ] + items: + type: str + convert_types: + - int diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/mpls.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/mpls.schema.yml similarity index 94% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/mpls.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/mpls.schema.yml index e6456315e81..848b476c39f 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/mpls.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/mpls.schema.yml @@ -21,5 +21,5 @@ keys: shutdown: type: bool transport_address_interface: - description: Interface Name + description: Interface Name. type: str diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/name_server.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/name_server.schema.yml similarity index 95% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/name_server.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/name_server.schema.yml index fae9f4631e4..7a8254bf45a 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/name_server.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/name_server.schema.yml @@ -17,7 +17,7 @@ keys: type: dict keys: vrf: - description: VRF Name + description: VRF Name. type: str convert_types: - int diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ntp.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ntp.schema.yml similarity index 87% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ntp.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ntp.schema.yml index 73de2b0dbf4..ab4751dd2dd 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ntp.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ntp.schema.yml @@ -14,10 +14,10 @@ keys: keys: name: type: str - description: Source interface + description: Source interface. vrf: type: str - description: VRF name + description: VRF name. convert_types: - int servers: @@ -27,7 +27,7 @@ keys: keys: name: type: str - description: IP or hostname e.g., 2.2.2.55, ie.pool.ntp.org + description: IP or hostname e.g., 2.2.2.55, 2001:db8::55, ie.pool.ntp.org. burst: type: bool iburst: @@ -40,21 +40,21 @@ keys: - str local_interface: type: str - description: Source interface + description: Source interface. maxpoll: type: int min: 3 max: 17 convert_types: - str - description: Value of maxpoll between 3 - 17 (Logarithmic) + description: Value of maxpoll between 3 - 17 (Logarithmic). minpoll: type: int min: 3 max: 17 convert_types: - str - description: Value of minpoll between 3 - 17 (Logarithmic) + description: Value of minpoll between 3 - 17 (Logarithmic). preferred: type: bool version: @@ -65,7 +65,7 @@ keys: - str vrf: type: str - description: VRF name + description: VRF name. convert_types: - int authenticate: @@ -86,13 +86,13 @@ keys: max: 65534 convert_types: - str - description: Key identifier + description: Key identifier. hash_algorithm: type: str valid_values: ["md5", "sha1"] key: type: str - description: Obfuscated key + description: Obfuscated key. key_type: type: str convert_types: @@ -100,6 +100,6 @@ keys: valid_values: ["0", "7", "8a"] trusted_keys: type: str - description: List of trusted-keys as string ex. 10-12,15 + description: List of trusted-keys as string ex. 10-12,15. convert_types: - int diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/patch_panel.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/patch_panel.schema.yml similarity index 57% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/patch_panel.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/patch_panel.schema.yml index 7fd0fa1f15a..0c7b0bb8539 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/patch_panel.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/patch_panel.schema.yml @@ -9,11 +9,44 @@ keys: patch_panel: type: dict keys: + connector: + type: dict + keys: + interface: + type: dict + keys: + patch: + type: dict + keys: + bgp_vpws_remote_failure_errdisable: + type: bool + recovery: + type: dict + keys: + review_delay: + type: dict + keys: + min: + type: int + required: true + min: 10 + max: 600 + convert_types: + - str + description: Minimum delay. + max: + type: int + required: true + min: 15 + max: 900 + convert_types: + - str + description: Maximum delay. patches: type: list primary_key: name convert_types: - - dict + - dict items: type: dict keys: @@ -25,22 +58,22 @@ keys: type: list primary_key: id convert_types: - - dict + - dict min_length: 2 max_length: 2 - description: Must have exactly two connectors to a patch of which at least one must be of type "interface" + description: Must have exactly two connectors to a patch of which at least one must be of type "interface". items: type: dict keys: id: type: str convert_types: - - int + - int type: type: str valid_values: - - interface - - pseudowire + - interface + - pseudowire required: true endpoint: type: str diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/peer_filters.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/peer_filters.schema.yml similarity index 90% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/peer_filters.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/peer_filters.schema.yml index 958a935bd88..0e207431df5 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/peer_filters.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/peer_filters.schema.yml @@ -16,7 +16,7 @@ keys: keys: name: type: str - description: Peer-filter Name + description: Peer-filter Name. sequence_numbers: type: list required: true @@ -28,12 +28,12 @@ keys: keys: sequence: type: int - description: Sequence ID + description: Sequence ID. convert_types: - str match: type: str required: true description: | - Match as string + Match as string. Example: "as-range 1-100 result accept" diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/platform.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/platform.schema.yml similarity index 97% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/platform.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/platform.schema.yml index 2b9b9aa5590..d48d0a659e1 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/platform.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/platform.schema.yml @@ -82,7 +82,7 @@ keys: convert_types: - "int" description: | - Drop Treshold. This value may also be fractions. + Drop Threshold. This value may also be fractions. Example: 7/8 or 3/4 or 1/2 unicast_queues: type: list @@ -129,11 +129,11 @@ keys: convert_types: - "int" description: | - Drop Treshold. This value may also be fractions. + Drop Threshold. This value may also be fractions. Example: 7/8 or 3/4 or 1/2 sand: type: dict - description: Most of the platform sand options are hardware dependent and optional + description: Most of the platform sand options are hardware dependent and optional. keys: qos_maps: type: list diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/poe.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/poe.schema.yml similarity index 97% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/poe.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/poe.schema.yml index 44e05041448..cfbe950fea2 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/poe.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/poe.schema.yml @@ -21,7 +21,7 @@ keys: description: PoE action for interface. By default in EOS, reboot action is set to power-off. interface_shutdown: type: dict - description: Set the global PoE power behavior for PoE ports when ports are admin down + description: Set the global PoE power behavior for PoE ports when ports are admin down. keys: action: type: str diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/policy_maps.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/policy_maps.schema.yml similarity index 80% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/policy_maps.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/policy_maps.schema.yml index c413135a59f..97cdb56ace4 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/policy_maps.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/policy_maps.schema.yml @@ -11,7 +11,7 @@ keys: keys: pbr: type: list - description: PBR Policy-Maps + description: PBR Policy-Maps. primary_key: name convert_types: - dict @@ -20,7 +20,7 @@ keys: keys: name: type: str - description: Policy-Map Name + description: Policy-Map Name. classes: type: list primary_key: name @@ -31,18 +31,18 @@ keys: keys: name: type: str - description: Class Name + description: Class Name. index: type: int convert_types: - str drop: - description: "'drop' and 'set' are mutually exclusive" + description: "'drop' and 'set' are mutually exclusive." type: bool set: description: | Set Nexthop - 'drop' and 'set' are mutually exclusive + 'drop' and 'set' are mutually exclusive. type: dict keys: nexthop: @@ -50,12 +50,12 @@ keys: keys: ip_address: type: str - description: IPv4 or IPv6 Address + description: IPv4 or IPv6 Address. recursive: type: bool qos: type: list - description: QOS Policy-Maps + description: QOS Policy-Maps. primary_key: name convert_types: - dict @@ -64,7 +64,7 @@ keys: keys: name: type: str - description: Policy-Map Name + description: Policy-Map Name. classes: type: list primary_key: name @@ -75,7 +75,7 @@ keys: keys: name: type: str - description: Class Name + description: Class Name. set: type: dict keys: @@ -168,3 +168,33 @@ keys: - "mbytes" - "packets" default: "bytes" + copp_system_policy: + type: dict + description: Control-plane policy configuration. + keys: + classes: + type: list + primary_key: name + items: + type: dict + keys: + name: + type: str + shape: + type: int + description: Maximum rate limit. + min: 0 + max: 10000000 + convert_types: + - str + bandwidth: + type: int + description: Minimum bandwidth. + min: 0 + max: 10000000 + convert_types: + - str + rate_unit: + type: str + description: The `rate_unit` must be defined for `shape` and `bandwidth`. + valid_values: [ 'pps', 'kbps' ] diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/port_channel_interfaces.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/port_channel_interfaces.schema.yml similarity index 87% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/port_channel_interfaces.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/port_channel_interfaces.schema.yml index 8a5c40bf0c8..78deeb0d0db 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/port_channel_interfaces.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/port_channel_interfaces.schema.yml @@ -39,7 +39,7 @@ keys: convert_types: - str description: | - "l2_mtu" should only be defined for platforms supporting the "l2 mtu" CLI + "l2_mtu" should only be defined for platforms supporting the "l2 mtu" CLI. l2_mru: type: int min: 68 @@ -47,15 +47,15 @@ keys: convert_types: - str description: | - "l2_mru" should only be defined for platforms supporting the "l2 mru" CLI + "l2_mru" should only be defined for platforms supporting the "l2 mru" CLI. vlans: type: str convert_types: - int description: | - List of switchport vlans as string - For a trunk port this would be a range like "1-200,300" - For an access port this would be a single vlan "123" + List of switchport vlans as string. + For a trunk port this would be a range like "1-200,300". + For an access port this would be a single vlan "123". snmp_trap_link_change: type: bool type: @@ -70,12 +70,12 @@ keys: Interface will not be listed in device documentation, unless "type" is set. encapsulation_dot1q_vlan: type: int - description: VLAN tag to configure on sub-interface + description: VLAN tag to configure on sub-interface. convert_types: - str vrf: type: str - description: VRF name + description: VRF name. convert_types: - int encapsulation_vlan: @@ -91,22 +91,22 @@ keys: type: int convert_types: - str - description: Client VLAN ID + description: Client VLAN ID. outer: type: int convert_types: - str - description: Client Outer VLAN ID + description: Client Outer VLAN ID. inner: type: int convert_types: - str - description: Client Inner VLAN ID + description: Client Inner VLAN ID. unmatched: type: bool network: type: dict - description: Network encapsulation are all optional, and skipped if using client unmatched + description: Network encapsulation are all optional, and skipped if using client unmatched. keys: dot1q: type: dict @@ -115,17 +115,17 @@ keys: type: int convert_types: - str - description: Network VLAN ID + description: Network VLAN ID. outer: type: int convert_types: - str - description: Network Outer VLAN ID + description: Network Outer VLAN ID. inner: type: int convert_types: - str - description: Network Inner VLAN ID + description: Network Inner VLAN ID. client: type: bool vlan_id: @@ -145,11 +145,11 @@ keys: type: int convert_types: - str - description: If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence + description: If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence. native_vlan_tag: type: bool default: false - description: If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence + description: If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence. link_tracking_groups: type: list primary_key: name @@ -158,7 +158,7 @@ keys: keys: name: type: str - description: Group name + description: Group name. direction: type: str valid_values: @@ -185,10 +185,10 @@ keys: type: int convert_types: - str - description: Vlan tag to configure on sub-interface + description: Vlan tag to configure on sub-interface. forwarding_profile: type: str - description: L2 protocol forwarding profile + description: L2 protocol forwarding profile. mtu: type: int min: 68 @@ -199,7 +199,7 @@ keys: type: int convert_types: - str - description: MLAG ID + description: MLAG ID. min: 1 max: 2000 trunk_groups: @@ -208,7 +208,7 @@ keys: type: str lacp_fallback_timeout: type: int - description: Timeout in seconds + description: Timeout in seconds. convert_types: - str default: 90 @@ -232,12 +232,12 @@ keys: type: int convert_types: - str - description: DSCP value + description: DSCP value. cos: type: int convert_types: - str - description: COS value + description: COS value. bfd: type: dict keys: @@ -245,12 +245,12 @@ keys: type: bool interval: type: int - description: Interval in milliseconds + description: Interval in milliseconds. convert_types: - str min_rx: type: int - description: Rate in milliseconds + description: Rate in milliseconds. convert_types: - str multiplier: @@ -277,14 +277,14 @@ keys: keys: input: type: str - description: Policy Based Routing Policy-map name + description: Policy Based Routing Policy-map name. qos: type: dict keys: input: type: str required: true - description: Quality of Service Policy-map name + description: Quality of Service Policy-map name. mpls: type: dict keys: @@ -301,7 +301,7 @@ keys: type: bool pvlan_mapping: type: str - description: List of vlans as string + description: List of vlans as string. convert_types: - int vlan_translations: @@ -313,12 +313,12 @@ keys: type: str convert_types: - int - description: List of vlans as string (only one vlan if direction is "both") + description: List of vlans as string (only one vlan if direction is "both"). to: type: int convert_types: - str - description: VLAN ID + description: VLAN ID. direction: type: str valid_values: @@ -332,8 +332,8 @@ keys: rate: type: str description: | - Rate in kbps, pps or percent - Supported options are platform dependent + Rate in kbps, pps or percent. + Supported options are platform dependent. Examples: - "5000 kbps" - "1000 pps" @@ -349,14 +349,14 @@ keys: convert_types: - int - float - description: Configure maximum storm-control level + description: Configure maximum storm-control level. unit: type: str default: percent valid_values: - percent - pps - description: Optional field and is hardware dependent + description: Optional field and is hardware dependent. broadcast: type: dict keys: @@ -365,14 +365,14 @@ keys: convert_types: - int - float - description: Configure maximum storm-control level + description: Configure maximum storm-control level. unit: type: str default: percent valid_values: - percent - pps - description: Optional field and is hardware dependent + description: Optional field and is hardware dependent. multicast: type: dict keys: @@ -381,14 +381,14 @@ keys: convert_types: - int - float - description: Configure maximum storm-control level + description: Configure maximum storm-control level. unit: type: str default: percent valid_values: - percent - pps - description: Optional field and is hardware dependent + description: Optional field and is hardware dependent. unknown_unicast: type: dict keys: @@ -397,19 +397,22 @@ keys: convert_types: - int - float - description: Configure maximum storm-control level + description: Configure maximum storm-control level. unit: type: str default: percent valid_values: - percent - pps - description: Optional field and is hardware dependent + description: Optional field and is hardware dependent. ip_proxy_arp: type: bool isis_enable: type: str - description: ISIS instance + description: ISIS instance. + isis_bfd: + type: bool + description: Enable BFD for ISIS. isis_passive: type: bool isis_metric: @@ -433,22 +436,22 @@ keys: - md5 isis_authentication_key: type: str - description: Type-7 encrypted password + description: Type-7 encrypted password. traffic_policy: type: dict keys: input: type: str - description: Ingress traffic policy + description: Ingress traffic policy. output: type: str - description: Egress traffic policy + description: Egress traffic policy. evpn_ethernet_segment: type: dict keys: identifier: type: str - description: EVPN Ethernet Segment Identifier (Type 1 format) + description: EVPN Ethernet Segment Identifier (Type 1 format). redundancy: type: str valid_values: @@ -468,10 +471,10 @@ keys: max: 65535 convert_types: - str - description: Preference_value is only used when "algorithm" is "preference" + description: Preference_value is only used when "algorithm" is "preference". dont_preempt: type: bool - description: Dont_preempt is only used when "algorithm" is "preference" + description: Dont_preempt is only used when "algorithm" is "preference". default: false hold_time: type: int @@ -498,12 +501,12 @@ keys: - str route_target: type: str - description: EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx + description: EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx. esi: type: str description: | - EVPN Ethernet Segment Identifier (Type 1 format) - If both "esi" and "evpn_ethernet_segment.identifier" are defined, the new variable takes precedence + EVPN Ethernet Segment Identifier (Type 1 format). + If both "esi" and "evpn_ethernet_segment.identifier" are defined, the new variable takes precedence. deprecation: warning: true new_key: evpn_ethernet_segment.identifier @@ -511,15 +514,15 @@ keys: rt: type: str description: | - EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx - If both "rt" and "evpn_ethernet_segment.route_target" are defined, the new variable takes precedence + EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx. + If both "rt" and "evpn_ethernet_segment.route_target" are defined, the new variable takes precedence. deprecation: warning: true new_key: evpn_ethernet_segment.route_target remove_in_version: "5.0.0" lacp_id: type: str - description: LACP ID with format xxxx.xxxx.xxxx + description: LACP ID with format xxxx.xxxx.xxxx. spanning_tree_bpdufilter: type: str convert_types: @@ -584,16 +587,22 @@ keys: type: str convert_types: - int - description: VLAN can be 'all' or list of vlans as string + description: VLAN can be 'all' or list of vlans as string. transport: type: str valid_values: - ipv4 - ipv6 - layer2 + mpass: + type: bool + description: |- + When MPASS is enabled on an MLAG port-channel, MLAG peers coordinate to function as a single PTP logical device. + Arista PTP enabled devices always place PTP messages on the same physical link within the port-channel. + Hence, MPASS is needed only on MLAG port-channels connected to non-Arista devices. ip_address: type: str - description: IPv4 address/mask + description: IPv4 address/mask. ip_verify_unicast_source_reachable_via: type: str valid_values: @@ -606,10 +615,10 @@ keys: type: bool ipv6_address: type: str - description: IPv6 address/mask + description: IPv6 address/mask. ipv6_address_link_local: type: str - description: Link local IPv6 address/mask + description: Link local IPv6 address/mask. ipv6_nd_ra_disabled: type: bool ipv6_nd_managed_config_flag: @@ -628,32 +637,32 @@ keys: type: str convert_types: - int - description: Infinite or lifetime in seconds + description: Infinite or lifetime in seconds. preferred_lifetime: type: str convert_types: - int - description: Infinite or lifetime in seconds + description: Infinite or lifetime in seconds. no_autoconfig_flag: type: bool access_group_in: type: str - description: Access list name + description: Access list name. access_group_out: type: str - description: Access list name + description: Access list name. ipv6_access_group_in: type: str - description: IPv6 access list name + description: IPv6 access list name. ipv6_access_group_out: type: str - description: IPv6 access list name + description: IPv6 access list name. mac_access_group_in: type: str - description: MAC access list name + description: MAC access list name. mac_access_group_out: type: str - description: MAC access list name + description: MAC access list name. pim: type: dict keys: @@ -694,7 +703,7 @@ keys: description: PIM hello interval in seconds. service_profile: type: str - description: QOS profile + description: QOS profile. ospf_network_point_to_point: type: bool ospf_area: @@ -713,7 +722,7 @@ keys: - message-digest ospf_authentication_key: type: str - description: Encrypted password + description: Encrypted password. ospf_message_digest_keys: type: list primary_key: id @@ -736,7 +745,7 @@ keys: - sha512 key: type: str - description: Encrypted password + description: Encrypted password. flow_tracker: type: dict keys: @@ -751,7 +760,7 @@ keys: keys: session_tracker: type: str - description: Name of session tracker + description: Name of session tracker. ip_igmp_host_proxy: type: dict keys: @@ -809,13 +818,13 @@ keys: description: IGMP version on IGMP host-proxy interface. peer: type: str - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. peer_interface: type: str - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. peer_type: type: str - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. sflow: type: dict keys: @@ -830,7 +839,7 @@ keys: type: bool validate_state: type: bool - description: Set to false to disable interface validation by the `eos_validate_state` role + description: Set to false to disable interface validation by the `eos_validate_state` role. eos_cli: type: str - description: Multiline EOS CLI rendered directly on the port-channel interface in the final EOS configuration + description: Multiline EOS CLI rendered directly on the port-channel interface in the final EOS configuration. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/prefix_lists.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/prefix_lists.schema.yml similarity index 89% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/prefix_lists.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/prefix_lists.schema.yml index 02657107238..52c6566a4ba 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/prefix_lists.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/prefix_lists.schema.yml @@ -17,7 +17,7 @@ keys: keys: name: type: str - description: Prefix-list Name + description: Prefix-list Name. sequence_numbers: type: list primary_key: sequence @@ -28,12 +28,12 @@ keys: keys: sequence: type: int - description: Sequence ID + description: Sequence ID. convert_types: - str action: type: str required: true description: | - Action as string + Action as string. Example: "permit 10.255.0.0/27 eq 32" diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/priority_flow_control.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/priority_flow_control.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/priority_flow_control.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/priority_flow_control.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/prompt.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/prompt.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/prompt.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/prompt.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ptp.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ptp.schema.yml similarity index 97% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ptp.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ptp.schema.yml index 1d43c798f71..7693d8936b8 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ptp.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/ptp.schema.yml @@ -24,12 +24,12 @@ keys: type: bool clock_identity: type: str - description: The clock-id in xx:xx:xx:xx:xx:xx format + description: The clock-id in xx:xx:xx:xx:xx:xx format. source: type: dict keys: ip: - description: Source IP + description: Source IP. type: str priority1: type: int diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/qos.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/qos.schema.yml similarity index 91% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/qos.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/qos.schema.yml index 8528b45d62c..2718c5d78d3 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/qos.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/qos.schema.yml @@ -40,11 +40,11 @@ keys: type: bool random_detect: type: dict - description: Global random-detect settings + description: Global random-detect settings. keys: ecn: type: dict - description: Global ECN Configuration + description: Global ECN Configuration. keys: allow_non_ect: type: dict @@ -56,4 +56,4 @@ keys: Check which command is required for your platform. chip_based: type: bool - description: Allow non-ect chip-based + description: Allow non-ect chip-based. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/qos_profiles.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/qos_profiles.schema.yml similarity index 90% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/qos_profiles.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/qos_profiles.schema.yml index c543b897091..60930de9c65 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/qos_profiles.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/qos_profiles.schema.yml @@ -16,7 +16,7 @@ keys: keys: name: type: str - description: Profile-Name + description: Profile-Name. trust: type: str valid_values: ["cos", "dscp", "disabled"] @@ -34,7 +34,7 @@ keys: rate: type: str description: | - Supported options are platform dependent + Supported options are platform dependent. Example: "< rate > kbps", "1-100 percent", "< rate > pps" service_policy: type: dict @@ -44,7 +44,7 @@ keys: keys: qos_input: type: str - description: Policy-map name + description: Policy-map name. tx_queues: type: list primary_key: id @@ -57,7 +57,7 @@ keys: type: int convert_types: - str - description: TX-Queue ID + description: TX-Queue ID. bandwidth_percent: type: int convert_types: @@ -75,21 +75,21 @@ keys: rate: type: str description: | - Supported options are platform dependent + Supported options are platform dependent. Example: "< rate > kbps", "1-100 percent", "< rate > pps" comment: type: str - description: Text comment added to queue + description: Text comment added to queue. random_detect: type: dict keys: ecn: - description: Explicit Congestion Notification + description: Explicit Congestion Notification. type: dict keys: count: type: bool - description: Enable counter for random-detect ECNs + description: Enable counter for random-detect ECNs. threshold: type: dict keys: @@ -106,30 +106,30 @@ keys: min: 1 convert_types: - str - description: Random-detect ECN minimum-threshold + description: Random-detect ECN minimum-threshold. max: type: int required: true min: 1 convert_types: - str - description: Random-detect ECN maximum-threshold + description: Random-detect ECN maximum-threshold. max_probability: type: int min: 1 max: 100 convert_types: - str - description: Random-detect ECN maximum mark probability + description: Random-detect ECN maximum mark probability. weight: type: int min: 0 max: 15 convert_types: - str - description: Random-detect ECN weight + description: Random-detect ECN weight. drop: - description: Set WRED parameters + description: Set WRED parameters. type: dict keys: threshold: @@ -145,21 +145,21 @@ keys: required: false min: 0 max: 2 - description: Specify Drop Precendence value + description: Specify Drop Precedence value. min: type: int required: true min: 1 convert_types: - str - description: WRED minimum-threshold + description: WRED minimum-threshold. max: type: int required: true min: 1 convert_types: - str - description: WRED maximum-threshold + description: WRED maximum-threshold. drop_probability: type: int required: true @@ -174,7 +174,7 @@ keys: max: 15 convert_types: - str - description: WRED weight + description: WRED weight. uc_tx_queues: type: list @@ -188,7 +188,7 @@ keys: type: int convert_types: - str - description: UC TX queue ID + description: UC TX queue ID. bandwidth_percent: type: int convert_types: @@ -206,21 +206,21 @@ keys: rate: type: str description: | - Supported options are platform dependent + Supported options are platform dependent. Example: "< rate > kbps", "1-100 percent", "< rate > pps" comment: type: str - description: Text comment added to queue + description: Text comment added to queue. random_detect: type: dict keys: ecn: - description: Explicit Congestion Notification + description: Explicit Congestion Notification. type: dict keys: count: type: bool - description: Enable counter for random-detect ECNs + description: Enable counter for random-detect ECNs. threshold: type: dict keys: @@ -228,37 +228,37 @@ keys: required: true type: str valid_values: ["segments", "bytes", "kbytes", "mbytes", "milliseconds"] - description: Unit to be used for the threshold values + description: Unit to be used for the threshold values. min: type: int required: true min: 1 convert_types: - str - description: Random-detect ECN minimum-threshold + description: Random-detect ECN minimum-threshold. max: type: int required: true min: 1 convert_types: - str - description: Random-detect ECN maximum-threshold + description: Random-detect ECN maximum-threshold. max_probability: type: int min: 1 max: 100 convert_types: - str - description: Random-detect ECN maximum mark probability + description: Random-detect ECN maximum mark probability. weight: type: int min: 0 max: 15 convert_types: - str - description: Random-detect ECN weight + description: Random-detect ECN weight. drop: - description: Set WRED parameters + description: Set WRED parameters. type: dict keys: threshold: @@ -274,21 +274,21 @@ keys: required: false min: 0 max: 2 - description: Specify Drop Precendence value + description: Specify Drop Precedence value. min: type: int required: true min: 1 convert_types: - str - description: WRED minimum-threshold + description: WRED minimum-threshold. max: type: int required: true min: 1 convert_types: - str - description: WRED maximum-threshold + description: WRED maximum-threshold. drop_probability: type: int required: true @@ -303,7 +303,7 @@ keys: max: 15 convert_types: - str - description: WRED weight + description: WRED weight. mc_tx_queues: type: list @@ -317,7 +317,7 @@ keys: type: int convert_types: - str - description: MC TX queue ID + description: MC TX queue ID. bandwidth_percent: type: int convert_types: @@ -335,7 +335,7 @@ keys: rate: type: str description: | - Supported options are platform dependent + Supported options are platform dependent. Example: "< rate > kbps", "1-100 percent", "< rate > pps" comment: type: str @@ -344,7 +344,7 @@ keys: priority_flow_control: type: dict description: | - Priority Flow Control settings + Priority Flow Control settings. keys: enabled: type: bool @@ -382,7 +382,7 @@ keys: description: | Timeout in seconds after which port should be errdisabled or should start dropping on congested priorities. - This should be decimal with up to 2 decimal point + This should be decimal with up to 2 decimal point. Example: 0.01 or 60 polling_interval: type: str @@ -418,7 +418,7 @@ keys: type: list primary_key: priority description: | - Set the drop/no_drop on each queue + Set the drop/no_drop on each queue. items: type: dict keys: @@ -430,9 +430,9 @@ keys: convert_types: - str description: | - Priority queue number (COS value) + Priority queue number (COS value). no_drop: type: bool required: true description: | - Enable Priority Flow Control frames on this queue + Enable Priority Flow Control frames on this queue. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/queue_monitor_length.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/queue_monitor_length.schema.yml similarity index 91% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/queue_monitor_length.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/queue_monitor_length.schema.yml index 8756f9e9f72..6fa0c657f0a 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/queue_monitor_length.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/queue_monitor_length.schema.yml @@ -33,10 +33,10 @@ keys: type: int convert_types: - str - description: "Logging interval in seconds" + description: "Logging interval in seconds." notifying: type: bool - description: Should only be used for platforms supporting the "queue-monitor length notifying" CLI + description: Should only be used for platforms supporting the "queue-monitor length notifying" CLI. cpu: type: dict keys: @@ -54,4 +54,4 @@ keys: - str tx_latency: type: bool - description: "Enable tx-latency mode" + description: "Enable tx-latency mode." diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/queue_monitor_streaming.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/queue_monitor_streaming.schema.yml similarity index 91% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/queue_monitor_streaming.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/queue_monitor_streaming.schema.yml index 1fe04f4a7ab..9ab5b624e88 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/queue_monitor_streaming.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/queue_monitor_streaming.schema.yml @@ -13,10 +13,10 @@ keys: type: bool ip_access_group: type: str - description: Name of IP ACL + description: Name of IP ACL. ipv6_access_group: type: str - description: Name of IPv6 ACL + description: Name of IPv6 ACL. max_connections: type: int convert_types: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/radius_server.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/radius_server.schema.yml similarity index 89% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/radius_server.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/radius_server.schema.yml index fcfffb365ea..a2fa3fc897c 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/radius_server.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/radius_server.schema.yml @@ -26,10 +26,10 @@ keys: max: 65535 convert_types: - str - description: TCP Port + description: TCP Port. tls_ssl_profile: type: str - description: Name of TLS profile + description: Name of TLS profile. hosts: type: list primary_key: host @@ -38,7 +38,7 @@ keys: keys: host: type: str - description: Host IP address or name + description: Host IP address or name. vrf: type: str convert_types: @@ -57,4 +57,4 @@ keys: - str key: type: str - description: Encrypted key + description: Encrypted key. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/radius_servers.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/radius_servers.schema.yml similarity index 89% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/radius_servers.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/radius_servers.schema.yml index 02bc7a111ac..c36166737a1 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/radius_servers.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/radius_servers.schema.yml @@ -17,11 +17,11 @@ keys: keys: host: type: str - description: Host IP address or name + description: Host IP address or name. vrf: type: str convert_types: - int key: type: str - description: Encrypted key + description: Encrypted key. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/redundancy.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/redundancy.schema.yml similarity index 92% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/redundancy.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/redundancy.schema.yml index 83866604ed8..d37674bdb5a 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/redundancy.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/redundancy.schema.yml @@ -11,4 +11,4 @@ keys: keys: protocol: type: str - description: Redundancy Protocol + description: Redundancy Protocol. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/roles.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/roles.schema.yml similarity index 88% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/roles.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/roles.schema.yml index 8bcb7639c5d..6b12cb40b72 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/roles.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/roles.schema.yml @@ -13,7 +13,7 @@ keys: keys: name: type: str - description: Role name + description: Role name. sequence_numbers: type: list items: @@ -23,14 +23,14 @@ keys: type: int convert_types: - str - description: Sequence number + description: Sequence number. action: type: str valid_values: ["permit", "deny"] mode: type: str description: | - "config", "config-all", "exec" or mode key as string + "config", "config-all", "exec" or mode key as string. command: type: str - description: Command as string + description: Command as string. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/route_maps.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/route_maps.schema.yml similarity index 84% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/route_maps.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/route_maps.schema.yml index 6555d7d83a2..87b0411ebdf 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/route_maps.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/route_maps.schema.yml @@ -16,7 +16,7 @@ keys: keys: name: type: str - description: Route-map Name + description: Route-map Name. sequence_numbers: type: list required: true @@ -28,7 +28,7 @@ keys: keys: sequence: type: int - description: Sequence ID + description: Sequence ID. convert_types: - str type: @@ -39,23 +39,23 @@ keys: type: str match: type: list - description: List of "match" statements + description: List of "match" statements. items: type: str description: | - Match as string + Match as string. Example: "ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY" set: type: list - description: List of "set" statements + description: List of "set" statements. items: type: str description: | - Set as string + Set as string. Example: "origin incomplete" sub_route_map: type: str - description: Name of Sub-Route-map + description: Name of Sub-Route-map. continue: type: dict keys: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_adaptive_virtual_topology.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_adaptive_virtual_topology.schema.yml similarity index 96% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_adaptive_virtual_topology.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_adaptive_virtual_topology.schema.yml index 35d7c818c12..a40f4f188bb 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_adaptive_virtual_topology.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_adaptive_virtual_topology.schema.yml @@ -24,6 +24,7 @@ keys: name: type: str required: true + pattern: '^[A-Za-z0-9_.:{}\[\]-]+$' id: type: int convert_types: @@ -38,6 +39,7 @@ keys: name: type: str required: true + pattern: '^[A-Za-z0-9_.:{}\[\]-]+$' id: type: int convert_types: @@ -52,6 +54,7 @@ keys: name: type: str required: true + pattern: '^[A-Za-z0-9_.:{}\[\]-]+$' id: type: int convert_types: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_bfd.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_bfd.schema.yml similarity index 79% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_bfd.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_bfd.schema.yml index e76a96ceb3f..64a759dabe2 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_bfd.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_bfd.schema.yml @@ -11,13 +11,13 @@ keys: keys: interval: type: int - description: Rate in milliseconds + description: Rate in milliseconds. local_address: type: str - description: Configure BFD local IP/IPv6 address + description: Configure BFD local IP/IPv6 address. min_rx: type: int - description: Rate in milliseconds + description: Rate in milliseconds. multiplier: type: int min: 3 @@ -27,10 +27,10 @@ keys: keys: interval: type: int - description: Rate in milliseconds + description: Rate in milliseconds. min_rx: type: int - description: Rate in milliseconds + description: Rate in milliseconds. multiplier: type: int min: 3 @@ -54,7 +54,7 @@ keys: keys: name: type: str - description: Interface Name + description: Interface Name. protocols: type: dict keys: @@ -64,20 +64,20 @@ keys: type: bool initiator_interval: type: int - description: Rate in milliseconds + description: Rate in milliseconds. initiator_multiplier: type: int min: 3 max: 50 initiator_measurement_round_trip: type: bool - description: Enable round-trip delay measurement + description: Enable round-trip delay measurement. reflector: type: dict keys: min_rx: type: int - description: Rate in milliseconds + description: Rate in milliseconds. local_discriminator: type: str - description: IPv4 address or 32 bit integer + description: IPv4 address or 32 bit integer. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_bgp.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_bgp.schema.yml similarity index 65% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_bgp.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_bgp.schema.yml index 7ed68c5fc99..07e9e5f3a32 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_bgp.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_bgp.schema.yml @@ -26,7 +26,7 @@ keys: - asplain router_id: type: str - description: In IP address format A.B.C.D + description: In IP address format A.B.C.D. distance: type: dict keys: @@ -62,14 +62,14 @@ keys: - str min: 1 max: 3600 - description: Number of seconds + description: Number of seconds. stalepath_time: type: int convert_types: - str min: 1 max: 3600 - description: Number of seconds + description: Number of seconds. graceful_restart_helper: type: dict keys: @@ -120,10 +120,10 @@ keys: This will eliminate any temporary black holes due to a BGP speaker advertising reachability to a prefix that may not yet be installed into the forwarding plane. bgp_cluster_id: type: str - description: IP Address A.B.C.D + description: IP Address A.B.C.D. bgp_defaults: type: list - description: BGP command as string + description: BGP command as string. items: type: str bgp: @@ -150,26 +150,29 @@ keys: keys: d_path: type: bool + redistribute_internal: + type: bool + description: Allow redistribution of iBGP routes into an Interior Gateway Protocol (IGP). EOS default is true. listen_ranges: type: list description: | - Improved "listen_ranges" data model to support multiple listen ranges and additional filter capabilities + Improved "listen_ranges" data model to support multiple listen ranges and additional filter capabilities. items: type: dict keys: prefix: type: str - description: IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I" + description: IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I". peer_id_include_router_id: type: bool - description: Include router ID as part of peer filter + description: Include router ID as part of peer filter. peer_group: type: str - description: Peer group name + description: Peer group name. peer_filter: type: str description: | - Peer-filter name + Peer-filter name. note: `peer_filter` or `remote_as` is required but mutually exclusive. If both are defined, `peer_filter` takes precedence remote_as: @@ -189,10 +192,10 @@ keys: keys: name: type: str - description: Peer-group name + description: Peer-group name. type: type: str - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. remote_as: type: str description: |- @@ -213,17 +216,17 @@ keys: type: bool as_path: type: dict - description: BGP AS-PATH options + description: BGP AS-PATH options. keys: remote_as_replace_out: type: bool - description: Replace AS number with local AS number + description: Replace AS number with local AS number. prepend_own_disabled: type: bool - description: Disable prepending own AS number to AS path + description: Disable prepending own AS number to AS path. remove_private_as: type: dict - description: Remove private AS numbers in outbound AS path + description: Remove private AS numbers in outbound AS path. keys: enabled: type: bool @@ -241,7 +244,7 @@ keys: peer_filter: type: str description: | - Peer-filter name + Peer-filter name. note: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with the new `listen_ranges` key above to avoid conflicts. deprecation: @@ -252,7 +255,7 @@ keys: type: bool update_source: type: str - description: IP address or interface name + description: IP address or interface name. route_reflector_client: type: bool bfd: @@ -290,7 +293,7 @@ keys: type: int min: 1 max: 255 - description: Time-to-live in range of hops + description: Time-to-live in range of hops. convert_types: - str next_hop_self: @@ -308,13 +311,13 @@ keys: type: bool route_map: type: str - description: Route-map name + description: Route-map name. send_community: type: str - description: "'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'" + description: "'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'." maximum_routes: type: int - description: Maximum number of routes (0 means unlimited) + description: Maximum number of routes (0 means unlimited). min: 0 max: 4294967294 convert_types: @@ -323,11 +326,57 @@ keys: type: str description: | Maximum number of routes after which a warning is issued (0 means never warn) or - Percentage of maximum number of routes at which to warn ("<1-100> percent") + Percentage of maximum number of routes at which to warn ("<1-100> percent"). convert_types: - int maximum_routes_warning_only: type: bool + missing_policy: + type: dict + description: Missing policy configuration for all address-families. + keys: + direction_in: + description: Missing policy inbound direction. + type: dict + keys: + action: + description: Missing policy action. + type: str + required: true + valid_values: + - deny + - permit + - deny-in-out + include_community_list: + type: bool + description: Include community-list references in missing policy decision. + include_prefix_list: + type: bool + description: Include prefix-list references in missing policy decision. + include_sub_route_map: + type: bool + description: Include sub-route-map references in missing policy decision. + direction_out: + description: Missing policy outbound direction. + type: dict + keys: + action: + description: Missing policy action. + type: str + required: true + valid_values: + - deny + - permit + - deny-in-out + include_community_list: + type: bool + description: Include community-list references in missing policy decision. + include_prefix_list: + type: bool + description: Include prefix-list references in missing policy decision. + include_sub_route_map: + type: bool + description: Include sub-route-map references in missing policy decision. link_bandwidth: type: dict keys: @@ -335,7 +384,7 @@ keys: type: bool default: type: str - description: nn.nn(K|M|G) link speed in bits/second + description: nn.nn(K|M|G) link speed in bits/second. allowas_in: type: dict keys: @@ -343,7 +392,7 @@ keys: type: bool times: type: int - description: Number of local ASNs allowed in a BGP update + description: Number of local ASNs allowed in a BGP update. convert_types: - str min: 1 @@ -356,7 +405,7 @@ keys: - str timers: type: str - description: BGP Keepalive and Hold Timer values in seconds as string "<0-3600> <0-3600>" + description: BGP Keepalive and Hold Timer values in seconds as string "<0-3600> <0-3600>". rib_in_pre_policy_retain: type: dict keys: @@ -366,14 +415,14 @@ keys: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. bgp_listen_range_prefix: type: str description: | - IP prefix range + IP prefix range. note: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with the new `listen_ranges` key above to avoid conflicts. deprecation: @@ -382,6 +431,22 @@ keys: new_key: listen_ranges session_tracker: type: str + shared_secret: + type: dict + keys: + profile: + type: str + required: true + description: Name of profile defined under `management_security`. + hash_algorithm: + type: str + required: true + description: |- + Note: Algorithm hmac-sha-256 requires EOS version 4.31.1F and above. + valid_values: + - "aes-128-cmac-96" + - "hmac-sha-256" + - "hmac-sha1-96" ttl_maximum_hops: type: int convert_types: @@ -417,17 +482,17 @@ keys: - int as_path: type: dict - description: BGP AS-PATH options + description: BGP AS-PATH options. keys: remote_as_replace_out: type: bool - description: Replace AS number with local AS number + description: Replace AS number with local AS number. prepend_own_disabled: type: bool - description: Disable prepending own AS number to AS path + description: Disable prepending own AS number to AS path. peer: type: str - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. description: type: str route_reflector_client: @@ -440,7 +505,7 @@ keys: type: bool update_source: type: str - description: Source Interface + description: Source Interface. bfd: type: bool description: Enable BFD. @@ -480,13 +545,13 @@ keys: - str timers: type: str - description: BGP Keepalive and Hold Timer values in seconds as string "<0-3600> <0-3600>" + description: BGP Keepalive and Hold Timer values in seconds as string "<0-3600> <0-3600>". route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. default_originate: type: dict keys: @@ -498,10 +563,10 @@ keys: type: str send_community: type: str - description: "'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'" + description: "'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'." maximum_routes: type: int - description: Maximum number of routes (0 means unlimited) + description: Maximum number of routes (0 means unlimited). min: 0 max: 4294967294 convert_types: @@ -510,11 +575,57 @@ keys: type: str description: | Maximum number of routes after which a warning is issued (0 means never warn) or - Percentage of maximum number of routes at which to warn ("<1-100> percent") + Percentage of maximum number of routes at which to warn ("<1-100> percent"). convert_types: - int maximum_routes_warning_only: type: bool + missing_policy: + type: dict + description: Missing policy configuration for all address-families. + keys: + direction_in: + description: Missing policy inbound direction. + type: dict + keys: + action: + description: Missing policy action. + type: str + required: true + valid_values: + - deny + - permit + - deny-in-out + include_community_list: + type: bool + description: Include community-list references in missing policy decision. + include_prefix_list: + type: bool + description: Include prefix-list references in missing policy decision. + include_sub_route_map: + type: bool + description: Include sub-route-map references in missing policy decision. + direction_out: + description: Missing policy outbound direction. + type: dict + keys: + action: + description: Missing policy action. + type: str + required: true + valid_values: + - deny + - permit + - deny-in-out + include_community_list: + type: bool + description: Include community-list references in missing policy decision. + include_prefix_list: + type: bool + description: Include prefix-list references in missing policy decision. + include_sub_route_map: + type: bool + description: Include sub-route-map references in missing policy decision. allowas_in: type: dict keys: @@ -526,12 +637,12 @@ keys: - str min: 1 max: 10 - description: Number of local ASNs allowed in a BGP update + description: Number of local ASNs allowed in a BGP update. ebgp_multihop: type: int min: 1 max: 255 - description: Time-to-live in range of hops + description: Time-to-live in range of hops. convert_types: - str next_hop_self: @@ -543,7 +654,7 @@ keys: type: bool default: type: str - description: nn.nn(K|M|G) link speed in bits/second + description: nn.nn(K|M|G) link speed in bits/second. rib_in_pre_policy_retain: type: dict keys: @@ -553,7 +664,7 @@ keys: type: bool remove_private_as: type: dict - description: Remove private AS numbers in outbound AS path + description: Remove private AS numbers in outbound AS path. keys: enabled: type: bool @@ -570,6 +681,22 @@ keys: type: bool session_tracker: type: str + shared_secret: + type: dict + keys: + profile: + type: str + required: true + description: Name of profile defined under `management_security`. + hash_algorithm: + type: str + required: true + description: |- + Note: Algorithm hmac-sha-256 requires EOS version 4.31.1F and above. + valid_values: + - "aes-128-cmac-96" + - "hmac-sha-256" + - "hmac-sha1-96" ttl_maximum_hops: type: int convert_types: @@ -587,7 +714,7 @@ keys: keys: name: type: str - description: Interface name + description: Interface name. remote_as: type: str convert_types: @@ -597,7 +724,7 @@ keys: For asdot notation in YAML inputs, the value must be put in quotes, to prevent it from being interpreted as a float number. peer: type: str - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. peer_group: type: str default: Peer-group name @@ -605,7 +732,7 @@ keys: type: str peer_filter: type: str - description: Peer-filter name + description: Peer-filter name. aggregate_addresses: type: list primary_key: prefix @@ -616,28 +743,37 @@ keys: keys: prefix: type: str - description: IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I" + description: IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I". advertise_only: type: bool as_set: type: bool advertise_map: type: str - description: Route-map name + description: Route-map name. + deprecation: + removed: true + warning: true + remove_in_version: v4.9.0 supress_map: type: str - description: Route-map name + description: Route-map name. + deprecation: + removed: true + warning: true + remove_in_version: v4.9.0 summary_only: type: bool attribute_map: type: str - description: Route-map name + description: Route-map name. match_map: type: str - description: Route-map name + description: Route-map name. redistribute_routes: type: list primary_key: source_protocol + allow_duplicate_primary_key: True convert_types: - dict - list @@ -646,10 +782,39 @@ keys: keys: source_protocol: type: str + valid_values: + - "attached-host" + - "bgp" + - "connected" + - "dynamic" + - "isis" + - "ospf" + - "ospfv3" + - "rip" + - "static" + - "user" route_map: type: str + rcf: + type: str + description: |- + RCF function name with parenthesis. + Example: MyFunction(myarg). + `route_map` and `rcf` are mutually exclusive. `route_map` takes precedence. + Only applicable if `source_protocol` is one of `connected`, `static`, `isis`, `user`, `dynamic`. include_leaked: type: bool + ospf_route_type: + type: str + valid_values: + - "external" + - "internal" + - "nssa-external" + - "nssa-external 1" + - "nssa-external 2" + description: | + Routes learned by the OSPF protocol. + The `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'. vlan_aware_bundles: type: list primary_key: name @@ -660,15 +825,15 @@ keys: keys: name: type: str - description: VLAN aware bundle name + description: VLAN aware bundle name. tenant: type: str - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. description: type: str - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. rd: - description: Route distinguisher + description: Route distinguisher. type: str rd_evpn_domain: type: dict @@ -680,7 +845,7 @@ keys: - "all" rd: type: str - description: Route distinguisher + description: Route distinguisher. route_targets: type: dict keys: @@ -742,12 +907,12 @@ keys: type: str vlan: type: str - description: VLAN range as string. Example "100-200,300" + description: VLAN range as string. Example "100-200,300". convert_types: - int eos_cli: type: str - description: Multiline EOS CLI rendered directly on the Router BGP, VLAN-aware-bundle definition in the final EOS configuration + description: Multiline EOS CLI rendered directly on the Router BGP, VLAN-aware-bundle definition in the final EOS configuration. vlans: type: list primary_key: id @@ -762,9 +927,9 @@ keys: - str tenant: type: str - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. rd: - description: Route distinguisher + description: Route distinguisher. type: str rd_evpn_domain: type: dict @@ -776,10 +941,10 @@ keys: - "all" rd: type: str - description: Route distinguisher + description: Route distinguisher. eos_cli: type: str - description: Multiline EOS CLI rendered directly on the Router BGP, VLAN definition in the final EOS configuration + description: Multiline EOS CLI rendered directly on the Router BGP, VLAN definition in the final EOS configuration. route_targets: type: dict keys: @@ -849,16 +1014,16 @@ keys: keys: name: type: str - description: VPWS instance name + description: VPWS instance name. rd: - description: Route distinguisher + description: Route distinguisher. type: str route_targets: type: dict keys: import_export: type: str - description: Route Target + description: Route Target. mpls_control_word: type: bool label_flow: @@ -877,17 +1042,17 @@ keys: keys: name: type: str - description: Pseudowire name + description: Pseudowire name. id_local: type: int convert_types: - str - description: Must match id_remote on other pe + description: Must match id_remote on other pe. id_remote: type: int convert_types: - str - description: Must match id_local on other pe + description: Must match id_local on other pe. address_family_evpn: type: dict keys: @@ -902,7 +1067,7 @@ keys: - "vxlan" - "mpls" next_hop_self_source_interface: - description: Source interface name + description: Source interface name. type: str next_hop_self_received_evpn_routes: type: dict @@ -940,6 +1105,28 @@ keys: type: str activate: type: bool + rcf_in: + type: str + description: |- + Inbound RCF function name with parenthesis. + Example: MyFunction(myarg). + rcf_out: + type: str + description: |- + Outbound RCF function name with parenthesis. + Example: MyFunction(myarg). + default_route: + type: dict + keys: + enabled: + type: bool + rcf: + type: str + description: |- + RCF function name with parenthesis. + Example: MyFunction(myarg). + route_map: + type: str peer_groups: type: list primary_key: name @@ -950,15 +1137,37 @@ keys: keys: name: type: str - description: Peer-group name + description: Peer-group name. activate: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. + rcf_in: + type: str + description: |- + Inbound RCF function name with parenthesis. + Example: MyFunction(myarg). + rcf_out: + type: str + description: |- + Outbound RCF function name with parenthesis. + Example: MyFunction(myarg). + default_route: + type: dict + keys: + enabled: + type: bool + rcf: + type: str + description: |- + RCF function name with parenthesis. + Example: MyFunction(myarg). + route_map: + type: str domain_remote: type: bool encapsulation: @@ -982,14 +1191,14 @@ keys: type: bool ecmp_limit: type: int - description: Amount of ECMP paths to send + description: Amount of ECMP paths to send. convert_types: - str min: 2 max: 64 limit: type: int - description: Amount of paths to send + description: Amount of paths to send. convert_types: - str min: 2 @@ -1001,7 +1210,7 @@ keys: type: bool window: type: int - description: Time (in seconds) to detect a MAC duplication issue + description: Time (in seconds) to detect a MAC duplication issue. min: 0 max: 4294967295 convert_types: @@ -1012,14 +1221,14 @@ keys: max: 4294967295 convert_types: - str - description: Minimum number of MAC moves that indicate a MAC Duplication issue + description: Minimum number of MAC moves that indicate a MAC Duplication issue. expiry_timeout: type: int min: 0 max: 4294967295 convert_types: - str - description: Time (in seconds) to purge a MAC duplication issue + description: Time (in seconds) to purge a MAC duplication issue. next_hop: type: dict keys: @@ -1034,10 +1243,60 @@ keys: - "discard" import_ethernet_segment_ip_mass_withdraw: type: bool + import_overlay_index_gateway: + type: bool export_ethernet_segment_ip_mass_withdraw: type: bool next_hop_unchanged: type: bool + bgp_additional_paths: + type: dict + description: BGP additional-paths commands. + keys: + receive: + type: bool + description: Receive multiple paths. + send: + type: dict + description: Send multiple paths. + keys: + any: + type: bool + description: Any eligible path. + backup: + type: bool + description: Best path and installed backup path. + ecmp: + type: bool + description: All paths in best path ECMP group. + ecmp_limit: + type: int + description: Amount of ECMP paths to send. + convert_types: + - str + min: 2 + max: 64 + limit: + type: int + description: Amount of paths to send. + convert_types: + - str + min: 2 + max: 64 + layer_2_fec_in_place_update: + type: dict + description: BGP layer-2 in-place FEC operation. + keys: + enabled: + type: bool + required: true + timeout: + type: int + description: In-place FEC update tracking timeout in seconds. + convert_types: + - str + min: 0 + max: 300 address_family_rtc: type: dict keys: @@ -1051,7 +1310,7 @@ keys: keys: name: type: str - description: Peer-group name + description: Peer-group name. activate: type: bool default_route_target: @@ -1073,11 +1332,17 @@ keys: type: dict keys: prefix: - description: IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I" + description: IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I". type: str route_map: - description: Route-map name + description: Route-map name. type: str + bgp: + type: dict + keys: + redistribute_internal: + type: bool + description: Allow redistribution of iBGP routes into an Interior Gateway Protocol (IGP). EOS default is true. peer_groups: type: list primary_key: name @@ -1088,22 +1353,32 @@ keys: keys: name: type: str - description: Peer-group name + description: Peer-group name. activate: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. + rcf_in: + type: str + description: |- + Inbound RCF function name with parenthesis. + Example: MyFunction(myarg). + rcf_out: + type: str + description: |- + Outbound RCF function name with parenthesis. + Example: MyFunction(myarg). default_originate: type: dict keys: always: type: bool route_map: - description: Route-map name + description: Route-map name. type: str next_hop: type: dict @@ -1125,10 +1400,10 @@ keys: remove_in_version: 5.0.0 prefix_list_in: type: str - description: Inbound prefix-list name + description: Inbound prefix-list name. prefix_list_out: type: str - description: Outbound prefix-list name + description: Outbound prefix-list name. neighbors: type: list primary_key: ip_address @@ -1143,16 +1418,26 @@ keys: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. + rcf_in: + type: str + description: |- + Inbound RCF function name with parenthesis. + Example: MyFunction(myarg). + rcf_out: + type: str + description: |- + Outbound RCF function name with parenthesis. + Example: MyFunction(myarg). prefix_list_in: type: str - description: Inbound prefix-list name + description: Inbound prefix-list name. prefix_list_out: type: str - description: Prefix-list name + description: Prefix-list name. default_originate: type: dict keys: @@ -1160,6 +1445,49 @@ keys: type: bool route_map: type: str + redistribute_routes: + type: list + primary_key: source_protocol + allow_duplicate_primary_key: True + items: + type: dict + keys: + source_protocol: + type: str + valid_values: + - "attached-host" + - "bgp" + - "connected" + - "dynamic" + - "isis" + - "ospf" + - "ospfv3" + - "rip" + - "static" + - "user" + route_map: + type: str + include_leaked: + type: bool + description: Only applicable if `source_protocol` is one of `connected`, `static`, `isis`, `ospf`, `ospfv3`. + rcf: + type: str + description: |- + RCF function name with parenthesis. + Example: MyFunction(myarg). + `route_map` and `rcf` are mutually exclusive. `route_map` takes precedence. + Only applicable if `source_protocol` is one of `connected`, `static`, `isis`, `user`, `dynamic`. + ospf_route_type: + type: str + valid_values: + - "external" + - "internal" + - "nssa-external" + - "nssa-external 1" + - "nssa-external 2" + description: | + Routes learned by the OSPF protocol. + The `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'. address_family_ipv4_multicast: type: dict keys: @@ -1173,15 +1501,15 @@ keys: keys: name: type: str - description: Peer-group name + description: Peer-group name. activate: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. neighbors: type: list primary_key: ip_address @@ -1196,13 +1524,14 @@ keys: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. redistribute_routes: type: list primary_key: source_protocol + allow_duplicate_primary_key: true convert_types: - dict items: @@ -1210,8 +1539,37 @@ keys: keys: source_protocol: type: str + # TODO AVD5.0: Add valid values and ensure we cover all options. + # valid_values: + # - "attached-host" + # - "connected" + # - "isis" + # - "ospf" + # - "ospfv3" + # - "static" route_map: type: str + include_leaked: + type: bool + description: Only applicable if `source_protocol` is `isis`. + rcf: + type: str + description: |- + RCF function name with parenthesis. + Example: MyFunction(myarg). + `route_map` and `rcf` are mutually exclusive. `route_map` takes precedence. + Only applicable if `source_protocol` is `isis`. + ospf_route_type: + type: str + valid_values: + - "external" + - "internal" + - "nssa-external" + - "nssa-external 1" + - "nssa-external 2" + description: | + Routes learned by the OSPF protocol. + The `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'. address_family_ipv4_sr_te: type: dict keys: @@ -1227,10 +1585,10 @@ keys: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. peer_groups: type: list primary_key: name @@ -1239,15 +1597,15 @@ keys: keys: name: type: str - description: Peer-group name + description: Peer-group name. activate: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. address_family_ipv6: type: dict keys: @@ -1260,11 +1618,17 @@ keys: type: dict keys: prefix: - description: IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I" + description: IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I". type: str route_map: - description: Route-map name + description: Route-map name. type: str + bgp: + type: dict + keys: + redistribute_internal: + type: bool + description: Allow redistribution of iBGP routes into an Interior Gateway Protocol (IGP). EOS default is true. peer_groups: type: list primary_key: name @@ -1275,21 +1639,31 @@ keys: keys: name: type: str - description: Peer-group name + description: Peer-group name. activate: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. + rcf_in: + type: str + description: |- + Inbound RCF function name with parenthesis. + Example: MyFunction(myarg). + rcf_out: + type: str + description: |- + Outbound RCF function name with parenthesis. + Example: MyFunction(myarg). prefix_list_in: type: str - description: Inbound prefix-list name + description: Inbound prefix-list name. prefix_list_out: type: str - description: Outbound prefix-list name + description: Outbound prefix-list name. neighbors: type: list primary_key: ip_address @@ -1304,19 +1678,30 @@ keys: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. + rcf_in: + type: str + description: |- + Inbound RCF function name with parenthesis. + Example: MyFunction(myarg). + rcf_out: + type: str + description: |- + Outbound RCF function name with parenthesis. + Example: MyFunction(myarg). prefix_list_in: type: str - description: Inbound prefix-list name + description: Inbound prefix-list name. prefix_list_out: type: str - description: Outbound prefix-list name + description: Outbound prefix-list name. redistribute_routes: type: list primary_key: source_protocol + allow_duplicate_primary_key: True convert_types: - dict items: @@ -1324,10 +1709,39 @@ keys: keys: source_protocol: type: str + # TODO AVD5.0: Add valid values and ensure we cover all options. + #valid_values: + # - "attached-host" + # - "bgp" + # - "connected" + # - "dhcp" + # - "dynamic" + # - "isis" + # - "ospfv3" + # - "static" + # - "user" route_map: type: str include_leaked: type: bool + rcf: + type: str + description: |- + RCF function name with parenthesis. + Example: MyFunction(myarg). + `route_map` and `rcf` are mutually exclusive. `route_map` takes precedence. + Only used if `source_protocol` is one of `connected`, `static`, `isis`, `user`, `dynamic`. + ospf_route_type: + type: str + valid_values: + - "external" + - "internal" + - "nssa-external" + - "nssa-external 1" + - "nssa-external 2" + description: | + Routes learned by the OSPF protocol. + The `ospf_route_type` is valid for source_protocols 'ospfv3'. address_family_ipv6_multicast: type: dict keys: @@ -1368,10 +1782,10 @@ keys: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. peer_groups: type: list primary_key: name @@ -1382,7 +1796,7 @@ keys: keys: name: type: str - description: Peer-group name + description: Peer-group name. activate: type: bool networks: @@ -1395,9 +1809,49 @@ keys: keys: prefix: type: str - description: IPv6 prefix "A:B:C:D:E:F:G:H/I" + description: IPv6 prefix "A:B:C:D:E:F:G:H/I". route_map: type: str + redistribute_routes: + type: list + primary_key: source_protocol + allow_duplicate_primary_key: true + convert_types: + - dict + items: + type: dict + keys: + source_protocol: + type: str + valid_values: + - "connected" + - "isis" + - "ospf" + - "ospfv3" + - "static" + include_leaked: + type: bool + description: Only applicable if `source_protocol` is `isis`. + route_map: + type: str + rcf: + type: str + description: |- + RCF function name with parenthesis. + Example: MyFunction(myarg). + `route_map` and `rcf` are mutually exclusive. `route_map` takes precedence. + Only applicable if `source_protocol` is `isis`. + ospf_route_type: + type: str + valid_values: + - "external" + - "internal" + - "nssa-external" + - "nssa-external 1" + - "nssa-external 2" + description: | + Routes learned by the OSPF protocol. + The `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'. address_family_ipv6_sr_te: type: dict keys: @@ -1413,10 +1867,10 @@ keys: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. peer_groups: type: list primary_key: name @@ -1425,15 +1879,15 @@ keys: keys: name: type: str - description: Peer-group name + description: Peer-group name. activate: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. address_family_link_state: type: dict keys: @@ -1463,7 +1917,7 @@ keys: keys: name: type: str - description: Peer-group name + description: Peer-group name. activate: type: bool missing_policy: @@ -1561,7 +2015,7 @@ keys: keys: name: type: str - description: Peer-group name + description: Peer-group name. activate: type: bool address_family_flow_spec_ipv6: @@ -1607,7 +2061,7 @@ keys: keys: name: type: str - description: Peer-group name + description: Peer-group name. activate: type: bool address_family_path_selection: @@ -1632,14 +2086,14 @@ keys: type: bool ecmp_limit: type: int - description: Amount of ECMP paths to send + description: Amount of ECMP paths to send. convert_types: - str min: 2 max: 64 limit: type: int - description: Amount of paths to send + description: Amount of paths to send. convert_types: - str min: 2 @@ -1676,14 +2130,14 @@ keys: type: bool ecmp_limit: type: int - description: Amount of ECMP paths to send + description: Amount of ECMP paths to send. convert_types: - str min: 2 max: 64 limit: type: int - description: Amount of paths to send + description: Amount of paths to send. convert_types: - str min: 2 @@ -1696,7 +2150,7 @@ keys: keys: name: type: str - description: Peer-group name + description: Peer-group name. activate: type: bool additional_paths: @@ -1719,14 +2173,14 @@ keys: type: bool ecmp_limit: type: int - description: Amount of ECMP paths to send + description: Amount of ECMP paths to send. convert_types: - str min: 2 max: 64 limit: type: int - description: Amount of paths to send + description: Amount of paths to send. convert_types: - str min: 2 @@ -1746,15 +2200,37 @@ keys: keys: name: type: str - description: Peer-group name + description: Peer-group name. activate: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. + rcf_in: + type: str + description: |- + Inbound RCF function name with parenthesis. + Example: MyFunction(myarg). + rcf_out: + type: str + description: |- + Outbound RCF function name with parenthesis. + Example: MyFunction(myarg). + default_route: + type: dict + keys: + enabled: + type: bool + rcf: + type: str + description: |- + RCF function name with parenthesis. + Example: MyFunction(myarg). + route_map: + type: str route: type: dict keys: @@ -1776,10 +2252,32 @@ keys: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. + rcf_in: + type: str + description: |- + Inbound RCF function name with parenthesis. + Example: MyFunction(myarg). + rcf_out: + type: str + description: |- + Outbound RCF function name with parenthesis. + Example: MyFunction(myarg). + default_route: + type: dict + keys: + enabled: + type: bool + rcf: + type: str + description: |- + RCF function name with parenthesis. + Example: MyFunction(myarg). + route_map: + type: str neighbor_default_encapsulation_mpls_next_hop_self: type: dict keys: @@ -1800,15 +2298,37 @@ keys: keys: name: type: str - description: Peer-group name + description: Peer-group name. activate: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. + rcf_in: + type: str + description: |- + Inbound RCF function name with parenthesis. + Example: MyFunction(myarg). + rcf_out: + type: str + description: |- + Outbound RCF function name with parenthesis. + Example: MyFunction(myarg). + default_route: + type: dict + keys: + enabled: + type: bool + rcf: + type: str + description: |- + RCF function name with parenthesis. + Example: MyFunction(myarg). + route_map: + type: str route: type: dict keys: @@ -1830,10 +2350,32 @@ keys: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. + rcf_in: + type: str + description: |- + Inbound RCF function name with parenthesis. + Example: MyFunction(myarg). + rcf_out: + type: str + description: |- + Outbound RCF function name with parenthesis. + Example: MyFunction(myarg). + default_route: + type: dict + keys: + enabled: + type: bool + rcf: + type: str + description: |- + RCF function name with parenthesis. + Example: MyFunction(myarg). + route_map: + type: str neighbor_default_encapsulation_mpls_next_hop_self: type: dict keys: @@ -1849,24 +2391,52 @@ keys: keys: name: type: str - description: VRF name + description: VRF name. convert_types: - int + bgp: + type: dict + keys: + redistribute_internal: + type: bool + description: Allow redistribution of iBGP routes into an Interior Gateway Protocol (IGP). EOS default is true. rd: type: str - description: Route distinguisher + description: Route distinguisher. evpn_multicast: type: bool evpn_multicast_address_family: type: dict - description: Enable per-AF EVPN multicast settings + description: Enable per-AF EVPN multicast settings. keys: ipv4: type: dict keys: transit: type: bool - description: Enable EVPN multicast transit mode + description: Enable EVPN multicast transit mode. + default_route_exports: + type: list + primary_key: address_family + description: Enable default-originate per VRF/address-family. + items: + type: dict + keys: + address_family: + type: str + valid_values: + - "evpn" + - "vpn-ipv4" + - "vpn-ipv6" + always: + type: bool + route_map: + type: str + rcf: + type: str + description: |- + RCF function name with parenthesis. + Example: MyFunction(myarg). route_targets: type: dict keys: @@ -1887,6 +2457,19 @@ keys: type: str route_map: type: str + description: Only applicable if `address_family` is one of `evpn`, `vpn-ipv4` or `vpn-ipv6`. + rcf: + type: str + description: |- + RCF function name with parenthesis. + Example: MyFunction(myarg). + Only applicable if `address_family` is one of `evpn`, `vpn-ipv4` or `vpn-ipv6`. + vpn_route_filter_rcf: + type: str + description: |- + RCF function name with parenthesis for filtering VPN routes. Also requires `rcf` to be set. + Example: MyFunction(myarg). + Only applicable if `address_family` is one of `vpn-ipv4` or `vpn-ipv6`. export: type: list primary_key: address_family @@ -1904,12 +2487,25 @@ keys: type: str route_map: type: str + description: Only applicable if `address_family` is one of `evpn`, `vpn-ipv4` or `vpn-ipv6`. + rcf: + type: str + description: |- + RCF function name with parenthesis. + Example: MyFunction(myarg). + Only applicable if `address_family` is one of `evpn`, `vpn-ipv4` or `vpn-ipv6`. + vpn_route_filter_rcf: + type: str + description: |- + RCF function name with parenthesis for filtering VPN routes. Also requires `rcf` to be set. + Example: MyFunction(myarg). + Only applicable if `address_family` is one of `vpn-ipv4` or `vpn-ipv6`. router_id: - description: in IP address format A.B.C.D + description: in IP address format A.B.C.D. type: str timers: type: str - description: BGP Keepalive and Hold Timer values in seconds as string "<0-3600> <0-3600>" + description: BGP Keepalive and Hold Timer values in seconds as string "<0-3600> <0-3600>". networks: type: list primary_key: prefix @@ -1920,7 +2516,7 @@ keys: keys: prefix: type: str - description: IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I" + description: IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I". route_map: type: str updates: @@ -1938,25 +2534,25 @@ keys: listen_ranges: type: list description: | - Improved "listen_ranges" data model to support multiple listen ranges and additional filter capabilities + Improved "listen_ranges" data model to support multiple listen ranges and additional filter capabilities. items: type: dict keys: prefix: type: str - description: IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I" + description: IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I". peer_id_include_router_id: type: bool - description: Include router ID as part of peer filter + description: Include router ID as part of peer filter. peer_group: type: str - description: Peer-group name + description: Peer-group name. peer_filter: type: str description: | - Peer-filter name + Peer-filter name. note: `peer_filter`` or `remote_as` is required but mutually exclusive. - If both are defined, peer_filter takes precedence + If both are defined, peer_filter takes precedence. remote_as: type: str description: |- @@ -1976,7 +2572,7 @@ keys: type: str peer_group: type: str - description: Peer-group name + description: Peer-group name. remote_as: type: str description: |- @@ -1990,7 +2586,7 @@ keys: type: bool remove_private_as: type: dict - description: Remove private AS numbers in outbound AS path + description: Remove private AS numbers in outbound AS path. keys: enabled: type: bool @@ -2020,14 +2616,14 @@ keys: - int as_path: type: dict - description: BGP AS-PATH options + description: BGP AS-PATH options. keys: remote_as_replace_out: type: bool - description: Replace AS number with local AS number + description: Replace AS number with local AS number. prepend_own_disabled: type: bool - description: Disable prepending own AS number to AS path + description: Disable prepending own AS number to AS path. description: type: str route_reflector_client: @@ -2036,7 +2632,7 @@ keys: type: int min: 1 max: 255 - description: Time-to-live in range of hops + description: Time-to-live in range of hops. next_hop_self: type: bool shutdown: @@ -2074,7 +2670,7 @@ keys: required: true timers: type: str - description: BGP Keepalive and Hold Timer values in seconds as string "<0-3600> <0-3600>" + description: BGP Keepalive and Hold Timer values in seconds as string "<0-3600> <0-3600>". rib_in_pre_policy_retain: type: dict keys: @@ -2084,7 +2680,7 @@ keys: type: bool send_community: type: str - description: "'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'" + description: "'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'." maximum_routes: type: int convert_types: @@ -2095,7 +2691,7 @@ keys: - int description: | Maximum number of routes after which a warning is issued (0 means never warn) or - Percentage of maximum number of routes at which to warn ("<1-100> percent") + Percentage of maximum number of routes at which to warn ("<1-100> percent"). maximum_routes_warning_only: type: bool allowas_in: @@ -2109,7 +2705,7 @@ keys: - str min: 1 max: 10 - description: Number of local ASNs allowed in a BGP update + description: Number of local ASNs allowed in a BGP update. default_originate: type: dict keys: @@ -2123,20 +2719,20 @@ keys: type: str route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. prefix_list_in: type: str - description: Inbound prefix-list name + description: Inbound prefix-list name. deprecation: warning: true new_key: "router_bgp.vrfs[].address_family_ipv4.neighbors[].prefix_list_in or router_bgp.vrfs[].address_family_ipv6.neighbors[].prefix_list_in" remove_in_version: 5.0.0 prefix_list_out: type: str - description: Outbound prefix-list name + description: Outbound prefix-list name. deprecation: warning: true new_key: "router_bgp.vrfs[].address_family_ipv4.neighbors[].prefix_list_out or router_bgp.vrfs[].address_family_ipv6.neighbors[].prefix_list_out" @@ -2151,7 +2747,7 @@ keys: keys: name: type: str - description: Interface name + description: Interface name. remote_as: type: str description: |- @@ -2161,15 +2757,16 @@ keys: - int peer_group: type: str - description: Peer-group name + description: Peer-group name. peer_filter: type: str - description: Peer-filter name + description: Peer-filter name. description: type: str redistribute_routes: type: list primary_key: source_protocol + allow_duplicate_primary_key: true convert_types: - dict - list @@ -2178,10 +2775,40 @@ keys: keys: source_protocol: type: str + # TODO AVD5.0: Add valid values and ensure we cover all options. + # valid_values: + # - "attached-host" + # - "bgp" + # - "connected" + # - "dynamic" + # - "isis" + # - "ospf" + # - "ospfv3" + # - "rip" + # - "static" + # - "user" route_map: type: str include_leaked: type: bool + rcf: + type: str + description: |- + RCF function name with parenthesis. + Example: MyFunction(myarg). + `route_map` and `rcf` are mutually exclusive. `route_map` takes precedence. + Only applicable if `source_protocol` is one of `connected`, `dynamic`, `isis`, `static` and `user`. + ospf_route_type: + type: str + valid_values: + - "external" + - "internal" + - "nssa-external" + - "nssa-external 1" + - "nssa-external 2" + description: | + Routes learned by the OSPF protocol. + The `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'. aggregate_addresses: type: list primary_key: prefix @@ -2192,17 +2819,25 @@ keys: keys: prefix: type: str - description: IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I" + description: IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I". advertise_only: type: bool as_set: type: bool advertise_map: type: str - description: Route-map name + description: Route-map name. + deprecation: + removed: true + warning: true + remove_in_version: v4.9.0 supress_map: type: str - description: Route-map name + description: Route-map name. + deprecation: + removed: true + warning: true + remove_in_version: v4.9.0 summary_only: type: bool attribute_map: @@ -2250,18 +2885,21 @@ keys: type: bool ecmp_limit: type: int - description: Amount of ECMP paths to send + description: Amount of ECMP paths to send. convert_types: - str min: 2 max: 64 limit: type: int - description: Amount of paths to send + description: Amount of paths to send. convert_types: - str min: 2 max: 64 + redistribute_internal: + type: bool + description: Allow redistribution of iBGP routes into an Interior Gateway Protocol (IGP). EOS default is true. neighbors: type: list primary_key: ip_address @@ -2276,16 +2914,26 @@ keys: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. + rcf_in: + type: str + description: |- + Inbound RCF function name with parenthesis. + Example: MyFunction(myarg). + rcf_out: + type: str + description: |- + Outbound RCF function name with parenthesis. + Example: MyFunction(myarg). prefix_list_in: type: str - description: Inbound prefix-list name + description: Inbound prefix-list name. prefix_list_out: type: str - description: Outbound prefix-list name + description: Outbound prefix-list name. next_hop: type: dict keys: @@ -2307,9 +2955,53 @@ keys: keys: prefix: type: str - description: IPv4 prefix "A.B.C.D/E" + description: IPv4 prefix "A.B.C.D/E". route_map: type: str + redistribute_routes: + type: list + primary_key: source_protocol + allow_duplicate_primary_key: true + convert_types: + - dict + items: + type: dict + keys: + source_protocol: + type: str + valid_values: + - "attached-host" + - "bgp" + - "connected" + - "dynamic" + - "isis" + - "ospf" + - "ospfv3" + - "rip" + - "static" + - "user" + route_map: + type: str + include_leaked: + type: bool + rcf: + type: str + description: |- + RCF function name with parenthesis. + Example: MyFunction(myarg). + `route_map` and `rcf` are mutually exclusive. `route_map` takes precedence. + Only applicable if `source_protocol` is one of `connected`, `dynamic`, `isis`, `static` and `user`. + ospf_route_type: + type: str + valid_values: + - "external" + - "internal" + - "nssa-external" + - "nssa-external 1" + - "nssa-external 2" + description: | + Routes learned by the OSPF protocol. + The `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'. address_family_ipv6: type: dict keys: @@ -2351,18 +3043,21 @@ keys: type: bool ecmp_limit: type: int - description: Amount of ECMP paths to send + description: Amount of ECMP paths to send. convert_types: - str min: 2 max: 64 limit: type: int - description: Amount of paths to send + description: Amount of paths to send. convert_types: - str min: 2 max: 64 + redistribute_internal: + type: bool + description: Allow redistribution of iBGP routes into an Interior Gateway Protocol (IGP). EOS default is true. neighbors: type: list primary_key: ip_address @@ -2377,16 +3072,26 @@ keys: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. + rcf_in: + type: str + description: |- + Inbound RCF function name with parenthesis. + Example: MyFunction(myarg). + rcf_out: + type: str + description: |- + Outbound RCF function name with parenthesis. + Example: MyFunction(myarg). prefix_list_in: type: str - description: Inbound prefix-list name + description: Inbound prefix-list name. prefix_list_out: type: str - description: Outbound prefix-list name + description: Outbound prefix-list name. networks: type: list primary_key: prefix @@ -2397,9 +3102,52 @@ keys: keys: prefix: type: str - description: IPv6 prefix "A:B:C:D:E:F:G:H/I" + description: IPv6 prefix "A:B:C:D:E:F:G:H/I". route_map: type: str + redistribute_routes: + type: list + primary_key: source_protocol + allow_duplicate_primary_key: true + convert_types: + - dict + items: + type: dict + keys: + source_protocol: + type: str + valid_values: + - "attached-host" + - "bgp" + - "connected" + - "dhcp" + - "dynamic" + - "isis" + - "ospfv3" + - "static" + - "user" + route_map: + type: str + include_leaked: + type: bool + rcf: + type: str + description: |- + RCF function name with parenthesis. + Example: MyFunction(myarg). + `route_map` and `rcf` are mutually exclusive. `route_map` takes precedence. + Only applicable if `source_protocol` is one of `connected`, `dynamic`, `isis`, `static` and `user`. + ospf_route_type: + type: str + valid_values: + - "external" + - "internal" + - "nssa-external" + - "nssa-external 1" + - "nssa-external 2" + description: | + Routes learned by the OSPF protocol. + The `ospf_route_type` is valid for source_protocols 'ospfv3'. address_family_ipv4_multicast: type: dict keys: @@ -2440,10 +3188,10 @@ keys: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. networks: type: list primary_key: prefix @@ -2454,9 +3202,50 @@ keys: keys: prefix: type: str - description: IPv6 prefix "A.B.C.D/E" + description: IPv6 prefix "A.B.C.D/E". route_map: type: str + redistribute_routes: + type: list + primary_key: source_protocol + allow_duplicate_primary_key: true + convert_types: + - dict + items: + type: dict + keys: + source_protocol: + type: str + valid_values: + - "attached-host" + - "connected" + - "isis" + - "ospf" + - "ospfv3" + - "static" + route_map: + type: str + include_leaked: + type: bool + description: Only applicable if `source_protocol` is `isis`. + rcf: + type: str + description: |- + RCF function name with parenthesis. + Example: MyFunction(myarg). + `route_map` and `rcf` are mutually exclusive. `route_map` takes precedence. + Only applicable if `source_protocol` is `isis`. + ospf_route_type: + type: str + valid_values: + - "external" + - "internal" + - "nssa-external" + - "nssa-external 1" + - "nssa-external 2" + description: | + Routes learned by the OSPF protocol. + The `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'. address_family_ipv6_multicast: type: dict keys: @@ -2497,10 +3286,10 @@ keys: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. networks: type: list primary_key: prefix @@ -2511,9 +3300,49 @@ keys: keys: prefix: type: str - description: IPv6 prefix "A:B:C:D:E:F:G:H/I" + description: IPv6 prefix "A:B:C:D:E:F:G:H/I". route_map: type: str + redistribute_routes: + type: list + primary_key: source_protocol + allow_duplicate_primary_key: true + convert_types: + - dict + items: + type: dict + keys: + source_protocol: + type: str + valid_values: + - "connected" + - "isis" + - "ospf" + - "ospfv3" + - "static" + route_map: + type: str + include_leaked: + type: bool + description: Only applicable if `source_protocol` is `isis`. + rcf: + type: str + description: |- + RCF function name with parenthesis. + Example: MyFunction(myarg). + `route_map` and `rcf` are mutually exclusive. `route_map` takes precedence. + Only applicable if `source_protocol` is `isis`. + ospf_route_type: + type: str + valid_values: + - "external" + - "internal" + - "nssa-external" + - "nssa-external 1" + - "nssa-external 2" + description: | + Routes learned by the OSPF protocol. + The `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'. address_family_flow_spec_ipv4: type: dict keys: @@ -2630,10 +3459,10 @@ keys: type: bool route_map_in: type: str - description: Inbound route-map name + description: Inbound route-map name. route_map_out: type: str - description: Outbound route-map name + description: Outbound route-map name. peer_groups: type: list primary_key: name @@ -2644,7 +3473,7 @@ keys: keys: name: type: str - description: Peer-group name + description: Peer-group name. activate: type: bool next_hop: @@ -2662,13 +3491,13 @@ keys: keys: prefix: type: str - description: IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I" + description: IPv4 prefix "A.B.C.D/E" or IPv6 prefix "A:B:C:D:E:F:G:H/I". route_map: type: str eos_cli: type: str description: | - Multiline EOS CLI rendered directly on the Router BGP, VRF definition in the final EOS configuration + Multiline EOS CLI rendered directly on the Router BGP, VRF definition in the final EOS configuration. session_trackers: type: list primary_key: name @@ -2677,10 +3506,10 @@ keys: keys: name: type: str - description: Name of session tracker + description: Name of session tracker. recovery_delay: type: int - description: Recovery delay in seconds + description: Recovery delay in seconds. convert_types: - str min: 1 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_general.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_general.schema.yml similarity index 54% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_general.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_general.schema.yml index 6790ed19572..b54e4732bfd 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_general.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_general.schema.yml @@ -15,10 +15,10 @@ keys: keys: ipv4: type: str - description: IPv4 Address + description: IPv4 Address. ipv6: type: str - description: IPv6 Address + description: IPv6 Address. nexthop_fast_failover: type: bool default: false @@ -32,7 +32,7 @@ keys: keys: name: type: str - description: Destination-VRF + description: Destination-VRF. convert_types: - int leak_routes: @@ -46,7 +46,7 @@ keys: - int subscribe_policy: type: str - description: Route-Map Policy + description: Route-Map Policy. routes: type: dict keys: @@ -57,4 +57,31 @@ keys: keys: name: type: str - description: Dynamic Prefix List Name + description: Dynamic Prefix List Name. + control_functions: + type: dict + description: |- + Routing control functions (RCF) used to filter and update routes from a peer or during redistributions. + Warning: + This configuration cannot be pushed with `eos_config_deploy_eapi`, because of limitations in `arista.eos` and `ansible.netcommon` plugins. + The configuration can be pushed via CloudVision with `eos_config_deploy_cvp` or `cv_deploy`. + keys: + code_units: + type: list + primary_key: name + items: + type: dict + keys: + name: + type: str + description: Name of the code unit. + content: + type: str + required: true + description: |- + Content of route control function. + e.g. + function ACCEPT_ALL() { + return true; + } + EOF diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_igmp.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_igmp.schema.yml similarity index 93% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_igmp.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_igmp.schema.yml index 486b3a0699f..411fd620b5d 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_igmp.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_igmp.schema.yml @@ -13,9 +13,9 @@ keys: host_proxy_match_mroute: type: str description: | - Specify conditions for sending IGMP joins for host-proxy - 'iif' will enable igmp host-proxy to work in iif aware - 'all' will enable igmp host-proxy to work in iif unaware mode (EOS default) + Specify conditions for sending IGMP joins for host-proxy. + 'iif' will enable igmp host-proxy to work in iif aware. + 'all' will enable igmp host-proxy to work in iif unaware mode (EOS default). valid_values: - all - iif @@ -34,13 +34,13 @@ keys: keys: name: type: str - description: VRF name + description: VRF name. host_proxy_match_mroute: type: str description: | - Specify conditions for sending IGMP joins for host-proxy - 'iif' will enable igmp host-proxy to work in iif aware - 'all' will enable igmp host-proxy to work in iif unaware mode (EOS default) + Specify conditions for sending IGMP joins for host-proxy. + 'iif' will enable igmp host-proxy to work in iif aware. + 'all' will enable igmp host-proxy to work in iif unaware mode (EOS default). valid_values: - all - iif diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_internet_exit.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_internet_exit.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_internet_exit.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_internet_exit.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_isis.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_isis.schema.yml similarity index 91% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_isis.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_isis.schema.yml index fe72c44a08f..42595d7c6a0 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_isis.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_isis.schema.yml @@ -12,13 +12,13 @@ keys: instance: type: str required: true - description: ISIS Instance Name + description: ISIS Instance Name. net: type: str - description: CLNS Address like "49.0001.0001.0000.0001.00" + description: CLNS Address like "49.0001.0001.0000.0001.00". router_id: type: str - description: IPv4 Address + description: IPv4 Address. is_type: display_name: "IS Type" type: str @@ -188,7 +188,7 @@ keys: - "ipv6" - "ipv4 unicast" - "ipv6 unicast" - description: Address Family + description: Address Family. deprecation: warning: true new_key: address_family_ipv4.enabled or address_family_ipv6.enabled @@ -198,7 +198,7 @@ keys: items: type: str description: | - EOS CLI rendered under the address families + EOS CLI rendered under the address families. Example "maximum-paths 64" deprecation: warning: true @@ -221,7 +221,7 @@ keys: - "static" route_map: type: str - description: Route-map name + description: Route-map name. include_leaked: type: bool ospf_route_type: @@ -230,7 +230,7 @@ keys: - "external" - "internal" - "nssa-external" - description: ospf_route_type is required with source_protocols 'ospf' and 'ospfv3' + description: ospf_route_type is required with source_protocols 'ospf' and 'ospfv3'. address_family_ipv4: type: dict keys: @@ -260,7 +260,7 @@ keys: - "level-2" srlg: type: dict - description: Shared Risk Link Group + description: Shared Risk Link Group. keys: enable: type: bool @@ -273,7 +273,7 @@ keys: type: bool rcf: type: str - description: Route Control Function + description: Route Control Function. address_family_ipv6: type: dict keys: @@ -304,7 +304,7 @@ keys: description: Optional, default is to protect all levels. srlg: type: dict - description: Shared Risk Link Group + description: Shared Risk Link Group. keys: enable: type: bool @@ -337,9 +337,16 @@ keys: type: int convert_types: - str - min: 1 - max: 300 - description: Maximum interval between two SPFs in seconds. + description: |- + Maximum interval between two SPFs in seconds or milliseconds. + Range in seconds: <1-300> + Range in milliseconds: <1-300000> + interval_unit: + type: str + valid_values: + - "seconds" + - "milliseconds" + description: If interval unit is not defined EOS takes `seconds` by default. wait_interval: type: int convert_types: @@ -347,6 +354,13 @@ keys: min: 1 max: 300000 description: Initial wait interval for SPF in milliseconds. + hold_interval: + type: int + convert_types: + - str + min: 1 + max: 300000 + description: Hold interval between the first and second SPF runs in milliseconds. graceful_restart: type: dict keys: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_l2_vpn.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_l2_vpn.schema.yml similarity index 88% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_l2_vpn.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_l2_vpn.schema.yml index 576e8df6509..8dd36fa01f0 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_l2_vpn.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_l2_vpn.schema.yml @@ -26,7 +26,7 @@ keys: keys: prefix_list: type: str - description: Prefix-list name. ND Proxying is disabled for IPv6 addresses defined in the prefix-list. + description: Prefix-list name. Neighbor Discovery Proxying is disabled for IPv6 addresses defined in the prefix-list. nd_rs_flooding_disabled: type: bool virtual_router_nd_ra_flooding_disabled: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_msdp.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_msdp.schema.yml similarity index 89% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_msdp.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_msdp.schema.yml index 1e1fe306198..f3452e57382 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_msdp.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_msdp.schema.yml @@ -11,12 +11,12 @@ keys: keys: originator_id_local_interface: type: str - description: Interface to use for originator ID + description: Interface to use for originator ID. rejected_limit: type: int convert_types: - str - description: Maximum number of rejected SA messages allowed in cache + description: Maximum number of rejected SA messages allowed in cache. min: 0 max: 40000 forward_register_packets: @@ -35,12 +35,12 @@ keys: keys: source_prefix: type: str - description: Source address prefix + description: Source address prefix. limit: type: int convert_types: - str - description: Limit for SAs matching the source address prefix + description: Limit for SAs matching the source address prefix. min: 0 max: 40000 required: true @@ -52,7 +52,7 @@ keys: keys: ipv4_address: type: str - description: Peer IP Address + description: Peer IP Address. default_peer: type: dict keys: @@ -60,19 +60,19 @@ keys: type: bool prefix_list: type: str - description: Prefix list to filter source of SA messages + description: Prefix list to filter source of SA messages. local_interface: type: str description: type: str disabled: type: bool - description: Disable the MSDP peer + description: Disable the MSDP peer. sa_limit: type: int convert_types: - str - description: Maximum number of SA messages allowed in cache + description: Maximum number of SA messages allowed in cache. min: 0 max: 40000 mesh_groups: @@ -83,7 +83,7 @@ keys: keys: name: type: str - description: Mesh group name + description: Mesh group name. keepalive: type: dict keys: @@ -99,7 +99,7 @@ keys: convert_types: - str required: true - description: Must be greater than keepalive timer + description: Must be greater than keepalive timer. min: 1 max: 65535 sa_filter: @@ -107,10 +107,10 @@ keys: keys: in_list: type: str - description: ACL to filter inbound SA messages + description: ACL to filter inbound SA messages. out_list: type: str - description: ACL to filter outbound SA messages + description: ACL to filter outbound SA messages. vrfs: type: list primary_key: name @@ -119,17 +119,17 @@ keys: keys: name: type: str - description: VRF name + description: VRF name. convert_types: - int originator_id_local_interface: type: str - description: Interface to use for originator ID + description: Interface to use for originator ID. rejected_limit: type: int convert_types: - str - description: Maximum number of rejected SA messages allowed in cache + description: Maximum number of rejected SA messages allowed in cache. min: 0 max: 40000 forward_register_packets: @@ -148,12 +148,12 @@ keys: keys: source_prefix: type: str - description: Source address prefix + description: Source address prefix. limit: type: int convert_types: - str - description: Limit for SAs matching the source address prefix + description: Limit for SAs matching the source address prefix. min: 0 max: 40000 required: true @@ -165,7 +165,7 @@ keys: keys: ipv4_address: type: str - description: Peer IP Address + description: Peer IP Address. default_peer: type: dict keys: @@ -173,19 +173,19 @@ keys: type: bool prefix_list: type: str - description: Prefix list to filter source of SA messages + description: Prefix list to filter source of SA messages. local_interface: type: str description: type: str disabled: type: bool - description: Disable the MSDP peer + description: Disable the MSDP peer. sa_limit: type: int convert_types: - str - description: Maximum number of SA messages allowed in cache + description: Maximum number of SA messages allowed in cache. min: 0 max: 40000 mesh_groups: @@ -196,7 +196,7 @@ keys: keys: name: type: str - description: Mesh group name + description: Mesh group name. keepalive: type: dict keys: @@ -212,7 +212,7 @@ keys: convert_types: - str required: true - description: Must be greater than keepalive timer + description: Must be greater than keepalive timer. min: 1 max: 65535 sa_filter: @@ -220,7 +220,7 @@ keys: keys: in_list: type: str - description: ACL to filter inbound SA messages + description: ACL to filter inbound SA messages. out_list: type: str - description: ACL to filter outbound SA messages + description: ACL to filter outbound SA messages. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_multicast.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_multicast.schema.yml similarity index 80% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_multicast.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_multicast.schema.yml index ee958466385..2d6594a1cd7 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_multicast.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_multicast.schema.yml @@ -12,11 +12,18 @@ keys: ipv4: type: dict keys: + activity_polling_interval: + type: int + convert_types: + - str + min: 1 + max: 60 + description: MFIB entry activity polling interval. counters: type: dict keys: rate_period_decay: - description: Rate in seconds + description: Rate in seconds. type: int min: 0 max: 600 @@ -39,7 +46,7 @@ keys: type: dict keys: source_prefix: - description: Source address A.B.C.D or Source prefix A.B.C.D/E + description: Source address A.B.C.D or Source prefix A.B.C.D/E. type: str required: true destinations: @@ -49,16 +56,26 @@ keys: type: dict keys: nexthop: - description: Next-hop IP address or interface name + description: Next-hop IP address or interface name. type: str required: true distance: - description: Administrative distance for this route + description: Administrative distance for this route. type: int min: 1 max: 255 convert_types: - str + ipv6: + type: dict + keys: + activity_polling_interval: + type: int + convert_types: + - str + min: 1 + max: 60 + description: MFIB entry activity polling interval. vrfs: type: list primary_key: name diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_ospf.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_ospf.schema.yml similarity index 90% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_ospf.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_ospf.schema.yml index 1696f39ee0b..f89ac3ea8dc 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_ospf.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_ospf.schema.yml @@ -22,17 +22,17 @@ keys: type: int convert_types: - str - description: OSPF Process ID + description: OSPF Process ID. vrf: type: str - description: VRF Name for OSPF Process + description: VRF Name for OSPF Process. convert_types: - int passive_interface_default: type: bool router_id: type: str - description: IPv4 Address + description: IPv4 Address. distance: type: dict keys: @@ -76,7 +76,7 @@ keys: type: list items: type: str - description: Interface Name + description: Interface Name. distribute_list_in: type: dict keys: @@ -96,7 +96,7 @@ keys: type: int convert_types: - str - description: Min interval in msecs between accepting the same LSA + description: Min interval in msecs between accepting the same LSA. min: 0 max: 600000 tx_delay: @@ -106,21 +106,21 @@ keys: type: int convert_types: - str - description: Delay to generate first occurrence of LSA in msecs + description: Delay to generate first occurrence of LSA in msecs. min: 0 max: 600000 min: type: int convert_types: - str - description: Min delay between originating the same LSA in msecs + description: Min delay between originating the same LSA in msecs. min: 1 max: 600000 max: type: int convert_types: - str - description: 1-600000 Maximum delay between originating the same LSA in msec + description: 1-600000 Maximum delay between originating the same LSA in msec. min: 1 max: 600000 spf_delay: @@ -130,21 +130,21 @@ keys: type: int convert_types: - str - description: Initial SPF schedule delay in msecs + description: Initial SPF schedule delay in msecs. min: 0 max: 600000 min: type: int convert_types: - str - description: Min Hold time between two SPFs in msecs + description: Min Hold time between two SPFs in msecs. min: 0 max: 65535000 max: type: int convert_types: - str - description: Max wait time between two SPFs in msecs + description: Max wait time between two SPFs in msecs. min: 0 max: 65535000 default_information_originate: @@ -156,7 +156,7 @@ keys: type: int convert_types: - str - description: Metric for default route + description: Metric for default route. min: 1 max: 65535 metric_type: @@ -164,7 +164,7 @@ keys: convert_types: - str valid_values: [1, 2] - description: OSPF metric type for default route + description: OSPF metric type for default route. summary_addresses: type: list primary_key: prefix @@ -173,7 +173,7 @@ keys: keys: prefix: type: str - description: Summary Prefix Address + description: Summary Prefix Address. tag: type: int attribute_map: @@ -188,7 +188,7 @@ keys: keys: route_map: type: str - description: Route Map Name + description: Route Map Name. include_leaked: type: bool connected: @@ -196,7 +196,7 @@ keys: keys: route_map: type: str - description: Route Map Name + description: Route Map Name. include_leaked: type: bool bgp: @@ -204,14 +204,14 @@ keys: keys: route_map: type: str - description: Route Map Name + description: Route Map Name. include_leaked: type: bool auto_cost_reference_bandwidth: type: int convert_types: - str - description: Bandwidth in mbps + description: Bandwidth in mbps. areas: type: list primary_key: id @@ -231,10 +231,10 @@ keys: type: list items: type: str - description: IPv4 Prefix + description: IPv4 Prefix. prefix_list: type: str - description: Prefix-List Name + description: Prefix-List Name. type: type: str valid_values: ["normal", "stub", "nssa"] @@ -250,7 +250,7 @@ keys: type: int convert_types: - str - description: Metric for default route + description: Metric for default route. min: 1 max: 65535 metric_type: @@ -258,7 +258,7 @@ keys: convert_types: - str valid_values: [1, 2] - description: OSPF metric type for default route + description: OSPF metric type for default route. maximum_paths: type: int convert_types: @@ -287,7 +287,7 @@ keys: convert_types: - int description: | - "wait-for-bgp" or Integer 5-86400 + "wait-for-bgp" or Integer 5-86400. Example: "wait-for-bgp" Or "222" summary_lsa: type: dict @@ -302,4 +302,4 @@ keys: type: bool eos_cli: type: str - description: Multiline EOS CLI rendered directly on the Router OSPF process ID in the final EOS configuration + description: Multiline EOS CLI rendered directly on the Router OSPF process ID in the final EOS configuration. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_path_selection.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_path_selection.schema.yml similarity index 96% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_path_selection.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_path_selection.schema.yml index c018f7ad2e0..38e6a1a9500 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_path_selection.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_path_selection.schema.yml @@ -38,7 +38,7 @@ keys: type: str valid_values: - lan - description: Flow assignement `lan` can not be configured in a path group with dynamic peers. + description: Flow assignment `lan` can not be configured in a path group with dynamic peers. local_interfaces: type: list primary_key: name @@ -87,7 +87,7 @@ keys: type: str dynamic_peers: type: dict - description: Flow assignement `lan` can not be configured in a path group with dynamic peers. + description: Flow assignment `lan` can not be configured in a path group with dynamic peers. keys: enabled: type: bool @@ -181,7 +181,7 @@ keys: keys: name: type: str - description: Path-group name + description: Path-group name. priority: type: int description: |- diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_pim_sparse_mode.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_pim_sparse_mode.schema.yml similarity index 90% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_pim_sparse_mode.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_pim_sparse_mode.schema.yml index 19e895b0921..28b200de4c5 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_pim_sparse_mode.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_pim_sparse_mode.schema.yml @@ -14,10 +14,10 @@ keys: keys: bfd: type: bool - description: Enable/Disable BFD + description: Enable/Disable BFD. ssm_range: type: str - description: IPv4 Prefix associated with SSM + description: IPv4 Prefix associated with SSM. rp_addresses: type: list # This primary_key is inserted to support conversion from wildcard dicts, @@ -32,7 +32,7 @@ keys: keys: address: type: str - description: RP Address + description: RP Address. groups: type: list convert_types: @@ -63,7 +63,7 @@ keys: keys: address: type: str - description: Anycast RP Address + description: Anycast RP Address. other_anycast_rp_addresses: type: list primary_key: address @@ -74,7 +74,7 @@ keys: keys: address: type: str - description: Other Anycast RP Address + description: Other Anycast RP Address. register_count: type: int convert_types: @@ -87,7 +87,7 @@ keys: keys: name: type: str - description: VRF Name + description: VRF Name. convert_types: - int ipv4: @@ -95,7 +95,7 @@ keys: keys: bfd: type: bool - description: Enable/Disable BFD + description: Enable/Disable BFD. rp_addresses: type: list items: @@ -103,7 +103,7 @@ keys: keys: address: type: str - description: RP Address + description: RP Address. required: true groups: type: list diff --git a/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_segment_security.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_segment_security.schema.yml new file mode 100644 index 00000000000..887b2d8ce7a --- /dev/null +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_segment_security.schema.yml @@ -0,0 +1,128 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +# yaml-language-server: $schema=../../../../plugins/plugin_utils/schema/avd_meta_schema.json +# Line above is used by RedHat's YAML Schema vscode extension +# Use Ctrl + Space to get suggestions for every field. Autocomplete will pop up after typing 2 letters. +type: dict +keys: + router_segment_security: + type: dict + keys: + enabled: + type: bool + policies: + type: list + description: |- + Customised application policies. + Using the Application Traffic Recognition L4 profiles, custom policies can be defined. The built-in application 'app-match-all' can be used to match any packets. + Note that this is stateless, so both the source and destination flows need to be considered. + primary_key: name + items: + type: dict + keys: + name: + type: str + description: Policy name. + sequence_numbers: + type: list + required: true + primary_key: sequence + items: + type: dict + keys: + sequence: + type: int + description: Sequence ID. + convert_types: + - str + min: 1 + max: 1023 + application: + type: str + required: true + description: The name of the application. + action: + type: str + required: true + description: The action to take - note that platform support for the redirect action is limited. The "redirect" action also requires the 'next_hop' to be configured. + valid_values: + - "forward" + - "drop" + - "redirect" + log: + type: bool + description: Enable logging - note that platform support is limited. + stateless: + type: bool + description: Take action, regardless of state. Should be set to 'true' for MSS-G. + default: true + next_hop: + type: str + description: When the action is 'redirect', this indicates the IPv4 next hop to redirect to. + vrfs: + type: list + description: The name of the VRF that the segments and policies are defined in. + primary_key: name + items: + type: dict + keys: + name: + type: str + segments: + type: list + primary_key: name + required: true + items: + type: dict + keys: + name: + type: str + description: Segment name. + definition: + type: dict + keys: + interfaces: + type: list + description: The names of the source interface e.g. Port-Channel1 - note that platform support is limited. + min_length: 1 + items: + type: str + match_lists: + type: list + description: The set of lists that define the segment. These can be a mix of IPv4 and IPv6 prefix or match lists. + max_length: 2 + min_length: 1 + primary_key: address_family + items: + type: dict + keys: + address_family: + type: str + required: true + description: Indicate which address-family the match list belongs to e.g. ipv4 or ipv6. + valid_values: + - "ipv4" + - "ipv6" + covered_prefix_list: + type: str + description: The name of the prefix-list. You can have a maximum of one per address-family. Mutually exclusive to the use of match_list. If both are configured prefix takes precedence. + prefix: + type: str + description: The name of the match-list. You can have a maximum of one per address-family. Mutually exclusive to the use of covered_prefix_list. If both are configured prefix takes precedence. + policies: + type: list + description: The policies controlling traffic into the segment. + primary_key: from + items: + type: dict + keys: + from: + type: str + description: The name of the source segment or 'forwarding-segments' for all segments. + policy: + type: str + description: The name of the policy to apply. The built-in policies are 'policy-forward-all' and 'policy-drop-all'. + fallback_policy: + type: str + description: Only supported on the R3 series platforms, this allows a per-segment default policy to be specified by name. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_service_insertion.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_service_insertion.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_service_insertion.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_service_insertion.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_traffic_engineering.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_traffic_engineering.schema.yml similarity index 98% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_traffic_engineering.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_traffic_engineering.schema.yml index 89a2c06dcf8..877405b420e 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/router_traffic_engineering.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/router_traffic_engineering.schema.yml @@ -30,7 +30,7 @@ keys: keys: address: type: str - description: IPv4 or IPv6 address + description: IPv4 or IPv6 address. colors: type: list primary_key: value @@ -53,7 +53,7 @@ keys: type: str sbfd_remote_discriminator: type: str - description: IPv4 address or 32 bit integer + description: IPv4 address or 32 bit integer. convert_types: - int path_group: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/service_routing_configuration_bgp.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/service_routing_configuration_bgp.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/service_routing_configuration_bgp.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/service_routing_configuration_bgp.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/service_routing_protocols_model.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/service_routing_protocols_model.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/service_routing_protocols_model.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/service_routing_protocols_model.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/service_unsupported_transceiver.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/service_unsupported_transceiver.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/service_unsupported_transceiver.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/service_unsupported_transceiver.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/sflow.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/sflow.schema.yml similarity index 90% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/sflow.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/sflow.schema.yml index 8011cfad134..6414b2c2561 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/sflow.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/sflow.schema.yml @@ -24,7 +24,7 @@ keys: type: int convert_types: - str - description: Polling interval in seconds + description: Polling interval in seconds. vrfs: type: list primary_key: name @@ -47,7 +47,7 @@ keys: keys: destination: type: str - description: Sflow Destination IP Address + description: Sflow Destination IP Address. port: type: int description: Port Number @@ -60,7 +60,7 @@ keys: "source" and "source_interface" are mutually exclusive. If both are defined, "source_interface" takes precedence. source_interface: type: str - description: Source Interface + description: Source Interface. destinations: type: list primary_key: destination @@ -71,10 +71,10 @@ keys: keys: destination: type: str - description: Sflow Destination IP Address + description: Sflow Destination IP Address. port: type: int - description: Port Number + description: Port Number. convert_types: - str source: @@ -84,7 +84,7 @@ keys: "source" and "source_interface" are mutually exclusive. If both are defined, "source_interface" takes precedence. source_interface: type: str - description: Source Interface + description: Source Interface. extensions: type: list primary_key: name @@ -93,10 +93,10 @@ keys: keys: name: type: str - description: Extension Name + description: Extension Name. enabled: type: bool - description: Enable or Disable Extension + description: Enable or Disable Extension. required: true interface: type: dict diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/snmp_server.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/snmp_server.schema.yml similarity index 82% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/snmp_server.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/snmp_server.schema.yml index 7c125b4b729..0ade14374c7 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/snmp_server.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/snmp_server.schema.yml @@ -8,7 +8,7 @@ type: dict keys: snmp_server: type: dict - description: SNMP settings + description: SNMP settings. keys: engine_ids: type: dict @@ -18,7 +18,7 @@ keys: convert_types: - int description: | - Engine ID in hexadecimal + Engine ID in hexadecimal. remotes: type: list items: @@ -29,21 +29,21 @@ keys: convert_types: - int description: | - Remote engine ID in hexadecimal + Remote engine ID in hexadecimal. address: type: str description: | - Hostname or IP of remote engine + Hostname or IP of remote engine. udp_port: type: int convert_types: - str contact: type: str - description: SNMP contact + description: SNMP contact. location: type: str - description: SNMP location + description: SNMP location. communities: type: list primary_key: name @@ -54,7 +54,7 @@ keys: keys: name: type: str - description: Community name + description: Community name. access: type: str valid_values: ["ro", "rw"] @@ -63,13 +63,13 @@ keys: keys: name: type: str - description: IPv4 access list name + description: IPv4 access list name. access_list_ipv6: type: dict keys: name: type: str - description: IPv6 access list name + description: IPv6 access list name. view: type: str ipv4_acls: @@ -79,7 +79,7 @@ keys: keys: name: type: str - description: IPv4 access list name + description: IPv4 access list name. vrf: type: str convert_types: @@ -91,7 +91,7 @@ keys: keys: name: type: str - description: IPv6 access list name + description: IPv6 access list name. vrf: type: str convert_types: @@ -106,7 +106,7 @@ keys: keys: name: type: str - description: Interface name + description: Interface name. vrf: type: str convert_types: @@ -118,7 +118,7 @@ keys: keys: name: type: str - description: SNMP view name + description: SNMP view name. mib_family_name: type: str included: @@ -136,7 +136,7 @@ keys: keys: name: type: str - description: Group name + description: Group name. version: type: str valid_values: ["v1", "v2c", "v3"] @@ -145,13 +145,13 @@ keys: valid_values: ["auth", "noauth", "priv"] read: type: str - description: Read view + description: Read view. write: type: str - description: Write view + description: Write view. notify: type: str - description: Notify view + description: Notify view. users: type: list items: @@ -159,21 +159,21 @@ keys: keys: name: type: str - description: Username + description: Username. group: type: str - description: Group name + description: Group name. remote_address: type: str description: | - Hostname or ip of remote engine - The remote_address and udp_port are used for remote users + Hostname or ip of remote engine. + The remote_address and udp_port are used for remote users. udp_port: type: int convert_types: - str description: | - udp_port will not be used if no remote_address is configured + udp_port will not be used if no remote_address is configured. version: type: str valid_values: ["v1", "v2c", "v3"] @@ -182,23 +182,23 @@ keys: convert_types: - int description: | - Engine ID in hexadecimal for localizing auth and/or priv + Engine ID in hexadecimal for localizing auth and/or priv. auth: type: str description: | - Hash algorithm + Hash algorithm. auth_passphrase: type: str description: | - Hashed authentication passphrase if localized is used else cleartext authentication passphrase + Hashed authentication passphrase if localized is used else cleartext authentication passphrase. priv: type: str description: | - Encryption algorithm + Encryption algorithm. priv_passphrase: type: str description: | - Hashed privacy passphrase if localized is used else cleartext privacy passphrase + Hashed privacy passphrase if localized is used else cleartext privacy passphrase. hosts: type: list items: @@ -206,7 +206,7 @@ keys: keys: host: type: str - description: Host IP address or name + description: Host IP address or name. vrf: type: str convert_types: @@ -218,7 +218,7 @@ keys: valid_values: ["1", "2c", "3"] community: type: str - description: Community name + description: Community name. users: type: list items: @@ -236,7 +236,7 @@ keys: type: bool default: false description: | - Enable or disable all snmp-traps + Enable or disable all snmp-traps. snmp_traps: type: list items: @@ -245,7 +245,7 @@ keys: name: type: str description: | - Enable or disable specific snmp-traps and their sub_traps + Enable or disable specific snmp-traps and their sub_traps. Examples: - "bgp" - "bgp established" @@ -260,7 +260,7 @@ keys: keys: name: type: str - description: VRF name + description: VRF name. convert_types: - int enable: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/spanning_tree.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/spanning_tree.schema.yml similarity index 95% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/spanning_tree.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/spanning_tree.schema.yml index 15eac87bfe0..e2e510f6602 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/spanning_tree.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/spanning_tree.schema.yml @@ -30,7 +30,7 @@ keys: type: int convert_types: - str - description: Maximum number of BPDUs per timer interval + description: Maximum number of BPDUs per timer interval. rstp_priority: type: int convert_types: @@ -49,7 +49,7 @@ keys: type: int convert_types: - str - description: 0-65535 + description: 0-65535. instances: type: list primary_key: id @@ -62,7 +62,7 @@ keys: type: int convert_types: - str - description: Instance ID + description: Instance ID. vlans: type: str convert_types: @@ -82,7 +82,7 @@ keys: type: str convert_types: - int - description: Instance ID + description: Instance ID. priority: type: int convert_types: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/standard_access_lists.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/standard_access_lists.schema.yml similarity index 90% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/standard_access_lists.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/standard_access_lists.schema.yml index c4b826e0480..411a70bacef 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/standard_access_lists.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/standard_access_lists.schema.yml @@ -17,7 +17,7 @@ keys: keys: name: type: str - description: Access-list Name + description: Access-list Name. convert_types: [ int ] counters_per_entry: type: bool @@ -32,12 +32,12 @@ keys: keys: sequence: type: int - description: Sequence ID + description: Sequence ID. convert_types: - str action: type: str required: true description: | - Action as string + Action as string. Example: "deny ip any any" diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/static_routes.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/static_routes.schema.yml similarity index 85% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/static_routes.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/static_routes.schema.yml index c86047aeab6..76f6badb9b2 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/static_routes.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/static_routes.schema.yml @@ -13,20 +13,20 @@ keys: keys: vrf: type: str - description: VRF Name + description: VRF Name. convert_types: - int destination_address_prefix: type: str - description: IPv4_network/Mask + description: IPv4_network/Mask. interface: type: str gateway: type: str - description: IPv4 Address + description: IPv4 Address. track_bfd: type: bool - description: Track next-hop using BFD + description: Track next-hop using BFD. distance: type: int convert_types: @@ -41,7 +41,7 @@ keys: max: 4294967295 name: type: str - description: Description + description: Description. metric: type: int convert_types: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/stun.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/stun.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/stun.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/stun.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/switchport_default.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/switchport_default.schema.yml similarity index 96% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/switchport_default.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/switchport_default.schema.yml index 27977412d3b..2d00b06fd80 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/switchport_default.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/switchport_default.schema.yml @@ -26,7 +26,7 @@ keys: valid_values: ["tagged", "untagged"] vlan: type: int - description: VLAN ID + description: VLAN ID. convert_types: - str min: 1 diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/switchport_port_security.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/switchport_port_security.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/switchport_port_security.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/switchport_port_security.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/system.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/system.schema.yml similarity index 95% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/system.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/system.schema.yml index 87d6eb3a8c2..0d237c7bc05 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/system.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/system.schema.yml @@ -18,10 +18,10 @@ keys: keys: ipv4: type: int - description: Segment size + description: Segment size. ipv6: type: int - description: Segment size + description: Segment size. ipv4_access_groups: type: list primary_key: acl_name diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/tacacs_servers.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/tacacs_servers.schema.yml similarity index 87% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/tacacs_servers.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/tacacs_servers.schema.yml index 7ca2c0a92f8..98faf056a3a 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/tacacs_servers.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/tacacs_servers.schema.yml @@ -13,7 +13,7 @@ keys: type: int convert_types: - str - description: Timeout in seconds + description: Timeout in seconds. min: 1 max: 1000 hosts: @@ -23,14 +23,14 @@ keys: keys: host: type: str - description: Host IP address or name + description: Host IP address or name. vrf: type: str convert_types: - int key: type: str - description: Encrypted key + description: Encrypted key. key_type: type: str convert_types: @@ -43,7 +43,7 @@ keys: type: int convert_types: - str - description: Timeout in seconds + description: Timeout in seconds. min: 1 max: 1000 policy_unknown_mandatory_attribute_ignore: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/tap_aggregation.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/tap_aggregation.schema.yml similarity index 90% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/tap_aggregation.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/tap_aggregation.schema.yml index 2448d49b1b9..85c25a87028 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/tap_aggregation.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/tap_aggregation.schema.yml @@ -18,13 +18,13 @@ keys: enabled: type: bool profile: - description: Profile Name + description: Profile Name. type: str no_errdisable: type: list items: type: str - description: Interface name e.g Ethernet1, Port-Channel1 + description: Interface name e.g Ethernet1, Port-Channel1. encapsulation_dot1br_strip: type: bool encapsulation_vn_tag_strip: @@ -34,14 +34,14 @@ keys: truncation_size: type: int description: | - Allowed truncation_size values vary depending on the platform + Allowed truncation_size values vary depending on the platform. mac: type: dict keys: timestamp: type: dict description: | - mac.timestamp.replace_source_mac and mac.timestamp.header.format are mutually exclsuive. If both are defined, replace_source_mac takes precedence + mac.timestamp.replace_source_mac and mac.timestamp.header.format are mutually exclsuive. If both are defined, replace_source_mac takes precedence. keys: replace_source_mac: type: bool @@ -52,14 +52,14 @@ keys: type: str valid_values: ["48-bit", "64-bit"] eth_type: - description: EtherType + description: EtherType. type: int convert_types: - str fcs_append: type: bool description: | - mac.fcs_append and mac.fcs_error are mutually exclusive. If both are defined, mac.fcs_append takes precedence + mac.fcs_append and mac.fcs_error are mutually exclusive. If both are defined, mac.fcs_append takes precedence. fcs_error: type: str valid_values: ["correct", "discard", "pass-through"] diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/tcam_profile.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/tcam_profile.schema.yml similarity index 93% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/tcam_profile.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/tcam_profile.schema.yml index 8d35ff9dad6..11034a83947 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/tcam_profile.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/tcam_profile.schema.yml @@ -13,7 +13,7 @@ keys: system: type: str description: | - TCAM profile name to activate + TCAM profile name to activate. profiles: type: list secondary_key: config @@ -25,7 +25,7 @@ keys: keys: name: type: str - description: Tcam-Profile Name + description: Tcam-Profile Name. config: type: str required: false diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/terminal.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/terminal.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/terminal.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/terminal.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/trackers.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/trackers.schema.yml similarity index 83% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/trackers.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/trackers.schema.yml index 479d369f803..5b91dfa7c92 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/trackers.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/trackers.schema.yml @@ -14,12 +14,12 @@ keys: keys: name: type: str - description: Name of tracker object + description: Name of tracker object. interface: type: str - description: Name of tracked interface + description: Name of tracked interface. required: true tracked_property: type: str default: "line-protocol" - description: Property to track + description: Property to track. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/traffic_policies.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/traffic_policies.schema.yml similarity index 82% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/traffic_policies.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/traffic_policies.schema.yml index bda54d7c8a3..6bef30753d0 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/traffic_policies.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/traffic_policies.schema.yml @@ -28,12 +28,12 @@ keys: keys: name: type: str - description: IPv4 Prefix Field Set Name + description: IPv4 Prefix Field Set Name. prefixes: type: list items: type: str - description: IPv4 Prefix + description: IPv4 Prefix. ipv6: type: list secondary_key: prefixes @@ -45,12 +45,12 @@ keys: keys: name: type: str - description: IPv6 Prefix Field Set Name + description: IPv6 Prefix Field Set Name. prefixes: type: list items: type: str - description: IPv6 Prefix + description: IPv6 Prefix. ports: type: list primary_key: name @@ -62,7 +62,7 @@ keys: keys: name: type: str - description: L4 Port Field Set Name + description: L4 Port Field Set Name. port_range: type: str description: "Example: '10,20,80,440-450'" @@ -76,7 +76,7 @@ keys: keys: name: type: str - description: Traffic Policy Name + description: Traffic Policy Name. matches: type: list primary_key: name @@ -87,7 +87,7 @@ keys: keys: name: type: str - description: Traffic Policy Item + description: Traffic Policy Item. type: type: str valid_values: @@ -100,10 +100,10 @@ keys: type: list items: type: str - description: IP address or prefix + description: IP address or prefix. prefix_lists: type: list - description: Field-set prefix lists + description: Field-set prefix lists. items: type: str destination: @@ -113,24 +113,24 @@ keys: type: list items: type: str - description: IP address or prefix + description: IP address or prefix. prefix_lists: type: list - description: Field-set prefix lists + description: Field-set prefix lists. items: type: str ttl: type: str - description: TTL range + description: TTL range. fragment: type: dict description: | The 'fragment' command is not supported when 'source port' - or 'destination port' command is configured + or 'destination port' command is configured. keys: offset: type: str - description: Fragment offset range + description: Fragment offset range. protocols: type: list primary_key: protocol @@ -143,16 +143,16 @@ keys: type: str src_port: type: str - description: Port range + description: Port range. dst_port: type: str - description: Port range + description: Port range. src_field: type: str - description: L4 port range field set + description: L4 port range field set. dst_field: type: str - description: L4 port range field set + description: L4 port range field set. flags: type: list items: @@ -173,15 +173,15 @@ keys: type: int convert_types: - str - description: Traffic class ID + description: Traffic class ID. count: type: str - description: Counter name + description: Counter name. drop: type: bool log: type: bool - description: Only supported when action is set to drop + description: Only supported when action is set to drop. default_actions: type: dict keys: @@ -196,15 +196,15 @@ keys: type: int convert_types: - str - description: Traffic class ID + description: Traffic class ID. count: type: str - description: Counter name + description: Counter name. drop: type: bool log: type: bool - description: Only supported when action is set to drop + description: Only supported when action is set to drop. ipv6: type: dict keys: @@ -216,12 +216,12 @@ keys: type: int convert_types: - str - description: Traffic class ID + description: Traffic class ID. count: type: str - description: Counter name + description: Counter name. drop: type: bool log: type: bool - description: Only supported when action is set to drop + description: Only supported when action is set to drop. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/transceiver_qsfp_default_mode_channelized.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/transceiver_qsfp_default_mode_channelized.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/transceiver_qsfp_default_mode_channelized.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/transceiver_qsfp_default_mode_channelized.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/tunnel_interfaces.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/tunnel_interfaces.schema.yml similarity index 79% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/tunnel_interfaces.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/tunnel_interfaces.schema.yml index 96e207c325e..0a38127e456 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/tunnel_interfaces.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/tunnel_interfaces.schema.yml @@ -16,7 +16,7 @@ keys: keys: name: type: str - description: Tunnel Interface Name + description: Tunnel Interface Name. description: type: str shutdown: @@ -29,44 +29,44 @@ keys: - str vrf: type: str - description: VRF Name + description: VRF Name. convert_types: - int ip_address: type: str format: ipv4_cidr - description: IPv4_address/Mask + description: IPv4_address/Mask. ipv6_enable: type: bool ipv6_address: type: str format: ipv6_cidr - description: IPv6_address/Mask + description: IPv6_address/Mask. access_group_in: - description: IPv4 ACL Name for ingress + description: IPv4 ACL Name for ingress. type: str access_group_out: - description: IPv4 ACL Name for egress + description: IPv4 ACL Name for egress. type: str ipv6_access_group_in: - description: IPv6 ACL Name for ingress + description: IPv6 ACL Name for ingress. type: str ipv6_access_group_out: - description: IPv6 ACL Name for egress + description: IPv6 ACL Name for egress. type: str tcp_mss_ceiling: type: dict keys: ipv4: type: int - description: Segment Size for IPv4 + description: Segment Size for IPv4. min: 64 max: 65495 convert_types: - str ipv6: type: int - description: Segment Size for IPv6 + description: Segment Size for IPv6. min: 64 max: 65475 convert_types: @@ -75,7 +75,7 @@ keys: type: str valid_values: ["ingress", "egress"] description: | - Optional direction ('ingress', 'egress') for tcp mss ceiling + Optional direction ('ingress', 'egress') for tcp mss ceiling. tunnel_mode: type: str valid_values: ["gre", "ipsec"] @@ -85,13 +85,13 @@ keys: `ipsec`: IPsec-over-IP encapsulation. source_interface: type: str - description: Tunnel Source Interface Name + description: Tunnel Source Interface Name. destination: type: str - description: IPv4 or IPv6 Address Tunnel Destination + description: IPv4 or IPv6 Address Tunnel Destination. path_mtu_discovery: type: bool - description: Enable Path MTU Discovery On Tunnel + description: Enable Path MTU Discovery On Tunnel. ipsec_profile: type: str description: |- diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/virtual_source_nat_vrfs.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/virtual_source_nat_vrfs.schema.yml similarity index 90% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/virtual_source_nat_vrfs.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/virtual_source_nat_vrfs.schema.yml index 61aadf94c3d..89b1a911468 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/virtual_source_nat_vrfs.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/virtual_source_nat_vrfs.schema.yml @@ -16,9 +16,9 @@ keys: keys: name: type: str - description: VRF Name + description: VRF Name. convert_types: - int ip_address: type: str - description: IPv4 Address + description: IPv4 Address. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/vlan_interfaces.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/vlan_interfaces.schema.yml similarity index 84% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/vlan_interfaces.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/vlan_interfaces.schema.yml index 66ea8a176e4..1e606ac06bb 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/vlan_interfaces.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/vlan_interfaces.schema.yml @@ -16,7 +16,7 @@ keys: keys: name: type: str - description: VLAN interface name like "Vlan123" + description: VLAN interface name like "Vlan123". description: type: str logging: @@ -31,14 +31,14 @@ keys: type: bool vrf: type: str - description: VRF name + description: VRF name. convert_types: - int arp_aging_timeout: type: int convert_types: - str - description: In seconds + description: In seconds. min: 1 max: 65535 arp_cache_dynamic_capacity: @@ -57,25 +57,25 @@ keys: type: bool ip_address: type: str - description: IPv4_address/Mask + description: IPv4_address/Mask. ip_address_secondaries: type: list items: type: str - description: IPv4_address/Mask + description: IPv4_address/Mask. ip_virtual_router_addresses: type: list items: type: str - description: IPv4 address or IPv4_address/Mask + description: IPv4 address or IPv4_address/Mask. ip_address_virtual: type: str - description: IPv4_address/Mask + description: IPv4_address/Mask. ip_address_virtual_secondaries: type: list items: type: str - description: IPv4_address/Mask + description: IPv4_address/Mask. ip_verify_unicast_source_reachable_via: type: str valid_values: @@ -146,7 +146,7 @@ keys: description: IGMP version on IGMP host-proxy interface. ip_helpers: type: list - description: List of DHCP servers + description: List of DHCP servers. convert_types: - dict primary_key: ip_helper @@ -155,15 +155,18 @@ keys: keys: ip_helper: type: str - description: IP address or hostname of DHCP server + description: IP address or hostname of DHCP server. source_interface: type: str - description: Interface used as source for forwarded DHCP packets + description: Interface used as source for forwarded DHCP packets. vrf: type: str - description: VRF where DHCP server can be reached + description: VRF where DHCP server can be reached. convert_types: - int + ip_dhcp_relay_all_subnets: + type: bool + description: Allow forwarding requests with secondary IP addresses in the gateway address "giaddr" field. ip_nat: type: dict $ref: "eos_cli_config_gen#/$defs/interface_ip_nat" @@ -171,12 +174,12 @@ keys: type: bool ipv6_address: type: str - description: IPv6_address/Mask + description: IPv6_address/Mask. ipv6_address_virtual: type: str description: | - IPv6_address/Mask - If both "ipv6_address_virtual" and "ipv6_address_virtuals" are set, all addresses will be configured + IPv6_address/Mask. + If both "ipv6_address_virtual" and "ipv6_address_virtuals" are set, all addresses will be configured. deprecation: warning: true new_key: ipv6_address_virtuals @@ -186,10 +189,10 @@ keys: description: The new "ipv6_address_virtuals" key support multiple virtual ipv6 addresses. items: type: str - description: IPv6_address/Mask + description: IPv6_address/Mask. ipv6_address_link_local: type: str - description: IPv6_address/Mask + description: IPv6_address/Mask. ipv6_virtual_router_address: type: str description: | @@ -204,11 +207,35 @@ keys: description: Improved "VARPv6" data model to support multiple VARPv6 addresses. items: type: str - description: IPv6 address or IPv6_address/Mask + description: IPv6 address or IPv6_address/Mask. ipv6_nd_ra_disabled: type: bool ipv6_nd_managed_config_flag: type: bool + ipv6_nd_other_config_flag: + type: bool + description: Set the "other stateful configuration" flag in IPv6 router advertisements. + ipv6_nd_cache: + type: dict + description: IPv6 neighbor cache options. + keys: + dynamic_capacity: + type: int + description: Capacity of dynamic cache entries. + convert_types: + - str + min: 0 + max: 4294967295 + expire: + type: int + description: Cache entries expirery in seconds. + convert_types: + - str + min: 1 + max: 65535 + refresh_always: + type: bool + description: Force refresh on cache expiry. ipv6_nd_prefixes: type: list convert_types: @@ -219,15 +246,15 @@ keys: keys: ipv6_prefix: type: str - description: IPv6_address/Mask + description: IPv6_address/Mask. valid_lifetime: type: str - description: In seconds <0-4294967295> or infinite + description: In seconds <0-4294967295> or infinite. convert_types: - int preferred_lifetime: type: str - description: In seconds <0-4294967295> or infinite + description: In seconds <0-4294967295> or infinite. convert_types: - int no_autoconfig_flag: @@ -240,35 +267,38 @@ keys: keys: address: type: str - description: DHCP server's IPv6 address + description: DHCP server's IPv6 address. vrf: type: str convert_types: - int local_interface: type: str - description: Local interface to communicate with DHCP server - mutually exclusive to source_address + description: Local interface to communicate with DHCP server - mutually exclusive to source_address. source_address: type: str - description: Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface + description: Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface. link_address: type: str - description: Override the default link address specified in the relayed DHCP packet + description: Override the default link address specified in the relayed DHCP packet. + ipv6_dhcp_relay_all_subnets: + type: bool + description: Allow forwarding requests with additional IPv6 addresses in the gateway address "giaddr" field. access_group_in: type: str - description: IPv4 access-list name + description: IPv4 access-list name. convert_types: [ int ] access_group_out: type: str - description: IPv4 access-list name + description: IPv4 access-list name. convert_types: [ int ] ipv6_access_group_in: type: str - description: IPv6 access-list name + description: IPv6 access-list name. convert_types: [ int ] ipv6_access_group_out: type: str - description: IPv6 access-list name + description: IPv6 access-list name. convert_types: [ int ] multicast: type: dict @@ -278,14 +308,14 @@ keys: keys: boundaries: type: list - description: Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both + description: Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both. primary_key: boundary items: type: dict keys: boundary: type: str - description: IPv4 access-list name or IPv4 multicast group prefix with mask + description: IPv4 access-list name or IPv4 multicast group prefix with mask. convert_types: [ int ] out: type: bool @@ -308,14 +338,14 @@ keys: keys: boundaries: type: list - description: Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both + description: Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both. primary_key: boundary items: type: dict keys: boundary: type: str - description: IPv6 access-list name or IPv6 multicast group prefix with mask + description: IPv6 access-list name or IPv6 multicast group prefix with mask. convert_types: [ int ] source_route_export: type: dict @@ -349,10 +379,10 @@ keys: - message-digest ospf_authentication_key: type: str - description: Encrypted password used for simple authentication + description: Encrypted password used for simple authentication. ospf_message_digest_keys: type: list - description: Keys used for message-digest authentication + description: Keys used for message-digest authentication. convert_types: - dict primary_key: id @@ -373,7 +403,7 @@ keys: - sha512 key: type: str - description: Encrypted password + description: Encrypted password. pim: type: dict keys: @@ -416,7 +446,10 @@ keys: description: PIM hello interval in seconds. isis_enable: type: str - description: ISIS instance name + description: ISIS instance name. + isis_bfd: + type: bool + description: Enable BFD for ISIS. isis_passive: type: bool isis_metric: @@ -433,7 +466,7 @@ keys: type: bool vrrp_ids: type: list - description: Improved "vrrp" data model to support multiple VRRP IDs + description: Improved "vrrp" data model to support multiple VRRP IDs. primary_key: id items: type: dict @@ -442,12 +475,12 @@ keys: type: int convert_types: - str - description: VRID + description: VRID. priority_level: type: int convert_types: - str - description: Instance priority + description: Instance priority. min: 1 max: 254 advertisement: @@ -457,7 +490,7 @@ keys: type: int convert_types: - str - description: Interval in seconds + description: Interval in seconds. min: 1 max: 255 preempt: @@ -473,14 +506,14 @@ keys: type: int convert_types: - str - description: Minimum preempt delay in seconds + description: Minimum preempt delay in seconds. min: 0 max: 3600 reload: type: int convert_types: - str - description: Reload preempt delay in seconds + description: Reload preempt delay in seconds. min: 0 max: 3600 timers: @@ -504,14 +537,14 @@ keys: keys: name: type: str - description: Tracked object name + description: Tracked object name. decrement: type: int convert_types: - str min: 1 max: 254 - description: Decrement VRRP priority by 1-254 + description: Decrement VRRP priority by 1-254. shutdown: type: bool ipv4: @@ -520,7 +553,7 @@ keys: address: type: str required: true - description: Virtual IPv4 address + description: Virtual IPv4 address. version: type: int convert_types: @@ -534,7 +567,7 @@ keys: address: type: str required: true - description: Virtual IPv6 address + description: Virtual IPv6 address. vrrp: type: dict description: | @@ -546,12 +579,12 @@ keys: keys: virtual_router: type: str - description: Virtual Router ID + description: Virtual Router ID. priority: type: int convert_types: - str - description: Instance priority + description: Instance priority. advertisement_interval: type: int convert_types: @@ -562,10 +595,10 @@ keys: - str ipv4: type: str - description: Virtual IPv4 address + description: Virtual IPv4 address. ipv6: type: str - description: Virtual IPv6 address + description: Virtual IPv6 address. ip_attached_host_route_export: type: dict keys: @@ -607,12 +640,12 @@ keys: type: int convert_types: - str - description: Rate in milliseconds + description: Rate in milliseconds. min_rx: type: int convert_types: - str - description: Minimum RX hold time in milliseconds + description: Minimum RX hold time in milliseconds. multiplier: type: int convert_types: @@ -627,21 +660,21 @@ keys: keys: input: type: str - description: Name of policy-map used for policy based routing + description: Name of policy-map used for policy based routing. pvlan_mapping: type: str - description: List of VLANs as string + description: List of VLANs as string. tenant: type: str - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. tags: type: list items: type: str - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. type: type: str - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. eos_cli: type: str - description: Multiline EOS CLI rendered directly on the VLAN interface in the final EOS configuration + description: Multiline EOS CLI rendered directly on the VLAN interface in the final EOS configuration. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/vlan_internal_order.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/vlan_internal_order.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/vlan_internal_order.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/vlan_internal_order.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/vlans.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/vlans.schema.yml similarity index 87% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/vlans.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/vlans.schema.yml index d2185127c12..8b864c35492 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/vlans.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/vlans.schema.yml @@ -18,10 +18,10 @@ keys: type: int convert_types: - str - description: VLAN ID + description: VLAN ID. name: type: str - description: VLAN Name + description: VLAN Name. state: type: str valid_values: ["active", "suspend"] @@ -29,7 +29,7 @@ keys: type: list items: type: str - description: Trunk Group Name + description: Trunk Group Name. private_vlan: type: dict keys: @@ -40,7 +40,7 @@ keys: type: int convert_types: - str - description: Primary VLAN ID + description: Primary VLAN ID. tenant: type: str - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/vmtracer_sessions.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/vmtracer_sessions.schema.yml similarity index 89% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/vmtracer_sessions.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/vmtracer_sessions.schema.yml index 1d52e411dce..72b0865c373 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/vmtracer_sessions.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/vmtracer_sessions.schema.yml @@ -16,14 +16,14 @@ keys: keys: name: type: str - description: Vmtracer Session Name + description: Vmtracer Session Name. url: type: str username: type: str password: type: str - description: Type 7 Password Hash + description: Type 7 Password Hash. autovlan_disable: type: bool source_interface: diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/vrfs.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/vrfs.schema.yml similarity index 95% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/vrfs.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/vrfs.schema.yml index b6b1d18c4c9..adf0eb0845f 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/vrfs.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/vrfs.schema.yml @@ -10,7 +10,7 @@ keys: type: list primary_key: name description: | - These keys are ignored if the name of the vrf is 'default' + These keys are ignored if the name of the vrf is 'default'. convert_types: - dict items: @@ -18,7 +18,7 @@ keys: keys: name: type: str - description: VRF Name + description: VRF Name. convert_types: - int description: @@ -31,4 +31,4 @@ keys: type: bool tenant: type: str - description: Key only used for documentation or validation purposes + description: Key only used for documentation or validation purposes. diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/vxlan_interface.schema.yml b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/vxlan_interface.schema.yml similarity index 89% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/vxlan_interface.schema.yml rename to python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/vxlan_interface.schema.yml index b881251e604..bdc186a5a9b 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/vxlan_interface.schema.yml +++ b/python-avd/pyavd/_eos_cli_config_gen/schema/schema_fragments/vxlan_interface.schema.yml @@ -19,7 +19,7 @@ keys: keys: source_interface: type: str - description: Source Interface Name + description: Source Interface Name. multicast: type: dict keys: @@ -27,7 +27,7 @@ keys: type: bool controller_client: type: dict - description: Client to CVX Controllers + description: Client to CVX Controllers. keys: enabled: type: bool @@ -43,7 +43,7 @@ keys: virtual_router_encapsulation_mac_address: type: str description: | - "mlag-system-id" or ethernet_address (H.H.H) + "mlag-system-id" or ethernet_address (H.H.H). bfd_vtep_evpn: type: dict keys: @@ -89,19 +89,19 @@ keys: type: int convert_types: - str - description: VLAN ID + description: VLAN ID. vni: type: int convert_types: - str multicast_group: type: str - description: IP Multicast Group Address + description: IP Multicast Group Address. flood_vteps: type: list items: type: str - description: Remote VTEP IP Address + description: Remote VTEP IP Address. vrfs: type: list primary_key: name @@ -112,7 +112,7 @@ keys: keys: name: type: str - description: VRF Name + description: VRF Name. convert_types: - int vni: @@ -121,12 +121,12 @@ keys: - str multicast_group: type: str - description: IP Multicast Group Address + description: IP Multicast Group Address. flood_vteps: type: list items: type: str - description: Remote VTEP IP Address + description: Remote VTEP IP Address. flood_vtep_learned_data_plane: type: bool eos_cli: diff --git a/python-avd/pyavd/_eos_designs/__init__.py b/python-avd/pyavd/_eos_designs/__init__.py new file mode 100644 index 00000000000..b17ca7c745d --- /dev/null +++ b/python-avd/pyavd/_eos_designs/__init__.py @@ -0,0 +1,3 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/avdfacts.py b/python-avd/pyavd/_eos_designs/avdfacts.py similarity index 95% rename from ansible_collections/arista/avd/plugins/plugin_utils/avdfacts.py rename to python-avd/pyavd/_eos_designs/avdfacts.py index 89b8fd068f2..d6b82b11271 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/avdfacts.py +++ b/python-avd/pyavd/_eos_designs/avdfacts.py @@ -7,7 +7,7 @@ from typing import TYPE_CHECKING if TYPE_CHECKING: - from ansible_collections.arista.avd.plugins.plugin_utils.eos_designs_shared_utils import SharedUtils + from .shared_utils import SharedUtils class AvdFacts: diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_facts/eos_designs_facts.py b/python-avd/pyavd/_eos_designs/eos_designs_facts/__init__.py similarity index 94% rename from ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_facts/eos_designs_facts.py rename to python-avd/pyavd/_eos_designs/eos_designs_facts/__init__.py index 768ec736b74..0f81294ca8b 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_facts/eos_designs_facts.py +++ b/python-avd/pyavd/_eos_designs/eos_designs_facts/__init__.py @@ -5,10 +5,9 @@ from functools import cached_property -from ansible_collections.arista.avd.plugins.plugin_utils.avdfacts import AvdFacts -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get - +from ..._errors import AristaAvdError +from ..._utils import get +from ..avdfacts import AvdFacts from .mlag import MlagMixin from .overlay import OverlayMixin from .short_esi import ShortEsiMixin @@ -99,7 +98,8 @@ def evpn_multicast(self) -> bool | None: raise AristaAvdError( "'evpn_multicast: True' is only supported in combination with 'underlay_multicast: True' and 'igmp_snooping_enabled : True'" ) - elif self.shared_utils.mlag is True: + + if self.shared_utils.mlag is True: peer_eos_designs_facts: EosDesignsFacts = self.shared_utils.mlag_peer_facts if self.shared_utils.overlay_rd_type_admin_subfield == peer_eos_designs_facts.shared_utils.overlay_rd_type_admin_subfield: raise AristaAvdError( @@ -190,6 +190,14 @@ def inband_ztp(self) -> bool | None: """ return self.shared_utils.inband_ztp + @cached_property + def inband_ztp_vlan(self) -> int | None: + """ + Exposed in avd_switch_facts + """ + if self.shared_utils.inband_ztp: + return self.shared_utils.inband_mgmt_vlan + @cached_property def inband_ztp_lacp_fallback_delay(self) -> int | None: """ diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_facts/mlag.py b/python-avd/pyavd/_eos_designs/eos_designs_facts/mlag.py similarity index 97% rename from ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_facts/mlag.py rename to python-avd/pyavd/_eos_designs/eos_designs_facts/mlag.py index e1509d16b9e..c6abf1af7aa 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_facts/mlag.py +++ b/python-avd/pyavd/_eos_designs/eos_designs_facts/mlag.py @@ -7,7 +7,7 @@ from typing import TYPE_CHECKING if TYPE_CHECKING: - from .eos_designs_facts import EosDesignsFacts + from . import EosDesignsFacts class MlagMixin: diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_facts/overlay.py b/python-avd/pyavd/_eos_designs/eos_designs_facts/overlay.py similarity index 91% rename from ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_facts/overlay.py rename to python-avd/pyavd/_eos_designs/eos_designs_facts/overlay.py index 4c788ab11b8..4e7df3cd619 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_facts/overlay.py +++ b/python-avd/pyavd/_eos_designs/eos_designs_facts/overlay.py @@ -6,10 +6,10 @@ from functools import cached_property from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get +from ..._utils import get if TYPE_CHECKING: - from .eos_designs_facts import EosDesignsFacts + from . import EosDesignsFacts class OverlayMixin: @@ -44,8 +44,7 @@ def evpn_route_servers(self: EosDesignsFacts) -> list: if self.shared_utils.underlay_router is True: if self.evpn_role == "client": return get(self.shared_utils.switch_data_combined, "evpn_route_servers", default=self.shared_utils.uplink_switches) - else: - return get(self.shared_utils.switch_data_combined, "evpn_route_servers") + return get(self.shared_utils.switch_data_combined, "evpn_route_servers") return [] @cached_property diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_facts/short_esi.py b/python-avd/pyavd/_eos_designs/eos_designs_facts/short_esi.py similarity index 91% rename from ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_facts/short_esi.py rename to python-avd/pyavd/_eos_designs/eos_designs_facts/short_esi.py index 26ff0e3fab9..046a2d54da0 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_facts/short_esi.py +++ b/python-avd/pyavd/_eos_designs/eos_designs_facts/short_esi.py @@ -8,10 +8,10 @@ from hashlib import sha256 from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.utils import default, get +from ..._utils import default, get if TYPE_CHECKING: - from .eos_designs_facts import EosDesignsFacts + from . import EosDesignsFacts class ShortEsiMixin: diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_facts/uplinks.py b/python-avd/pyavd/_eos_designs/eos_designs_facts/uplinks.py similarity index 96% rename from ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_facts/uplinks.py rename to python-avd/pyavd/_eos_designs/eos_designs_facts/uplinks.py index 13e36c69493..fd667099d8e 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_facts/uplinks.py +++ b/python-avd/pyavd/_eos_designs/eos_designs_facts/uplinks.py @@ -7,13 +7,12 @@ from functools import cached_property from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.filter.list_compress import list_compress -from ansible_collections.arista.avd.plugins.filter.range_expand import range_expand -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError -from ansible_collections.arista.avd.plugins.plugin_utils.utils import append_if_not_duplicate, get, unique +from ..._errors import AristaAvdError +from ..._utils import append_if_not_duplicate, get, unique +from ...j2filters import list_compress, range_expand if TYPE_CHECKING: - from .eos_designs_facts import EosDesignsFacts + from . import EosDesignsFacts class UplinksMixin: @@ -70,7 +69,7 @@ def _uplink_port_channel_id(self: EosDesignsFacts) -> int: # produce an error if the switch is MLAG and port-channel ID is above 2000 if self.shared_utils.mlag: - if not (1 <= uplink_port_channel_id <= 2000): + if not 1 <= uplink_port_channel_id <= 2000: raise AristaAvdError( f"'uplink_port_channel_id' must be between 1 and 2000 for MLAG switches. Got '{uplink_port_channel_id}' on '{self.shared_utils.hostname}'." ) @@ -113,7 +112,7 @@ def _uplink_switch_port_channel_id(self: EosDesignsFacts) -> int: uplink_switch_facts: EosDesignsFacts = self.shared_utils.get_peer_facts(self.shared_utils.uplink_switches[0], required=True) if uplink_switch_facts.shared_utils.mlag: - if not (1 <= uplink_switch_port_channel_id <= 2000): + if not 1 <= uplink_switch_port_channel_id <= 2000: raise AristaAvdError( f"'uplink_switch_port_channel_id' must be between 1 and 2000 for MLAG switches. Got '{uplink_switch_port_channel_id}' on" f" '{self.shared_utils.hostname}'." @@ -250,7 +249,13 @@ def _get_port_channel_uplink(self: EosDesignsFacts, uplink_index: int, uplink_in return uplink - def _get_l2_uplink(self: EosDesignsFacts, uplink_index: int, uplink_interface: str, uplink_switch: str, uplink_switch_interface: str) -> dict: + def _get_l2_uplink( + self: EosDesignsFacts, + uplink_index: int, # pylint: disable=unused-argument + uplink_interface: str, + uplink_switch: str, + uplink_switch_interface: str, + ) -> dict: """ Return a single uplink dictionary for an L2 uplink. Reused for both uplink_type port-channel, lan and TODO lan-port-channel. """ diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_facts/vlans.py b/python-avd/pyavd/_eos_designs/eos_designs_facts/vlans.py similarity index 94% rename from ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_facts/vlans.py rename to python-avd/pyavd/_eos_designs/eos_designs_facts/vlans.py index 7b1500e5db4..e3e8fdccf1b 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_facts/vlans.py +++ b/python-avd/pyavd/_eos_designs/eos_designs_facts/vlans.py @@ -7,13 +7,11 @@ from functools import cached_property from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.filter.convert_dicts import convert_dicts -from ansible_collections.arista.avd.plugins.filter.list_compress import list_compress -from ansible_collections.arista.avd.plugins.filter.range_expand import range_expand -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get +from ..._utils import get +from ...j2filters import convert_dicts, list_compress, range_expand if TYPE_CHECKING: - from .eos_designs_facts import EosDesignsFacts + from . import EosDesignsFacts class VlansMixin: @@ -178,11 +176,11 @@ def _endpoint_vlans(self: EosDesignsFacts) -> set[int]: if not self.shared_utils.filter_only_vlans_in_use: return set() - endpoint_vlans, endpoint_trunk_groups = self._endpoint_vlans_and_trunk_groups + endpoint_vlans, _ = self._endpoint_vlans_and_trunk_groups if not self.shared_utils.mlag: return endpoint_vlans - mlag_endpoint_vlans, mlag_endpoint_trunk_groups = self._mlag_peer_endpoint_vlans_and_trunk_groups + mlag_endpoint_vlans, _ = self._mlag_peer_endpoint_vlans_and_trunk_groups return endpoint_vlans.union(mlag_endpoint_vlans) @@ -205,11 +203,11 @@ def _endpoint_trunk_groups(self: EosDesignsFacts) -> set[str]: if not self.shared_utils.filter_only_vlans_in_use: return set() - endpoint_vlans, endpoint_trunk_groups = self._endpoint_vlans_and_trunk_groups + _, endpoint_trunk_groups = self._endpoint_vlans_and_trunk_groups if not self.shared_utils.mlag: return endpoint_trunk_groups - mlag_endpoint_vlans, mlag_endpoint_trunk_groups = self._mlag_peer_endpoint_vlans_and_trunk_groups + _, mlag_endpoint_trunk_groups = self._mlag_peer_endpoint_vlans_and_trunk_groups return endpoint_trunk_groups.union(mlag_endpoint_trunk_groups) @cached_property @@ -220,7 +218,7 @@ def local_endpoint_trunk_groups(self: EosDesignsFacts) -> list[str]: This is a subset of endpoint_trunk_groups which is used for filtering. """ if self.shared_utils.only_local_vlan_trunk_groups: - local_endpoint_vlans, local_endpoint_trunk_groups = self._local_endpoint_vlans_and_trunk_groups + _, local_endpoint_trunk_groups = self._local_endpoint_vlans_and_trunk_groups return list(local_endpoint_trunk_groups) return [] diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_facts/wan.py b/python-avd/pyavd/_eos_designs/eos_designs_facts/wan.py similarity index 94% rename from ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_facts/wan.py rename to python-avd/pyavd/_eos_designs/eos_designs_facts/wan.py index 1bffca21939..103901bff16 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_facts/wan.py +++ b/python-avd/pyavd/_eos_designs/eos_designs_facts/wan.py @@ -6,10 +6,10 @@ from functools import cached_property from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.filter.natural_sort import natural_sort +from ...j2filters import natural_sort if TYPE_CHECKING: - from .eos_designs_facts import EosDesignsFacts + from . import EosDesignsFacts class WanMixin: diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/interface_descriptions/avdinterfacedescriptions.py b/python-avd/pyavd/_eos_designs/interface_descriptions/__init__.py similarity index 97% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/interface_descriptions/avdinterfacedescriptions.py rename to python-avd/pyavd/_eos_designs/interface_descriptions/__init__.py index f364e22a5f1..28f1de10984 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/interface_descriptions/avdinterfacedescriptions.py +++ b/python-avd/pyavd/_eos_designs/interface_descriptions/__init__.py @@ -3,8 +3,7 @@ # that can be found in the LICENSE file. from collections import ChainMap -from ansible_collections.arista.avd.plugins.plugin_utils.avdfacts import AvdFacts - +from ..avdfacts import AvdFacts from .models import InterfaceDescriptionData from .utils import UtilsMixin @@ -23,7 +22,7 @@ class AvdInterfaceDescriptions(AvdFacts, UtilsMixin): Other attributes are "stable" and changes follow semver practices: - Existing attributes will not be changed in terms of type and value, but the underlying code for cached_properties may change. - - New attributes may be added in minor relases. + - New attributes may be added in minor releases. - The __init__ method may change between minor versions as the data may need to be consumed from other sources. - Breaking changes may happen between major releases or in rare cases for bug fixes. """ @@ -132,7 +131,10 @@ def mlag_ethernet_interfaces(self, mlag_interface: str) -> str: return f"MLAG_PEER_{self._mlag_peer}_{mlag_interface}" - def mlag_port_channel_interface(self, data: InterfaceDescriptionData) -> str: + def mlag_port_channel_interface( + self, + data: InterfaceDescriptionData, # pylint: disable=unused-argument + ) -> str: """ Available data: - mlag_peer diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/interface_descriptions/models.py b/python-avd/pyavd/_eos_designs/interface_descriptions/models.py similarity index 95% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/interface_descriptions/models.py rename to python-avd/pyavd/_eos_designs/interface_descriptions/models.py index e86073e43b4..e714c99daa1 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/interface_descriptions/models.py +++ b/python-avd/pyavd/_eos_designs/interface_descriptions/models.py @@ -7,7 +7,7 @@ from typing import TYPE_CHECKING if TYPE_CHECKING: - from ansible_collections.arista.avd.plugins.plugin_utils.eos_designs_shared_utils import SharedUtils + from ..shared_utils import SharedUtils class InterfaceDescriptionData: @@ -19,7 +19,7 @@ class InterfaceDescriptionData: Other attributes are "stable" and changes follow semver practices: - Existing attributes will not be changed in terms of type and value, but the underlying code for cached_properties may change. - - New attributes may be added in minor relases. + - New attributes may be added in minor releases. - The __init__ method may change between minor versions as the data may need to be consumed from other sources. - Breaking changes may happen between major releases. """ diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/interface_descriptions/utils.py b/python-avd/pyavd/_eos_designs/interface_descriptions/utils.py similarity index 76% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/interface_descriptions/utils.py rename to python-avd/pyavd/_eos_designs/interface_descriptions/utils.py index 0d7f573f6bb..f3c2c0f82cf 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/interface_descriptions/utils.py +++ b/python-avd/pyavd/_eos_designs/interface_descriptions/utils.py @@ -7,7 +7,7 @@ from typing import TYPE_CHECKING if TYPE_CHECKING: - from ansible_collections.arista.avd.plugins.plugin_utils.eos_designs_shared_utils import SharedUtils + from . import AvdInterfaceDescriptions class UtilsMixin: @@ -16,30 +16,27 @@ class UtilsMixin: Class should only be used as Mixin to an AvdInterfaceDescriptions class """ - _hostvars: dict - shared_utils: SharedUtils - @cached_property - def _mpls_overlay_role(self) -> str: + def _mpls_overlay_role(self: AvdInterfaceDescriptions) -> str: """TODO: AVD5.0.0 remove this since it has been replaced by DescriptionData.""" return self.shared_utils.mpls_overlay_role @cached_property - def _overlay_routing_protocol(self) -> str: + def _overlay_routing_protocol(self: AvdInterfaceDescriptions) -> str: """TODO: AVD5.0.0 remove this since it has been replaced by DescriptionData.""" return self.shared_utils.overlay_routing_protocol @cached_property - def _mlag_peer(self) -> str: + def _mlag_peer(self: AvdInterfaceDescriptions) -> str: """TODO: AVD5.0.0 remove this since it has been replaced by DescriptionData.""" return self.shared_utils.mlag_peer @cached_property - def _mlag_port_channel_id(self) -> str: + def _mlag_port_channel_id(self: AvdInterfaceDescriptions) -> str: """TODO: AVD5.0.0 remove this since it has been replaced by DescriptionData.""" return self.shared_utils.mlag_port_channel_id @cached_property - def _mpls_lsr(self) -> str: + def _mpls_lsr(self: AvdInterfaceDescriptions) -> str: """TODO: AVD5.0.0 remove this since it has been replaced by DescriptionData.""" return self.shared_utils.mpls_lsr diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/ip_addressing/avdipaddressing.py b/python-avd/pyavd/_eos_designs/ip_addressing/__init__.py similarity index 87% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/ip_addressing/avdipaddressing.py rename to python-avd/pyavd/_eos_designs/ip_addressing/__init__.py index cb02cbd9c1c..fb7c1cae2cf 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/ip_addressing/avdipaddressing.py +++ b/python-avd/pyavd/_eos_designs/ip_addressing/__init__.py @@ -4,10 +4,9 @@ import ipaddress from collections import ChainMap -from ansible_collections.arista.avd.plugins.plugin_utils.avdfacts import AvdFacts -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get_ip_from_pool - +from ..._errors import AristaAvdError +from ..._utils import get_ip_from_pool +from ..avdfacts import AvdFacts from .utils import UtilsMixin @@ -32,7 +31,7 @@ def _template(self, template_path, **kwargs): template_vars = ChainMap(kwargs, self._hostvars) return self.shared_utils.template_var(template_path, template_vars) - def _mlag_ip(self, pool: str, ip_offset: int) -> str: + def _mlag_ip(self, pool: str, ip_offset: int, address_family: str = "ipv4") -> str: """ Different addressing algorithms: - first_id: offset from pool is `(mlag_primary_id - 1) * 2` @@ -40,7 +39,10 @@ def _mlag_ip(self, pool: str, ip_offset: int) -> str: - same_subnet: offset from pool is always 0. All MLAG pairs will be using the same subnet (default /31). Requires the pool to have the same prefix length. """ - prefixlen = self._fabric_ip_addressing_mlag_ipv4_prefix_length + if address_family == "ipv6": + prefixlen = self._fabric_ip_addressing_mlag_ipv6_prefix_length + else: + prefixlen = self._fabric_ip_addressing_mlag_ipv4_prefix_length if self._fabric_ipaddress_mlag_algorithm == "odd_id": offset = self._mlag_odd_id_based_offset return get_ip_from_pool(pool, prefixlen, offset, ip_offset) @@ -85,6 +87,17 @@ def mlag_ip_primary(self) -> str: Default pool is "mlag_peer_ipv4_pool" """ + if self.shared_utils.mlag_peer_address_family == "ipv6": + if template_path := self.shared_utils.ip_addressing_templates.get("mlag_ip_primary"): + return self._template( + template_path, + mlag_primary_id=self._mlag_primary_id, + mlag_secondary_id=self._mlag_secondary_id, + switch_data={"combined": {"mlag_peer_ipv6_pool": self._mlag_peer_ipv6_pool}}, + ) + + return self._mlag_ip(self._mlag_peer_ipv6_pool, 0, self.shared_utils.mlag_peer_address_family) + if template_path := self.shared_utils.ip_addressing_templates.get("mlag_ip_primary"): return self._template( template_path, @@ -101,6 +114,17 @@ def mlag_ip_secondary(self) -> str: Default pool is "mlag_peer_ipv4_pool" """ + if self.shared_utils.mlag_peer_address_family == "ipv6": + if template_path := self.shared_utils.ip_addressing_templates.get("mlag_ip_secondary"): + return self._template( + template_path, + mlag_primary_id=self._mlag_primary_id, + mlag_secondary_id=self._mlag_secondary_id, + switch_data={"combined": {"mlag_peer_ipv6_pool": self._mlag_peer_ipv6_pool}}, + ) + + return self._mlag_ip(self._mlag_peer_ipv6_pool, 1, self.shared_utils.mlag_peer_address_family) + if template_path := self.shared_utils.ip_addressing_templates.get("mlag_ip_secondary"): return self._template( template_path, @@ -265,7 +289,7 @@ def evpn_underlay_l3_multicast_group( self, underlay_l3_multicast_group_ipv4_pool: str, vrf_vni: int, - vrf_id: int, + vrf_id: int, # pylint: disable=unused-argument evpn_underlay_l3_multicast_group_ipv4_pool_offset: int, ) -> str: """ diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/ip_addressing/utils.py b/python-avd/pyavd/_eos_designs/ip_addressing/utils.py similarity index 76% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/ip_addressing/utils.py rename to python-avd/pyavd/_eos_designs/ip_addressing/utils.py index 2222cbfd63a..e6c06dff9fa 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/ip_addressing/utils.py +++ b/python-avd/pyavd/_eos_designs/ip_addressing/utils.py @@ -6,12 +6,12 @@ from functools import cached_property from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.filter.range_expand import range_expand -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError, AristaAvdMissingVariableError -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get +from ..._errors import AristaAvdError, AristaAvdMissingVariableError +from ..._utils import get +from ...j2filters import range_expand if TYPE_CHECKING: - from .avdipaddressing import AvdIpAddressing + from . import AvdIpAddressing class UtilsMixin: @@ -21,79 +21,87 @@ class UtilsMixin: """ @cached_property - def _mlag_primary_id(self: "AvdIpAddressing") -> int: + def _mlag_primary_id(self: AvdIpAddressing) -> int: if self.shared_utils.mlag_switch_ids is None or self.shared_utils.mlag_switch_ids.get("primary") is None: raise AristaAvdMissingVariableError("'mlag_switch_ids' is required to calculate MLAG IP addresses") return self.shared_utils.mlag_switch_ids["primary"] @cached_property - def _mlag_secondary_id(self: "AvdIpAddressing") -> int: + def _mlag_secondary_id(self: AvdIpAddressing) -> int: if self.shared_utils.mlag_switch_ids is None or self.shared_utils.mlag_switch_ids.get("secondary") is None: raise AristaAvdMissingVariableError("'mlag_switch_ids' is required to calculate MLAG IP addresses") return self.shared_utils.mlag_switch_ids["secondary"] @cached_property - def _fabric_ipaddress_mlag_algorithm(self: "AvdIpAddressing") -> str: + def _fabric_ipaddress_mlag_algorithm(self: AvdIpAddressing) -> str: return self.shared_utils.fabric_ip_addressing_mlag_algorithm @cached_property - def _fabric_ip_addressing_mlag_ipv4_prefix_length(self: "AvdIpAddressing") -> int: + def _fabric_ip_addressing_mlag_ipv4_prefix_length(self: AvdIpAddressing) -> int: return self.shared_utils.fabric_ip_addressing_mlag_ipv4_prefix_length @cached_property - def _fabric_ip_addressing_p2p_uplinks_ipv4_prefix_length(self: "AvdIpAddressing") -> int: + def _fabric_ip_addressing_mlag_ipv6_prefix_length(self: AvdIpAddressing) -> int: + return self.shared_utils.fabric_ip_addressing_mlag_ipv6_prefix_length + + @cached_property + def _fabric_ip_addressing_p2p_uplinks_ipv4_prefix_length(self: AvdIpAddressing) -> int: return self.shared_utils.fabric_ip_addressing_p2p_uplinks_ipv4_prefix_length @cached_property - def _mlag_peer_ipv4_pool(self: "AvdIpAddressing") -> str: + def _mlag_peer_ipv4_pool(self: AvdIpAddressing) -> str: return self.shared_utils.mlag_peer_ipv4_pool @cached_property - def _mlag_peer_l3_ipv4_pool(self: "AvdIpAddressing") -> str: + def _mlag_peer_ipv6_pool(self: AvdIpAddressing) -> str: + return self.shared_utils.mlag_peer_ipv6_pool + + @cached_property + def _mlag_peer_l3_ipv4_pool(self: AvdIpAddressing) -> str: return self.shared_utils.mlag_peer_l3_ipv4_pool @cached_property - def _uplink_ipv4_pool(self: "AvdIpAddressing") -> str: + def _uplink_ipv4_pool(self: AvdIpAddressing) -> str: if self.shared_utils.uplink_ipv4_pool is None: raise AristaAvdMissingVariableError("'uplink_ipv4_pool' is required to calculate uplink IP addresses") return self.shared_utils.uplink_ipv4_pool @cached_property - def _id(self: "AvdIpAddressing") -> int: + def _id(self: AvdIpAddressing) -> int: if self.shared_utils.id is None: raise AristaAvdMissingVariableError("'id' is required to calculate IP addresses") return self.shared_utils.id @cached_property - def _max_uplink_switches(self: "AvdIpAddressing") -> int: + def _max_uplink_switches(self: AvdIpAddressing) -> int: return self.shared_utils.max_uplink_switches @cached_property - def _max_parallel_uplinks(self: "AvdIpAddressing") -> int: + def _max_parallel_uplinks(self: AvdIpAddressing) -> int: return self.shared_utils.max_parallel_uplinks @cached_property - def _loopback_ipv4_pool(self: "AvdIpAddressing") -> str: + def _loopback_ipv4_pool(self: AvdIpAddressing) -> str: return self.shared_utils.loopback_ipv4_pool @cached_property - def _loopback_ipv4_offset(self: "AvdIpAddressing") -> int: + def _loopback_ipv4_offset(self: AvdIpAddressing) -> int: return self.shared_utils.loopback_ipv4_offset @cached_property - def _loopback_ipv6_pool(self: "AvdIpAddressing") -> str: + def _loopback_ipv6_pool(self: AvdIpAddressing) -> str: return self.shared_utils.loopback_ipv6_pool @cached_property - def _loopback_ipv6_offset(self: "AvdIpAddressing") -> int: + def _loopback_ipv6_offset(self: AvdIpAddressing) -> int: return self.shared_utils.loopback_ipv6_offset @cached_property - def _vtep_loopback_ipv4_pool(self: "AvdIpAddressing") -> str: + def _vtep_loopback_ipv4_pool(self: AvdIpAddressing) -> str: return self.shared_utils.vtep_loopback_ipv4_pool @cached_property - def _mlag_odd_id_based_offset(self: "AvdIpAddressing") -> int: + def _mlag_odd_id_based_offset(self: AvdIpAddressing) -> int: """ Return the subnet offset for an MLAG pair based on odd id @@ -110,7 +118,7 @@ def _mlag_odd_id_based_offset(self: "AvdIpAddressing") -> int: return int((odd_id - 1) / 2) - def _get_downlink_ipv4_pool_and_offset(self: "AvdIpAddressing", uplink_switch_index: int) -> tuple[str, int]: + def _get_downlink_ipv4_pool_and_offset(self: AvdIpAddressing, uplink_switch_index: int) -> tuple[str, int]: """ Returns the downlink IP pool and offset as a tuple according to the uplink_switch_index @@ -139,7 +147,7 @@ def _get_downlink_ipv4_pool_and_offset(self: "AvdIpAddressing", uplink_switch_in "in the downlink_switch does not match any of the downlink_pools" ) - def _get_p2p_ipv4_pool_and_offset(self: "AvdIpAddressing", uplink_switch_index: int) -> tuple[str, int]: + def _get_p2p_ipv4_pool_and_offset(self: AvdIpAddressing, uplink_switch_index: int) -> tuple[str, int]: """ Returns IP pool and offset as a tuple according to the uplink_switch_index @@ -151,7 +159,7 @@ def _get_p2p_ipv4_pool_and_offset(self: "AvdIpAddressing", uplink_switch_index: """ uplink_pool = self.shared_utils.uplink_ipv4_pool - if self.shared_utils.uplink_ipv4_pool: + if uplink_pool is not None: uplink_offset = ((self._id - 1) * self._max_uplink_switches * self._max_parallel_uplinks) + uplink_switch_index downlink_pool, downlink_offset = self._get_downlink_ipv4_pool_and_offset(uplink_switch_index) @@ -167,7 +175,7 @@ def _get_p2p_ipv4_pool_and_offset(self: "AvdIpAddressing", uplink_switch_index: "Unable to assign IPs for uplinks. Either 'uplink_ipv4_pool' on this switch or 'downlink_pools' on all the uplink switches" ) - if downlink_pool is None: + if uplink_pool is not None: return (uplink_pool, uplink_offset) return (downlink_pool, downlink_offset) diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/eos_designs.jsonschema.json b/python-avd/pyavd/_eos_designs/schema/eos_designs.jsonschema.json similarity index 86% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/eos_designs.jsonschema.json rename to python-avd/pyavd/_eos_designs/schema/eos_designs.jsonschema.json index c3f73661a78..44131dff2b7 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/eos_designs.jsonschema.json +++ b/python-avd/pyavd/_eos_designs/schema/eos_designs.jsonschema.json @@ -135,7 +135,7 @@ "properties": { "ipv4_applications": { "type": "array", - "description": "List of user defined IPv4 applications.", + "description": "List of user defined IPv4 applications. The name should be unique over all defined applications (ipv4 and l4).", "items": { "type": "object", "properties": { @@ -156,7 +156,7 @@ }, "protocols": { "type": "array", - "description": "List of protocols to consider for this application.\n\nTo use port field-sets (source, destination or both), the list\nmust contain only one or two protocols, either `tcp` or `udp`.\nWhen using both protocols, one line is rendered for each in the configuration,\nhence the field-sets must have the same value for `tcp_src_port_set_name` and\n`udp_src_port_set_name` and for `tcp_dest_port_set_name` and `udp_dest_port_set_name`\nif set in order to generate valid configuration in EOS.", + "description": "List of protocols to consider for this application.\nTo use port field-sets (source, destination or both), the list\nmust contain only one or two protocols, either `tcp` or `udp`.\nWhen using both protocols, one line is rendered for each in the configuration,\nhence the field-sets must have the same value for `tcp_src_port_set_name` and\n`udp_src_port_set_name` and for `tcp_dest_port_set_name` and `udp_dest_port_set_name`\nif set in order to generate valid configuration in EOS.", "items": { "type": "string", "enum": [ @@ -176,7 +176,7 @@ }, "protocol_ranges": { "type": "array", - "description": "Acccept protocol value(s) or range(s).\nProtocol values can be between 1 and 255.", + "description": "Accept protocol value(s) or range(s).\nProtocol values can be between 1 and 255.", "items": { "type": "string" }, @@ -184,22 +184,22 @@ }, "udp_src_port_set_name": { "type": "string", - "description": "Name of field set for UDP source ports.\n\nWhen the `protocols` list contain both `tcp` and `udp`, this key value\nmust be the same as `tcp_src_port_set_name`.", + "description": "Name of field set for UDP source ports.\nWhen the `protocols` list contain both `tcp` and `udp`, this key value\nmust be the same as `tcp_src_port_set_name`.", "title": "UDP Src Port Set Name" }, "tcp_src_port_set_name": { "type": "string", - "description": "Name of field set for TCP source ports.\n\nWhen the `protocols` list contain both `tcp` and `udp`, this key value\nmust be the same as `udp_src_port_set_name`.", + "description": "Name of field set for TCP source ports.\nWhen the `protocols` list contain both `tcp` and `udp`, this key value\nmust be the same as `udp_src_port_set_name`.", "title": "TCP Src Port Set Name" }, "udp_dest_port_set_name": { "type": "string", - "description": "Name of field set for UDP destination ports.\n\nWhen the `protocols` list contain both `tcp` and `udp`, this key value\nmust be the same as `tcp_dest_port_set_name`.", + "description": "Name of field set for UDP destination ports.\nWhen the `protocols` list contain both `tcp` and `udp`, this key value\nmust be the same as `tcp_dest_port_set_name`.", "title": "UDP Dest Port Set Name" }, "tcp_dest_port_set_name": { "type": "string", - "description": "Name of field set for TCP destination ports.\n\nWhen the `protocols` list contain both `tcp` and `udp`, this key value\nmust be the same as `udp_dest_port_set_name`.", + "description": "Name of field set for TCP destination ports.\nWhen the `protocols` list contain both `tcp` and `udp`, this key value\nmust be the same as `udp_dest_port_set_name`.", "title": "TCP Dest Port Set Name" } }, @@ -212,6 +212,76 @@ ] }, "title": "IPv4 Applications" + }, + "l4_applications": { + "type": "array", + "description": "List of user defined L4 applications. The name should be unique over all defined applications (ipv4 and l4).", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Application name.", + "title": "Name" + }, + "protocols": { + "type": "array", + "description": "List of protocols to consider for this application.\nTo use port field-sets (source, destination or both), the list\nmust contain only one or two protocols, either `tcp` or `udp`.\nWhen using both protocols, one line is rendered for each in the configuration,\nhence the field-sets must have the same value for `tcp_src_port_set_name` and\n`udp_src_port_set_name` and for `tcp_dest_port_set_name` and `udp_dest_port_set_name`\nif set in order to generate valid configuration in EOS.", + "items": { + "type": "string", + "enum": [ + "ahp", + "esp", + "icmp", + "igmp", + "ospf", + "pim", + "rsvp", + "tcp", + "udp", + "vrrp" + ] + }, + "title": "Protocols" + }, + "protocol_ranges": { + "type": "array", + "description": "Accept protocol value(s) or range(s).\nProtocol values can be between 1 and 255.", + "items": { + "type": "string" + }, + "title": "Protocol Ranges" + }, + "udp_src_port_set_name": { + "type": "string", + "description": "Name of field set for UDP source ports.\nWhen the `protocols` list contain both `tcp` and `udp`, this key value\nmust be the same as `tcp_src_port_set_name`.", + "title": "UDP Src Port Set Name" + }, + "tcp_src_port_set_name": { + "type": "string", + "description": "Name of field set for TCP source ports.\nWhen the `protocols` list contain both `tcp` and `udp`, this key value\nmust be the same as `udp_src_port_set_name`.", + "title": "TCP Src Port Set Name" + }, + "udp_dest_port_set_name": { + "type": "string", + "description": "Name of field set for UDP destination ports.\nWhen the `protocols` list contain both `tcp` and `udp`, this key value\nmust be the same as `tcp_dest_port_set_name`.", + "title": "UDP Dest Port Set Name" + }, + "tcp_dest_port_set_name": { + "type": "string", + "description": "Name of field set for TCP destination ports.\nWhen the `protocols` list contain both `tcp` and `udp`, this key value\nmust be the same as `udp_dest_port_set_name`.", + "title": "TCP Dest Port Set Name" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "title": "L4 Applications" } }, "additionalProperties": false, @@ -344,7 +414,7 @@ "quiet" ], "default": "debug", - "description": "Conversion Mode for AVD input data conversion.\nInput data conversion will perform type conversion of input variables as defined in the schema.\nThe type conversion is intended to help the user to identify minor issues with the input data, while still allowing the data to be validated.\nDuring conversion, messages will generated with information about the host(s) and key(s) which required conversion.\n\"disabled\" means that conversion will not run - avoid this since conversion is also handling data deprecation and upgrade.\n\"error\" will produce error messages and fail the task.\n\"warning\" will produce warning messages.\n\"info\" will produce regular log messages.\n\"debug\" will produce hidden debug messages viewable with -v.\n\"quiet\" will not produce any messages\n", + "description": "Conversion Mode for AVD input data conversion.\nInput data conversion will perform type conversion of input variables as defined in the schema.\nThe type conversion is intended to help the user to identify minor issues with the input data, while still allowing the data to be validated.\nDuring conversion, messages will generated with information about the host(s) and key(s) which required conversion.\n\"disabled\" means that conversion will not run - avoid this since conversion is also handling data deprecation and upgrade.\n\"error\" will produce error messages and fail the task.\n\"warning\" will produce warning messages.\n\"info\" will produce regular log messages.\n\"debug\" will produce hidden debug messages viewable with -v.\n\"quiet\" will not produce any messages.\n", "title": "AVD Data Conversion Mode" }, "avd_data_validation_mode": { @@ -518,12 +588,12 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "type": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Type" }, "remote_as": { @@ -546,16 +616,16 @@ }, "as_path": { "type": "object", - "description": "BGP AS-PATH options", + "description": "BGP AS-PATH options.", "properties": { "remote_as_replace_out": { "type": "boolean", - "description": "Replace AS number with local AS number", + "description": "Replace AS number with local AS number.", "title": "Remote As Replace Out" }, "prepend_own_disabled": { "type": "boolean", - "description": "Disable prepending own AS number to AS path", + "description": "Disable prepending own AS number to AS path.", "title": "Prepend Own Disabled" } }, @@ -567,7 +637,7 @@ }, "remove_private_as": { "type": "object", - "description": "Remove private AS numbers in outbound AS path", + "description": "Remove private AS numbers in outbound AS path.", "properties": { "enabled": { "type": "boolean", @@ -608,7 +678,7 @@ }, "peer_filter": { "type": "string", - "description": "Peer-filter name\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", + "description": "Peer-filter name.\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", "deprecated": true, "title": "Peer Filter" }, @@ -618,7 +688,7 @@ }, "update_source": { "type": "string", - "description": "IP address or interface name", + "description": "IP address or interface name.", "title": "Update Source" }, "route_reflector_client": { @@ -670,7 +740,7 @@ "type": "integer", "minimum": 1, "maximum": 255, - "description": "Time-to-live in range of hops", + "description": "Time-to-live in range of hops.", "title": "Ebgp Multihop" }, "next_hop_self": { @@ -698,7 +768,7 @@ }, "route_map": { "type": "string", - "description": "Route-map name", + "description": "Route-map name.", "title": "Route Map" } }, @@ -710,25 +780,114 @@ }, "send_community": { "type": "string", - "description": "'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'", + "description": "'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'.", "title": "Send Community" }, "maximum_routes": { "type": "integer", - "description": "Maximum number of routes (0 means unlimited)", + "description": "Maximum number of routes (0 means unlimited).", "minimum": 0, "maximum": 4294967294, "title": "Maximum Routes" }, "maximum_routes_warning_limit": { "type": "string", - "description": "Maximum number of routes after which a warning is issued (0 means never warn) or\nPercentage of maximum number of routes at which to warn (\"<1-100> percent\")\n", + "description": "Maximum number of routes after which a warning is issued (0 means never warn) or\nPercentage of maximum number of routes at which to warn (\"<1-100> percent\").\n", "title": "Maximum Routes Warning Limit" }, "maximum_routes_warning_only": { "type": "boolean", "title": "Maximum Routes Warning Only" }, + "missing_policy": { + "type": "object", + "description": "Missing policy configuration for all address-families.", + "properties": { + "direction_in": { + "description": "Missing policy inbound direction.", + "type": "object", + "properties": { + "action": { + "description": "Missing policy action.", + "type": "string", + "enum": [ + "deny", + "permit", + "deny-in-out" + ], + "title": "Action" + }, + "include_community_list": { + "type": "boolean", + "description": "Include community-list references in missing policy decision.", + "title": "Include Community List" + }, + "include_prefix_list": { + "type": "boolean", + "description": "Include prefix-list references in missing policy decision.", + "title": "Include Prefix List" + }, + "include_sub_route_map": { + "type": "boolean", + "description": "Include sub-route-map references in missing policy decision.", + "title": "Include Sub Route Map" + } + }, + "required": [ + "action" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Direction In" + }, + "direction_out": { + "description": "Missing policy outbound direction.", + "type": "object", + "properties": { + "action": { + "description": "Missing policy action.", + "type": "string", + "enum": [ + "deny", + "permit", + "deny-in-out" + ], + "title": "Action" + }, + "include_community_list": { + "type": "boolean", + "description": "Include community-list references in missing policy decision.", + "title": "Include Community List" + }, + "include_prefix_list": { + "type": "boolean", + "description": "Include prefix-list references in missing policy decision.", + "title": "Include Prefix List" + }, + "include_sub_route_map": { + "type": "boolean", + "description": "Include sub-route-map references in missing policy decision.", + "title": "Include Sub Route Map" + } + }, + "required": [ + "action" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Direction Out" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Missing Policy" + }, "link_bandwidth": { "type": "object", "properties": { @@ -738,7 +897,7 @@ }, "default": { "type": "string", - "description": "nn.nn(K|M|G) link speed in bits/second", + "description": "nn.nn(K|M|G) link speed in bits/second.", "title": "Default" } }, @@ -757,7 +916,7 @@ }, "times": { "type": "integer", - "description": "Number of local ASNs allowed in a BGP update", + "description": "Number of local ASNs allowed in a BGP update.", "minimum": 1, "maximum": 10, "title": "Times" @@ -777,7 +936,7 @@ }, "timers": { "type": "string", - "description": "BGP Keepalive and Hold Timer values in seconds as string \"<0-3600> <0-3600>\"", + "description": "BGP Keepalive and Hold Timer values in seconds as string \"<0-3600> <0-3600>\".", "title": "Timers" }, "rib_in_pre_policy_retain": { @@ -800,17 +959,17 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" }, "bgp_listen_range_prefix": { "type": "string", - "description": "IP prefix range\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", + "description": "IP prefix range.\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", "deprecated": true, "title": "BGP Listen Range Prefix" }, @@ -818,6 +977,35 @@ "type": "string", "title": "Session Tracker" }, + "shared_secret": { + "type": "object", + "properties": { + "profile": { + "type": "string", + "description": "Name of profile defined under `management_security`.", + "title": "Profile" + }, + "hash_algorithm": { + "type": "string", + "description": "Note: Algorithm hmac-sha-256 requires EOS version 4.31.1F and above.", + "enum": [ + "aes-128-cmac-96", + "hmac-sha-256", + "hmac-sha1-96" + ], + "title": "Hash Algorithm" + } + }, + "required": [ + "profile", + "hash_algorithm" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Shared Secret" + }, "ttl_maximum_hops": { "type": "integer", "minimum": 0, @@ -864,12 +1052,12 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "type": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Type" }, "remote_as": { @@ -892,16 +1080,16 @@ }, "as_path": { "type": "object", - "description": "BGP AS-PATH options", + "description": "BGP AS-PATH options.", "properties": { "remote_as_replace_out": { "type": "boolean", - "description": "Replace AS number with local AS number", + "description": "Replace AS number with local AS number.", "title": "Remote As Replace Out" }, "prepend_own_disabled": { "type": "boolean", - "description": "Disable prepending own AS number to AS path", + "description": "Disable prepending own AS number to AS path.", "title": "Prepend Own Disabled" } }, @@ -913,7 +1101,7 @@ }, "remove_private_as": { "type": "object", - "description": "Remove private AS numbers in outbound AS path", + "description": "Remove private AS numbers in outbound AS path.", "properties": { "enabled": { "type": "boolean", @@ -954,7 +1142,7 @@ }, "peer_filter": { "type": "string", - "description": "Peer-filter name\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", + "description": "Peer-filter name.\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", "deprecated": true, "title": "Peer Filter" }, @@ -964,7 +1152,7 @@ }, "update_source": { "type": "string", - "description": "IP address or interface name", + "description": "IP address or interface name.", "title": "Update Source" }, "route_reflector_client": { @@ -1016,7 +1204,7 @@ "type": "integer", "minimum": 1, "maximum": 255, - "description": "Time-to-live in range of hops", + "description": "Time-to-live in range of hops.", "title": "Ebgp Multihop" }, "next_hop_self": { @@ -1044,7 +1232,7 @@ }, "route_map": { "type": "string", - "description": "Route-map name", + "description": "Route-map name.", "title": "Route Map" } }, @@ -1056,25 +1244,114 @@ }, "send_community": { "type": "string", - "description": "'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'", + "description": "'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'.", "title": "Send Community" }, "maximum_routes": { "type": "integer", - "description": "Maximum number of routes (0 means unlimited)", + "description": "Maximum number of routes (0 means unlimited).", "minimum": 0, "maximum": 4294967294, "title": "Maximum Routes" }, "maximum_routes_warning_limit": { "type": "string", - "description": "Maximum number of routes after which a warning is issued (0 means never warn) or\nPercentage of maximum number of routes at which to warn (\"<1-100> percent\")\n", + "description": "Maximum number of routes after which a warning is issued (0 means never warn) or\nPercentage of maximum number of routes at which to warn (\"<1-100> percent\").\n", "title": "Maximum Routes Warning Limit" }, "maximum_routes_warning_only": { "type": "boolean", "title": "Maximum Routes Warning Only" }, + "missing_policy": { + "type": "object", + "description": "Missing policy configuration for all address-families.", + "properties": { + "direction_in": { + "description": "Missing policy inbound direction.", + "type": "object", + "properties": { + "action": { + "description": "Missing policy action.", + "type": "string", + "enum": [ + "deny", + "permit", + "deny-in-out" + ], + "title": "Action" + }, + "include_community_list": { + "type": "boolean", + "description": "Include community-list references in missing policy decision.", + "title": "Include Community List" + }, + "include_prefix_list": { + "type": "boolean", + "description": "Include prefix-list references in missing policy decision.", + "title": "Include Prefix List" + }, + "include_sub_route_map": { + "type": "boolean", + "description": "Include sub-route-map references in missing policy decision.", + "title": "Include Sub Route Map" + } + }, + "required": [ + "action" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Direction In" + }, + "direction_out": { + "description": "Missing policy outbound direction.", + "type": "object", + "properties": { + "action": { + "description": "Missing policy action.", + "type": "string", + "enum": [ + "deny", + "permit", + "deny-in-out" + ], + "title": "Action" + }, + "include_community_list": { + "type": "boolean", + "description": "Include community-list references in missing policy decision.", + "title": "Include Community List" + }, + "include_prefix_list": { + "type": "boolean", + "description": "Include prefix-list references in missing policy decision.", + "title": "Include Prefix List" + }, + "include_sub_route_map": { + "type": "boolean", + "description": "Include sub-route-map references in missing policy decision.", + "title": "Include Sub Route Map" + } + }, + "required": [ + "action" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Direction Out" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Missing Policy" + }, "link_bandwidth": { "type": "object", "properties": { @@ -1084,7 +1361,7 @@ }, "default": { "type": "string", - "description": "nn.nn(K|M|G) link speed in bits/second", + "description": "nn.nn(K|M|G) link speed in bits/second.", "title": "Default" } }, @@ -1103,7 +1380,7 @@ }, "times": { "type": "integer", - "description": "Number of local ASNs allowed in a BGP update", + "description": "Number of local ASNs allowed in a BGP update.", "minimum": 1, "maximum": 10, "title": "Times" @@ -1123,7 +1400,7 @@ }, "timers": { "type": "string", - "description": "BGP Keepalive and Hold Timer values in seconds as string \"<0-3600> <0-3600>\"", + "description": "BGP Keepalive and Hold Timer values in seconds as string \"<0-3600> <0-3600>\".", "title": "Timers" }, "rib_in_pre_policy_retain": { @@ -1146,17 +1423,17 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" }, "bgp_listen_range_prefix": { "type": "string", - "description": "IP prefix range\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", + "description": "IP prefix range.\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", "deprecated": true, "title": "BGP Listen Range Prefix" }, @@ -1164,6 +1441,35 @@ "type": "string", "title": "Session Tracker" }, + "shared_secret": { + "type": "object", + "properties": { + "profile": { + "type": "string", + "description": "Name of profile defined under `management_security`.", + "title": "Profile" + }, + "hash_algorithm": { + "type": "string", + "description": "Note: Algorithm hmac-sha-256 requires EOS version 4.31.1F and above.", + "enum": [ + "aes-128-cmac-96", + "hmac-sha-256", + "hmac-sha1-96" + ], + "title": "Hash Algorithm" + } + }, + "required": [ + "profile", + "hash_algorithm" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Shared Secret" + }, "ttl_maximum_hops": { "type": "integer", "minimum": 0, @@ -1210,12 +1516,12 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "type": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Type" }, "remote_as": { @@ -1238,16 +1544,16 @@ }, "as_path": { "type": "object", - "description": "BGP AS-PATH options", + "description": "BGP AS-PATH options.", "properties": { "remote_as_replace_out": { "type": "boolean", - "description": "Replace AS number with local AS number", + "description": "Replace AS number with local AS number.", "title": "Remote As Replace Out" }, "prepend_own_disabled": { "type": "boolean", - "description": "Disable prepending own AS number to AS path", + "description": "Disable prepending own AS number to AS path.", "title": "Prepend Own Disabled" } }, @@ -1259,7 +1565,7 @@ }, "remove_private_as": { "type": "object", - "description": "Remove private AS numbers in outbound AS path", + "description": "Remove private AS numbers in outbound AS path.", "properties": { "enabled": { "type": "boolean", @@ -1300,7 +1606,7 @@ }, "peer_filter": { "type": "string", - "description": "Peer-filter name\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", + "description": "Peer-filter name.\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", "deprecated": true, "title": "Peer Filter" }, @@ -1310,7 +1616,7 @@ }, "update_source": { "type": "string", - "description": "IP address or interface name", + "description": "IP address or interface name.", "title": "Update Source" }, "route_reflector_client": { @@ -1362,7 +1668,7 @@ "type": "integer", "minimum": 1, "maximum": 255, - "description": "Time-to-live in range of hops", + "description": "Time-to-live in range of hops.", "title": "Ebgp Multihop" }, "next_hop_self": { @@ -1390,7 +1696,7 @@ }, "route_map": { "type": "string", - "description": "Route-map name", + "description": "Route-map name.", "title": "Route Map" } }, @@ -1402,25 +1708,114 @@ }, "send_community": { "type": "string", - "description": "'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'", + "description": "'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'.", "title": "Send Community" }, "maximum_routes": { "type": "integer", - "description": "Maximum number of routes (0 means unlimited)", + "description": "Maximum number of routes (0 means unlimited).", "minimum": 0, "maximum": 4294967294, "title": "Maximum Routes" }, "maximum_routes_warning_limit": { "type": "string", - "description": "Maximum number of routes after which a warning is issued (0 means never warn) or\nPercentage of maximum number of routes at which to warn (\"<1-100> percent\")\n", + "description": "Maximum number of routes after which a warning is issued (0 means never warn) or\nPercentage of maximum number of routes at which to warn (\"<1-100> percent\").\n", "title": "Maximum Routes Warning Limit" }, "maximum_routes_warning_only": { "type": "boolean", "title": "Maximum Routes Warning Only" }, + "missing_policy": { + "type": "object", + "description": "Missing policy configuration for all address-families.", + "properties": { + "direction_in": { + "description": "Missing policy inbound direction.", + "type": "object", + "properties": { + "action": { + "description": "Missing policy action.", + "type": "string", + "enum": [ + "deny", + "permit", + "deny-in-out" + ], + "title": "Action" + }, + "include_community_list": { + "type": "boolean", + "description": "Include community-list references in missing policy decision.", + "title": "Include Community List" + }, + "include_prefix_list": { + "type": "boolean", + "description": "Include prefix-list references in missing policy decision.", + "title": "Include Prefix List" + }, + "include_sub_route_map": { + "type": "boolean", + "description": "Include sub-route-map references in missing policy decision.", + "title": "Include Sub Route Map" + } + }, + "required": [ + "action" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Direction In" + }, + "direction_out": { + "description": "Missing policy outbound direction.", + "type": "object", + "properties": { + "action": { + "description": "Missing policy action.", + "type": "string", + "enum": [ + "deny", + "permit", + "deny-in-out" + ], + "title": "Action" + }, + "include_community_list": { + "type": "boolean", + "description": "Include community-list references in missing policy decision.", + "title": "Include Community List" + }, + "include_prefix_list": { + "type": "boolean", + "description": "Include prefix-list references in missing policy decision.", + "title": "Include Prefix List" + }, + "include_sub_route_map": { + "type": "boolean", + "description": "Include sub-route-map references in missing policy decision.", + "title": "Include Sub Route Map" + } + }, + "required": [ + "action" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Direction Out" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Missing Policy" + }, "link_bandwidth": { "type": "object", "properties": { @@ -1430,7 +1825,7 @@ }, "default": { "type": "string", - "description": "nn.nn(K|M|G) link speed in bits/second", + "description": "nn.nn(K|M|G) link speed in bits/second.", "title": "Default" } }, @@ -1449,7 +1844,7 @@ }, "times": { "type": "integer", - "description": "Number of local ASNs allowed in a BGP update", + "description": "Number of local ASNs allowed in a BGP update.", "minimum": 1, "maximum": 10, "title": "Times" @@ -1469,7 +1864,7 @@ }, "timers": { "type": "string", - "description": "BGP Keepalive and Hold Timer values in seconds as string \"<0-3600> <0-3600>\"", + "description": "BGP Keepalive and Hold Timer values in seconds as string \"<0-3600> <0-3600>\".", "title": "Timers" }, "rib_in_pre_policy_retain": { @@ -1492,17 +1887,17 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" }, "bgp_listen_range_prefix": { "type": "string", - "description": "IP prefix range\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", + "description": "IP prefix range.\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", "deprecated": true, "title": "BGP Listen Range Prefix" }, @@ -1510,6 +1905,35 @@ "type": "string", "title": "Session Tracker" }, + "shared_secret": { + "type": "object", + "properties": { + "profile": { + "type": "string", + "description": "Name of profile defined under `management_security`.", + "title": "Profile" + }, + "hash_algorithm": { + "type": "string", + "description": "Note: Algorithm hmac-sha-256 requires EOS version 4.31.1F and above.", + "enum": [ + "aes-128-cmac-96", + "hmac-sha-256", + "hmac-sha1-96" + ], + "title": "Hash Algorithm" + } + }, + "required": [ + "profile", + "hash_algorithm" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Shared Secret" + }, "ttl_maximum_hops": { "type": "integer", "minimum": 0, @@ -1556,12 +1980,12 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "type": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Type" }, "remote_as": { @@ -1584,16 +2008,16 @@ }, "as_path": { "type": "object", - "description": "BGP AS-PATH options", + "description": "BGP AS-PATH options.", "properties": { "remote_as_replace_out": { "type": "boolean", - "description": "Replace AS number with local AS number", + "description": "Replace AS number with local AS number.", "title": "Remote As Replace Out" }, "prepend_own_disabled": { "type": "boolean", - "description": "Disable prepending own AS number to AS path", + "description": "Disable prepending own AS number to AS path.", "title": "Prepend Own Disabled" } }, @@ -1605,7 +2029,7 @@ }, "remove_private_as": { "type": "object", - "description": "Remove private AS numbers in outbound AS path", + "description": "Remove private AS numbers in outbound AS path.", "properties": { "enabled": { "type": "boolean", @@ -1646,7 +2070,7 @@ }, "peer_filter": { "type": "string", - "description": "Peer-filter name\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", + "description": "Peer-filter name.\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", "deprecated": true, "title": "Peer Filter" }, @@ -1656,7 +2080,7 @@ }, "update_source": { "type": "string", - "description": "IP address or interface name", + "description": "IP address or interface name.", "title": "Update Source" }, "route_reflector_client": { @@ -1708,7 +2132,7 @@ "type": "integer", "minimum": 1, "maximum": 255, - "description": "Time-to-live in range of hops", + "description": "Time-to-live in range of hops.", "title": "Ebgp Multihop" }, "next_hop_self": { @@ -1736,7 +2160,7 @@ }, "route_map": { "type": "string", - "description": "Route-map name", + "description": "Route-map name.", "title": "Route Map" } }, @@ -1748,25 +2172,114 @@ }, "send_community": { "type": "string", - "description": "'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'", + "description": "'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'.", "title": "Send Community" }, "maximum_routes": { "type": "integer", - "description": "Maximum number of routes (0 means unlimited)", + "description": "Maximum number of routes (0 means unlimited).", "minimum": 0, "maximum": 4294967294, "title": "Maximum Routes" }, "maximum_routes_warning_limit": { "type": "string", - "description": "Maximum number of routes after which a warning is issued (0 means never warn) or\nPercentage of maximum number of routes at which to warn (\"<1-100> percent\")\n", + "description": "Maximum number of routes after which a warning is issued (0 means never warn) or\nPercentage of maximum number of routes at which to warn (\"<1-100> percent\").\n", "title": "Maximum Routes Warning Limit" }, "maximum_routes_warning_only": { "type": "boolean", "title": "Maximum Routes Warning Only" }, + "missing_policy": { + "type": "object", + "description": "Missing policy configuration for all address-families.", + "properties": { + "direction_in": { + "description": "Missing policy inbound direction.", + "type": "object", + "properties": { + "action": { + "description": "Missing policy action.", + "type": "string", + "enum": [ + "deny", + "permit", + "deny-in-out" + ], + "title": "Action" + }, + "include_community_list": { + "type": "boolean", + "description": "Include community-list references in missing policy decision.", + "title": "Include Community List" + }, + "include_prefix_list": { + "type": "boolean", + "description": "Include prefix-list references in missing policy decision.", + "title": "Include Prefix List" + }, + "include_sub_route_map": { + "type": "boolean", + "description": "Include sub-route-map references in missing policy decision.", + "title": "Include Sub Route Map" + } + }, + "required": [ + "action" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Direction In" + }, + "direction_out": { + "description": "Missing policy outbound direction.", + "type": "object", + "properties": { + "action": { + "description": "Missing policy action.", + "type": "string", + "enum": [ + "deny", + "permit", + "deny-in-out" + ], + "title": "Action" + }, + "include_community_list": { + "type": "boolean", + "description": "Include community-list references in missing policy decision.", + "title": "Include Community List" + }, + "include_prefix_list": { + "type": "boolean", + "description": "Include prefix-list references in missing policy decision.", + "title": "Include Prefix List" + }, + "include_sub_route_map": { + "type": "boolean", + "description": "Include sub-route-map references in missing policy decision.", + "title": "Include Sub Route Map" + } + }, + "required": [ + "action" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Direction Out" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Missing Policy" + }, "link_bandwidth": { "type": "object", "properties": { @@ -1776,7 +2289,7 @@ }, "default": { "type": "string", - "description": "nn.nn(K|M|G) link speed in bits/second", + "description": "nn.nn(K|M|G) link speed in bits/second.", "title": "Default" } }, @@ -1795,7 +2308,7 @@ }, "times": { "type": "integer", - "description": "Number of local ASNs allowed in a BGP update", + "description": "Number of local ASNs allowed in a BGP update.", "minimum": 1, "maximum": 10, "title": "Times" @@ -1815,7 +2328,7 @@ }, "timers": { "type": "string", - "description": "BGP Keepalive and Hold Timer values in seconds as string \"<0-3600> <0-3600>\"", + "description": "BGP Keepalive and Hold Timer values in seconds as string \"<0-3600> <0-3600>\".", "title": "Timers" }, "rib_in_pre_policy_retain": { @@ -1838,17 +2351,17 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" }, "bgp_listen_range_prefix": { "type": "string", - "description": "IP prefix range\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", + "description": "IP prefix range.\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", "deprecated": true, "title": "BGP Listen Range Prefix" }, @@ -1856,6 +2369,35 @@ "type": "string", "title": "Session Tracker" }, + "shared_secret": { + "type": "object", + "properties": { + "profile": { + "type": "string", + "description": "Name of profile defined under `management_security`.", + "title": "Profile" + }, + "hash_algorithm": { + "type": "string", + "description": "Note: Algorithm hmac-sha-256 requires EOS version 4.31.1F and above.", + "enum": [ + "aes-128-cmac-96", + "hmac-sha-256", + "hmac-sha1-96" + ], + "title": "Hash Algorithm" + } + }, + "required": [ + "profile", + "hash_algorithm" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Shared Secret" + }, "ttl_maximum_hops": { "type": "integer", "minimum": 0, @@ -1902,12 +2444,12 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "type": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Type" }, "remote_as": { @@ -1930,16 +2472,16 @@ }, "as_path": { "type": "object", - "description": "BGP AS-PATH options", + "description": "BGP AS-PATH options.", "properties": { "remote_as_replace_out": { "type": "boolean", - "description": "Replace AS number with local AS number", + "description": "Replace AS number with local AS number.", "title": "Remote As Replace Out" }, "prepend_own_disabled": { "type": "boolean", - "description": "Disable prepending own AS number to AS path", + "description": "Disable prepending own AS number to AS path.", "title": "Prepend Own Disabled" } }, @@ -1951,7 +2493,7 @@ }, "remove_private_as": { "type": "object", - "description": "Remove private AS numbers in outbound AS path", + "description": "Remove private AS numbers in outbound AS path.", "properties": { "enabled": { "type": "boolean", @@ -1992,7 +2534,7 @@ }, "peer_filter": { "type": "string", - "description": "Peer-filter name\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", + "description": "Peer-filter name.\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", "deprecated": true, "title": "Peer Filter" }, @@ -2002,7 +2544,7 @@ }, "update_source": { "type": "string", - "description": "IP address or interface name", + "description": "IP address or interface name.", "title": "Update Source" }, "route_reflector_client": { @@ -2054,7 +2596,7 @@ "type": "integer", "minimum": 1, "maximum": 255, - "description": "Time-to-live in range of hops", + "description": "Time-to-live in range of hops.", "title": "Ebgp Multihop" }, "next_hop_self": { @@ -2082,7 +2624,7 @@ }, "route_map": { "type": "string", - "description": "Route-map name", + "description": "Route-map name.", "title": "Route Map" } }, @@ -2094,25 +2636,114 @@ }, "send_community": { "type": "string", - "description": "'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'", + "description": "'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'.", "title": "Send Community" }, "maximum_routes": { "type": "integer", - "description": "Maximum number of routes (0 means unlimited)", + "description": "Maximum number of routes (0 means unlimited).", "minimum": 0, "maximum": 4294967294, "title": "Maximum Routes" }, "maximum_routes_warning_limit": { "type": "string", - "description": "Maximum number of routes after which a warning is issued (0 means never warn) or\nPercentage of maximum number of routes at which to warn (\"<1-100> percent\")\n", + "description": "Maximum number of routes after which a warning is issued (0 means never warn) or\nPercentage of maximum number of routes at which to warn (\"<1-100> percent\").\n", "title": "Maximum Routes Warning Limit" }, "maximum_routes_warning_only": { "type": "boolean", "title": "Maximum Routes Warning Only" }, + "missing_policy": { + "type": "object", + "description": "Missing policy configuration for all address-families.", + "properties": { + "direction_in": { + "description": "Missing policy inbound direction.", + "type": "object", + "properties": { + "action": { + "description": "Missing policy action.", + "type": "string", + "enum": [ + "deny", + "permit", + "deny-in-out" + ], + "title": "Action" + }, + "include_community_list": { + "type": "boolean", + "description": "Include community-list references in missing policy decision.", + "title": "Include Community List" + }, + "include_prefix_list": { + "type": "boolean", + "description": "Include prefix-list references in missing policy decision.", + "title": "Include Prefix List" + }, + "include_sub_route_map": { + "type": "boolean", + "description": "Include sub-route-map references in missing policy decision.", + "title": "Include Sub Route Map" + } + }, + "required": [ + "action" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Direction In" + }, + "direction_out": { + "description": "Missing policy outbound direction.", + "type": "object", + "properties": { + "action": { + "description": "Missing policy action.", + "type": "string", + "enum": [ + "deny", + "permit", + "deny-in-out" + ], + "title": "Action" + }, + "include_community_list": { + "type": "boolean", + "description": "Include community-list references in missing policy decision.", + "title": "Include Community List" + }, + "include_prefix_list": { + "type": "boolean", + "description": "Include prefix-list references in missing policy decision.", + "title": "Include Prefix List" + }, + "include_sub_route_map": { + "type": "boolean", + "description": "Include sub-route-map references in missing policy decision.", + "title": "Include Sub Route Map" + } + }, + "required": [ + "action" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Direction Out" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Missing Policy" + }, "link_bandwidth": { "type": "object", "properties": { @@ -2122,7 +2753,7 @@ }, "default": { "type": "string", - "description": "nn.nn(K|M|G) link speed in bits/second", + "description": "nn.nn(K|M|G) link speed in bits/second.", "title": "Default" } }, @@ -2141,7 +2772,7 @@ }, "times": { "type": "integer", - "description": "Number of local ASNs allowed in a BGP update", + "description": "Number of local ASNs allowed in a BGP update.", "minimum": 1, "maximum": 10, "title": "Times" @@ -2161,7 +2792,7 @@ }, "timers": { "type": "string", - "description": "BGP Keepalive and Hold Timer values in seconds as string \"<0-3600> <0-3600>\"", + "description": "BGP Keepalive and Hold Timer values in seconds as string \"<0-3600> <0-3600>\".", "title": "Timers" }, "rib_in_pre_policy_retain": { @@ -2184,17 +2815,17 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" }, "bgp_listen_range_prefix": { "type": "string", - "description": "IP prefix range\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", + "description": "IP prefix range.\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", "deprecated": true, "title": "BGP Listen Range Prefix" }, @@ -2202,6 +2833,35 @@ "type": "string", "title": "Session Tracker" }, + "shared_secret": { + "type": "object", + "properties": { + "profile": { + "type": "string", + "description": "Name of profile defined under `management_security`.", + "title": "Profile" + }, + "hash_algorithm": { + "type": "string", + "description": "Note: Algorithm hmac-sha-256 requires EOS version 4.31.1F and above.", + "enum": [ + "aes-128-cmac-96", + "hmac-sha-256", + "hmac-sha1-96" + ], + "title": "Hash Algorithm" + } + }, + "required": [ + "profile", + "hash_algorithm" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Shared Secret" + }, "ttl_maximum_hops": { "type": "integer", "minimum": 0, @@ -2248,12 +2908,12 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "type": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Type" }, "remote_as": { @@ -2276,16 +2936,16 @@ }, "as_path": { "type": "object", - "description": "BGP AS-PATH options", + "description": "BGP AS-PATH options.", "properties": { "remote_as_replace_out": { "type": "boolean", - "description": "Replace AS number with local AS number", + "description": "Replace AS number with local AS number.", "title": "Remote As Replace Out" }, "prepend_own_disabled": { "type": "boolean", - "description": "Disable prepending own AS number to AS path", + "description": "Disable prepending own AS number to AS path.", "title": "Prepend Own Disabled" } }, @@ -2297,7 +2957,7 @@ }, "remove_private_as": { "type": "object", - "description": "Remove private AS numbers in outbound AS path", + "description": "Remove private AS numbers in outbound AS path.", "properties": { "enabled": { "type": "boolean", @@ -2338,7 +2998,7 @@ }, "peer_filter": { "type": "string", - "description": "Peer-filter name\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", + "description": "Peer-filter name.\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", "deprecated": true, "title": "Peer Filter" }, @@ -2348,7 +3008,7 @@ }, "update_source": { "type": "string", - "description": "IP address or interface name", + "description": "IP address or interface name.", "title": "Update Source" }, "route_reflector_client": { @@ -2400,7 +3060,7 @@ "type": "integer", "minimum": 1, "maximum": 255, - "description": "Time-to-live in range of hops", + "description": "Time-to-live in range of hops.", "title": "Ebgp Multihop" }, "next_hop_self": { @@ -2428,7 +3088,7 @@ }, "route_map": { "type": "string", - "description": "Route-map name", + "description": "Route-map name.", "title": "Route Map" } }, @@ -2440,25 +3100,114 @@ }, "send_community": { "type": "string", - "description": "'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'", + "description": "'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'.", "title": "Send Community" }, "maximum_routes": { "type": "integer", - "description": "Maximum number of routes (0 means unlimited)", + "description": "Maximum number of routes (0 means unlimited).", "minimum": 0, "maximum": 4294967294, "title": "Maximum Routes" }, "maximum_routes_warning_limit": { "type": "string", - "description": "Maximum number of routes after which a warning is issued (0 means never warn) or\nPercentage of maximum number of routes at which to warn (\"<1-100> percent\")\n", + "description": "Maximum number of routes after which a warning is issued (0 means never warn) or\nPercentage of maximum number of routes at which to warn (\"<1-100> percent\").\n", "title": "Maximum Routes Warning Limit" }, "maximum_routes_warning_only": { "type": "boolean", "title": "Maximum Routes Warning Only" }, + "missing_policy": { + "type": "object", + "description": "Missing policy configuration for all address-families.", + "properties": { + "direction_in": { + "description": "Missing policy inbound direction.", + "type": "object", + "properties": { + "action": { + "description": "Missing policy action.", + "type": "string", + "enum": [ + "deny", + "permit", + "deny-in-out" + ], + "title": "Action" + }, + "include_community_list": { + "type": "boolean", + "description": "Include community-list references in missing policy decision.", + "title": "Include Community List" + }, + "include_prefix_list": { + "type": "boolean", + "description": "Include prefix-list references in missing policy decision.", + "title": "Include Prefix List" + }, + "include_sub_route_map": { + "type": "boolean", + "description": "Include sub-route-map references in missing policy decision.", + "title": "Include Sub Route Map" + } + }, + "required": [ + "action" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Direction In" + }, + "direction_out": { + "description": "Missing policy outbound direction.", + "type": "object", + "properties": { + "action": { + "description": "Missing policy action.", + "type": "string", + "enum": [ + "deny", + "permit", + "deny-in-out" + ], + "title": "Action" + }, + "include_community_list": { + "type": "boolean", + "description": "Include community-list references in missing policy decision.", + "title": "Include Community List" + }, + "include_prefix_list": { + "type": "boolean", + "description": "Include prefix-list references in missing policy decision.", + "title": "Include Prefix List" + }, + "include_sub_route_map": { + "type": "boolean", + "description": "Include sub-route-map references in missing policy decision.", + "title": "Include Sub Route Map" + } + }, + "required": [ + "action" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Direction Out" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Missing Policy" + }, "link_bandwidth": { "type": "object", "properties": { @@ -2468,7 +3217,7 @@ }, "default": { "type": "string", - "description": "nn.nn(K|M|G) link speed in bits/second", + "description": "nn.nn(K|M|G) link speed in bits/second.", "title": "Default" } }, @@ -2487,7 +3236,7 @@ }, "times": { "type": "integer", - "description": "Number of local ASNs allowed in a BGP update", + "description": "Number of local ASNs allowed in a BGP update.", "minimum": 1, "maximum": 10, "title": "Times" @@ -2507,7 +3256,7 @@ }, "timers": { "type": "string", - "description": "BGP Keepalive and Hold Timer values in seconds as string \"<0-3600> <0-3600>\"", + "description": "BGP Keepalive and Hold Timer values in seconds as string \"<0-3600> <0-3600>\".", "title": "Timers" }, "rib_in_pre_policy_retain": { @@ -2530,17 +3279,17 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" }, "bgp_listen_range_prefix": { "type": "string", - "description": "IP prefix range\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", + "description": "IP prefix range.\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", "deprecated": true, "title": "BGP Listen Range Prefix" }, @@ -2548,6 +3297,35 @@ "type": "string", "title": "Session Tracker" }, + "shared_secret": { + "type": "object", + "properties": { + "profile": { + "type": "string", + "description": "Name of profile defined under `management_security`.", + "title": "Profile" + }, + "hash_algorithm": { + "type": "string", + "description": "Note: Algorithm hmac-sha-256 requires EOS version 4.31.1F and above.", + "enum": [ + "aes-128-cmac-96", + "hmac-sha-256", + "hmac-sha1-96" + ], + "title": "Hash Algorithm" + } + }, + "required": [ + "profile", + "hash_algorithm" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Shared Secret" + }, "ttl_maximum_hops": { "type": "integer", "minimum": 0, @@ -2594,12 +3372,12 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "type": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Type" }, "remote_as": { @@ -2622,16 +3400,16 @@ }, "as_path": { "type": "object", - "description": "BGP AS-PATH options", + "description": "BGP AS-PATH options.", "properties": { "remote_as_replace_out": { "type": "boolean", - "description": "Replace AS number with local AS number", + "description": "Replace AS number with local AS number.", "title": "Remote As Replace Out" }, "prepend_own_disabled": { "type": "boolean", - "description": "Disable prepending own AS number to AS path", + "description": "Disable prepending own AS number to AS path.", "title": "Prepend Own Disabled" } }, @@ -2643,7 +3421,7 @@ }, "remove_private_as": { "type": "object", - "description": "Remove private AS numbers in outbound AS path", + "description": "Remove private AS numbers in outbound AS path.", "properties": { "enabled": { "type": "boolean", @@ -2684,7 +3462,7 @@ }, "peer_filter": { "type": "string", - "description": "Peer-filter name\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", + "description": "Peer-filter name.\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", "deprecated": true, "title": "Peer Filter" }, @@ -2694,7 +3472,7 @@ }, "update_source": { "type": "string", - "description": "IP address or interface name", + "description": "IP address or interface name.", "title": "Update Source" }, "route_reflector_client": { @@ -2746,7 +3524,7 @@ "type": "integer", "minimum": 1, "maximum": 255, - "description": "Time-to-live in range of hops", + "description": "Time-to-live in range of hops.", "title": "Ebgp Multihop" }, "next_hop_self": { @@ -2774,7 +3552,7 @@ }, "route_map": { "type": "string", - "description": "Route-map name", + "description": "Route-map name.", "title": "Route Map" } }, @@ -2786,25 +3564,114 @@ }, "send_community": { "type": "string", - "description": "'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'", + "description": "'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'.", "title": "Send Community" }, "maximum_routes": { "type": "integer", - "description": "Maximum number of routes (0 means unlimited)", + "description": "Maximum number of routes (0 means unlimited).", "minimum": 0, "maximum": 4294967294, "title": "Maximum Routes" }, "maximum_routes_warning_limit": { "type": "string", - "description": "Maximum number of routes after which a warning is issued (0 means never warn) or\nPercentage of maximum number of routes at which to warn (\"<1-100> percent\")\n", + "description": "Maximum number of routes after which a warning is issued (0 means never warn) or\nPercentage of maximum number of routes at which to warn (\"<1-100> percent\").\n", "title": "Maximum Routes Warning Limit" }, "maximum_routes_warning_only": { "type": "boolean", "title": "Maximum Routes Warning Only" }, + "missing_policy": { + "type": "object", + "description": "Missing policy configuration for all address-families.", + "properties": { + "direction_in": { + "description": "Missing policy inbound direction.", + "type": "object", + "properties": { + "action": { + "description": "Missing policy action.", + "type": "string", + "enum": [ + "deny", + "permit", + "deny-in-out" + ], + "title": "Action" + }, + "include_community_list": { + "type": "boolean", + "description": "Include community-list references in missing policy decision.", + "title": "Include Community List" + }, + "include_prefix_list": { + "type": "boolean", + "description": "Include prefix-list references in missing policy decision.", + "title": "Include Prefix List" + }, + "include_sub_route_map": { + "type": "boolean", + "description": "Include sub-route-map references in missing policy decision.", + "title": "Include Sub Route Map" + } + }, + "required": [ + "action" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Direction In" + }, + "direction_out": { + "description": "Missing policy outbound direction.", + "type": "object", + "properties": { + "action": { + "description": "Missing policy action.", + "type": "string", + "enum": [ + "deny", + "permit", + "deny-in-out" + ], + "title": "Action" + }, + "include_community_list": { + "type": "boolean", + "description": "Include community-list references in missing policy decision.", + "title": "Include Community List" + }, + "include_prefix_list": { + "type": "boolean", + "description": "Include prefix-list references in missing policy decision.", + "title": "Include Prefix List" + }, + "include_sub_route_map": { + "type": "boolean", + "description": "Include sub-route-map references in missing policy decision.", + "title": "Include Sub Route Map" + } + }, + "required": [ + "action" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Direction Out" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Missing Policy" + }, "link_bandwidth": { "type": "object", "properties": { @@ -2814,7 +3681,7 @@ }, "default": { "type": "string", - "description": "nn.nn(K|M|G) link speed in bits/second", + "description": "nn.nn(K|M|G) link speed in bits/second.", "title": "Default" } }, @@ -2833,7 +3700,7 @@ }, "times": { "type": "integer", - "description": "Number of local ASNs allowed in a BGP update", + "description": "Number of local ASNs allowed in a BGP update.", "minimum": 1, "maximum": 10, "title": "Times" @@ -2853,7 +3720,7 @@ }, "timers": { "type": "string", - "description": "BGP Keepalive and Hold Timer values in seconds as string \"<0-3600> <0-3600>\"", + "description": "BGP Keepalive and Hold Timer values in seconds as string \"<0-3600> <0-3600>\".", "title": "Timers" }, "rib_in_pre_policy_retain": { @@ -2876,17 +3743,17 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" }, "bgp_listen_range_prefix": { "type": "string", - "description": "IP prefix range\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", + "description": "IP prefix range.\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", "deprecated": true, "title": "BGP Listen Range Prefix" }, @@ -2894,6 +3761,35 @@ "type": "string", "title": "Session Tracker" }, + "shared_secret": { + "type": "object", + "properties": { + "profile": { + "type": "string", + "description": "Name of profile defined under `management_security`.", + "title": "Profile" + }, + "hash_algorithm": { + "type": "string", + "description": "Note: Algorithm hmac-sha-256 requires EOS version 4.31.1F and above.", + "enum": [ + "aes-128-cmac-96", + "hmac-sha-256", + "hmac-sha1-96" + ], + "title": "Hash Algorithm" + } + }, + "required": [ + "profile", + "hash_algorithm" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Shared Secret" + }, "ttl_maximum_hops": { "type": "integer", "minimum": 0, @@ -2993,12 +3889,12 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "type": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Type" }, "remote_as": { @@ -3021,16 +3917,16 @@ }, "as_path": { "type": "object", - "description": "BGP AS-PATH options", + "description": "BGP AS-PATH options.", "properties": { "remote_as_replace_out": { "type": "boolean", - "description": "Replace AS number with local AS number", + "description": "Replace AS number with local AS number.", "title": "Remote As Replace Out" }, "prepend_own_disabled": { "type": "boolean", - "description": "Disable prepending own AS number to AS path", + "description": "Disable prepending own AS number to AS path.", "title": "Prepend Own Disabled" } }, @@ -3042,7 +3938,7 @@ }, "remove_private_as": { "type": "object", - "description": "Remove private AS numbers in outbound AS path", + "description": "Remove private AS numbers in outbound AS path.", "properties": { "enabled": { "type": "boolean", @@ -3083,7 +3979,7 @@ }, "peer_filter": { "type": "string", - "description": "Peer-filter name\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", + "description": "Peer-filter name.\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", "deprecated": true, "title": "Peer Filter" }, @@ -3093,7 +3989,7 @@ }, "update_source": { "type": "string", - "description": "IP address or interface name", + "description": "IP address or interface name.", "title": "Update Source" }, "route_reflector_client": { @@ -3145,7 +4041,7 @@ "type": "integer", "minimum": 1, "maximum": 255, - "description": "Time-to-live in range of hops", + "description": "Time-to-live in range of hops.", "title": "Ebgp Multihop" }, "next_hop_self": { @@ -3173,7 +4069,7 @@ }, "route_map": { "type": "string", - "description": "Route-map name", + "description": "Route-map name.", "title": "Route Map" } }, @@ -3185,25 +4081,114 @@ }, "send_community": { "type": "string", - "description": "'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'", + "description": "'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'.", "title": "Send Community" }, "maximum_routes": { "type": "integer", - "description": "Maximum number of routes (0 means unlimited)", + "description": "Maximum number of routes (0 means unlimited).", "minimum": 0, "maximum": 4294967294, "title": "Maximum Routes" }, "maximum_routes_warning_limit": { "type": "string", - "description": "Maximum number of routes after which a warning is issued (0 means never warn) or\nPercentage of maximum number of routes at which to warn (\"<1-100> percent\")\n", + "description": "Maximum number of routes after which a warning is issued (0 means never warn) or\nPercentage of maximum number of routes at which to warn (\"<1-100> percent\").\n", "title": "Maximum Routes Warning Limit" }, "maximum_routes_warning_only": { "type": "boolean", "title": "Maximum Routes Warning Only" }, + "missing_policy": { + "type": "object", + "description": "Missing policy configuration for all address-families.", + "properties": { + "direction_in": { + "description": "Missing policy inbound direction.", + "type": "object", + "properties": { + "action": { + "description": "Missing policy action.", + "type": "string", + "enum": [ + "deny", + "permit", + "deny-in-out" + ], + "title": "Action" + }, + "include_community_list": { + "type": "boolean", + "description": "Include community-list references in missing policy decision.", + "title": "Include Community List" + }, + "include_prefix_list": { + "type": "boolean", + "description": "Include prefix-list references in missing policy decision.", + "title": "Include Prefix List" + }, + "include_sub_route_map": { + "type": "boolean", + "description": "Include sub-route-map references in missing policy decision.", + "title": "Include Sub Route Map" + } + }, + "required": [ + "action" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Direction In" + }, + "direction_out": { + "description": "Missing policy outbound direction.", + "type": "object", + "properties": { + "action": { + "description": "Missing policy action.", + "type": "string", + "enum": [ + "deny", + "permit", + "deny-in-out" + ], + "title": "Action" + }, + "include_community_list": { + "type": "boolean", + "description": "Include community-list references in missing policy decision.", + "title": "Include Community List" + }, + "include_prefix_list": { + "type": "boolean", + "description": "Include prefix-list references in missing policy decision.", + "title": "Include Prefix List" + }, + "include_sub_route_map": { + "type": "boolean", + "description": "Include sub-route-map references in missing policy decision.", + "title": "Include Sub Route Map" + } + }, + "required": [ + "action" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Direction Out" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Missing Policy" + }, "link_bandwidth": { "type": "object", "properties": { @@ -3213,7 +4198,7 @@ }, "default": { "type": "string", - "description": "nn.nn(K|M|G) link speed in bits/second", + "description": "nn.nn(K|M|G) link speed in bits/second.", "title": "Default" } }, @@ -3232,7 +4217,7 @@ }, "times": { "type": "integer", - "description": "Number of local ASNs allowed in a BGP update", + "description": "Number of local ASNs allowed in a BGP update.", "minimum": 1, "maximum": 10, "title": "Times" @@ -3252,7 +4237,7 @@ }, "timers": { "type": "string", - "description": "BGP Keepalive and Hold Timer values in seconds as string \"<0-3600> <0-3600>\"", + "description": "BGP Keepalive and Hold Timer values in seconds as string \"<0-3600> <0-3600>\".", "title": "Timers" }, "rib_in_pre_policy_retain": { @@ -3275,17 +4260,17 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" }, "bgp_listen_range_prefix": { "type": "string", - "description": "IP prefix range\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", + "description": "IP prefix range.\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", "deprecated": true, "title": "BGP Listen Range Prefix" }, @@ -3293,6 +4278,35 @@ "type": "string", "title": "Session Tracker" }, + "shared_secret": { + "type": "object", + "properties": { + "profile": { + "type": "string", + "description": "Name of profile defined under `management_security`.", + "title": "Profile" + }, + "hash_algorithm": { + "type": "string", + "description": "Note: Algorithm hmac-sha-256 requires EOS version 4.31.1F and above.", + "enum": [ + "aes-128-cmac-96", + "hmac-sha-256", + "hmac-sha1-96" + ], + "title": "Hash Algorithm" + } + }, + "required": [ + "profile", + "hash_algorithm" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Shared Secret" + }, "ttl_maximum_hops": { "type": "integer", "minimum": 0, @@ -3384,12 +4398,12 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "type": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Type" }, "remote_as": { @@ -3412,16 +4426,16 @@ }, "as_path": { "type": "object", - "description": "BGP AS-PATH options", + "description": "BGP AS-PATH options.", "properties": { "remote_as_replace_out": { "type": "boolean", - "description": "Replace AS number with local AS number", + "description": "Replace AS number with local AS number.", "title": "Remote As Replace Out" }, "prepend_own_disabled": { "type": "boolean", - "description": "Disable prepending own AS number to AS path", + "description": "Disable prepending own AS number to AS path.", "title": "Prepend Own Disabled" } }, @@ -3433,7 +4447,7 @@ }, "remove_private_as": { "type": "object", - "description": "Remove private AS numbers in outbound AS path", + "description": "Remove private AS numbers in outbound AS path.", "properties": { "enabled": { "type": "boolean", @@ -3474,7 +4488,7 @@ }, "peer_filter": { "type": "string", - "description": "Peer-filter name\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", + "description": "Peer-filter name.\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", "deprecated": true, "title": "Peer Filter" }, @@ -3484,7 +4498,7 @@ }, "update_source": { "type": "string", - "description": "IP address or interface name", + "description": "IP address or interface name.", "title": "Update Source" }, "route_reflector_client": { @@ -3536,7 +4550,7 @@ "type": "integer", "minimum": 1, "maximum": 255, - "description": "Time-to-live in range of hops", + "description": "Time-to-live in range of hops.", "title": "Ebgp Multihop" }, "next_hop_self": { @@ -3564,7 +4578,7 @@ }, "route_map": { "type": "string", - "description": "Route-map name", + "description": "Route-map name.", "title": "Route Map" } }, @@ -3576,25 +4590,114 @@ }, "send_community": { "type": "string", - "description": "'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'", + "description": "'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'.", "title": "Send Community" }, "maximum_routes": { "type": "integer", - "description": "Maximum number of routes (0 means unlimited)", + "description": "Maximum number of routes (0 means unlimited).", "minimum": 0, "maximum": 4294967294, "title": "Maximum Routes" }, "maximum_routes_warning_limit": { "type": "string", - "description": "Maximum number of routes after which a warning is issued (0 means never warn) or\nPercentage of maximum number of routes at which to warn (\"<1-100> percent\")\n", + "description": "Maximum number of routes after which a warning is issued (0 means never warn) or\nPercentage of maximum number of routes at which to warn (\"<1-100> percent\").\n", "title": "Maximum Routes Warning Limit" }, "maximum_routes_warning_only": { "type": "boolean", "title": "Maximum Routes Warning Only" }, + "missing_policy": { + "type": "object", + "description": "Missing policy configuration for all address-families.", + "properties": { + "direction_in": { + "description": "Missing policy inbound direction.", + "type": "object", + "properties": { + "action": { + "description": "Missing policy action.", + "type": "string", + "enum": [ + "deny", + "permit", + "deny-in-out" + ], + "title": "Action" + }, + "include_community_list": { + "type": "boolean", + "description": "Include community-list references in missing policy decision.", + "title": "Include Community List" + }, + "include_prefix_list": { + "type": "boolean", + "description": "Include prefix-list references in missing policy decision.", + "title": "Include Prefix List" + }, + "include_sub_route_map": { + "type": "boolean", + "description": "Include sub-route-map references in missing policy decision.", + "title": "Include Sub Route Map" + } + }, + "required": [ + "action" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Direction In" + }, + "direction_out": { + "description": "Missing policy outbound direction.", + "type": "object", + "properties": { + "action": { + "description": "Missing policy action.", + "type": "string", + "enum": [ + "deny", + "permit", + "deny-in-out" + ], + "title": "Action" + }, + "include_community_list": { + "type": "boolean", + "description": "Include community-list references in missing policy decision.", + "title": "Include Community List" + }, + "include_prefix_list": { + "type": "boolean", + "description": "Include prefix-list references in missing policy decision.", + "title": "Include Prefix List" + }, + "include_sub_route_map": { + "type": "boolean", + "description": "Include sub-route-map references in missing policy decision.", + "title": "Include Sub Route Map" + } + }, + "required": [ + "action" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Direction Out" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Missing Policy" + }, "link_bandwidth": { "type": "object", "properties": { @@ -3604,7 +4707,7 @@ }, "default": { "type": "string", - "description": "nn.nn(K|M|G) link speed in bits/second", + "description": "nn.nn(K|M|G) link speed in bits/second.", "title": "Default" } }, @@ -3623,7 +4726,7 @@ }, "times": { "type": "integer", - "description": "Number of local ASNs allowed in a BGP update", + "description": "Number of local ASNs allowed in a BGP update.", "minimum": 1, "maximum": 10, "title": "Times" @@ -3643,7 +4746,7 @@ }, "timers": { "type": "string", - "description": "BGP Keepalive and Hold Timer values in seconds as string \"<0-3600> <0-3600>\"", + "description": "BGP Keepalive and Hold Timer values in seconds as string \"<0-3600> <0-3600>\".", "title": "Timers" }, "rib_in_pre_policy_retain": { @@ -3666,17 +4769,17 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" }, "bgp_listen_range_prefix": { "type": "string", - "description": "IP prefix range\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", + "description": "IP prefix range.\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", "deprecated": true, "title": "BGP Listen Range Prefix" }, @@ -3684,6 +4787,35 @@ "type": "string", "title": "Session Tracker" }, + "shared_secret": { + "type": "object", + "properties": { + "profile": { + "type": "string", + "description": "Name of profile defined under `management_security`.", + "title": "Profile" + }, + "hash_algorithm": { + "type": "string", + "description": "Note: Algorithm hmac-sha-256 requires EOS version 4.31.1F and above.", + "enum": [ + "aes-128-cmac-96", + "hmac-sha-256", + "hmac-sha1-96" + ], + "title": "Hash Algorithm" + } + }, + "required": [ + "profile", + "hash_algorithm" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Shared Secret" + }, "ttl_maximum_hops": { "type": "integer", "minimum": 0, @@ -3755,62 +4887,62 @@ { "key": "servers", "type": "server", - "description": "Server" + "description": "Server." }, { "key": "firewalls", "type": "firewall", - "description": "Firewall" + "description": "Firewall." }, { "key": "routers", "type": "router", - "description": "Router" + "description": "Router." }, { "key": "load_balancers", "type": "load_balancer", - "description": "Load Balancer" + "description": "Load Balancer." }, { "key": "storage_arrays", "type": "storage_array", - "description": "Storage Array" + "description": "Storage Array." }, { "key": "cpes", "type": "cpe", - "description": "CPE" + "description": "CPE." }, { "key": "workstations", "type": "workstation", - "description": "Workstation" + "description": "Workstation." }, { "key": "access_points", "type": "access_point", - "description": "Access Point" + "description": "Access Point." }, { "key": "phones", "type": "phone", - "description": "Phone" + "description": "Phone." }, { "key": "printers", "type": "printer", - "description": "Printer" + "description": "Printer." }, { "key": "cameras", "type": "camera", - "description": "Camera" + "description": "Camera." }, { "key": "generic_devices", "type": "generic_device", - "description": "Generic Device" + "description": "Generic Device." } ], "title": "Connected Endpoints Keys" @@ -4012,6 +5144,32 @@ "description": "Enable sFlow. Overrides `fabric_sflow` setting.", "title": "Sflow" }, + "underlay_multicast": { + "type": "boolean", + "description": "Enable PIM sparse mode. Requires `include_in_underlay_protocol` and the global `underlay_multicast` to be `true`.", + "default": false, + "title": "Underlay Multicast" + }, + "flow_tracking": { + "type": "object", + "description": "Enable flow-tracking. Overrides `fabric_flow_tracking` setting.", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "name": { + "type": "string", + "description": "Flow tracker name as defined in flow_tracking_settings.", + "title": "Name" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Flow Tracking" + }, "qos_profile": { "type": "string", "description": "QOS service profile.", @@ -4086,7 +5244,7 @@ }, "structured_config": { "type": "object", - "description": "Custom structured config for interfaces\nNote! The content of this dictionary is _not_ validated by the schema, since it can be either ethernet_interfaces or port_channel_interfaces.", + "description": "Custom structured config for interfaces.\nNote! The content of this dictionary is _not_ validated by the schema, since it can be either ethernet_interfaces or port_channel_interfaces.", "title": "Structured Config" } }, @@ -4260,6 +5418,32 @@ "description": "Enable sFlow. Overrides `fabric_sflow` setting.", "title": "Sflow" }, + "underlay_multicast": { + "type": "boolean", + "description": "Enable PIM sparse mode. Requires `include_in_underlay_protocol` and the global `underlay_multicast` to be `true`.", + "default": false, + "title": "Underlay Multicast" + }, + "flow_tracking": { + "type": "object", + "description": "Enable flow-tracking. Overrides `fabric_flow_tracking` setting.", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "name": { + "type": "string", + "description": "Flow tracker name as defined in flow_tracking_settings.", + "title": "Name" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Flow Tracking" + }, "qos_profile": { "type": "string", "description": "QOS service profile.", @@ -4334,7 +5518,7 @@ }, "structured_config": { "type": "object", - "description": "Custom structured config for interfaces\nNote! The content of this dictionary is _not_ validated by the schema, since it can be either ethernet_interfaces or port_channel_interfaces.", + "description": "Custom structured config for interfaces.\nNote! The content of this dictionary is _not_ validated by the schema, since it can be either ethernet_interfaces or port_channel_interfaces.", "title": "Structured Config" } }, @@ -4380,6 +5564,144 @@ ], "title": "Custom Structured Configuration Prefix" }, + "cv_pathfinder_global_sites": { + "description": "Define sites that are outside of the CV Pathfinder hierarchy.\nThis is used to arrange pathfinders in the CloudVision topology layout.", + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The site name.", + "title": "Name" + }, + "description": { + "type": "string", + "title": "Description" + }, + "location": { + "type": "string", + "description": "Location as a string is resolved on Cloudvision.", + "title": "Location" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "title": "Cv Pathfinder Global Sites" + }, + "cv_pathfinder_internet_exit_policies": { + "description": "PREVIEW: These keys are in preview mode.\n\nList of internet-exit policies used for the WAN configuration.", + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Internet-exit policy name.", + "title": "Name" + }, + "type": { + "type": "string", + "description": "Internet-exit policy type.\ndirect: Exit directly over wan interfaces\nzscaler: Exit using Zscaler secure web gateway service", + "enum": [ + "direct", + "zscaler" + ], + "title": "Type" + }, + "fallback_to_system_default": { + "type": "boolean", + "default": true, + "description": "Add system default exit-group at the end of the policy.", + "title": "Fallback To System Default" + }, + "zscaler": { + "type": "object", + "description": "Zscaler information. Only used if `type` is 'zscaler'.", + "properties": { + "ipsec_key_salt": { + "type": "string", + "description": "\"Salt\" used for auto generation of encryption keys for IPsec tunnels to Zscaler.\nThe keys will be generated as a hash of `salt__`.\nSince this salt can be used to deduct the encryption key, it is recommeneded to use vault.", + "title": "Ipsec Key Salt" + }, + "domain_name": { + "type": "string", + "description": "Domain name as configured in Zscaler for the tenant. Used as UFQDN suffix for authentication.", + "title": "Domain Name" + }, + "encrypt_traffic": { + "type": "boolean", + "default": true, + "description": "When `true` the traffic going over the tunnels will be encrypted with AES-256-GCM. Otherwise the traffic will be using NULL encryption.\nNote that encryption requires a subscription on the Zscaler account.", + "title": "Encrypt Traffic" + }, + "download_bandwidth": { + "type": "integer", + "description": "Maximum allowed download bandwidth in Mbps for each device using this policy.", + "title": "Download Bandwidth" + }, + "upload_bandwidth": { + "type": "integer", + "description": "Maximum allowed upload bandwidth in Mbps for each device using this policy.", + "title": "Upload Bandwidth" + }, + "firewall": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Enforce firewall controls.", + "default": false, + "title": "Enabled" + }, + "ips": { + "type": "boolean", + "description": "Enable IPS Controls for the firewall.", + "default": false, + "title": "Ips" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Firewall" + }, + "acceptable_use_policy": { + "type": "boolean", + "description": "Display an Acceptable Use Policy (AUP) and require users to accept it.", + "default": false, + "title": "Acceptable Use Policy" + } + }, + "required": [ + "ipsec_key_salt", + "domain_name" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Zscaler" + } + }, + "required": [ + "type", + "name" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Cv Pathfinder Internet Exit Policies" + }, "cv_pathfinder_regions": { "description": "Define the CV Pathfinder hierarchy.", "type": "array", @@ -4388,7 +5710,9 @@ "properties": { "name": { "type": "string", - "description": "The region name.", + "minLength": 1, + "maxLength": 128, + "pattern": "^[A-Za-z0-9_.:{}\\[\\]-]+$", "title": "Name" }, "description": { @@ -4411,6 +5735,9 @@ "name": { "type": "string", "description": "The site name.", + "minLength": 1, + "maxLength": 128, + "pattern": "^[A-Za-z0-9_.:{}\\[\\]-]+$", "title": "Name" }, "description": { @@ -4426,7 +5753,7 @@ }, "location": { "type": "string", - "description": "Location as a sring is resolved on Cloudvision.", + "description": "Location as a string is resolved on Cloudvision.", "title": "Location" }, "site_contact": { @@ -4463,6 +5790,11 @@ }, "title": "Cv Pathfinder Regions" }, + "cv_server": { + "description": "PREVIEW: These keys are in preview mode.\n\nHostname or IP address of CloudVision host. Ex. \"www.arista.io\" for CVaaS.\nFor `eos_designs` this variable is only used for the WAN Internet-exit integration with Zscaler.\nThe same variable name is also used by the `cv_deploy` role, and will override the value of `ansible_host` on inventory 'cloudvision' host.\nMake sure to set it in a common group_vars file.", + "type": "string", + "title": "Cv Server" + }, "cv_tags_topology_type": { "description": "PREVIEW: This key is currently not supported\nDevice type that CloudVision should use when generating the Topology. Defaults to the setting under node_type_keys.", "type": "string", @@ -4474,6 +5806,11 @@ ], "title": "Cv Tags Topology Type" }, + "cv_token": { + "description": "PREVIEW: These keys are in preview mode.\n\nService account token as defined on CloudVision. This value should be using Ansible Vault.\nFor `eos_designs` this variable is only used for the WAN Internet-exit integration with Zscaler.\nThe same variable name is also used by the `cv_deploy` role, and will override the value of `ansible_password` on inventory 'cloudvision' host.\nMake sure to set it in a common group_vars file.", + "type": "string", + "title": "Cv Token" + }, "cv_topology": { "type": "array", "description": "Generate AVD configurations directly from the given CloudVision topology.\nActivate this feature by setting `use_cv_topology` to `true`.\nRequires `default_interfaces` to be set for the relevant platforms and node types to detect the proper interface roles automatically.\nNeighbor hostnames must match the inventory hostnames of the AVD inventory to be taken into consideration.", @@ -4545,7 +5882,7 @@ "description": "List of IPv4 addresses or DNS names for CloudVision.\nFor on-premise CloudVision enter all the nodes of the cluster.\nFor CloudVision as a Service enter the DNS name of the instance.\n`eos_designs` only supports one CloudVision cluster.\n", "items": { "type": "string", - "description": "IPv4 address or DNS name for CloudVision" + "description": "IPv4 address or DNS name for CloudVision." }, "title": "CVP Instance Ips" }, @@ -4567,7 +5904,7 @@ }, "default_interface_mtu": { "type": "integer", - "description": "Default interface MTU configured on EOS under \"interface defaults\".\nCan be overriden per platform under platform settings.\n", + "description": "Default interface MTU configured on EOS under \"interface defaults\".\nCan be overridden per platform under platform settings.\n", "minimum": 68, "maximum": 65535, "title": "Default Interface MTU" @@ -4773,7 +6110,7 @@ "properties": { "name": { "type": "string", - "description": "Event Handler Name", + "description": "Event Handler Name.", "title": "Name" }, "action_type": { @@ -4787,12 +6124,39 @@ }, "action": { "type": "string", - "description": "Command to execute\n", + "description": "Command to execute.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use event_handlers.actions instead.", + "deprecated": true, "title": "Action" }, + "actions": { + "type": "object", + "description": "Note: `bash_command` and `log` are mutually exclusive. `bash_command` takes precedence over `log`.", + "properties": { + "bash_command": { + "type": "string", + "description": "Define BASH command action. Command could be multiline also.", + "title": "Bash Command" + }, + "log": { + "type": "boolean", + "description": "Log a message when the event is triggered.", + "title": "Log" + }, + "increment_device_health_metric": { + "type": "string", + "description": "Name of device-health metric.", + "title": "Increment Device Health Metric" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Actions" + }, "delay": { "type": "integer", - "description": "Event-handler delay in seconds\n", + "description": "Event-handler delay in seconds.\n", "title": "Delay" }, "trigger": { @@ -4800,12 +6164,98 @@ "description": "Configure event trigger condition.\n", "enum": [ "on-boot", + "on-counters", + "on-intf", "on-logging", + "on-maintenance", "on-startup-config", - "on-maintenance" + "vm-tracer vm" ], "title": "Trigger" }, + "trigger_on_counters": { + "type": "object", + "properties": { + "condition": { + "type": "string", + "description": "Set the logical expression to evaluate.", + "title": "Condition" + }, + "granularity_per_source": { + "type": "boolean", + "description": "Set the granularity of event counting for a wildcarded condition.\nExample -\n condition ( Arad*.IptCrcErrCnt.delta > 100 ) and ( Arad*.UcFifoFullDrop.delta > 100 )\n [* wildcard is used here]", + "title": "Granularity Per Source" + }, + "poll_interval": { + "type": "integer", + "minimum": 1, + "maximum": 1000000, + "description": "Set the polling interval in seconds.", + "title": "Poll Interval" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Trigger On Counters" + }, + "trigger_on_logging": { + "type": "object", + "properties": { + "poll_interval": { + "type": "integer", + "minimum": 1, + "maximum": 1000000, + "description": "Set the polling interval in seconds.", + "title": "Poll Interval" + }, + "regex": { + "type": "string", + "description": "Regular expression to use for searching log messages.", + "title": "Regex" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Trigger On Logging" + }, + "trigger_on_intf": { + "type": "object", + "description": "Trigger condition occurs on specified interface changes.\nNote: Any one of the `ip`, `ipv6` and `operstatus` key needs to be defined along with the `interface`.", + "properties": { + "interface": { + "type": "string", + "description": "Interface name.\nExample - Ethernet4\n Loopback4-6\n Port-channel4,7", + "title": "Interface" + }, + "ip": { + "type": "boolean", + "description": "Action is triggered upon changes to interface IP address assignment.", + "title": "IP" + }, + "ipv6": { + "type": "boolean", + "description": "Action is triggered upon changes to interface ipv6 address assignment.", + "title": "IPv6" + }, + "operstatus": { + "type": "boolean", + "description": "Action is triggered upon changes to interface operStatus.", + "title": "Operstatus" + } + }, + "required": [ + "interface" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Trigger On Intf" + }, "trigger_on_maintenance": { "description": "Settings required for trigger 'on-maintenance'.", "type": "object", @@ -4874,7 +6324,8 @@ }, "regex": { "type": "string", - "description": "Regular expression to use for searching log messages. Required for on-logging trigger\n", + "description": "Regular expression to use for searching log messages. Required for on-logging trigger.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use event_handlers.trigger_on_logging.regex instead.", + "deprecated": true, "title": "Regex" }, "asynchronous": { @@ -4974,7 +6425,7 @@ "title": "EVPN Short Esi Prefix" }, "evpn_vlan_aware_bundles": { - "description": "Enable vlan aware bundles for EVPN MAC-VRF.", + "description": "Enable VLAN aware bundles for every EVPN MAC-VRF.\nIf set to `true` all SVIs in a VRF are configured in a vlan-aware-bundle using the VRF name as the bundle name. `l2vlans` are bundled in vlan-aware-bundles using the VLAN name as the bundle name.\n\nThe `evpn_vlan_bundle` option under `svis` and `l2vlans` takes precedence and overrides this behavior. Per svi/l2vlan `evpn_vlan_bundle` also works when this setting is disabled which allow mixing vlan-aware-bundles with regular MAC-VRFs.", "type": "boolean", "default": false, "title": "EVPN VLAN Aware Bundles" @@ -4996,12 +6447,12 @@ }, "rt_override": { "type": "string", - "description": "By default the MAC VRF bundle RT will be derived from mac_vrf_id_base + bundle_id.\nThe rt_override allows us to override this value and statically define it.\nrt_override will default to vni_override if set.\n\nrt_override supports two formats:\n - A single number which will be used in the RT fields instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rt_type' for details).\n - A full RT string with colon seperator which will override the full RT.\n", + "description": "By default the MAC VRF bundle RT will be derived from mac_vrf_id_base + bundle_id.\nThe rt_override allows us to override this value and statically define it.\nrt_override will default to vni_override if set.\n\nrt_override supports two formats:\n - A single number which will be used in the RT fields instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rt_type' for details).\n - A full RT string with colon separator which will override the full RT.\n", "title": "Rt Override" }, "rd_override": { "type": "string", - "description": "By default the MAC VRF bundle RD will be derived from mac_vrf_id_base + bundle_id.\nThe rt_override allows us to override this value and statically define it.\nrd_override will default to rt_override or vni_override if set.\n\nrd_override supports two formats:\n - A single number which will be used in the RD assigned number field instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rd_type' for details).\n - A full RD string with colon seperator which will override the full RD.\n", + "description": "By default the MAC VRF bundle RD will be derived from mac_vrf_id_base + bundle_id.\nThe rt_override allows us to override this value and statically define it.\nrd_override will default to rt_override or vni_override if set.\n\nrd_override supports two formats:\n - A single number which will be used in the RD assigned number field instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rd_type' for details).\n - A full RD string with colon separator which will override the full RD.\n", "title": "Rd Override" }, "evpn_l2_multi_domain": { @@ -5046,6 +6497,197 @@ "type": "string", "title": "Fabric EVPN Encapsulation" }, + "fabric_flow_tracking": { + "type": "object", + "description": "Default enabling of flow-tracking(IPFIX) for various interface types across the fabric.\nFlow Tracking can also be enabled/disabled under each of the specific data models.\nFor general flow-tracking settings see `flow_tracking_settings`.", + "properties": { + "uplinks": { + "description": "Enable flow-tracking on all fabric uplinks.", + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "name": { + "type": "string", + "description": "Flow tracker name as defined in flow_tracking_settings.", + "title": "Name" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Uplinks" + }, + "downlinks": { + "description": "Enable flow-tracking on all fabric downlinks.", + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "name": { + "type": "string", + "description": "Flow tracker name as defined in flow_tracking_settings.", + "title": "Name" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Downlinks" + }, + "endpoints": { + "description": "Enable flow-tracking on all endpoints ports.", + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "name": { + "type": "string", + "description": "Flow tracker name as defined in flow_tracking_settings.", + "title": "Name" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Endpoints" + }, + "l3_edge": { + "description": "Enable flow-tracking on all p2p_links defined under l3_edge.", + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "name": { + "type": "string", + "description": "Flow tracker name as defined in flow_tracking_settings.", + "title": "Name" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "L3 Edge" + }, + "core_interfaces": { + "description": "Enable flow-tracking on all p2p_links defined under core_interfaces.", + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "name": { + "type": "string", + "description": "Flow tracker name as defined in flow_tracking_settings.", + "title": "Name" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Core Interfaces" + }, + "mlag_interfaces": { + "description": "Enable flow-tracking on all MLAG peer interfaces.", + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "name": { + "type": "string", + "description": "Flow tracker name as defined in flow_tracking_settings.", + "title": "Name" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "MLAG Interfaces" + }, + "l3_interfaces": { + "description": "Enable flow-tracking on all node.l3_interfaces.", + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "name": { + "type": "string", + "description": "Flow tracker name as defined in flow_tracking_settings.", + "title": "Name" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "L3 Interfaces" + }, + "dps_interfaces": { + "description": "Enable flow-tracking on all dps_interfaces.", + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "name": { + "type": "string", + "description": "Flow tracker name as defined in flow_tracking_settings.", + "title": "Name" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "DPS Interfaces" + }, + "direct_wan_ha_links": { + "description": "Enable flow-tracking on all direct WAN HA links.", + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "name": { + "type": "string", + "description": "Flow tracker name as defined in flow_tracking_settings.", + "title": "Name" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Direct Wan Ha Links" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Fabric Flow Tracking" + }, "fabric_ip_addressing": { "type": "object", "properties": { @@ -5070,6 +6712,14 @@ "maximum": 31, "description": "IPv4 prefix length used for MLAG peer-vlan and L3 point-to-point SVIs over the MLAG peer-link.", "title": "IPv4 Prefix Length" + }, + "ipv6_prefix_length": { + "type": "integer", + "default": 64, + "minimum": 1, + "maximum": 127, + "description": "IPv6 prefix length used for MLAG peer-vlan and L3 point-to-point SVIs over the MLAG peer-link.", + "title": "IPv6 Prefix Length" } }, "additionalProperties": false, @@ -5153,61 +6803,260 @@ "description": "PREVIEW: This key is currently not supported\n\nDefine the flow tracking parameters for this topology.", "type": "object", "properties": { - "flow_tracker_name": { - "type": "string", - "default": "FLOW-TRACKER", - "description": "Flow Tracker Name.", - "title": "Flow Tracker Name" - }, - "record_export": { + "sampled": { "type": "object", + "description": "The options relevant only for flow tracker type sampled.", "properties": { - "on_inactive_timeout": { - "description": "Flow record inactive export timeout in milliseconds.", - "type": "integer", - "minimum": 3000, - "maximum": 900000, - "default": 70000, - "title": "On Inactive Timeout" + "encapsulation": { + "type": "object", + "properties": { + "ipv4_ipv6": { + "type": "boolean", + "title": "IPv4 IPv6" + }, + "mpls": { + "type": "boolean", + "title": "MPLS" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Encapsulation" }, - "on_interval": { + "sample": { "type": "integer", - "minimum": 1000, - "maximum": 36000000, - "default": 300000, - "description": "Flow record export interval in milliseconds.", - "title": "On Interval" + "minimum": 1, + "maximum": 4294967295, + "default": 10000, + "title": "Sample" + }, + "hardware_offload": { + "type": "object", + "properties": { + "ipv4": { + "type": "boolean", + "description": "Configure hardware offload for IPv4 traffic.", + "title": "IPv4" + }, + "ipv6": { + "type": "boolean", + "description": "Configure hardware offload for IPv6 traffic.", + "title": "IPv6" + }, + "threshold_minimum": { + "type": "integer", + "minimum": 1, + "maximum": 4294967295, + "description": "Minimum number of samples.", + "title": "Threshold Minimum" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Hardware Offload" } }, "additionalProperties": false, "patternProperties": { "^_.+$": {} }, - "title": "Record Export" + "title": "Sampled" }, - "exporter": { + "hardware": { "type": "object", + "description": "The options relevant only for flow tracker type hardware.", "properties": { - "name": { - "type": "string", - "default": "CV-TELEMETRY", - "description": "Exporter Name.", - "title": "Name" - }, - "template_interval": { - "description": "Template interval in milliseconds.", - "type": "integer", - "minimum": 5000, - "maximum": 3600000, - "default": 3600000, - "title": "Template Interval" + "record": { + "type": "object", + "properties": { + "format_ipfix_standard_timestamps_counters": { + "type": "boolean", + "description": "Enable software export of IPFIX data records.", + "title": "Format Ipfix Standard Timestamps Counters" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Record" } }, "additionalProperties": false, "patternProperties": { "^_.+$": {} }, - "title": "Exporter" + "title": "Hardware" + }, + "trackers": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Tracker Name", + "title": "Name" + }, + "sampled": { + "type": "object", + "description": "The options relevant only for flow tracker type sampled.", + "properties": { + "table_size": { + "type": "integer", + "minimum": 1, + "maximum": 614400, + "description": "Maximum number of entries in flow table.\n", + "title": "Table Size" + }, + "record_export": { + "type": "object", + "properties": { + "mpls": { + "type": "boolean", + "description": "Export MPLS forwarding information.", + "title": "MPLS" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Record Export" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Sampled" + }, + "record_export": { + "type": "object", + "properties": { + "on_inactive_timeout": { + "type": "integer", + "minimum": 3000, + "maximum": 900000, + "description": "Flow record inactive export timeout in milliseconds", + "title": "On Inactive Timeout" + }, + "on_interval": { + "type": "integer", + "minimum": 1000, + "maximum": 36000000, + "description": "Flow record export interval in milliseconds", + "title": "On Interval" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Record Export" + }, + "exporters": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Exporter Name", + "title": "Name" + }, + "collector": { + "type": "object", + "properties": { + "host": { + "type": "string", + "description": "Collector IPv4 address or IPv6 address or fully qualified domain name", + "title": "Host" + }, + "port": { + "type": "integer", + "description": "Collector Port Number", + "minimum": 1, + "maximum": 65535, + "title": "Port" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Collector" + }, + "format": { + "type": "object", + "properties": { + "ipfix_version": { + "type": "integer", + "title": "Ipfix Version" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Format" + }, + "local_interface": { + "type": "string", + "description": "Local Source Interface", + "title": "Local Interface" + }, + "template_interval": { + "type": "integer", + "minimum": 5000, + "maximum": 3600000, + "description": "Template interval in milliseconds", + "title": "Template Interval" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "title": "Exporters" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "default": [ + { + "name": "FLOW-TRACKER", + "record_export": { + "on_inactive_timeout": 70000, + "on_interval": 300000 + }, + "exporters": [ + { + "name": "CV-TELEMETRY", + "collector": { + "host": "127.0.0.1" + }, + "local_interface": "Loopback0", + "template_interval": 3600000 + } + ] + } + ], + "title": "Trackers" } }, "additionalProperties": false, @@ -5304,7 +7153,7 @@ "properties": { "features": { "type": "array", - "description": "This data model allows to configure the list of hardware counters feature\navailable on Arista platforms.\n\nThe `name` key accepts a list of valid_values which MUST be updated to support\nnew feature as they are released in EOS.\n\nThe available values of the different keys like 'direction' or 'address_type'\nare feature and hardware dependent and this model DOES NOT validate that the\ncombinations are valid. It is the responsability of the user of this data model\nto make sure that the rendered CLI is accepted by the targeted device.\n\nExamples:\n\n * Use:\n ```yaml\n hardware_counters:\n features:\n - name: ip\n direction: out\n layer3: true\n units_packets: true\n ```\n\n to render:\n ```eos\n hardware counter feature ip out layer3 units packets\n ```\n * Use:\n ```yaml\n hardware_counters:\n features:\n - name: route\n address_type: ipv4\n vrf: test\n prefix: 192.168.0.0/24\n ```\n\n to render:\n ```eos\n hardware counter feature route ipv4 vrf test 192.168.0.0/24\n ```\n", + "description": "This data model allows to configure the list of hardware counters feature\navailable on Arista platforms.\n\nThe `name` key accepts a list of valid_values which MUST be updated to support\nnew feature as they are released in EOS.\n\nThe available values of the different keys like 'direction' or 'address_type'\nare feature and hardware dependent and this model DOES NOT validate that the\ncombinations are valid. It is the responsibility of the user of this data model\nto make sure that the rendered CLI is accepted by the targeted device.\n\nExamples:\n\n * Use:\n ```yaml\n hardware_counters:\n features:\n - name: ip\n direction: out\n layer3: true\n units_packets: true\n ```\n\n to render:\n ```eos\n hardware counter feature ip out layer3 units packets\n ```\n * Use:\n ```yaml\n hardware_counters:\n features:\n - name: route\n address_type: ipv4\n vrf: test\n prefix: 192.168.0.0/24\n ```\n\n to render:\n ```eos\n hardware counter feature route ipv4 vrf test 192.168.0.0/24\n ```\n", "items": { "type": "object", "properties": { @@ -5330,6 +7179,7 @@ "qos dual-rate-policer", "route", "routed-port", + "segment-security", "subinterface", "tapagg", "traffic-class", @@ -5365,7 +7215,7 @@ }, "layer3": { "type": "boolean", - "description": "Supported only for the 'ip' feature\n", + "description": "Supported only for the 'ip' feature.\n", "title": "Layer3" }, "vrf": { @@ -5472,12 +7322,12 @@ "properties": { "source": { "type": "string", - "description": "This field supports substitution of the fields \"interface_ip\" and \"peer_ip\".\nAlternatively it can be set with a static value of \"any\", \"/\" or \"\".\n\"\" without a mask means host.\nRequired except for remarks.", + "description": "This field supports substitution of the fields \"interface_ip\" for SVIs and both \"interface_ip\" and \"peer_ip\" for Layer 3 interfaces.\nAlternatively it can be set with a static value of \"any\", \"/\" or \"\".\n\"\" without a mask means host.\nRequired except for remarks.", "title": "Source" }, "destination": { "type": "string", - "description": "This field supports substitution of the fields \"interface_ip\" and \"peer_ip\".\nAlternatively it can be set with a static value of \"any\", \"/\" or \"\".\n\"\" without a mask means host.\nRequired except for remarks.", + "description": "This field supports substitution of the fields \"interface_ip\" for SVIs and both \"interface_ip\" and \"peer_ip\" for Layer 3 interfaces.\nAlternatively it can be set with a static value of \"any\", \"/\" or \"\".\n\"\" without a mask means host.\nRequired except for remarks.", "title": "Destination" }, "sequence": { @@ -5564,7 +7414,7 @@ }, "ttl": { "type": "integer", - "description": "TTL value", + "description": "TTL value.", "minimum": 0, "maximum": 255, "title": "TTL" @@ -5943,6 +7793,32 @@ "description": "Enable sFlow. Overrides `fabric_sflow` setting.", "title": "Sflow" }, + "underlay_multicast": { + "type": "boolean", + "description": "Enable PIM sparse mode. Requires `include_in_underlay_protocol` and the global `underlay_multicast` to be `true`.", + "default": false, + "title": "Underlay Multicast" + }, + "flow_tracking": { + "type": "object", + "description": "Enable flow-tracking. Overrides `fabric_flow_tracking` setting.", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "name": { + "type": "string", + "description": "Flow tracker name as defined in flow_tracking_settings.", + "title": "Name" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Flow Tracking" + }, "qos_profile": { "type": "string", "description": "QOS service profile.", @@ -6017,7 +7893,7 @@ }, "structured_config": { "type": "object", - "description": "Custom structured config for interfaces\nNote! The content of this dictionary is _not_ validated by the schema, since it can be either ethernet_interfaces or port_channel_interfaces.", + "description": "Custom structured config for interfaces.\nNote! The content of this dictionary is _not_ validated by the schema, since it can be either ethernet_interfaces or port_channel_interfaces.", "title": "Structured Config" } }, @@ -6191,6 +8067,32 @@ "description": "Enable sFlow. Overrides `fabric_sflow` setting.", "title": "Sflow" }, + "underlay_multicast": { + "type": "boolean", + "description": "Enable PIM sparse mode. Requires `include_in_underlay_protocol` and the global `underlay_multicast` to be `true`.", + "default": false, + "title": "Underlay Multicast" + }, + "flow_tracking": { + "type": "object", + "description": "Enable flow-tracking. Overrides `fabric_flow_tracking` setting.", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "name": { + "type": "string", + "description": "Flow tracker name as defined in flow_tracking_settings.", + "title": "Name" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Flow Tracking" + }, "qos_profile": { "type": "string", "description": "QOS service profile.", @@ -6265,7 +8167,7 @@ }, "structured_config": { "type": "object", - "description": "Custom structured config for interfaces\nNote! The content of this dictionary is _not_ validated by the schema, since it can be either ethernet_interfaces or port_channel_interfaces.", + "description": "Custom structured config for interfaces.\nNote! The content of this dictionary is _not_ validated by the schema, since it can be either ethernet_interfaces or port_channel_interfaces.", "title": "Structured Config" } }, @@ -6299,13 +8201,13 @@ }, "name": { "type": "string", - "description": "Ethernet interface name like 'Ethernet2' or subinterface name like 'Ethernet2.42'\nFor a subinterface, the parent physical interface is automatically created.", + "description": "Ethernet interface name like 'Ethernet2' or subinterface name like 'Ethernet2.42'.\nFor a subinterface, the parent physical interface is automatically created.", "pattern": "Ethernet[\\d/]+(.[\\d]+)?", "title": "Name" }, "description": { "type": "string", - "description": "Interface description.\nIf not set a default description will be configured with '[[ ]]'", + "description": "Interface description.\nIf not set a default description will be configured with '[[ ]]'.", "title": "Description" }, "ip_address": { @@ -6349,12 +8251,12 @@ }, "peer": { "type": "string", - "description": "The peer device name. Used for description and documentation", + "description": "The peer device name. Used for description and documentation.", "title": "Peer" }, "peer_interface": { "type": "string", - "description": "The peer device interface. Used for description and documentation", + "description": "The peer device interface. Used for description and documentation.", "title": "Peer Interface" }, "peer_ip": { @@ -6362,13 +8264,42 @@ "description": "The peer device IPv4 address (no mask). Used as default route gateway if `set_default_route` is true and `ip` is an IP address.", "title": "Peer IP" }, + "bgp": { + "type": "object", + "description": "Enforce IPv4 BGP peering for the peer", + "properties": { + "peer_as": { + "type": "string", + "description": "BGP AS <1-4294967295> or AS number in asdot notation \"<1-65535>.<0-65535>\".\nFor asdot notation in YAML inputs, the value must be put in quotes, to prevent it from being interpreted as a float number.", + "title": "Peer As" + }, + "ipv4_prefix_list_in": { + "type": "string", + "description": "Prefix List Name. Accept routes for only these prefixes from the peer.\nRequired for wan interfaces.", + "title": "IPv4 Prefix List In" + }, + "ipv4_prefix_list_out": { + "type": "string", + "description": "Prefix List Name. Advertise routes for only these prefixes.\nIf not specified, nothing would be advertised.", + "title": "IPv4 Prefix List Out" + } + }, + "required": [ + "peer_as" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "BGP" + }, "ipv4_acl_in": { - "description": "Name of the IPv4 access-list to be assigned in the ingress direction.\nThe access-list must be defined under `ipv4_acls`.\nRequired for all WAN interfaces (`wan_carrier` is set) unless the carrier is marked as 'trusted' under `wan_carriers`.", + "description": "Name of the IPv4 access-list to be assigned in the ingress direction.\nThe access-list must be defined under `ipv4_acls` and supports field substitution for \"interface_ip\" and \"peer_ip\".\nRequired for all WAN interfaces (`wan_carrier` is set) unless the carrier is marked as 'trusted' under `wan_carriers`.", "type": "string", "title": "IPv4 Acl In" }, "ipv4_acl_out": { - "description": "Name of the IPv4 Access-list to be assigned in the egress direction.\nThe access-list must be defined under `ipv4_acls`.", + "description": "Name of the IPv4 Access-list to be assigned in the egress direction.\nThe access-list must be defined under `ipv4_acls` and supports field substitution for \"interface_ip\" and \"peer_ip\".", "type": "string", "title": "IPv4 Acl Out" }, @@ -6381,7 +8312,7 @@ "properties": { "prefix": { "type": "string", - "description": "IPv4_network/Mask", + "description": "IPv4_network/Mask.", "title": "Prefix" } }, @@ -6416,11 +8347,69 @@ "description": "For a WAN interface (`wan_carrier` is set), allow to disable the static tunnel towards Pathfinders.", "title": "Connected To Pathfinder" }, + "cv_pathfinder_internet_exit": { + "description": "PREVIEW: This key is in preview mode", + "type": "object", + "properties": { + "policies": { + "type": "array", + "description": "List of Internet-exit policies using this interface as exit.", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Internet-exit policy name.", + "title": "Name" + }, + "tunnel_interface_numbers": { + "type": "string", + "description": "Number range to use for Tunnel interfaces to an internet-exit service provider using this local interface.\nExamples: '1-3' or '100,200,300'", + "title": "Tunnel Interface Numbers" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "title": "Policies" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Cv Pathfinder Internet Exit" + }, "raw_eos_cli": { "type": "string", "description": "EOS CLI rendered directly on the interface in the final EOS configuration.", "title": "Raw EOS CLI" }, + "flow_tracking": { + "type": "object", + "description": "Configures flow-tracking on the interface. Overrides `fabric_flow_tracking.l3_interfaces` setting.", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "name": { + "type": "string", + "description": "Flow tracker name as defined in flow_tracking_settings.", + "title": "Name" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Flow Tracking" + }, "structured_config": { "type": "object", "description": "Custom structured config for the Ethernet interface.", @@ -6441,7 +8430,7 @@ "type": "integer", "minimum": 0, "maximum": 600, - "description": "Interval in seconds for updating interface counters\"", + "description": "Interval in seconds for updating interface counters.", "title": "Load Interval" }, "speed": { @@ -6459,19 +8448,19 @@ "type": "integer", "minimum": 68, "maximum": 65535, - "description": "\"l2_mtu\" should only be defined for platforms supporting the \"l2 mtu\" CLI\n", + "description": "\"l2_mtu\" should only be defined for platforms supporting the \"l2 mtu\" CLI.\n", "title": "L2 MTU" }, "l2_mru": { "type": "integer", "minimum": 68, "maximum": 65535, - "description": "\"l2_mru\" should only be defined for platforms supporting the \"l2 mru\" CLI\n", + "description": "\"l2_mru\" should only be defined for platforms supporting the \"l2 mru\" CLI.\n", "title": "L2 MRU" }, "vlans": { "type": "string", - "description": "List of switchport vlans as string\nFor a trunk port this would be a range like \"1-200,300\"\nFor an access port this would be a single vlan \"123\"\n", + "description": "List of switchport vlans as string.\nFor a trunk port this would be a range like \"1-200,300\".\nFor an access port this would be a single vlan \"123\".\n", "title": "VLANs" }, "native_vlan": { @@ -6480,7 +8469,7 @@ }, "native_vlan_tag": { "type": "boolean", - "description": "If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence", + "description": "If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence.", "title": "Native VLAN Tag" }, "mode": { @@ -6524,12 +8513,12 @@ "properties": { "encapsulation_dot1q_vlan": { "type": "integer", - "description": "Vlan tag to configure on sub-interface", + "description": "Vlan tag to configure on sub-interface.", "title": "Encapsulation Dot1Q VLAN" }, "forwarding_profile": { "type": "string", - "description": "L2 protocol forwarding profile", + "description": "L2 protocol forwarding profile.", "title": "Forwarding Profile" } }, @@ -6567,12 +8556,12 @@ "properties": { "ipv4": { "type": "boolean", - "description": "Enable address locking for IPv4", + "description": "Enable address locking for IPv4.", "title": "IPv4" }, "ipv6": { "type": "boolean", - "description": "Enable address locking for IPv6", + "description": "Enable address locking for IPv6.", "title": "IPv6" } }, @@ -6603,7 +8592,7 @@ }, "vrf": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "VRF" }, "flow_tracker": { @@ -6656,7 +8645,7 @@ "properties": { "name": { "type": "string", - "description": "Group name", + "description": "Group name.", "title": "Name" }, "direction": { @@ -6683,7 +8672,7 @@ "properties": { "identifier": { "type": "string", - "description": "EVPN Ethernet Segment Identifier (Type 1 format)", + "description": "EVPN Ethernet Segment Identifier (Type 1 format).", "title": "Identifier" }, "redundancy": { @@ -6709,12 +8698,12 @@ "type": "integer", "minimum": 0, "maximum": 65535, - "description": "Preference_value is only used when \"algorithm\" is \"preference\"", + "description": "Preference_value is only used when \"algorithm\" is \"preference\".", "title": "Preference Value" }, "dont_preempt": { "type": "boolean", - "description": "Dont_preempt is only used when \"algorithm\" is \"preference\"", + "description": "Dont_preempt is only used when \"algorithm\" is \"preference\".", "title": "Dont Preempt" }, "hold_time": { @@ -6758,7 +8747,7 @@ }, "route_target": { "type": "string", - "description": "EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx", + "description": "EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx.", "title": "Route Target" } }, @@ -6770,7 +8759,7 @@ }, "encapsulation_dot1q_vlan": { "type": "integer", - "description": "VLAN tag to configure on sub-interface", + "description": "VLAN tag to configure on sub-interface.", "title": "Encapsulation Dot1Q VLAN" }, "encapsulation_vlan": { @@ -6784,17 +8773,17 @@ "properties": { "vlan": { "type": "integer", - "description": "Client VLAN ID", + "description": "Client VLAN ID.", "title": "VLAN" }, "outer": { "type": "integer", - "description": "Client Outer VLAN ID", + "description": "Client Outer VLAN ID.", "title": "Outer" }, "inner": { "type": "integer", - "description": "Client Inner VLAN ID", + "description": "Client Inner VLAN ID.", "title": "Inner" } }, @@ -6817,24 +8806,24 @@ }, "network": { "type": "object", - "description": "Network encapsulations are all optional and skipped if using client unmatched", + "description": "Network encapsulations are all optional and skipped if using client unmatched.", "properties": { "dot1q": { "type": "object", "properties": { "vlan": { "type": "integer", - "description": "Network VLAN ID", + "description": "Network VLAN ID.", "title": "VLAN" }, "outer": { "type": "integer", - "description": "Network outer VLAN ID", + "description": "Network outer VLAN ID.", "title": "Outer" }, "inner": { "type": "integer", - "description": "Network inner VLAN ID", + "description": "Network inner VLAN ID.", "title": "Inner" } }, @@ -6870,7 +8859,7 @@ }, "ip_address": { "type": "string", - "description": "IPv4 address/mask or \"dhcp\"", + "description": "IPv4 address/mask or \"dhcp\".", "title": "IP Address" }, "ip_address_secondaries": { @@ -6890,7 +8879,7 @@ }, "dhcp_client_accept_default_route": { "type": "boolean", - "description": "Install default-route obtained via DHCP", + "description": "Install default-route obtained via DHCP.", "title": "DHCP Client Accept Default Route" }, "dhcp_server_ipv4": { @@ -6914,12 +8903,12 @@ }, "source_interface": { "type": "string", - "description": "Source interface name", + "description": "Source interface name.", "title": "Source Interface" }, "vrf": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "VRF" } }, @@ -6986,7 +8975,7 @@ "properties": { "access_list": { "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Access List" }, "comment": { @@ -7006,16 +8995,17 @@ "type": "integer", "minimum": 1, "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Group" }, "original_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address. The combination of `original_ip` and `original_port` must be unique.", "title": "Original IP" }, "original_port": { "type": "integer", + "description": "TCP/UDP port. The combination of `original_ip` and `original_port` must be unique.", "minimum": 1, "maximum": 65535, "title": "Original Port" @@ -7036,20 +9026,19 @@ }, "translated_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.", "title": "Translated IP" }, "translated_port": { "type": "integer", "minimum": 1, "maximum": 65535, - "description": "requires 'original_port'", + "description": "requires 'original_port'.", "title": "Translated Port" } }, "required": [ - "translated_ip", - "original_ip" + "translated_ip" ], "additionalProperties": false, "patternProperties": { @@ -7093,7 +9082,7 @@ }, "pool_name": { "type": "string", - "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone\nignored if 'nat_type' is overload\n", + "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone.\nignored if 'nat_type' is overload.\n", "title": "Pool Name" }, "priority": { @@ -7121,7 +9110,7 @@ "properties": { "access_list": { "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Access List" }, "comment": { @@ -7141,16 +9130,17 @@ "type": "integer", "minimum": 1, "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Group" }, "original_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address. The combination of `original_ip` and `original_port` must be unique.", "title": "Original IP" }, "original_port": { "type": "integer", + "description": "TCP/UDP port. The combination of `original_ip` and `original_port` must be unique.", "minimum": 1, "maximum": 65535, "title": "Original Port" @@ -7171,20 +9161,19 @@ }, "translated_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.", "title": "Translated IP" }, "translated_port": { "type": "integer", "minimum": 1, "maximum": 65535, - "description": "requires 'original_port'", + "description": "requires 'original_port'.", "title": "Translated Port" } }, "required": [ - "translated_ip", - "original_ip" + "translated_ip" ], "additionalProperties": false, "patternProperties": { @@ -7217,7 +9206,7 @@ }, "ipv6_address_link_local": { "type": "string", - "description": "Link local IPv6 address/mask", + "description": "Link local IPv6 address/mask.", "title": "IPv6 Address Link Local" }, "ipv6_nd_ra_disabled": { @@ -7239,12 +9228,12 @@ }, "valid_lifetime": { "type": "string", - "description": "Infinite or lifetime in seconds", + "description": "Infinite or lifetime in seconds.", "title": "Valid Lifetime" }, "preferred_lifetime": { "type": "string", - "description": "Infinite or lifetime in seconds", + "description": "Infinite or lifetime in seconds.", "title": "Preferred Lifetime" }, "no_autoconfig_flag": { @@ -7269,7 +9258,7 @@ "properties": { "address": { "type": "string", - "description": "DHCP server's IPv6 address", + "description": "DHCP server's IPv6 address.", "title": "Address" }, "vrf": { @@ -7278,17 +9267,17 @@ }, "local_interface": { "type": "string", - "description": "Local interface to communicate with DHCP server - mutually exclusive to source_address", + "description": "Local interface to communicate with DHCP server - mutually exclusive to source_address.", "title": "Local Interface" }, "source_address": { "type": "string", - "description": "Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface", + "description": "Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface.", "title": "Source Address" }, "link_address": { "type": "string", - "description": "Override the default link address specified in the relayed DHCP packet", + "description": "Override the default link address specified in the relayed DHCP packet.", "title": "Link Address" } }, @@ -7304,37 +9293,37 @@ }, "access_group_in": { "type": "string", - "description": "Access list name", + "description": "Access list name.", "title": "Access Group In" }, "access_group_out": { "type": "string", - "description": "Access list name", + "description": "Access list name.", "title": "Access Group Out" }, "ipv6_access_group_in": { "type": "string", - "description": "IPv6 access list name", + "description": "IPv6 access list name.", "title": "IPv6 Access Group In" }, "ipv6_access_group_out": { "type": "string", - "description": "IPv6 access list name", + "description": "IPv6 access list name.", "title": "IPv6 Access Group Out" }, "mac_access_group_in": { "type": "string", - "description": "MAC access list name", + "description": "MAC access list name.", "title": "MAC Access Group In" }, "mac_access_group_out": { "type": "string", - "description": "MAC access list name", + "description": "MAC access list name.", "title": "MAC Access Group Out" }, "multicast": { "type": "object", - "description": "Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both", + "description": "Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both.", "properties": { "ipv4": { "type": "object", @@ -7346,7 +9335,7 @@ "properties": { "boundary": { "type": "string", - "description": "ACL name or multicast IP subnet", + "description": "ACL name or multicast IP subnet.", "title": "Boundary" }, "out": { @@ -7382,7 +9371,7 @@ "properties": { "boundary": { "type": "string", - "description": "ACL name or multicast IP subnet", + "description": "ACL name or multicast IP subnet.", "title": "Boundary" } }, @@ -7434,7 +9423,7 @@ }, "ospf_authentication_key": { "type": "string", - "description": "Encrypted password - only type 7 supported", + "description": "Encrypted password - only type 7 supported.", "title": "OSPF Authentication Key" }, "ospf_message_digest_keys": { @@ -7459,7 +9448,7 @@ }, "key": { "type": "string", - "description": "Encrypted password - only type 7 supported", + "description": "Encrypted password - only type 7 supported.", "title": "Key" } }, @@ -7553,6 +9542,37 @@ }, "title": "MAC Security" }, + "tcp_mss_ceiling": { + "type": "object", + "description": "The TCP MSS clamping feature involves clamping the maximum segment size (MSS) in the TCP header\nof TCP SYN packets if it exceeds the configured MSS ceiling limit for the interface.", + "properties": { + "ipv4_segment_size": { + "type": "integer", + "minimum": 64, + "maximum": 65475, + "title": "IPv4 Segment Size" + }, + "ipv6_segment_size": { + "type": "integer", + "minimum": 64, + "maximum": 65475, + "title": "IPv6 Segment Size" + }, + "direction": { + "type": "string", + "enum": [ + "egress", + "ingress" + ], + "title": "Direction" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "TCP Mss Ceiling" + }, "channel_group": { "type": "object", "properties": { @@ -7578,9 +9598,14 @@ }, "isis_enable": { "type": "string", - "description": "ISIS instance", + "description": "ISIS instance.", "title": "ISIS Enable" }, + "isis_bfd": { + "type": "boolean", + "description": "Enable BFD for ISIS.", + "title": "ISIS BFD" + }, "isis_passive": { "type": "boolean", "title": "ISIS Passive" @@ -7616,7 +9641,7 @@ }, "isis_authentication_key": { "type": "string", - "description": "Type-7 encrypted password", + "description": "Type-7 encrypted password.", "title": "ISIS Authentication Key" }, "poe": { @@ -7636,11 +9661,11 @@ "medium", "low" ], - "description": "Prioritize a port's power in the event that one of the switch's power supplies loses power", + "description": "Prioritize a port's power in the event that one of the switch's power supplies loses power.", "title": "Priority" }, "reboot": { - "description": "Set the PoE power behavior for a PoE port when the system is rebooted", + "description": "Set the PoE power behavior for a PoE port when the system is rebooted.", "type": "object", "properties": { "action": { @@ -7649,7 +9674,7 @@ "maintain", "power-off" ], - "description": "PoE action for interface", + "description": "PoE action for interface.", "title": "Action" } }, @@ -7660,7 +9685,7 @@ "title": "Reboot" }, "link_down": { - "description": "Set the PoE power behavior for a PoE port when the port goes down", + "description": "Set the PoE power behavior for a PoE port when the port goes down.", "type": "object", "properties": { "action": { @@ -7669,7 +9694,7 @@ "maintain", "power-off" ], - "description": "PoE action for interface", + "description": "PoE action for interface.", "title": "Action" }, "power_off_delay": { @@ -7687,7 +9712,7 @@ "title": "Link Down" }, "shutdown": { - "description": "Set the PoE power behavior for a PoE port when the port is admin down", + "description": "Set the PoE power behavior for a PoE port when the port is admin down.", "type": "object", "properties": { "action": { @@ -7696,7 +9721,7 @@ "maintain", "power-off" ], - "description": "PoE action for interface", + "description": "PoE action for interface.", "title": "Action" } }, @@ -7722,7 +9747,7 @@ }, "fixed": { "type": "boolean", - "description": "Set to ignore hardware classification", + "description": "Set to ignore hardware classification.", "title": "Fixed" } }, @@ -7810,7 +9835,7 @@ }, "vlan": { "type": "string", - "description": "VLAN can be 'all' or list of vlans as string", + "description": "VLAN can be 'all' or list of vlans as string.", "title": "VLAN" }, "transport": { @@ -7831,7 +9856,7 @@ }, "profile": { "type": "string", - "description": "Interface profile", + "description": "Interface profile.", "title": "Profile" }, "storm_control": { @@ -7842,7 +9867,7 @@ "properties": { "level": { "type": "string", - "description": "Configure maximum storm-control level", + "description": "Configure maximum storm-control level.", "title": "Level" }, "unit": { @@ -7852,7 +9877,7 @@ "percent", "pps" ], - "description": "Optional field and is hardware dependent", + "description": "Optional field and is hardware dependent.", "title": "Unit" } }, @@ -7867,7 +9892,7 @@ "properties": { "level": { "type": "string", - "description": "Configure maximum storm-control level", + "description": "Configure maximum storm-control level.", "title": "Level" }, "unit": { @@ -7877,7 +9902,7 @@ "percent", "pps" ], - "description": "Optional field and is hardware dependent", + "description": "Optional field and is hardware dependent.", "title": "Unit" } }, @@ -7892,7 +9917,7 @@ "properties": { "level": { "type": "string", - "description": "Configure maximum storm-control level", + "description": "Configure maximum storm-control level.", "title": "Level" }, "unit": { @@ -7902,7 +9927,7 @@ "percent", "pps" ], - "description": "Optional field and is hardware dependent", + "description": "Optional field and is hardware dependent.", "title": "Unit" } }, @@ -7917,7 +9942,7 @@ "properties": { "level": { "type": "string", - "description": "Configure maximum storm-control level", + "description": "Configure maximum storm-control level.", "title": "Level" }, "unit": { @@ -7927,7 +9952,7 @@ "percent", "pps" ], - "description": "Optional field and is hardware dependent", + "description": "Optional field and is hardware dependent.", "title": "Unit" } }, @@ -7994,7 +10019,7 @@ }, "ztp_vlan": { "type": "integer", - "description": "ZTP vlan number", + "description": "ZTP vlan number.", "title": "ZTP VLAN" } }, @@ -8010,7 +10035,7 @@ }, "pvlan_mapping": { "type": "string", - "description": "List of vlans as string", + "description": "List of vlans as string.", "title": "PVLAN Mapping" }, "vlan_translations": { @@ -8020,12 +10045,12 @@ "properties": { "from": { "type": "string", - "description": "List of vlans as string (only one vlan if direction is \"both\")", + "description": "List of vlans as string (only one vlan if direction is \"both\").", "title": "From" }, "to": { "type": "integer", - "description": "VLAN ID", + "description": "VLAN ID.", "title": "To" }, "direction": { @@ -8168,7 +10193,7 @@ }, "reauth_period": { "type": "string", - "description": "Value can be 60-4294967295 or 'server'", + "description": "Value can be 60-4294967295 or 'server'.", "title": "Reauth Period" }, "reauth_timeout_ignore": { @@ -8255,7 +10280,7 @@ }, "service_profile": { "type": "string", - "description": "QOS profile", + "description": "QOS profile.", "title": "Service Profile" }, "shape": { @@ -8263,7 +10288,7 @@ "properties": { "rate": { "type": "string", - "description": "Rate in kbps, pps or percent\nSupported options are platform dependent\nExamples:\n- \"5000 kbps\"\n- \"1000 pps\"\n- \"20 percent\"\n", + "description": "Rate in kbps, pps or percent.\nSupported options are platform dependent.\nExamples:\n- \"5000 kbps\"\n- \"1000 pps\"\n- \"20 percent\"\n", "title": "Rate" } }, @@ -8287,12 +10312,12 @@ }, "dscp": { "type": "integer", - "description": "DSCP value", + "description": "DSCP value.", "title": "DSCP" }, "cos": { "type": "integer", - "description": "COS value", + "description": "COS value.", "title": "COS" } }, @@ -8396,12 +10421,12 @@ }, "interval": { "type": "integer", - "description": "Interval in milliseconds", + "description": "Interval in milliseconds.", "title": "Interval" }, "min_rx": { "type": "integer", - "description": "Rate in milliseconds", + "description": "Rate in milliseconds.", "title": "Min RX" }, "multiplier": { @@ -8425,7 +10450,7 @@ "properties": { "input": { "type": "string", - "description": "Policy Based Routing Policy-map name", + "description": "Policy Based Routing Policy-map name.", "title": "Input" } }, @@ -8440,7 +10465,7 @@ "properties": { "input": { "type": "string", - "description": "Quality of Service Policy-map name", + "description": "Quality of Service Policy-map name.", "title": "Input" } }, @@ -8525,12 +10550,25 @@ "transceiver": { "type": "object", "properties": { + "frequency": { + "type": "string", + "description": "Transceiver Laser Frequency in GHz (min 190000, max 200000).", + "title": "Frequency" + }, + "frequency_unit": { + "type": "string", + "enum": [ + "ghz" + ], + "description": "Unit of Transceiver Laser Frequency.", + "title": "Frequency Unit" + }, "media": { "type": "object", "properties": { "override": { "type": "string", - "description": "Transceiver type", + "description": "Transceiver type.", "title": "Override" } }, @@ -8556,12 +10594,12 @@ "properties": { "input": { "type": "string", - "description": "Ingress traffic policy", + "description": "Ingress traffic policy.", "title": "Input" }, "output": { "type": "string", - "description": "Egress traffic policy", + "description": "Egress traffic policy.", "title": "Output" } }, @@ -8576,7 +10614,7 @@ "properties": { "session_tracker": { "type": "string", - "description": "Name of session tracker", + "description": "Name of session tracker.", "title": "Session Tracker" } }, @@ -8700,17 +10738,17 @@ }, "peer": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Peer" }, "peer_interface": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Peer Interface" }, "peer_type": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Peer Type" }, "sflow": { @@ -8747,7 +10785,7 @@ }, "port_profile": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Port Profile" }, "uc_tx_queues": { @@ -8757,19 +10795,19 @@ "properties": { "id": { "type": "integer", - "description": "TX-Queue ID", + "description": "TX-Queue ID.", "title": "ID" }, "random_detect": { "type": "object", "properties": { "ecn": { - "description": "Explicit Congestion Notification", + "description": "Explicit Congestion Notification.", "type": "object", "properties": { "count": { "type": "boolean", - "description": "Enable counter for random-detect ECNs", + "description": "Enable counter for random-detect ECNs.", "title": "Count" }, "threshold": { @@ -8784,35 +10822,35 @@ "mbytes", "milliseconds" ], - "description": "Indicate the units to be used for the threshold values", + "description": "Indicate the units to be used for the threshold values.", "title": "Units" }, "min": { "type": "integer", "minimum": 1, "maximum": 256000000, - "description": "Set the random-detect ECN minimum-threshold", + "description": "Set the random-detect ECN minimum-threshold.", "title": "Min" }, "max": { "type": "integer", "minimum": 1, "maximum": 256000000, - "description": "Set the random-detect ECN maximum-threshold", + "description": "Set the random-detect ECN maximum-threshold.", "title": "Max" }, "max_probability": { "type": "integer", "minimum": 1, "maximum": 100, - "description": "Set the random-detect ECN max-mark-probability", + "description": "Set the random-detect ECN max-mark-probability.", "title": "Max Probability" }, "weight": { "type": "integer", "minimum": 0, "maximum": 15, - "description": "Set the random-detect ECN weight", + "description": "Set the random-detect ECN weight.", "title": "Weight" } }, @@ -8859,19 +10897,19 @@ "properties": { "id": { "type": "integer", - "description": "TX-Queue ID", + "description": "TX-Queue ID.", "title": "ID" }, "random_detect": { "type": "object", "properties": { "ecn": { - "description": "Explicit Congestion Notification", + "description": "Explicit Congestion Notification.", "type": "object", "properties": { "count": { "type": "boolean", - "description": "Enable counter for random-detect ECNs", + "description": "Enable counter for random-detect ECNs.", "title": "Count" }, "threshold": { @@ -8886,35 +10924,35 @@ "mbytes", "milliseconds" ], - "description": "Indicate the units to be used for the threshold values", + "description": "Indicate the units to be used for the threshold values.", "title": "Units" }, "min": { "type": "integer", "minimum": 1, "maximum": 256000000, - "description": "Set the random-detect ECN minimum-threshold", + "description": "Set the random-detect ECN minimum-threshold.", "title": "Min" }, "max": { "type": "integer", "minimum": 1, "maximum": 256000000, - "description": "Set the random-detect ECN maximum-threshold", + "description": "Set the random-detect ECN maximum-threshold.", "title": "Max" }, "max_probability": { "type": "integer", "minimum": 1, "maximum": 100, - "description": "Set the random-detect ECN max-mark-probability", + "description": "Set the random-detect ECN max-mark-probability.", "title": "Max Probability" }, "weight": { "type": "integer", "minimum": 0, "maximum": 15, - "description": "Set the random-detect ECN weight", + "description": "Set the random-detect ECN weight.", "title": "Weight" } }, @@ -8962,12 +11000,12 @@ "properties": { "id": { "type": "integer", - "description": "VRID", + "description": "VRID.", "title": "ID" }, "priority_level": { "type": "integer", - "description": "Instance priority", + "description": "Instance priority.", "minimum": 1, "maximum": 254, "title": "Priority Level" @@ -8977,7 +11015,7 @@ "properties": { "interval": { "type": "integer", - "description": "Interval in seconds", + "description": "Interval in seconds.", "minimum": 1, "maximum": 255, "title": "Interval" @@ -9001,14 +11039,14 @@ "properties": { "minimum": { "type": "integer", - "description": "Minimum preempt delay in seconds", + "description": "Minimum preempt delay in seconds.", "minimum": 0, "maximum": 3600, "title": "Minimum" }, "reload": { "type": "integer", - "description": "Reload preempt delay in seconds", + "description": "Reload preempt delay in seconds.", "minimum": 0, "maximum": 3600, "title": "Reload" @@ -9064,14 +11102,14 @@ "properties": { "name": { "type": "string", - "description": "Tracked object name", + "description": "Tracked object name.", "title": "Name" }, "decrement": { "type": "integer", "minimum": 1, "maximum": 254, - "description": "Decrement VRRP priority by 1-254", + "description": "Decrement VRRP priority by 1-254.", "title": "Decrement" }, "shutdown": { @@ -9094,7 +11132,7 @@ "properties": { "address": { "type": "string", - "description": "Virtual IPv4 address", + "description": "Virtual IPv4 address.", "title": "Address" }, "version": { @@ -9120,7 +11158,7 @@ "properties": { "address": { "type": "string", - "description": "Virtual IPv6 address", + "description": "Virtual IPv6 address.", "title": "Address" } }, @@ -9146,7 +11184,7 @@ }, "validate_state": { "type": "boolean", - "description": "Set to false to disable interface validation by the `eos_validate_state` role", + "description": "Set to false to disable interface validation by the `eos_validate_state` role.", "title": "Validate State" }, "switchport": { @@ -9255,7 +11293,7 @@ }, "eos_cli": { "type": "string", - "description": "Multiline EOS CLI rendered directly on the ethernet interface in the final EOS configuration", + "description": "Multiline EOS CLI rendered directly on the ethernet interface in the final EOS configuration.", "title": "EOS CLI" } }, @@ -9282,7 +11320,7 @@ "type": "object", "properties": { "name": { - "description": "Username", + "description": "Username.", "type": "string", "title": "Name" }, @@ -9300,12 +11338,12 @@ }, "role": { "type": "string", - "description": "EOS RBAC Role to be assigned to the user such as \"network-admin\" or \"network-operator\"\n", + "description": "EOS RBAC Role to be assigned to the user such as \"network-admin\" or \"network-operator\".\n", "title": "Role" }, "sha512_password": { "type": "string", - "description": "SHA512 Hash of Password\nMust be the hash of the password. By default EOS salts the password with the username, so the simplest is to generate the hash on an EOS device using the same username.\n", + "description": "SHA512 Hash of Password.\nMust be the hash of the password. By default EOS salts the password with the username, so the simplest is to generate the hash on an EOS device using the same username.\n", "title": "SHA512 Password" }, "no_password": { @@ -9323,7 +11361,7 @@ }, "shell": { "type": "string", - "description": "Specify shell for the user\n", + "description": "Specify shell for the user.\n", "enum": [ "/bin/bash", "/bin/sh", @@ -9452,7 +11490,7 @@ "description": "List of DNS servers. The VRF is set to < mgmt_interface_vrf >.", "items": { "type": "string", - "description": "IPv4 address" + "description": "IPv4 or IPv6 address." }, "title": "Name Servers" }, @@ -9519,14 +11557,14 @@ "type": "integer", "minimum": 68, "maximum": 65535, - "description": "\"l2_mtu\" should only be defined for platforms supporting the \"l2 mtu\" CLI\n", + "description": "\"l2_mtu\" should only be defined for platforms supporting the \"l2 mtu\" CLI.\n", "title": "L2 MTU" }, "l2_mru": { "type": "integer", "minimum": 68, "maximum": 65535, - "description": "\"l2_mru\" should only be defined for platforms supporting the \"l2 mru\" CLI\n", + "description": "\"l2_mru\" should only be defined for platforms supporting the \"l2 mru\" CLI.\n", "title": "L2 MRU" }, "native_vlan": { @@ -9626,7 +11664,7 @@ }, "qos_profile": { "type": "string", - "description": "QOS profile name", + "description": "QOS profile name.", "title": "QOS Profile" }, "ptp": { @@ -9667,9 +11705,29 @@ }, "sflow": { "type": "boolean", - "description": "Configures sFlow on the interface. Overrides `fabric_sflow` setting.\n", + "description": "Configures sFlow on the interface. Overrides `fabric_sflow.endpoints` setting.", "title": "Sflow" }, + "flow_tracking": { + "type": "object", + "description": "Configures flow-tracking on the interface. Overrides `fabric_flow_tracking.endpoints` setting.", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "name": { + "type": "string", + "description": "Flow tracker name as defined in flow_tracking_settings.", + "title": "Name" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Flow Tracking" + }, "link_tracking": { "type": "object", "description": "Configure the downstream interfaces of a respective Link Tracking Group.\nIf `port_channel` is defined in an adapter, then the port-channel interface is configured to be the downstream.\nElse all the ethernet interfaces will be configured as downstream -> to configure single-active EVPN multihomed networks.\n", @@ -9882,11 +11940,11 @@ "medium", "low" ], - "description": "Prioritize a port's power in the event that one of the switch's power supplies loses power", + "description": "Prioritize a port's power in the event that one of the switch's power supplies loses power.", "title": "Priority" }, "reboot": { - "description": "Set the PoE power behavior for a PoE port when the system is rebooted", + "description": "Set the PoE power behavior for a PoE port when the system is rebooted.", "type": "object", "properties": { "action": { @@ -9895,7 +11953,7 @@ "maintain", "power-off" ], - "description": "PoE action for interface", + "description": "PoE action for interface.", "title": "Action" } }, @@ -9906,7 +11964,7 @@ "title": "Reboot" }, "link_down": { - "description": "Set the PoE power behavior for a PoE port when the port goes down", + "description": "Set the PoE power behavior for a PoE port when the port goes down.", "type": "object", "properties": { "action": { @@ -9915,7 +11973,7 @@ "maintain", "power-off" ], - "description": "PoE action for interface", + "description": "PoE action for interface.", "title": "Action" }, "power_off_delay": { @@ -9933,7 +11991,7 @@ "title": "Link Down" }, "shutdown": { - "description": "Set the PoE power behavior for a PoE port when the port is admin down", + "description": "Set the PoE power behavior for a PoE port when the port is admin down.", "type": "object", "properties": { "action": { @@ -9942,7 +12000,7 @@ "maintain", "power-off" ], - "description": "PoE action for interface", + "description": "PoE action for interface.", "title": "Action" } }, @@ -9968,7 +12026,7 @@ }, "fixed": { "type": "boolean", - "description": "Set to ignore hardware classification", + "description": "Set to ignore hardware classification.", "title": "Fixed" } }, @@ -10232,7 +12290,7 @@ }, "size": { "type": "integer", - "description": "Size in bytes", + "description": "Size in bytes.", "title": "Size" } }, @@ -10341,6 +12399,12 @@ "description": "Port-Channel administrative state.\nSetting to false will set port to 'shutdown' in intended configuration.\n", "title": "Enabled" }, + "ptp_mpass": { + "type": "boolean", + "default": false, + "description": "When MPASS is enabled on an MLAG port-channel, MLAG peers coordinate to function as a single PTP logical device.\nArista PTP enabled devices always place PTP messages on the same physical link within the port-channel.\nHence, MPASS is needed only on MLAG port-channels connected to non-Arista devices.", + "title": "PTP Mpass" + }, "short_esi": { "type": "string", "description": "In format xxxx:xxxx:xxxx or \"auto\".\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use ethernet_segment.short_esi instead.", @@ -10421,12 +12485,12 @@ "properties": { "number": { "type": "integer", - "description": "Subinterface number", + "description": "Subinterface number.", "title": "Number" }, "short_esi": { "type": "string", - "description": "In format xxxx:xxxx:xxxx or \"auto\"\nRequired for multihomed port-channels with subinterfaces\n", + "description": "In format xxxx:xxxx:xxxx or \"auto\".\nRequired for multihomed port-channels with subinterfaces.\n", "title": "Short Esi" }, "vlan_id": { @@ -10515,19 +12579,19 @@ "type": "integer", "minimum": 68, "maximum": 65535, - "description": "\"l2_mtu\" should only be defined for platforms supporting the \"l2 mtu\" CLI\n", + "description": "\"l2_mtu\" should only be defined for platforms supporting the \"l2 mtu\" CLI.\n", "title": "L2 MTU" }, "l2_mru": { "type": "integer", "minimum": 68, "maximum": 65535, - "description": "\"l2_mru\" should only be defined for platforms supporting the \"l2 mru\" CLI\n", + "description": "\"l2_mru\" should only be defined for platforms supporting the \"l2 mru\" CLI.\n", "title": "L2 MRU" }, "vlans": { "type": "string", - "description": "List of switchport vlans as string\nFor a trunk port this would be a range like \"1-200,300\"\nFor an access port this would be a single vlan \"123\"\n", + "description": "List of switchport vlans as string.\nFor a trunk port this would be a range like \"1-200,300\".\nFor an access port this would be a single vlan \"123\".\n", "title": "VLANs" }, "snmp_trap_link_change": { @@ -10547,12 +12611,12 @@ }, "encapsulation_dot1q_vlan": { "type": "integer", - "description": "VLAN tag to configure on sub-interface", + "description": "VLAN tag to configure on sub-interface.", "title": "Encapsulation Dot1Q VLAN" }, "vrf": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "VRF" }, "encapsulation_vlan": { @@ -10566,17 +12630,17 @@ "properties": { "vlan": { "type": "integer", - "description": "Client VLAN ID", + "description": "Client VLAN ID.", "title": "VLAN" }, "outer": { "type": "integer", - "description": "Client Outer VLAN ID", + "description": "Client Outer VLAN ID.", "title": "Outer" }, "inner": { "type": "integer", - "description": "Client Inner VLAN ID", + "description": "Client Inner VLAN ID.", "title": "Inner" } }, @@ -10599,24 +12663,24 @@ }, "network": { "type": "object", - "description": "Network encapsulation are all optional, and skipped if using client unmatched", + "description": "Network encapsulation are all optional, and skipped if using client unmatched.", "properties": { "dot1q": { "type": "object", "properties": { "vlan": { "type": "integer", - "description": "Network VLAN ID", + "description": "Network VLAN ID.", "title": "VLAN" }, "outer": { "type": "integer", - "description": "Network Outer VLAN ID", + "description": "Network Outer VLAN ID.", "title": "Outer" }, "inner": { "type": "integer", - "description": "Network Inner VLAN ID", + "description": "Network Inner VLAN ID.", "title": "Inner" } }, @@ -10662,13 +12726,13 @@ }, "native_vlan": { "type": "integer", - "description": "If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence", + "description": "If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence.", "title": "Native VLAN" }, "native_vlan_tag": { "type": "boolean", "default": false, - "description": "If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence", + "description": "If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence.", "title": "Native VLAN Tag" }, "link_tracking_groups": { @@ -10678,7 +12742,7 @@ "properties": { "name": { "type": "string", - "description": "Group name", + "description": "Group name.", "title": "Name" }, "direction": { @@ -10729,12 +12793,12 @@ "properties": { "encapsulation_dot1q_vlan": { "type": "integer", - "description": "Vlan tag to configure on sub-interface", + "description": "Vlan tag to configure on sub-interface.", "title": "Encapsulation Dot1Q VLAN" }, "forwarding_profile": { "type": "string", - "description": "L2 protocol forwarding profile", + "description": "L2 protocol forwarding profile.", "title": "Forwarding Profile" } }, @@ -10752,7 +12816,7 @@ }, "mlag": { "type": "integer", - "description": "MLAG ID", + "description": "MLAG ID.", "minimum": 1, "maximum": 2000, "title": "MLAG" @@ -10766,7 +12830,7 @@ }, "lacp_fallback_timeout": { "type": "integer", - "description": "Timeout in seconds", + "description": "Timeout in seconds.", "default": 90, "minimum": 0, "maximum": 300, @@ -10794,12 +12858,12 @@ }, "dscp": { "type": "integer", - "description": "DSCP value", + "description": "DSCP value.", "title": "DSCP" }, "cos": { "type": "integer", - "description": "COS value", + "description": "COS value.", "title": "COS" } }, @@ -10818,12 +12882,12 @@ }, "interval": { "type": "integer", - "description": "Interval in milliseconds", + "description": "Interval in milliseconds.", "title": "Interval" }, "min_rx": { "type": "integer", - "description": "Rate in milliseconds", + "description": "Rate in milliseconds.", "title": "Min RX" }, "multiplier": { @@ -10870,7 +12934,7 @@ "properties": { "input": { "type": "string", - "description": "Policy Based Routing Policy-map name", + "description": "Policy Based Routing Policy-map name.", "title": "Input" } }, @@ -10885,7 +12949,7 @@ "properties": { "input": { "type": "string", - "description": "Quality of Service Policy-map name", + "description": "Quality of Service Policy-map name.", "title": "Input" } }, @@ -10943,7 +13007,7 @@ }, "pvlan_mapping": { "type": "string", - "description": "List of vlans as string", + "description": "List of vlans as string.", "title": "PVLAN Mapping" }, "vlan_translations": { @@ -10953,12 +13017,12 @@ "properties": { "from": { "type": "string", - "description": "List of vlans as string (only one vlan if direction is \"both\")", + "description": "List of vlans as string (only one vlan if direction is \"both\").", "title": "From" }, "to": { "type": "integer", - "description": "VLAN ID", + "description": "VLAN ID.", "title": "To" }, "direction": { @@ -10984,7 +13048,7 @@ "properties": { "rate": { "type": "string", - "description": "Rate in kbps, pps or percent\nSupported options are platform dependent\nExamples:\n- \"5000 kbps\"\n- \"1000 pps\"\n- \"20 percent\"\n", + "description": "Rate in kbps, pps or percent.\nSupported options are platform dependent.\nExamples:\n- \"5000 kbps\"\n- \"1000 pps\"\n- \"20 percent\"\n", "title": "Rate" } }, @@ -11002,7 +13066,7 @@ "properties": { "level": { "type": "string", - "description": "Configure maximum storm-control level", + "description": "Configure maximum storm-control level.", "title": "Level" }, "unit": { @@ -11012,7 +13076,7 @@ "percent", "pps" ], - "description": "Optional field and is hardware dependent", + "description": "Optional field and is hardware dependent.", "title": "Unit" } }, @@ -11027,7 +13091,7 @@ "properties": { "level": { "type": "string", - "description": "Configure maximum storm-control level", + "description": "Configure maximum storm-control level.", "title": "Level" }, "unit": { @@ -11037,7 +13101,7 @@ "percent", "pps" ], - "description": "Optional field and is hardware dependent", + "description": "Optional field and is hardware dependent.", "title": "Unit" } }, @@ -11052,7 +13116,7 @@ "properties": { "level": { "type": "string", - "description": "Configure maximum storm-control level", + "description": "Configure maximum storm-control level.", "title": "Level" }, "unit": { @@ -11062,7 +13126,7 @@ "percent", "pps" ], - "description": "Optional field and is hardware dependent", + "description": "Optional field and is hardware dependent.", "title": "Unit" } }, @@ -11077,7 +13141,7 @@ "properties": { "level": { "type": "string", - "description": "Configure maximum storm-control level", + "description": "Configure maximum storm-control level.", "title": "Level" }, "unit": { @@ -11087,7 +13151,7 @@ "percent", "pps" ], - "description": "Optional field and is hardware dependent", + "description": "Optional field and is hardware dependent.", "title": "Unit" } }, @@ -11110,9 +13174,14 @@ }, "isis_enable": { "type": "string", - "description": "ISIS instance", + "description": "ISIS instance.", "title": "ISIS Enable" }, + "isis_bfd": { + "type": "boolean", + "description": "Enable BFD for ISIS.", + "title": "ISIS BFD" + }, "isis_passive": { "type": "boolean", "title": "ISIS Passive" @@ -11148,7 +13217,7 @@ }, "isis_authentication_key": { "type": "string", - "description": "Type-7 encrypted password", + "description": "Type-7 encrypted password.", "title": "ISIS Authentication Key" }, "traffic_policy": { @@ -11156,12 +13225,12 @@ "properties": { "input": { "type": "string", - "description": "Ingress traffic policy", + "description": "Ingress traffic policy.", "title": "Input" }, "output": { "type": "string", - "description": "Egress traffic policy", + "description": "Egress traffic policy.", "title": "Output" } }, @@ -11176,7 +13245,7 @@ "properties": { "identifier": { "type": "string", - "description": "EVPN Ethernet Segment Identifier (Type 1 format)", + "description": "EVPN Ethernet Segment Identifier (Type 1 format).", "title": "Identifier" }, "redundancy": { @@ -11202,12 +13271,12 @@ "type": "integer", "minimum": 0, "maximum": 65535, - "description": "Preference_value is only used when \"algorithm\" is \"preference\"", + "description": "Preference_value is only used when \"algorithm\" is \"preference\".", "title": "Preference Value" }, "dont_preempt": { "type": "boolean", - "description": "Dont_preempt is only used when \"algorithm\" is \"preference\"", + "description": "Dont_preempt is only used when \"algorithm\" is \"preference\".", "default": false, "title": "Dont Preempt" }, @@ -11252,7 +13321,7 @@ }, "route_target": { "type": "string", - "description": "EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx", + "description": "EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx.", "title": "Route Target" } }, @@ -11264,19 +13333,19 @@ }, "esi": { "type": "string", - "description": "EVPN Ethernet Segment Identifier (Type 1 format)\nIf both \"esi\" and \"evpn_ethernet_segment.identifier\" are defined, the new variable takes precedence\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use evpn_ethernet_segment.identifier instead.", + "description": "EVPN Ethernet Segment Identifier (Type 1 format).\nIf both \"esi\" and \"evpn_ethernet_segment.identifier\" are defined, the new variable takes precedence.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use evpn_ethernet_segment.identifier instead.", "deprecated": true, "title": "Esi" }, "rt": { "type": "string", - "description": "EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx\nIf both \"rt\" and \"evpn_ethernet_segment.route_target\" are defined, the new variable takes precedence\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use evpn_ethernet_segment.route_target instead.", + "description": "EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx.\nIf both \"rt\" and \"evpn_ethernet_segment.route_target\" are defined, the new variable takes precedence.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use evpn_ethernet_segment.route_target instead.", "deprecated": true, "title": "Rt" }, "lacp_id": { "type": "string", - "description": "LACP ID with format xxxx.xxxx.xxxx", + "description": "LACP ID with format xxxx.xxxx.xxxx.", "title": "LACP ID" }, "spanning_tree_bpdufilter": { @@ -11385,7 +13454,7 @@ }, "vlan": { "type": "string", - "description": "VLAN can be 'all' or list of vlans as string", + "description": "VLAN can be 'all' or list of vlans as string.", "title": "VLAN" }, "transport": { @@ -11396,6 +13465,11 @@ "layer2" ], "title": "Transport" + }, + "mpass": { + "type": "boolean", + "description": "When MPASS is enabled on an MLAG port-channel, MLAG peers coordinate to function as a single PTP logical device.\nArista PTP enabled devices always place PTP messages on the same physical link within the port-channel.\nHence, MPASS is needed only on MLAG port-channels connected to non-Arista devices.", + "title": "Mpass" } }, "additionalProperties": false, @@ -11406,7 +13480,7 @@ }, "ip_address": { "type": "string", - "description": "IPv4 address/mask", + "description": "IPv4 address/mask.", "title": "IP Address" }, "ip_verify_unicast_source_reachable_via": { @@ -11465,7 +13539,7 @@ "properties": { "access_list": { "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Access List" }, "comment": { @@ -11485,16 +13559,17 @@ "type": "integer", "minimum": 1, "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Group" }, "original_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address. The combination of `original_ip` and `original_port` must be unique.", "title": "Original IP" }, "original_port": { "type": "integer", + "description": "TCP/UDP port. The combination of `original_ip` and `original_port` must be unique.", "minimum": 1, "maximum": 65535, "title": "Original Port" @@ -11515,20 +13590,19 @@ }, "translated_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.", "title": "Translated IP" }, "translated_port": { "type": "integer", "minimum": 1, "maximum": 65535, - "description": "requires 'original_port'", + "description": "requires 'original_port'.", "title": "Translated Port" } }, "required": [ - "translated_ip", - "original_ip" + "translated_ip" ], "additionalProperties": false, "patternProperties": { @@ -11572,7 +13646,7 @@ }, "pool_name": { "type": "string", - "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone\nignored if 'nat_type' is overload\n", + "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone.\nignored if 'nat_type' is overload.\n", "title": "Pool Name" }, "priority": { @@ -11600,7 +13674,7 @@ "properties": { "access_list": { "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Access List" }, "comment": { @@ -11620,16 +13694,17 @@ "type": "integer", "minimum": 1, "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Group" }, "original_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address. The combination of `original_ip` and `original_port` must be unique.", "title": "Original IP" }, "original_port": { "type": "integer", + "description": "TCP/UDP port. The combination of `original_ip` and `original_port` must be unique.", "minimum": 1, "maximum": 65535, "title": "Original Port" @@ -11650,20 +13725,19 @@ }, "translated_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.", "title": "Translated IP" }, "translated_port": { "type": "integer", "minimum": 1, "maximum": 65535, - "description": "requires 'original_port'", + "description": "requires 'original_port'.", "title": "Translated Port" } }, "required": [ - "translated_ip", - "original_ip" + "translated_ip" ], "additionalProperties": false, "patternProperties": { @@ -11692,12 +13766,12 @@ }, "ipv6_address": { "type": "string", - "description": "IPv6 address/mask", + "description": "IPv6 address/mask.", "title": "IPv6 Address" }, "ipv6_address_link_local": { "type": "string", - "description": "Link local IPv6 address/mask", + "description": "Link local IPv6 address/mask.", "title": "IPv6 Address Link Local" }, "ipv6_nd_ra_disabled": { @@ -11719,12 +13793,12 @@ }, "valid_lifetime": { "type": "string", - "description": "Infinite or lifetime in seconds", + "description": "Infinite or lifetime in seconds.", "title": "Valid Lifetime" }, "preferred_lifetime": { "type": "string", - "description": "Infinite or lifetime in seconds", + "description": "Infinite or lifetime in seconds.", "title": "Preferred Lifetime" }, "no_autoconfig_flag": { @@ -11744,32 +13818,32 @@ }, "access_group_in": { "type": "string", - "description": "Access list name", + "description": "Access list name.", "title": "Access Group In" }, "access_group_out": { "type": "string", - "description": "Access list name", + "description": "Access list name.", "title": "Access Group Out" }, "ipv6_access_group_in": { "type": "string", - "description": "IPv6 access list name", + "description": "IPv6 access list name.", "title": "IPv6 Access Group In" }, "ipv6_access_group_out": { "type": "string", - "description": "IPv6 access list name", + "description": "IPv6 access list name.", "title": "IPv6 Access Group Out" }, "mac_access_group_in": { "type": "string", - "description": "MAC access list name", + "description": "MAC access list name.", "title": "MAC Access Group In" }, "mac_access_group_out": { "type": "string", - "description": "MAC access list name", + "description": "MAC access list name.", "title": "MAC Access Group Out" }, "pim": { @@ -11840,7 +13914,7 @@ }, "service_profile": { "type": "string", - "description": "QOS profile", + "description": "QOS profile.", "title": "Service Profile" }, "ospf_network_point_to_point": { @@ -11866,7 +13940,7 @@ }, "ospf_authentication_key": { "type": "string", - "description": "Encrypted password", + "description": "Encrypted password.", "title": "OSPF Authentication Key" }, "ospf_message_digest_keys": { @@ -11891,7 +13965,7 @@ }, "key": { "type": "string", - "description": "Encrypted password", + "description": "Encrypted password.", "title": "Key" } }, @@ -11930,7 +14004,7 @@ "properties": { "session_tracker": { "type": "string", - "description": "Name of session tracker", + "description": "Name of session tracker.", "title": "Session Tracker" } }, @@ -12054,17 +14128,17 @@ }, "peer": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Peer" }, "peer_interface": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Peer Interface" }, "peer_type": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Peer Type" }, "sflow": { @@ -12101,12 +14175,12 @@ }, "validate_state": { "type": "boolean", - "description": "Set to false to disable interface validation by the `eos_validate_state` role", + "description": "Set to false to disable interface validation by the `eos_validate_state` role.", "title": "Validate State" }, "eos_cli": { "type": "string", - "description": "Multiline EOS CLI rendered directly on the port-channel interface in the final EOS configuration", + "description": "Multiline EOS CLI rendered directly on the port-channel interface in the final EOS configuration.", "title": "EOS CLI" } }, @@ -12153,7 +14227,7 @@ "type": "integer", "minimum": 0, "maximum": 600, - "description": "Interval in seconds for updating interface counters\"", + "description": "Interval in seconds for updating interface counters.", "title": "Load Interval" }, "speed": { @@ -12171,19 +14245,19 @@ "type": "integer", "minimum": 68, "maximum": 65535, - "description": "\"l2_mtu\" should only be defined for platforms supporting the \"l2 mtu\" CLI\n", + "description": "\"l2_mtu\" should only be defined for platforms supporting the \"l2 mtu\" CLI.\n", "title": "L2 MTU" }, "l2_mru": { "type": "integer", "minimum": 68, "maximum": 65535, - "description": "\"l2_mru\" should only be defined for platforms supporting the \"l2 mru\" CLI\n", + "description": "\"l2_mru\" should only be defined for platforms supporting the \"l2 mru\" CLI.\n", "title": "L2 MRU" }, "vlans": { "type": "string", - "description": "List of switchport vlans as string\nFor a trunk port this would be a range like \"1-200,300\"\nFor an access port this would be a single vlan \"123\"\n", + "description": "List of switchport vlans as string.\nFor a trunk port this would be a range like \"1-200,300\".\nFor an access port this would be a single vlan \"123\".\n", "title": "VLANs" }, "native_vlan": { @@ -12192,7 +14266,7 @@ }, "native_vlan_tag": { "type": "boolean", - "description": "If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence", + "description": "If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence.", "title": "Native VLAN Tag" }, "mode": { @@ -12236,12 +14310,12 @@ "properties": { "encapsulation_dot1q_vlan": { "type": "integer", - "description": "Vlan tag to configure on sub-interface", + "description": "Vlan tag to configure on sub-interface.", "title": "Encapsulation Dot1Q VLAN" }, "forwarding_profile": { "type": "string", - "description": "L2 protocol forwarding profile", + "description": "L2 protocol forwarding profile.", "title": "Forwarding Profile" } }, @@ -12279,12 +14353,12 @@ "properties": { "ipv4": { "type": "boolean", - "description": "Enable address locking for IPv4", + "description": "Enable address locking for IPv4.", "title": "IPv4" }, "ipv6": { "type": "boolean", - "description": "Enable address locking for IPv6", + "description": "Enable address locking for IPv6.", "title": "IPv6" } }, @@ -12315,7 +14389,7 @@ }, "vrf": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "VRF" }, "flow_tracker": { @@ -12368,7 +14442,7 @@ "properties": { "name": { "type": "string", - "description": "Group name", + "description": "Group name.", "title": "Name" }, "direction": { @@ -12395,7 +14469,7 @@ "properties": { "identifier": { "type": "string", - "description": "EVPN Ethernet Segment Identifier (Type 1 format)", + "description": "EVPN Ethernet Segment Identifier (Type 1 format).", "title": "Identifier" }, "redundancy": { @@ -12421,12 +14495,12 @@ "type": "integer", "minimum": 0, "maximum": 65535, - "description": "Preference_value is only used when \"algorithm\" is \"preference\"", + "description": "Preference_value is only used when \"algorithm\" is \"preference\".", "title": "Preference Value" }, "dont_preempt": { "type": "boolean", - "description": "Dont_preempt is only used when \"algorithm\" is \"preference\"", + "description": "Dont_preempt is only used when \"algorithm\" is \"preference\".", "title": "Dont Preempt" }, "hold_time": { @@ -12470,7 +14544,7 @@ }, "route_target": { "type": "string", - "description": "EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx", + "description": "EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx.", "title": "Route Target" } }, @@ -12482,7 +14556,7 @@ }, "encapsulation_dot1q_vlan": { "type": "integer", - "description": "VLAN tag to configure on sub-interface", + "description": "VLAN tag to configure on sub-interface.", "title": "Encapsulation Dot1Q VLAN" }, "encapsulation_vlan": { @@ -12496,17 +14570,17 @@ "properties": { "vlan": { "type": "integer", - "description": "Client VLAN ID", + "description": "Client VLAN ID.", "title": "VLAN" }, "outer": { "type": "integer", - "description": "Client Outer VLAN ID", + "description": "Client Outer VLAN ID.", "title": "Outer" }, "inner": { "type": "integer", - "description": "Client Inner VLAN ID", + "description": "Client Inner VLAN ID.", "title": "Inner" } }, @@ -12529,24 +14603,24 @@ }, "network": { "type": "object", - "description": "Network encapsulations are all optional and skipped if using client unmatched", + "description": "Network encapsulations are all optional and skipped if using client unmatched.", "properties": { "dot1q": { "type": "object", "properties": { "vlan": { "type": "integer", - "description": "Network VLAN ID", + "description": "Network VLAN ID.", "title": "VLAN" }, "outer": { "type": "integer", - "description": "Network outer VLAN ID", + "description": "Network outer VLAN ID.", "title": "Outer" }, "inner": { "type": "integer", - "description": "Network inner VLAN ID", + "description": "Network inner VLAN ID.", "title": "Inner" } }, @@ -12582,7 +14656,7 @@ }, "ip_address": { "type": "string", - "description": "IPv4 address/mask or \"dhcp\"", + "description": "IPv4 address/mask or \"dhcp\".", "title": "IP Address" }, "ip_address_secondaries": { @@ -12602,7 +14676,7 @@ }, "dhcp_client_accept_default_route": { "type": "boolean", - "description": "Install default-route obtained via DHCP", + "description": "Install default-route obtained via DHCP.", "title": "DHCP Client Accept Default Route" }, "dhcp_server_ipv4": { @@ -12626,12 +14700,12 @@ }, "source_interface": { "type": "string", - "description": "Source interface name", + "description": "Source interface name.", "title": "Source Interface" }, "vrf": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "VRF" } }, @@ -12698,7 +14772,7 @@ "properties": { "access_list": { "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Access List" }, "comment": { @@ -12718,16 +14792,17 @@ "type": "integer", "minimum": 1, "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Group" }, "original_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address. The combination of `original_ip` and `original_port` must be unique.", "title": "Original IP" }, "original_port": { "type": "integer", + "description": "TCP/UDP port. The combination of `original_ip` and `original_port` must be unique.", "minimum": 1, "maximum": 65535, "title": "Original Port" @@ -12748,20 +14823,19 @@ }, "translated_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.", "title": "Translated IP" }, "translated_port": { "type": "integer", "minimum": 1, "maximum": 65535, - "description": "requires 'original_port'", + "description": "requires 'original_port'.", "title": "Translated Port" } }, "required": [ - "translated_ip", - "original_ip" + "translated_ip" ], "additionalProperties": false, "patternProperties": { @@ -12805,7 +14879,7 @@ }, "pool_name": { "type": "string", - "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone\nignored if 'nat_type' is overload\n", + "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone.\nignored if 'nat_type' is overload.\n", "title": "Pool Name" }, "priority": { @@ -12833,7 +14907,7 @@ "properties": { "access_list": { "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Access List" }, "comment": { @@ -12853,16 +14927,17 @@ "type": "integer", "minimum": 1, "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Group" }, "original_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address. The combination of `original_ip` and `original_port` must be unique.", "title": "Original IP" }, "original_port": { "type": "integer", + "description": "TCP/UDP port. The combination of `original_ip` and `original_port` must be unique.", "minimum": 1, "maximum": 65535, "title": "Original Port" @@ -12883,20 +14958,19 @@ }, "translated_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.", "title": "Translated IP" }, "translated_port": { "type": "integer", "minimum": 1, "maximum": 65535, - "description": "requires 'original_port'", + "description": "requires 'original_port'.", "title": "Translated Port" } }, "required": [ - "translated_ip", - "original_ip" + "translated_ip" ], "additionalProperties": false, "patternProperties": { @@ -12929,7 +15003,7 @@ }, "ipv6_address_link_local": { "type": "string", - "description": "Link local IPv6 address/mask", + "description": "Link local IPv6 address/mask.", "title": "IPv6 Address Link Local" }, "ipv6_nd_ra_disabled": { @@ -12951,12 +15025,12 @@ }, "valid_lifetime": { "type": "string", - "description": "Infinite or lifetime in seconds", + "description": "Infinite or lifetime in seconds.", "title": "Valid Lifetime" }, "preferred_lifetime": { "type": "string", - "description": "Infinite or lifetime in seconds", + "description": "Infinite or lifetime in seconds.", "title": "Preferred Lifetime" }, "no_autoconfig_flag": { @@ -12981,7 +15055,7 @@ "properties": { "address": { "type": "string", - "description": "DHCP server's IPv6 address", + "description": "DHCP server's IPv6 address.", "title": "Address" }, "vrf": { @@ -12990,17 +15064,17 @@ }, "local_interface": { "type": "string", - "description": "Local interface to communicate with DHCP server - mutually exclusive to source_address", + "description": "Local interface to communicate with DHCP server - mutually exclusive to source_address.", "title": "Local Interface" }, "source_address": { "type": "string", - "description": "Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface", + "description": "Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface.", "title": "Source Address" }, "link_address": { "type": "string", - "description": "Override the default link address specified in the relayed DHCP packet", + "description": "Override the default link address specified in the relayed DHCP packet.", "title": "Link Address" } }, @@ -13016,37 +15090,37 @@ }, "access_group_in": { "type": "string", - "description": "Access list name", + "description": "Access list name.", "title": "Access Group In" }, "access_group_out": { "type": "string", - "description": "Access list name", + "description": "Access list name.", "title": "Access Group Out" }, "ipv6_access_group_in": { "type": "string", - "description": "IPv6 access list name", + "description": "IPv6 access list name.", "title": "IPv6 Access Group In" }, "ipv6_access_group_out": { "type": "string", - "description": "IPv6 access list name", + "description": "IPv6 access list name.", "title": "IPv6 Access Group Out" }, "mac_access_group_in": { "type": "string", - "description": "MAC access list name", + "description": "MAC access list name.", "title": "MAC Access Group In" }, "mac_access_group_out": { "type": "string", - "description": "MAC access list name", + "description": "MAC access list name.", "title": "MAC Access Group Out" }, "multicast": { "type": "object", - "description": "Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both", + "description": "Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both.", "properties": { "ipv4": { "type": "object", @@ -13058,7 +15132,7 @@ "properties": { "boundary": { "type": "string", - "description": "ACL name or multicast IP subnet", + "description": "ACL name or multicast IP subnet.", "title": "Boundary" }, "out": { @@ -13094,7 +15168,7 @@ "properties": { "boundary": { "type": "string", - "description": "ACL name or multicast IP subnet", + "description": "ACL name or multicast IP subnet.", "title": "Boundary" } }, @@ -13146,7 +15220,7 @@ }, "ospf_authentication_key": { "type": "string", - "description": "Encrypted password - only type 7 supported", + "description": "Encrypted password - only type 7 supported.", "title": "OSPF Authentication Key" }, "ospf_message_digest_keys": { @@ -13171,7 +15245,7 @@ }, "key": { "type": "string", - "description": "Encrypted password - only type 7 supported", + "description": "Encrypted password - only type 7 supported.", "title": "Key" } }, @@ -13265,6 +15339,37 @@ }, "title": "MAC Security" }, + "tcp_mss_ceiling": { + "type": "object", + "description": "The TCP MSS clamping feature involves clamping the maximum segment size (MSS) in the TCP header\nof TCP SYN packets if it exceeds the configured MSS ceiling limit for the interface.", + "properties": { + "ipv4_segment_size": { + "type": "integer", + "minimum": 64, + "maximum": 65475, + "title": "IPv4 Segment Size" + }, + "ipv6_segment_size": { + "type": "integer", + "minimum": 64, + "maximum": 65475, + "title": "IPv6 Segment Size" + }, + "direction": { + "type": "string", + "enum": [ + "egress", + "ingress" + ], + "title": "Direction" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "TCP Mss Ceiling" + }, "channel_group": { "type": "object", "properties": { @@ -13290,9 +15395,14 @@ }, "isis_enable": { "type": "string", - "description": "ISIS instance", + "description": "ISIS instance.", "title": "ISIS Enable" }, + "isis_bfd": { + "type": "boolean", + "description": "Enable BFD for ISIS.", + "title": "ISIS BFD" + }, "isis_passive": { "type": "boolean", "title": "ISIS Passive" @@ -13328,7 +15438,7 @@ }, "isis_authentication_key": { "type": "string", - "description": "Type-7 encrypted password", + "description": "Type-7 encrypted password.", "title": "ISIS Authentication Key" }, "poe": { @@ -13348,11 +15458,11 @@ "medium", "low" ], - "description": "Prioritize a port's power in the event that one of the switch's power supplies loses power", + "description": "Prioritize a port's power in the event that one of the switch's power supplies loses power.", "title": "Priority" }, "reboot": { - "description": "Set the PoE power behavior for a PoE port when the system is rebooted", + "description": "Set the PoE power behavior for a PoE port when the system is rebooted.", "type": "object", "properties": { "action": { @@ -13361,7 +15471,7 @@ "maintain", "power-off" ], - "description": "PoE action for interface", + "description": "PoE action for interface.", "title": "Action" } }, @@ -13372,7 +15482,7 @@ "title": "Reboot" }, "link_down": { - "description": "Set the PoE power behavior for a PoE port when the port goes down", + "description": "Set the PoE power behavior for a PoE port when the port goes down.", "type": "object", "properties": { "action": { @@ -13381,7 +15491,7 @@ "maintain", "power-off" ], - "description": "PoE action for interface", + "description": "PoE action for interface.", "title": "Action" }, "power_off_delay": { @@ -13399,7 +15509,7 @@ "title": "Link Down" }, "shutdown": { - "description": "Set the PoE power behavior for a PoE port when the port is admin down", + "description": "Set the PoE power behavior for a PoE port when the port is admin down.", "type": "object", "properties": { "action": { @@ -13408,7 +15518,7 @@ "maintain", "power-off" ], - "description": "PoE action for interface", + "description": "PoE action for interface.", "title": "Action" } }, @@ -13434,7 +15544,7 @@ }, "fixed": { "type": "boolean", - "description": "Set to ignore hardware classification", + "description": "Set to ignore hardware classification.", "title": "Fixed" } }, @@ -13522,7 +15632,7 @@ }, "vlan": { "type": "string", - "description": "VLAN can be 'all' or list of vlans as string", + "description": "VLAN can be 'all' or list of vlans as string.", "title": "VLAN" }, "transport": { @@ -13543,7 +15653,7 @@ }, "profile": { "type": "string", - "description": "Interface profile", + "description": "Interface profile.", "title": "Profile" }, "storm_control": { @@ -13554,7 +15664,7 @@ "properties": { "level": { "type": "string", - "description": "Configure maximum storm-control level", + "description": "Configure maximum storm-control level.", "title": "Level" }, "unit": { @@ -13564,7 +15674,7 @@ "percent", "pps" ], - "description": "Optional field and is hardware dependent", + "description": "Optional field and is hardware dependent.", "title": "Unit" } }, @@ -13579,7 +15689,7 @@ "properties": { "level": { "type": "string", - "description": "Configure maximum storm-control level", + "description": "Configure maximum storm-control level.", "title": "Level" }, "unit": { @@ -13589,7 +15699,7 @@ "percent", "pps" ], - "description": "Optional field and is hardware dependent", + "description": "Optional field and is hardware dependent.", "title": "Unit" } }, @@ -13604,7 +15714,7 @@ "properties": { "level": { "type": "string", - "description": "Configure maximum storm-control level", + "description": "Configure maximum storm-control level.", "title": "Level" }, "unit": { @@ -13614,7 +15724,7 @@ "percent", "pps" ], - "description": "Optional field and is hardware dependent", + "description": "Optional field and is hardware dependent.", "title": "Unit" } }, @@ -13629,7 +15739,7 @@ "properties": { "level": { "type": "string", - "description": "Configure maximum storm-control level", + "description": "Configure maximum storm-control level.", "title": "Level" }, "unit": { @@ -13639,7 +15749,7 @@ "percent", "pps" ], - "description": "Optional field and is hardware dependent", + "description": "Optional field and is hardware dependent.", "title": "Unit" } }, @@ -13706,7 +15816,7 @@ }, "ztp_vlan": { "type": "integer", - "description": "ZTP vlan number", + "description": "ZTP vlan number.", "title": "ZTP VLAN" } }, @@ -13722,7 +15832,7 @@ }, "pvlan_mapping": { "type": "string", - "description": "List of vlans as string", + "description": "List of vlans as string.", "title": "PVLAN Mapping" }, "vlan_translations": { @@ -13732,12 +15842,12 @@ "properties": { "from": { "type": "string", - "description": "List of vlans as string (only one vlan if direction is \"both\")", + "description": "List of vlans as string (only one vlan if direction is \"both\").", "title": "From" }, "to": { "type": "integer", - "description": "VLAN ID", + "description": "VLAN ID.", "title": "To" }, "direction": { @@ -13880,7 +15990,7 @@ }, "reauth_period": { "type": "string", - "description": "Value can be 60-4294967295 or 'server'", + "description": "Value can be 60-4294967295 or 'server'.", "title": "Reauth Period" }, "reauth_timeout_ignore": { @@ -13967,7 +16077,7 @@ }, "service_profile": { "type": "string", - "description": "QOS profile", + "description": "QOS profile.", "title": "Service Profile" }, "shape": { @@ -13975,7 +16085,7 @@ "properties": { "rate": { "type": "string", - "description": "Rate in kbps, pps or percent\nSupported options are platform dependent\nExamples:\n- \"5000 kbps\"\n- \"1000 pps\"\n- \"20 percent\"\n", + "description": "Rate in kbps, pps or percent.\nSupported options are platform dependent.\nExamples:\n- \"5000 kbps\"\n- \"1000 pps\"\n- \"20 percent\"\n", "title": "Rate" } }, @@ -13999,12 +16109,12 @@ }, "dscp": { "type": "integer", - "description": "DSCP value", + "description": "DSCP value.", "title": "DSCP" }, "cos": { "type": "integer", - "description": "COS value", + "description": "COS value.", "title": "COS" } }, @@ -14108,12 +16218,12 @@ }, "interval": { "type": "integer", - "description": "Interval in milliseconds", + "description": "Interval in milliseconds.", "title": "Interval" }, "min_rx": { "type": "integer", - "description": "Rate in milliseconds", + "description": "Rate in milliseconds.", "title": "Min RX" }, "multiplier": { @@ -14137,7 +16247,7 @@ "properties": { "input": { "type": "string", - "description": "Policy Based Routing Policy-map name", + "description": "Policy Based Routing Policy-map name.", "title": "Input" } }, @@ -14152,7 +16262,7 @@ "properties": { "input": { "type": "string", - "description": "Quality of Service Policy-map name", + "description": "Quality of Service Policy-map name.", "title": "Input" } }, @@ -14237,12 +16347,25 @@ "transceiver": { "type": "object", "properties": { + "frequency": { + "type": "string", + "description": "Transceiver Laser Frequency in GHz (min 190000, max 200000).", + "title": "Frequency" + }, + "frequency_unit": { + "type": "string", + "enum": [ + "ghz" + ], + "description": "Unit of Transceiver Laser Frequency.", + "title": "Frequency Unit" + }, "media": { "type": "object", "properties": { "override": { "type": "string", - "description": "Transceiver type", + "description": "Transceiver type.", "title": "Override" } }, @@ -14268,12 +16391,12 @@ "properties": { "input": { "type": "string", - "description": "Ingress traffic policy", + "description": "Ingress traffic policy.", "title": "Input" }, "output": { "type": "string", - "description": "Egress traffic policy", + "description": "Egress traffic policy.", "title": "Output" } }, @@ -14288,7 +16411,7 @@ "properties": { "session_tracker": { "type": "string", - "description": "Name of session tracker", + "description": "Name of session tracker.", "title": "Session Tracker" } }, @@ -14412,17 +16535,17 @@ }, "peer": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Peer" }, "peer_interface": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Peer Interface" }, "peer_type": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Peer Type" }, "sflow": { @@ -14459,7 +16582,7 @@ }, "port_profile": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Port Profile" }, "uc_tx_queues": { @@ -14469,19 +16592,19 @@ "properties": { "id": { "type": "integer", - "description": "TX-Queue ID", + "description": "TX-Queue ID.", "title": "ID" }, "random_detect": { "type": "object", "properties": { "ecn": { - "description": "Explicit Congestion Notification", + "description": "Explicit Congestion Notification.", "type": "object", "properties": { "count": { "type": "boolean", - "description": "Enable counter for random-detect ECNs", + "description": "Enable counter for random-detect ECNs.", "title": "Count" }, "threshold": { @@ -14496,35 +16619,35 @@ "mbytes", "milliseconds" ], - "description": "Indicate the units to be used for the threshold values", + "description": "Indicate the units to be used for the threshold values.", "title": "Units" }, "min": { "type": "integer", "minimum": 1, "maximum": 256000000, - "description": "Set the random-detect ECN minimum-threshold", + "description": "Set the random-detect ECN minimum-threshold.", "title": "Min" }, "max": { "type": "integer", "minimum": 1, "maximum": 256000000, - "description": "Set the random-detect ECN maximum-threshold", + "description": "Set the random-detect ECN maximum-threshold.", "title": "Max" }, "max_probability": { "type": "integer", "minimum": 1, "maximum": 100, - "description": "Set the random-detect ECN max-mark-probability", + "description": "Set the random-detect ECN max-mark-probability.", "title": "Max Probability" }, "weight": { "type": "integer", "minimum": 0, "maximum": 15, - "description": "Set the random-detect ECN weight", + "description": "Set the random-detect ECN weight.", "title": "Weight" } }, @@ -14571,19 +16694,19 @@ "properties": { "id": { "type": "integer", - "description": "TX-Queue ID", + "description": "TX-Queue ID.", "title": "ID" }, "random_detect": { "type": "object", "properties": { "ecn": { - "description": "Explicit Congestion Notification", + "description": "Explicit Congestion Notification.", "type": "object", "properties": { "count": { "type": "boolean", - "description": "Enable counter for random-detect ECNs", + "description": "Enable counter for random-detect ECNs.", "title": "Count" }, "threshold": { @@ -14598,35 +16721,35 @@ "mbytes", "milliseconds" ], - "description": "Indicate the units to be used for the threshold values", + "description": "Indicate the units to be used for the threshold values.", "title": "Units" }, "min": { "type": "integer", "minimum": 1, "maximum": 256000000, - "description": "Set the random-detect ECN minimum-threshold", + "description": "Set the random-detect ECN minimum-threshold.", "title": "Min" }, "max": { "type": "integer", "minimum": 1, "maximum": 256000000, - "description": "Set the random-detect ECN maximum-threshold", + "description": "Set the random-detect ECN maximum-threshold.", "title": "Max" }, "max_probability": { "type": "integer", "minimum": 1, "maximum": 100, - "description": "Set the random-detect ECN max-mark-probability", + "description": "Set the random-detect ECN max-mark-probability.", "title": "Max Probability" }, "weight": { "type": "integer", "minimum": 0, "maximum": 15, - "description": "Set the random-detect ECN weight", + "description": "Set the random-detect ECN weight.", "title": "Weight" } }, @@ -14674,12 +16797,12 @@ "properties": { "id": { "type": "integer", - "description": "VRID", + "description": "VRID.", "title": "ID" }, "priority_level": { "type": "integer", - "description": "Instance priority", + "description": "Instance priority.", "minimum": 1, "maximum": 254, "title": "Priority Level" @@ -14689,7 +16812,7 @@ "properties": { "interval": { "type": "integer", - "description": "Interval in seconds", + "description": "Interval in seconds.", "minimum": 1, "maximum": 255, "title": "Interval" @@ -14713,14 +16836,14 @@ "properties": { "minimum": { "type": "integer", - "description": "Minimum preempt delay in seconds", + "description": "Minimum preempt delay in seconds.", "minimum": 0, "maximum": 3600, "title": "Minimum" }, "reload": { "type": "integer", - "description": "Reload preempt delay in seconds", + "description": "Reload preempt delay in seconds.", "minimum": 0, "maximum": 3600, "title": "Reload" @@ -14776,14 +16899,14 @@ "properties": { "name": { "type": "string", - "description": "Tracked object name", + "description": "Tracked object name.", "title": "Name" }, "decrement": { "type": "integer", "minimum": 1, "maximum": 254, - "description": "Decrement VRRP priority by 1-254", + "description": "Decrement VRRP priority by 1-254.", "title": "Decrement" }, "shutdown": { @@ -14806,7 +16929,7 @@ "properties": { "address": { "type": "string", - "description": "Virtual IPv4 address", + "description": "Virtual IPv4 address.", "title": "Address" }, "version": { @@ -14832,7 +16955,7 @@ "properties": { "address": { "type": "string", - "description": "Virtual IPv6 address", + "description": "Virtual IPv6 address.", "title": "Address" } }, @@ -14858,7 +16981,7 @@ }, "validate_state": { "type": "boolean", - "description": "Set to false to disable interface validation by the `eos_validate_state` role", + "description": "Set to false to disable interface validation by the `eos_validate_state` role.", "title": "Validate State" }, "switchport": { @@ -14967,7 +17090,7 @@ }, "eos_cli": { "type": "string", - "description": "Multiline EOS CLI rendered directly on the ethernet interface in the final EOS configuration", + "description": "Multiline EOS CLI rendered directly on the ethernet interface in the final EOS configuration.", "title": "EOS CLI" } }, @@ -15126,6 +17249,16 @@ "description": "Set the default WAN role.\n\nThis is used both for AutoVPN and Pathfinder designs.\nThat means if `wan_mode` root key is set to `autovpn` or `cv-pathfinder`.\n`server` indicates that the router is a route-reflector.\n\nOnly supported if `overlay_routing_protocol` is set to `ibgp`.\n", "title": "Default Wan Role" }, + "default_flow_tracker_type": { + "type": "string", + "enum": [ + "sampled", + "hardware" + ], + "description": "Set the default flow tracker type.", + "default": "sampled", + "title": "Default Flow Tracker Type" + }, "mlag_support": { "type": "boolean", "default": false, @@ -15274,7 +17407,7 @@ }, "interface_descriptions": { "type": "object", - "description": "Override interface_descriptions templates\nIf description templates use Jinja2, they have to strip whitespaces using {%- -%} on any code blocks.\n", + "description": "Override interface_descriptions templates.\nIf description templates use Jinja2, they have to strip whitespaces using {%- -%} on any code blocks.\n", "properties": { "python_module": { "type": "string", @@ -15372,7 +17505,7 @@ "properties": { "name": { "type": "string", - "description": "IP or hostname e.g., 2.2.2.55, ie.pool.ntp.org", + "description": "IP or hostname e.g., 2.2.2.55, 2001:db8::55, ie.pool.ntp.org.", "title": "Name" }, "burst": { @@ -15393,14 +17526,14 @@ "type": "integer", "minimum": 3, "maximum": 17, - "description": "Value of maxpoll between 3 - 17 (Logarithmic)", + "description": "Value of maxpoll between 3 - 17 (Logarithmic).", "title": "Maxpoll" }, "minpoll": { "type": "integer", "minimum": 3, "maximum": 17, - "description": "Value of minpoll between 3 - 17 (Logarithmic)", + "description": "Value of minpoll between 3 - 17 (Logarithmic).", "title": "Minpoll" }, "version": { @@ -15434,7 +17567,7 @@ "type": "integer", "minimum": 1, "maximum": 65534, - "description": "Key identifier", + "description": "Key identifier.", "title": "ID" }, "hash_algorithm": { @@ -15447,7 +17580,7 @@ }, "key": { "type": "string", - "description": "Obfuscated key", + "description": "Obfuscated key.", "title": "Key" }, "key_type": { @@ -15472,7 +17605,7 @@ }, "trusted_keys": { "type": "string", - "description": "List of trusted-keys as string ex. 10-12,15", + "description": "List of trusted-keys as string ex. 10-12,15.", "title": "Trusted Keys" } }, @@ -15493,7 +17626,7 @@ "type": "array", "items": { "type": "string", - "description": "'inventory_hostname' of CVX server\n" + "description": "'inventory_hostname' of CVX server.\n" }, "title": "Overlay CVX Servers" }, @@ -15741,6 +17874,37 @@ "default": "Management1", "title": "Management Interface" }, + "security_entropy_sources": { + "description": "Entropy source improves the randomness of the numbers used to generate MACsec's cryptographic keys.", + "type": "object", + "properties": { + "hardware": { + "type": "boolean", + "description": "Use a hardware based source.", + "title": "Hardware" + }, + "haveged": { + "type": "boolean", + "description": "Use the HAVEGE algorithm.", + "title": "Haveged" + }, + "cpu_jitter": { + "type": "boolean", + "description": "Use the Jitter RNG algorithm of a CPU based source.", + "title": "CPU Jitter" + }, + "hardware_exclusive": { + "type": "boolean", + "description": "Only use entropy from the hardware source.", + "title": "Hardware Exclusive" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Security Entropy Sources" + }, "structured_config": { "type": "object", "description": "Custom structured config for eos_cli_config_gen.", @@ -15764,7 +17928,7 @@ "title": "Type" }, "group": { - "description": "Group Name", + "description": "Group Name.", "type": "string", "title": "Group" }, @@ -15792,7 +17956,7 @@ "title": "Type" }, "group": { - "description": "Group Name", + "description": "Group Name.", "type": "string", "title": "Group" }, @@ -15830,7 +17994,7 @@ "title": "Type" }, "group": { - "description": "Group Name", + "description": "Group Name.", "type": "string", "title": "Group" } @@ -15863,7 +18027,7 @@ "title": "Type" }, "group": { - "description": "Group Name", + "description": "Group Name.", "type": "string", "title": "Group" } @@ -15891,7 +18055,7 @@ "properties": { "commands": { "type": "string", - "description": "Privelege level 'all' or 0-15", + "description": "Privilege level 'all' or 0-15.", "title": "Commands" }, "type": { @@ -15904,7 +18068,7 @@ "title": "Type" }, "group": { - "description": "Group Name", + "description": "Group Name.", "type": "string", "title": "Group" }, @@ -15927,7 +18091,7 @@ "properties": { "commands": { "type": "string", - "description": "Privelege level 'all' or 0-15", + "description": "Privilege level 'all' or 0-15.", "title": "Commands" }, "type": { @@ -15940,7 +18104,7 @@ "title": "Type" }, "group": { - "description": "Group Name", + "description": "Group Name.", "type": "string", "title": "Group" }, @@ -16163,7 +18327,7 @@ "properties": { "level": { "type": "string", - "description": "Privilege level(s) 0-15", + "description": "Privilege level(s) 0-15.", "title": "Level" }, "default": { @@ -16223,7 +18387,7 @@ "type": "object", "properties": { "name": { - "description": "Group name", + "description": "Group name.", "type": "string", "title": "Name" }, @@ -16243,12 +18407,12 @@ "properties": { "server": { "type": "string", - "description": "Hostname or IP address", + "description": "Hostname or IP address.", "title": "Server" }, "vrf": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "VRF" } }, @@ -16275,13 +18439,21 @@ "properties": { "name": { "type": "string", - "description": "Access-list Name", + "description": "Access-list Name.", "title": "Name" }, "counters_per_entry": { "type": "boolean", "title": "Counters Per Entry" }, + "permit_response_traffic": { + "type": "string", + "enum": [ + "nat" + ], + "description": "Permit response traffic automatically based on NAT translations.\nMinimum EOS version requirement 4.32.2F.", + "title": "Permit Response Traffic" + }, "sequence_numbers": { "type": "array", "items": { @@ -16289,12 +18461,12 @@ "properties": { "sequence": { "type": "integer", - "description": "Sequence ID", + "description": "Sequence ID.", "title": "Sequence" }, "action": { "type": "string", - "description": "Action as string\nExample: \"deny ip any any\"\n", + "description": "Action as string.\nExample: \"deny ip any any\"\n", "title": "Action" } }, @@ -16327,13 +18499,13 @@ "type": "array", "items": { "type": "string", - "description": "DHCP server IPv4 address" + "description": "DHCP server IPv4 address." }, "title": "DHCP Servers IPv4" }, "disabled": { "type": "boolean", - "description": "Disable IP locking on configured ports", + "description": "Disable IP locking on configured ports.", "title": "Disabled" }, "leases": { @@ -16343,12 +18515,12 @@ "properties": { "ip": { "type": "string", - "description": "IP address", + "description": "IP address.", "title": "IP" }, "mac": { "type": "string", - "description": "MAC address (hhhh.hhhh.hhhh or hh:hh:hh:hh:hh:hh)", + "description": "MAC address (hhhh.hhhh.hhhh or hh:hh:hh:hh:hh:hh).", "title": "MAC" } }, @@ -16372,17 +18544,17 @@ "properties": { "expiration_mac_disabled": { "type": "boolean", - "description": "Configure deauthorizing locked addresses upon MAC aging out", + "description": "Configure deauthorizing locked addresses upon MAC aging out.", "title": "Expiration MAC Disabled" }, "ipv4_enforcement_disabled": { "type": "boolean", - "description": "Configure enforcement for locked IPv4 addresses", + "description": "Configure enforcement for locked IPv4 addresses.", "title": "IPv4 Enforcement Disabled" }, "ipv6_enforcement_disabled": { "type": "boolean", - "description": "Configure enforcement for locked IPv6 addresses", + "description": "Configure enforcement for locked IPv6 addresses.", "title": "IPv6 Enforcement Disabled" } }, @@ -16587,7 +18759,7 @@ "properties": { "ipv4_applications": { "type": "array", - "description": "List of user defined IPv4 applications.", + "description": "List of user defined IPv4 applications. The name should be unique over all defined applications (ipv4 and l4).", "items": { "type": "object", "properties": { @@ -16608,7 +18780,7 @@ }, "protocols": { "type": "array", - "description": "List of protocols to consider for this application.\n\nTo use port field-sets (source, destination or both), the list\nmust contain only one or two protocols, either `tcp` or `udp`.\nWhen using both protocols, one line is rendered for each in the configuration,\nhence the field-sets must have the same value for `tcp_src_port_set_name` and\n`udp_src_port_set_name` and for `tcp_dest_port_set_name` and `udp_dest_port_set_name`\nif set in order to generate valid configuration in EOS.", + "description": "List of protocols to consider for this application.\nTo use port field-sets (source, destination or both), the list\nmust contain only one or two protocols, either `tcp` or `udp`.\nWhen using both protocols, one line is rendered for each in the configuration,\nhence the field-sets must have the same value for `tcp_src_port_set_name` and\n`udp_src_port_set_name` and for `tcp_dest_port_set_name` and `udp_dest_port_set_name`\nif set in order to generate valid configuration in EOS.", "items": { "type": "string", "enum": [ @@ -16628,7 +18800,7 @@ }, "protocol_ranges": { "type": "array", - "description": "Acccept protocol value(s) or range(s).\nProtocol values can be between 1 and 255.", + "description": "Accept protocol value(s) or range(s).\nProtocol values can be between 1 and 255.", "items": { "type": "string" }, @@ -16636,22 +18808,22 @@ }, "udp_src_port_set_name": { "type": "string", - "description": "Name of field set for UDP source ports.\n\nWhen the `protocols` list contain both `tcp` and `udp`, this key value\nmust be the same as `tcp_src_port_set_name`.", + "description": "Name of field set for UDP source ports.\nWhen the `protocols` list contain both `tcp` and `udp`, this key value\nmust be the same as `tcp_src_port_set_name`.", "title": "UDP Src Port Set Name" }, "tcp_src_port_set_name": { "type": "string", - "description": "Name of field set for TCP source ports.\n\nWhen the `protocols` list contain both `tcp` and `udp`, this key value\nmust be the same as `udp_src_port_set_name`.", + "description": "Name of field set for TCP source ports.\nWhen the `protocols` list contain both `tcp` and `udp`, this key value\nmust be the same as `udp_src_port_set_name`.", "title": "TCP Src Port Set Name" }, "udp_dest_port_set_name": { "type": "string", - "description": "Name of field set for UDP destination ports.\n\nWhen the `protocols` list contain both `tcp` and `udp`, this key value\nmust be the same as `tcp_dest_port_set_name`.", + "description": "Name of field set for UDP destination ports.\nWhen the `protocols` list contain both `tcp` and `udp`, this key value\nmust be the same as `tcp_dest_port_set_name`.", "title": "UDP Dest Port Set Name" }, "tcp_dest_port_set_name": { "type": "string", - "description": "Name of field set for TCP destination ports.\n\nWhen the `protocols` list contain both `tcp` and `udp`, this key value\nmust be the same as `udp_dest_port_set_name`.", + "description": "Name of field set for TCP destination ports.\nWhen the `protocols` list contain both `tcp` and `udp`, this key value\nmust be the same as `udp_dest_port_set_name`.", "title": "TCP Dest Port Set Name" } }, @@ -16664,6 +18836,76 @@ ] }, "title": "IPv4 Applications" + }, + "l4_applications": { + "type": "array", + "description": "List of user defined L4 applications. The name should be unique over all defined applications (ipv4 and l4).", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Application name.", + "title": "Name" + }, + "protocols": { + "type": "array", + "description": "List of protocols to consider for this application.\nTo use port field-sets (source, destination or both), the list\nmust contain only one or two protocols, either `tcp` or `udp`.\nWhen using both protocols, one line is rendered for each in the configuration,\nhence the field-sets must have the same value for `tcp_src_port_set_name` and\n`udp_src_port_set_name` and for `tcp_dest_port_set_name` and `udp_dest_port_set_name`\nif set in order to generate valid configuration in EOS.", + "items": { + "type": "string", + "enum": [ + "ahp", + "esp", + "icmp", + "igmp", + "ospf", + "pim", + "rsvp", + "tcp", + "udp", + "vrrp" + ] + }, + "title": "Protocols" + }, + "protocol_ranges": { + "type": "array", + "description": "Accept protocol value(s) or range(s).\nProtocol values can be between 1 and 255.", + "items": { + "type": "string" + }, + "title": "Protocol Ranges" + }, + "udp_src_port_set_name": { + "type": "string", + "description": "Name of field set for UDP source ports.\nWhen the `protocols` list contain both `tcp` and `udp`, this key value\nmust be the same as `tcp_src_port_set_name`.", + "title": "UDP Src Port Set Name" + }, + "tcp_src_port_set_name": { + "type": "string", + "description": "Name of field set for TCP source ports.\nWhen the `protocols` list contain both `tcp` and `udp`, this key value\nmust be the same as `udp_src_port_set_name`.", + "title": "TCP Src Port Set Name" + }, + "udp_dest_port_set_name": { + "type": "string", + "description": "Name of field set for UDP destination ports.\nWhen the `protocols` list contain both `tcp` and `udp`, this key value\nmust be the same as `tcp_dest_port_set_name`.", + "title": "UDP Dest Port Set Name" + }, + "tcp_dest_port_set_name": { + "type": "string", + "description": "Name of field set for TCP destination ports.\nWhen the `protocols` list contain both `tcp` and `udp`, this key value\nmust be the same as `udp_dest_port_set_name`.", + "title": "TCP Dest Port Set Name" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "title": "L4 Applications" } }, "additionalProperties": false, @@ -16788,11 +19030,36 @@ "arp": { "type": "object", "properties": { + "persistent": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Restore the ARP cache after reboot.", + "title": "Enabled" + }, + "refresh_delay": { + "type": "integer", + "description": "Time to wait in seconds before refreshing the ARP cache after reboot (EOS default 600).", + "minimum": 600, + "maximum": 3600, + "title": "Refresh Delay" + } + }, + "required": [ + "enabled" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Persistent" + }, "aging": { "type": "object", "properties": { "timeout_default": { - "description": "Timeout in seconds", + "description": "Timeout in seconds.", "type": "integer", "minimum": 60, "maximum": 65535, @@ -16864,7 +19131,7 @@ "properties": { "name": { "type": "string", - "description": "Access List Name", + "description": "Access List Name.", "title": "Name" }, "entries": { @@ -16882,7 +19149,7 @@ }, "match": { "type": "string", - "description": "Regex To Match", + "description": "Regex To Match.", "title": "Match" }, "origin": { @@ -16930,7 +19197,7 @@ "quiet" ], "default": "debug", - "description": "Conversion Mode for AVD input data conversion.\nInput data conversion will perform type conversion of input variables as defined in the schema.\nThe type conversion is intended to help the user to identify minor issues with the input data, while still allowing the data to be validated.\nDuring conversion, messages will generated with information about the host(s) and key(s) which required conversion.\n\"disabled\" means that conversion will not run - avoid this since conversion is also handling data deprecation and upgrade.\n\"error\" will produce error messages and fail the task.\n\"warning\" will produce warning messages.\n\"info\" will produce regular log messages.\n\"debug\" will produce hidden debug messages viewable with -v.\n\"quiet\" will not produce any messages\n", + "description": "Conversion Mode for AVD input data conversion.\nInput data conversion will perform type conversion of input variables as defined in the schema.\nThe type conversion is intended to help the user to identify minor issues with the input data, while still allowing the data to be validated.\nDuring conversion, messages will generated with information about the host(s) and key(s) which required conversion.\n\"disabled\" means that conversion will not run - avoid this since conversion is also handling data deprecation and upgrade.\n\"error\" will produce error messages and fail the task.\n\"warning\" will produce warning messages.\n\"info\" will produce regular log messages.\n\"debug\" will produce hidden debug messages viewable with -v.\n\"quiet\" will not produce any messages.\n", "title": "AVD Data Conversion Mode" }, "avd_data_validation_mode": { @@ -16951,12 +19218,12 @@ "properties": { "login": { "type": "string", - "description": "Multiline string ending with EOF on the last line", + "description": "Multiline string ending with EOF on the last line.", "title": "Login" }, "motd": { "type": "string", - "description": "Multiline string ending with EOF on the last line", + "description": "Multiline string ending with EOF on the last line.", "title": "Motd" } }, @@ -16973,7 +19240,7 @@ "properties": { "name": { "type": "string", - "description": "Group Name", + "description": "Group Name.", "title": "Name" }, "vrf": { @@ -16991,7 +19258,7 @@ "type": "array", "items": { "type": "string", - "description": "Profile Name" + "description": "Profile Name." }, "title": "BGP Maintenance Profiles" } @@ -17008,7 +19275,7 @@ }, "boot": { "title": "System Boot Settings", - "description": "Set the Aboot password\n", + "description": "Set the Aboot password.\n", "type": "object", "properties": { "secret": { @@ -17024,7 +19291,7 @@ "title": "Hash Algorithm" }, "key": { - "description": "Hashed Password", + "description": "Hashed Password.", "type": "string", "title": "Key" } @@ -17052,7 +19319,7 @@ "properties": { "name": { "type": "string", - "description": "Class-Map Name", + "description": "Class-Map Name.", "title": "Name" }, "ip": { @@ -17060,7 +19327,7 @@ "properties": { "access_group": { "type": "string", - "description": "Standard Access-List Name", + "description": "Standard Access-List Name.", "title": "Access Group" } }, @@ -17088,17 +19355,17 @@ "properties": { "name": { "type": "string", - "description": "Class-Map Name", + "description": "Class-Map Name.", "title": "Name" }, "vlan": { "type": "string", - "description": "VLAN value(s) or range(s) of VLAN values", + "description": "VLAN value(s) or range(s) of VLAN values.", "title": "VLAN" }, "cos": { "type": "string", - "description": "CoS value(s) or range(s) of CoS values", + "description": "CoS value(s) or range(s) of CoS values.", "title": "COS" }, "ip": { @@ -17106,7 +19373,7 @@ "properties": { "access_group": { "type": "string", - "description": "IPv4 Access-List Name", + "description": "IPv4 Access-List Name.", "title": "Access Group" } }, @@ -17121,7 +19388,7 @@ "properties": { "access_group": { "type": "string", - "description": "IPv6 Access-List Name", + "description": "IPv6 Access-List Name.", "title": "Access Group" } }, @@ -17170,12 +19437,12 @@ "properties": { "name": { "type": "string", - "description": "Community-list Name", + "description": "Community-list Name.", "title": "Name" }, "action": { "type": "string", - "description": "Action as string\nExample: \"permit GSHUT 65123:123\"\n", + "description": "Action as string.\nExample: \"permit GSHUT 65123:123\"\n", "title": "Action" } }, @@ -17200,7 +19467,7 @@ "description": "- Custom templates can be added below the playbook directory.\n- If a location above the directory is desired, a symbolic link can be used.\n- Example under the `playbooks` directory create symbolic link with the following command:\n\n ```bash\n ln -s ../../shared_repo/custom_avd_templates/ ./custom_avd_templates\n ```\n\n- The output will be rendered at the end of the configuration.\n- The order of custom templates in the list can be important if they overlap.\n- It is recommended to use a `!` delimiter at the top of each custom template.\n\nAdd `custom_templates` to group/host variables:\n", "items": { "type": "string", - "description": "Template relative path below playbook directory" + "description": "Template relative path below playbook directory." } }, "cvx": { @@ -17215,7 +19482,7 @@ "type": "array", "items": { "type": "string", - "description": "IP address or hostname" + "description": "IP address or hostname." }, "title": "Peer Hosts" }, @@ -17230,7 +19497,7 @@ "properties": { "password": { "type": "string", - "description": "Hashed password using the password_type", + "description": "Hashed password using the password_type.", "title": "Password" }, "password_type": { @@ -17263,7 +19530,7 @@ }, "vxlan": { "type": "object", - "description": "VXLAN Controller service", + "description": "VXLAN Controller service.", "properties": { "shutdown": { "type": "boolean", @@ -17304,36 +19571,36 @@ "properties": { "cvaddrs": { "type": "array", - "description": "Streaming address(es) for CloudVision single cluster\n- TCP 9910 is used for CV on-prem\n- TCP 443 is used for CV as a Service\n", + "description": "Streaming address(es) for CloudVision single cluster.\n- TCP 9910 is used for CV on-prem\n- TCP 443 is used for CV as a Service\n", "items": { "type": "string", - "description": "Server address in the format `:`" + "description": "Server address in the format `:`." }, "title": "Cvaddrs" }, "clusters": { "type": "array", - "description": "Multiple CloudVision clusters\n", + "description": "Multiple CloudVision clusters.\n", "items": { "type": "object", "properties": { "name": { "type": "string", - "description": "Cluster Name", + "description": "Cluster Name.", "title": "Name" }, "cvaddrs": { "type": "array", - "description": "Streaming address(es) for CloudVision cluster\n- TCP 9910 is used for CV on-prem\n- TCP 443 is used for CV as a Service\n", + "description": "Streaming address(es) for CloudVision cluster.\n- TCP 9910 is used for CV on-prem\n- TCP 443 is used for CV as a Service\n", "items": { "type": "string", - "description": "Server address in the format `:`" + "description": "Server address in the format `:`." }, "title": "Cvaddrs" }, "cvauth": { "type": "object", - "description": "Authentication scheme used to connect to CloudVision\n", + "description": "Authentication scheme used to connect to CloudVision.\n", "properties": { "method": { "type": "string", @@ -17351,22 +19618,22 @@ }, "token_file": { "type": "string", - "description": "Token file path\ne.g. \"/tmp/token\"\n", + "description": "Token file path.\ne.g. \"/tmp/token\"\n", "title": "Token File" }, "cert_file": { "type": "string", - "description": "Client certificate file path\ne.g. \"/persist/secure/ssl/terminattr/primary/certs/client.crt\"\n", + "description": "Client certificate file path.\ne.g. \"/persist/secure/ssl/terminattr/primary/certs/client.crt\"\n", "title": "Cert File" }, "ca_file": { "type": "string", - "description": "CA certificate file path (on-prem only)\ne.g. \"/persist/secure/ssl/terminattr/primary/certs/ca.crt\"\n", + "description": "CA certificate file path (on-prem only).\ne.g. \"/persist/secure/ssl/terminattr/primary/certs/ca.crt\"\n", "title": "Ca File" }, "key_file": { "type": "string", - "description": "Client certificate key file path\ne.g. \"/persist/secure/ssl/terminattr/primary/keys/client.key\"\n", + "description": "Client certificate key file path.\ne.g. \"/persist/secure/ssl/terminattr/primary/keys/client.key\"\n", "title": "Key File" } }, @@ -17378,27 +19645,27 @@ }, "cvobscurekeyfile": { "type": "boolean", - "description": "Encrypt the private key used for authentication to CloudVision\n", + "description": "Encrypt the private key used for authentication to CloudVision.\n", "title": "Cvobscurekeyfile" }, "cvproxy": { "type": "string", - "description": "Proxy server through which CloudVision is reachable. Useful when the CloudVision server is hosted in the cloud.\nThe expected form is http://[user:password@]ip:port, e.g.: `http://arista:arista@10.83.12.78:3128`. Available as of TerminAttr v1.13.0\n", + "description": "Proxy server through which CloudVision is reachable. Useful when the CloudVision server is hosted in the cloud.\nThe expected form is http://[user:password@]ip:port, e.g.: `http://arista:arista@10.83.12.78:3128`. Available as of TerminAttr v1.13.0.\n", "title": "Cvproxy" }, "cvsourceip": { "type": "string", - "description": "Set source IP address in case of in-band managament\n", + "description": "Set source IP address in case of in-band management.\n", "title": "Cvsourceip" }, "cvsourceintf": { "type": "string", - "description": "Set source interface in case of in-band managament. Available as of TerminAttr v1.23.0.\nThe interface name is case sensitive and has to match the interface name in the running-config, e.g.:Vlan100.\n", + "description": "Set source interface in case of in-band management. Available as of TerminAttr v1.23.0.\nThe interface name is case sensitive and has to match the interface name in the running-config, e.g.:Vlan100.\n", "title": "Cvsourceintf" }, "cvvrf": { "type": "string", - "description": "The VRF to use to connect to CloudVision\n", + "description": "The VRF to use to connect to CloudVision.\n", "title": "Cvvrf" } }, @@ -17414,7 +19681,7 @@ }, "cvauth": { "type": "object", - "description": "Authentication scheme used to connect to CloudVision\n", + "description": "Authentication scheme used to connect to CloudVision.\n", "properties": { "method": { "type": "string", @@ -17432,22 +19699,22 @@ }, "token_file": { "type": "string", - "description": "Token file path\ne.g. \"/tmp/token\"\n", + "description": "Token file path.\ne.g. \"/tmp/token\"\n", "title": "Token File" }, "cert_file": { "type": "string", - "description": "Client certificate file path\ne.g. \"/persist/secure/ssl/terminattr/primary/certs/client.crt\"\n", + "description": "Client certificate file path.\ne.g. \"/persist/secure/ssl/terminattr/primary/certs/client.crt\"\n", "title": "Cert File" }, "ca_file": { "type": "string", - "description": "CA certificate file path (on-prem only)\ne.g. \"/persist/secure/ssl/terminattr/primary/certs/ca.crt\"\n", + "description": "CA certificate file path (on-prem only).\ne.g. \"/persist/secure/ssl/terminattr/primary/certs/ca.crt\"\n", "title": "Ca File" }, "key_file": { "type": "string", - "description": "Client certificate key file path\ne.g. \"/persist/secure/ssl/terminattr/primary/keys/client.key\"\n", + "description": "Client certificate key file path.\ne.g. \"/persist/secure/ssl/terminattr/primary/keys/client.key\"\n", "title": "Key File" } }, @@ -17459,47 +19726,47 @@ }, "cvobscurekeyfile": { "type": "boolean", - "description": "Encrypt the private key used for authentication to CloudVision\n", + "description": "Encrypt the private key used for authentication to CloudVision.\n", "title": "Cvobscurekeyfile" }, "cvproxy": { "type": "string", - "description": "Proxy server through which CloudVision is reachable. Useful when the CloudVision server is hosted in the cloud.\nThe expected form is http://[user:password@]ip:port, e.g.: `http://arista:arista@10.83.12.78:3128`. Available as of TerminAttr v1.13.0\n", + "description": "Proxy server through which CloudVision is reachable. Useful when the CloudVision server is hosted in the cloud.\nThe expected form is http://[user:password@]ip:port, e.g.: `http://arista:arista@10.83.12.78:3128`. Available as of TerminAttr v1.13.0.\n", "title": "Cvproxy" }, "cvsourceip": { "type": "string", - "description": "Set source IP address in case of in-band managament\n", + "description": "Set source IP address in case of in-band management.\n", "title": "Cvsourceip" }, "cvsourceintf": { "type": "string", - "description": "Set source interface in case of in-band managament.\nThe interface name is case sensitive and has to match the interface name in the running-config, e.g.:Vlan100.\n", + "description": "Set source interface in case of in-band management.\nThe interface name is case sensitive and has to match the interface name in the running-config, e.g.:Vlan100.\n", "title": "Cvsourceintf" }, "cvvrf": { "type": "string", - "description": "The VRF to use to connect to CloudVision\n", + "description": "The VRF to use to connect to CloudVision.\n", "title": "Cvvrf" }, "cvgnmi": { "type": "boolean", - "description": "Stream states from EOS gNMI servers (Openconfig) to CloudVision. Available as of TerminAttr v1.13.1\n", + "description": "Stream states from EOS gNMI servers (Openconfig) to CloudVision. Available as of TerminAttr v1.13.1.\n", "title": "Cvgnmi" }, "disable_aaa": { "type": "boolean", - "description": "Disable AAA authorization and accounting.\nWhen setting this flag, all commands pushed from CloudVision are applied directly to the CLI without authorization\n", + "description": "Disable AAA authorization and accounting.\nWhen setting this flag, all commands pushed from CloudVision are applied directly to the CLI without authorization.\n", "title": "Disable AAA" }, "grpcaddr": { "type": "string", - "description": "Set the gRPC server address, the default is 127.0.0.1:6042\ne.g. \"MGMT/0.0.0.0:6042\"\n", + "description": "Set the gRPC server address, the default is 127.0.0.1:6042.\ne.g. \"MGMT/0.0.0.0:6042\"\n", "title": "Grpcaddr" }, "grpcreadonly": { "type": "boolean", - "description": "gNMI read-only mode - Disable gnmi.Set()\n", + "description": "gNMI read-only mode - Disable gnmi.Set().\n", "title": "Grpcreadonly" }, "ingestexclude": { @@ -17519,7 +19786,7 @@ }, "ecodhcpaddr": { "type": "string", - "description": "ECO DHCP Collector address or ECO DHCP Fingerprint listening address in standalone mode (default \"127.0.0.1:67\")\n", + "description": "ECO DHCP Collector address or ECO DHCP Fingerprint listening address in standalone mode (default \"127.0.0.1:67\").\n", "title": "Ecodhcpaddr" }, "ipfix": { @@ -17569,12 +19836,12 @@ "properties": { "name": { "type": "string", - "description": "Daemon Name", + "description": "Daemon Name.", "title": "Name" }, "exec": { "type": "string", - "description": "command to run as a daemon\n", + "description": "command to run as a daemon.\n", "title": "Exec" }, "enabled": { @@ -17600,7 +19867,7 @@ "type": "array", "items": { "type": "string", - "description": "Server IP or Hostname" + "description": "Server IP or Hostname." }, "title": "Servers" }, @@ -17641,6 +19908,50 @@ "type": "string", "title": "DNS Domain Name IPv6" }, + "dns_servers_ipv4": { + "type": "array", + "minItems": 1, + "description": "List of DNS servers for IPv4 clients.", + "items": { + "type": "string", + "description": "IPv4 address of DNS server." + }, + "title": "DNS Servers IPv4" + }, + "dns_servers_ipv6": { + "type": "array", + "minItems": 1, + "description": "List of DNS servers for IPv6 clients.", + "items": { + "type": "string", + "description": "IPv6 address of DNS server." + }, + "title": "DNS Servers IPv6" + }, + "tftp_server": { + "type": "object", + "properties": { + "file_ipv4": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "description": "Name of TFTP file for IPv4 clients.", + "title": "File IPv4" + }, + "file_ipv6": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "description": "Name of TFTP file for IPv6 clients.", + "title": "File IPv6" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Tftp Server" + }, "ipv4_vendor_options": { "type": "array", "items": { @@ -17807,15 +20118,15 @@ }, "dns_domain": { "type": "string", - "description": "Domain Name", + "description": "Domain Name.", "title": "DNS Domain" }, "domain_list": { "type": "array", - "description": "Search list of DNS domains", + "description": "Search list of DNS domains.", "items": { "type": "string", - "description": "Domain name" + "description": "Domain name." }, "title": "Domain List" }, @@ -18024,6 +20335,13 @@ "^_.+$": {} }, "title": "Unresponsive" + }, + "accounting_update_interval": { + "type": "integer", + "minimum": 5, + "maximum": 65535, + "description": "Interval period in seconds.", + "title": "Accounting Update Interval" } }, "additionalProperties": false, @@ -18031,6 +20349,119 @@ "^_.+$": {} }, "title": "AAA" + }, + "captive_portal": { + "type": "object", + "description": "Web authentication feature authenticates a supplicant through a web page, referred to as a captive portal.", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "url": { + "type": "string", + "description": "Supported URL type:\n - http: http://[:]\n - https: https://[:]", + "title": "URL" + }, + "ssl_profile": { + "type": "string", + "title": "SSL Profile" + }, + "start_limit_infinite": { + "type": "boolean", + "description": "Set captive-portal start limit to infinte.", + "title": "Start Limit Infinite" + }, + "access_list_ipv4": { + "type": "string", + "description": "Standard access-list name.", + "title": "Access List IPv4" + } + }, + "required": [ + "enabled" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Captive Portal" + }, + "supplicant": { + "type": "object", + "properties": { + "profiles": { + "description": "Dot1x supplicant profiles.", + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "eap_method": { + "type": "string", + "description": "Extensible Authentication Protocol method:\n - EAP Flexible Authentication via Secure Tunneling.\n - EAP with Transport Layer Security.", + "enum": [ + "fast", + "tls" + ], + "title": "Eap Method" + }, + "identity": { + "type": "string", + "description": "User identity.", + "title": "Identity" + }, + "passphrase_type": { + "type": "string", + "enum": [ + "0", + "7", + "8a" + ], + "default": "7", + "title": "Passphrase Type" + }, + "passphrase": { + "type": "string", + "description": "Extensible Authentication Protocol password.", + "title": "Passphrase" + }, + "ssl_profile": { + "type": "string", + "title": "SSL Profile" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "title": "Profiles" + }, + "logging": { + "type": "boolean", + "description": "Enable supplicant logging.", + "title": "Logging" + }, + "disconnect_cached_results_timeout": { + "type": "integer", + "minimum": 60, + "maximum": 65535, + "description": "Timeout in seconds for removing a disconnected supplicant.", + "title": "Disconnect Cached Results Timeout" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Supplicant" } }, "additionalProperties": false, @@ -18149,12 +20580,12 @@ "properties": { "name": { "type": "string", - "description": "Dynamic prefix-list name", + "description": "Dynamic prefix-list name.", "title": "Name" }, "match_map": { "type": "string", - "description": "Route-map name", + "description": "Route-map name.", "title": "Match Map" }, "prefix_list": { @@ -18162,12 +20593,12 @@ "properties": { "ipv4": { "type": "string", - "description": "Prefix-list name", + "description": "Prefix-list name.", "title": "IPv4" }, "ipv6": { "type": "string", - "description": "Prefix-list name", + "description": "Prefix-list name.", "title": "IPv6" } }, @@ -18210,7 +20641,7 @@ }, "eos_cli": { "type": "string", - "description": "Multiline string with EOS CLI rendered directly on the root level of the final EOS configuration", + "description": "Multiline string with EOS CLI rendered directly on the root level of the final EOS configuration.", "title": "EOS CLI" }, "eos_cli_config_gen_configuration": { @@ -18218,7 +20649,7 @@ "properties": { "hide_passwords": { "type": "boolean", - "description": "Replace the input data using the `hide_passwords` filter in the Jinja2 templates by '' in the configruation if true\n", + "description": "Replace the input data using the `hide_passwords` filter in the Jinja2 templates by '' in the configuration if true.\n", "default": false, "title": "Hide Passwords" } @@ -18234,7 +20665,7 @@ "properties": { "hide_passwords": { "type": "boolean", - "description": "Replace the input data using the `hide_passwords` filter in the Jinja2 templates by '' in the documentation if true\n", + "description": "Replace the input data using the `hide_passwords` filter in the Jinja2 templates by '' in the documentation if true.\n", "default": true, "title": "Hide Passwords" } @@ -18306,7 +20737,7 @@ }, "interval": { "type": "integer", - "description": "Interval in seconds", + "description": "Interval in seconds.", "default": 300, "minimum": 30, "maximum": 86400, @@ -18347,7 +20778,7 @@ "type": "integer", "minimum": 0, "maximum": 600, - "description": "Interval in seconds for updating interface counters\"", + "description": "Interval in seconds for updating interface counters.", "title": "Load Interval" }, "speed": { @@ -18365,19 +20796,19 @@ "type": "integer", "minimum": 68, "maximum": 65535, - "description": "\"l2_mtu\" should only be defined for platforms supporting the \"l2 mtu\" CLI\n", + "description": "\"l2_mtu\" should only be defined for platforms supporting the \"l2 mtu\" CLI.\n", "title": "L2 MTU" }, "l2_mru": { "type": "integer", "minimum": 68, "maximum": 65535, - "description": "\"l2_mru\" should only be defined for platforms supporting the \"l2 mru\" CLI\n", + "description": "\"l2_mru\" should only be defined for platforms supporting the \"l2 mru\" CLI.\n", "title": "L2 MRU" }, "vlans": { "type": "string", - "description": "List of switchport vlans as string\nFor a trunk port this would be a range like \"1-200,300\"\nFor an access port this would be a single vlan \"123\"\n", + "description": "List of switchport vlans as string.\nFor a trunk port this would be a range like \"1-200,300\".\nFor an access port this would be a single vlan \"123\".\n", "title": "VLANs" }, "native_vlan": { @@ -18386,7 +20817,7 @@ }, "native_vlan_tag": { "type": "boolean", - "description": "If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence", + "description": "If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence.", "title": "Native VLAN Tag" }, "mode": { @@ -18430,12 +20861,12 @@ "properties": { "encapsulation_dot1q_vlan": { "type": "integer", - "description": "Vlan tag to configure on sub-interface", + "description": "Vlan tag to configure on sub-interface.", "title": "Encapsulation Dot1Q VLAN" }, "forwarding_profile": { "type": "string", - "description": "L2 protocol forwarding profile", + "description": "L2 protocol forwarding profile.", "title": "Forwarding Profile" } }, @@ -18473,12 +20904,12 @@ "properties": { "ipv4": { "type": "boolean", - "description": "Enable address locking for IPv4", + "description": "Enable address locking for IPv4.", "title": "IPv4" }, "ipv6": { "type": "boolean", - "description": "Enable address locking for IPv6", + "description": "Enable address locking for IPv6.", "title": "IPv6" } }, @@ -18509,7 +20940,7 @@ }, "vrf": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "VRF" }, "flow_tracker": { @@ -18562,7 +20993,7 @@ "properties": { "name": { "type": "string", - "description": "Group name", + "description": "Group name.", "title": "Name" }, "direction": { @@ -18589,7 +21020,7 @@ "properties": { "identifier": { "type": "string", - "description": "EVPN Ethernet Segment Identifier (Type 1 format)", + "description": "EVPN Ethernet Segment Identifier (Type 1 format).", "title": "Identifier" }, "redundancy": { @@ -18615,12 +21046,12 @@ "type": "integer", "minimum": 0, "maximum": 65535, - "description": "Preference_value is only used when \"algorithm\" is \"preference\"", + "description": "Preference_value is only used when \"algorithm\" is \"preference\".", "title": "Preference Value" }, "dont_preempt": { "type": "boolean", - "description": "Dont_preempt is only used when \"algorithm\" is \"preference\"", + "description": "Dont_preempt is only used when \"algorithm\" is \"preference\".", "title": "Dont Preempt" }, "hold_time": { @@ -18664,7 +21095,7 @@ }, "route_target": { "type": "string", - "description": "EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx", + "description": "EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx.", "title": "Route Target" } }, @@ -18676,7 +21107,7 @@ }, "encapsulation_dot1q_vlan": { "type": "integer", - "description": "VLAN tag to configure on sub-interface", + "description": "VLAN tag to configure on sub-interface.", "title": "Encapsulation Dot1Q VLAN" }, "encapsulation_vlan": { @@ -18690,17 +21121,17 @@ "properties": { "vlan": { "type": "integer", - "description": "Client VLAN ID", + "description": "Client VLAN ID.", "title": "VLAN" }, "outer": { "type": "integer", - "description": "Client Outer VLAN ID", + "description": "Client Outer VLAN ID.", "title": "Outer" }, "inner": { "type": "integer", - "description": "Client Inner VLAN ID", + "description": "Client Inner VLAN ID.", "title": "Inner" } }, @@ -18723,24 +21154,24 @@ }, "network": { "type": "object", - "description": "Network encapsulations are all optional and skipped if using client unmatched", + "description": "Network encapsulations are all optional and skipped if using client unmatched.", "properties": { "dot1q": { "type": "object", "properties": { "vlan": { "type": "integer", - "description": "Network VLAN ID", + "description": "Network VLAN ID.", "title": "VLAN" }, "outer": { "type": "integer", - "description": "Network outer VLAN ID", + "description": "Network outer VLAN ID.", "title": "Outer" }, "inner": { "type": "integer", - "description": "Network inner VLAN ID", + "description": "Network inner VLAN ID.", "title": "Inner" } }, @@ -18776,7 +21207,7 @@ }, "ip_address": { "type": "string", - "description": "IPv4 address/mask or \"dhcp\"", + "description": "IPv4 address/mask or \"dhcp\".", "title": "IP Address" }, "ip_address_secondaries": { @@ -18796,7 +21227,7 @@ }, "dhcp_client_accept_default_route": { "type": "boolean", - "description": "Install default-route obtained via DHCP", + "description": "Install default-route obtained via DHCP.", "title": "DHCP Client Accept Default Route" }, "dhcp_server_ipv4": { @@ -18820,12 +21251,12 @@ }, "source_interface": { "type": "string", - "description": "Source interface name", + "description": "Source interface name.", "title": "Source Interface" }, "vrf": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "VRF" } }, @@ -18892,7 +21323,7 @@ "properties": { "access_list": { "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Access List" }, "comment": { @@ -18912,16 +21343,17 @@ "type": "integer", "minimum": 1, "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Group" }, "original_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address. The combination of `original_ip` and `original_port` must be unique.", "title": "Original IP" }, "original_port": { "type": "integer", + "description": "TCP/UDP port. The combination of `original_ip` and `original_port` must be unique.", "minimum": 1, "maximum": 65535, "title": "Original Port" @@ -18942,20 +21374,19 @@ }, "translated_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.", "title": "Translated IP" }, "translated_port": { "type": "integer", "minimum": 1, "maximum": 65535, - "description": "requires 'original_port'", + "description": "requires 'original_port'.", "title": "Translated Port" } }, "required": [ - "translated_ip", - "original_ip" + "translated_ip" ], "additionalProperties": false, "patternProperties": { @@ -18999,7 +21430,7 @@ }, "pool_name": { "type": "string", - "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone\nignored if 'nat_type' is overload\n", + "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone.\nignored if 'nat_type' is overload.\n", "title": "Pool Name" }, "priority": { @@ -19027,7 +21458,7 @@ "properties": { "access_list": { "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Access List" }, "comment": { @@ -19047,16 +21478,17 @@ "type": "integer", "minimum": 1, "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Group" }, "original_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address. The combination of `original_ip` and `original_port` must be unique.", "title": "Original IP" }, "original_port": { "type": "integer", + "description": "TCP/UDP port. The combination of `original_ip` and `original_port` must be unique.", "minimum": 1, "maximum": 65535, "title": "Original Port" @@ -19077,20 +21509,19 @@ }, "translated_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.", "title": "Translated IP" }, "translated_port": { "type": "integer", "minimum": 1, "maximum": 65535, - "description": "requires 'original_port'", + "description": "requires 'original_port'.", "title": "Translated Port" } }, "required": [ - "translated_ip", - "original_ip" + "translated_ip" ], "additionalProperties": false, "patternProperties": { @@ -19123,7 +21554,7 @@ }, "ipv6_address_link_local": { "type": "string", - "description": "Link local IPv6 address/mask", + "description": "Link local IPv6 address/mask.", "title": "IPv6 Address Link Local" }, "ipv6_nd_ra_disabled": { @@ -19145,12 +21576,12 @@ }, "valid_lifetime": { "type": "string", - "description": "Infinite or lifetime in seconds", + "description": "Infinite or lifetime in seconds.", "title": "Valid Lifetime" }, "preferred_lifetime": { "type": "string", - "description": "Infinite or lifetime in seconds", + "description": "Infinite or lifetime in seconds.", "title": "Preferred Lifetime" }, "no_autoconfig_flag": { @@ -19175,7 +21606,7 @@ "properties": { "address": { "type": "string", - "description": "DHCP server's IPv6 address", + "description": "DHCP server's IPv6 address.", "title": "Address" }, "vrf": { @@ -19184,17 +21615,17 @@ }, "local_interface": { "type": "string", - "description": "Local interface to communicate with DHCP server - mutually exclusive to source_address", + "description": "Local interface to communicate with DHCP server - mutually exclusive to source_address.", "title": "Local Interface" }, "source_address": { "type": "string", - "description": "Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface", + "description": "Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface.", "title": "Source Address" }, "link_address": { "type": "string", - "description": "Override the default link address specified in the relayed DHCP packet", + "description": "Override the default link address specified in the relayed DHCP packet.", "title": "Link Address" } }, @@ -19210,37 +21641,37 @@ }, "access_group_in": { "type": "string", - "description": "Access list name", + "description": "Access list name.", "title": "Access Group In" }, "access_group_out": { "type": "string", - "description": "Access list name", + "description": "Access list name.", "title": "Access Group Out" }, "ipv6_access_group_in": { "type": "string", - "description": "IPv6 access list name", + "description": "IPv6 access list name.", "title": "IPv6 Access Group In" }, "ipv6_access_group_out": { "type": "string", - "description": "IPv6 access list name", + "description": "IPv6 access list name.", "title": "IPv6 Access Group Out" }, "mac_access_group_in": { "type": "string", - "description": "MAC access list name", + "description": "MAC access list name.", "title": "MAC Access Group In" }, "mac_access_group_out": { "type": "string", - "description": "MAC access list name", + "description": "MAC access list name.", "title": "MAC Access Group Out" }, "multicast": { "type": "object", - "description": "Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both", + "description": "Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both.", "properties": { "ipv4": { "type": "object", @@ -19252,7 +21683,7 @@ "properties": { "boundary": { "type": "string", - "description": "ACL name or multicast IP subnet", + "description": "ACL name or multicast IP subnet.", "title": "Boundary" }, "out": { @@ -19288,7 +21719,7 @@ "properties": { "boundary": { "type": "string", - "description": "ACL name or multicast IP subnet", + "description": "ACL name or multicast IP subnet.", "title": "Boundary" } }, @@ -19340,7 +21771,7 @@ }, "ospf_authentication_key": { "type": "string", - "description": "Encrypted password - only type 7 supported", + "description": "Encrypted password - only type 7 supported.", "title": "OSPF Authentication Key" }, "ospf_message_digest_keys": { @@ -19365,7 +21796,7 @@ }, "key": { "type": "string", - "description": "Encrypted password - only type 7 supported", + "description": "Encrypted password - only type 7 supported.", "title": "Key" } }, @@ -19459,6 +21890,37 @@ }, "title": "MAC Security" }, + "tcp_mss_ceiling": { + "type": "object", + "description": "The TCP MSS clamping feature involves clamping the maximum segment size (MSS) in the TCP header\nof TCP SYN packets if it exceeds the configured MSS ceiling limit for the interface.", + "properties": { + "ipv4_segment_size": { + "type": "integer", + "minimum": 64, + "maximum": 65475, + "title": "IPv4 Segment Size" + }, + "ipv6_segment_size": { + "type": "integer", + "minimum": 64, + "maximum": 65475, + "title": "IPv6 Segment Size" + }, + "direction": { + "type": "string", + "enum": [ + "egress", + "ingress" + ], + "title": "Direction" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "TCP Mss Ceiling" + }, "channel_group": { "type": "object", "properties": { @@ -19484,9 +21946,14 @@ }, "isis_enable": { "type": "string", - "description": "ISIS instance", + "description": "ISIS instance.", "title": "ISIS Enable" }, + "isis_bfd": { + "type": "boolean", + "description": "Enable BFD for ISIS.", + "title": "ISIS BFD" + }, "isis_passive": { "type": "boolean", "title": "ISIS Passive" @@ -19522,7 +21989,7 @@ }, "isis_authentication_key": { "type": "string", - "description": "Type-7 encrypted password", + "description": "Type-7 encrypted password.", "title": "ISIS Authentication Key" }, "poe": { @@ -19542,11 +22009,11 @@ "medium", "low" ], - "description": "Prioritize a port's power in the event that one of the switch's power supplies loses power", + "description": "Prioritize a port's power in the event that one of the switch's power supplies loses power.", "title": "Priority" }, "reboot": { - "description": "Set the PoE power behavior for a PoE port when the system is rebooted", + "description": "Set the PoE power behavior for a PoE port when the system is rebooted.", "type": "object", "properties": { "action": { @@ -19555,7 +22022,7 @@ "maintain", "power-off" ], - "description": "PoE action for interface", + "description": "PoE action for interface.", "title": "Action" } }, @@ -19566,7 +22033,7 @@ "title": "Reboot" }, "link_down": { - "description": "Set the PoE power behavior for a PoE port when the port goes down", + "description": "Set the PoE power behavior for a PoE port when the port goes down.", "type": "object", "properties": { "action": { @@ -19575,7 +22042,7 @@ "maintain", "power-off" ], - "description": "PoE action for interface", + "description": "PoE action for interface.", "title": "Action" }, "power_off_delay": { @@ -19593,7 +22060,7 @@ "title": "Link Down" }, "shutdown": { - "description": "Set the PoE power behavior for a PoE port when the port is admin down", + "description": "Set the PoE power behavior for a PoE port when the port is admin down.", "type": "object", "properties": { "action": { @@ -19602,7 +22069,7 @@ "maintain", "power-off" ], - "description": "PoE action for interface", + "description": "PoE action for interface.", "title": "Action" } }, @@ -19628,7 +22095,7 @@ }, "fixed": { "type": "boolean", - "description": "Set to ignore hardware classification", + "description": "Set to ignore hardware classification.", "title": "Fixed" } }, @@ -19716,7 +22183,7 @@ }, "vlan": { "type": "string", - "description": "VLAN can be 'all' or list of vlans as string", + "description": "VLAN can be 'all' or list of vlans as string.", "title": "VLAN" }, "transport": { @@ -19737,7 +22204,7 @@ }, "profile": { "type": "string", - "description": "Interface profile", + "description": "Interface profile.", "title": "Profile" }, "storm_control": { @@ -19748,7 +22215,7 @@ "properties": { "level": { "type": "string", - "description": "Configure maximum storm-control level", + "description": "Configure maximum storm-control level.", "title": "Level" }, "unit": { @@ -19758,7 +22225,7 @@ "percent", "pps" ], - "description": "Optional field and is hardware dependent", + "description": "Optional field and is hardware dependent.", "title": "Unit" } }, @@ -19773,7 +22240,7 @@ "properties": { "level": { "type": "string", - "description": "Configure maximum storm-control level", + "description": "Configure maximum storm-control level.", "title": "Level" }, "unit": { @@ -19783,7 +22250,7 @@ "percent", "pps" ], - "description": "Optional field and is hardware dependent", + "description": "Optional field and is hardware dependent.", "title": "Unit" } }, @@ -19798,7 +22265,7 @@ "properties": { "level": { "type": "string", - "description": "Configure maximum storm-control level", + "description": "Configure maximum storm-control level.", "title": "Level" }, "unit": { @@ -19808,7 +22275,7 @@ "percent", "pps" ], - "description": "Optional field and is hardware dependent", + "description": "Optional field and is hardware dependent.", "title": "Unit" } }, @@ -19823,7 +22290,7 @@ "properties": { "level": { "type": "string", - "description": "Configure maximum storm-control level", + "description": "Configure maximum storm-control level.", "title": "Level" }, "unit": { @@ -19833,7 +22300,7 @@ "percent", "pps" ], - "description": "Optional field and is hardware dependent", + "description": "Optional field and is hardware dependent.", "title": "Unit" } }, @@ -19900,7 +22367,7 @@ }, "ztp_vlan": { "type": "integer", - "description": "ZTP vlan number", + "description": "ZTP vlan number.", "title": "ZTP VLAN" } }, @@ -19916,7 +22383,7 @@ }, "pvlan_mapping": { "type": "string", - "description": "List of vlans as string", + "description": "List of vlans as string.", "title": "PVLAN Mapping" }, "vlan_translations": { @@ -19926,12 +22393,12 @@ "properties": { "from": { "type": "string", - "description": "List of vlans as string (only one vlan if direction is \"both\")", + "description": "List of vlans as string (only one vlan if direction is \"both\").", "title": "From" }, "to": { "type": "integer", - "description": "VLAN ID", + "description": "VLAN ID.", "title": "To" }, "direction": { @@ -20074,7 +22541,7 @@ }, "reauth_period": { "type": "string", - "description": "Value can be 60-4294967295 or 'server'", + "description": "Value can be 60-4294967295 or 'server'.", "title": "Reauth Period" }, "reauth_timeout_ignore": { @@ -20161,7 +22628,7 @@ }, "service_profile": { "type": "string", - "description": "QOS profile", + "description": "QOS profile.", "title": "Service Profile" }, "shape": { @@ -20169,7 +22636,7 @@ "properties": { "rate": { "type": "string", - "description": "Rate in kbps, pps or percent\nSupported options are platform dependent\nExamples:\n- \"5000 kbps\"\n- \"1000 pps\"\n- \"20 percent\"\n", + "description": "Rate in kbps, pps or percent.\nSupported options are platform dependent.\nExamples:\n- \"5000 kbps\"\n- \"1000 pps\"\n- \"20 percent\"\n", "title": "Rate" } }, @@ -20193,12 +22660,12 @@ }, "dscp": { "type": "integer", - "description": "DSCP value", + "description": "DSCP value.", "title": "DSCP" }, "cos": { "type": "integer", - "description": "COS value", + "description": "COS value.", "title": "COS" } }, @@ -20302,12 +22769,12 @@ }, "interval": { "type": "integer", - "description": "Interval in milliseconds", + "description": "Interval in milliseconds.", "title": "Interval" }, "min_rx": { "type": "integer", - "description": "Rate in milliseconds", + "description": "Rate in milliseconds.", "title": "Min RX" }, "multiplier": { @@ -20331,7 +22798,7 @@ "properties": { "input": { "type": "string", - "description": "Policy Based Routing Policy-map name", + "description": "Policy Based Routing Policy-map name.", "title": "Input" } }, @@ -20346,7 +22813,7 @@ "properties": { "input": { "type": "string", - "description": "Quality of Service Policy-map name", + "description": "Quality of Service Policy-map name.", "title": "Input" } }, @@ -20431,12 +22898,25 @@ "transceiver": { "type": "object", "properties": { + "frequency": { + "type": "string", + "description": "Transceiver Laser Frequency in GHz (min 190000, max 200000).", + "title": "Frequency" + }, + "frequency_unit": { + "type": "string", + "enum": [ + "ghz" + ], + "description": "Unit of Transceiver Laser Frequency.", + "title": "Frequency Unit" + }, "media": { "type": "object", "properties": { "override": { "type": "string", - "description": "Transceiver type", + "description": "Transceiver type.", "title": "Override" } }, @@ -20462,12 +22942,12 @@ "properties": { "input": { "type": "string", - "description": "Ingress traffic policy", + "description": "Ingress traffic policy.", "title": "Input" }, "output": { "type": "string", - "description": "Egress traffic policy", + "description": "Egress traffic policy.", "title": "Output" } }, @@ -20482,7 +22962,7 @@ "properties": { "session_tracker": { "type": "string", - "description": "Name of session tracker", + "description": "Name of session tracker.", "title": "Session Tracker" } }, @@ -20606,17 +23086,17 @@ }, "peer": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Peer" }, "peer_interface": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Peer Interface" }, "peer_type": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Peer Type" }, "sflow": { @@ -20653,7 +23133,7 @@ }, "port_profile": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Port Profile" }, "uc_tx_queues": { @@ -20663,19 +23143,19 @@ "properties": { "id": { "type": "integer", - "description": "TX-Queue ID", + "description": "TX-Queue ID.", "title": "ID" }, "random_detect": { "type": "object", "properties": { "ecn": { - "description": "Explicit Congestion Notification", + "description": "Explicit Congestion Notification.", "type": "object", "properties": { "count": { "type": "boolean", - "description": "Enable counter for random-detect ECNs", + "description": "Enable counter for random-detect ECNs.", "title": "Count" }, "threshold": { @@ -20690,35 +23170,35 @@ "mbytes", "milliseconds" ], - "description": "Indicate the units to be used for the threshold values", + "description": "Indicate the units to be used for the threshold values.", "title": "Units" }, "min": { "type": "integer", "minimum": 1, "maximum": 256000000, - "description": "Set the random-detect ECN minimum-threshold", + "description": "Set the random-detect ECN minimum-threshold.", "title": "Min" }, "max": { "type": "integer", "minimum": 1, "maximum": 256000000, - "description": "Set the random-detect ECN maximum-threshold", + "description": "Set the random-detect ECN maximum-threshold.", "title": "Max" }, "max_probability": { "type": "integer", "minimum": 1, "maximum": 100, - "description": "Set the random-detect ECN max-mark-probability", + "description": "Set the random-detect ECN max-mark-probability.", "title": "Max Probability" }, "weight": { "type": "integer", "minimum": 0, "maximum": 15, - "description": "Set the random-detect ECN weight", + "description": "Set the random-detect ECN weight.", "title": "Weight" } }, @@ -20765,19 +23245,19 @@ "properties": { "id": { "type": "integer", - "description": "TX-Queue ID", + "description": "TX-Queue ID.", "title": "ID" }, "random_detect": { "type": "object", "properties": { "ecn": { - "description": "Explicit Congestion Notification", + "description": "Explicit Congestion Notification.", "type": "object", "properties": { "count": { "type": "boolean", - "description": "Enable counter for random-detect ECNs", + "description": "Enable counter for random-detect ECNs.", "title": "Count" }, "threshold": { @@ -20792,35 +23272,35 @@ "mbytes", "milliseconds" ], - "description": "Indicate the units to be used for the threshold values", + "description": "Indicate the units to be used for the threshold values.", "title": "Units" }, "min": { "type": "integer", "minimum": 1, "maximum": 256000000, - "description": "Set the random-detect ECN minimum-threshold", + "description": "Set the random-detect ECN minimum-threshold.", "title": "Min" }, "max": { "type": "integer", "minimum": 1, "maximum": 256000000, - "description": "Set the random-detect ECN maximum-threshold", + "description": "Set the random-detect ECN maximum-threshold.", "title": "Max" }, "max_probability": { "type": "integer", "minimum": 1, "maximum": 100, - "description": "Set the random-detect ECN max-mark-probability", + "description": "Set the random-detect ECN max-mark-probability.", "title": "Max Probability" }, "weight": { "type": "integer", "minimum": 0, "maximum": 15, - "description": "Set the random-detect ECN weight", + "description": "Set the random-detect ECN weight.", "title": "Weight" } }, @@ -20868,12 +23348,12 @@ "properties": { "id": { "type": "integer", - "description": "VRID", + "description": "VRID.", "title": "ID" }, "priority_level": { "type": "integer", - "description": "Instance priority", + "description": "Instance priority.", "minimum": 1, "maximum": 254, "title": "Priority Level" @@ -20883,7 +23363,7 @@ "properties": { "interval": { "type": "integer", - "description": "Interval in seconds", + "description": "Interval in seconds.", "minimum": 1, "maximum": 255, "title": "Interval" @@ -20907,14 +23387,14 @@ "properties": { "minimum": { "type": "integer", - "description": "Minimum preempt delay in seconds", + "description": "Minimum preempt delay in seconds.", "minimum": 0, "maximum": 3600, "title": "Minimum" }, "reload": { "type": "integer", - "description": "Reload preempt delay in seconds", + "description": "Reload preempt delay in seconds.", "minimum": 0, "maximum": 3600, "title": "Reload" @@ -20970,14 +23450,14 @@ "properties": { "name": { "type": "string", - "description": "Tracked object name", + "description": "Tracked object name.", "title": "Name" }, "decrement": { "type": "integer", "minimum": 1, "maximum": 254, - "description": "Decrement VRRP priority by 1-254", + "description": "Decrement VRRP priority by 1-254.", "title": "Decrement" }, "shutdown": { @@ -21000,7 +23480,7 @@ "properties": { "address": { "type": "string", - "description": "Virtual IPv4 address", + "description": "Virtual IPv4 address.", "title": "Address" }, "version": { @@ -21026,7 +23506,7 @@ "properties": { "address": { "type": "string", - "description": "Virtual IPv6 address", + "description": "Virtual IPv6 address.", "title": "Address" } }, @@ -21052,7 +23532,7 @@ }, "validate_state": { "type": "boolean", - "description": "Set to false to disable interface validation by the `eos_validate_state` role", + "description": "Set to false to disable interface validation by the `eos_validate_state` role.", "title": "Validate State" }, "switchport": { @@ -21161,7 +23641,7 @@ }, "eos_cli": { "type": "string", - "description": "Multiline EOS CLI rendered directly on the ethernet interface in the final EOS configuration", + "description": "Multiline EOS CLI rendered directly on the ethernet interface in the final EOS configuration.", "title": "EOS CLI" } }, @@ -21183,7 +23663,7 @@ "properties": { "name": { "type": "string", - "description": "Event Handler Name", + "description": "Event Handler Name.", "title": "Name" }, "action_type": { @@ -21197,12 +23677,39 @@ }, "action": { "type": "string", - "description": "Command to execute\n", + "description": "Command to execute.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use event_handlers.actions instead.", + "deprecated": true, "title": "Action" }, + "actions": { + "type": "object", + "description": "Note: `bash_command` and `log` are mutually exclusive. `bash_command` takes precedence over `log`.", + "properties": { + "bash_command": { + "type": "string", + "description": "Define BASH command action. Command could be multiline also.", + "title": "Bash Command" + }, + "log": { + "type": "boolean", + "description": "Log a message when the event is triggered.", + "title": "Log" + }, + "increment_device_health_metric": { + "type": "string", + "description": "Name of device-health metric.", + "title": "Increment Device Health Metric" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Actions" + }, "delay": { "type": "integer", - "description": "Event-handler delay in seconds\n", + "description": "Event-handler delay in seconds.\n", "title": "Delay" }, "trigger": { @@ -21210,12 +23717,98 @@ "description": "Configure event trigger condition.\n", "enum": [ "on-boot", + "on-counters", + "on-intf", "on-logging", + "on-maintenance", "on-startup-config", - "on-maintenance" + "vm-tracer vm" ], "title": "Trigger" }, + "trigger_on_counters": { + "type": "object", + "properties": { + "condition": { + "type": "string", + "description": "Set the logical expression to evaluate.", + "title": "Condition" + }, + "granularity_per_source": { + "type": "boolean", + "description": "Set the granularity of event counting for a wildcarded condition.\nExample -\n condition ( Arad*.IptCrcErrCnt.delta > 100 ) and ( Arad*.UcFifoFullDrop.delta > 100 )\n [* wildcard is used here]", + "title": "Granularity Per Source" + }, + "poll_interval": { + "type": "integer", + "minimum": 1, + "maximum": 1000000, + "description": "Set the polling interval in seconds.", + "title": "Poll Interval" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Trigger On Counters" + }, + "trigger_on_logging": { + "type": "object", + "properties": { + "poll_interval": { + "type": "integer", + "minimum": 1, + "maximum": 1000000, + "description": "Set the polling interval in seconds.", + "title": "Poll Interval" + }, + "regex": { + "type": "string", + "description": "Regular expression to use for searching log messages.", + "title": "Regex" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Trigger On Logging" + }, + "trigger_on_intf": { + "type": "object", + "description": "Trigger condition occurs on specified interface changes.\nNote: Any one of the `ip`, `ipv6` and `operstatus` key needs to be defined along with the `interface`.", + "properties": { + "interface": { + "type": "string", + "description": "Interface name.\nExample - Ethernet4\n Loopback4-6\n Port-channel4,7", + "title": "Interface" + }, + "ip": { + "type": "boolean", + "description": "Action is triggered upon changes to interface IP address assignment.", + "title": "IP" + }, + "ipv6": { + "type": "boolean", + "description": "Action is triggered upon changes to interface ipv6 address assignment.", + "title": "IPv6" + }, + "operstatus": { + "type": "boolean", + "description": "Action is triggered upon changes to interface operStatus.", + "title": "Operstatus" + } + }, + "required": [ + "interface" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Trigger On Intf" + }, "trigger_on_maintenance": { "description": "Settings required for trigger 'on-maintenance'.", "type": "object", @@ -21284,7 +23877,8 @@ }, "regex": { "type": "string", - "description": "Regular expression to use for searching log messages. Required for on-logging trigger\n", + "description": "Regular expression to use for searching log messages. Required for on-logging trigger.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use event_handlers.trigger_on_logging.regex instead.", + "deprecated": true, "title": "Regex" }, "asynchronous": { @@ -21399,14 +23993,14 @@ "type": "integer", "minimum": 3000, "maximum": 900000, - "description": "Flow record inactive export timeout in milliseconds", + "description": "Flow record inactive export timeout in milliseconds.", "title": "On Inactive Timeout" }, "on_interval": { "type": "integer", "minimum": 1000, "maximum": 36000000, - "description": "Flow record export interval in milliseconds", + "description": "Flow record export interval in milliseconds.", "title": "On Interval" } }, @@ -21418,7 +24012,7 @@ }, "name": { "type": "string", - "description": "Tracker Name", + "description": "Tracker Name.", "title": "Name" }, "exporters": { @@ -21428,7 +24022,7 @@ "properties": { "name": { "type": "string", - "description": "Exporter Name", + "description": "Exporter Name.", "title": "Name" }, "collector": { @@ -21436,12 +24030,12 @@ "properties": { "host": { "type": "string", - "description": "Collector IPv4 address or IPv6 address or fully qualified domain name", + "description": "Collector IPv4 address or IPv6 address or fully qualified domain name.", "title": "Host" }, "port": { "type": "integer", - "description": "Collector Port Number", + "description": "Collector Port Number.", "minimum": 1, "maximum": 65535, "title": "Port" @@ -21469,14 +24063,14 @@ }, "local_interface": { "type": "string", - "description": "Local Source Interface", + "description": "Local Source Interface.", "title": "Local Interface" }, "template_interval": { "type": "integer", "minimum": 5000, "maximum": 3600000, - "description": "Template interval in milliseconds", + "description": "Template interval in milliseconds.", "title": "Template Interval" } }, @@ -21538,7 +24132,7 @@ "properties": { "name": { "type": "string", - "description": "Tracker Name", + "description": "Tracker Name.", "title": "Name" }, "record_export": { @@ -21548,14 +24142,14 @@ "type": "integer", "minimum": 3000, "maximum": 900000, - "description": "Flow record inactive export timeout in milliseconds", + "description": "Flow record inactive export timeout in milliseconds.", "title": "On Inactive Timeout" }, "on_interval": { "type": "integer", "minimum": 1000, "maximum": 36000000, - "description": "Flow record export interval in milliseconds", + "description": "Flow record export interval in milliseconds.", "title": "On Interval" } }, @@ -21572,7 +24166,7 @@ "properties": { "name": { "type": "string", - "description": "Exporter Name", + "description": "Exporter Name.", "title": "Name" }, "collector": { @@ -21580,12 +24174,12 @@ "properties": { "host": { "type": "string", - "description": "Collector IPv4 address or IPv6 address or fully qualified domain name", + "description": "Collector IPv4 address or IPv6 address or fully qualified domain name.", "title": "Host" }, "port": { "type": "integer", - "description": "Collector Port Number", + "description": "Collector Port Number.", "minimum": 1, "maximum": 65535, "title": "Port" @@ -21613,14 +24207,14 @@ }, "local_interface": { "type": "string", - "description": "Local Source Interface", + "description": "Local Source Interface.", "title": "Local Interface" }, "template_interval": { "type": "integer", "minimum": 5000, "maximum": 3600000, - "description": "Template interval in milliseconds", + "description": "Template interval in milliseconds.", "title": "Template Interval" } }, @@ -21674,7 +24268,7 @@ "enum": [ "sampled" ], - "description": "Flow Tracking Type - only 'sampled' supported for now", + "description": "Flow Tracking Type - only 'sampled' supported for now.", "title": "Type" }, "sample": { @@ -21690,7 +24284,7 @@ "properties": { "name": { "type": "string", - "description": "Tracker Name", + "description": "Tracker Name.", "title": "Name" }, "record_export": { @@ -21700,19 +24294,19 @@ "type": "integer", "minimum": 3000, "maximum": 900000, - "description": "Flow record inactive export timeout in milliseconds", + "description": "Flow record inactive export timeout in milliseconds.", "title": "On Inactive Timeout" }, "on_interval": { "type": "integer", "minimum": 1000, "maximum": 36000000, - "description": "Flow record export interval in milliseconds", + "description": "Flow record export interval in milliseconds.", "title": "On Interval" }, "mpls": { "type": "boolean", - "description": "Export MPLS forwarding information", + "description": "Export MPLS forwarding information.", "title": "MPLS" } }, @@ -21729,7 +24323,7 @@ "properties": { "name": { "type": "string", - "description": "Exporter Name", + "description": "Exporter Name.", "title": "Name" }, "collector": { @@ -21737,12 +24331,12 @@ "properties": { "host": { "type": "string", - "description": "Collector IPv4 address or IPv6 address or fully qualified domain name", + "description": "Collector IPv4 address or IPv6 address or fully qualified domain name.", "title": "Host" }, "port": { "type": "integer", - "description": "Collector Port Number", + "description": "Collector Port Number.", "minimum": 1, "maximum": 65535, "title": "Port" @@ -21770,14 +24364,14 @@ }, "local_interface": { "type": "string", - "description": "Local Source Interface", + "description": "Local Source Interface.", "title": "Local Interface" }, "template_interval": { "type": "integer", "minimum": 5000, "maximum": 3600000, - "description": "Template interval in milliseconds", + "description": "Template interval in milliseconds.", "title": "Template Interval" } }, @@ -21869,7 +24463,7 @@ }, "serdes": { "type": "string", - "description": "Serdes speed like \"10g\" or \"25g\"", + "description": "Serdes speed like \"10g\" or \"25g\".", "title": "Serdes" } }, @@ -21895,7 +24489,7 @@ "properties": { "features": { "type": "array", - "description": "This data model allows to configure the list of hardware counters feature\navailable on Arista platforms.\n\nThe `name` key accepts a list of valid_values which MUST be updated to support\nnew feature as they are released in EOS.\n\nThe available values of the different keys like 'direction' or 'address_type'\nare feature and hardware dependent and this model DOES NOT validate that the\ncombinations are valid. It is the responsability of the user of this data model\nto make sure that the rendered CLI is accepted by the targeted device.\n\nExamples:\n\n * Use:\n ```yaml\n hardware_counters:\n features:\n - name: ip\n direction: out\n layer3: true\n units_packets: true\n ```\n\n to render:\n ```eos\n hardware counter feature ip out layer3 units packets\n ```\n * Use:\n ```yaml\n hardware_counters:\n features:\n - name: route\n address_type: ipv4\n vrf: test\n prefix: 192.168.0.0/24\n ```\n\n to render:\n ```eos\n hardware counter feature route ipv4 vrf test 192.168.0.0/24\n ```\n", + "description": "This data model allows to configure the list of hardware counters feature\navailable on Arista platforms.\n\nThe `name` key accepts a list of valid_values which MUST be updated to support\nnew feature as they are released in EOS.\n\nThe available values of the different keys like 'direction' or 'address_type'\nare feature and hardware dependent and this model DOES NOT validate that the\ncombinations are valid. It is the responsibility of the user of this data model\nto make sure that the rendered CLI is accepted by the targeted device.\n\nExamples:\n\n * Use:\n ```yaml\n hardware_counters:\n features:\n - name: ip\n direction: out\n layer3: true\n units_packets: true\n ```\n\n to render:\n ```eos\n hardware counter feature ip out layer3 units packets\n ```\n * Use:\n ```yaml\n hardware_counters:\n features:\n - name: route\n address_type: ipv4\n vrf: test\n prefix: 192.168.0.0/24\n ```\n\n to render:\n ```eos\n hardware counter feature route ipv4 vrf test 192.168.0.0/24\n ```\n", "items": { "type": "object", "properties": { @@ -21921,6 +24515,7 @@ "qos dual-rate-policer", "route", "routed-port", + "segment-security", "subinterface", "tapagg", "traffic-class", @@ -21956,7 +24551,7 @@ }, "layer3": { "type": "boolean", - "description": "Supported only for the 'ip' feature\n", + "description": "Supported only for the 'ip' feature.\n", "title": "Layer3" }, "vrf": { @@ -22028,14 +24623,14 @@ "properties": { "name": { "type": "string", - "description": "Interface-Group name", + "description": "Interface-Group name.", "title": "Name" }, "interfaces": { "type": "array", "items": { "type": "string", - "description": "Interface Name" + "description": "Interface Name." }, "title": "Interfaces" }, @@ -22043,7 +24638,7 @@ "type": "array", "items": { "type": "string", - "description": "Name of BGP Maintenance Profile" + "description": "Name of BGP Maintenance Profile." }, "title": "BGP Maintenance Profiles" }, @@ -22051,7 +24646,7 @@ "type": "array", "items": { "type": "string", - "description": "Name of Interface Maintenance Profile" + "description": "Name of Interface Maintenance Profile." }, "title": "Interface Maintenance Profiles" } @@ -22072,14 +24667,14 @@ "properties": { "name": { "type": "string", - "description": "Interface-Profile Name", + "description": "Interface-Profile Name.", "title": "Name" }, "commands": { "type": "array", "items": { "type": "string", - "description": "EOS CLI interface command\nExample: \"switchport mode access\"\n" + "description": "EOS CLI interface command.\nExample: \"switchport mode access\"\n" }, "title": "Commands" } @@ -22210,7 +24805,7 @@ }, "ttl": { "type": "integer", - "description": "TTL value", + "description": "TTL value.", "minimum": 0, "maximum": 255, "title": "TTL" @@ -22291,13 +24886,13 @@ "ip_community_lists": { "type": "array", "title": "IP Community Lists", - "description": "Communities and regexp entries MUST not be configured in the same community-list\n", + "description": "Communities and regexp entries MUST not be configured in the same community-list.\n", "items": { "type": "object", "properties": { "name": { "type": "string", - "description": "IP Community-list Name", + "description": "IP Community-list Name.", "title": "Name" }, "entries": { @@ -22323,7 +24918,7 @@ }, "regexp": { "type": "string", - "description": "Regular Expression\nIf defined, a regex community-list will be configured\n", + "description": "Regular Expression.\nIf defined, a regex community-list will be configured.\n", "title": "RegExp" } }, @@ -22351,9 +24946,19 @@ "ip_dhcp_relay": { "type": "object", "properties": { + "always_on": { + "type": "boolean", + "description": "DhcpRelay Agent will be in always-on mode.", + "title": "Always On" + }, + "all_subnets": { + "type": "boolean", + "description": "Allow forwarding requests with secondary IP addresses in the gateway address \"giaddr\" field.", + "title": "All Subnets" + }, "information_option": { "type": "boolean", - "description": "Insert Option-82 information", + "description": "Insert Option-82 information.", "title": "Information Option" } }, @@ -22379,12 +24984,12 @@ "properties": { "enabled": { "type": "boolean", - "description": "Enable insertion of option-82 in DHCP request packets", + "description": "Enable insertion of option-82 in DHCP request packets.", "title": "Enabled" }, "circuit_id_type": { "type": "string", - "description": "\"none\" or <0 - 255>", + "description": "\"none\" or <0 - 255>.", "title": "Circuit ID Type" }, "circuit_id_format": { @@ -22425,7 +25030,7 @@ "properties": { "name": { "type": "string", - "description": "Source Interface\n", + "description": "Source Interface.\n", "title": "Name" }, "vrf": { @@ -22458,7 +25063,7 @@ "properties": { "name": { "type": "string", - "description": "Community-list Name", + "description": "Community-list Name.", "title": "Name" }, "entries": { @@ -22476,7 +25081,7 @@ }, "extcommunities": { "type": "string", - "description": "Communities as string\nExample: \"65000:65000\"\n", + "description": "Communities as string.\nExample: \"65000:65000\"\n", "title": "Extcommunities" } }, @@ -22510,7 +25115,7 @@ "properties": { "name": { "type": "string", - "description": "Community-list Name", + "description": "Community-list Name.", "title": "Name" }, "entries": { @@ -22528,7 +25133,7 @@ }, "regexp": { "type": "string", - "description": "Regular Expression", + "description": "Regular Expression.", "title": "RegExp" } }, @@ -22561,12 +25166,12 @@ "properties": { "name": { "type": "string", - "description": "Interface Name", + "description": "Interface Name.", "title": "Name" }, "vrf": { "type": "string", - "description": "VRF Name", + "description": "VRF Name.", "title": "VRF" } }, @@ -22634,7 +25239,7 @@ "type": "object", "properties": { "name": { - "description": "Interface Name", + "description": "Interface Name.", "type": "string", "title": "Name" }, @@ -22688,7 +25293,7 @@ }, "address": { "type": "string", - "description": "IP Address", + "description": "IP Address.", "title": "Address" }, "query_interval": { @@ -22737,7 +25342,7 @@ "properties": { "id": { "type": "integer", - "description": "VLAN ID", + "description": "VLAN ID.", "title": "ID" }, "enabled": { @@ -22753,7 +25358,7 @@ }, "address": { "type": "string", - "description": "IP Address", + "description": "IP Address.", "title": "Address" }, "query_interval": { @@ -22801,7 +25406,7 @@ }, "proxy": { "type": "boolean", - "description": "Global proxy settings should be enabled before enabling per-vlan\n", + "description": "Global proxy settings should be enabled before enabling per-vlan.\n", "title": "Proxy" } }, @@ -22829,16 +25434,16 @@ "properties": { "ip_address": { "type": "string", - "description": "IPv4 or IPv6 address for DNS server", + "description": "IPv4 or IPv6 address for DNS server.", "title": "IP Address" }, "vrf": { - "description": "VRF Name", + "description": "VRF Name.", "type": "string", "title": "VRF" }, "priority": { - "description": "Priority value (lower is first)", + "description": "Priority value (lower is first).", "type": "integer", "minimum": 0, "maximum": 4, @@ -22859,7 +25464,7 @@ "type": "integer", "minimum": 1, "maximum": 64, - "description": "Buffer size in MB", + "description": "Buffer size in MB.", "title": "Kernel Buffer Size" }, "profiles": { @@ -22921,7 +25526,7 @@ "properties": { "access_list": { "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Access List" }, "comment": { @@ -22941,16 +25546,17 @@ "type": "integer", "minimum": 1, "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Group" }, "original_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address. The combination of `original_ip` and `original_port` must be unique.", "title": "Original IP" }, "original_port": { "type": "integer", + "description": "TCP/UDP port. The combination of `original_ip` and `original_port` must be unique.", "minimum": 1, "maximum": 65535, "title": "Original Port" @@ -22971,20 +25577,19 @@ }, "translated_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.", "title": "Translated IP" }, "translated_port": { "type": "integer", "minimum": 1, "maximum": 65535, - "description": "requires 'original_port'", + "description": "requires 'original_port'.", "title": "Translated Port" } }, "required": [ - "translated_ip", - "original_ip" + "translated_ip" ], "additionalProperties": false, "patternProperties": { @@ -23028,7 +25633,7 @@ }, "pool_name": { "type": "string", - "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone\nignored if 'nat_type' is overload\n", + "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone.\nignored if 'nat_type' is overload.\n", "title": "Pool Name" }, "priority": { @@ -23056,7 +25661,7 @@ "properties": { "access_list": { "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Access List" }, "comment": { @@ -23076,16 +25681,17 @@ "type": "integer", "minimum": 1, "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Group" }, "original_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address. The combination of `original_ip` and `original_port` must be unique.", "title": "Original IP" }, "original_port": { "type": "integer", + "description": "TCP/UDP port. The combination of `original_ip` and `original_port` must be unique.", "minimum": 1, "maximum": 65535, "title": "Original Port" @@ -23106,20 +25712,19 @@ }, "translated_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.", "title": "Translated IP" }, "translated_port": { "type": "integer", "minimum": 1, "maximum": 65535, - "description": "requires 'original_port'", + "description": "requires 'original_port'.", "title": "Translated Port" } }, "required": [ - "translated_ip", - "original_ip" + "translated_ip" ], "additionalProperties": false, "patternProperties": { @@ -23155,10 +25760,20 @@ "type": "string", "title": "Name" }, + "type": { + "type": "string", + "enum": [ + "ip-port", + "port-only" + ], + "default": "ip-port", + "title": "Type" + }, "prefix_length": { "type": "integer", "minimum": 16, "maximum": 32, + "description": "It is only used and required when `type` is `ip-port`.", "title": "Prefix Length" }, "ranges": { @@ -23168,12 +25783,12 @@ "properties": { "first_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.\nRequired when `type` is `ip-port` and ignored otherwise.", "title": "First IP" }, "last_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.\nRequired when `type` is `ip-port` and ignored otherwise.\n`first_ip` and `last_ip` ip addresses should lie in same subnet.", "title": "Last IP" }, "first_port": { @@ -23186,13 +25801,10 @@ "type": "integer", "minimum": 1, "maximum": 65535, + "description": "Required when `first_port` is set.\n`last_port` must be greater than or equal to `first_port`.", "title": "Last Port" } }, - "required": [ - "first_ip", - "last_ip" - ], "additionalProperties": false, "patternProperties": { "^_.+$": {} @@ -23207,14 +25819,13 @@ "title": "Utilization Log Threshold" } }, - "required": [ - "prefix_length", - "name" - ], "additionalProperties": false, "patternProperties": { "^_.+$": {} - } + }, + "required": [ + "name" + ] }, "title": "Pools" }, @@ -23229,17 +25840,17 @@ "type": "integer", "minimum": 60, "maximum": 3600, - "description": "in seconds", + "description": "In seconds.", "title": "Expiry Interval" }, "local_interface": { "type": "string", - "description": "EOS interface name", + "description": "EOS interface name.", "title": "Local Interface" }, "peer_address": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.", "title": "Peer Address" }, "port_range": { @@ -23255,7 +25866,7 @@ "type": "integer", "minimum": 1024, "maximum": 65535, - "description": ">= first_port", + "description": ">= first_port.", "title": "Last Port" }, "split_disabled": { @@ -23312,14 +25923,14 @@ "type": "integer", "minimum": 1, "maximum": 99, - "description": "Used to render 'ip nat translation low-mark '", + "description": "Used to render 'ip nat translation low-mark '.", "title": "Percentage" }, "host_percentage": { "type": "integer", "minimum": 1, "maximum": 99, - "description": "Used to render 'ip nat translation low-mark host'", + "description": "Used to render 'ip nat translation low-mark host'.", "title": "Host Percentage" } }, @@ -23351,7 +25962,7 @@ "properties": { "ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.", "title": "IP" }, "limit": { @@ -23396,7 +26007,7 @@ "type": "integer", "minimum": 0, "maximum": 4294967295, - "description": "in seconds", + "description": "In seconds.", "title": "Timeout" } }, @@ -23432,12 +26043,12 @@ "properties": { "name": { "type": "string", - "description": "Interface Name", + "description": "Interface Name.", "title": "Name" }, "vrf": { "type": "string", - "description": "VRF Name", + "description": "VRF Name.", "title": "VRF" } }, @@ -23533,9 +26144,35 @@ "properties": { "name": { "type": "string", - "description": "Name of the SA policy. The \"null\" value is deprecated and will be removed in AVD 5.0.0", + "description": "Name of the SA policy. The \"null\" value is deprecated and will be removed in AVD 5.0.0.", "title": "Name" }, + "sa_lifetime": { + "type": "object", + "properties": { + "value": { + "type": "integer", + "description": "Lifetime value for this SA.\nValid range depends on the unit.\n<1-24> Lifetime in hours ( default )\n<1-4000000> Packet limit in thousands\n<1-6000> Byte limit in GB ( 1024 MB )\n<1-6144000> Byte limit in MB ( 1024 KB )", + "title": "Value" + }, + "unit": { + "type": "string", + "enum": [ + "gigabytes", + "hours", + "megabytes", + "thousand-packets" + ], + "default": "hours", + "title": "Unit" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Sa Lifetime" + }, "esp": { "type": "object", "properties": { @@ -23652,7 +26289,7 @@ }, "action": { "type": "string", - "description": "Action to apply\n\n* 'clear': Delete all connections\n* 'hold': Re-negotiate connection on demand\n* 'restart': Restart connection immediately\n", + "description": "Action to apply.\n\n* 'clear': Delete all connections\n* 'hold': Re-negotiate connection on demand\n* 'restart': Restart connection immediately\n", "enum": [ "clear", "hold", @@ -23731,7 +26368,7 @@ "type": "object", "properties": { "name": { - "description": "Interface Name", + "description": "Interface Name.", "type": "string", "title": "Name" }, @@ -23756,7 +26393,7 @@ "properties": { "name": { "type": "string", - "description": "Interface name", + "description": "Interface name.", "title": "Name" }, "vrf": { @@ -23777,12 +26414,12 @@ "properties": { "name": { "type": "string", - "description": "Interface Name", + "description": "Interface Name.", "title": "Name" }, "vrf": { "type": "string", - "description": "VRF Name", + "description": "VRF Name.", "title": "VRF" } }, @@ -23803,12 +26440,12 @@ "properties": { "name": { "type": "string", - "description": "Interface Name", + "description": "Interface Name.", "title": "Name" }, "vrf": { "type": "string", - "description": "VRF Name", + "description": "VRF Name.", "title": "VRF" } }, @@ -23824,7 +26461,7 @@ }, "ip_virtual_router_mac_address": { "type": "string", - "description": "MAC address (hh:hh:hh:hh:hh:hh)", + "description": "MAC address (hh:hh:hh:hh:hh:hh).", "title": "IP Virtual Router MAC Address" }, "ipv6_access_lists": { @@ -23835,7 +26472,7 @@ "properties": { "name": { "type": "string", - "description": "IPv6 Access-list Name", + "description": "IPv6 Access-list Name.", "title": "Name" }, "counters_per_entry": { @@ -23849,12 +26486,12 @@ "properties": { "sequence": { "type": "integer", - "description": "Sequence ID", + "description": "Sequence ID.", "title": "Sequence" }, "action": { "type": "string", - "description": "Action as string\nExample: \"deny ipv6 any any\"\n", + "description": "Action as string.\nExample: \"deny ipv6 any any\"\n", "title": "Action" } }, @@ -23880,6 +26517,51 @@ } } }, + "ipv6_dhcp_relay": { + "type": "object", + "properties": { + "always_on": { + "type": "boolean", + "description": "DhcpRelay Agent will be in always-on mode, off by default.", + "title": "Always On" + }, + "all_subnets": { + "type": "boolean", + "description": "Allow forwarding requests with additional IPv6 addresses in the gateway address \"giaddr\" field.", + "title": "All Subnets" + }, + "option": { + "type": "object", + "description": "Insert DHCP Option.", + "properties": { + "link_layer_address": { + "type": "boolean", + "description": "Add Option 79 (Link Layer Address Option).", + "title": "Link Layer Address" + }, + "remote_id_format": { + "type": "string", + "enum": [ + "%m:%i", + "%m:%p" + ], + "description": "Add RemoteID option 37 in format MAC address and interface ID (`%m:%i`) or MAC address and interface name (`%m:%p`).", + "title": "Remote ID Format" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Option" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IPv6 DHCP Relay" + }, "ipv6_hardware": { "type": "object", "properties": { @@ -23894,7 +26576,7 @@ "properties": { "profile": { "type": "string", - "description": "Pre-defined profile 'internet' or user-defined profile name", + "description": "Pre-defined profile 'internet' or user-defined profile name.", "title": "Profile" } }, @@ -23929,6 +26611,80 @@ "type": "boolean", "title": "IPv6 ICMP Redirect" }, + "ipv6_neighbor": { + "type": "object", + "properties": { + "static_entries": { + "type": "array", + "description": "Static IPv6 neighbor entries.", + "items": { + "type": "object", + "properties": { + "ipv6_address": { + "type": "string", + "description": "IPv6 address of neighbor.", + "title": "IPv6 Address" + }, + "vrf": { + "type": "string", + "title": "VRF" + }, + "interface": { + "type": "string", + "description": "Interface name.", + "title": "Interface" + }, + "mac_address": { + "type": "string", + "description": "MAC address of neighbor like 'aa:af:12:34:bc:bf'", + "pattern": "^([0-9a-f]{2}:){5}[0-9a-f]{2}$", + "title": "MAC Address" + } + }, + "required": [ + "ipv6_address", + "interface", + "mac_address" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Static Entries" + }, + "persistent": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Restore the IPv6 neighbor cache after reboot.", + "title": "Enabled" + }, + "refresh_delay": { + "type": "integer", + "description": "Time to wait in seconds before refreshing the IPv6 neighbor cache after reboot (EOS default 600).\nIt will require setting the `enabled` key to true.\n", + "minimum": 600, + "maximum": 3600, + "title": "Refresh Delay" + } + }, + "required": [ + "enabled" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Persistent" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IPv6 Neighbor" + }, "ipv6_prefix_lists": { "type": "array", "items": { @@ -23936,7 +26692,7 @@ "properties": { "name": { "type": "string", - "description": "Prefix-list Name", + "description": "Prefix-list Name.", "title": "Name" }, "sequence_numbers": { @@ -23946,12 +26702,12 @@ "properties": { "sequence": { "type": "integer", - "description": "Sequence ID", + "description": "Sequence ID.", "title": "Sequence" }, "action": { "type": "string", - "description": "Action as string\nExample: \"permit 1b11:3a00:22b0:0082::/64 eq 128\"\n", + "description": "Action as string.\nExample: \"permit 1b11:3a00:22b0:0082::/64 eq 128\"\n", "title": "Action" } }, @@ -23985,7 +26741,7 @@ "properties": { "name": { "type": "string", - "description": "Access-list Name", + "description": "Access-list Name.", "title": "Name" }, "counters_per_entry": { @@ -23999,12 +26755,12 @@ "properties": { "sequence": { "type": "integer", - "description": "Sequence ID", + "description": "Sequence ID.", "title": "Sequence" }, "action": { "type": "string", - "description": "Action as string\nExample: \"deny ipv6 any any\"\n", + "description": "Action as string.\nExample: \"deny ipv6 any any\"\n", "title": "Action" } }, @@ -24042,7 +26798,7 @@ }, "destination_address_prefix": { "type": "string", - "description": "IPv6 Network/Mask", + "description": "IPv6 Network/Mask.", "title": "Destination Address Prefix" }, "interface": { @@ -24051,12 +26807,12 @@ }, "gateway": { "type": "string", - "description": "IPv6 Address", + "description": "IPv6 Address.", "title": "Gateway" }, "track_bfd": { "type": "boolean", - "description": "Track next-hop using BFD", + "description": "Track next-hop using BFD.", "title": "Track BFD" }, "distance": { @@ -24073,7 +26829,7 @@ }, "name": { "type": "string", - "description": "Description", + "description": "Description.", "title": "Name" }, "metric": { @@ -24095,7 +26851,7 @@ "title": "IPv6 Unicast Routing" }, "is_deployed": { - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "type": "boolean", "default": true, "title": "Is Deployed" @@ -24349,7 +27105,7 @@ "properties": { "default": { "type": "integer", - "description": "Default load interval in seconds", + "description": "Default load interval in seconds.", "title": "Default" } }, @@ -24365,7 +27121,7 @@ "type": "object", "properties": { "name": { - "description": "Username", + "description": "Username.", "type": "string", "title": "Name" }, @@ -24383,12 +27139,12 @@ }, "role": { "type": "string", - "description": "EOS RBAC Role to be assigned to the user such as \"network-admin\" or \"network-operator\"\n", + "description": "EOS RBAC Role to be assigned to the user such as \"network-admin\" or \"network-operator\".\n", "title": "Role" }, "sha512_password": { "type": "string", - "description": "SHA512 Hash of Password\nMust be the hash of the password. By default EOS salts the password with the username, so the simplest is to generate the hash on an EOS device using the same username.\n", + "description": "SHA512 Hash of Password.\nMust be the hash of the password. By default EOS salts the password with the username, so the simplest is to generate the hash on an EOS device using the same username.\n", "title": "SHA512 Password" }, "no_password": { @@ -24406,7 +27162,7 @@ }, "shell": { "type": "string", - "description": "Specify shell for the user\n", + "description": "Specify shell for the user.\n", "enum": [ "/bin/bash", "/bin/sh", @@ -24441,7 +27197,7 @@ "emergencies", "disabled" ], - "description": "Console logging severity level\n", + "description": "Console logging severity level.\n", "title": "Console" }, "monitor": { @@ -24457,7 +27213,7 @@ "emergencies", "disabled" ], - "description": "Monitor logging severity level\n", + "description": "Monitor logging severity level.\n", "title": "Monitor" }, "buffered": { @@ -24482,7 +27238,7 @@ "warnings", "disabled" ], - "description": "Buffer logging severity level\n", + "description": "Buffer logging severity level.\n", "title": "Level" } }, @@ -24506,7 +27262,7 @@ "warnings", "disabled" ], - "description": "Trap logging severity level\n", + "description": "Trap logging severity level.\n", "title": "Trap" }, "synchronous": { @@ -24526,7 +27282,7 @@ "warnings", "disabled" ], - "description": "Synchronous logging severity level\n", + "description": "Synchronous logging severity level.\n", "default": "critical", "title": "Level" } @@ -24550,7 +27306,7 @@ "traditional timezone year", "traditional year timezone" ], - "description": "Timestamp format", + "description": "Timestamp format.", "title": "Timestamp" }, "hostname": { @@ -24564,12 +27320,12 @@ }, "sequence_numbers": { "type": "boolean", - "description": "Add sequence numbers to log messages\n", + "description": "Add sequence numbers to log messages.\n", "title": "Sequence Numbers" }, "rfc5424": { "type": "boolean", - "description": "Forward logs in RFC5424 format\n", + "description": "Forward logs in RFC5424 format.\n", "title": "Rfc5424" } }, @@ -24611,7 +27367,7 @@ }, "source_interface": { "type": "string", - "description": "Source Interface Name", + "description": "Source Interface Name.", "title": "Source Interface" }, "vrfs": { @@ -24621,12 +27377,12 @@ "properties": { "name": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "Name" }, "source_interface": { "type": "string", - "description": "Source interface name", + "description": "Source interface name.", "title": "Source Interface" }, "hosts": { @@ -24636,7 +27392,7 @@ "properties": { "name": { "type": "string", - "description": "Syslog server name", + "description": "Syslog server name.", "title": "Name" }, "protocol": { @@ -24690,7 +27446,7 @@ "properties": { "name": { "type": "string", - "description": "Match list", + "description": "Match list.", "title": "Name" }, "action": { @@ -24742,7 +27498,7 @@ "type": "integer", "minimum": 10, "maximum": 65535, - "description": "Logging interval in seconds", + "description": "Logging interval in seconds.", "title": "Interval" } }, @@ -24765,6 +27521,50 @@ "^_.+$": {} }, "title": "Event" + }, + "level": { + "type": "array", + "description": "Configure logging severity.", + "items": { + "type": "object", + "properties": { + "facility": { + "type": "string", + "title": "Facility" + }, + "severity": { + "type": "string", + "description": "Severity of facility. Below are the supported severites.\nemergencies System is unusable (severity=0)\nalerts Immediate action needed (severity=1)\ncritical Critical conditions (severity=2)\nerrors Error conditions (severity=3)\nwarnings Warning conditions (severity=4)\nnotifications Normal but significant conditions (severity=5)\ninformational Informational messages (severity=6)\ndebugging Debugging messages (severity=7)\n<0-7> Severity level value", + "enum": [ + "alerts", + "critical", + "debugging", + "emergencies", + "errors", + "informational", + "notifications", + "warnings", + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7" + ], + "title": "Severity" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "facility" + ] + }, + "title": "Level" } }, "additionalProperties": false, @@ -24780,7 +27580,7 @@ "properties": { "name": { "type": "string", - "description": "Loopback interface name e.g. \"Loopback0\"", + "description": "Loopback interface name e.g. \"Loopback0\".", "title": "Name" }, "description": { @@ -24793,19 +27593,19 @@ }, "vrf": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "VRF" }, "ip_address": { "type": "string", - "description": "IPv4_address/Mask", + "description": "IPv4_address/Mask.", "title": "IP Address" }, "ip_address_secondaries": { "type": "array", "items": { "type": "string", - "description": "IPv4_address/Mask" + "description": "IPv4_address/Mask." }, "title": "IP Address Secondaries" }, @@ -24815,7 +27615,7 @@ }, "ipv6_address": { "type": "string", - "description": "IPv6_address/Mask", + "description": "IPv6_address/Mask.", "title": "IPv6 Address" }, "ip_proxy_arp": { @@ -24852,9 +27652,14 @@ }, "isis_enable": { "type": "string", - "description": "ISIS instance name", + "description": "ISIS instance name.", "title": "ISIS Enable" }, + "isis_bfd": { + "type": "boolean", + "description": "Enable BFD for ISIS.", + "title": "ISIS BFD" + }, "isis_passive": { "type": "boolean", "title": "ISIS Passive" @@ -24887,7 +27692,7 @@ }, "eos_cli": { "type": "string", - "description": "EOS CLI rendered directly on the loopback interface in the final EOS configuration", + "description": "EOS CLI rendered directly on the loopback interface in the final EOS configuration.", "title": "EOS CLI" } }, @@ -24908,7 +27713,7 @@ "properties": { "name": { "type": "string", - "description": "MAC Access-list Name", + "description": "MAC Access-list Name.", "title": "Name" }, "counters_per_entry": { @@ -24952,7 +27757,7 @@ "properties": { "aging_time": { "type": "integer", - "description": "Aging time in seconds", + "description": "Aging time in seconds.", "title": "Aging Time" }, "notification_host_flap": { @@ -25035,7 +27840,7 @@ "properties": { "name": { "type": "string", - "description": "Profile-Name", + "description": "Profile-Name.", "title": "Name" }, "cipher": { @@ -25092,7 +27897,7 @@ "type": "integer", "minimum": 30, "maximum": 100000, - "description": "Rekey period in seconds", + "description": "Rekey period in seconds.", "title": "Rekey Period" } }, @@ -25164,6 +27969,33 @@ "^_.+$": {} }, "title": "L2 Protocols" + }, + "traffic_unprotected": { + "type": "object", + "properties": { + "action": { + "type": "string", + "description": "Allow/drop the transmit/receive of unprotected traffic.", + "enum": [ + "allow", + "drop" + ], + "title": "Action" + }, + "allow_active_sak": { + "type": "boolean", + "description": "Allow transmit/receive of encrypted traffic using operational SAK and block otherwise.", + "title": "Allow Active Sak" + } + }, + "required": [ + "action" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Traffic Unprotected" } }, "additionalProperties": false, @@ -25188,17 +28020,17 @@ "properties": { "default_interface_profile": { "type": "string", - "description": "Name of default Interface Profile\n", + "description": "Name of default Interface Profile.\n", "title": "Default Interface Profile" }, "default_bgp_profile": { "type": "string", - "description": "Name of default BGP Profile\n", + "description": "Name of default BGP Profile.\n", "title": "Default BGP Profile" }, "default_unit_profile": { "type": "string", - "description": "Name of default Unit Profile\n", + "description": "Name of default Unit Profile.\n", "title": "Default Unit Profile" }, "interface_profiles": { @@ -25215,12 +28047,12 @@ "properties": { "load_interval": { "type": "integer", - "description": "Load Interval in Seconds\n", + "description": "Load Interval in Seconds.\n", "title": "Load Interval" }, "threshold": { "type": "integer", - "description": "Threshold in kbps\n", + "description": "Threshold in kbps.\n", "title": "Threshold" } }, @@ -25235,7 +28067,7 @@ "properties": { "max_delay": { "type": "integer", - "description": "Max delay in seconds\n", + "description": "Max delay in seconds.\n", "title": "Max Delay" } }, @@ -25263,7 +28095,7 @@ "properties": { "name": { "type": "string", - "description": "BGP Profile Name", + "description": "BGP Profile Name.", "title": "Name" }, "initiator": { @@ -25271,7 +28103,7 @@ "properties": { "route_map_inout": { "type": "string", - "description": "Route Map", + "description": "Route Map.", "title": "Route Map Inout" } }, @@ -25299,7 +28131,7 @@ "properties": { "name": { "type": "string", - "description": "Unit Profile Name", + "description": "Unit Profile Name.", "title": "Name" }, "on_boot": { @@ -25309,7 +28141,7 @@ "type": "integer", "minimum": 300, "maximum": 3600, - "description": "On-boot in seconds\n", + "description": "On-boot in seconds.\n", "title": "Duration" } }, @@ -25337,7 +28169,7 @@ "properties": { "name": { "type": "string", - "description": "Unit Name", + "description": "Unit Name.", "title": "Name" }, "quiesce": { @@ -25346,7 +28178,7 @@ }, "profile": { "type": "string", - "description": "Name of Unit Profile\n", + "description": "Name of Unit Profile.\n", "title": "Profile" }, "groups": { @@ -25356,7 +28188,7 @@ "type": "array", "items": { "type": "string", - "description": "Name of BGP Group\n" + "description": "Name of BGP Group.\n" }, "title": "BGP Groups" }, @@ -25364,7 +28196,7 @@ "type": "array", "items": { "type": "string", - "description": "Name of Interface Group\n" + "description": "Name of Interface Group.\n" }, "title": "Interface Groups" } @@ -25434,17 +28266,17 @@ "properties": { "name": { "type": "string", - "description": "Transport name", + "description": "Transport name.", "title": "Name" }, "ssl_profile": { "type": "string", - "description": "SSL profile name", + "description": "SSL profile name.", "title": "SSL Profile" }, "vrf": { "type": "string", - "description": "VRF name is optional", + "description": "VRF name is optional.", "title": "VRF" }, "notification_timestamp": { @@ -25458,7 +28290,7 @@ }, "ip_access_group": { "type": "string", - "description": "ACL name", + "description": "ACL name.", "title": "IP Access Group" }, "port": { @@ -25481,27 +28313,27 @@ "properties": { "name": { "type": "string", - "description": "Transport name", + "description": "Transport name.", "title": "Name" }, "shutdown": { "type": "boolean", - "description": "Operational status of the gRPC tunnel", + "description": "Operational status of the gRPC tunnel.", "title": "Shutdown" }, "tunnel_ssl_profile": { "type": "string", - "description": "Tunnel SSL profile name", + "description": "Tunnel SSL profile name.", "title": "Tunnel SSL Profile" }, "gnmi_ssl_profile": { "type": "string", - "description": "gNMI SSL profile name", + "description": "gNMI SSL profile name.", "title": "gNMI SSL Profile" }, "vrf": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "VRF" }, "destination": { @@ -25509,14 +28341,14 @@ "properties": { "address": { "type": "string", - "description": "IP address or hostname", + "description": "IP address or hostname.", "title": "Address" }, "port": { "type": "integer", "minimum": 1, "maximum": 65535, - "description": "TCP Port", + "description": "TCP Port.", "title": "Port" } }, @@ -25535,14 +28367,14 @@ "properties": { "name": { "type": "string", - "description": "Interface name", + "description": "Interface name.", "title": "Name" }, "port": { "type": "integer", "minimum": 1, "maximum": 65535, - "description": "TCP Port", + "description": "TCP Port.", "title": "Port" } }, @@ -25561,7 +28393,7 @@ "properties": { "use_serial_number": { "type": "boolean", - "description": "Use serial number as the Target ID", + "description": "Use serial number as the Target ID.", "title": "Use Serial Number" }, "target_ids": { @@ -25606,12 +28438,12 @@ "properties": { "name": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "Name" }, "access_group": { "type": "string", - "description": "Standard IPv4 ACL name", + "description": "Standard IPv4 ACL name.", "title": "Access Group" } }, @@ -25650,13 +28482,13 @@ "title": "Enable Https" }, "https_ssl_profile": { - "description": "SSL Profile Name", + "description": "SSL Profile Name.", "type": "string", "title": "Https SSL Profile" }, "default_services": { "type": "boolean", - "description": "Enable default services: capi-doc and tapagg", + "description": "Enable default services: capi-doc and tapagg.", "title": "Default Services" }, "enable_vrfs": { @@ -25665,17 +28497,17 @@ "type": "object", "properties": { "name": { - "description": "VRF Name", + "description": "VRF Name.", "type": "string", "title": "Name" }, "access_group": { - "description": "Standard IPv4 ACL name", + "description": "Standard IPv4 ACL name.", "type": "string", "title": "Access Group" }, "ipv6_access_group": { - "description": "Standard IPv6 ACL name", + "description": "Standard IPv6 ACL name.", "type": "string", "title": "IPv6 Access Group" } @@ -25695,12 +28527,12 @@ "properties": { "certificate": { "type": "string", - "description": "Name of certificate; private key must also be specified", + "description": "Name of certificate; private key must also be specified.", "title": "Certificate" }, "private_key": { "type": "string", - "description": "Name of private key; certificate must also be specified", + "description": "Name of private key; certificate must also be specified.", "title": "Private Key" } }, @@ -25797,18 +28629,18 @@ "type": "array", "items": { "type": "string", - "description": "IP or hostname" + "description": "IP or hostname." }, "title": "Server Hosts" }, "source_interface": { "type": "string", - "description": "Interface name", + "description": "Interface name.", "title": "Source Interface" }, "vrf": { "type": "string", - "description": "VRF Name", + "description": "VRF Name.", "title": "VRF" } }, @@ -25853,7 +28685,7 @@ "properties": { "name": { "type": "string", - "description": "Management Interface Name", + "description": "Management Interface Name.", "title": "Name" }, "description": { @@ -25875,12 +28707,12 @@ }, "vrf": { "type": "string", - "description": "VRF Name", + "description": "VRF Name.", "title": "VRF" }, "ip_address": { "type": "string", - "description": "IPv4_address/Mask", + "description": "IPv4_address/Mask.", "title": "IP Address" }, "ipv6_enable": { @@ -25889,7 +28721,7 @@ }, "ipv6_address": { "type": "string", - "description": "IPv6_address/Mask", + "description": "IPv6_address/Mask.", "title": "IPv6 Address" }, "type": { @@ -25899,22 +28731,22 @@ "inband" ], "default": "oob", - "description": "For documentation purposes only", + "description": "For documentation purposes only.", "title": "Type" }, "gateway": { "type": "string", - "description": "IPv4 address of default gateway in management VRF", + "description": "IPv4 address of default gateway in management VRF.", "title": "Gateway" }, "ipv6_gateway": { "type": "string", - "description": "IPv6 address of default gateway in management VRF", + "description": "IPv6 address of default gateway in management VRF.", "title": "IPv6 Gateway" }, "mac_address": { "type": "string", - "description": "MAC address", + "description": "MAC address.", "title": "MAC Address" }, "lldp": { @@ -25930,7 +28762,7 @@ }, "ztp_vlan": { "type": "integer", - "description": "ZTP vlan number", + "description": "ZTP vlan number.", "title": "ZTP VLAN" } }, @@ -25942,7 +28774,7 @@ }, "eos_cli": { "type": "string", - "description": "Multiline EOS CLI rendered directly on the management interface in the final EOS configuration", + "description": "Multiline EOS CLI rendered directly on the management interface in the final EOS configuration.", "title": "EOS CLI" } }, @@ -25963,6 +28795,37 @@ "type": "string", "title": "Entropy Source" }, + "entropy_sources": { + "type": "object", + "description": "Source of entropy.", + "properties": { + "hardware": { + "type": "boolean", + "description": "Use a hardware based source.", + "title": "Hardware" + }, + "haveged": { + "type": "boolean", + "description": "Use the HAVEGE algorithm.", + "title": "Haveged" + }, + "cpu_jitter": { + "type": "boolean", + "description": "Use the Jitter RNG algorithm of a CPU based source.", + "title": "CPU Jitter" + }, + "hardware_exclusive": { + "type": "boolean", + "description": "Only use entropy from the hardware source.", + "title": "Hardware Exclusive" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Entropy Sources" + }, "password": { "type": "object", "properties": { @@ -26080,12 +28943,12 @@ }, "tls_versions": { "type": "string", - "description": "List of allowed TLS versions as string\nExamples:\n - \"1.0\"\n - \"1.0 1.1\"\n", + "description": "List of allowed TLS versions as string.\nExamples:\n - \"1.0\"\n - \"1.0 1.1\"\n", "title": "TLS Versions" }, "cipher_list": { "type": "string", - "description": "cipher_list syntax follows the openssl cipher strings format.\nColon (:) separated list of allowed ciphers as a string\n", + "description": "cipher_list syntax follows the openssl cipher strings format.\nColon (:) separated list of allowed ciphers as a string.\n", "title": "Cipher List" }, "trust_certificate": { @@ -26093,7 +28956,7 @@ "properties": { "certificates": { "type": "array", - "description": "List of trust certificate names\nExamples:\n - test1.crt\n - test2.crt\n", + "description": "List of trust certificate names.\nExamples:\n - test1.crt\n - test2.crt\n", "items": { "type": "string" }, @@ -26139,7 +29002,7 @@ "properties": { "certificates": { "type": "array", - "description": "List of chain certificate names\nExamples:\n - chain1.crt\n - chain2.crt\n", + "description": "List of chain certificate names.\nExamples:\n - chain1.crt\n - chain2.crt\n", "items": { "type": "string" }, @@ -26203,6 +29066,116 @@ } }, "title": "SSL Profiles" + }, + "shared_secret_profiles": { + "type": "array", + "items": { + "type": "object", + "properties": { + "profile": { + "type": "string", + "title": "Profile" + }, + "secrets": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "secret": { + "type": "string", + "title": "Secret" + }, + "secret_type": { + "type": "string", + "default": "7", + "enum": [ + "0", + "7", + "8a" + ], + "title": "Secret Type" + }, + "receive_lifetime": { + "type": "object", + "properties": { + "infinite": { + "type": "boolean", + "title": "Infinite" + }, + "start_date_time": { + "type": "string", + "description": "Start date and time of lifetime of the secret. End date should be greater than start date.\nFormats supported:\n1. mm/dd/yyyy hh:mm:ss\n2. yyyy-mm-dd hh:mm:ss\ne.g 2024-12-20 10:00:00", + "title": "Start Date Time" + }, + "end_date_time": { + "type": "string", + "description": "End date and time of lifetime of the secret. End date should be greater than start date.\nFormats supported:\n1. mm/dd/yyyy hh:mm:ss\n2. yyyy-mm-dd hh:mm:ss\ne.g 2024-12-20 10:00:00", + "title": "End Date Time" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Receive Lifetime" + }, + "transmit_lifetime": { + "type": "object", + "properties": { + "infinite": { + "type": "boolean", + "title": "Infinite" + }, + "start_date_time": { + "type": "string", + "description": "Start date and time of lifetime of the secret. End date should be greater than start date.\nFormats supported:\n1. mm/dd/yyyy hh:mm:ss\n2. yyyy-mm-dd hh:mm:ss\ne.g 2024-12-20 10:00:00", + "title": "Start Date Time" + }, + "end_date_time": { + "type": "string", + "description": "End date and time of lifetime of the secret. End date should be greater than start date.\nFormats supported:\n1. mm/dd/yyyy hh:mm:ss\n2. yyyy-mm-dd hh:mm:ss\ne.g 2024-12-20 10:00:00", + "title": "End Date Time" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Transmit Lifetime" + }, + "local_time": { + "type": "boolean", + "description": "Configuring secret using the local timezone from system clock. Default is UTC.", + "title": "Local Time" + } + }, + "required": [ + "secret", + "receive_lifetime", + "transmit_lifetime", + "name" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Secrets" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "profile" + ] + }, + "title": "Shared Secret Profiles" } }, "additionalProperties": false, @@ -26221,12 +29194,12 @@ "properties": { "name": { "type": "string", - "description": "Standard ACL Name", + "description": "Standard ACL Name.", "title": "Name" }, "vrf": { "type": "string", - "description": "VRF Name", + "description": "VRF Name.", "title": "VRF" } }, @@ -26244,12 +29217,12 @@ "properties": { "name": { "type": "string", - "description": "Standard ACL Name", + "description": "Standard ACL Name.", "title": "Name" }, "vrf": { "type": "string", - "description": "VRF Name", + "description": "VRF Name.", "title": "VRF" } }, @@ -26264,11 +29237,11 @@ "type": "integer", "minimum": 0, "maximum": 86400, - "description": "Idle timeout in minutes", + "description": "Idle timeout in minutes.", "title": "Idle Timeout" }, "cipher": { - "description": "Cryptographic ciphers for SSH to use", + "description": "Cryptographic ciphers for SSH to use.", "type": "array", "items": { "type": "string" @@ -26276,7 +29249,7 @@ "title": "Cipher" }, "key_exchange": { - "description": "Cryptographic key exchange methods for SSH to use", + "description": "Cryptographic key exchange methods for SSH to use.", "type": "array", "items": { "type": "string" @@ -26284,7 +29257,7 @@ "title": "Key Exchange" }, "mac": { - "description": "Cryptographic MAC algorithms for SSH to use", + "description": "Cryptographic MAC algorithms for SSH to use.", "type": "array", "items": { "type": "string" @@ -26325,7 +29298,7 @@ "title": "Hostkey" }, "enable": { - "description": "Enable SSH daemon", + "description": "Enable SSH daemon.", "type": "boolean", "title": "Enable" }, @@ -26336,14 +29309,14 @@ "type": "integer", "minimum": 1, "maximum": 100, - "description": "Maximum total number of SSH sessions to device", + "description": "Maximum total number of SSH sessions to device.", "title": "Limit" }, "per_host": { "type": "integer", "minimum": 1, "maximum": 20, - "description": "Maximum number of SSH sessions to device from a single host", + "description": "Maximum number of SSH sessions to device from a single host.", "title": "Per Host" } }, @@ -26360,11 +29333,11 @@ "properties": { "name": { "type": "string", - "description": "VRF Name", + "description": "VRF Name.", "title": "Name" }, "enable": { - "description": "Enable SSH in VRF", + "description": "Enable SSH in VRF.", "type": "boolean", "title": "Enable" } @@ -26381,7 +29354,7 @@ }, "log_level": { "type": "string", - "description": "SSH daemon log level", + "description": "SSH daemon log level.", "title": "Log Level" }, "client_alive": { @@ -26428,7 +29401,7 @@ "properties": { "command": { "type": "string", - "description": "Command to exclude from tech-support", + "description": "Command to exclude from tech-support.", "title": "Command" }, "type": { @@ -26456,7 +29429,7 @@ "properties": { "command": { "type": "string", - "description": "Command to include in tech-support", + "description": "Command to include in tech-support.", "title": "Command" } }, @@ -26554,7 +29527,7 @@ "properties": { "name": { "type": "string", - "description": "Match-list Name", + "description": "Match-list Name.", "title": "Name" }, "sequence_numbers": { @@ -26564,12 +29537,12 @@ "properties": { "sequence": { "type": "integer", - "description": "Sequence ID", + "description": "Sequence ID.", "title": "Sequence" }, "match_regex": { "type": "string", - "description": "Regular Expression", + "description": "Regular Expression.", "title": "Match Regex" } }, @@ -26624,7 +29597,7 @@ "type": "array", "items": { "type": "string", - "description": "IP or hostname" + "description": "IP or hostname." }, "title": "Server Hosts" } @@ -26736,7 +29709,7 @@ }, "cv_pathfinder": { "type": "object", - "description": "Metadata used for CV Pathfinder visualization on CloudVision", + "description": "Metadata used for CV Pathfinder visualization on CloudVision.", "properties": { "role": { "type": "string", @@ -26762,6 +29735,10 @@ "type": "string", "title": "SSL Profile" }, + "address": { + "type": "string", + "title": "Address" + }, "pathfinders": { "type": "array", "items": { @@ -26772,6 +29749,9 @@ "title": "Vtep IP" } }, + "required": [ + "vtep_ip" + ], "additionalProperties": false, "patternProperties": { "^_.+$": {} @@ -26856,6 +29836,9 @@ "title": "Imported Carriers" } }, + "required": [ + "name" + ], "additionalProperties": false, "patternProperties": { "^_.+$": {} @@ -27028,6 +30011,121 @@ } }, "title": "VRFs" + }, + "internet_exit_policies": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "type": { + "type": "string", + "title": "Type" + }, + "city": { + "type": "string", + "title": "City" + }, + "country": { + "type": "string", + "title": "Country" + }, + "upload_bandwidth": { + "type": "integer", + "title": "Upload Bandwidth" + }, + "download_bandwidth": { + "type": "integer", + "title": "Download Bandwidth" + }, + "firewall": { + "type": "boolean", + "title": "Firewall" + }, + "ips_control": { + "type": "boolean", + "title": "Ips Control" + }, + "acceptable_use_policy": { + "type": "boolean", + "title": "Acceptable Use Policy" + }, + "vpn_credentials": { + "type": "array", + "items": { + "type": "object", + "properties": { + "fqdn": { + "type": "string", + "title": "Fqdn" + }, + "vpn_type": { + "type": "string", + "title": "VPN Type" + }, + "pre_shared_key": { + "type": "string", + "title": "Pre Shared Key" + } + }, + "required": [ + "fqdn", + "vpn_type", + "pre_shared_key" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "VPN Credentials" + }, + "tunnels": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "preference": { + "type": "string", + "title": "Preference" + } + }, + "required": [ + "name", + "preference" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Tunnels" + } + }, + "required": [ + "name", + "type", + "city", + "country", + "firewall", + "ips_control", + "acceptable_use_policy", + "vpn_credentials", + "tunnels" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Internet Exit Policies" } }, "additionalProperties": false, @@ -27053,17 +30151,17 @@ }, "heartbeat_interval": { "type": "integer", - "description": "Heartbeat interval in milliseconds", + "description": "Heartbeat interval in milliseconds.", "title": "Heartbeat Interval" }, "local_interface": { - "description": "Local Interface Name", + "description": "Local Interface Name.", "type": "string", "title": "Local Interface" }, "peer_address": { "type": "string", - "description": "IPv4 Address", + "description": "IPv4 or IPv6 Address.", "title": "Peer Address" }, "peer_address_heartbeat": { @@ -27071,11 +30169,11 @@ "properties": { "peer_ip": { "type": "string", - "description": "IPv4 Address", + "description": "IPv4 or IPv6 Address.", "title": "Peer IP" }, "vrf": { - "description": "VRF Name", + "description": "VRF Name.", "type": "string", "title": "VRF" } @@ -27088,38 +30186,38 @@ }, "dual_primary_detection_delay": { "type": "integer", - "description": "Delay in seconds", + "description": "Delay in seconds.", "minimum": 0, "maximum": 86400, "title": "Dual Primary Detection Delay" }, "dual_primary_recovery_delay_mlag": { "type": "integer", - "description": "Delay in seconds", + "description": "Delay in seconds.", "minimum": 0, "maximum": 86400, "title": "Dual Primary Recovery Delay MLAG" }, "dual_primary_recovery_delay_non_mlag": { "type": "integer", - "description": "Delay in seconds", + "description": "Delay in seconds.", "minimum": 0, "maximum": 86400, "title": "Dual Primary Recovery Delay Non MLAG" }, "peer_link": { - "description": "Port-Channel interface name", + "description": "Port-Channel interface name.", "type": "string", "title": "Peer Link" }, "reload_delay_mlag": { "type": "string", - "description": "Delay in seconds <0-86400> or 'infinity'", + "description": "Delay in seconds <0-86400> or 'infinity'.", "title": "Reload Delay MLAG" }, "reload_delay_non_mlag": { "type": "string", - "description": "Delay in seconds <0-86400> or 'infinity'", + "description": "Delay in seconds <0-86400> or 'infinity'.", "title": "Reload Delay Non MLAG" } }, @@ -27150,7 +30248,7 @@ }, "interfaces": { "type": "string", - "description": "Interface range(s) should be of same type, Ethernet, Loopback, Management etc.\nMultiple interface ranges can be specified separated by \",\"\n", + "description": "Interface range(s) should be of same type, Ethernet, Loopback, Management etc.\nMultiple interface ranges can be specified separated by \",\".\n", "title": "Interfaces" } }, @@ -27165,13 +30263,19 @@ "type": "string", "title": "Local Interfaces" }, + "address_only": { + "type": "boolean", + "description": "PREVIEW: This key is in preview.\nWhen address-only is configured, the source IP of the packet is set to the interface\nIP but the packet may exit the device via a different interface.\nWhen set to `false`, the probe uses the interface to exit the device.\nNot supported yet in EOS.", + "default": true, + "title": "Address Only" + }, "hosts": { "type": "array", "items": { "type": "object", "properties": { "name": { - "description": "Host Name", + "description": "Host Name.", "type": "string", "title": "Name" }, @@ -27187,6 +30291,12 @@ "type": "string", "title": "Local Interfaces" }, + "address_only": { + "type": "boolean", + "description": "PREVIEW: This key is in preview.\nWhen address-only is configured, the source IP of the packet is set to the interface\nIP but the packet may exit the device via a different interface.\nWhen set to `false`, the probe uses the interface to exit the device.\nNot supported yet in EOS.", + "default": true, + "title": "Address Only" + }, "url": { "type": "string", "title": "URL" @@ -27205,7 +30315,7 @@ "type": "object", "properties": { "name": { - "description": "VRF Name", + "description": "VRF Name.", "type": "string", "title": "Name" }, @@ -27238,13 +30348,19 @@ "type": "string", "title": "Local Interfaces" }, + "address_only": { + "type": "boolean", + "description": "PREVIEW: This key is in preview.\nWhen address-only is configured, the source IP of the packet is set to the interface\nIP but the packet may exit the device via a different interface.\nWhen set to `false`, the probe uses the interface to exit the device.\nNot supported yet in EOS.", + "default": true, + "title": "Address Only" + }, "hosts": { "type": "array", "items": { "type": "object", "properties": { "name": { - "description": "Host name", + "description": "Host name.", "type": "string", "title": "Name" }, @@ -27260,6 +30376,12 @@ "type": "string", "title": "Local Interfaces" }, + "address_only": { + "type": "boolean", + "description": "PREVIEW: This key is in preview.\nWhen address-only is configured, the source IP of the packet is set to the interface\nIP but the packet may exit the device via a different interface.\nWhen set to `false`, the probe uses the interface to exit the device.\nNot supported yet in EOS.", + "default": true, + "title": "Address Only" + }, "url": { "type": "string", "title": "URL" @@ -27296,7 +30418,7 @@ "properties": { "enabled": { "type": "boolean", - "description": "Enable monitor layer1", + "description": "Enable monitor layer1.", "title": "Enabled" }, "logging_mac_fault": { @@ -27317,6 +30439,11 @@ "type": "boolean", "description": "Enable transceiver SMBus fail and reset logging.", "title": "Communication" + }, + "enabled": { + "type": "boolean", + "description": "Some platforms support only the `logging transceiver` command. `enabled` key configures this command.", + "title": "Enabled" } }, "additionalProperties": false, @@ -27342,7 +30469,7 @@ "properties": { "name": { "type": "string", - "description": "Session Name", + "description": "Session Name.", "title": "Name" }, "sources": { @@ -27352,7 +30479,7 @@ "properties": { "name": { "type": "string", - "description": "Interface name, range or comma separated list", + "description": "Interface name, range or comma separated list.", "title": "Name" }, "direction": { @@ -27377,7 +30504,7 @@ "title": "Type" }, "name": { - "description": "ACL Name", + "description": "ACL Name.", "type": "string", "title": "Name" }, @@ -27404,7 +30531,7 @@ "type": "array", "items": { "type": "string", - "description": "'cpu' or interface name, range or comma separated list" + "description": "'cpu' or interface name, range or comma separated list." }, "title": "Destinations" }, @@ -27414,7 +30541,7 @@ }, "header_remove_size": { "type": "integer", - "description": "Number of bytes to remove from header", + "description": "Number of bytes to remove from header.", "title": "Header Remove Size" }, "access_group": { @@ -27430,7 +30557,7 @@ "title": "Type" }, "name": { - "description": "ACL Name", + "description": "ACL Name.", "type": "string", "title": "Name" } @@ -27464,7 +30591,7 @@ }, "size": { "type": "integer", - "description": "Size in bytes", + "description": "Size in bytes.", "title": "Size" } }, @@ -27485,6 +30612,388 @@ }, "title": "Monitor Sessions" }, + "monitor_telemetry_influx": { + "type": "object", + "properties": { + "vrf": { + "type": "string", + "title": "VRF" + }, + "destinations": { + "type": "array", + "description": "Configure telemetry output destinations.", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "InfluxDB connection name.", + "title": "Name" + }, + "database": { + "type": "string", + "description": "Set name of the database.", + "title": "Database" + }, + "data_retention_policy": { + "type": "string", + "title": "Data Retention Policy" + }, + "url": { + "type": "string", + "description": "It only accepts http(s), udp and unix domain destination URL.", + "pattern": "(http(s)?|udp|unix)://.+", + "title": "URL" + }, + "username": { + "type": "string", + "title": "Username" + }, + "password": { + "type": "string", + "title": "Password" + }, + "password_type": { + "type": "string", + "enum": [ + "0", + "7", + "8a" + ], + "default": "7", + "title": "Password Type" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "title": "Destinations" + }, + "source_group_standard_disabled": { + "type": "boolean", + "description": "Disable standard set of telemetry.", + "title": "Source Group Standard Disabled" + }, + "source_sockets": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Label of the socket connection.", + "title": "Name" + }, + "connection_limit": { + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "title": "Connection Limit" + }, + "url": { + "type": "string", + "description": "It only accepts http(s), udp and unix domain socket URL.", + "pattern": "(http(s)?|udp|unix)://.+", + "title": "URL" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "title": "Source Sockets" + }, + "tags": { + "type": "array", + "description": "Extra tags added to the telemetry output.", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Key of the global tag pair.", + "title": "Name" + }, + "value": { + "type": "string", + "description": "Value of the global tag pair.", + "title": "Value" + } + }, + "required": [ + "value", + "name" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Tags" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Monitor Telemetry Influx" + }, + "monitor_telemetry_postcard_policy": { + "type": "object", + "properties": { + "disabled": { + "type": "boolean", + "default": true, + "description": "Enable or disable the postcard telemetry feature.", + "title": "Disabled" + }, + "ingress": { + "type": "object", + "properties": { + "collection": { + "type": "object", + "description": "Collector configuration.", + "properties": { + "source": { + "type": "string", + "description": "Source IP address of GRE tunnel.", + "title": "Source" + }, + "destination": { + "type": "string", + "description": "Destination IP address of GRE tunnel.", + "title": "Destination" + }, + "version": { + "type": "integer", + "description": "Postcard version.", + "enum": [ + 1, + 2 + ], + "title": "Version" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Collection" + }, + "sample": { + "type": "object", + "description": "Sampling parameters.", + "properties": { + "rate": { + "type": "integer", + "description": "Sampling rate. `rate` is preferred when both `rate` and `tcp_udp_checksum` are defined.", + "enum": [ + 16384, + 32768, + 65536 + ], + "title": "Rate" + }, + "tcp_udp_checksum": { + "type": "object", + "description": "TCP/UDP parameters.", + "properties": { + "value": { + "type": "integer", + "description": "TCP/UDP checksum or IP ID value.", + "minimum": 0, + "maximum": 65535, + "title": "Value" + }, + "mask": { + "type": "string", + "description": "16 bit hexadecimal mask for TCP/UDP or IP ID with atmost 2 unset bits.", + "title": "Mask" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "TCP UDP Checksum" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Sample" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Ingress" + }, + "marker_vxlan": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Enable vxlan marking using default bit 0.", + "title": "Enabled" + }, + "header_word_zero_bit": { + "type": "integer", + "minimum": 1, + "maximum": 31, + "title": "Header Word Zero Bit" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Marker VxLAN" + }, + "profiles": { + "type": "array", + "description": "Postcard telemetry profiles.", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Profile name.", + "title": "Name" + }, + "ingress_sample_policy": { + "type": "string", + "title": "Ingress Sample Policy" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "title": "Profiles" + }, + "sample_policies": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "match_rules": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "type": { + "type": "string", + "description": "IP address version.", + "enum": [ + "ipv4", + "ipv6" + ], + "title": "Type" + }, + "destination_prefix": { + "type": "string", + "description": "IPv4 Network/Mask or IPv6 Network/Mask. Host part of prefix must be zero.\neg. 10.3.3.0/24", + "title": "Destination Prefix" + }, + "source_prefix": { + "type": "string", + "description": "IPv4 Network/Mask or IPv6 Network/Mask. Host part of prefix must be zero.\neg. 10.3.3.0/24", + "title": "Source Prefix" + }, + "protocols": { + "type": "array", + "items": { + "type": "object", + "properties": { + "protocol": { + "type": "string", + "enum": [ + "tcp", + "udp" + ], + "title": "Protocol" + }, + "source_ports": { + "type": "array", + "description": "A list of port numbers or port range or port name. Combination of port numbers or range and port name is not supported on EOS. The port numbers should be in range of 0-65535.\ne.g.\n [ \"12\", \"14-20\" ]\n [ \"www\" ]", + "items": { + "type": "string" + }, + "title": "Source Ports" + }, + "destination_ports": { + "type": "array", + "description": "A list of port numbers or port range or port name. Combination of port numbers or range and port name is not supported on EOS. The port numbers should be in range of 0-65535.\ne.g.\n [ \"12\", \"14-20\", \"80\" ]\n [ \"https\" ]", + "items": { + "type": "string" + }, + "title": "Destination Ports" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "protocol" + ] + }, + "title": "Protocols" + } + }, + "required": [ + "type", + "name" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Match Rules" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "title": "Sample Policies" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Monitor Telemetry Postcard Policy" + }, "mpls": { "type": "object", "properties": { @@ -27508,7 +31017,7 @@ "title": "Shutdown" }, "transport_address_interface": { - "description": "Interface Name", + "description": "Interface Name.", "type": "string", "title": "Transport Address Interface" } @@ -27533,7 +31042,7 @@ "type": "object", "properties": { "vrf": { - "description": "VRF Name", + "description": "VRF Name.", "type": "string", "title": "VRF" } @@ -27566,12 +31075,12 @@ "properties": { "name": { "type": "string", - "description": "Source interface", + "description": "Source interface.", "title": "Name" }, "vrf": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "VRF" } }, @@ -27588,7 +31097,7 @@ "properties": { "name": { "type": "string", - "description": "IP or hostname e.g., 2.2.2.55, ie.pool.ntp.org", + "description": "IP or hostname e.g., 2.2.2.55, 2001:db8::55, ie.pool.ntp.org.", "title": "Name" }, "burst": { @@ -27607,21 +31116,21 @@ }, "local_interface": { "type": "string", - "description": "Source interface", + "description": "Source interface.", "title": "Local Interface" }, "maxpoll": { "type": "integer", "minimum": 3, "maximum": 17, - "description": "Value of maxpoll between 3 - 17 (Logarithmic)", + "description": "Value of maxpoll between 3 - 17 (Logarithmic).", "title": "Maxpoll" }, "minpoll": { "type": "integer", "minimum": 3, "maximum": 17, - "description": "Value of minpoll between 3 - 17 (Logarithmic)", + "description": "Value of minpoll between 3 - 17 (Logarithmic).", "title": "Minpoll" }, "preferred": { @@ -27636,7 +31145,7 @@ }, "vrf": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "VRF" } }, @@ -27664,7 +31173,7 @@ "type": "integer", "minimum": 1, "maximum": 65534, - "description": "Key identifier", + "description": "Key identifier.", "title": "ID" }, "hash_algorithm": { @@ -27677,7 +31186,7 @@ }, "key": { "type": "string", - "description": "Obfuscated key", + "description": "Obfuscated key.", "title": "Key" }, "key_type": { @@ -27702,7 +31211,7 @@ }, "trusted_keys": { "type": "string", - "description": "List of trusted-keys as string ex. 10-12,15", + "description": "List of trusted-keys as string ex. 10-12,15.", "title": "Trusted Keys" } }, @@ -27715,6 +31224,78 @@ "patch_panel": { "type": "object", "properties": { + "connector": { + "type": "object", + "properties": { + "interface": { + "type": "object", + "properties": { + "patch": { + "type": "object", + "properties": { + "bgp_vpws_remote_failure_errdisable": { + "type": "boolean", + "title": "BGP Vpws Remote Failure Errdisable" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Patch" + }, + "recovery": { + "type": "object", + "properties": { + "review_delay": { + "type": "object", + "properties": { + "min": { + "type": "integer", + "minimum": 10, + "maximum": 600, + "description": "Minimum delay.", + "title": "Min" + }, + "max": { + "type": "integer", + "minimum": 15, + "maximum": 900, + "description": "Maximum delay.", + "title": "Max" + } + }, + "required": [ + "min", + "max" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Review Delay" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Recovery" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Interface" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Connector" + }, "patches": { "type": "array", "items": { @@ -27732,7 +31313,7 @@ "type": "array", "minItems": 2, "maxItems": 2, - "description": "Must have exactly two connectors to a patch of which at least one must be of type \"interface\"", + "description": "Must have exactly two connectors to a patch of which at least one must be of type \"interface\".", "items": { "type": "object", "properties": { @@ -27791,7 +31372,7 @@ "properties": { "name": { "type": "string", - "description": "Peer-filter Name", + "description": "Peer-filter Name.", "title": "Name" }, "sequence_numbers": { @@ -27801,12 +31382,12 @@ "properties": { "sequence": { "type": "integer", - "description": "Sequence ID", + "description": "Sequence ID.", "title": "Sequence" }, "match": { "type": "string", - "description": "Match as string\nExample: \"as-range 1-100 result accept\"\n", + "description": "Match as string.\nExample: \"as-range 1-100 result accept\"\n", "title": "Match" } }, @@ -27905,7 +31486,7 @@ }, "threshold": { "type": "string", - "description": "Drop Treshold. This value may also be fractions.\nExample: 7/8 or 3/4 or 1/2\n", + "description": "Drop Threshold. This value may also be fractions.\nExample: 7/8 or 3/4 or 1/2\n", "title": "Threshold" } }, @@ -27973,7 +31554,7 @@ }, "threshold": { "type": "string", - "description": "Drop Treshold. This value may also be fractions.\nExample: 7/8 or 3/4 or 1/2\n", + "description": "Drop Threshold. This value may also be fractions.\nExample: 7/8 or 3/4 or 1/2\n", "title": "Threshold" } }, @@ -28025,7 +31606,7 @@ }, "sand": { "type": "object", - "description": "Most of the platform sand options are hardware dependent and optional", + "description": "Most of the platform sand options are hardware dependent and optional.", "properties": { "qos_maps": { "type": "array", @@ -28162,7 +31743,7 @@ }, "interface_shutdown": { "type": "object", - "description": "Set the global PoE power behavior for PoE ports when ports are admin down", + "description": "Set the global PoE power behavior for PoE ports when ports are admin down.", "properties": { "action": { "type": "string", @@ -28192,13 +31773,13 @@ "properties": { "pbr": { "type": "array", - "description": "PBR Policy-Maps", + "description": "PBR Policy-Maps.", "items": { "type": "object", "properties": { "name": { "type": "string", - "description": "Policy-Map Name", + "description": "Policy-Map Name.", "title": "Name" }, "classes": { @@ -28208,7 +31789,7 @@ "properties": { "name": { "type": "string", - "description": "Class Name", + "description": "Class Name.", "title": "Name" }, "index": { @@ -28216,12 +31797,12 @@ "title": "Index" }, "drop": { - "description": "'drop' and 'set' are mutually exclusive", + "description": "'drop' and 'set' are mutually exclusive.", "type": "boolean", "title": "Drop" }, "set": { - "description": "Set Nexthop\n'drop' and 'set' are mutually exclusive\n", + "description": "Set Nexthop\n'drop' and 'set' are mutually exclusive.\n", "type": "object", "properties": { "nexthop": { @@ -28229,7 +31810,7 @@ "properties": { "ip_address": { "type": "string", - "description": "IPv4 or IPv6 Address", + "description": "IPv4 or IPv6 Address.", "title": "IP Address" }, "recursive": { @@ -28270,174 +31851,228 @@ "name" ] }, - "title": "PBR" + "title": "PBR" + }, + "qos": { + "type": "array", + "description": "QOS Policy-Maps.", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Policy-Map Name.", + "title": "Name" + }, + "classes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Class Name.", + "title": "Name" + }, + "set": { + "type": "object", + "properties": { + "cos": { + "type": "integer", + "title": "COS" + }, + "dscp": { + "type": "string", + "title": "DSCP" + }, + "traffic_class": { + "type": "integer", + "title": "Traffic Class" + }, + "drop_precedence": { + "type": "integer", + "title": "Drop Precedence" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Set" + }, + "police": { + "type": "object", + "properties": { + "rate": { + "type": "integer", + "description": "Specify rate.\nRange in kbps <8-200000000>.", + "title": "Rate" + }, + "rate_unit": { + "type": "string", + "enum": [ + "bps", + "kbps", + "mbps", + "pps" + ], + "default": "bps", + "title": "Rate Unit" + }, + "rate_burst_size": { + "type": "integer", + "description": "Range in bytes <256-128000000>.", + "title": "Rate Burst Size" + }, + "rate_burst_size_unit": { + "type": "string", + "enum": [ + "bytes", + "kbytes", + "mbytes", + "packets" + ], + "default": "bytes", + "title": "Rate Burst Size Unit" + }, + "action": { + "type": "object", + "properties": { + "type": { + "description": "Set action for policed traffic.", + "type": "string", + "enum": [ + "dscp", + "drop-precedence" + ], + "title": "Type" + }, + "dscp_value": { + "description": "Set when action.type is set to \"dscp\".", + "type": "string", + "title": "DSCP Value" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Action" + }, + "higher_rate": { + "type": "integer", + "description": "Specify higher rate.\nRange in kbps .", + "title": "Higher Rate" + }, + "higher_rate_unit": { + "type": "string", + "enum": [ + "bps", + "kbps", + "mbps", + "pps" + ], + "default": "bps", + "title": "Higher Rate Unit" + }, + "higher_rate_burst_size": { + "type": "integer", + "description": "Range in bytes <256-128000000>.", + "title": "Higher Rate Burst Size" + }, + "higher_rate_burst_size_unit": { + "type": "string", + "enum": [ + "bytes", + "kbytes", + "mbytes", + "packets" + ], + "default": "bytes", + "title": "Higher Rate Burst Size Unit" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Police" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "title": "Classes" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "title": "QOS" }, - "qos": { - "type": "array", - "description": "QOS Policy-Maps", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "Policy-Map Name", - "title": "Name" - }, - "classes": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "Class Name", - "title": "Name" - }, - "set": { - "type": "object", - "properties": { - "cos": { - "type": "integer", - "title": "COS" - }, - "dscp": { - "type": "string", - "title": "DSCP" - }, - "traffic_class": { - "type": "integer", - "title": "Traffic Class" - }, - "drop_precedence": { - "type": "integer", - "title": "Drop Precedence" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Set" - }, - "police": { - "type": "object", - "properties": { - "rate": { - "type": "integer", - "description": "Specify rate.\nRange in kbps <8-200000000>.", - "title": "Rate" - }, - "rate_unit": { - "type": "string", - "enum": [ - "bps", - "kbps", - "mbps", - "pps" - ], - "default": "bps", - "title": "Rate Unit" - }, - "rate_burst_size": { - "type": "integer", - "description": "Range in bytes <256-128000000>.", - "title": "Rate Burst Size" - }, - "rate_burst_size_unit": { - "type": "string", - "enum": [ - "bytes", - "kbytes", - "mbytes", - "packets" - ], - "default": "bytes", - "title": "Rate Burst Size Unit" - }, - "action": { - "type": "object", - "properties": { - "type": { - "description": "Set action for policed traffic.", - "type": "string", - "enum": [ - "dscp", - "drop-precedence" - ], - "title": "Type" - }, - "dscp_value": { - "description": "Set when action.type is set to \"dscp\".", - "type": "string", - "title": "DSCP Value" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Action" - }, - "higher_rate": { - "type": "integer", - "description": "Specify higher rate.\nRange in kbps .", - "title": "Higher Rate" - }, - "higher_rate_unit": { - "type": "string", - "enum": [ - "bps", - "kbps", - "mbps", - "pps" - ], - "default": "bps", - "title": "Higher Rate Unit" - }, - "higher_rate_burst_size": { - "type": "integer", - "description": "Range in bytes <256-128000000>.", - "title": "Higher Rate Burst Size" - }, - "higher_rate_burst_size_unit": { - "type": "string", - "enum": [ - "bytes", - "kbytes", - "mbytes", - "packets" - ], - "default": "bytes", - "title": "Higher Rate Burst Size Unit" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "title": "Police" - } + "copp_system_policy": { + "type": "object", + "description": "Control-plane policy configuration.", + "properties": { + "classes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "Name" }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} + "shape": { + "type": "integer", + "description": "Maximum rate limit.", + "minimum": 0, + "maximum": 10000000, + "title": "Shape" }, - "required": [ - "name" - ] + "bandwidth": { + "type": "integer", + "description": "Minimum bandwidth.", + "minimum": 0, + "maximum": 10000000, + "title": "Bandwidth" + }, + "rate_unit": { + "type": "string", + "description": "The `rate_unit` must be defined for `shape` and `bandwidth`.", + "enum": [ + "pps", + "kbps" + ], + "title": "Rate Unit" + } }, - "title": "Classes" - } - }, - "additionalProperties": false, - "patternProperties": { - "^_.+$": {} - }, - "required": [ - "name" - ] + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "title": "Classes" + } }, - "title": "QOS" + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Copp System Policy" } }, "additionalProperties": false, @@ -28496,19 +32131,19 @@ "type": "integer", "minimum": 68, "maximum": 65535, - "description": "\"l2_mtu\" should only be defined for platforms supporting the \"l2 mtu\" CLI\n", + "description": "\"l2_mtu\" should only be defined for platforms supporting the \"l2 mtu\" CLI.\n", "title": "L2 MTU" }, "l2_mru": { "type": "integer", "minimum": 68, "maximum": 65535, - "description": "\"l2_mru\" should only be defined for platforms supporting the \"l2 mru\" CLI\n", + "description": "\"l2_mru\" should only be defined for platforms supporting the \"l2 mru\" CLI.\n", "title": "L2 MRU" }, "vlans": { "type": "string", - "description": "List of switchport vlans as string\nFor a trunk port this would be a range like \"1-200,300\"\nFor an access port this would be a single vlan \"123\"\n", + "description": "List of switchport vlans as string.\nFor a trunk port this would be a range like \"1-200,300\".\nFor an access port this would be a single vlan \"123\".\n", "title": "VLANs" }, "snmp_trap_link_change": { @@ -28528,12 +32163,12 @@ }, "encapsulation_dot1q_vlan": { "type": "integer", - "description": "VLAN tag to configure on sub-interface", + "description": "VLAN tag to configure on sub-interface.", "title": "Encapsulation Dot1Q VLAN" }, "vrf": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "VRF" }, "encapsulation_vlan": { @@ -28547,17 +32182,17 @@ "properties": { "vlan": { "type": "integer", - "description": "Client VLAN ID", + "description": "Client VLAN ID.", "title": "VLAN" }, "outer": { "type": "integer", - "description": "Client Outer VLAN ID", + "description": "Client Outer VLAN ID.", "title": "Outer" }, "inner": { "type": "integer", - "description": "Client Inner VLAN ID", + "description": "Client Inner VLAN ID.", "title": "Inner" } }, @@ -28580,24 +32215,24 @@ }, "network": { "type": "object", - "description": "Network encapsulation are all optional, and skipped if using client unmatched", + "description": "Network encapsulation are all optional, and skipped if using client unmatched.", "properties": { "dot1q": { "type": "object", "properties": { "vlan": { "type": "integer", - "description": "Network VLAN ID", + "description": "Network VLAN ID.", "title": "VLAN" }, "outer": { "type": "integer", - "description": "Network Outer VLAN ID", + "description": "Network Outer VLAN ID.", "title": "Outer" }, "inner": { "type": "integer", - "description": "Network Inner VLAN ID", + "description": "Network Inner VLAN ID.", "title": "Inner" } }, @@ -28643,13 +32278,13 @@ }, "native_vlan": { "type": "integer", - "description": "If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence", + "description": "If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence.", "title": "Native VLAN" }, "native_vlan_tag": { "type": "boolean", "default": false, - "description": "If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence", + "description": "If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence.", "title": "Native VLAN Tag" }, "link_tracking_groups": { @@ -28659,7 +32294,7 @@ "properties": { "name": { "type": "string", - "description": "Group name", + "description": "Group name.", "title": "Name" }, "direction": { @@ -28710,12 +32345,12 @@ "properties": { "encapsulation_dot1q_vlan": { "type": "integer", - "description": "Vlan tag to configure on sub-interface", + "description": "Vlan tag to configure on sub-interface.", "title": "Encapsulation Dot1Q VLAN" }, "forwarding_profile": { "type": "string", - "description": "L2 protocol forwarding profile", + "description": "L2 protocol forwarding profile.", "title": "Forwarding Profile" } }, @@ -28733,7 +32368,7 @@ }, "mlag": { "type": "integer", - "description": "MLAG ID", + "description": "MLAG ID.", "minimum": 1, "maximum": 2000, "title": "MLAG" @@ -28747,7 +32382,7 @@ }, "lacp_fallback_timeout": { "type": "integer", - "description": "Timeout in seconds", + "description": "Timeout in seconds.", "default": 90, "minimum": 0, "maximum": 300, @@ -28775,12 +32410,12 @@ }, "dscp": { "type": "integer", - "description": "DSCP value", + "description": "DSCP value.", "title": "DSCP" }, "cos": { "type": "integer", - "description": "COS value", + "description": "COS value.", "title": "COS" } }, @@ -28799,12 +32434,12 @@ }, "interval": { "type": "integer", - "description": "Interval in milliseconds", + "description": "Interval in milliseconds.", "title": "Interval" }, "min_rx": { "type": "integer", - "description": "Rate in milliseconds", + "description": "Rate in milliseconds.", "title": "Min RX" }, "multiplier": { @@ -28851,7 +32486,7 @@ "properties": { "input": { "type": "string", - "description": "Policy Based Routing Policy-map name", + "description": "Policy Based Routing Policy-map name.", "title": "Input" } }, @@ -28866,7 +32501,7 @@ "properties": { "input": { "type": "string", - "description": "Quality of Service Policy-map name", + "description": "Quality of Service Policy-map name.", "title": "Input" } }, @@ -28924,7 +32559,7 @@ }, "pvlan_mapping": { "type": "string", - "description": "List of vlans as string", + "description": "List of vlans as string.", "title": "PVLAN Mapping" }, "vlan_translations": { @@ -28934,12 +32569,12 @@ "properties": { "from": { "type": "string", - "description": "List of vlans as string (only one vlan if direction is \"both\")", + "description": "List of vlans as string (only one vlan if direction is \"both\").", "title": "From" }, "to": { "type": "integer", - "description": "VLAN ID", + "description": "VLAN ID.", "title": "To" }, "direction": { @@ -28965,7 +32600,7 @@ "properties": { "rate": { "type": "string", - "description": "Rate in kbps, pps or percent\nSupported options are platform dependent\nExamples:\n- \"5000 kbps\"\n- \"1000 pps\"\n- \"20 percent\"\n", + "description": "Rate in kbps, pps or percent.\nSupported options are platform dependent.\nExamples:\n- \"5000 kbps\"\n- \"1000 pps\"\n- \"20 percent\"\n", "title": "Rate" } }, @@ -28983,7 +32618,7 @@ "properties": { "level": { "type": "string", - "description": "Configure maximum storm-control level", + "description": "Configure maximum storm-control level.", "title": "Level" }, "unit": { @@ -28993,7 +32628,7 @@ "percent", "pps" ], - "description": "Optional field and is hardware dependent", + "description": "Optional field and is hardware dependent.", "title": "Unit" } }, @@ -29008,7 +32643,7 @@ "properties": { "level": { "type": "string", - "description": "Configure maximum storm-control level", + "description": "Configure maximum storm-control level.", "title": "Level" }, "unit": { @@ -29018,7 +32653,7 @@ "percent", "pps" ], - "description": "Optional field and is hardware dependent", + "description": "Optional field and is hardware dependent.", "title": "Unit" } }, @@ -29033,7 +32668,7 @@ "properties": { "level": { "type": "string", - "description": "Configure maximum storm-control level", + "description": "Configure maximum storm-control level.", "title": "Level" }, "unit": { @@ -29043,7 +32678,7 @@ "percent", "pps" ], - "description": "Optional field and is hardware dependent", + "description": "Optional field and is hardware dependent.", "title": "Unit" } }, @@ -29058,7 +32693,7 @@ "properties": { "level": { "type": "string", - "description": "Configure maximum storm-control level", + "description": "Configure maximum storm-control level.", "title": "Level" }, "unit": { @@ -29068,7 +32703,7 @@ "percent", "pps" ], - "description": "Optional field and is hardware dependent", + "description": "Optional field and is hardware dependent.", "title": "Unit" } }, @@ -29091,9 +32726,14 @@ }, "isis_enable": { "type": "string", - "description": "ISIS instance", + "description": "ISIS instance.", "title": "ISIS Enable" }, + "isis_bfd": { + "type": "boolean", + "description": "Enable BFD for ISIS.", + "title": "ISIS BFD" + }, "isis_passive": { "type": "boolean", "title": "ISIS Passive" @@ -29129,7 +32769,7 @@ }, "isis_authentication_key": { "type": "string", - "description": "Type-7 encrypted password", + "description": "Type-7 encrypted password.", "title": "ISIS Authentication Key" }, "traffic_policy": { @@ -29137,12 +32777,12 @@ "properties": { "input": { "type": "string", - "description": "Ingress traffic policy", + "description": "Ingress traffic policy.", "title": "Input" }, "output": { "type": "string", - "description": "Egress traffic policy", + "description": "Egress traffic policy.", "title": "Output" } }, @@ -29157,7 +32797,7 @@ "properties": { "identifier": { "type": "string", - "description": "EVPN Ethernet Segment Identifier (Type 1 format)", + "description": "EVPN Ethernet Segment Identifier (Type 1 format).", "title": "Identifier" }, "redundancy": { @@ -29183,12 +32823,12 @@ "type": "integer", "minimum": 0, "maximum": 65535, - "description": "Preference_value is only used when \"algorithm\" is \"preference\"", + "description": "Preference_value is only used when \"algorithm\" is \"preference\".", "title": "Preference Value" }, "dont_preempt": { "type": "boolean", - "description": "Dont_preempt is only used when \"algorithm\" is \"preference\"", + "description": "Dont_preempt is only used when \"algorithm\" is \"preference\".", "default": false, "title": "Dont Preempt" }, @@ -29233,7 +32873,7 @@ }, "route_target": { "type": "string", - "description": "EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx", + "description": "EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx.", "title": "Route Target" } }, @@ -29245,19 +32885,19 @@ }, "esi": { "type": "string", - "description": "EVPN Ethernet Segment Identifier (Type 1 format)\nIf both \"esi\" and \"evpn_ethernet_segment.identifier\" are defined, the new variable takes precedence\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use evpn_ethernet_segment.identifier instead.", + "description": "EVPN Ethernet Segment Identifier (Type 1 format).\nIf both \"esi\" and \"evpn_ethernet_segment.identifier\" are defined, the new variable takes precedence.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use evpn_ethernet_segment.identifier instead.", "deprecated": true, "title": "Esi" }, "rt": { "type": "string", - "description": "EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx\nIf both \"rt\" and \"evpn_ethernet_segment.route_target\" are defined, the new variable takes precedence\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use evpn_ethernet_segment.route_target instead.", + "description": "EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx.\nIf both \"rt\" and \"evpn_ethernet_segment.route_target\" are defined, the new variable takes precedence.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use evpn_ethernet_segment.route_target instead.", "deprecated": true, "title": "Rt" }, "lacp_id": { "type": "string", - "description": "LACP ID with format xxxx.xxxx.xxxx", + "description": "LACP ID with format xxxx.xxxx.xxxx.", "title": "LACP ID" }, "spanning_tree_bpdufilter": { @@ -29366,7 +33006,7 @@ }, "vlan": { "type": "string", - "description": "VLAN can be 'all' or list of vlans as string", + "description": "VLAN can be 'all' or list of vlans as string.", "title": "VLAN" }, "transport": { @@ -29377,6 +33017,11 @@ "layer2" ], "title": "Transport" + }, + "mpass": { + "type": "boolean", + "description": "When MPASS is enabled on an MLAG port-channel, MLAG peers coordinate to function as a single PTP logical device.\nArista PTP enabled devices always place PTP messages on the same physical link within the port-channel.\nHence, MPASS is needed only on MLAG port-channels connected to non-Arista devices.", + "title": "Mpass" } }, "additionalProperties": false, @@ -29387,7 +33032,7 @@ }, "ip_address": { "type": "string", - "description": "IPv4 address/mask", + "description": "IPv4 address/mask.", "title": "IP Address" }, "ip_verify_unicast_source_reachable_via": { @@ -29446,7 +33091,7 @@ "properties": { "access_list": { "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Access List" }, "comment": { @@ -29466,16 +33111,17 @@ "type": "integer", "minimum": 1, "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Group" }, "original_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address. The combination of `original_ip` and `original_port` must be unique.", "title": "Original IP" }, "original_port": { "type": "integer", + "description": "TCP/UDP port. The combination of `original_ip` and `original_port` must be unique.", "minimum": 1, "maximum": 65535, "title": "Original Port" @@ -29496,20 +33142,19 @@ }, "translated_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.", "title": "Translated IP" }, "translated_port": { "type": "integer", "minimum": 1, "maximum": 65535, - "description": "requires 'original_port'", + "description": "requires 'original_port'.", "title": "Translated Port" } }, "required": [ - "translated_ip", - "original_ip" + "translated_ip" ], "additionalProperties": false, "patternProperties": { @@ -29553,7 +33198,7 @@ }, "pool_name": { "type": "string", - "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone\nignored if 'nat_type' is overload\n", + "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone.\nignored if 'nat_type' is overload.\n", "title": "Pool Name" }, "priority": { @@ -29581,7 +33226,7 @@ "properties": { "access_list": { "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Access List" }, "comment": { @@ -29601,16 +33246,17 @@ "type": "integer", "minimum": 1, "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Group" }, "original_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address. The combination of `original_ip` and `original_port` must be unique.", "title": "Original IP" }, "original_port": { "type": "integer", + "description": "TCP/UDP port. The combination of `original_ip` and `original_port` must be unique.", "minimum": 1, "maximum": 65535, "title": "Original Port" @@ -29631,20 +33277,19 @@ }, "translated_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.", "title": "Translated IP" }, "translated_port": { "type": "integer", "minimum": 1, "maximum": 65535, - "description": "requires 'original_port'", + "description": "requires 'original_port'.", "title": "Translated Port" } }, "required": [ - "translated_ip", - "original_ip" + "translated_ip" ], "additionalProperties": false, "patternProperties": { @@ -29673,12 +33318,12 @@ }, "ipv6_address": { "type": "string", - "description": "IPv6 address/mask", + "description": "IPv6 address/mask.", "title": "IPv6 Address" }, "ipv6_address_link_local": { "type": "string", - "description": "Link local IPv6 address/mask", + "description": "Link local IPv6 address/mask.", "title": "IPv6 Address Link Local" }, "ipv6_nd_ra_disabled": { @@ -29700,12 +33345,12 @@ }, "valid_lifetime": { "type": "string", - "description": "Infinite or lifetime in seconds", + "description": "Infinite or lifetime in seconds.", "title": "Valid Lifetime" }, "preferred_lifetime": { "type": "string", - "description": "Infinite or lifetime in seconds", + "description": "Infinite or lifetime in seconds.", "title": "Preferred Lifetime" }, "no_autoconfig_flag": { @@ -29725,32 +33370,32 @@ }, "access_group_in": { "type": "string", - "description": "Access list name", + "description": "Access list name.", "title": "Access Group In" }, "access_group_out": { "type": "string", - "description": "Access list name", + "description": "Access list name.", "title": "Access Group Out" }, "ipv6_access_group_in": { "type": "string", - "description": "IPv6 access list name", + "description": "IPv6 access list name.", "title": "IPv6 Access Group In" }, "ipv6_access_group_out": { "type": "string", - "description": "IPv6 access list name", + "description": "IPv6 access list name.", "title": "IPv6 Access Group Out" }, "mac_access_group_in": { "type": "string", - "description": "MAC access list name", + "description": "MAC access list name.", "title": "MAC Access Group In" }, "mac_access_group_out": { "type": "string", - "description": "MAC access list name", + "description": "MAC access list name.", "title": "MAC Access Group Out" }, "pim": { @@ -29821,7 +33466,7 @@ }, "service_profile": { "type": "string", - "description": "QOS profile", + "description": "QOS profile.", "title": "Service Profile" }, "ospf_network_point_to_point": { @@ -29847,7 +33492,7 @@ }, "ospf_authentication_key": { "type": "string", - "description": "Encrypted password", + "description": "Encrypted password.", "title": "OSPF Authentication Key" }, "ospf_message_digest_keys": { @@ -29872,7 +33517,7 @@ }, "key": { "type": "string", - "description": "Encrypted password", + "description": "Encrypted password.", "title": "Key" } }, @@ -29911,7 +33556,7 @@ "properties": { "session_tracker": { "type": "string", - "description": "Name of session tracker", + "description": "Name of session tracker.", "title": "Session Tracker" } }, @@ -30035,17 +33680,17 @@ }, "peer": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Peer" }, "peer_interface": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Peer Interface" }, "peer_type": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Peer Type" }, "sflow": { @@ -30082,12 +33727,12 @@ }, "validate_state": { "type": "boolean", - "description": "Set to false to disable interface validation by the `eos_validate_state` role", + "description": "Set to false to disable interface validation by the `eos_validate_state` role.", "title": "Validate State" }, "eos_cli": { "type": "string", - "description": "Multiline EOS CLI rendered directly on the port-channel interface in the final EOS configuration", + "description": "Multiline EOS CLI rendered directly on the port-channel interface in the final EOS configuration.", "title": "EOS CLI" } }, @@ -30108,7 +33753,7 @@ "properties": { "name": { "type": "string", - "description": "Prefix-list Name", + "description": "Prefix-list Name.", "title": "Name" }, "sequence_numbers": { @@ -30118,12 +33763,12 @@ "properties": { "sequence": { "type": "integer", - "description": "Sequence ID", + "description": "Sequence ID.", "title": "Sequence" }, "action": { "type": "string", - "description": "Action as string\nExample: \"permit 10.255.0.0/27 eq 32\"\n", + "description": "Action as string.\nExample: \"permit 10.255.0.0/27 eq 32\"\n", "title": "Action" } }, @@ -30236,14 +33881,14 @@ }, "clock_identity": { "type": "string", - "description": "The clock-id in xx:xx:xx:xx:xx:xx format", + "description": "The clock-id in xx:xx:xx:xx:xx:xx format.", "title": "Clock Identity" }, "source": { "type": "object", "properties": { "ip": { - "description": "Source IP", + "description": "Source IP.", "type": "string", "title": "IP" } @@ -30509,11 +34154,11 @@ }, "random_detect": { "type": "object", - "description": "Global random-detect settings", + "description": "Global random-detect settings.", "properties": { "ecn": { "type": "object", - "description": "Global ECN Configuration", + "description": "Global ECN Configuration.", "properties": { "allow_non_ect": { "type": "object", @@ -30525,7 +34170,7 @@ }, "chip_based": { "type": "boolean", - "description": "Allow non-ect chip-based", + "description": "Allow non-ect chip-based.", "title": "Chip Based" } }, @@ -30563,7 +34208,7 @@ "properties": { "name": { "type": "string", - "description": "Profile-Name", + "description": "Profile-Name.", "title": "Name" }, "trust": { @@ -30588,7 +34233,7 @@ "properties": { "rate": { "type": "string", - "description": "Supported options are platform dependent\nExample: \"< rate > kbps\", \"1-100 percent\", \"< rate > pps\"\n", + "description": "Supported options are platform dependent.\nExample: \"< rate > kbps\", \"1-100 percent\", \"< rate > pps\"\n", "title": "Rate" } }, @@ -30606,7 +34251,7 @@ "properties": { "qos_input": { "type": "string", - "description": "Policy-map name", + "description": "Policy-map name.", "title": "QOS Input" } }, @@ -30630,7 +34275,7 @@ "properties": { "id": { "type": "integer", - "description": "TX-Queue ID", + "description": "TX-Queue ID.", "title": "ID" }, "bandwidth_percent": { @@ -30654,7 +34299,7 @@ "properties": { "rate": { "type": "string", - "description": "Supported options are platform dependent\nExample: \"< rate > kbps\", \"1-100 percent\", \"< rate > pps\"\n", + "description": "Supported options are platform dependent.\nExample: \"< rate > kbps\", \"1-100 percent\", \"< rate > pps\"\n", "title": "Rate" } }, @@ -30666,19 +34311,19 @@ }, "comment": { "type": "string", - "description": "Text comment added to queue", + "description": "Text comment added to queue.", "title": "Comment" }, "random_detect": { "type": "object", "properties": { "ecn": { - "description": "Explicit Congestion Notification", + "description": "Explicit Congestion Notification.", "type": "object", "properties": { "count": { "type": "boolean", - "description": "Enable counter for random-detect ECNs", + "description": "Enable counter for random-detect ECNs.", "title": "Count" }, "threshold": { @@ -30699,27 +34344,27 @@ "min": { "type": "integer", "minimum": 1, - "description": "Random-detect ECN minimum-threshold", + "description": "Random-detect ECN minimum-threshold.", "title": "Min" }, "max": { "type": "integer", "minimum": 1, - "description": "Random-detect ECN maximum-threshold", + "description": "Random-detect ECN maximum-threshold.", "title": "Max" }, "max_probability": { "type": "integer", "minimum": 1, "maximum": 100, - "description": "Random-detect ECN maximum mark probability", + "description": "Random-detect ECN maximum mark probability.", "title": "Max Probability" }, "weight": { "type": "integer", "minimum": 0, "maximum": 15, - "description": "Random-detect ECN weight", + "description": "Random-detect ECN weight.", "title": "Weight" } }, @@ -30742,7 +34387,7 @@ "title": "Ecn" }, "drop": { - "description": "Set WRED parameters", + "description": "Set WRED parameters.", "type": "object", "properties": { "threshold": { @@ -30765,19 +34410,19 @@ "type": "integer", "minimum": 0, "maximum": 2, - "description": "Specify Drop Precendence value", + "description": "Specify Drop Precedence value.", "title": "Drop Precedence" }, "min": { "type": "integer", "minimum": 1, - "description": "WRED minimum-threshold", + "description": "WRED minimum-threshold.", "title": "Min" }, "max": { "type": "integer", "minimum": 1, - "description": "WRED maximum-threshold", + "description": "WRED maximum-threshold.", "title": "Max" }, "drop_probability": { @@ -30791,7 +34436,7 @@ "type": "integer", "minimum": 0, "maximum": 15, - "description": "WRED weight", + "description": "WRED weight.", "title": "Weight" } }, @@ -30839,7 +34484,7 @@ "properties": { "id": { "type": "integer", - "description": "UC TX queue ID", + "description": "UC TX queue ID.", "title": "ID" }, "bandwidth_percent": { @@ -30863,7 +34508,7 @@ "properties": { "rate": { "type": "string", - "description": "Supported options are platform dependent\nExample: \"< rate > kbps\", \"1-100 percent\", \"< rate > pps\"\n", + "description": "Supported options are platform dependent.\nExample: \"< rate > kbps\", \"1-100 percent\", \"< rate > pps\"\n", "title": "Rate" } }, @@ -30875,19 +34520,19 @@ }, "comment": { "type": "string", - "description": "Text comment added to queue", + "description": "Text comment added to queue.", "title": "Comment" }, "random_detect": { "type": "object", "properties": { "ecn": { - "description": "Explicit Congestion Notification", + "description": "Explicit Congestion Notification.", "type": "object", "properties": { "count": { "type": "boolean", - "description": "Enable counter for random-detect ECNs", + "description": "Enable counter for random-detect ECNs.", "title": "Count" }, "threshold": { @@ -30902,33 +34547,33 @@ "mbytes", "milliseconds" ], - "description": "Unit to be used for the threshold values", + "description": "Unit to be used for the threshold values.", "title": "Units" }, "min": { "type": "integer", "minimum": 1, - "description": "Random-detect ECN minimum-threshold", + "description": "Random-detect ECN minimum-threshold.", "title": "Min" }, "max": { "type": "integer", "minimum": 1, - "description": "Random-detect ECN maximum-threshold", + "description": "Random-detect ECN maximum-threshold.", "title": "Max" }, "max_probability": { "type": "integer", "minimum": 1, "maximum": 100, - "description": "Random-detect ECN maximum mark probability", + "description": "Random-detect ECN maximum mark probability.", "title": "Max Probability" }, "weight": { "type": "integer", "minimum": 0, "maximum": 15, - "description": "Random-detect ECN weight", + "description": "Random-detect ECN weight.", "title": "Weight" } }, @@ -30951,7 +34596,7 @@ "title": "Ecn" }, "drop": { - "description": "Set WRED parameters", + "description": "Set WRED parameters.", "type": "object", "properties": { "threshold": { @@ -30974,19 +34619,19 @@ "type": "integer", "minimum": 0, "maximum": 2, - "description": "Specify Drop Precendence value", + "description": "Specify Drop Precedence value.", "title": "Drop Precedence" }, "min": { "type": "integer", "minimum": 1, - "description": "WRED minimum-threshold", + "description": "WRED minimum-threshold.", "title": "Min" }, "max": { "type": "integer", "minimum": 1, - "description": "WRED maximum-threshold", + "description": "WRED maximum-threshold.", "title": "Max" }, "drop_probability": { @@ -31000,7 +34645,7 @@ "type": "integer", "minimum": 0, "maximum": 15, - "description": "WRED weight", + "description": "WRED weight.", "title": "Weight" } }, @@ -31048,7 +34693,7 @@ "properties": { "id": { "type": "integer", - "description": "MC TX queue ID", + "description": "MC TX queue ID.", "title": "ID" }, "bandwidth_percent": { @@ -31072,7 +34717,7 @@ "properties": { "rate": { "type": "string", - "description": "Supported options are platform dependent\nExample: \"< rate > kbps\", \"1-100 percent\", \"< rate > pps\"\n", + "description": "Supported options are platform dependent.\nExample: \"< rate > kbps\", \"1-100 percent\", \"< rate > pps\"\n", "title": "Rate" } }, @@ -31100,7 +34745,7 @@ }, "priority_flow_control": { "type": "object", - "description": "Priority Flow Control settings\n", + "description": "Priority Flow Control settings.\n", "properties": { "enabled": { "type": "boolean", @@ -31132,7 +34777,7 @@ "timeout": { "type": "string", "pattern": "^\\d+(\\.\\d{1,2})?$", - "description": "Timeout in seconds after which port should be errdisabled or\nshould start dropping on congested priorities.\nThis should be decimal with up to 2 decimal point\nExample: 0.01 or 60\n", + "description": "Timeout in seconds after which port should be errdisabled or\nshould start dropping on congested priorities.\nThis should be decimal with up to 2 decimal point.\nExample: 0.01 or 60\n", "title": "Timeout" }, "polling_interval": { @@ -31176,7 +34821,7 @@ }, "priorities": { "type": "array", - "description": "Set the drop/no_drop on each queue\n", + "description": "Set the drop/no_drop on each queue.\n", "items": { "type": "object", "properties": { @@ -31184,12 +34829,12 @@ "type": "integer", "minimum": 0, "maximum": 7, - "description": "Priority queue number (COS value)\n", + "description": "Priority queue number (COS value).\n", "title": "Priority" }, "no_drop": { "type": "boolean", - "description": "Enable Priority Flow Control frames on this queue\n", + "description": "Enable Priority Flow Control frames on this queue.\n", "title": "No Drop" } }, @@ -31254,12 +34899,12 @@ }, "log": { "type": "integer", - "description": "Logging interval in seconds", + "description": "Logging interval in seconds.", "title": "Log" }, "notifying": { "type": "boolean", - "description": "Should only be used for platforms supporting the \"queue-monitor length notifying\" CLI", + "description": "Should only be used for platforms supporting the \"queue-monitor length notifying\" CLI.", "title": "Notifying" }, "cpu": { @@ -31295,7 +34940,7 @@ }, "tx_latency": { "type": "boolean", - "description": "Enable tx-latency mode", + "description": "Enable tx-latency mode.", "title": "TX Latency" } }, @@ -31317,12 +34962,12 @@ }, "ip_access_group": { "type": "string", - "description": "Name of IP ACL", + "description": "Name of IP ACL.", "title": "IP Access Group" }, "ipv6_access_group": { "type": "string", - "description": "Name of IPv6 ACL", + "description": "Name of IPv6 ACL.", "title": "IPv6 Access Group" }, "max_connections": { @@ -31371,12 +35016,12 @@ "type": "integer", "minimum": 0, "maximum": 65535, - "description": "TCP Port", + "description": "TCP Port.", "title": "Port" }, "tls_ssl_profile": { "type": "string", - "description": "Name of TLS profile", + "description": "Name of TLS profile.", "title": "TLS SSL Profile" } }, @@ -31393,7 +35038,7 @@ "properties": { "host": { "type": "string", - "description": "Host IP address or name", + "description": "Host IP address or name.", "title": "Host" }, "vrf": { @@ -31414,7 +35059,7 @@ }, "key": { "type": "string", - "description": "Encrypted key", + "description": "Encrypted key.", "title": "Key" } }, @@ -31442,7 +35087,7 @@ "properties": { "host": { "type": "string", - "description": "Host IP address or name", + "description": "Host IP address or name.", "title": "Host" }, "vrf": { @@ -31451,7 +35096,7 @@ }, "key": { "type": "string", - "description": "Encrypted key", + "description": "Encrypted key.", "title": "Key" } }, @@ -31467,7 +35112,7 @@ "properties": { "protocol": { "type": "string", - "description": "Redundancy Protocol", + "description": "Redundancy Protocol.", "title": "Protocol" } }, @@ -31484,7 +35129,7 @@ "properties": { "name": { "type": "string", - "description": "Role name", + "description": "Role name.", "title": "Name" }, "sequence_numbers": { @@ -31494,7 +35139,7 @@ "properties": { "sequence": { "type": "integer", - "description": "Sequence number", + "description": "Sequence number.", "title": "Sequence" }, "action": { @@ -31507,12 +35152,12 @@ }, "mode": { "type": "string", - "description": "\"config\", \"config-all\", \"exec\" or mode key as string\n", + "description": "\"config\", \"config-all\", \"exec\" or mode key as string.\n", "title": "Mode" }, "command": { "type": "string", - "description": "Command as string", + "description": "Command as string.", "title": "Command" } }, @@ -31538,7 +35183,7 @@ "properties": { "name": { "type": "string", - "description": "Route-map Name", + "description": "Route-map Name.", "title": "Name" }, "sequence_numbers": { @@ -31548,7 +35193,7 @@ "properties": { "sequence": { "type": "integer", - "description": "Sequence ID", + "description": "Sequence ID.", "title": "Sequence" }, "type": { @@ -31565,25 +35210,25 @@ }, "match": { "type": "array", - "description": "List of \"match\" statements", + "description": "List of \"match\" statements.", "items": { "type": "string", - "description": "Match as string\nExample: \"ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY\"\n" + "description": "Match as string.\nExample: \"ip address prefix-list PL-LOOPBACKS-EVPN-OVERLAY\"\n" }, "title": "Match" }, "set": { "type": "array", - "description": "List of \"set\" statements", + "description": "List of \"set\" statements.", "items": { "type": "string", - "description": "Set as string\nExample: \"origin incomplete\"\n" + "description": "Set as string.\nExample: \"origin incomplete\"\n" }, "title": "Set" }, "sub_route_map": { "type": "string", - "description": "Name of Sub-Route-map", + "description": "Name of Sub-Route-map.", "title": "Sub Route Map" }, "continue": { @@ -31648,6 +35293,7 @@ "properties": { "name": { "type": "string", + "pattern": "^[A-Za-z0-9_.:{}\\[\\]-]+$", "title": "Name" }, "id": { @@ -31673,6 +35319,7 @@ "properties": { "name": { "type": "string", + "pattern": "^[A-Za-z0-9_.:{}\\[\\]-]+$", "title": "Name" }, "id": { @@ -31698,6 +35345,7 @@ "properties": { "name": { "type": "string", + "pattern": "^[A-Za-z0-9_.:{}\\[\\]-]+$", "title": "Name" }, "id": { @@ -31874,17 +35522,17 @@ "properties": { "interval": { "type": "integer", - "description": "Rate in milliseconds", + "description": "Rate in milliseconds.", "title": "Interval" }, "local_address": { "type": "string", - "description": "Configure BFD local IP/IPv6 address", + "description": "Configure BFD local IP/IPv6 address.", "title": "Local Address" }, "min_rx": { "type": "integer", - "description": "Rate in milliseconds", + "description": "Rate in milliseconds.", "title": "Min RX" }, "multiplier": { @@ -31898,12 +35546,12 @@ "properties": { "interval": { "type": "integer", - "description": "Rate in milliseconds", + "description": "Rate in milliseconds.", "title": "Interval" }, "min_rx": { "type": "integer", - "description": "Rate in milliseconds", + "description": "Rate in milliseconds.", "title": "Min RX" }, "multiplier": { @@ -31938,7 +35586,7 @@ "properties": { "name": { "type": "string", - "description": "Interface Name", + "description": "Interface Name.", "title": "Name" }, "protocols": { @@ -31968,7 +35616,7 @@ }, "initiator_interval": { "type": "integer", - "description": "Rate in milliseconds", + "description": "Rate in milliseconds.", "title": "Initiator Interval" }, "initiator_multiplier": { @@ -31979,7 +35627,7 @@ }, "initiator_measurement_round_trip": { "type": "boolean", - "description": "Enable round-trip delay measurement", + "description": "Enable round-trip delay measurement.", "title": "Initiator Measurement Round Trip" }, "reflector": { @@ -31987,12 +35635,12 @@ "properties": { "min_rx": { "type": "integer", - "description": "Rate in milliseconds", + "description": "Rate in milliseconds.", "title": "Min RX" }, "local_discriminator": { "type": "string", - "description": "IPv4 address or 32 bit integer", + "description": "IPv4 address or 32 bit integer.", "title": "Local Discriminator" } }, @@ -32035,7 +35683,7 @@ }, "router_id": { "type": "string", - "description": "In IP address format A.B.C.D", + "description": "In IP address format A.B.C.D.", "title": "Router ID" }, "distance": { @@ -32082,14 +35730,14 @@ "type": "integer", "minimum": 1, "maximum": 3600, - "description": "Number of seconds", + "description": "Number of seconds.", "title": "Restart Time" }, "stalepath_time": { "type": "integer", "minimum": 1, "maximum": 3600, - "description": "Number of seconds", + "description": "Number of seconds.", "title": "Stalepath Time" } }, @@ -32172,12 +35820,12 @@ }, "bgp_cluster_id": { "type": "string", - "description": "IP Address A.B.C.D", + "description": "IP Address A.B.C.D.", "title": "BGP Cluster ID" }, "bgp_defaults": { "type": "array", - "description": "BGP command as string", + "description": "BGP command as string.", "items": { "type": "string" }, @@ -32237,6 +35885,11 @@ "^_.+$": {} }, "title": "Bestpath" + }, + "redistribute_internal": { + "type": "boolean", + "description": "Allow redistribution of iBGP routes into an Interior Gateway Protocol (IGP). EOS default is true.", + "title": "Redistribute Internal" } }, "additionalProperties": false, @@ -32247,28 +35900,28 @@ }, "listen_ranges": { "type": "array", - "description": "Improved \"listen_ranges\" data model to support multiple listen ranges and additional filter capabilities\n", + "description": "Improved \"listen_ranges\" data model to support multiple listen ranges and additional filter capabilities.\n", "items": { "type": "object", "properties": { "prefix": { "type": "string", - "description": "IPv4 prefix \"A.B.C.D/E\" or IPv6 prefix \"A:B:C:D:E:F:G:H/I\"", + "description": "IPv4 prefix \"A.B.C.D/E\" or IPv6 prefix \"A:B:C:D:E:F:G:H/I\".", "title": "Prefix" }, "peer_id_include_router_id": { "type": "boolean", - "description": "Include router ID as part of peer filter", + "description": "Include router ID as part of peer filter.", "title": "Peer ID Include Router ID" }, "peer_group": { "type": "string", - "description": "Peer group name", + "description": "Peer group name.", "title": "Peer Group" }, "peer_filter": { "type": "string", - "description": "Peer-filter name\nnote: `peer_filter` or `remote_as` is required but mutually exclusive.\nIf both are defined, `peer_filter` takes precedence\n", + "description": "Peer-filter name.\nnote: `peer_filter` or `remote_as` is required but mutually exclusive.\nIf both are defined, `peer_filter` takes precedence\n", "title": "Peer Filter" }, "remote_as": { @@ -32291,12 +35944,12 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "type": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Type" }, "remote_as": { @@ -32319,16 +35972,16 @@ }, "as_path": { "type": "object", - "description": "BGP AS-PATH options", + "description": "BGP AS-PATH options.", "properties": { "remote_as_replace_out": { "type": "boolean", - "description": "Replace AS number with local AS number", + "description": "Replace AS number with local AS number.", "title": "Remote As Replace Out" }, "prepend_own_disabled": { "type": "boolean", - "description": "Disable prepending own AS number to AS path", + "description": "Disable prepending own AS number to AS path.", "title": "Prepend Own Disabled" } }, @@ -32340,7 +35993,7 @@ }, "remove_private_as": { "type": "object", - "description": "Remove private AS numbers in outbound AS path", + "description": "Remove private AS numbers in outbound AS path.", "properties": { "enabled": { "type": "boolean", @@ -32381,7 +36034,7 @@ }, "peer_filter": { "type": "string", - "description": "Peer-filter name\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", + "description": "Peer-filter name.\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", "deprecated": true, "title": "Peer Filter" }, @@ -32391,7 +36044,7 @@ }, "update_source": { "type": "string", - "description": "IP address or interface name", + "description": "IP address or interface name.", "title": "Update Source" }, "route_reflector_client": { @@ -32443,7 +36096,7 @@ "type": "integer", "minimum": 1, "maximum": 255, - "description": "Time-to-live in range of hops", + "description": "Time-to-live in range of hops.", "title": "Ebgp Multihop" }, "next_hop_self": { @@ -32471,7 +36124,7 @@ }, "route_map": { "type": "string", - "description": "Route-map name", + "description": "Route-map name.", "title": "Route Map" } }, @@ -32483,25 +36136,114 @@ }, "send_community": { "type": "string", - "description": "'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'", + "description": "'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'.", "title": "Send Community" }, "maximum_routes": { "type": "integer", - "description": "Maximum number of routes (0 means unlimited)", + "description": "Maximum number of routes (0 means unlimited).", "minimum": 0, "maximum": 4294967294, "title": "Maximum Routes" }, "maximum_routes_warning_limit": { "type": "string", - "description": "Maximum number of routes after which a warning is issued (0 means never warn) or\nPercentage of maximum number of routes at which to warn (\"<1-100> percent\")\n", + "description": "Maximum number of routes after which a warning is issued (0 means never warn) or\nPercentage of maximum number of routes at which to warn (\"<1-100> percent\").\n", "title": "Maximum Routes Warning Limit" }, "maximum_routes_warning_only": { "type": "boolean", "title": "Maximum Routes Warning Only" }, + "missing_policy": { + "type": "object", + "description": "Missing policy configuration for all address-families.", + "properties": { + "direction_in": { + "description": "Missing policy inbound direction.", + "type": "object", + "properties": { + "action": { + "description": "Missing policy action.", + "type": "string", + "enum": [ + "deny", + "permit", + "deny-in-out" + ], + "title": "Action" + }, + "include_community_list": { + "type": "boolean", + "description": "Include community-list references in missing policy decision.", + "title": "Include Community List" + }, + "include_prefix_list": { + "type": "boolean", + "description": "Include prefix-list references in missing policy decision.", + "title": "Include Prefix List" + }, + "include_sub_route_map": { + "type": "boolean", + "description": "Include sub-route-map references in missing policy decision.", + "title": "Include Sub Route Map" + } + }, + "required": [ + "action" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Direction In" + }, + "direction_out": { + "description": "Missing policy outbound direction.", + "type": "object", + "properties": { + "action": { + "description": "Missing policy action.", + "type": "string", + "enum": [ + "deny", + "permit", + "deny-in-out" + ], + "title": "Action" + }, + "include_community_list": { + "type": "boolean", + "description": "Include community-list references in missing policy decision.", + "title": "Include Community List" + }, + "include_prefix_list": { + "type": "boolean", + "description": "Include prefix-list references in missing policy decision.", + "title": "Include Prefix List" + }, + "include_sub_route_map": { + "type": "boolean", + "description": "Include sub-route-map references in missing policy decision.", + "title": "Include Sub Route Map" + } + }, + "required": [ + "action" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Direction Out" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Missing Policy" + }, "link_bandwidth": { "type": "object", "properties": { @@ -32511,7 +36253,7 @@ }, "default": { "type": "string", - "description": "nn.nn(K|M|G) link speed in bits/second", + "description": "nn.nn(K|M|G) link speed in bits/second.", "title": "Default" } }, @@ -32530,7 +36272,7 @@ }, "times": { "type": "integer", - "description": "Number of local ASNs allowed in a BGP update", + "description": "Number of local ASNs allowed in a BGP update.", "minimum": 1, "maximum": 10, "title": "Times" @@ -32550,7 +36292,7 @@ }, "timers": { "type": "string", - "description": "BGP Keepalive and Hold Timer values in seconds as string \"<0-3600> <0-3600>\"", + "description": "BGP Keepalive and Hold Timer values in seconds as string \"<0-3600> <0-3600>\".", "title": "Timers" }, "rib_in_pre_policy_retain": { @@ -32573,17 +36315,17 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" }, "bgp_listen_range_prefix": { "type": "string", - "description": "IP prefix range\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", + "description": "IP prefix range.\nnote: `bgp_listen_range_prefix` and `peer_filter` should not be mixed with\nthe new `listen_ranges` key above to avoid conflicts.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use listen_ranges instead.", "deprecated": true, "title": "BGP Listen Range Prefix" }, @@ -32591,6 +36333,35 @@ "type": "string", "title": "Session Tracker" }, + "shared_secret": { + "type": "object", + "properties": { + "profile": { + "type": "string", + "description": "Name of profile defined under `management_security`.", + "title": "Profile" + }, + "hash_algorithm": { + "type": "string", + "description": "Note: Algorithm hmac-sha-256 requires EOS version 4.31.1F and above.", + "enum": [ + "aes-128-cmac-96", + "hmac-sha-256", + "hmac-sha1-96" + ], + "title": "Hash Algorithm" + } + }, + "required": [ + "profile", + "hash_algorithm" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Shared Secret" + }, "ttl_maximum_hops": { "type": "integer", "minimum": 0, @@ -32634,16 +36405,16 @@ }, "as_path": { "type": "object", - "description": "BGP AS-PATH options", + "description": "BGP AS-PATH options.", "properties": { "remote_as_replace_out": { "type": "boolean", - "description": "Replace AS number with local AS number", + "description": "Replace AS number with local AS number.", "title": "Remote As Replace Out" }, "prepend_own_disabled": { "type": "boolean", - "description": "Disable prepending own AS number to AS path", + "description": "Disable prepending own AS number to AS path.", "title": "Prepend Own Disabled" } }, @@ -32655,7 +36426,7 @@ }, "peer": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Peer" }, "description": { @@ -32680,7 +36451,7 @@ }, "update_source": { "type": "string", - "description": "Source Interface", + "description": "Source Interface.", "title": "Update Source" }, "bfd": { @@ -32732,17 +36503,17 @@ }, "timers": { "type": "string", - "description": "BGP Keepalive and Hold Timer values in seconds as string \"<0-3600> <0-3600>\"", + "description": "BGP Keepalive and Hold Timer values in seconds as string \"<0-3600> <0-3600>\".", "title": "Timers" }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" }, "default_originate": { @@ -32769,25 +36540,114 @@ }, "send_community": { "type": "string", - "description": "'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'", + "description": "'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'.", "title": "Send Community" }, "maximum_routes": { "type": "integer", - "description": "Maximum number of routes (0 means unlimited)", + "description": "Maximum number of routes (0 means unlimited).", "minimum": 0, "maximum": 4294967294, "title": "Maximum Routes" }, "maximum_routes_warning_limit": { "type": "string", - "description": "Maximum number of routes after which a warning is issued (0 means never warn) or\nPercentage of maximum number of routes at which to warn (\"<1-100> percent\")\n", + "description": "Maximum number of routes after which a warning is issued (0 means never warn) or\nPercentage of maximum number of routes at which to warn (\"<1-100> percent\").\n", "title": "Maximum Routes Warning Limit" }, "maximum_routes_warning_only": { "type": "boolean", "title": "Maximum Routes Warning Only" }, + "missing_policy": { + "type": "object", + "description": "Missing policy configuration for all address-families.", + "properties": { + "direction_in": { + "description": "Missing policy inbound direction.", + "type": "object", + "properties": { + "action": { + "description": "Missing policy action.", + "type": "string", + "enum": [ + "deny", + "permit", + "deny-in-out" + ], + "title": "Action" + }, + "include_community_list": { + "type": "boolean", + "description": "Include community-list references in missing policy decision.", + "title": "Include Community List" + }, + "include_prefix_list": { + "type": "boolean", + "description": "Include prefix-list references in missing policy decision.", + "title": "Include Prefix List" + }, + "include_sub_route_map": { + "type": "boolean", + "description": "Include sub-route-map references in missing policy decision.", + "title": "Include Sub Route Map" + } + }, + "required": [ + "action" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Direction In" + }, + "direction_out": { + "description": "Missing policy outbound direction.", + "type": "object", + "properties": { + "action": { + "description": "Missing policy action.", + "type": "string", + "enum": [ + "deny", + "permit", + "deny-in-out" + ], + "title": "Action" + }, + "include_community_list": { + "type": "boolean", + "description": "Include community-list references in missing policy decision.", + "title": "Include Community List" + }, + "include_prefix_list": { + "type": "boolean", + "description": "Include prefix-list references in missing policy decision.", + "title": "Include Prefix List" + }, + "include_sub_route_map": { + "type": "boolean", + "description": "Include sub-route-map references in missing policy decision.", + "title": "Include Sub Route Map" + } + }, + "required": [ + "action" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Direction Out" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Missing Policy" + }, "allowas_in": { "type": "object", "properties": { @@ -32799,7 +36659,7 @@ "type": "integer", "minimum": 1, "maximum": 10, - "description": "Number of local ASNs allowed in a BGP update", + "description": "Number of local ASNs allowed in a BGP update.", "title": "Times" } }, @@ -32813,7 +36673,7 @@ "type": "integer", "minimum": 1, "maximum": 255, - "description": "Time-to-live in range of hops", + "description": "Time-to-live in range of hops.", "title": "Ebgp Multihop" }, "next_hop_self": { @@ -32829,7 +36689,7 @@ }, "default": { "type": "string", - "description": "nn.nn(K|M|G) link speed in bits/second", + "description": "nn.nn(K|M|G) link speed in bits/second.", "title": "Default" } }, @@ -32859,7 +36719,7 @@ }, "remove_private_as": { "type": "object", - "description": "Remove private AS numbers in outbound AS path", + "description": "Remove private AS numbers in outbound AS path.", "properties": { "enabled": { "type": "boolean", @@ -32902,6 +36762,35 @@ "type": "string", "title": "Session Tracker" }, + "shared_secret": { + "type": "object", + "properties": { + "profile": { + "type": "string", + "description": "Name of profile defined under `management_security`.", + "title": "Profile" + }, + "hash_algorithm": { + "type": "string", + "description": "Note: Algorithm hmac-sha-256 requires EOS version 4.31.1F and above.", + "enum": [ + "aes-128-cmac-96", + "hmac-sha-256", + "hmac-sha1-96" + ], + "title": "Hash Algorithm" + } + }, + "required": [ + "profile", + "hash_algorithm" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Shared Secret" + }, "ttl_maximum_hops": { "type": "integer", "minimum": 0, @@ -32927,7 +36816,7 @@ "properties": { "name": { "type": "string", - "description": "Interface name", + "description": "Interface name.", "title": "Name" }, "remote_as": { @@ -32937,7 +36826,7 @@ }, "peer": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Peer" }, "peer_group": { @@ -32951,7 +36840,7 @@ }, "peer_filter": { "type": "string", - "description": "Peer-filter name", + "description": "Peer-filter name.", "title": "Peer Filter" } }, @@ -32972,7 +36861,7 @@ "properties": { "prefix": { "type": "string", - "description": "IPv4 prefix \"A.B.C.D/E\" or IPv6 prefix \"A:B:C:D:E:F:G:H/I\"", + "description": "IPv4 prefix \"A.B.C.D/E\" or IPv6 prefix \"A:B:C:D:E:F:G:H/I\".", "title": "Prefix" }, "advertise_only": { @@ -32983,28 +36872,18 @@ "type": "boolean", "title": "As Set" }, - "advertise_map": { - "type": "string", - "description": "Route-map name", - "title": "Advertise Map" - }, - "supress_map": { - "type": "string", - "description": "Route-map name", - "title": "Supress Map" - }, "summary_only": { "type": "boolean", "title": "Summary Only" }, "attribute_map": { "type": "string", - "description": "Route-map name", + "description": "Route-map name.", "title": "Attribute Map" }, "match_map": { "type": "string", - "description": "Route-map name", + "description": "Route-map name.", "title": "Match Map" } }, @@ -33025,15 +36904,44 @@ "properties": { "source_protocol": { "type": "string", + "enum": [ + "attached-host", + "bgp", + "connected", + "dynamic", + "isis", + "ospf", + "ospfv3", + "rip", + "static", + "user" + ], "title": "Source Protocol" }, "route_map": { "type": "string", "title": "Route Map" }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).\n`route_map` and `rcf` are mutually exclusive. `route_map` takes precedence.\nOnly applicable if `source_protocol` is one of `connected`, `static`, `isis`, `user`, `dynamic`.", + "title": "RCF" + }, "include_leaked": { "type": "boolean", "title": "Include Leaked" + }, + "ospf_route_type": { + "type": "string", + "enum": [ + "external", + "internal", + "nssa-external", + "nssa-external 1", + "nssa-external 2" + ], + "description": "Routes learned by the OSPF protocol.\nThe `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'.\n", + "title": "OSPF Route Type" } }, "additionalProperties": false, @@ -33053,21 +36961,21 @@ "properties": { "name": { "type": "string", - "description": "VLAN aware bundle name", + "description": "VLAN aware bundle name.", "title": "Name" }, "tenant": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Tenant" }, "description": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Description" }, "rd": { - "description": "Route distinguisher", + "description": "Route distinguisher.", "type": "string", "title": "Rd" }, @@ -33084,7 +36992,7 @@ }, "rd": { "type": "string", - "description": "Route distinguisher", + "description": "Route distinguisher.", "title": "Rd" } }, @@ -33216,12 +37124,12 @@ }, "vlan": { "type": "string", - "description": "VLAN range as string. Example \"100-200,300\"", + "description": "VLAN range as string. Example \"100-200,300\".", "title": "VLAN" }, "eos_cli": { "type": "string", - "description": "Multiline EOS CLI rendered directly on the Router BGP, VLAN-aware-bundle definition in the final EOS configuration", + "description": "Multiline EOS CLI rendered directly on the Router BGP, VLAN-aware-bundle definition in the final EOS configuration.", "title": "EOS CLI" } }, @@ -33246,11 +37154,11 @@ }, "tenant": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Tenant" }, "rd": { - "description": "Route distinguisher", + "description": "Route distinguisher.", "type": "string", "title": "Rd" }, @@ -33267,7 +37175,7 @@ }, "rd": { "type": "string", - "description": "Route distinguisher", + "description": "Route distinguisher.", "title": "Rd" } }, @@ -33279,7 +37187,7 @@ }, "eos_cli": { "type": "string", - "description": "Multiline EOS CLI rendered directly on the Router BGP, VLAN definition in the final EOS configuration", + "description": "Multiline EOS CLI rendered directly on the Router BGP, VLAN definition in the final EOS configuration.", "title": "EOS CLI" }, "route_targets": { @@ -33420,11 +37328,11 @@ "properties": { "name": { "type": "string", - "description": "VPWS instance name", + "description": "VPWS instance name.", "title": "Name" }, "rd": { - "description": "Route distinguisher", + "description": "Route distinguisher.", "type": "string", "title": "Rd" }, @@ -33433,7 +37341,7 @@ "properties": { "import_export": { "type": "string", - "description": "Route Target", + "description": "Route Target.", "title": "Import Export" } }, @@ -33462,17 +37370,17 @@ "properties": { "name": { "type": "string", - "description": "Pseudowire name", + "description": "Pseudowire name.", "title": "Name" }, "id_local": { "type": "integer", - "description": "Must match id_remote on other pe", + "description": "Must match id_remote on other pe.", "title": "ID Local" }, "id_remote": { "type": "integer", - "description": "Must match id_local on other pe", + "description": "Must match id_local on other pe.", "title": "ID Remote" } }, @@ -33516,7 +37424,7 @@ "title": "Encapsulation" }, "next_hop_self_source_interface": { - "description": "Source interface name", + "description": "Source interface name.", "type": "string", "title": "Next Hop Self Source Interface" }, @@ -33591,6 +37499,39 @@ "activate": { "type": "boolean", "title": "Activate" + }, + "rcf_in": { + "type": "string", + "description": "Inbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF In" + }, + "rcf_out": { + "type": "string", + "description": "Outbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF Out" + }, + "default_route": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF" + }, + "route_map": { + "type": "string", + "title": "Route Map" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Default Route" } }, "additionalProperties": false, @@ -33610,7 +37551,7 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "activate": { @@ -33619,14 +37560,47 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" }, + "rcf_in": { + "type": "string", + "description": "Inbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF In" + }, + "rcf_out": { + "type": "string", + "description": "Outbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF Out" + }, + "default_route": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF" + }, + "route_map": { + "type": "string", + "title": "Route Map" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Default Route" + }, "domain_remote": { "type": "boolean", "title": "Domain Remote" @@ -33663,14 +37637,14 @@ }, "ecmp_limit": { "type": "integer", - "description": "Amount of ECMP paths to send", + "description": "Amount of ECMP paths to send.", "minimum": 2, "maximum": 64, "title": "ECMP Limit" }, "limit": { "type": "integer", - "description": "Amount of paths to send", + "description": "Amount of paths to send.", "minimum": 2, "maximum": 64, "title": "Limit" @@ -33709,7 +37683,7 @@ }, "window": { "type": "integer", - "description": "Time (in seconds) to detect a MAC duplication issue", + "description": "Time (in seconds) to detect a MAC duplication issue.", "minimum": 0, "maximum": 4294967295, "title": "Window" @@ -33718,14 +37692,14 @@ "type": "integer", "minimum": 0, "maximum": 4294967295, - "description": "Minimum number of MAC moves that indicate a MAC Duplication issue", + "description": "Minimum number of MAC moves that indicate a MAC Duplication issue.", "title": "Threshold" }, "expiry_timeout": { "type": "integer", "minimum": 0, "maximum": 4294967295, - "description": "Time (in seconds) to purge a MAC duplication issue", + "description": "Time (in seconds) to purge a MAC duplication issue.", "title": "Expiry Timeout" } }, @@ -33763,6 +37737,10 @@ "type": "boolean", "title": "Import Ethernet Segment IP Mass Withdraw" }, + "import_overlay_index_gateway": { + "type": "boolean", + "title": "Import Overlay Index Gateway" + }, "export_ethernet_segment_ip_mass_withdraw": { "type": "boolean", "title": "Export Ethernet Segment IP Mass Withdraw" @@ -33777,6 +37755,87 @@ "next_hop_unchanged": { "type": "boolean", "title": "Next Hop Unchanged" + }, + "bgp_additional_paths": { + "type": "object", + "description": "BGP additional-paths commands.", + "properties": { + "receive": { + "type": "boolean", + "description": "Receive multiple paths.", + "title": "Receive" + }, + "send": { + "type": "object", + "description": "Send multiple paths.", + "properties": { + "any": { + "type": "boolean", + "description": "Any eligible path.", + "title": "Any" + }, + "backup": { + "type": "boolean", + "description": "Best path and installed backup path.", + "title": "Backup" + }, + "ecmp": { + "type": "boolean", + "description": "All paths in best path ECMP group.", + "title": "ECMP" + }, + "ecmp_limit": { + "type": "integer", + "description": "Amount of ECMP paths to send.", + "minimum": 2, + "maximum": 64, + "title": "ECMP Limit" + }, + "limit": { + "type": "integer", + "description": "Amount of paths to send.", + "minimum": 2, + "maximum": 64, + "title": "Limit" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Send" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "BGP Additional Paths" + }, + "layer_2_fec_in_place_update": { + "type": "object", + "description": "BGP layer-2 in-place FEC operation.", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "timeout": { + "type": "integer", + "description": "In-place FEC update tracking timeout in seconds.", + "minimum": 0, + "maximum": 300, + "title": "Timeout" + } + }, + "required": [ + "enabled" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Layer 2 Fec In Place Update" } }, "additionalProperties": false, @@ -33795,7 +37854,7 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "activate": { @@ -33847,12 +37906,12 @@ "type": "object", "properties": { "prefix": { - "description": "IPv4 prefix \"A.B.C.D/E\" or IPv6 prefix \"A:B:C:D:E:F:G:H/I\"", + "description": "IPv4 prefix \"A.B.C.D/E\" or IPv6 prefix \"A:B:C:D:E:F:G:H/I\".", "type": "string", "title": "Prefix" }, "route_map": { - "description": "Route-map name", + "description": "Route-map name.", "type": "string", "title": "Route Map" } @@ -33867,6 +37926,21 @@ }, "title": "Networks" }, + "bgp": { + "type": "object", + "properties": { + "redistribute_internal": { + "type": "boolean", + "description": "Allow redistribution of iBGP routes into an Interior Gateway Protocol (IGP). EOS default is true.", + "title": "Redistribute Internal" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "BGP" + }, "peer_groups": { "type": "array", "items": { @@ -33874,7 +37948,7 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "activate": { @@ -33883,14 +37957,24 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" }, + "rcf_in": { + "type": "string", + "description": "Inbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF In" + }, + "rcf_out": { + "type": "string", + "description": "Outbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF Out" + }, "default_originate": { "type": "object", "properties": { @@ -33899,7 +37983,7 @@ "title": "Always" }, "route_map": { - "description": "Route-map name", + "description": "Route-map name.", "type": "string", "title": "Route Map" } @@ -33947,12 +38031,12 @@ }, "prefix_list_in": { "type": "string", - "description": "Inbound prefix-list name", + "description": "Inbound prefix-list name.", "title": "Prefix List In" }, "prefix_list_out": { "type": "string", - "description": "Outbound prefix-list name", + "description": "Outbound prefix-list name.", "title": "Prefix List Out" } }, @@ -33981,22 +38065,32 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" }, + "rcf_in": { + "type": "string", + "description": "Inbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF In" + }, + "rcf_out": { + "type": "string", + "description": "Outbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF Out" + }, "prefix_list_in": { "type": "string", - "description": "Inbound prefix-list name", + "description": "Inbound prefix-list name.", "title": "Prefix List In" }, "prefix_list_out": { "type": "string", - "description": "Prefix-list name", + "description": "Prefix-list name.", "title": "Prefix List Out" }, "default_originate": { @@ -34027,6 +38121,64 @@ ] }, "title": "Neighbors" + }, + "redistribute_routes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "source_protocol": { + "type": "string", + "enum": [ + "attached-host", + "bgp", + "connected", + "dynamic", + "isis", + "ospf", + "ospfv3", + "rip", + "static", + "user" + ], + "title": "Source Protocol" + }, + "route_map": { + "type": "string", + "title": "Route Map" + }, + "include_leaked": { + "type": "boolean", + "description": "Only applicable if `source_protocol` is one of `connected`, `static`, `isis`, `ospf`, `ospfv3`.", + "title": "Include Leaked" + }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).\n`route_map` and `rcf` are mutually exclusive. `route_map` takes precedence.\nOnly applicable if `source_protocol` is one of `connected`, `static`, `isis`, `user`, `dynamic`.", + "title": "RCF" + }, + "ospf_route_type": { + "type": "string", + "enum": [ + "external", + "internal", + "nssa-external", + "nssa-external 1", + "nssa-external 2" + ], + "description": "Routes learned by the OSPF protocol.\nThe `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'.\n", + "title": "OSPF Route Type" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "source_protocol" + ] + }, + "title": "Redistribute Routes" } }, "additionalProperties": false, @@ -34045,7 +38197,7 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "activate": { @@ -34054,12 +38206,12 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" } }, @@ -34088,12 +38240,12 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" } }, @@ -34119,6 +38271,28 @@ "route_map": { "type": "string", "title": "Route Map" + }, + "include_leaked": { + "type": "boolean", + "description": "Only applicable if `source_protocol` is `isis`.", + "title": "Include Leaked" + }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).\n`route_map` and `rcf` are mutually exclusive. `route_map` takes precedence.\nOnly applicable if `source_protocol` is `isis`.", + "title": "RCF" + }, + "ospf_route_type": { + "type": "string", + "enum": [ + "external", + "internal", + "nssa-external", + "nssa-external 1", + "nssa-external 2" + ], + "description": "Routes learned by the OSPF protocol.\nThe `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'.\n", + "title": "OSPF Route Type" } }, "additionalProperties": false, @@ -34156,12 +38330,12 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" } }, @@ -34182,7 +38356,7 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "activate": { @@ -34191,12 +38365,12 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" } }, @@ -34226,12 +38400,12 @@ "type": "object", "properties": { "prefix": { - "description": "IPv4 prefix \"A.B.C.D/E\" or IPv6 prefix \"A:B:C:D:E:F:G:H/I\"", + "description": "IPv4 prefix \"A.B.C.D/E\" or IPv6 prefix \"A:B:C:D:E:F:G:H/I\".", "type": "string", "title": "Prefix" }, "route_map": { - "description": "Route-map name", + "description": "Route-map name.", "type": "string", "title": "Route Map" } @@ -34246,6 +38420,21 @@ }, "title": "Networks" }, + "bgp": { + "type": "object", + "properties": { + "redistribute_internal": { + "type": "boolean", + "description": "Allow redistribution of iBGP routes into an Interior Gateway Protocol (IGP). EOS default is true.", + "title": "Redistribute Internal" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "BGP" + }, "peer_groups": { "type": "array", "items": { @@ -34253,7 +38442,7 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "activate": { @@ -34262,22 +38451,32 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" }, + "rcf_in": { + "type": "string", + "description": "Inbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF In" + }, + "rcf_out": { + "type": "string", + "description": "Outbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF Out" + }, "prefix_list_in": { "type": "string", - "description": "Inbound prefix-list name", + "description": "Inbound prefix-list name.", "title": "Prefix List In" }, "prefix_list_out": { "type": "string", - "description": "Outbound prefix-list name", + "description": "Outbound prefix-list name.", "title": "Prefix List Out" } }, @@ -34306,22 +38505,32 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" }, + "rcf_in": { + "type": "string", + "description": "Inbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF In" + }, + "rcf_out": { + "type": "string", + "description": "Outbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF Out" + }, "prefix_list_in": { "type": "string", - "description": "Inbound prefix-list name", + "description": "Inbound prefix-list name.", "title": "Prefix List In" }, "prefix_list_out": { "type": "string", - "description": "Outbound prefix-list name", + "description": "Outbound prefix-list name.", "title": "Prefix List Out" } }, @@ -34351,6 +38560,23 @@ "include_leaked": { "type": "boolean", "title": "Include Leaked" + }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).\n`route_map` and `rcf` are mutually exclusive. `route_map` takes precedence.\nOnly used if `source_protocol` is one of `connected`, `static`, `isis`, `user`, `dynamic`.", + "title": "RCF" + }, + "ospf_route_type": { + "type": "string", + "enum": [ + "external", + "internal", + "nssa-external", + "nssa-external 1", + "nssa-external 2" + ], + "description": "Routes learned by the OSPF protocol.\nThe `ospf_route_type` is valid for source_protocols 'ospfv3'.\n", + "title": "OSPF Route Type" } }, "additionalProperties": false, @@ -34440,12 +38666,12 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" } }, @@ -34466,7 +38692,7 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "activate": { @@ -34491,7 +38717,7 @@ "properties": { "prefix": { "type": "string", - "description": "IPv6 prefix \"A:B:C:D:E:F:G:H/I\"", + "description": "IPv6 prefix \"A:B:C:D:E:F:G:H/I\".", "title": "Prefix" }, "route_map": { @@ -34508,6 +38734,59 @@ ] }, "title": "Networks" + }, + "redistribute_routes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "source_protocol": { + "type": "string", + "enum": [ + "connected", + "isis", + "ospf", + "ospfv3", + "static" + ], + "title": "Source Protocol" + }, + "include_leaked": { + "type": "boolean", + "description": "Only applicable if `source_protocol` is `isis`.", + "title": "Include Leaked" + }, + "route_map": { + "type": "string", + "title": "Route Map" + }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).\n`route_map` and `rcf` are mutually exclusive. `route_map` takes precedence.\nOnly applicable if `source_protocol` is `isis`.", + "title": "RCF" + }, + "ospf_route_type": { + "type": "string", + "enum": [ + "external", + "internal", + "nssa-external", + "nssa-external 1", + "nssa-external 2" + ], + "description": "Routes learned by the OSPF protocol.\nThe `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'.\n", + "title": "OSPF Route Type" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "source_protocol" + ] + }, + "title": "Redistribute Routes" } }, "additionalProperties": false, @@ -34534,12 +38813,12 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" } }, @@ -34560,7 +38839,7 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "activate": { @@ -34569,12 +38848,12 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" } }, @@ -34643,7 +38922,7 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "activate": { @@ -34852,7 +39131,7 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "activate": { @@ -34949,7 +39228,7 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "activate": { @@ -35004,14 +39283,14 @@ }, "ecmp_limit": { "type": "integer", - "description": "Amount of ECMP paths to send", + "description": "Amount of ECMP paths to send.", "minimum": 2, "maximum": 64, "title": "ECMP Limit" }, "limit": { "type": "integer", - "description": "Amount of paths to send", + "description": "Amount of paths to send.", "minimum": 2, "maximum": 64, "title": "Limit" @@ -35082,14 +39361,14 @@ }, "ecmp_limit": { "type": "integer", - "description": "Amount of ECMP paths to send", + "description": "Amount of ECMP paths to send.", "minimum": 2, "maximum": 64, "title": "ECMP Limit" }, "limit": { "type": "integer", - "description": "Amount of paths to send", + "description": "Amount of paths to send.", "minimum": 2, "maximum": 64, "title": "Limit" @@ -35126,7 +39405,7 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "activate": { @@ -35165,14 +39444,14 @@ }, "ecmp_limit": { "type": "integer", - "description": "Amount of ECMP paths to send", + "description": "Amount of ECMP paths to send.", "minimum": 2, "maximum": 64, "title": "ECMP Limit" }, "limit": { "type": "integer", - "description": "Amount of paths to send", + "description": "Amount of paths to send.", "minimum": 2, "maximum": 64, "title": "Limit" @@ -35223,7 +39502,7 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "activate": { @@ -35232,13 +39511,46 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" + }, + "rcf_in": { + "type": "string", + "description": "Inbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF In" + }, + "rcf_out": { + "type": "string", + "description": "Outbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF Out" + }, + "default_route": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF" + }, + "route_map": { + "type": "string", + "title": "Route Map" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Default Route" } }, "additionalProperties": false, @@ -35283,13 +39595,46 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" + }, + "rcf_in": { + "type": "string", + "description": "Inbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF In" + }, + "rcf_out": { + "type": "string", + "description": "Outbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF Out" + }, + "default_route": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF" + }, + "route_map": { + "type": "string", + "title": "Route Map" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Default Route" } }, "additionalProperties": false, @@ -35337,7 +39682,7 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "activate": { @@ -35346,13 +39691,46 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" + }, + "rcf_in": { + "type": "string", + "description": "Inbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF In" + }, + "rcf_out": { + "type": "string", + "description": "Outbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF Out" + }, + "default_route": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF" + }, + "route_map": { + "type": "string", + "title": "Route Map" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Default Route" } }, "additionalProperties": false, @@ -35397,13 +39775,46 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" + }, + "rcf_in": { + "type": "string", + "description": "Inbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF In" + }, + "rcf_out": { + "type": "string", + "description": "Outbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF Out" + }, + "default_route": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF" + }, + "route_map": { + "type": "string", + "title": "Route Map" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Default Route" } }, "additionalProperties": false, @@ -35444,12 +39855,27 @@ "properties": { "name": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "Name" }, + "bgp": { + "type": "object", + "properties": { + "redistribute_internal": { + "type": "boolean", + "description": "Allow redistribution of iBGP routes into an Interior Gateway Protocol (IGP). EOS default is true.", + "title": "Redistribute Internal" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "BGP" + }, "rd": { "type": "string", - "description": "Route distinguisher", + "description": "Route distinguisher.", "title": "Rd" }, "evpn_multicast": { @@ -35458,14 +39884,14 @@ }, "evpn_multicast_address_family": { "type": "object", - "description": "Enable per-AF EVPN multicast settings", + "description": "Enable per-AF EVPN multicast settings.", "properties": { "ipv4": { "type": "object", "properties": { "transit": { "type": "boolean", - "description": "Enable EVPN multicast transit mode", + "description": "Enable EVPN multicast transit mode.", "title": "Transit" } }, @@ -35482,6 +39908,45 @@ }, "title": "EVPN Multicast Address Family" }, + "default_route_exports": { + "type": "array", + "description": "Enable default-originate per VRF/address-family.", + "items": { + "type": "object", + "properties": { + "address_family": { + "type": "string", + "enum": [ + "evpn", + "vpn-ipv4", + "vpn-ipv6" + ], + "title": "Address Family" + }, + "always": { + "type": "boolean", + "title": "Always" + }, + "route_map": { + "type": "string", + "title": "Route Map" + }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "address_family" + ] + }, + "title": "Default Route Exports" + }, "route_targets": { "type": "object", "properties": { @@ -35503,7 +39968,18 @@ }, "route_map": { "type": "string", + "description": "Only applicable if `address_family` is one of `evpn`, `vpn-ipv4` or `vpn-ipv6`.", "title": "Route Map" + }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).\nOnly applicable if `address_family` is one of `evpn`, `vpn-ipv4` or `vpn-ipv6`.", + "title": "RCF" + }, + "vpn_route_filter_rcf": { + "type": "string", + "description": "RCF function name with parenthesis for filtering VPN routes. Also requires `rcf` to be set.\nExample: MyFunction(myarg).\nOnly applicable if `address_family` is one of `vpn-ipv4` or `vpn-ipv6`.", + "title": "VPN Route Filter RCF" } }, "additionalProperties": false, @@ -35534,7 +40010,18 @@ }, "route_map": { "type": "string", + "description": "Only applicable if `address_family` is one of `evpn`, `vpn-ipv4` or `vpn-ipv6`.", "title": "Route Map" + }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).\nOnly applicable if `address_family` is one of `evpn`, `vpn-ipv4` or `vpn-ipv6`.", + "title": "RCF" + }, + "vpn_route_filter_rcf": { + "type": "string", + "description": "RCF function name with parenthesis for filtering VPN routes. Also requires `rcf` to be set.\nExample: MyFunction(myarg).\nOnly applicable if `address_family` is one of `vpn-ipv4` or `vpn-ipv6`.", + "title": "VPN Route Filter RCF" } }, "additionalProperties": false, @@ -35555,13 +40042,13 @@ "title": "Route Targets" }, "router_id": { - "description": "in IP address format A.B.C.D", + "description": "in IP address format A.B.C.D.", "type": "string", "title": "Router ID" }, "timers": { "type": "string", - "description": "BGP Keepalive and Hold Timer values in seconds as string \"<0-3600> <0-3600>\"", + "description": "BGP Keepalive and Hold Timer values in seconds as string \"<0-3600> <0-3600>\".", "title": "Timers" }, "networks": { @@ -35571,7 +40058,7 @@ "properties": { "prefix": { "type": "string", - "description": "IPv4 prefix \"A.B.C.D/E\" or IPv6 prefix \"A:B:C:D:E:F:G:H/I\"", + "description": "IPv4 prefix \"A.B.C.D/E\" or IPv6 prefix \"A:B:C:D:E:F:G:H/I\".", "title": "Prefix" }, "route_map": { @@ -35611,28 +40098,28 @@ }, "listen_ranges": { "type": "array", - "description": "Improved \"listen_ranges\" data model to support multiple listen ranges and additional filter capabilities\n", + "description": "Improved \"listen_ranges\" data model to support multiple listen ranges and additional filter capabilities.\n", "items": { "type": "object", "properties": { "prefix": { "type": "string", - "description": "IPv4 prefix \"A.B.C.D/E\" or IPv6 prefix \"A:B:C:D:E:F:G:H/I\"", + "description": "IPv4 prefix \"A.B.C.D/E\" or IPv6 prefix \"A:B:C:D:E:F:G:H/I\".", "title": "Prefix" }, "peer_id_include_router_id": { "type": "boolean", - "description": "Include router ID as part of peer filter", + "description": "Include router ID as part of peer filter.", "title": "Peer ID Include Router ID" }, "peer_group": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Peer Group" }, "peer_filter": { "type": "string", - "description": "Peer-filter name\nnote: `peer_filter`` or `remote_as` is required but mutually exclusive.\nIf both are defined, peer_filter takes precedence\n", + "description": "Peer-filter name.\nnote: `peer_filter`` or `remote_as` is required but mutually exclusive.\nIf both are defined, peer_filter takes precedence.\n", "title": "Peer Filter" }, "remote_as": { @@ -35659,7 +40146,7 @@ }, "peer_group": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Peer Group" }, "remote_as": { @@ -35677,7 +40164,7 @@ }, "remove_private_as": { "type": "object", - "description": "Remove private AS numbers in outbound AS path", + "description": "Remove private AS numbers in outbound AS path.", "properties": { "enabled": { "type": "boolean", @@ -35729,16 +40216,16 @@ }, "as_path": { "type": "object", - "description": "BGP AS-PATH options", + "description": "BGP AS-PATH options.", "properties": { "remote_as_replace_out": { "type": "boolean", - "description": "Replace AS number with local AS number", + "description": "Replace AS number with local AS number.", "title": "Remote As Replace Out" }, "prepend_own_disabled": { "type": "boolean", - "description": "Disable prepending own AS number to AS path", + "description": "Disable prepending own AS number to AS path.", "title": "Prepend Own Disabled" } }, @@ -35760,7 +40247,7 @@ "type": "integer", "minimum": 1, "maximum": 255, - "description": "Time-to-live in range of hops", + "description": "Time-to-live in range of hops.", "title": "Ebgp Multihop" }, "next_hop_self": { @@ -35814,7 +40301,7 @@ }, "timers": { "type": "string", - "description": "BGP Keepalive and Hold Timer values in seconds as string \"<0-3600> <0-3600>\"", + "description": "BGP Keepalive and Hold Timer values in seconds as string \"<0-3600> <0-3600>\".", "title": "Timers" }, "rib_in_pre_policy_retain": { @@ -35837,7 +40324,7 @@ }, "send_community": { "type": "string", - "description": "'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'", + "description": "'all' or a combination of 'standard', 'extended', 'large' and 'link-bandwidth (w/options)'.", "title": "Send Community" }, "maximum_routes": { @@ -35846,7 +40333,7 @@ }, "maximum_routes_warning_limit": { "type": "string", - "description": "Maximum number of routes after which a warning is issued (0 means never warn) or\nPercentage of maximum number of routes at which to warn (\"<1-100> percent\")\n", + "description": "Maximum number of routes after which a warning is issued (0 means never warn) or\nPercentage of maximum number of routes at which to warn (\"<1-100> percent\").\n", "title": "Maximum Routes Warning Limit" }, "maximum_routes_warning_only": { @@ -35864,7 +40351,7 @@ "type": "integer", "minimum": 1, "maximum": 10, - "description": "Number of local ASNs allowed in a BGP update", + "description": "Number of local ASNs allowed in a BGP update.", "title": "Times" } }, @@ -35902,23 +40389,23 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" }, "prefix_list_in": { "type": "string", - "description": "Inbound prefix-list name\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use router_bgp.vrfs[].address_family_ipv4.neighbors[].prefix_list_in or router_bgp.vrfs[].address_family_ipv6.neighbors[].prefix_list_in instead.", + "description": "Inbound prefix-list name.\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use router_bgp.vrfs[].address_family_ipv4.neighbors[].prefix_list_in or router_bgp.vrfs[].address_family_ipv6.neighbors[].prefix_list_in instead.", "deprecated": true, "title": "Prefix List In" }, "prefix_list_out": { "type": "string", - "description": "Outbound prefix-list name\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use router_bgp.vrfs[].address_family_ipv4.neighbors[].prefix_list_out or router_bgp.vrfs[].address_family_ipv6.neighbors[].prefix_list_out instead.", + "description": "Outbound prefix-list name.\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use router_bgp.vrfs[].address_family_ipv4.neighbors[].prefix_list_out or router_bgp.vrfs[].address_family_ipv6.neighbors[].prefix_list_out instead.", "deprecated": true, "title": "Prefix List Out" } @@ -35940,7 +40427,7 @@ "properties": { "name": { "type": "string", - "description": "Interface name", + "description": "Interface name.", "title": "Name" }, "remote_as": { @@ -35950,12 +40437,12 @@ }, "peer_group": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Peer Group" }, "peer_filter": { "type": "string", - "description": "Peer-filter name", + "description": "Peer-filter name.", "title": "Peer Filter" }, "description": { @@ -35989,6 +40476,23 @@ "include_leaked": { "type": "boolean", "title": "Include Leaked" + }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).\n`route_map` and `rcf` are mutually exclusive. `route_map` takes precedence.\nOnly applicable if `source_protocol` is one of `connected`, `dynamic`, `isis`, `static` and `user`.", + "title": "RCF" + }, + "ospf_route_type": { + "type": "string", + "enum": [ + "external", + "internal", + "nssa-external", + "nssa-external 1", + "nssa-external 2" + ], + "description": "Routes learned by the OSPF protocol.\nThe `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'.\n", + "title": "OSPF Route Type" } }, "additionalProperties": false, @@ -36008,7 +40512,7 @@ "properties": { "prefix": { "type": "string", - "description": "IPv4 prefix \"A.B.C.D/E\" or IPv6 prefix \"A:B:C:D:E:F:G:H/I\"", + "description": "IPv4 prefix \"A.B.C.D/E\" or IPv6 prefix \"A:B:C:D:E:F:G:H/I\".", "title": "Prefix" }, "advertise_only": { @@ -36019,16 +40523,6 @@ "type": "boolean", "title": "As Set" }, - "advertise_map": { - "type": "string", - "description": "Route-map name", - "title": "Advertise Map" - }, - "supress_map": { - "type": "string", - "description": "Route-map name", - "title": "Supress Map" - }, "summary_only": { "type": "boolean", "title": "Summary Only" @@ -36118,14 +40612,14 @@ }, "ecmp_limit": { "type": "integer", - "description": "Amount of ECMP paths to send", + "description": "Amount of ECMP paths to send.", "minimum": 2, "maximum": 64, "title": "ECMP Limit" }, "limit": { "type": "integer", - "description": "Amount of paths to send", + "description": "Amount of paths to send.", "minimum": 2, "maximum": 64, "title": "Limit" @@ -36143,6 +40637,11 @@ "^_.+$": {} }, "title": "Additional Paths" + }, + "redistribute_internal": { + "type": "boolean", + "description": "Allow redistribution of iBGP routes into an Interior Gateway Protocol (IGP). EOS default is true.", + "title": "Redistribute Internal" } }, "additionalProperties": false, @@ -36166,22 +40665,32 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" }, + "rcf_in": { + "type": "string", + "description": "Inbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF In" + }, + "rcf_out": { + "type": "string", + "description": "Outbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF Out" + }, "prefix_list_in": { "type": "string", - "description": "Inbound prefix-list name", + "description": "Inbound prefix-list name.", "title": "Prefix List In" }, "prefix_list_out": { "type": "string", - "description": "Outbound prefix-list name", + "description": "Outbound prefix-list name.", "title": "Prefix List Out" }, "next_hop": { @@ -36233,7 +40742,7 @@ "properties": { "prefix": { "type": "string", - "description": "IPv4 prefix \"A.B.C.D/E\"", + "description": "IPv4 prefix \"A.B.C.D/E\".", "title": "Prefix" }, "route_map": { @@ -36250,6 +40759,63 @@ ] }, "title": "Networks" + }, + "redistribute_routes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "source_protocol": { + "type": "string", + "enum": [ + "attached-host", + "bgp", + "connected", + "dynamic", + "isis", + "ospf", + "ospfv3", + "rip", + "static", + "user" + ], + "title": "Source Protocol" + }, + "route_map": { + "type": "string", + "title": "Route Map" + }, + "include_leaked": { + "type": "boolean", + "title": "Include Leaked" + }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).\n`route_map` and `rcf` are mutually exclusive. `route_map` takes precedence.\nOnly applicable if `source_protocol` is one of `connected`, `dynamic`, `isis`, `static` and `user`.", + "title": "RCF" + }, + "ospf_route_type": { + "type": "string", + "enum": [ + "external", + "internal", + "nssa-external", + "nssa-external 1", + "nssa-external 2" + ], + "description": "Routes learned by the OSPF protocol.\nThe `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'.\n", + "title": "OSPF Route Type" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "source_protocol" + ] + }, + "title": "Redistribute Routes" } }, "additionalProperties": false, @@ -36324,14 +40890,14 @@ }, "ecmp_limit": { "type": "integer", - "description": "Amount of ECMP paths to send", + "description": "Amount of ECMP paths to send.", "minimum": 2, "maximum": 64, "title": "ECMP Limit" }, "limit": { "type": "integer", - "description": "Amount of paths to send", + "description": "Amount of paths to send.", "minimum": 2, "maximum": 64, "title": "Limit" @@ -36349,6 +40915,11 @@ "^_.+$": {} }, "title": "Additional Paths" + }, + "redistribute_internal": { + "type": "boolean", + "description": "Allow redistribution of iBGP routes into an Interior Gateway Protocol (IGP). EOS default is true.", + "title": "Redistribute Internal" } }, "additionalProperties": false, @@ -36372,22 +40943,32 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" }, + "rcf_in": { + "type": "string", + "description": "Inbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF In" + }, + "rcf_out": { + "type": "string", + "description": "Outbound RCF function name with parenthesis.\nExample: MyFunction(myarg).", + "title": "RCF Out" + }, "prefix_list_in": { "type": "string", - "description": "Inbound prefix-list name", + "description": "Inbound prefix-list name.", "title": "Prefix List In" }, "prefix_list_out": { "type": "string", - "description": "Outbound prefix-list name", + "description": "Outbound prefix-list name.", "title": "Prefix List Out" } }, @@ -36408,7 +40989,7 @@ "properties": { "prefix": { "type": "string", - "description": "IPv6 prefix \"A:B:C:D:E:F:G:H/I\"", + "description": "IPv6 prefix \"A:B:C:D:E:F:G:H/I\".", "title": "Prefix" }, "route_map": { @@ -36425,6 +41006,62 @@ ] }, "title": "Networks" + }, + "redistribute_routes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "source_protocol": { + "type": "string", + "enum": [ + "attached-host", + "bgp", + "connected", + "dhcp", + "dynamic", + "isis", + "ospfv3", + "static", + "user" + ], + "title": "Source Protocol" + }, + "route_map": { + "type": "string", + "title": "Route Map" + }, + "include_leaked": { + "type": "boolean", + "title": "Include Leaked" + }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).\n`route_map` and `rcf` are mutually exclusive. `route_map` takes precedence.\nOnly applicable if `source_protocol` is one of `connected`, `dynamic`, `isis`, `static` and `user`.", + "title": "RCF" + }, + "ospf_route_type": { + "type": "string", + "enum": [ + "external", + "internal", + "nssa-external", + "nssa-external 1", + "nssa-external 2" + ], + "description": "Routes learned by the OSPF protocol.\nThe `ospf_route_type` is valid for source_protocols 'ospfv3'.\n", + "title": "OSPF Route Type" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "source_protocol" + ] + }, + "title": "Redistribute Routes" } }, "additionalProperties": false, @@ -36503,12 +41140,12 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" } }, @@ -36529,7 +41166,7 @@ "properties": { "prefix": { "type": "string", - "description": "IPv6 prefix \"A.B.C.D/E\"", + "description": "IPv6 prefix \"A.B.C.D/E\".", "title": "Prefix" }, "route_map": { @@ -36546,6 +41183,60 @@ ] }, "title": "Networks" + }, + "redistribute_routes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "source_protocol": { + "type": "string", + "enum": [ + "attached-host", + "connected", + "isis", + "ospf", + "ospfv3", + "static" + ], + "title": "Source Protocol" + }, + "route_map": { + "type": "string", + "title": "Route Map" + }, + "include_leaked": { + "type": "boolean", + "description": "Only applicable if `source_protocol` is `isis`.", + "title": "Include Leaked" + }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).\n`route_map` and `rcf` are mutually exclusive. `route_map` takes precedence.\nOnly applicable if `source_protocol` is `isis`.", + "title": "RCF" + }, + "ospf_route_type": { + "type": "string", + "enum": [ + "external", + "internal", + "nssa-external", + "nssa-external 1", + "nssa-external 2" + ], + "description": "Routes learned by the OSPF protocol.\nThe `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'.\n", + "title": "OSPF Route Type" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "source_protocol" + ] + }, + "title": "Redistribute Routes" } }, "additionalProperties": false, @@ -36624,12 +41315,12 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" } }, @@ -36650,7 +41341,7 @@ "properties": { "prefix": { "type": "string", - "description": "IPv6 prefix \"A:B:C:D:E:F:G:H/I\"", + "description": "IPv6 prefix \"A:B:C:D:E:F:G:H/I\".", "title": "Prefix" }, "route_map": { @@ -36667,6 +41358,59 @@ ] }, "title": "Networks" + }, + "redistribute_routes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "source_protocol": { + "type": "string", + "enum": [ + "connected", + "isis", + "ospf", + "ospfv3", + "static" + ], + "title": "Source Protocol" + }, + "route_map": { + "type": "string", + "title": "Route Map" + }, + "include_leaked": { + "type": "boolean", + "description": "Only applicable if `source_protocol` is `isis`.", + "title": "Include Leaked" + }, + "rcf": { + "type": "string", + "description": "RCF function name with parenthesis.\nExample: MyFunction(myarg).\n`route_map` and `rcf` are mutually exclusive. `route_map` takes precedence.\nOnly applicable if `source_protocol` is `isis`.", + "title": "RCF" + }, + "ospf_route_type": { + "type": "string", + "enum": [ + "external", + "internal", + "nssa-external", + "nssa-external 1", + "nssa-external 2" + ], + "description": "Routes learned by the OSPF protocol.\nThe `ospf_route_type` is valid for source_protocols 'ospf' and 'ospfv3'.\n", + "title": "OSPF Route Type" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "source_protocol" + ] + }, + "title": "Redistribute Routes" } }, "additionalProperties": false, @@ -36888,12 +41632,12 @@ }, "route_map_in": { "type": "string", - "description": "Inbound route-map name", + "description": "Inbound route-map name.", "title": "Route Map In" }, "route_map_out": { "type": "string", - "description": "Outbound route-map name", + "description": "Outbound route-map name.", "title": "Route Map Out" } }, @@ -36914,7 +41658,7 @@ "properties": { "name": { "type": "string", - "description": "Peer-group name", + "description": "Peer-group name.", "title": "Name" }, "activate": { @@ -36953,7 +41697,7 @@ "properties": { "prefix": { "type": "string", - "description": "IPv4 prefix \"A.B.C.D/E\" or IPv6 prefix \"A:B:C:D:E:F:G:H/I\"", + "description": "IPv4 prefix \"A.B.C.D/E\" or IPv6 prefix \"A:B:C:D:E:F:G:H/I\".", "title": "Prefix" }, "route_map": { @@ -36984,7 +41728,7 @@ }, "eos_cli": { "type": "string", - "description": "Multiline EOS CLI rendered directly on the Router BGP, VRF definition in the final EOS configuration\n", + "description": "Multiline EOS CLI rendered directly on the Router BGP, VRF definition in the final EOS configuration.\n", "title": "EOS CLI" } }, @@ -37005,12 +41749,12 @@ "properties": { "name": { "type": "string", - "description": "Name of session tracker", + "description": "Name of session tracker.", "title": "Name" }, "recovery_delay": { "type": "integer", - "description": "Recovery delay in seconds", + "description": "Recovery delay in seconds.", "minimum": 1, "maximum": 3600, "title": "Recovery Delay" @@ -37047,12 +41791,12 @@ "properties": { "ipv4": { "type": "string", - "description": "IPv4 Address", + "description": "IPv4 Address.", "title": "IPv4" }, "ipv6": { "type": "string", - "description": "IPv6 Address", + "description": "IPv6 Address.", "title": "IPv6" } }, @@ -37074,7 +41818,7 @@ "properties": { "name": { "type": "string", - "description": "Destination-VRF", + "description": "Destination-VRF.", "title": "Name" }, "leak_routes": { @@ -37088,7 +41832,7 @@ }, "subscribe_policy": { "type": "string", - "description": "Route-Map Policy", + "description": "Route-Map Policy.", "title": "Subscribe Policy" } }, @@ -37109,7 +41853,7 @@ "properties": { "name": { "type": "string", - "description": "Dynamic Prefix List Name", + "description": "Dynamic Prefix List Name.", "title": "Name" } }, @@ -37137,6 +41881,44 @@ ] }, "title": "VRFs" + }, + "control_functions": { + "type": "object", + "description": "Routing control functions (RCF) used to filter and update routes from a peer or during redistributions.\nWarning:\nThis configuration cannot be pushed with `eos_config_deploy_eapi`, because of limitations in `arista.eos` and `ansible.netcommon` plugins.\nThe configuration can be pushed via CloudVision with `eos_config_deploy_cvp` or `cv_deploy`.", + "properties": { + "code_units": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the code unit.", + "title": "Name" + }, + "content": { + "type": "string", + "description": "Content of route control function.\ne.g.\nfunction ACCEPT_ALL() {\n return true;\n }\nEOF", + "title": "Content" + } + }, + "required": [ + "content", + "name" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Code Units" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Control Functions" } }, "additionalProperties": false, @@ -37150,7 +41932,7 @@ "properties": { "host_proxy_match_mroute": { "type": "string", - "description": "Specify conditions for sending IGMP joins for host-proxy\n'iif' will enable igmp host-proxy to work in iif aware\n'all' will enable igmp host-proxy to work in iif unaware mode (EOS default)\n", + "description": "Specify conditions for sending IGMP joins for host-proxy.\n'iif' will enable igmp host-proxy to work in iif aware.\n'all' will enable igmp host-proxy to work in iif unaware mode (EOS default).\n", "enum": [ "all", "iif" @@ -37169,12 +41951,12 @@ "properties": { "name": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "Name" }, "host_proxy_match_mroute": { "type": "string", - "description": "Specify conditions for sending IGMP joins for host-proxy\n'iif' will enable igmp host-proxy to work in iif aware\n'all' will enable igmp host-proxy to work in iif unaware mode (EOS default)\n", + "description": "Specify conditions for sending IGMP joins for host-proxy.\n'iif' will enable igmp host-proxy to work in iif aware.\n'all' will enable igmp host-proxy to work in iif unaware mode (EOS default).\n", "enum": [ "all", "iif" @@ -37297,17 +42079,17 @@ "properties": { "instance": { "type": "string", - "description": "ISIS Instance Name", + "description": "ISIS Instance Name.", "title": "Instance" }, "net": { "type": "string", - "description": "CLNS Address like \"49.0001.0001.0000.0001.00\"", + "description": "CLNS Address like \"49.0001.0001.0000.0001.00\".", "title": "Net" }, "router_id": { "type": "string", - "description": "IPv4 Address", + "description": "IPv4 Address.", "title": "Router ID" }, "is_type": { @@ -37886,7 +42668,7 @@ "ipv4 unicast", "ipv6 unicast" ], - "description": "Address Family\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use address_family_ipv4.enabled or address_family_ipv6.enabled instead.", + "description": "Address Family.\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use address_family_ipv4.enabled or address_family_ipv6.enabled instead.", "deprecated": true }, "title": "Address Family" @@ -37895,7 +42677,7 @@ "type": "array", "items": { "type": "string", - "description": "EOS CLI rendered under the address families\nExample \"maximum-paths 64\"\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use address_family_ipv4/address_family_ipv6 instead.", + "description": "EOS CLI rendered under the address families.\nExample \"maximum-paths 64\"\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use address_family_ipv4/address_family_ipv6 instead.", "deprecated": true }, "title": "ISIS AF Defaults" @@ -37919,7 +42701,7 @@ }, "route_map": { "type": "string", - "description": "Route-map name", + "description": "Route-map name.", "title": "Route Map" }, "include_leaked": { @@ -37933,7 +42715,7 @@ "internal", "nssa-external" ], - "description": "ospf_route_type is required with source_protocols 'ospf' and 'ospfv3'", + "description": "ospf_route_type is required with source_protocols 'ospf' and 'ospfv3'.", "title": "OSPF Route Type" } }, @@ -37986,7 +42768,7 @@ }, "srlg": { "type": "object", - "description": "Shared Risk Link Group", + "description": "Shared Risk Link Group.", "properties": { "enable": { "type": "boolean", @@ -38019,7 +42801,7 @@ }, "rcf": { "type": "string", - "description": "Route Control Function", + "description": "Route Control Function.", "title": "RCF" } }, @@ -38076,7 +42858,7 @@ }, "srlg": { "type": "object", - "description": "Shared Risk Link Group", + "description": "Shared Risk Link Group.", "properties": { "enable": { "type": "boolean", @@ -38151,17 +42933,31 @@ "properties": { "interval": { "type": "integer", - "minimum": 1, - "maximum": 300, - "description": "Maximum interval between two SPFs in seconds.", + "description": "Maximum interval between two SPFs in seconds or milliseconds.\nRange in seconds: <1-300>\nRange in milliseconds: <1-300000>", "title": "Interval" }, + "interval_unit": { + "type": "string", + "enum": [ + "seconds", + "milliseconds" + ], + "description": "If interval unit is not defined EOS takes `seconds` by default.", + "title": "Interval Unit" + }, "wait_interval": { "type": "integer", "minimum": 1, "maximum": 300000, "description": "Initial wait interval for SPF in milliseconds.", "title": "Wait Interval" + }, + "hold_interval": { + "type": "integer", + "minimum": 1, + "maximum": 300000, + "description": "Hold interval between the first and second SPF runs in milliseconds.", + "title": "Hold Interval" } }, "additionalProperties": false, @@ -38265,7 +43061,7 @@ "properties": { "prefix_list": { "type": "string", - "description": "Prefix-list name. ND Proxying is disabled for IPv6 addresses defined in the prefix-list.", + "description": "Prefix-list name. Neighbor Discovery Proxying is disabled for IPv6 addresses defined in the prefix-list.", "title": "Prefix List" } }, @@ -38295,12 +43091,12 @@ "properties": { "originator_id_local_interface": { "type": "string", - "description": "Interface to use for originator ID", + "description": "Interface to use for originator ID.", "title": "Originator ID Local Interface" }, "rejected_limit": { "type": "integer", - "description": "Maximum number of rejected SA messages allowed in cache", + "description": "Maximum number of rejected SA messages allowed in cache.", "minimum": 0, "maximum": 40000, "title": "Rejected Limit" @@ -38322,12 +43118,12 @@ "properties": { "source_prefix": { "type": "string", - "description": "Source address prefix", + "description": "Source address prefix.", "title": "Source Prefix" }, "limit": { "type": "integer", - "description": "Limit for SAs matching the source address prefix", + "description": "Limit for SAs matching the source address prefix.", "minimum": 0, "maximum": 40000, "title": "Limit" @@ -38351,7 +43147,7 @@ "properties": { "ipv4_address": { "type": "string", - "description": "Peer IP Address", + "description": "Peer IP Address.", "title": "IPv4 Address" }, "default_peer": { @@ -38363,7 +43159,7 @@ }, "prefix_list": { "type": "string", - "description": "Prefix list to filter source of SA messages", + "description": "Prefix list to filter source of SA messages.", "title": "Prefix List" } }, @@ -38383,12 +43179,12 @@ }, "disabled": { "type": "boolean", - "description": "Disable the MSDP peer", + "description": "Disable the MSDP peer.", "title": "Disabled" }, "sa_limit": { "type": "integer", - "description": "Maximum number of SA messages allowed in cache", + "description": "Maximum number of SA messages allowed in cache.", "minimum": 0, "maximum": 40000, "title": "Sa Limit" @@ -38400,7 +43196,7 @@ "properties": { "name": { "type": "string", - "description": "Mesh group name", + "description": "Mesh group name.", "title": "Name" } }, @@ -38425,7 +43221,7 @@ }, "hold_timer": { "type": "integer", - "description": "Must be greater than keepalive timer", + "description": "Must be greater than keepalive timer.", "minimum": 1, "maximum": 65535, "title": "Hold Timer" @@ -38446,12 +43242,12 @@ "properties": { "in_list": { "type": "string", - "description": "ACL to filter inbound SA messages", + "description": "ACL to filter inbound SA messages.", "title": "In List" }, "out_list": { "type": "string", - "description": "ACL to filter outbound SA messages", + "description": "ACL to filter outbound SA messages.", "title": "Out List" } }, @@ -38479,17 +43275,17 @@ "properties": { "name": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "Name" }, "originator_id_local_interface": { "type": "string", - "description": "Interface to use for originator ID", + "description": "Interface to use for originator ID.", "title": "Originator ID Local Interface" }, "rejected_limit": { "type": "integer", - "description": "Maximum number of rejected SA messages allowed in cache", + "description": "Maximum number of rejected SA messages allowed in cache.", "minimum": 0, "maximum": 40000, "title": "Rejected Limit" @@ -38511,12 +43307,12 @@ "properties": { "source_prefix": { "type": "string", - "description": "Source address prefix", + "description": "Source address prefix.", "title": "Source Prefix" }, "limit": { "type": "integer", - "description": "Limit for SAs matching the source address prefix", + "description": "Limit for SAs matching the source address prefix.", "minimum": 0, "maximum": 40000, "title": "Limit" @@ -38540,7 +43336,7 @@ "properties": { "ipv4_address": { "type": "string", - "description": "Peer IP Address", + "description": "Peer IP Address.", "title": "IPv4 Address" }, "default_peer": { @@ -38552,7 +43348,7 @@ }, "prefix_list": { "type": "string", - "description": "Prefix list to filter source of SA messages", + "description": "Prefix list to filter source of SA messages.", "title": "Prefix List" } }, @@ -38572,12 +43368,12 @@ }, "disabled": { "type": "boolean", - "description": "Disable the MSDP peer", + "description": "Disable the MSDP peer.", "title": "Disabled" }, "sa_limit": { "type": "integer", - "description": "Maximum number of SA messages allowed in cache", + "description": "Maximum number of SA messages allowed in cache.", "minimum": 0, "maximum": 40000, "title": "Sa Limit" @@ -38589,7 +43385,7 @@ "properties": { "name": { "type": "string", - "description": "Mesh group name", + "description": "Mesh group name.", "title": "Name" } }, @@ -38614,7 +43410,7 @@ }, "hold_timer": { "type": "integer", - "description": "Must be greater than keepalive timer", + "description": "Must be greater than keepalive timer.", "minimum": 1, "maximum": 65535, "title": "Hold Timer" @@ -38635,12 +43431,12 @@ "properties": { "in_list": { "type": "string", - "description": "ACL to filter inbound SA messages", + "description": "ACL to filter inbound SA messages.", "title": "In List" }, "out_list": { "type": "string", - "description": "ACL to filter outbound SA messages", + "description": "ACL to filter outbound SA messages.", "title": "Out List" } }, @@ -38685,11 +43481,18 @@ "ipv4": { "type": "object", "properties": { + "activity_polling_interval": { + "type": "integer", + "minimum": 1, + "maximum": 60, + "description": "MFIB entry activity polling interval.", + "title": "Activity Polling Interval" + }, "counters": { "type": "object", "properties": { "rate_period_decay": { - "description": "Rate in seconds", + "description": "Rate in seconds.", "type": "integer", "minimum": 0, "maximum": 600, @@ -38733,7 +43536,7 @@ "type": "object", "properties": { "source_prefix": { - "description": "Source address A.B.C.D or Source prefix A.B.C.D/E", + "description": "Source address A.B.C.D or Source prefix A.B.C.D/E.", "type": "string", "title": "Source Prefix" }, @@ -38743,12 +43546,12 @@ "type": "object", "properties": { "nexthop": { - "description": "Next-hop IP address or interface name", + "description": "Next-hop IP address or interface name.", "type": "string", "title": "Nexthop" }, "distance": { - "description": "Administrative distance for this route", + "description": "Administrative distance for this route.", "type": "integer", "minimum": 1, "maximum": 255, @@ -38791,6 +43594,23 @@ }, "title": "IPv4" }, + "ipv6": { + "type": "object", + "properties": { + "activity_polling_interval": { + "type": "integer", + "minimum": 1, + "maximum": 60, + "description": "MFIB entry activity polling interval.", + "title": "Activity Polling Interval" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IPv6" + }, "vrfs": { "type": "array", "items": { @@ -38843,12 +43663,12 @@ "properties": { "id": { "type": "integer", - "description": "OSPF Process ID", + "description": "OSPF Process ID.", "title": "ID" }, "vrf": { "type": "string", - "description": "VRF Name for OSPF Process", + "description": "VRF Name for OSPF Process.", "title": "VRF" }, "passive_interface_default": { @@ -38857,7 +43677,7 @@ }, "router_id": { "type": "string", - "description": "IPv4 Address", + "description": "IPv4 Address.", "title": "Router ID" }, "distance": { @@ -38928,7 +43748,7 @@ "type": "array", "items": { "type": "string", - "description": "Interface Name" + "description": "Interface Name." }, "title": "No Passive Interfaces" }, @@ -38958,7 +43778,7 @@ "properties": { "rx_min_interval": { "type": "integer", - "description": "Min interval in msecs between accepting the same LSA", + "description": "Min interval in msecs between accepting the same LSA.", "minimum": 0, "maximum": 600000, "title": "RX Min Interval" @@ -38968,21 +43788,21 @@ "properties": { "initial": { "type": "integer", - "description": "Delay to generate first occurrence of LSA in msecs", + "description": "Delay to generate first occurrence of LSA in msecs.", "minimum": 0, "maximum": 600000, "title": "Initial" }, "min": { "type": "integer", - "description": "Min delay between originating the same LSA in msecs", + "description": "Min delay between originating the same LSA in msecs.", "minimum": 1, "maximum": 600000, "title": "Min" }, "max": { "type": "integer", - "description": "1-600000 Maximum delay between originating the same LSA in msec", + "description": "1-600000 Maximum delay between originating the same LSA in msec.", "minimum": 1, "maximum": 600000, "title": "Max" @@ -39006,21 +43826,21 @@ "properties": { "initial": { "type": "integer", - "description": "Initial SPF schedule delay in msecs", + "description": "Initial SPF schedule delay in msecs.", "minimum": 0, "maximum": 600000, "title": "Initial" }, "min": { "type": "integer", - "description": "Min Hold time between two SPFs in msecs", + "description": "Min Hold time between two SPFs in msecs.", "minimum": 0, "maximum": 65535000, "title": "Min" }, "max": { "type": "integer", - "description": "Max wait time between two SPFs in msecs", + "description": "Max wait time between two SPFs in msecs.", "minimum": 0, "maximum": 65535000, "title": "Max" @@ -39048,7 +43868,7 @@ }, "metric": { "type": "integer", - "description": "Metric for default route", + "description": "Metric for default route.", "minimum": 1, "maximum": 65535, "title": "Metric" @@ -39059,7 +43879,7 @@ 1, 2 ], - "description": "OSPF metric type for default route", + "description": "OSPF metric type for default route.", "title": "Metric Type" } }, @@ -39076,7 +43896,7 @@ "properties": { "prefix": { "type": "string", - "description": "Summary Prefix Address", + "description": "Summary Prefix Address.", "title": "Prefix" }, "tag": { @@ -39110,7 +43930,7 @@ "properties": { "route_map": { "type": "string", - "description": "Route Map Name", + "description": "Route Map Name.", "title": "Route Map" }, "include_leaked": { @@ -39129,7 +43949,7 @@ "properties": { "route_map": { "type": "string", - "description": "Route Map Name", + "description": "Route Map Name.", "title": "Route Map" }, "include_leaked": { @@ -39148,7 +43968,7 @@ "properties": { "route_map": { "type": "string", - "description": "Route Map Name", + "description": "Route Map Name.", "title": "Route Map" }, "include_leaked": { @@ -39171,7 +43991,7 @@ }, "auto_cost_reference_bandwidth": { "type": "integer", - "description": "Bandwidth in mbps", + "description": "Bandwidth in mbps.", "title": "Auto Cost Reference Bandwidth" }, "areas": { @@ -39190,13 +44010,13 @@ "type": "array", "items": { "type": "string", - "description": "IPv4 Prefix" + "description": "IPv4 Prefix." }, "title": "Networks" }, "prefix_list": { "type": "string", - "description": "Prefix-List Name", + "description": "Prefix-List Name.", "title": "Prefix List" } }, @@ -39229,7 +44049,7 @@ "properties": { "metric": { "type": "integer", - "description": "Metric for default route", + "description": "Metric for default route.", "minimum": 1, "maximum": 65535, "title": "Metric" @@ -39240,7 +44060,7 @@ 1, 2 ], - "description": "OSPF metric type for default route", + "description": "OSPF metric type for default route.", "title": "Metric Type" } }, @@ -39295,7 +44115,7 @@ }, "on_startup": { "type": "string", - "description": "\"wait-for-bgp\" or Integer 5-86400\nExample: \"wait-for-bgp\" Or \"222\"\n", + "description": "\"wait-for-bgp\" or Integer 5-86400.\nExample: \"wait-for-bgp\" Or \"222\"\n", "title": "On Startup" }, "summary_lsa": { @@ -39334,7 +44154,7 @@ }, "eos_cli": { "type": "string", - "description": "Multiline EOS CLI rendered directly on the Router OSPF process ID in the final EOS configuration", + "description": "Multiline EOS CLI rendered directly on the Router OSPF process ID in the final EOS configuration.", "title": "EOS CLI" } }, @@ -39393,7 +44213,7 @@ "enum": [ "lan" ], - "description": "Flow assignement `lan` can not be configured in a path group with dynamic peers.", + "description": "Flow assignment `lan` can not be configured in a path group with dynamic peers.", "title": "Flow Assignment" }, "local_interfaces": { @@ -39496,7 +44316,7 @@ }, "dynamic_peers": { "type": "object", - "description": "Flow assignement `lan` can not be configured in a path group with dynamic peers.", + "description": "Flow assignment `lan` can not be configured in a path group with dynamic peers.", "properties": { "enabled": { "type": "boolean", @@ -39638,7 +44458,7 @@ "properties": { "name": { "type": "string", - "description": "Path-group name", + "description": "Path-group name.", "title": "Name" }, "priority": { @@ -39804,12 +44624,12 @@ "properties": { "bfd": { "type": "boolean", - "description": "Enable/Disable BFD", + "description": "Enable/Disable BFD.", "title": "BFD" }, "ssm_range": { "type": "string", - "description": "IPv4 Prefix associated with SSM", + "description": "IPv4 Prefix associated with SSM.", "title": "Ssm Range" }, "rp_addresses": { @@ -39819,7 +44639,7 @@ "properties": { "address": { "type": "string", - "description": "RP Address", + "description": "RP Address.", "title": "Address" }, "groups": { @@ -39870,7 +44690,7 @@ "properties": { "address": { "type": "string", - "description": "Anycast RP Address", + "description": "Anycast RP Address.", "title": "Address" }, "other_anycast_rp_addresses": { @@ -39880,7 +44700,7 @@ "properties": { "address": { "type": "string", - "description": "Other Anycast RP Address", + "description": "Other Anycast RP Address.", "title": "Address" }, "register_count": { @@ -39923,7 +44743,7 @@ "properties": { "name": { "type": "string", - "description": "VRF Name", + "description": "VRF Name.", "title": "Name" }, "ipv4": { @@ -39931,7 +44751,7 @@ "properties": { "bfd": { "type": "boolean", - "description": "Enable/Disable BFD", + "description": "Enable/Disable BFD.", "title": "BFD" }, "rp_addresses": { @@ -39941,7 +44761,7 @@ "properties": { "address": { "type": "string", - "description": "RP Address", + "description": "RP Address.", "title": "Address" }, "groups": { @@ -40010,6 +44830,231 @@ }, "title": "Router PIM Sparse Mode" }, + "router_segment_security": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "policies": { + "type": "array", + "description": "Customised application policies.\nUsing the Application Traffic Recognition L4 profiles, custom policies can be defined. The built-in application 'app-match-all' can be used to match any packets.\nNote that this is stateless, so both the source and destination flows need to be considered.", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Policy name.", + "title": "Name" + }, + "sequence_numbers": { + "type": "array", + "items": { + "type": "object", + "properties": { + "sequence": { + "type": "integer", + "description": "Sequence ID.", + "minimum": 1, + "maximum": 1023, + "title": "Sequence" + }, + "application": { + "type": "string", + "description": "The name of the application.", + "title": "Application" + }, + "action": { + "type": "string", + "description": "The action to take - note that platform support for the redirect action is limited. The \"redirect\" action also requires the 'next_hop' to be configured.", + "enum": [ + "forward", + "drop", + "redirect" + ], + "title": "Action" + }, + "log": { + "type": "boolean", + "description": "Enable logging - note that platform support is limited.", + "title": "Log" + }, + "stateless": { + "type": "boolean", + "description": "Take action, regardless of state. Should be set to 'true' for MSS-G.", + "default": true, + "title": "Stateless" + }, + "next_hop": { + "type": "string", + "description": "When the action is 'redirect', this indicates the IPv4 next hop to redirect to.", + "title": "Next Hop" + } + }, + "required": [ + "application", + "action", + "sequence" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Sequence Numbers" + } + }, + "required": [ + "sequence_numbers", + "name" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Policies" + }, + "vrfs": { + "type": "array", + "description": "The name of the VRF that the segments and policies are defined in.", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "segments": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Segment name.", + "title": "Name" + }, + "definition": { + "type": "object", + "properties": { + "interfaces": { + "type": "array", + "description": "The names of the source interface e.g. Port-Channel1 - note that platform support is limited.", + "minItems": 1, + "items": { + "type": "string" + }, + "title": "Interfaces" + }, + "match_lists": { + "type": "array", + "description": "The set of lists that define the segment. These can be a mix of IPv4 and IPv6 prefix or match lists.", + "maxItems": 2, + "minItems": 1, + "items": { + "type": "object", + "properties": { + "address_family": { + "type": "string", + "description": "Indicate which address-family the match list belongs to e.g. ipv4 or ipv6.", + "enum": [ + "ipv4", + "ipv6" + ], + "title": "Address Family" + }, + "covered_prefix_list": { + "type": "string", + "description": "The name of the prefix-list. You can have a maximum of one per address-family. Mutually exclusive to the use of match_list. If both are configured prefix takes precedence.", + "title": "Covered Prefix List" + }, + "prefix": { + "type": "string", + "description": "The name of the match-list. You can have a maximum of one per address-family. Mutually exclusive to the use of covered_prefix_list. If both are configured prefix takes precedence.", + "title": "Prefix" + } + }, + "required": [ + "address_family" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "Match Lists" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Definition" + }, + "policies": { + "type": "array", + "description": "The policies controlling traffic into the segment.", + "items": { + "type": "object", + "properties": { + "from": { + "type": "string", + "description": "The name of the source segment or 'forwarding-segments' for all segments.", + "title": "From" + }, + "policy": { + "type": "string", + "description": "The name of the policy to apply. The built-in policies are 'policy-forward-all' and 'policy-drop-all'.", + "title": "Policy" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "from" + ] + }, + "title": "Policies" + }, + "fallback_policy": { + "type": "string", + "description": "Only supported on the R3 series platforms, this allows a per-segment default policy to be specified by name.", + "title": "Fallback Policy" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "required": [ + "name" + ] + }, + "title": "Segments" + } + }, + "required": [ + "segments", + "name" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + } + }, + "title": "VRFs" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Router Segment Security" + }, "router_service_insertion": { "type": "object", "description": "Configure network services inserted to data forwarding.", @@ -40136,7 +45181,7 @@ "properties": { "address": { "type": "string", - "description": "IPv4 or IPv6 address", + "description": "IPv4 or IPv6 address.", "title": "Address" }, "colors": { @@ -40162,7 +45207,7 @@ }, "sbfd_remote_discriminator": { "type": "string", - "description": "IPv4 address or 32 bit integer", + "description": "IPv4 address or 32 bit integer.", "title": "SBFD Remote Discriminator" }, "path_group": { @@ -40312,7 +45357,7 @@ }, "polling_interval": { "type": "integer", - "description": "Polling interval in seconds", + "description": "Polling interval in seconds.", "title": "Polling Interval" }, "vrfs": { @@ -40331,7 +45376,7 @@ "properties": { "destination": { "type": "string", - "description": "Sflow Destination IP Address", + "description": "Sflow Destination IP Address.", "title": "Destination" }, "port": { @@ -40357,7 +45402,7 @@ }, "source_interface": { "type": "string", - "description": "Source Interface", + "description": "Source Interface.", "title": "Source Interface" } }, @@ -40378,12 +45423,12 @@ "properties": { "destination": { "type": "string", - "description": "Sflow Destination IP Address", + "description": "Sflow Destination IP Address.", "title": "Destination" }, "port": { "type": "integer", - "description": "Port Number", + "description": "Port Number.", "title": "Port" } }, @@ -40404,7 +45449,7 @@ }, "source_interface": { "type": "string", - "description": "Source Interface", + "description": "Source Interface.", "title": "Source Interface" }, "extensions": { @@ -40414,12 +45459,12 @@ "properties": { "name": { "type": "string", - "description": "Extension Name", + "description": "Extension Name.", "title": "Name" }, "enabled": { "type": "boolean", - "description": "Enable or Disable Extension", + "description": "Enable or Disable Extension.", "title": "Enabled" } }, @@ -40534,14 +45579,14 @@ }, "snmp_server": { "type": "object", - "description": "SNMP settings", + "description": "SNMP settings.", "properties": { "engine_ids": { "type": "object", "properties": { "local": { "type": "string", - "description": "Engine ID in hexadecimal\n", + "description": "Engine ID in hexadecimal.\n", "title": "Local" }, "remotes": { @@ -40551,12 +45596,12 @@ "properties": { "id": { "type": "string", - "description": "Remote engine ID in hexadecimal\n", + "description": "Remote engine ID in hexadecimal.\n", "title": "ID" }, "address": { "type": "string", - "description": "Hostname or IP of remote engine\n", + "description": "Hostname or IP of remote engine.\n", "title": "Address" }, "udp_port": { @@ -40580,12 +45625,12 @@ }, "contact": { "type": "string", - "description": "SNMP contact", + "description": "SNMP contact.", "title": "Contact" }, "location": { "type": "string", - "description": "SNMP location", + "description": "SNMP location.", "title": "Location" }, "communities": { @@ -40595,7 +45640,7 @@ "properties": { "name": { "type": "string", - "description": "Community name", + "description": "Community name.", "title": "Name" }, "access": { @@ -40611,7 +45656,7 @@ "properties": { "name": { "type": "string", - "description": "IPv4 access list name", + "description": "IPv4 access list name.", "title": "Name" } }, @@ -40626,7 +45671,7 @@ "properties": { "name": { "type": "string", - "description": "IPv6 access list name", + "description": "IPv6 access list name.", "title": "Name" } }, @@ -40658,7 +45703,7 @@ "properties": { "name": { "type": "string", - "description": "IPv4 access list name", + "description": "IPv4 access list name.", "title": "Name" }, "vrf": { @@ -40680,7 +45725,7 @@ "properties": { "name": { "type": "string", - "description": "IPv6 access list name", + "description": "IPv6 access list name.", "title": "Name" }, "vrf": { @@ -40702,7 +45747,7 @@ "properties": { "name": { "type": "string", - "description": "Interface name", + "description": "Interface name.", "title": "Name" }, "vrf": { @@ -40727,7 +45772,7 @@ "properties": { "name": { "type": "string", - "description": "SNMP view name", + "description": "SNMP view name.", "title": "Name" }, "mib_family_name": { @@ -40757,7 +45802,7 @@ "properties": { "name": { "type": "string", - "description": "Group name", + "description": "Group name.", "title": "Name" }, "version": { @@ -40780,17 +45825,17 @@ }, "read": { "type": "string", - "description": "Read view", + "description": "Read view.", "title": "Read" }, "write": { "type": "string", - "description": "Write view", + "description": "Write view.", "title": "Write" }, "notify": { "type": "string", - "description": "Notify view", + "description": "Notify view.", "title": "Notify" } }, @@ -40808,22 +45853,22 @@ "properties": { "name": { "type": "string", - "description": "Username", + "description": "Username.", "title": "Name" }, "group": { "type": "string", - "description": "Group name", + "description": "Group name.", "title": "Group" }, "remote_address": { "type": "string", - "description": "Hostname or ip of remote engine\nThe remote_address and udp_port are used for remote users\n", + "description": "Hostname or ip of remote engine.\nThe remote_address and udp_port are used for remote users.\n", "title": "Remote Address" }, "udp_port": { "type": "integer", - "description": "udp_port will not be used if no remote_address is configured\n", + "description": "udp_port will not be used if no remote_address is configured.\n", "title": "UDP Port" }, "version": { @@ -40837,27 +45882,27 @@ }, "localized": { "type": "string", - "description": "Engine ID in hexadecimal for localizing auth and/or priv\n", + "description": "Engine ID in hexadecimal for localizing auth and/or priv.\n", "title": "Localized" }, "auth": { "type": "string", - "description": "Hash algorithm\n", + "description": "Hash algorithm.\n", "title": "Auth" }, "auth_passphrase": { "type": "string", - "description": "Hashed authentication passphrase if localized is used else cleartext authentication passphrase\n", + "description": "Hashed authentication passphrase if localized is used else cleartext authentication passphrase.\n", "title": "Auth Passphrase" }, "priv": { "type": "string", - "description": "Encryption algorithm\n", + "description": "Encryption algorithm.\n", "title": "Priv" }, "priv_passphrase": { "type": "string", - "description": "Hashed privacy passphrase if localized is used else cleartext privacy passphrase\n", + "description": "Hashed privacy passphrase if localized is used else cleartext privacy passphrase.\n", "title": "Priv Passphrase" } }, @@ -40875,7 +45920,7 @@ "properties": { "host": { "type": "string", - "description": "Host IP address or name", + "description": "Host IP address or name.", "title": "Host" }, "vrf": { @@ -40893,7 +45938,7 @@ }, "community": { "type": "string", - "description": "Community name", + "description": "Community name.", "title": "Community" }, "users": { @@ -40936,7 +45981,7 @@ "enable": { "type": "boolean", "default": false, - "description": "Enable or disable all snmp-traps\n", + "description": "Enable or disable all snmp-traps.\n", "title": "Enable" }, "snmp_traps": { @@ -40946,7 +45991,7 @@ "properties": { "name": { "type": "string", - "description": "Enable or disable specific snmp-traps and their sub_traps\nExamples:\n- \"bgp\"\n- \"bgp established\"\n", + "description": "Enable or disable specific snmp-traps and their sub_traps.\nExamples:\n- \"bgp\"\n- \"bgp established\"\n", "title": "Name" }, "enabled": { @@ -40976,7 +46021,7 @@ "properties": { "name": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "Name" }, "enable": { @@ -41045,7 +46090,7 @@ }, "count": { "type": "integer", - "description": "Maximum number of BPDUs per timer interval", + "description": "Maximum number of BPDUs per timer interval.", "title": "Count" } }, @@ -41075,7 +46120,7 @@ }, "revision": { "type": "integer", - "description": "0-65535", + "description": "0-65535.", "title": "Revision" }, "instances": { @@ -41085,7 +46130,7 @@ "properties": { "id": { "type": "integer", - "description": "Instance ID", + "description": "Instance ID.", "title": "ID" }, "vlans": { @@ -41125,7 +46170,7 @@ "properties": { "id": { "type": "string", - "description": "Instance ID", + "description": "Instance ID.", "title": "ID" }, "priority": { @@ -41187,7 +46232,7 @@ "properties": { "name": { "type": "string", - "description": "Access-list Name", + "description": "Access-list Name.", "title": "Name" }, "counters_per_entry": { @@ -41201,12 +46246,12 @@ "properties": { "sequence": { "type": "integer", - "description": "Sequence ID", + "description": "Sequence ID.", "title": "Sequence" }, "action": { "type": "string", - "description": "Action as string\nExample: \"deny ip any any\"\n", + "description": "Action as string.\nExample: \"deny ip any any\"\n", "title": "Action" } }, @@ -41240,12 +46285,12 @@ "properties": { "vrf": { "type": "string", - "description": "VRF Name", + "description": "VRF Name.", "title": "VRF" }, "destination_address_prefix": { "type": "string", - "description": "IPv4_network/Mask", + "description": "IPv4_network/Mask.", "title": "Destination Address Prefix" }, "interface": { @@ -41254,12 +46299,12 @@ }, "gateway": { "type": "string", - "description": "IPv4 Address", + "description": "IPv4 Address.", "title": "Gateway" }, "track_bfd": { "type": "boolean", - "description": "Track next-hop using BFD", + "description": "Track next-hop using BFD.", "title": "Track BFD" }, "distance": { @@ -41276,7 +46321,7 @@ }, "name": { "type": "string", - "description": "Description", + "description": "Description.", "title": "Name" }, "metric": { @@ -41449,7 +46494,7 @@ }, "vlan": { "type": "integer", - "description": "VLAN ID", + "description": "VLAN ID.", "minimum": 1, "maximum": 4094, "title": "VLAN" @@ -41515,12 +46560,12 @@ "properties": { "ipv4": { "type": "integer", - "description": "Segment size", + "description": "Segment size.", "title": "IPv4" }, "ipv6": { "type": "integer", - "description": "Segment size", + "description": "Segment size.", "title": "IPv6" } }, @@ -41623,7 +46668,7 @@ "properties": { "timeout": { "type": "integer", - "description": "Timeout in seconds", + "description": "Timeout in seconds.", "minimum": 1, "maximum": 1000, "title": "Timeout" @@ -41635,7 +46680,7 @@ "properties": { "host": { "type": "string", - "description": "Host IP address or name", + "description": "Host IP address or name.", "title": "Host" }, "vrf": { @@ -41644,7 +46689,7 @@ }, "key": { "type": "string", - "description": "Encrypted key", + "description": "Encrypted key.", "title": "Key" }, "key_type": { @@ -41663,7 +46708,7 @@ }, "timeout": { "type": "integer", - "description": "Timeout in seconds", + "description": "Timeout in seconds.", "minimum": 1, "maximum": 1000, "title": "Timeout" @@ -41701,7 +46746,7 @@ "title": "Enabled" }, "profile": { - "description": "Profile Name", + "description": "Profile Name.", "type": "string", "title": "Profile" }, @@ -41709,7 +46754,7 @@ "type": "array", "items": { "type": "string", - "description": "Interface name e.g Ethernet1, Port-Channel1" + "description": "Interface name e.g Ethernet1, Port-Channel1." }, "title": "No Errdisable" } @@ -41741,7 +46786,7 @@ }, "truncation_size": { "type": "integer", - "description": "Allowed truncation_size values vary depending on the platform\n", + "description": "Allowed truncation_size values vary depending on the platform.\n", "title": "Truncation Size" }, "mac": { @@ -41749,7 +46794,7 @@ "properties": { "timestamp": { "type": "object", - "description": "mac.timestamp.replace_source_mac and mac.timestamp.header.format are mutually exclsuive. If both are defined, replace_source_mac takes precedence\n", + "description": "mac.timestamp.replace_source_mac and mac.timestamp.header.format are mutually exclsuive. If both are defined, replace_source_mac takes precedence.\n", "properties": { "replace_source_mac": { "type": "boolean", @@ -41767,7 +46812,7 @@ "title": "Format" }, "eth_type": { - "description": "EtherType", + "description": "EtherType.", "type": "integer", "title": "Eth Type" } @@ -41787,7 +46832,7 @@ }, "fcs_append": { "type": "boolean", - "description": "mac.fcs_append and mac.fcs_error are mutually exclusive. If both are defined, mac.fcs_append takes precedence\n", + "description": "mac.fcs_append and mac.fcs_error are mutually exclusive. If both are defined, mac.fcs_append takes precedence.\n", "title": "FCS Append" }, "fcs_error": { @@ -41819,7 +46864,7 @@ "properties": { "system": { "type": "string", - "description": "TCAM profile name to activate\n", + "description": "TCAM profile name to activate.\n", "title": "System" }, "profiles": { @@ -41829,7 +46874,7 @@ "properties": { "name": { "type": "string", - "description": "Tcam-Profile Name", + "description": "Tcam-Profile Name.", "title": "Name" }, "config": { @@ -41888,18 +46933,18 @@ "properties": { "name": { "type": "string", - "description": "Name of tracker object", + "description": "Name of tracker object.", "title": "Name" }, "interface": { "type": "string", - "description": "Name of tracked interface", + "description": "Name of tracked interface.", "title": "Interface" }, "tracked_property": { "type": "string", "default": "line-protocol", - "description": "Property to track", + "description": "Property to track.", "title": "Tracked Property" } }, @@ -41941,14 +46986,14 @@ "properties": { "name": { "type": "string", - "description": "IPv4 Prefix Field Set Name", + "description": "IPv4 Prefix Field Set Name.", "title": "Name" }, "prefixes": { "type": "array", "items": { "type": "string", - "description": "IPv4 Prefix" + "description": "IPv4 Prefix." }, "title": "Prefixes" } @@ -41970,14 +47015,14 @@ "properties": { "name": { "type": "string", - "description": "IPv6 Prefix Field Set Name", + "description": "IPv6 Prefix Field Set Name.", "title": "Name" }, "prefixes": { "type": "array", "items": { "type": "string", - "description": "IPv6 Prefix" + "description": "IPv6 Prefix." }, "title": "Prefixes" } @@ -41999,7 +47044,7 @@ "properties": { "name": { "type": "string", - "description": "L4 Port Field Set Name", + "description": "L4 Port Field Set Name.", "title": "Name" }, "port_range": { @@ -42032,7 +47077,7 @@ "properties": { "name": { "type": "string", - "description": "Traffic Policy Name", + "description": "Traffic Policy Name.", "title": "Name" }, "matches": { @@ -42042,7 +47087,7 @@ "properties": { "name": { "type": "string", - "description": "Traffic Policy Item", + "description": "Traffic Policy Item.", "title": "Name" }, "type": { @@ -42060,13 +47105,13 @@ "type": "array", "items": { "type": "string", - "description": "IP address or prefix" + "description": "IP address or prefix." }, "title": "Prefixes" }, "prefix_lists": { "type": "array", - "description": "Field-set prefix lists", + "description": "Field-set prefix lists.", "items": { "type": "string" }, @@ -42086,13 +47131,13 @@ "type": "array", "items": { "type": "string", - "description": "IP address or prefix" + "description": "IP address or prefix." }, "title": "Prefixes" }, "prefix_lists": { "type": "array", - "description": "Field-set prefix lists", + "description": "Field-set prefix lists.", "items": { "type": "string" }, @@ -42107,16 +47152,16 @@ }, "ttl": { "type": "string", - "description": "TTL range", + "description": "TTL range.", "title": "TTL" }, "fragment": { "type": "object", - "description": "The 'fragment' command is not supported when 'source port'\nor 'destination port' command is configured\n", + "description": "The 'fragment' command is not supported when 'source port'\nor 'destination port' command is configured.\n", "properties": { "offset": { "type": "string", - "description": "Fragment offset range", + "description": "Fragment offset range.", "title": "Offset" } }, @@ -42137,22 +47182,22 @@ }, "src_port": { "type": "string", - "description": "Port range", + "description": "Port range.", "title": "Src Port" }, "dst_port": { "type": "string", - "description": "Port range", + "description": "Port range.", "title": "Dst Port" }, "src_field": { "type": "string", - "description": "L4 port range field set", + "description": "L4 port range field set.", "title": "Src Field" }, "dst_field": { "type": "string", - "description": "L4 port range field set", + "description": "L4 port range field set.", "title": "Dst Field" }, "flags": { @@ -42193,12 +47238,12 @@ }, "traffic_class": { "type": "integer", - "description": "Traffic class ID", + "description": "Traffic class ID.", "title": "Traffic Class" }, "count": { "type": "string", - "description": "Counter name", + "description": "Counter name.", "title": "Count" }, "drop": { @@ -42207,7 +47252,7 @@ }, "log": { "type": "boolean", - "description": "Only supported when action is set to drop", + "description": "Only supported when action is set to drop.", "title": "Log" } }, @@ -42240,12 +47285,12 @@ }, "traffic_class": { "type": "integer", - "description": "Traffic class ID", + "description": "Traffic class ID.", "title": "Traffic Class" }, "count": { "type": "string", - "description": "Counter name", + "description": "Counter name.", "title": "Count" }, "drop": { @@ -42254,7 +47299,7 @@ }, "log": { "type": "boolean", - "description": "Only supported when action is set to drop", + "description": "Only supported when action is set to drop.", "title": "Log" } }, @@ -42273,12 +47318,12 @@ }, "traffic_class": { "type": "integer", - "description": "Traffic class ID", + "description": "Traffic class ID.", "title": "Traffic Class" }, "count": { "type": "string", - "description": "Counter name", + "description": "Counter name.", "title": "Count" }, "drop": { @@ -42287,7 +47332,7 @@ }, "log": { "type": "boolean", - "description": "Only supported when action is set to drop", + "description": "Only supported when action is set to drop.", "title": "Log" } }, @@ -42335,7 +47380,7 @@ "properties": { "name": { "type": "string", - "description": "Tunnel Interface Name", + "description": "Tunnel Interface Name.", "title": "Name" }, "description": { @@ -42354,12 +47399,12 @@ }, "vrf": { "type": "string", - "description": "VRF Name", + "description": "VRF Name.", "title": "VRF" }, "ip_address": { "type": "string", - "description": "IPv4_address/Mask", + "description": "IPv4_address/Mask.", "title": "IP Address" }, "ipv6_enable": { @@ -42368,26 +47413,26 @@ }, "ipv6_address": { "type": "string", - "description": "IPv6_address/Mask", + "description": "IPv6_address/Mask.", "title": "IPv6 Address" }, "access_group_in": { - "description": "IPv4 ACL Name for ingress", + "description": "IPv4 ACL Name for ingress.", "type": "string", "title": "Access Group In" }, "access_group_out": { - "description": "IPv4 ACL Name for egress", + "description": "IPv4 ACL Name for egress.", "type": "string", "title": "Access Group Out" }, "ipv6_access_group_in": { - "description": "IPv6 ACL Name for ingress", + "description": "IPv6 ACL Name for ingress.", "type": "string", "title": "IPv6 Access Group In" }, "ipv6_access_group_out": { - "description": "IPv6 ACL Name for egress", + "description": "IPv6 ACL Name for egress.", "type": "string", "title": "IPv6 Access Group Out" }, @@ -42396,14 +47441,14 @@ "properties": { "ipv4": { "type": "integer", - "description": "Segment Size for IPv4", + "description": "Segment Size for IPv4.", "minimum": 64, "maximum": 65495, "title": "IPv4" }, "ipv6": { "type": "integer", - "description": "Segment Size for IPv6", + "description": "Segment Size for IPv6.", "minimum": 64, "maximum": 65475, "title": "IPv6" @@ -42414,7 +47459,7 @@ "ingress", "egress" ], - "description": "Optional direction ('ingress', 'egress') for tcp mss ceiling\n", + "description": "Optional direction ('ingress', 'egress') for tcp mss ceiling.\n", "title": "Direction" } }, @@ -42435,17 +47480,17 @@ }, "source_interface": { "type": "string", - "description": "Tunnel Source Interface Name", + "description": "Tunnel Source Interface Name.", "title": "Source Interface" }, "destination": { "type": "string", - "description": "IPv4 or IPv6 Address Tunnel Destination", + "description": "IPv4 or IPv6 Address Tunnel Destination.", "title": "Destination" }, "path_mtu_discovery": { "type": "boolean", - "description": "Enable Path MTU Discovery On Tunnel", + "description": "Enable Path MTU Discovery On Tunnel.", "title": "Path MTU Discovery" }, "ipsec_profile": { @@ -42481,12 +47526,12 @@ "properties": { "name": { "type": "string", - "description": "VRF Name", + "description": "VRF Name.", "title": "Name" }, "ip_address": { "type": "string", - "description": "IPv4 Address", + "description": "IPv4 Address.", "title": "IP Address" } }, @@ -42507,7 +47552,7 @@ "properties": { "name": { "type": "string", - "description": "VLAN interface name like \"Vlan123\"", + "description": "VLAN interface name like \"Vlan123\".", "title": "Name" }, "description": { @@ -42544,12 +47589,12 @@ }, "vrf": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "VRF" }, "arp_aging_timeout": { "type": "integer", - "description": "In seconds", + "description": "In seconds.", "minimum": 1, "maximum": 65535, "title": "ARP Aging Timeout" @@ -42578,14 +47623,14 @@ }, "ip_address": { "type": "string", - "description": "IPv4_address/Mask", + "description": "IPv4_address/Mask.", "title": "IP Address" }, "ip_address_secondaries": { "type": "array", "items": { "type": "string", - "description": "IPv4_address/Mask" + "description": "IPv4_address/Mask." }, "title": "IP Address Secondaries" }, @@ -42593,20 +47638,20 @@ "type": "array", "items": { "type": "string", - "description": "IPv4 address or IPv4_address/Mask" + "description": "IPv4 address or IPv4_address/Mask." }, "title": "IP Virtual Router Addresses" }, "ip_address_virtual": { "type": "string", - "description": "IPv4_address/Mask", + "description": "IPv4_address/Mask.", "title": "IP Address Virtual" }, "ip_address_virtual_secondaries": { "type": "array", "items": { "type": "string", - "description": "IPv4_address/Mask" + "description": "IPv4_address/Mask." }, "title": "IP Address Virtual Secondaries" }, @@ -42742,23 +47787,23 @@ }, "ip_helpers": { "type": "array", - "description": "List of DHCP servers", + "description": "List of DHCP servers.", "items": { "type": "object", "properties": { "ip_helper": { "type": "string", - "description": "IP address or hostname of DHCP server", + "description": "IP address or hostname of DHCP server.", "title": "IP Helper" }, "source_interface": { "type": "string", - "description": "Interface used as source for forwarded DHCP packets", + "description": "Interface used as source for forwarded DHCP packets.", "title": "Source Interface" }, "vrf": { "type": "string", - "description": "VRF where DHCP server can be reached", + "description": "VRF where DHCP server can be reached.", "title": "VRF" } }, @@ -42772,6 +47817,11 @@ }, "title": "IP Helpers" }, + "ip_dhcp_relay_all_subnets": { + "type": "boolean", + "description": "Allow forwarding requests with secondary IP addresses in the gateway address \"giaddr\" field.", + "title": "IP DHCP Relay All Subnets" + }, "ip_nat": { "type": "object", "properties": { @@ -42820,7 +47870,7 @@ "properties": { "access_list": { "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Access List" }, "comment": { @@ -42840,16 +47890,17 @@ "type": "integer", "minimum": 1, "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Group" }, "original_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address. The combination of `original_ip` and `original_port` must be unique.", "title": "Original IP" }, "original_port": { "type": "integer", + "description": "TCP/UDP port. The combination of `original_ip` and `original_port` must be unique.", "minimum": 1, "maximum": 65535, "title": "Original Port" @@ -42870,20 +47921,19 @@ }, "translated_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.", "title": "Translated IP" }, "translated_port": { "type": "integer", "minimum": 1, "maximum": 65535, - "description": "requires 'original_port'", + "description": "requires 'original_port'.", "title": "Translated Port" } }, "required": [ - "translated_ip", - "original_ip" + "translated_ip" ], "additionalProperties": false, "patternProperties": { @@ -42927,7 +47977,7 @@ }, "pool_name": { "type": "string", - "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone\nignored if 'nat_type' is overload\n", + "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone.\nignored if 'nat_type' is overload.\n", "title": "Pool Name" }, "priority": { @@ -42955,7 +48005,7 @@ "properties": { "access_list": { "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Access List" }, "comment": { @@ -42975,16 +48025,17 @@ "type": "integer", "minimum": 1, "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Group" }, "original_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address. The combination of `original_ip` and `original_port` must be unique.", "title": "Original IP" }, "original_port": { "type": "integer", + "description": "TCP/UDP port. The combination of `original_ip` and `original_port` must be unique.", "minimum": 1, "maximum": 65535, "title": "Original Port" @@ -43005,20 +48056,19 @@ }, "translated_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.", "title": "Translated IP" }, "translated_port": { "type": "integer", "minimum": 1, "maximum": 65535, - "description": "requires 'original_port'", + "description": "requires 'original_port'.", "title": "Translated Port" } }, "required": [ - "translated_ip", - "original_ip" + "translated_ip" ], "additionalProperties": false, "patternProperties": { @@ -43047,12 +48097,12 @@ }, "ipv6_address": { "type": "string", - "description": "IPv6_address/Mask", + "description": "IPv6_address/Mask.", "title": "IPv6 Address" }, "ipv6_address_virtual": { "type": "string", - "description": "IPv6_address/Mask\nIf both \"ipv6_address_virtual\" and \"ipv6_address_virtuals\" are set, all addresses will be configured\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use ipv6_address_virtuals instead.", + "description": "IPv6_address/Mask.\nIf both \"ipv6_address_virtual\" and \"ipv6_address_virtuals\" are set, all addresses will be configured.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use ipv6_address_virtuals instead.", "deprecated": true, "title": "IPv6 Address Virtual" }, @@ -43061,13 +48111,13 @@ "description": "The new \"ipv6_address_virtuals\" key support multiple virtual ipv6 addresses.", "items": { "type": "string", - "description": "IPv6_address/Mask" + "description": "IPv6_address/Mask." }, "title": "IPv6 Address Virtuals" }, "ipv6_address_link_local": { "type": "string", - "description": "IPv6_address/Mask", + "description": "IPv6_address/Mask.", "title": "IPv6 Address Link Local" }, "ipv6_virtual_router_address": { @@ -43081,7 +48131,7 @@ "description": "Improved \"VARPv6\" data model to support multiple VARPv6 addresses.", "items": { "type": "string", - "description": "IPv6 address or IPv6_address/Mask" + "description": "IPv6 address or IPv6_address/Mask." }, "title": "IPv6 Virtual Router Addresses" }, @@ -43093,6 +48143,41 @@ "type": "boolean", "title": "IPv6 ND Managed Config Flag" }, + "ipv6_nd_other_config_flag": { + "type": "boolean", + "description": "Set the \"other stateful configuration\" flag in IPv6 router advertisements.", + "title": "IPv6 ND Other Config Flag" + }, + "ipv6_nd_cache": { + "type": "object", + "description": "IPv6 neighbor cache options.", + "properties": { + "dynamic_capacity": { + "type": "integer", + "description": "Capacity of dynamic cache entries.", + "minimum": 0, + "maximum": 4294967295, + "title": "Dynamic Capacity" + }, + "expire": { + "type": "integer", + "description": "Cache entries expirery in seconds.", + "minimum": 1, + "maximum": 65535, + "title": "Expire" + }, + "refresh_always": { + "type": "boolean", + "description": "Force refresh on cache expiry.", + "title": "Refresh Always" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IPv6 ND Cache" + }, "ipv6_nd_prefixes": { "type": "array", "items": { @@ -43100,17 +48185,17 @@ "properties": { "ipv6_prefix": { "type": "string", - "description": "IPv6_address/Mask", + "description": "IPv6_address/Mask.", "title": "IPv6 Prefix" }, "valid_lifetime": { "type": "string", - "description": "In seconds <0-4294967295> or infinite", + "description": "In seconds <0-4294967295> or infinite.", "title": "Valid Lifetime" }, "preferred_lifetime": { "type": "string", - "description": "In seconds <0-4294967295> or infinite", + "description": "In seconds <0-4294967295> or infinite.", "title": "Preferred Lifetime" }, "no_autoconfig_flag": { @@ -43135,7 +48220,7 @@ "properties": { "address": { "type": "string", - "description": "DHCP server's IPv6 address", + "description": "DHCP server's IPv6 address.", "title": "Address" }, "vrf": { @@ -43144,17 +48229,17 @@ }, "local_interface": { "type": "string", - "description": "Local interface to communicate with DHCP server - mutually exclusive to source_address", + "description": "Local interface to communicate with DHCP server - mutually exclusive to source_address.", "title": "Local Interface" }, "source_address": { "type": "string", - "description": "Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface", + "description": "Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface.", "title": "Source Address" }, "link_address": { "type": "string", - "description": "Override the default link address specified in the relayed DHCP packet", + "description": "Override the default link address specified in the relayed DHCP packet.", "title": "Link Address" } }, @@ -43168,24 +48253,29 @@ }, "title": "IPv6 DHCP Relay Destinations" }, + "ipv6_dhcp_relay_all_subnets": { + "type": "boolean", + "description": "Allow forwarding requests with additional IPv6 addresses in the gateway address \"giaddr\" field.", + "title": "IPv6 DHCP Relay All Subnets" + }, "access_group_in": { "type": "string", - "description": "IPv4 access-list name", + "description": "IPv4 access-list name.", "title": "Access Group In" }, "access_group_out": { "type": "string", - "description": "IPv4 access-list name", + "description": "IPv4 access-list name.", "title": "Access Group Out" }, "ipv6_access_group_in": { "type": "string", - "description": "IPv6 access-list name", + "description": "IPv6 access-list name.", "title": "IPv6 Access Group In" }, "ipv6_access_group_out": { "type": "string", - "description": "IPv6 access-list name", + "description": "IPv6 access-list name.", "title": "IPv6 Access Group Out" }, "multicast": { @@ -43196,13 +48286,13 @@ "properties": { "boundaries": { "type": "array", - "description": "Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both", + "description": "Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both.", "items": { "type": "object", "properties": { "boundary": { "type": "string", - "description": "IPv4 access-list name or IPv4 multicast group prefix with mask", + "description": "IPv4 access-list name or IPv4 multicast group prefix with mask.", "title": "Boundary" }, "out": { @@ -43259,13 +48349,13 @@ "properties": { "boundaries": { "type": "array", - "description": "Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both", + "description": "Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both.", "items": { "type": "object", "properties": { "boundary": { "type": "string", - "description": "IPv6 access-list name or IPv6 multicast group prefix with mask", + "description": "IPv6 access-list name or IPv6 multicast group prefix with mask.", "title": "Boundary" } }, @@ -43343,12 +48433,12 @@ }, "ospf_authentication_key": { "type": "string", - "description": "Encrypted password used for simple authentication", + "description": "Encrypted password used for simple authentication.", "title": "OSPF Authentication Key" }, "ospf_message_digest_keys": { "type": "array", - "description": "Keys used for message-digest authentication", + "description": "Keys used for message-digest authentication.", "items": { "type": "object", "properties": { @@ -43369,7 +48459,7 @@ }, "key": { "type": "string", - "description": "Encrypted password", + "description": "Encrypted password.", "title": "Key" } }, @@ -43455,9 +48545,14 @@ }, "isis_enable": { "type": "string", - "description": "ISIS instance name", + "description": "ISIS instance name.", "title": "ISIS Enable" }, + "isis_bfd": { + "type": "boolean", + "description": "Enable BFD for ISIS.", + "title": "ISIS BFD" + }, "isis_passive": { "type": "boolean", "title": "ISIS Passive" @@ -43480,18 +48575,18 @@ }, "vrrp_ids": { "type": "array", - "description": "Improved \"vrrp\" data model to support multiple VRRP IDs", + "description": "Improved \"vrrp\" data model to support multiple VRRP IDs.", "items": { "type": "object", "properties": { "id": { "type": "integer", - "description": "VRID", + "description": "VRID.", "title": "ID" }, "priority_level": { "type": "integer", - "description": "Instance priority", + "description": "Instance priority.", "minimum": 1, "maximum": 254, "title": "Priority Level" @@ -43501,7 +48596,7 @@ "properties": { "interval": { "type": "integer", - "description": "Interval in seconds", + "description": "Interval in seconds.", "minimum": 1, "maximum": 255, "title": "Interval" @@ -43525,14 +48620,14 @@ "properties": { "minimum": { "type": "integer", - "description": "Minimum preempt delay in seconds", + "description": "Minimum preempt delay in seconds.", "minimum": 0, "maximum": 3600, "title": "Minimum" }, "reload": { "type": "integer", - "description": "Reload preempt delay in seconds", + "description": "Reload preempt delay in seconds.", "minimum": 0, "maximum": 3600, "title": "Reload" @@ -43588,14 +48683,14 @@ "properties": { "name": { "type": "string", - "description": "Tracked object name", + "description": "Tracked object name.", "title": "Name" }, "decrement": { "type": "integer", "minimum": 1, "maximum": 254, - "description": "Decrement VRRP priority by 1-254", + "description": "Decrement VRRP priority by 1-254.", "title": "Decrement" }, "shutdown": { @@ -43618,7 +48713,7 @@ "properties": { "address": { "type": "string", - "description": "Virtual IPv4 address", + "description": "Virtual IPv4 address.", "title": "Address" }, "version": { @@ -43644,7 +48739,7 @@ "properties": { "address": { "type": "string", - "description": "Virtual IPv6 address", + "description": "Virtual IPv6 address.", "title": "Address" } }, @@ -43675,12 +48770,12 @@ "properties": { "virtual_router": { "type": "string", - "description": "Virtual Router ID", + "description": "Virtual Router ID.", "title": "Virtual Router" }, "priority": { "type": "integer", - "description": "Instance priority", + "description": "Instance priority.", "title": "Priority" }, "advertisement_interval": { @@ -43693,12 +48788,12 @@ }, "ipv4": { "type": "string", - "description": "Virtual IPv4 address", + "description": "Virtual IPv4 address.", "title": "IPv4" }, "ipv6": { "type": "string", - "description": "Virtual IPv6 address", + "description": "Virtual IPv6 address.", "title": "IPv6" } }, @@ -43771,12 +48866,12 @@ }, "interval": { "type": "integer", - "description": "Rate in milliseconds", + "description": "Rate in milliseconds.", "title": "Interval" }, "min_rx": { "type": "integer", - "description": "Minimum RX hold time in milliseconds", + "description": "Minimum RX hold time in milliseconds.", "title": "Min RX" }, "multiplier": { @@ -43800,7 +48895,7 @@ "properties": { "input": { "type": "string", - "description": "Name of policy-map used for policy based routing", + "description": "Name of policy-map used for policy based routing.", "title": "Input" } }, @@ -43819,12 +48914,12 @@ }, "pvlan_mapping": { "type": "string", - "description": "List of VLANs as string", + "description": "List of VLANs as string.", "title": "PVLAN Mapping" }, "tenant": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Tenant" }, "tags": { @@ -43832,17 +48927,17 @@ "items": { "type": "string" }, - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Tags" }, "type": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Type" }, "eos_cli": { "type": "string", - "description": "Multiline EOS CLI rendered directly on the VLAN interface in the final EOS configuration", + "description": "Multiline EOS CLI rendered directly on the VLAN interface in the final EOS configuration.", "title": "EOS CLI" } }, @@ -43913,12 +49008,12 @@ "properties": { "id": { "type": "integer", - "description": "VLAN ID", + "description": "VLAN ID.", "title": "ID" }, "name": { "type": "string", - "description": "VLAN Name", + "description": "VLAN Name.", "title": "Name" }, "state": { @@ -43933,7 +49028,7 @@ "type": "array", "items": { "type": "string", - "description": "Trunk Group Name" + "description": "Trunk Group Name." }, "title": "Trunk Groups" }, @@ -43950,7 +49045,7 @@ }, "primary_vlan": { "type": "integer", - "description": "Primary VLAN ID", + "description": "Primary VLAN ID.", "title": "Primary VLAN" } }, @@ -43962,7 +49057,7 @@ }, "tenant": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Tenant" } }, @@ -43983,7 +49078,7 @@ "properties": { "name": { "type": "string", - "description": "Vmtracer Session Name", + "description": "Vmtracer Session Name.", "title": "Name" }, "url": { @@ -43996,7 +49091,7 @@ }, "password": { "type": "string", - "description": "Type 7 Password Hash", + "description": "Type 7 Password Hash.", "title": "Password" }, "autovlan_disable": { @@ -44020,13 +49115,13 @@ }, "vrfs": { "type": "array", - "description": "These keys are ignored if the name of the vrf is 'default'\n", + "description": "These keys are ignored if the name of the vrf is 'default'.\n", "items": { "type": "object", "properties": { "name": { "type": "string", - "description": "VRF Name", + "description": "VRF Name.", "title": "Name" }, "description": { @@ -44047,7 +49142,7 @@ }, "tenant": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Tenant" } }, @@ -44076,7 +49171,7 @@ "properties": { "source_interface": { "type": "string", - "description": "Source Interface Name", + "description": "Source Interface Name.", "title": "Source Interface" }, "multicast": { @@ -44095,7 +49190,7 @@ }, "controller_client": { "type": "object", - "description": "Client to CVX Controllers", + "description": "Client to CVX Controllers.", "properties": { "enabled": { "type": "boolean", @@ -44123,7 +49218,7 @@ }, "virtual_router_encapsulation_mac_address": { "type": "string", - "description": "\"mlag-system-id\" or ethernet_address (H.H.H)\n", + "description": "\"mlag-system-id\" or ethernet_address (H.H.H).\n", "title": "Virtual Router Encapsulation MAC Address" }, "bfd_vtep_evpn": { @@ -44185,7 +49280,7 @@ "properties": { "id": { "type": "integer", - "description": "VLAN ID", + "description": "VLAN ID.", "title": "ID" }, "vni": { @@ -44194,14 +49289,14 @@ }, "multicast_group": { "type": "string", - "description": "IP Multicast Group Address", + "description": "IP Multicast Group Address.", "title": "Multicast Group" }, "flood_vteps": { "type": "array", "items": { "type": "string", - "description": "Remote VTEP IP Address" + "description": "Remote VTEP IP Address." }, "title": "Flood Vteps" } @@ -44223,7 +49318,7 @@ "properties": { "name": { "type": "string", - "description": "VRF Name", + "description": "VRF Name.", "title": "Name" }, "vni": { @@ -44232,7 +49327,7 @@ }, "multicast_group": { "type": "string", - "description": "IP Multicast Group Address", + "description": "IP Multicast Group Address.", "title": "Multicast Group" } }, @@ -44250,7 +49345,7 @@ "type": "array", "items": { "type": "string", - "description": "Remote VTEP IP Address" + "description": "Remote VTEP IP Address." }, "title": "Flood Vteps" }, @@ -44370,6 +49465,19 @@ "non_mlag": 330 } }, + { + "platforms": [ + "7010TX" + ], + "feature_support": { + "queue_monitor_length_notify": false, + "per_interface_mtu": false + }, + "reload_delay": { + "mlag": 300, + "non_mlag": 330 + } + }, { "platforms": [ "7280R", @@ -44489,6 +49597,34 @@ "mlag": 300, "non_mlag": 330 } + }, + { + "platforms": [ + "AWE-5310", + "AWE-5510", + "AWE-7250R", + "AWE-7230R" + ], + "feature_support": { + "bgp_update_wait_for_convergence": true, + "bgp_update_wait_install": false, + "interface_storm_control": false, + "queue_monitor_length_notify": false + }, + "management_interface": "Management1/1" + }, + { + "platforms": [ + "AWE-7220R" + ], + "feature_support": { + "bgp_update_wait_for_convergence": true, + "bgp_update_wait_install": false, + "interface_storm_control": false, + "queue_monitor_length_notify": false, + "poe": true + }, + "management_interface": "Management1" } ], "title": "Platform Settings" @@ -44569,7 +49705,7 @@ }, "description": { "type": "string", - "description": "By default the description is built leveraging `_`.\nWhen set this key will overide the default value on the physical ports.\n", + "description": "By default the description is built leveraging `_`.\nWhen set this key will override the default value on the physical ports.\n", "title": "Description" }, "enabled": { @@ -44599,14 +49735,14 @@ "type": "integer", "minimum": 68, "maximum": 65535, - "description": "\"l2_mtu\" should only be defined for platforms supporting the \"l2 mtu\" CLI\n", + "description": "\"l2_mtu\" should only be defined for platforms supporting the \"l2 mtu\" CLI.\n", "title": "L2 MTU" }, "l2_mru": { "type": "integer", "minimum": 68, "maximum": 65535, - "description": "\"l2_mru\" should only be defined for platforms supporting the \"l2 mru\" CLI\n", + "description": "\"l2_mru\" should only be defined for platforms supporting the \"l2 mru\" CLI.\n", "title": "L2 MRU" }, "native_vlan": { @@ -44706,7 +49842,7 @@ }, "qos_profile": { "type": "string", - "description": "QOS profile name", + "description": "QOS profile name.", "title": "QOS Profile" }, "ptp": { @@ -44747,9 +49883,29 @@ }, "sflow": { "type": "boolean", - "description": "Configures sFlow on the interface. Overrides `fabric_sflow` setting.\n", + "description": "Configures sFlow on the interface. Overrides `fabric_sflow.endpoints` setting.", "title": "Sflow" }, + "flow_tracking": { + "type": "object", + "description": "Configures flow-tracking on the interface. Overrides `fabric_flow_tracking.endpoints` setting.", + "properties": { + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "name": { + "type": "string", + "description": "Flow tracker name as defined in flow_tracking_settings.", + "title": "Name" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Flow Tracking" + }, "link_tracking": { "type": "object", "description": "Configure the downstream interfaces of a respective Link Tracking Group.\nIf `port_channel` is defined in an adapter, then the port-channel interface is configured to be the downstream.\nElse all the ethernet interfaces will be configured as downstream -> to configure single-active EVPN multihomed networks.\n", @@ -44962,11 +50118,11 @@ "medium", "low" ], - "description": "Prioritize a port's power in the event that one of the switch's power supplies loses power", + "description": "Prioritize a port's power in the event that one of the switch's power supplies loses power.", "title": "Priority" }, "reboot": { - "description": "Set the PoE power behavior for a PoE port when the system is rebooted", + "description": "Set the PoE power behavior for a PoE port when the system is rebooted.", "type": "object", "properties": { "action": { @@ -44975,7 +50131,7 @@ "maintain", "power-off" ], - "description": "PoE action for interface", + "description": "PoE action for interface.", "title": "Action" } }, @@ -44986,7 +50142,7 @@ "title": "Reboot" }, "link_down": { - "description": "Set the PoE power behavior for a PoE port when the port goes down", + "description": "Set the PoE power behavior for a PoE port when the port goes down.", "type": "object", "properties": { "action": { @@ -44995,7 +50151,7 @@ "maintain", "power-off" ], - "description": "PoE action for interface", + "description": "PoE action for interface.", "title": "Action" }, "power_off_delay": { @@ -45013,7 +50169,7 @@ "title": "Link Down" }, "shutdown": { - "description": "Set the PoE power behavior for a PoE port when the port is admin down", + "description": "Set the PoE power behavior for a PoE port when the port is admin down.", "type": "object", "properties": { "action": { @@ -45022,7 +50178,7 @@ "maintain", "power-off" ], - "description": "PoE action for interface", + "description": "PoE action for interface.", "title": "Action" } }, @@ -45048,7 +50204,7 @@ }, "fixed": { "type": "boolean", - "description": "Set to ignore hardware classification", + "description": "Set to ignore hardware classification.", "title": "Fixed" } }, @@ -45312,7 +50468,7 @@ }, "size": { "type": "integer", - "description": "Size in bytes", + "description": "Size in bytes.", "title": "Size" } }, @@ -45421,6 +50577,12 @@ "description": "Port-Channel administrative state.\nSetting to false will set port to 'shutdown' in intended configuration.\n", "title": "Enabled" }, + "ptp_mpass": { + "type": "boolean", + "default": false, + "description": "When MPASS is enabled on an MLAG port-channel, MLAG peers coordinate to function as a single PTP logical device.\nArista PTP enabled devices always place PTP messages on the same physical link within the port-channel.\nHence, MPASS is needed only on MLAG port-channels connected to non-Arista devices.", + "title": "PTP Mpass" + }, "short_esi": { "type": "string", "description": "In format xxxx:xxxx:xxxx or \"auto\".\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use ethernet_segment.short_esi instead.", @@ -45501,12 +50663,12 @@ "properties": { "number": { "type": "integer", - "description": "Subinterface number", + "description": "Subinterface number.", "title": "Number" }, "short_esi": { "type": "string", - "description": "In format xxxx:xxxx:xxxx or \"auto\"\nRequired for multihomed port-channels with subinterfaces\n", + "description": "In format xxxx:xxxx:xxxx or \"auto\".\nRequired for multihomed port-channels with subinterfaces.\n", "title": "Short Esi" }, "vlan_id": { @@ -45595,19 +50757,19 @@ "type": "integer", "minimum": 68, "maximum": 65535, - "description": "\"l2_mtu\" should only be defined for platforms supporting the \"l2 mtu\" CLI\n", + "description": "\"l2_mtu\" should only be defined for platforms supporting the \"l2 mtu\" CLI.\n", "title": "L2 MTU" }, "l2_mru": { "type": "integer", "minimum": 68, "maximum": 65535, - "description": "\"l2_mru\" should only be defined for platforms supporting the \"l2 mru\" CLI\n", + "description": "\"l2_mru\" should only be defined for platforms supporting the \"l2 mru\" CLI.\n", "title": "L2 MRU" }, "vlans": { "type": "string", - "description": "List of switchport vlans as string\nFor a trunk port this would be a range like \"1-200,300\"\nFor an access port this would be a single vlan \"123\"\n", + "description": "List of switchport vlans as string.\nFor a trunk port this would be a range like \"1-200,300\".\nFor an access port this would be a single vlan \"123\".\n", "title": "VLANs" }, "snmp_trap_link_change": { @@ -45627,12 +50789,12 @@ }, "encapsulation_dot1q_vlan": { "type": "integer", - "description": "VLAN tag to configure on sub-interface", + "description": "VLAN tag to configure on sub-interface.", "title": "Encapsulation Dot1Q VLAN" }, "vrf": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "VRF" }, "encapsulation_vlan": { @@ -45646,17 +50808,17 @@ "properties": { "vlan": { "type": "integer", - "description": "Client VLAN ID", + "description": "Client VLAN ID.", "title": "VLAN" }, "outer": { "type": "integer", - "description": "Client Outer VLAN ID", + "description": "Client Outer VLAN ID.", "title": "Outer" }, "inner": { "type": "integer", - "description": "Client Inner VLAN ID", + "description": "Client Inner VLAN ID.", "title": "Inner" } }, @@ -45679,24 +50841,24 @@ }, "network": { "type": "object", - "description": "Network encapsulation are all optional, and skipped if using client unmatched", + "description": "Network encapsulation are all optional, and skipped if using client unmatched.", "properties": { "dot1q": { "type": "object", "properties": { "vlan": { "type": "integer", - "description": "Network VLAN ID", + "description": "Network VLAN ID.", "title": "VLAN" }, "outer": { "type": "integer", - "description": "Network Outer VLAN ID", + "description": "Network Outer VLAN ID.", "title": "Outer" }, "inner": { "type": "integer", - "description": "Network Inner VLAN ID", + "description": "Network Inner VLAN ID.", "title": "Inner" } }, @@ -45742,13 +50904,13 @@ }, "native_vlan": { "type": "integer", - "description": "If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence", + "description": "If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence.", "title": "Native VLAN" }, "native_vlan_tag": { "type": "boolean", "default": false, - "description": "If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence", + "description": "If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence.", "title": "Native VLAN Tag" }, "link_tracking_groups": { @@ -45758,7 +50920,7 @@ "properties": { "name": { "type": "string", - "description": "Group name", + "description": "Group name.", "title": "Name" }, "direction": { @@ -45809,12 +50971,12 @@ "properties": { "encapsulation_dot1q_vlan": { "type": "integer", - "description": "Vlan tag to configure on sub-interface", + "description": "Vlan tag to configure on sub-interface.", "title": "Encapsulation Dot1Q VLAN" }, "forwarding_profile": { "type": "string", - "description": "L2 protocol forwarding profile", + "description": "L2 protocol forwarding profile.", "title": "Forwarding Profile" } }, @@ -45832,7 +50994,7 @@ }, "mlag": { "type": "integer", - "description": "MLAG ID", + "description": "MLAG ID.", "minimum": 1, "maximum": 2000, "title": "MLAG" @@ -45846,7 +51008,7 @@ }, "lacp_fallback_timeout": { "type": "integer", - "description": "Timeout in seconds", + "description": "Timeout in seconds.", "default": 90, "minimum": 0, "maximum": 300, @@ -45874,12 +51036,12 @@ }, "dscp": { "type": "integer", - "description": "DSCP value", + "description": "DSCP value.", "title": "DSCP" }, "cos": { "type": "integer", - "description": "COS value", + "description": "COS value.", "title": "COS" } }, @@ -45898,12 +51060,12 @@ }, "interval": { "type": "integer", - "description": "Interval in milliseconds", + "description": "Interval in milliseconds.", "title": "Interval" }, "min_rx": { "type": "integer", - "description": "Rate in milliseconds", + "description": "Rate in milliseconds.", "title": "Min RX" }, "multiplier": { @@ -45950,7 +51112,7 @@ "properties": { "input": { "type": "string", - "description": "Policy Based Routing Policy-map name", + "description": "Policy Based Routing Policy-map name.", "title": "Input" } }, @@ -45965,7 +51127,7 @@ "properties": { "input": { "type": "string", - "description": "Quality of Service Policy-map name", + "description": "Quality of Service Policy-map name.", "title": "Input" } }, @@ -46023,7 +51185,7 @@ }, "pvlan_mapping": { "type": "string", - "description": "List of vlans as string", + "description": "List of vlans as string.", "title": "PVLAN Mapping" }, "vlan_translations": { @@ -46033,12 +51195,12 @@ "properties": { "from": { "type": "string", - "description": "List of vlans as string (only one vlan if direction is \"both\")", + "description": "List of vlans as string (only one vlan if direction is \"both\").", "title": "From" }, "to": { "type": "integer", - "description": "VLAN ID", + "description": "VLAN ID.", "title": "To" }, "direction": { @@ -46064,7 +51226,7 @@ "properties": { "rate": { "type": "string", - "description": "Rate in kbps, pps or percent\nSupported options are platform dependent\nExamples:\n- \"5000 kbps\"\n- \"1000 pps\"\n- \"20 percent\"\n", + "description": "Rate in kbps, pps or percent.\nSupported options are platform dependent.\nExamples:\n- \"5000 kbps\"\n- \"1000 pps\"\n- \"20 percent\"\n", "title": "Rate" } }, @@ -46082,7 +51244,7 @@ "properties": { "level": { "type": "string", - "description": "Configure maximum storm-control level", + "description": "Configure maximum storm-control level.", "title": "Level" }, "unit": { @@ -46092,7 +51254,7 @@ "percent", "pps" ], - "description": "Optional field and is hardware dependent", + "description": "Optional field and is hardware dependent.", "title": "Unit" } }, @@ -46107,7 +51269,7 @@ "properties": { "level": { "type": "string", - "description": "Configure maximum storm-control level", + "description": "Configure maximum storm-control level.", "title": "Level" }, "unit": { @@ -46117,7 +51279,7 @@ "percent", "pps" ], - "description": "Optional field and is hardware dependent", + "description": "Optional field and is hardware dependent.", "title": "Unit" } }, @@ -46132,7 +51294,7 @@ "properties": { "level": { "type": "string", - "description": "Configure maximum storm-control level", + "description": "Configure maximum storm-control level.", "title": "Level" }, "unit": { @@ -46142,7 +51304,7 @@ "percent", "pps" ], - "description": "Optional field and is hardware dependent", + "description": "Optional field and is hardware dependent.", "title": "Unit" } }, @@ -46157,7 +51319,7 @@ "properties": { "level": { "type": "string", - "description": "Configure maximum storm-control level", + "description": "Configure maximum storm-control level.", "title": "Level" }, "unit": { @@ -46167,7 +51329,7 @@ "percent", "pps" ], - "description": "Optional field and is hardware dependent", + "description": "Optional field and is hardware dependent.", "title": "Unit" } }, @@ -46190,9 +51352,14 @@ }, "isis_enable": { "type": "string", - "description": "ISIS instance", + "description": "ISIS instance.", "title": "ISIS Enable" }, + "isis_bfd": { + "type": "boolean", + "description": "Enable BFD for ISIS.", + "title": "ISIS BFD" + }, "isis_passive": { "type": "boolean", "title": "ISIS Passive" @@ -46228,7 +51395,7 @@ }, "isis_authentication_key": { "type": "string", - "description": "Type-7 encrypted password", + "description": "Type-7 encrypted password.", "title": "ISIS Authentication Key" }, "traffic_policy": { @@ -46236,12 +51403,12 @@ "properties": { "input": { "type": "string", - "description": "Ingress traffic policy", + "description": "Ingress traffic policy.", "title": "Input" }, "output": { "type": "string", - "description": "Egress traffic policy", + "description": "Egress traffic policy.", "title": "Output" } }, @@ -46256,7 +51423,7 @@ "properties": { "identifier": { "type": "string", - "description": "EVPN Ethernet Segment Identifier (Type 1 format)", + "description": "EVPN Ethernet Segment Identifier (Type 1 format).", "title": "Identifier" }, "redundancy": { @@ -46282,12 +51449,12 @@ "type": "integer", "minimum": 0, "maximum": 65535, - "description": "Preference_value is only used when \"algorithm\" is \"preference\"", + "description": "Preference_value is only used when \"algorithm\" is \"preference\".", "title": "Preference Value" }, "dont_preempt": { "type": "boolean", - "description": "Dont_preempt is only used when \"algorithm\" is \"preference\"", + "description": "Dont_preempt is only used when \"algorithm\" is \"preference\".", "default": false, "title": "Dont Preempt" }, @@ -46332,7 +51499,7 @@ }, "route_target": { "type": "string", - "description": "EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx", + "description": "EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx.", "title": "Route Target" } }, @@ -46344,19 +51511,19 @@ }, "esi": { "type": "string", - "description": "EVPN Ethernet Segment Identifier (Type 1 format)\nIf both \"esi\" and \"evpn_ethernet_segment.identifier\" are defined, the new variable takes precedence\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use evpn_ethernet_segment.identifier instead.", + "description": "EVPN Ethernet Segment Identifier (Type 1 format).\nIf both \"esi\" and \"evpn_ethernet_segment.identifier\" are defined, the new variable takes precedence.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use evpn_ethernet_segment.identifier instead.", "deprecated": true, "title": "Esi" }, "rt": { "type": "string", - "description": "EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx\nIf both \"rt\" and \"evpn_ethernet_segment.route_target\" are defined, the new variable takes precedence\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use evpn_ethernet_segment.route_target instead.", + "description": "EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx.\nIf both \"rt\" and \"evpn_ethernet_segment.route_target\" are defined, the new variable takes precedence.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use evpn_ethernet_segment.route_target instead.", "deprecated": true, "title": "Rt" }, "lacp_id": { "type": "string", - "description": "LACP ID with format xxxx.xxxx.xxxx", + "description": "LACP ID with format xxxx.xxxx.xxxx.", "title": "LACP ID" }, "spanning_tree_bpdufilter": { @@ -46465,7 +51632,7 @@ }, "vlan": { "type": "string", - "description": "VLAN can be 'all' or list of vlans as string", + "description": "VLAN can be 'all' or list of vlans as string.", "title": "VLAN" }, "transport": { @@ -46476,6 +51643,11 @@ "layer2" ], "title": "Transport" + }, + "mpass": { + "type": "boolean", + "description": "When MPASS is enabled on an MLAG port-channel, MLAG peers coordinate to function as a single PTP logical device.\nArista PTP enabled devices always place PTP messages on the same physical link within the port-channel.\nHence, MPASS is needed only on MLAG port-channels connected to non-Arista devices.", + "title": "Mpass" } }, "additionalProperties": false, @@ -46486,7 +51658,7 @@ }, "ip_address": { "type": "string", - "description": "IPv4 address/mask", + "description": "IPv4 address/mask.", "title": "IP Address" }, "ip_verify_unicast_source_reachable_via": { @@ -46545,7 +51717,7 @@ "properties": { "access_list": { "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Access List" }, "comment": { @@ -46565,16 +51737,17 @@ "type": "integer", "minimum": 1, "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Group" }, "original_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address. The combination of `original_ip` and `original_port` must be unique.", "title": "Original IP" }, "original_port": { "type": "integer", + "description": "TCP/UDP port. The combination of `original_ip` and `original_port` must be unique.", "minimum": 1, "maximum": 65535, "title": "Original Port" @@ -46595,20 +51768,19 @@ }, "translated_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.", "title": "Translated IP" }, "translated_port": { "type": "integer", "minimum": 1, "maximum": 65535, - "description": "requires 'original_port'", + "description": "requires 'original_port'.", "title": "Translated Port" } }, "required": [ - "translated_ip", - "original_ip" + "translated_ip" ], "additionalProperties": false, "patternProperties": { @@ -46652,7 +51824,7 @@ }, "pool_name": { "type": "string", - "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone\nignored if 'nat_type' is overload\n", + "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone.\nignored if 'nat_type' is overload.\n", "title": "Pool Name" }, "priority": { @@ -46680,7 +51852,7 @@ "properties": { "access_list": { "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Access List" }, "comment": { @@ -46700,16 +51872,17 @@ "type": "integer", "minimum": 1, "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Group" }, "original_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address. The combination of `original_ip` and `original_port` must be unique.", "title": "Original IP" }, "original_port": { "type": "integer", + "description": "TCP/UDP port. The combination of `original_ip` and `original_port` must be unique.", "minimum": 1, "maximum": 65535, "title": "Original Port" @@ -46730,20 +51903,19 @@ }, "translated_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.", "title": "Translated IP" }, "translated_port": { "type": "integer", "minimum": 1, "maximum": 65535, - "description": "requires 'original_port'", + "description": "requires 'original_port'.", "title": "Translated Port" } }, "required": [ - "translated_ip", - "original_ip" + "translated_ip" ], "additionalProperties": false, "patternProperties": { @@ -46772,12 +51944,12 @@ }, "ipv6_address": { "type": "string", - "description": "IPv6 address/mask", + "description": "IPv6 address/mask.", "title": "IPv6 Address" }, "ipv6_address_link_local": { "type": "string", - "description": "Link local IPv6 address/mask", + "description": "Link local IPv6 address/mask.", "title": "IPv6 Address Link Local" }, "ipv6_nd_ra_disabled": { @@ -46799,12 +51971,12 @@ }, "valid_lifetime": { "type": "string", - "description": "Infinite or lifetime in seconds", + "description": "Infinite or lifetime in seconds.", "title": "Valid Lifetime" }, "preferred_lifetime": { "type": "string", - "description": "Infinite or lifetime in seconds", + "description": "Infinite or lifetime in seconds.", "title": "Preferred Lifetime" }, "no_autoconfig_flag": { @@ -46824,32 +51996,32 @@ }, "access_group_in": { "type": "string", - "description": "Access list name", + "description": "Access list name.", "title": "Access Group In" }, "access_group_out": { "type": "string", - "description": "Access list name", + "description": "Access list name.", "title": "Access Group Out" }, "ipv6_access_group_in": { "type": "string", - "description": "IPv6 access list name", + "description": "IPv6 access list name.", "title": "IPv6 Access Group In" }, "ipv6_access_group_out": { "type": "string", - "description": "IPv6 access list name", + "description": "IPv6 access list name.", "title": "IPv6 Access Group Out" }, "mac_access_group_in": { "type": "string", - "description": "MAC access list name", + "description": "MAC access list name.", "title": "MAC Access Group In" }, "mac_access_group_out": { "type": "string", - "description": "MAC access list name", + "description": "MAC access list name.", "title": "MAC Access Group Out" }, "pim": { @@ -46920,7 +52092,7 @@ }, "service_profile": { "type": "string", - "description": "QOS profile", + "description": "QOS profile.", "title": "Service Profile" }, "ospf_network_point_to_point": { @@ -46946,7 +52118,7 @@ }, "ospf_authentication_key": { "type": "string", - "description": "Encrypted password", + "description": "Encrypted password.", "title": "OSPF Authentication Key" }, "ospf_message_digest_keys": { @@ -46971,7 +52143,7 @@ }, "key": { "type": "string", - "description": "Encrypted password", + "description": "Encrypted password.", "title": "Key" } }, @@ -47010,7 +52182,7 @@ "properties": { "session_tracker": { "type": "string", - "description": "Name of session tracker", + "description": "Name of session tracker.", "title": "Session Tracker" } }, @@ -47134,17 +52306,17 @@ }, "peer": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Peer" }, "peer_interface": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Peer Interface" }, "peer_type": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Peer Type" }, "sflow": { @@ -47181,12 +52353,12 @@ }, "validate_state": { "type": "boolean", - "description": "Set to false to disable interface validation by the `eos_validate_state` role", + "description": "Set to false to disable interface validation by the `eos_validate_state` role.", "title": "Validate State" }, "eos_cli": { "type": "string", - "description": "Multiline EOS CLI rendered directly on the port-channel interface in the final EOS configuration", + "description": "Multiline EOS CLI rendered directly on the port-channel interface in the final EOS configuration.", "title": "EOS CLI" } }, @@ -47233,7 +52405,7 @@ "type": "integer", "minimum": 0, "maximum": 600, - "description": "Interval in seconds for updating interface counters\"", + "description": "Interval in seconds for updating interface counters.", "title": "Load Interval" }, "speed": { @@ -47251,19 +52423,19 @@ "type": "integer", "minimum": 68, "maximum": 65535, - "description": "\"l2_mtu\" should only be defined for platforms supporting the \"l2 mtu\" CLI\n", + "description": "\"l2_mtu\" should only be defined for platforms supporting the \"l2 mtu\" CLI.\n", "title": "L2 MTU" }, "l2_mru": { "type": "integer", "minimum": 68, "maximum": 65535, - "description": "\"l2_mru\" should only be defined for platforms supporting the \"l2 mru\" CLI\n", + "description": "\"l2_mru\" should only be defined for platforms supporting the \"l2 mru\" CLI.\n", "title": "L2 MRU" }, "vlans": { "type": "string", - "description": "List of switchport vlans as string\nFor a trunk port this would be a range like \"1-200,300\"\nFor an access port this would be a single vlan \"123\"\n", + "description": "List of switchport vlans as string.\nFor a trunk port this would be a range like \"1-200,300\".\nFor an access port this would be a single vlan \"123\".\n", "title": "VLANs" }, "native_vlan": { @@ -47272,7 +52444,7 @@ }, "native_vlan_tag": { "type": "boolean", - "description": "If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence", + "description": "If setting both native_vlan and native_vlan_tag, native_vlan_tag takes precedence.", "title": "Native VLAN Tag" }, "mode": { @@ -47316,12 +52488,12 @@ "properties": { "encapsulation_dot1q_vlan": { "type": "integer", - "description": "Vlan tag to configure on sub-interface", + "description": "Vlan tag to configure on sub-interface.", "title": "Encapsulation Dot1Q VLAN" }, "forwarding_profile": { "type": "string", - "description": "L2 protocol forwarding profile", + "description": "L2 protocol forwarding profile.", "title": "Forwarding Profile" } }, @@ -47359,12 +52531,12 @@ "properties": { "ipv4": { "type": "boolean", - "description": "Enable address locking for IPv4", + "description": "Enable address locking for IPv4.", "title": "IPv4" }, "ipv6": { "type": "boolean", - "description": "Enable address locking for IPv6", + "description": "Enable address locking for IPv6.", "title": "IPv6" } }, @@ -47395,7 +52567,7 @@ }, "vrf": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "VRF" }, "flow_tracker": { @@ -47448,7 +52620,7 @@ "properties": { "name": { "type": "string", - "description": "Group name", + "description": "Group name.", "title": "Name" }, "direction": { @@ -47475,7 +52647,7 @@ "properties": { "identifier": { "type": "string", - "description": "EVPN Ethernet Segment Identifier (Type 1 format)", + "description": "EVPN Ethernet Segment Identifier (Type 1 format).", "title": "Identifier" }, "redundancy": { @@ -47501,12 +52673,12 @@ "type": "integer", "minimum": 0, "maximum": 65535, - "description": "Preference_value is only used when \"algorithm\" is \"preference\"", + "description": "Preference_value is only used when \"algorithm\" is \"preference\".", "title": "Preference Value" }, "dont_preempt": { "type": "boolean", - "description": "Dont_preempt is only used when \"algorithm\" is \"preference\"", + "description": "Dont_preempt is only used when \"algorithm\" is \"preference\".", "title": "Dont Preempt" }, "hold_time": { @@ -47550,7 +52722,7 @@ }, "route_target": { "type": "string", - "description": "EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx", + "description": "EVPN Route Target for ESI with format xx:xx:xx:xx:xx:xx.", "title": "Route Target" } }, @@ -47562,7 +52734,7 @@ }, "encapsulation_dot1q_vlan": { "type": "integer", - "description": "VLAN tag to configure on sub-interface", + "description": "VLAN tag to configure on sub-interface.", "title": "Encapsulation Dot1Q VLAN" }, "encapsulation_vlan": { @@ -47576,17 +52748,17 @@ "properties": { "vlan": { "type": "integer", - "description": "Client VLAN ID", + "description": "Client VLAN ID.", "title": "VLAN" }, "outer": { "type": "integer", - "description": "Client Outer VLAN ID", + "description": "Client Outer VLAN ID.", "title": "Outer" }, "inner": { "type": "integer", - "description": "Client Inner VLAN ID", + "description": "Client Inner VLAN ID.", "title": "Inner" } }, @@ -47609,24 +52781,24 @@ }, "network": { "type": "object", - "description": "Network encapsulations are all optional and skipped if using client unmatched", + "description": "Network encapsulations are all optional and skipped if using client unmatched.", "properties": { "dot1q": { "type": "object", "properties": { "vlan": { "type": "integer", - "description": "Network VLAN ID", + "description": "Network VLAN ID.", "title": "VLAN" }, "outer": { "type": "integer", - "description": "Network outer VLAN ID", + "description": "Network outer VLAN ID.", "title": "Outer" }, "inner": { "type": "integer", - "description": "Network inner VLAN ID", + "description": "Network inner VLAN ID.", "title": "Inner" } }, @@ -47662,7 +52834,7 @@ }, "ip_address": { "type": "string", - "description": "IPv4 address/mask or \"dhcp\"", + "description": "IPv4 address/mask or \"dhcp\".", "title": "IP Address" }, "ip_address_secondaries": { @@ -47682,7 +52854,7 @@ }, "dhcp_client_accept_default_route": { "type": "boolean", - "description": "Install default-route obtained via DHCP", + "description": "Install default-route obtained via DHCP.", "title": "DHCP Client Accept Default Route" }, "dhcp_server_ipv4": { @@ -47706,12 +52878,12 @@ }, "source_interface": { "type": "string", - "description": "Source interface name", + "description": "Source interface name.", "title": "Source Interface" }, "vrf": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "VRF" } }, @@ -47778,7 +52950,7 @@ "properties": { "access_list": { "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Access List" }, "comment": { @@ -47798,16 +52970,17 @@ "type": "integer", "minimum": 1, "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Group" }, "original_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address. The combination of `original_ip` and `original_port` must be unique.", "title": "Original IP" }, "original_port": { "type": "integer", + "description": "TCP/UDP port. The combination of `original_ip` and `original_port` must be unique.", "minimum": 1, "maximum": 65535, "title": "Original Port" @@ -47828,20 +53001,19 @@ }, "translated_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.", "title": "Translated IP" }, "translated_port": { "type": "integer", "minimum": 1, "maximum": 65535, - "description": "requires 'original_port'", + "description": "requires 'original_port'.", "title": "Translated Port" } }, "required": [ - "translated_ip", - "original_ip" + "translated_ip" ], "additionalProperties": false, "patternProperties": { @@ -47885,7 +53057,7 @@ }, "pool_name": { "type": "string", - "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone\nignored if 'nat_type' is overload\n", + "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone.\nignored if 'nat_type' is overload.\n", "title": "Pool Name" }, "priority": { @@ -47913,7 +53085,7 @@ "properties": { "access_list": { "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Access List" }, "comment": { @@ -47933,16 +53105,17 @@ "type": "integer", "minimum": 1, "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Group" }, "original_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address. The combination of `original_ip` and `original_port` must be unique.", "title": "Original IP" }, "original_port": { "type": "integer", + "description": "TCP/UDP port. The combination of `original_ip` and `original_port` must be unique.", "minimum": 1, "maximum": 65535, "title": "Original Port" @@ -47963,20 +53136,19 @@ }, "translated_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.", "title": "Translated IP" }, "translated_port": { "type": "integer", "minimum": 1, "maximum": 65535, - "description": "requires 'original_port'", + "description": "requires 'original_port'.", "title": "Translated Port" } }, "required": [ - "translated_ip", - "original_ip" + "translated_ip" ], "additionalProperties": false, "patternProperties": { @@ -48009,7 +53181,7 @@ }, "ipv6_address_link_local": { "type": "string", - "description": "Link local IPv6 address/mask", + "description": "Link local IPv6 address/mask.", "title": "IPv6 Address Link Local" }, "ipv6_nd_ra_disabled": { @@ -48031,12 +53203,12 @@ }, "valid_lifetime": { "type": "string", - "description": "Infinite or lifetime in seconds", + "description": "Infinite or lifetime in seconds.", "title": "Valid Lifetime" }, "preferred_lifetime": { "type": "string", - "description": "Infinite or lifetime in seconds", + "description": "Infinite or lifetime in seconds.", "title": "Preferred Lifetime" }, "no_autoconfig_flag": { @@ -48061,7 +53233,7 @@ "properties": { "address": { "type": "string", - "description": "DHCP server's IPv6 address", + "description": "DHCP server's IPv6 address.", "title": "Address" }, "vrf": { @@ -48070,17 +53242,17 @@ }, "local_interface": { "type": "string", - "description": "Local interface to communicate with DHCP server - mutually exclusive to source_address", + "description": "Local interface to communicate with DHCP server - mutually exclusive to source_address.", "title": "Local Interface" }, "source_address": { "type": "string", - "description": "Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface", + "description": "Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface.", "title": "Source Address" }, "link_address": { "type": "string", - "description": "Override the default link address specified in the relayed DHCP packet", + "description": "Override the default link address specified in the relayed DHCP packet.", "title": "Link Address" } }, @@ -48096,37 +53268,37 @@ }, "access_group_in": { "type": "string", - "description": "Access list name", + "description": "Access list name.", "title": "Access Group In" }, "access_group_out": { "type": "string", - "description": "Access list name", + "description": "Access list name.", "title": "Access Group Out" }, "ipv6_access_group_in": { "type": "string", - "description": "IPv6 access list name", + "description": "IPv6 access list name.", "title": "IPv6 Access Group In" }, "ipv6_access_group_out": { "type": "string", - "description": "IPv6 access list name", + "description": "IPv6 access list name.", "title": "IPv6 Access Group Out" }, "mac_access_group_in": { "type": "string", - "description": "MAC access list name", + "description": "MAC access list name.", "title": "MAC Access Group In" }, "mac_access_group_out": { "type": "string", - "description": "MAC access list name", + "description": "MAC access list name.", "title": "MAC Access Group Out" }, "multicast": { "type": "object", - "description": "Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both", + "description": "Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both.", "properties": { "ipv4": { "type": "object", @@ -48138,7 +53310,7 @@ "properties": { "boundary": { "type": "string", - "description": "ACL name or multicast IP subnet", + "description": "ACL name or multicast IP subnet.", "title": "Boundary" }, "out": { @@ -48174,7 +53346,7 @@ "properties": { "boundary": { "type": "string", - "description": "ACL name or multicast IP subnet", + "description": "ACL name or multicast IP subnet.", "title": "Boundary" } }, @@ -48226,7 +53398,7 @@ }, "ospf_authentication_key": { "type": "string", - "description": "Encrypted password - only type 7 supported", + "description": "Encrypted password - only type 7 supported.", "title": "OSPF Authentication Key" }, "ospf_message_digest_keys": { @@ -48251,7 +53423,7 @@ }, "key": { "type": "string", - "description": "Encrypted password - only type 7 supported", + "description": "Encrypted password - only type 7 supported.", "title": "Key" } }, @@ -48345,6 +53517,37 @@ }, "title": "MAC Security" }, + "tcp_mss_ceiling": { + "type": "object", + "description": "The TCP MSS clamping feature involves clamping the maximum segment size (MSS) in the TCP header\nof TCP SYN packets if it exceeds the configured MSS ceiling limit for the interface.", + "properties": { + "ipv4_segment_size": { + "type": "integer", + "minimum": 64, + "maximum": 65475, + "title": "IPv4 Segment Size" + }, + "ipv6_segment_size": { + "type": "integer", + "minimum": 64, + "maximum": 65475, + "title": "IPv6 Segment Size" + }, + "direction": { + "type": "string", + "enum": [ + "egress", + "ingress" + ], + "title": "Direction" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "TCP Mss Ceiling" + }, "channel_group": { "type": "object", "properties": { @@ -48370,9 +53573,14 @@ }, "isis_enable": { "type": "string", - "description": "ISIS instance", + "description": "ISIS instance.", "title": "ISIS Enable" }, + "isis_bfd": { + "type": "boolean", + "description": "Enable BFD for ISIS.", + "title": "ISIS BFD" + }, "isis_passive": { "type": "boolean", "title": "ISIS Passive" @@ -48408,7 +53616,7 @@ }, "isis_authentication_key": { "type": "string", - "description": "Type-7 encrypted password", + "description": "Type-7 encrypted password.", "title": "ISIS Authentication Key" }, "poe": { @@ -48428,11 +53636,11 @@ "medium", "low" ], - "description": "Prioritize a port's power in the event that one of the switch's power supplies loses power", + "description": "Prioritize a port's power in the event that one of the switch's power supplies loses power.", "title": "Priority" }, "reboot": { - "description": "Set the PoE power behavior for a PoE port when the system is rebooted", + "description": "Set the PoE power behavior for a PoE port when the system is rebooted.", "type": "object", "properties": { "action": { @@ -48441,7 +53649,7 @@ "maintain", "power-off" ], - "description": "PoE action for interface", + "description": "PoE action for interface.", "title": "Action" } }, @@ -48452,7 +53660,7 @@ "title": "Reboot" }, "link_down": { - "description": "Set the PoE power behavior for a PoE port when the port goes down", + "description": "Set the PoE power behavior for a PoE port when the port goes down.", "type": "object", "properties": { "action": { @@ -48461,7 +53669,7 @@ "maintain", "power-off" ], - "description": "PoE action for interface", + "description": "PoE action for interface.", "title": "Action" }, "power_off_delay": { @@ -48479,7 +53687,7 @@ "title": "Link Down" }, "shutdown": { - "description": "Set the PoE power behavior for a PoE port when the port is admin down", + "description": "Set the PoE power behavior for a PoE port when the port is admin down.", "type": "object", "properties": { "action": { @@ -48488,7 +53696,7 @@ "maintain", "power-off" ], - "description": "PoE action for interface", + "description": "PoE action for interface.", "title": "Action" } }, @@ -48514,7 +53722,7 @@ }, "fixed": { "type": "boolean", - "description": "Set to ignore hardware classification", + "description": "Set to ignore hardware classification.", "title": "Fixed" } }, @@ -48602,7 +53810,7 @@ }, "vlan": { "type": "string", - "description": "VLAN can be 'all' or list of vlans as string", + "description": "VLAN can be 'all' or list of vlans as string.", "title": "VLAN" }, "transport": { @@ -48623,7 +53831,7 @@ }, "profile": { "type": "string", - "description": "Interface profile", + "description": "Interface profile.", "title": "Profile" }, "storm_control": { @@ -48634,7 +53842,7 @@ "properties": { "level": { "type": "string", - "description": "Configure maximum storm-control level", + "description": "Configure maximum storm-control level.", "title": "Level" }, "unit": { @@ -48644,7 +53852,7 @@ "percent", "pps" ], - "description": "Optional field and is hardware dependent", + "description": "Optional field and is hardware dependent.", "title": "Unit" } }, @@ -48659,7 +53867,7 @@ "properties": { "level": { "type": "string", - "description": "Configure maximum storm-control level", + "description": "Configure maximum storm-control level.", "title": "Level" }, "unit": { @@ -48669,7 +53877,7 @@ "percent", "pps" ], - "description": "Optional field and is hardware dependent", + "description": "Optional field and is hardware dependent.", "title": "Unit" } }, @@ -48684,7 +53892,7 @@ "properties": { "level": { "type": "string", - "description": "Configure maximum storm-control level", + "description": "Configure maximum storm-control level.", "title": "Level" }, "unit": { @@ -48694,7 +53902,7 @@ "percent", "pps" ], - "description": "Optional field and is hardware dependent", + "description": "Optional field and is hardware dependent.", "title": "Unit" } }, @@ -48709,7 +53917,7 @@ "properties": { "level": { "type": "string", - "description": "Configure maximum storm-control level", + "description": "Configure maximum storm-control level.", "title": "Level" }, "unit": { @@ -48719,7 +53927,7 @@ "percent", "pps" ], - "description": "Optional field and is hardware dependent", + "description": "Optional field and is hardware dependent.", "title": "Unit" } }, @@ -48786,7 +53994,7 @@ }, "ztp_vlan": { "type": "integer", - "description": "ZTP vlan number", + "description": "ZTP vlan number.", "title": "ZTP VLAN" } }, @@ -48802,7 +54010,7 @@ }, "pvlan_mapping": { "type": "string", - "description": "List of vlans as string", + "description": "List of vlans as string.", "title": "PVLAN Mapping" }, "vlan_translations": { @@ -48812,12 +54020,12 @@ "properties": { "from": { "type": "string", - "description": "List of vlans as string (only one vlan if direction is \"both\")", + "description": "List of vlans as string (only one vlan if direction is \"both\").", "title": "From" }, "to": { "type": "integer", - "description": "VLAN ID", + "description": "VLAN ID.", "title": "To" }, "direction": { @@ -48960,7 +54168,7 @@ }, "reauth_period": { "type": "string", - "description": "Value can be 60-4294967295 or 'server'", + "description": "Value can be 60-4294967295 or 'server'.", "title": "Reauth Period" }, "reauth_timeout_ignore": { @@ -49047,7 +54255,7 @@ }, "service_profile": { "type": "string", - "description": "QOS profile", + "description": "QOS profile.", "title": "Service Profile" }, "shape": { @@ -49055,7 +54263,7 @@ "properties": { "rate": { "type": "string", - "description": "Rate in kbps, pps or percent\nSupported options are platform dependent\nExamples:\n- \"5000 kbps\"\n- \"1000 pps\"\n- \"20 percent\"\n", + "description": "Rate in kbps, pps or percent.\nSupported options are platform dependent.\nExamples:\n- \"5000 kbps\"\n- \"1000 pps\"\n- \"20 percent\"\n", "title": "Rate" } }, @@ -49079,12 +54287,12 @@ }, "dscp": { "type": "integer", - "description": "DSCP value", + "description": "DSCP value.", "title": "DSCP" }, "cos": { "type": "integer", - "description": "COS value", + "description": "COS value.", "title": "COS" } }, @@ -49188,12 +54396,12 @@ }, "interval": { "type": "integer", - "description": "Interval in milliseconds", + "description": "Interval in milliseconds.", "title": "Interval" }, "min_rx": { "type": "integer", - "description": "Rate in milliseconds", + "description": "Rate in milliseconds.", "title": "Min RX" }, "multiplier": { @@ -49217,7 +54425,7 @@ "properties": { "input": { "type": "string", - "description": "Policy Based Routing Policy-map name", + "description": "Policy Based Routing Policy-map name.", "title": "Input" } }, @@ -49232,7 +54440,7 @@ "properties": { "input": { "type": "string", - "description": "Quality of Service Policy-map name", + "description": "Quality of Service Policy-map name.", "title": "Input" } }, @@ -49317,12 +54525,25 @@ "transceiver": { "type": "object", "properties": { + "frequency": { + "type": "string", + "description": "Transceiver Laser Frequency in GHz (min 190000, max 200000).", + "title": "Frequency" + }, + "frequency_unit": { + "type": "string", + "enum": [ + "ghz" + ], + "description": "Unit of Transceiver Laser Frequency.", + "title": "Frequency Unit" + }, "media": { "type": "object", "properties": { "override": { "type": "string", - "description": "Transceiver type", + "description": "Transceiver type.", "title": "Override" } }, @@ -49348,12 +54569,12 @@ "properties": { "input": { "type": "string", - "description": "Ingress traffic policy", + "description": "Ingress traffic policy.", "title": "Input" }, "output": { "type": "string", - "description": "Egress traffic policy", + "description": "Egress traffic policy.", "title": "Output" } }, @@ -49368,7 +54589,7 @@ "properties": { "session_tracker": { "type": "string", - "description": "Name of session tracker", + "description": "Name of session tracker.", "title": "Session Tracker" } }, @@ -49492,17 +54713,17 @@ }, "peer": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Peer" }, "peer_interface": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Peer Interface" }, "peer_type": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Peer Type" }, "sflow": { @@ -49539,7 +54760,7 @@ }, "port_profile": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Port Profile" }, "uc_tx_queues": { @@ -49549,19 +54770,19 @@ "properties": { "id": { "type": "integer", - "description": "TX-Queue ID", + "description": "TX-Queue ID.", "title": "ID" }, "random_detect": { "type": "object", "properties": { "ecn": { - "description": "Explicit Congestion Notification", + "description": "Explicit Congestion Notification.", "type": "object", "properties": { "count": { "type": "boolean", - "description": "Enable counter for random-detect ECNs", + "description": "Enable counter for random-detect ECNs.", "title": "Count" }, "threshold": { @@ -49576,35 +54797,35 @@ "mbytes", "milliseconds" ], - "description": "Indicate the units to be used for the threshold values", + "description": "Indicate the units to be used for the threshold values.", "title": "Units" }, "min": { "type": "integer", "minimum": 1, "maximum": 256000000, - "description": "Set the random-detect ECN minimum-threshold", + "description": "Set the random-detect ECN minimum-threshold.", "title": "Min" }, "max": { "type": "integer", "minimum": 1, "maximum": 256000000, - "description": "Set the random-detect ECN maximum-threshold", + "description": "Set the random-detect ECN maximum-threshold.", "title": "Max" }, "max_probability": { "type": "integer", "minimum": 1, "maximum": 100, - "description": "Set the random-detect ECN max-mark-probability", + "description": "Set the random-detect ECN max-mark-probability.", "title": "Max Probability" }, "weight": { "type": "integer", "minimum": 0, "maximum": 15, - "description": "Set the random-detect ECN weight", + "description": "Set the random-detect ECN weight.", "title": "Weight" } }, @@ -49651,19 +54872,19 @@ "properties": { "id": { "type": "integer", - "description": "TX-Queue ID", + "description": "TX-Queue ID.", "title": "ID" }, "random_detect": { "type": "object", "properties": { "ecn": { - "description": "Explicit Congestion Notification", + "description": "Explicit Congestion Notification.", "type": "object", "properties": { "count": { "type": "boolean", - "description": "Enable counter for random-detect ECNs", + "description": "Enable counter for random-detect ECNs.", "title": "Count" }, "threshold": { @@ -49678,35 +54899,35 @@ "mbytes", "milliseconds" ], - "description": "Indicate the units to be used for the threshold values", + "description": "Indicate the units to be used for the threshold values.", "title": "Units" }, "min": { "type": "integer", "minimum": 1, "maximum": 256000000, - "description": "Set the random-detect ECN minimum-threshold", + "description": "Set the random-detect ECN minimum-threshold.", "title": "Min" }, "max": { "type": "integer", "minimum": 1, "maximum": 256000000, - "description": "Set the random-detect ECN maximum-threshold", + "description": "Set the random-detect ECN maximum-threshold.", "title": "Max" }, "max_probability": { "type": "integer", "minimum": 1, "maximum": 100, - "description": "Set the random-detect ECN max-mark-probability", + "description": "Set the random-detect ECN max-mark-probability.", "title": "Max Probability" }, "weight": { "type": "integer", "minimum": 0, "maximum": 15, - "description": "Set the random-detect ECN weight", + "description": "Set the random-detect ECN weight.", "title": "Weight" } }, @@ -49754,12 +54975,12 @@ "properties": { "id": { "type": "integer", - "description": "VRID", + "description": "VRID.", "title": "ID" }, "priority_level": { "type": "integer", - "description": "Instance priority", + "description": "Instance priority.", "minimum": 1, "maximum": 254, "title": "Priority Level" @@ -49769,7 +54990,7 @@ "properties": { "interval": { "type": "integer", - "description": "Interval in seconds", + "description": "Interval in seconds.", "minimum": 1, "maximum": 255, "title": "Interval" @@ -49793,14 +55014,14 @@ "properties": { "minimum": { "type": "integer", - "description": "Minimum preempt delay in seconds", + "description": "Minimum preempt delay in seconds.", "minimum": 0, "maximum": 3600, "title": "Minimum" }, "reload": { "type": "integer", - "description": "Reload preempt delay in seconds", + "description": "Reload preempt delay in seconds.", "minimum": 0, "maximum": 3600, "title": "Reload" @@ -49856,14 +55077,14 @@ "properties": { "name": { "type": "string", - "description": "Tracked object name", + "description": "Tracked object name.", "title": "Name" }, "decrement": { "type": "integer", "minimum": 1, "maximum": 254, - "description": "Decrement VRRP priority by 1-254", + "description": "Decrement VRRP priority by 1-254.", "title": "Decrement" }, "shutdown": { @@ -49886,7 +55107,7 @@ "properties": { "address": { "type": "string", - "description": "Virtual IPv4 address", + "description": "Virtual IPv4 address.", "title": "Address" }, "version": { @@ -49912,7 +55133,7 @@ "properties": { "address": { "type": "string", - "description": "Virtual IPv6 address", + "description": "Virtual IPv6 address.", "title": "Address" } }, @@ -49938,7 +55159,7 @@ }, "validate_state": { "type": "boolean", - "description": "Set to false to disable interface validation by the `eos_validate_state` role", + "description": "Set to false to disable interface validation by the `eos_validate_state` role.", "title": "Validate State" }, "switchport": { @@ -50047,7 +55268,7 @@ }, "eos_cli": { "type": "string", - "description": "Multiline EOS CLI rendered directly on the ethernet interface in the final EOS configuration", + "description": "Multiline EOS CLI rendered directly on the ethernet interface in the final EOS configuration.", "title": "EOS CLI" } }, @@ -50249,7 +55470,7 @@ }, "log": { "type": "integer", - "description": "Logging interval in seconds", + "description": "Logging interval in seconds.", "title": "Log" }, "cpu": { @@ -50285,7 +55506,7 @@ }, "tx_latency": { "type": "boolean", - "description": "Enable tx-latency mode", + "description": "Enable tx-latency mode.", "title": "TX Latency" } }, @@ -50326,6 +55547,23 @@ "type": "object", "description": "sFlow settings.\nThe sFlow process will only be configured if any interface is enabled for sFlow.\nFor default enabling of sFlow for various interface types across the fabric see `fabric_sflow`.", "properties": { + "sample": { + "type": "object", + "properties": { + "rate": { + "type": "integer", + "minimum": 1, + "maximum": 4294967295, + "description": "Packet sampling rate that defines the average number of ingress packets that pass through an interface for every packet that is sampled.\nA rate of 16384 corresponds to an average sample of one per 16384 packets.", + "title": "Rate" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Sample" + }, "destinations": { "type": "array", "items": { @@ -50392,6 +55630,12 @@ }, "title": "Sflow Settings" }, + "shutdown_bgp_towards_undeployed_peers": { + "type": "boolean", + "default": false, + "description": "When a device is set undeployed using `is_deployed: false` and `shutdown_bgp_towards_undeployed_peers` key is set to true, the BGP neighborship is shutdown on the peer.", + "title": "Shutdown BGP Towards Undeployed Peers" + }, "shutdown_interfaces_towards_undeployed_peers": { "type": "boolean", "default": false, @@ -50400,7 +55644,7 @@ }, "snmp_settings": { "type": "object", - "description": "SNMP settings\nFor SNMP local-interfaces see \"source_interfaces.snmp\"\nConfiguration of remote SNMP engine IDs are currently only possible using `structured_config`.", + "description": "SNMP settings.\nFor SNMP local-interfaces see \"source_interfaces.snmp\".\nConfiguration of remote SNMP engine IDs are currently only possible using `structured_config`.", "properties": { "contact": { "type": "string", @@ -50421,7 +55665,7 @@ "properties": { "name": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "Name" }, "enable": { @@ -50479,12 +55723,12 @@ "properties": { "name": { "type": "string", - "description": "Username", + "description": "Username.", "title": "Name" }, "group": { "type": "string", - "description": "Group name", + "description": "Group name.", "title": "Group" }, "version": { @@ -50542,7 +55786,7 @@ "properties": { "host": { "type": "string", - "description": "Host IP address or name", + "description": "Host IP address or name.", "title": "Host" }, "vrf": { @@ -50571,7 +55815,7 @@ }, "community": { "type": "string", - "description": "Community name", + "description": "Community name.", "title": "Community" }, "users": { @@ -50615,7 +55859,7 @@ "properties": { "name": { "type": "string", - "description": "Community name", + "description": "Community name.", "title": "Name" }, "access": { @@ -50631,7 +55875,7 @@ "properties": { "name": { "type": "string", - "description": "IPv4 access list name", + "description": "IPv4 access list name.", "title": "Name" } }, @@ -50646,7 +55890,7 @@ "properties": { "name": { "type": "string", - "description": "IPv6 access list name", + "description": "IPv6 access list name.", "title": "Name" } }, @@ -50678,7 +55922,7 @@ "properties": { "name": { "type": "string", - "description": "IPv4 access list name", + "description": "IPv4 access list name.", "title": "Name" }, "vrf": { @@ -50700,7 +55944,7 @@ "properties": { "name": { "type": "string", - "description": "IPv6 access list name", + "description": "IPv6 access list name.", "title": "Name" }, "vrf": { @@ -50722,7 +55966,7 @@ "properties": { "name": { "type": "string", - "description": "SNMP view name", + "description": "SNMP view name.", "title": "Name" }, "mib_family_name": { @@ -50752,7 +55996,7 @@ "properties": { "name": { "type": "string", - "description": "Group name", + "description": "Group name.", "title": "Name" }, "version": { @@ -50775,17 +56019,17 @@ }, "read": { "type": "string", - "description": "Read view", + "description": "Read view.", "title": "Read" }, "write": { "type": "string", - "description": "Write view", + "description": "Write view.", "title": "Write" }, "notify": { "type": "string", - "description": "Notify view", + "description": "Notify view.", "title": "Notify" } }, @@ -50802,7 +56046,7 @@ "enable": { "type": "boolean", "default": false, - "description": "Enable or disable all snmp-traps\n", + "description": "Enable or disable all snmp-traps.\n", "title": "Enable" }, "snmp_traps": { @@ -50812,7 +56056,7 @@ "properties": { "name": { "type": "string", - "description": "Enable or disable specific snmp-traps and their sub_traps\nExamples:\n- \"bgp\"\n- \"bgp established\"\n", + "description": "Enable or disable specific snmp-traps and their sub_traps.\nExamples:\n- \"bgp\"\n- \"bgp established\"\n", "title": "Name" }, "enabled": { @@ -50987,7 +56231,7 @@ "properties": { "profile": { "type": "string", - "description": "Profile name", + "description": "Profile name.", "title": "Profile" }, "parent_profile": { @@ -51003,17 +56247,17 @@ "properties": { "node": { "type": "string", - "description": "l3_leaf inventory hostname", + "description": "l3_leaf inventory hostname.", "title": "Node" }, "name": { "type": "string", - "description": "VLAN name", + "description": "VLAN name.", "title": "Name" }, "enabled": { "type": "boolean", - "description": "Enable or disable interface", + "description": "Enable or disable interface.", "title": "Enabled" }, "description": { @@ -51038,30 +56282,30 @@ }, "ip_address_virtual": { "type": "string", - "description": "IPv4_address/Mask\nIPv4 VXLAN Anycast IP address\nConserves IP addresses in VXLAN deployments as it doesn't require unique IP addresses on each node.\n", + "description": "IPv4_address/Mask.\nIPv4 VXLAN Anycast IP address.\nConserves IP addresses in VXLAN deployments as it doesn't require unique IP addresses on each node.\n", "title": "IP Address Virtual" }, "ipv6_address_virtual": { "type": "string", - "description": "IPv6_address/Mask\nipv6 address virtuals to configure VXLAN Anycast IP address (Optional)\nIf both \"ipv6_address_virtual\" and \"ipv6_address_virtuals\" are set, all addresses will be configured\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use ipv6_address_virtuals instead.", + "description": "IPv6_address/Mask.\nipv6 address virtuals to configure VXLAN Anycast IP address (Optional).\nIf both \"ipv6_address_virtual\" and \"ipv6_address_virtuals\" are set, all addresses will be configured.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use ipv6_address_virtuals instead.", "deprecated": true, "title": "IPv6 Address Virtual" }, "ipv6_address_virtuals": { "type": "array", - "description": "IPv6 VXLAN Anycast IP addresses\nConserves IPv6 addresses in VXLAN deployments as it doesn't require unique IPv6 addresses on each node.\n", + "description": "IPv6 VXLAN Anycast IP addresses.\nConserves IPv6 addresses in VXLAN deployments as it doesn't require unique IPv6 addresses on each node.\n", "items": { "type": "string", - "description": "IPv6_address/Mask" + "description": "IPv6_address/Mask." }, "title": "IPv6 Address Virtuals" }, "ip_address_virtual_secondaries": { "type": "array", - "description": "Secondary IPv4 VXLAN Anycast IP addresses", + "description": "Secondary IPv4 VXLAN Anycast IP addresses.", "items": { "type": "string", - "description": "IPv4_address/Mask" + "description": "IPv4_address/Mask." }, "title": "IP Address Virtual Secondaries" }, @@ -51070,7 +56314,7 @@ "description": "IPv4 VARP addresses.\nRequires an IP address to be configured on the SVI.\nIf ip_address_virtual is also set, ip_virtual_router_addresses will take precedence\n_if_ there is an ip_address configured for the node.\n", "items": { "type": "string", - "description": "IPv4_address/Mask or IPv4_address\nIPv4_address/Mask will also configure a static route to the SVI per best practice.\n" + "description": "IPv4_address/Mask or IPv4_address.\nIPv4_address/Mask will also configure a static route to the SVI per best practice.\n" }, "title": "IP Virtual Router Addresses" }, @@ -51079,19 +56323,29 @@ "description": "IPv6 VARP addresses.\nRequires an IPv6 address to be configured on the SVI.\nIf ipv6_address_virtuals is also set, ipv6_virtual_router_addresses will take precedence\n_if_ there is an ipv6_address configured for the node.\n", "items": { "type": "string", - "description": "IPv6_address" + "description": "IPv6_address." }, "title": "IPv6 Virtual Router Addresses" }, + "ipv4_acl_in": { + "description": "Name of the IPv4 access-list to be assigned in the ingress direction.\nThe access-list must be defined under `ipv4_acls` and supports substitution of the field \"interface_ip\".", + "type": "string", + "title": "IPv4 Acl In" + }, + "ipv4_acl_out": { + "description": "Name of the IPv4 Access-list to be assigned in the egress direction.\nThe access-list must be defined under `ipv4_acls` and supports substitution of the field \"interface_ip\".", + "type": "string", + "title": "IPv4 Acl Out" + }, "ip_helpers": { "type": "array", - "description": "IP helper for DHCP relay", + "description": "IP helper for DHCP relay.", "items": { "type": "object", "properties": { "ip_helper": { "type": "string", - "description": "IPv4 DHCP server IP", + "description": "IPv4 DHCP server IP.", "title": "IP Helper" }, "source_interface": { @@ -51124,12 +56378,12 @@ }, "rt_override": { "type": "string", - "description": "By default the MAC VRF RT will be derived from mac_vrf_id_base + vlan_id.\nThe rt_override allows us to override this value and statically define it.\nrt_override will default to vni_override if set.\n\nrt_override supports two formats:\n - A single number which will be used in the RT fields instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rt_type' for details).\n - A full RT string with colon seperator which will override the full RT.\n", + "description": "By default the MAC VRF RT will be derived from mac_vrf_id_base + vlan_id.\nThe rt_override allows us to override this value and statically define it.\nrt_override will default to vni_override if set.\n\nrt_override supports two formats:\n - A single number which will be used in the RT fields instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rt_type' for details).\n - A full RT string with colon separator which will override the full RT.\n", "title": "Rt Override" }, "rd_override": { "type": "string", - "description": "By default the MAC VRF RD will be derived from mac_vrf_id_base + vlan_id.\nThe rt_override allows us to override this value and statically define it.\nrd_override will default to rt_override or vni_override if set.\n\nrd_override supports two formats:\n - A single number which will be used in the RD assigned number field instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rd_type' for details).\n - A full RD string with colon seperator which will override the full RD.\n", + "description": "By default the MAC VRF RD will be derived from mac_vrf_id_base + vlan_id.\nThe rt_override allows us to override this value and statically define it.\nrd_override will default to rt_override or vni_override if set.\n\nrd_override supports two formats:\n - A single number which will be used in the RD assigned number field instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rd_type' for details).\n - A full RD string with colon separator which will override the full RD.\n", "title": "Rd Override" }, "trunk_groups": { @@ -51304,7 +56558,7 @@ "properties": { "structured_config": { "type": "object", - "description": "Structured configuration and EOS CLI commands rendered on router_bgp.vlans.[id=]\nThis configuration will not be applied to vlan aware bundles\n", + "description": "Structured configuration and EOS CLI commands rendered on router_bgp.vlans.[id=].\nThis configuration will not be applied to vlan aware bundles.\n", "properties": { "id": { "type": "integer", @@ -51312,11 +56566,11 @@ }, "tenant": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Tenant" }, "rd": { - "description": "Route distinguisher", + "description": "Route distinguisher.", "type": "string", "title": "Rd" }, @@ -51333,7 +56587,7 @@ }, "rd": { "type": "string", - "description": "Route distinguisher", + "description": "Route distinguisher.", "title": "Rd" } }, @@ -51345,7 +56599,7 @@ }, "eos_cli": { "type": "string", - "description": "Multiline EOS CLI rendered directly on the Router BGP, VLAN definition in the final EOS configuration", + "description": "Multiline EOS CLI rendered directly on the Router BGP, VLAN definition in the final EOS configuration.", "title": "EOS CLI" }, "route_targets": { @@ -51498,7 +56752,7 @@ "properties": { "name": { "type": "string", - "description": "VLAN interface name like \"Vlan123\"", + "description": "VLAN interface name like \"Vlan123\".", "title": "Name" }, "description": { @@ -51535,12 +56789,12 @@ }, "vrf": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "VRF" }, "arp_aging_timeout": { "type": "integer", - "description": "In seconds", + "description": "In seconds.", "minimum": 1, "maximum": 65535, "title": "ARP Aging Timeout" @@ -51569,14 +56823,14 @@ }, "ip_address": { "type": "string", - "description": "IPv4_address/Mask", + "description": "IPv4_address/Mask.", "title": "IP Address" }, "ip_address_secondaries": { "type": "array", "items": { "type": "string", - "description": "IPv4_address/Mask" + "description": "IPv4_address/Mask." }, "title": "IP Address Secondaries" }, @@ -51584,20 +56838,20 @@ "type": "array", "items": { "type": "string", - "description": "IPv4 address or IPv4_address/Mask" + "description": "IPv4 address or IPv4_address/Mask." }, "title": "IP Virtual Router Addresses" }, "ip_address_virtual": { "type": "string", - "description": "IPv4_address/Mask", + "description": "IPv4_address/Mask.", "title": "IP Address Virtual" }, "ip_address_virtual_secondaries": { "type": "array", "items": { "type": "string", - "description": "IPv4_address/Mask" + "description": "IPv4_address/Mask." }, "title": "IP Address Virtual Secondaries" }, @@ -51733,23 +56987,23 @@ }, "ip_helpers": { "type": "array", - "description": "List of DHCP servers", + "description": "List of DHCP servers.", "items": { "type": "object", "properties": { "ip_helper": { "type": "string", - "description": "IP address or hostname of DHCP server", + "description": "IP address or hostname of DHCP server.", "title": "IP Helper" }, "source_interface": { "type": "string", - "description": "Interface used as source for forwarded DHCP packets", + "description": "Interface used as source for forwarded DHCP packets.", "title": "Source Interface" }, "vrf": { "type": "string", - "description": "VRF where DHCP server can be reached", + "description": "VRF where DHCP server can be reached.", "title": "VRF" } }, @@ -51763,6 +57017,11 @@ }, "title": "IP Helpers" }, + "ip_dhcp_relay_all_subnets": { + "type": "boolean", + "description": "Allow forwarding requests with secondary IP addresses in the gateway address \"giaddr\" field.", + "title": "IP DHCP Relay All Subnets" + }, "ip_nat": { "type": "object", "properties": { @@ -51811,7 +57070,7 @@ "properties": { "access_list": { "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Access List" }, "comment": { @@ -51831,16 +57090,17 @@ "type": "integer", "minimum": 1, "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Group" }, "original_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address. The combination of `original_ip` and `original_port` must be unique.", "title": "Original IP" }, "original_port": { "type": "integer", + "description": "TCP/UDP port. The combination of `original_ip` and `original_port` must be unique.", "minimum": 1, "maximum": 65535, "title": "Original Port" @@ -51861,20 +57121,19 @@ }, "translated_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.", "title": "Translated IP" }, "translated_port": { "type": "integer", "minimum": 1, "maximum": 65535, - "description": "requires 'original_port'", + "description": "requires 'original_port'.", "title": "Translated Port" } }, "required": [ - "translated_ip", - "original_ip" + "translated_ip" ], "additionalProperties": false, "patternProperties": { @@ -51918,7 +57177,7 @@ }, "pool_name": { "type": "string", - "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone\nignored if 'nat_type' is overload\n", + "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone.\nignored if 'nat_type' is overload.\n", "title": "Pool Name" }, "priority": { @@ -51946,7 +57205,7 @@ "properties": { "access_list": { "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Access List" }, "comment": { @@ -51966,16 +57225,17 @@ "type": "integer", "minimum": 1, "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Group" }, "original_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address. The combination of `original_ip` and `original_port` must be unique.", "title": "Original IP" }, "original_port": { "type": "integer", + "description": "TCP/UDP port. The combination of `original_ip` and `original_port` must be unique.", "minimum": 1, "maximum": 65535, "title": "Original Port" @@ -51996,20 +57256,19 @@ }, "translated_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.", "title": "Translated IP" }, "translated_port": { "type": "integer", "minimum": 1, "maximum": 65535, - "description": "requires 'original_port'", + "description": "requires 'original_port'.", "title": "Translated Port" } }, "required": [ - "translated_ip", - "original_ip" + "translated_ip" ], "additionalProperties": false, "patternProperties": { @@ -52038,12 +57297,12 @@ }, "ipv6_address": { "type": "string", - "description": "IPv6_address/Mask", + "description": "IPv6_address/Mask.", "title": "IPv6 Address" }, "ipv6_address_virtual": { "type": "string", - "description": "IPv6_address/Mask\nIf both \"ipv6_address_virtual\" and \"ipv6_address_virtuals\" are set, all addresses will be configured\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use ipv6_address_virtuals instead.", + "description": "IPv6_address/Mask.\nIf both \"ipv6_address_virtual\" and \"ipv6_address_virtuals\" are set, all addresses will be configured.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use ipv6_address_virtuals instead.", "deprecated": true, "title": "IPv6 Address Virtual" }, @@ -52052,13 +57311,13 @@ "description": "The new \"ipv6_address_virtuals\" key support multiple virtual ipv6 addresses.", "items": { "type": "string", - "description": "IPv6_address/Mask" + "description": "IPv6_address/Mask." }, "title": "IPv6 Address Virtuals" }, "ipv6_address_link_local": { "type": "string", - "description": "IPv6_address/Mask", + "description": "IPv6_address/Mask.", "title": "IPv6 Address Link Local" }, "ipv6_virtual_router_address": { @@ -52072,7 +57331,7 @@ "description": "Improved \"VARPv6\" data model to support multiple VARPv6 addresses.", "items": { "type": "string", - "description": "IPv6 address or IPv6_address/Mask" + "description": "IPv6 address or IPv6_address/Mask." }, "title": "IPv6 Virtual Router Addresses" }, @@ -52084,6 +57343,41 @@ "type": "boolean", "title": "IPv6 ND Managed Config Flag" }, + "ipv6_nd_other_config_flag": { + "type": "boolean", + "description": "Set the \"other stateful configuration\" flag in IPv6 router advertisements.", + "title": "IPv6 ND Other Config Flag" + }, + "ipv6_nd_cache": { + "type": "object", + "description": "IPv6 neighbor cache options.", + "properties": { + "dynamic_capacity": { + "type": "integer", + "description": "Capacity of dynamic cache entries.", + "minimum": 0, + "maximum": 4294967295, + "title": "Dynamic Capacity" + }, + "expire": { + "type": "integer", + "description": "Cache entries expirery in seconds.", + "minimum": 1, + "maximum": 65535, + "title": "Expire" + }, + "refresh_always": { + "type": "boolean", + "description": "Force refresh on cache expiry.", + "title": "Refresh Always" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IPv6 ND Cache" + }, "ipv6_nd_prefixes": { "type": "array", "items": { @@ -52091,17 +57385,17 @@ "properties": { "ipv6_prefix": { "type": "string", - "description": "IPv6_address/Mask", + "description": "IPv6_address/Mask.", "title": "IPv6 Prefix" }, "valid_lifetime": { "type": "string", - "description": "In seconds <0-4294967295> or infinite", + "description": "In seconds <0-4294967295> or infinite.", "title": "Valid Lifetime" }, "preferred_lifetime": { "type": "string", - "description": "In seconds <0-4294967295> or infinite", + "description": "In seconds <0-4294967295> or infinite.", "title": "Preferred Lifetime" }, "no_autoconfig_flag": { @@ -52126,7 +57420,7 @@ "properties": { "address": { "type": "string", - "description": "DHCP server's IPv6 address", + "description": "DHCP server's IPv6 address.", "title": "Address" }, "vrf": { @@ -52135,17 +57429,17 @@ }, "local_interface": { "type": "string", - "description": "Local interface to communicate with DHCP server - mutually exclusive to source_address", + "description": "Local interface to communicate with DHCP server - mutually exclusive to source_address.", "title": "Local Interface" }, "source_address": { "type": "string", - "description": "Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface", + "description": "Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface.", "title": "Source Address" }, "link_address": { "type": "string", - "description": "Override the default link address specified in the relayed DHCP packet", + "description": "Override the default link address specified in the relayed DHCP packet.", "title": "Link Address" } }, @@ -52159,24 +57453,29 @@ }, "title": "IPv6 DHCP Relay Destinations" }, + "ipv6_dhcp_relay_all_subnets": { + "type": "boolean", + "description": "Allow forwarding requests with additional IPv6 addresses in the gateway address \"giaddr\" field.", + "title": "IPv6 DHCP Relay All Subnets" + }, "access_group_in": { "type": "string", - "description": "IPv4 access-list name", + "description": "IPv4 access-list name.", "title": "Access Group In" }, "access_group_out": { "type": "string", - "description": "IPv4 access-list name", + "description": "IPv4 access-list name.", "title": "Access Group Out" }, "ipv6_access_group_in": { "type": "string", - "description": "IPv6 access-list name", + "description": "IPv6 access-list name.", "title": "IPv6 Access Group In" }, "ipv6_access_group_out": { "type": "string", - "description": "IPv6 access-list name", + "description": "IPv6 access-list name.", "title": "IPv6 Access Group Out" }, "multicast": { @@ -52187,13 +57486,13 @@ "properties": { "boundaries": { "type": "array", - "description": "Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both", + "description": "Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both.", "items": { "type": "object", "properties": { "boundary": { "type": "string", - "description": "IPv4 access-list name or IPv4 multicast group prefix with mask", + "description": "IPv4 access-list name or IPv4 multicast group prefix with mask.", "title": "Boundary" }, "out": { @@ -52250,13 +57549,13 @@ "properties": { "boundaries": { "type": "array", - "description": "Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both", + "description": "Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both.", "items": { "type": "object", "properties": { "boundary": { "type": "string", - "description": "IPv6 access-list name or IPv6 multicast group prefix with mask", + "description": "IPv6 access-list name or IPv6 multicast group prefix with mask.", "title": "Boundary" } }, @@ -52334,12 +57633,12 @@ }, "ospf_authentication_key": { "type": "string", - "description": "Encrypted password used for simple authentication", + "description": "Encrypted password used for simple authentication.", "title": "OSPF Authentication Key" }, "ospf_message_digest_keys": { "type": "array", - "description": "Keys used for message-digest authentication", + "description": "Keys used for message-digest authentication.", "items": { "type": "object", "properties": { @@ -52360,7 +57659,7 @@ }, "key": { "type": "string", - "description": "Encrypted password", + "description": "Encrypted password.", "title": "Key" } }, @@ -52446,9 +57745,14 @@ }, "isis_enable": { "type": "string", - "description": "ISIS instance name", + "description": "ISIS instance name.", "title": "ISIS Enable" }, + "isis_bfd": { + "type": "boolean", + "description": "Enable BFD for ISIS.", + "title": "ISIS BFD" + }, "isis_passive": { "type": "boolean", "title": "ISIS Passive" @@ -52471,18 +57775,18 @@ }, "vrrp_ids": { "type": "array", - "description": "Improved \"vrrp\" data model to support multiple VRRP IDs", + "description": "Improved \"vrrp\" data model to support multiple VRRP IDs.", "items": { "type": "object", "properties": { "id": { "type": "integer", - "description": "VRID", + "description": "VRID.", "title": "ID" }, "priority_level": { "type": "integer", - "description": "Instance priority", + "description": "Instance priority.", "minimum": 1, "maximum": 254, "title": "Priority Level" @@ -52492,7 +57796,7 @@ "properties": { "interval": { "type": "integer", - "description": "Interval in seconds", + "description": "Interval in seconds.", "minimum": 1, "maximum": 255, "title": "Interval" @@ -52516,14 +57820,14 @@ "properties": { "minimum": { "type": "integer", - "description": "Minimum preempt delay in seconds", + "description": "Minimum preempt delay in seconds.", "minimum": 0, "maximum": 3600, "title": "Minimum" }, "reload": { "type": "integer", - "description": "Reload preempt delay in seconds", + "description": "Reload preempt delay in seconds.", "minimum": 0, "maximum": 3600, "title": "Reload" @@ -52579,14 +57883,14 @@ "properties": { "name": { "type": "string", - "description": "Tracked object name", + "description": "Tracked object name.", "title": "Name" }, "decrement": { "type": "integer", "minimum": 1, "maximum": 254, - "description": "Decrement VRRP priority by 1-254", + "description": "Decrement VRRP priority by 1-254.", "title": "Decrement" }, "shutdown": { @@ -52609,7 +57913,7 @@ "properties": { "address": { "type": "string", - "description": "Virtual IPv4 address", + "description": "Virtual IPv4 address.", "title": "Address" }, "version": { @@ -52635,7 +57939,7 @@ "properties": { "address": { "type": "string", - "description": "Virtual IPv6 address", + "description": "Virtual IPv6 address.", "title": "Address" } }, @@ -52666,12 +57970,12 @@ "properties": { "virtual_router": { "type": "string", - "description": "Virtual Router ID", + "description": "Virtual Router ID.", "title": "Virtual Router" }, "priority": { "type": "integer", - "description": "Instance priority", + "description": "Instance priority.", "title": "Priority" }, "advertisement_interval": { @@ -52684,12 +57988,12 @@ }, "ipv4": { "type": "string", - "description": "Virtual IPv4 address", + "description": "Virtual IPv4 address.", "title": "IPv4" }, "ipv6": { "type": "string", - "description": "Virtual IPv6 address", + "description": "Virtual IPv6 address.", "title": "IPv6" } }, @@ -52762,12 +58066,12 @@ }, "interval": { "type": "integer", - "description": "Rate in milliseconds", + "description": "Rate in milliseconds.", "title": "Interval" }, "min_rx": { "type": "integer", - "description": "Minimum RX hold time in milliseconds", + "description": "Minimum RX hold time in milliseconds.", "title": "Min RX" }, "multiplier": { @@ -52791,7 +58095,7 @@ "properties": { "input": { "type": "string", - "description": "Name of policy-map used for policy based routing", + "description": "Name of policy-map used for policy based routing.", "title": "Input" } }, @@ -52810,12 +58114,12 @@ }, "pvlan_mapping": { "type": "string", - "description": "List of VLANs as string", + "description": "List of VLANs as string.", "title": "PVLAN Mapping" }, "tenant": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Tenant" }, "tags": { @@ -52823,17 +58127,17 @@ "items": { "type": "string" }, - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Tags" }, "type": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Type" }, "eos_cli": { "type": "string", - "description": "Multiline EOS CLI rendered directly on the VLAN interface in the final EOS configuration", + "description": "Multiline EOS CLI rendered directly on the VLAN interface in the final EOS configuration.", "title": "EOS CLI" } }, @@ -52856,12 +58160,12 @@ }, "name": { "type": "string", - "description": "VLAN name", + "description": "VLAN name.", "title": "Name" }, "enabled": { "type": "boolean", - "description": "Enable or disable interface", + "description": "Enable or disable interface.", "title": "Enabled" }, "description": { @@ -52886,30 +58190,30 @@ }, "ip_address_virtual": { "type": "string", - "description": "IPv4_address/Mask\nIPv4 VXLAN Anycast IP address\nConserves IP addresses in VXLAN deployments as it doesn't require unique IP addresses on each node.\n", + "description": "IPv4_address/Mask.\nIPv4 VXLAN Anycast IP address.\nConserves IP addresses in VXLAN deployments as it doesn't require unique IP addresses on each node.\n", "title": "IP Address Virtual" }, "ipv6_address_virtual": { "type": "string", - "description": "IPv6_address/Mask\nipv6 address virtuals to configure VXLAN Anycast IP address (Optional)\nIf both \"ipv6_address_virtual\" and \"ipv6_address_virtuals\" are set, all addresses will be configured\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use ipv6_address_virtuals instead.", + "description": "IPv6_address/Mask.\nipv6 address virtuals to configure VXLAN Anycast IP address (Optional).\nIf both \"ipv6_address_virtual\" and \"ipv6_address_virtuals\" are set, all addresses will be configured.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use ipv6_address_virtuals instead.", "deprecated": true, "title": "IPv6 Address Virtual" }, "ipv6_address_virtuals": { "type": "array", - "description": "IPv6 VXLAN Anycast IP addresses\nConserves IPv6 addresses in VXLAN deployments as it doesn't require unique IPv6 addresses on each node.\n", + "description": "IPv6 VXLAN Anycast IP addresses.\nConserves IPv6 addresses in VXLAN deployments as it doesn't require unique IPv6 addresses on each node.\n", "items": { "type": "string", - "description": "IPv6_address/Mask" + "description": "IPv6_address/Mask." }, "title": "IPv6 Address Virtuals" }, "ip_address_virtual_secondaries": { "type": "array", - "description": "Secondary IPv4 VXLAN Anycast IP addresses", + "description": "Secondary IPv4 VXLAN Anycast IP addresses.", "items": { "type": "string", - "description": "IPv4_address/Mask" + "description": "IPv4_address/Mask." }, "title": "IP Address Virtual Secondaries" }, @@ -52918,7 +58222,7 @@ "description": "IPv4 VARP addresses.\nRequires an IP address to be configured on the SVI.\nIf ip_address_virtual is also set, ip_virtual_router_addresses will take precedence\n_if_ there is an ip_address configured for the node.\n", "items": { "type": "string", - "description": "IPv4_address/Mask or IPv4_address\nIPv4_address/Mask will also configure a static route to the SVI per best practice.\n" + "description": "IPv4_address/Mask or IPv4_address.\nIPv4_address/Mask will also configure a static route to the SVI per best practice.\n" }, "title": "IP Virtual Router Addresses" }, @@ -52927,19 +58231,29 @@ "description": "IPv6 VARP addresses.\nRequires an IPv6 address to be configured on the SVI.\nIf ipv6_address_virtuals is also set, ipv6_virtual_router_addresses will take precedence\n_if_ there is an ipv6_address configured for the node.\n", "items": { "type": "string", - "description": "IPv6_address" + "description": "IPv6_address." }, "title": "IPv6 Virtual Router Addresses" }, + "ipv4_acl_in": { + "description": "Name of the IPv4 access-list to be assigned in the ingress direction.\nThe access-list must be defined under `ipv4_acls` and supports substitution of the field \"interface_ip\".", + "type": "string", + "title": "IPv4 Acl In" + }, + "ipv4_acl_out": { + "description": "Name of the IPv4 Access-list to be assigned in the egress direction.\nThe access-list must be defined under `ipv4_acls` and supports substitution of the field \"interface_ip\".", + "type": "string", + "title": "IPv4 Acl Out" + }, "ip_helpers": { "type": "array", - "description": "IP helper for DHCP relay", + "description": "IP helper for DHCP relay.", "items": { "type": "object", "properties": { "ip_helper": { "type": "string", - "description": "IPv4 DHCP server IP", + "description": "IPv4 DHCP server IP.", "title": "IP Helper" }, "source_interface": { @@ -52972,12 +58286,12 @@ }, "rt_override": { "type": "string", - "description": "By default the MAC VRF RT will be derived from mac_vrf_id_base + vlan_id.\nThe rt_override allows us to override this value and statically define it.\nrt_override will default to vni_override if set.\n\nrt_override supports two formats:\n - A single number which will be used in the RT fields instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rt_type' for details).\n - A full RT string with colon seperator which will override the full RT.\n", + "description": "By default the MAC VRF RT will be derived from mac_vrf_id_base + vlan_id.\nThe rt_override allows us to override this value and statically define it.\nrt_override will default to vni_override if set.\n\nrt_override supports two formats:\n - A single number which will be used in the RT fields instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rt_type' for details).\n - A full RT string with colon separator which will override the full RT.\n", "title": "Rt Override" }, "rd_override": { "type": "string", - "description": "By default the MAC VRF RD will be derived from mac_vrf_id_base + vlan_id.\nThe rt_override allows us to override this value and statically define it.\nrd_override will default to rt_override or vni_override if set.\n\nrd_override supports two formats:\n - A single number which will be used in the RD assigned number field instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rd_type' for details).\n - A full RD string with colon seperator which will override the full RD.\n", + "description": "By default the MAC VRF RD will be derived from mac_vrf_id_base + vlan_id.\nThe rt_override allows us to override this value and statically define it.\nrd_override will default to rt_override or vni_override if set.\n\nrd_override supports two formats:\n - A single number which will be used in the RD assigned number field instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rd_type' for details).\n - A full RD string with colon separator which will override the full RD.\n", "title": "Rd Override" }, "trunk_groups": { @@ -53152,7 +58466,7 @@ "properties": { "structured_config": { "type": "object", - "description": "Structured configuration and EOS CLI commands rendered on router_bgp.vlans.[id=]\nThis configuration will not be applied to vlan aware bundles\n", + "description": "Structured configuration and EOS CLI commands rendered on router_bgp.vlans.[id=].\nThis configuration will not be applied to vlan aware bundles.\n", "properties": { "id": { "type": "integer", @@ -53160,11 +58474,11 @@ }, "tenant": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Tenant" }, "rd": { - "description": "Route distinguisher", + "description": "Route distinguisher.", "type": "string", "title": "Rd" }, @@ -53181,7 +58495,7 @@ }, "rd": { "type": "string", - "description": "Route distinguisher", + "description": "Route distinguisher.", "title": "Rd" } }, @@ -53193,7 +58507,7 @@ }, "eos_cli": { "type": "string", - "description": "Multiline EOS CLI rendered directly on the Router BGP, VLAN definition in the final EOS configuration", + "description": "Multiline EOS CLI rendered directly on the Router BGP, VLAN definition in the final EOS configuration.", "title": "EOS CLI" }, "route_targets": { @@ -53346,7 +58660,7 @@ "properties": { "name": { "type": "string", - "description": "VLAN interface name like \"Vlan123\"", + "description": "VLAN interface name like \"Vlan123\".", "title": "Name" }, "description": { @@ -53383,12 +58697,12 @@ }, "vrf": { "type": "string", - "description": "VRF name", + "description": "VRF name.", "title": "VRF" }, "arp_aging_timeout": { "type": "integer", - "description": "In seconds", + "description": "In seconds.", "minimum": 1, "maximum": 65535, "title": "ARP Aging Timeout" @@ -53417,14 +58731,14 @@ }, "ip_address": { "type": "string", - "description": "IPv4_address/Mask", + "description": "IPv4_address/Mask.", "title": "IP Address" }, "ip_address_secondaries": { "type": "array", "items": { "type": "string", - "description": "IPv4_address/Mask" + "description": "IPv4_address/Mask." }, "title": "IP Address Secondaries" }, @@ -53432,20 +58746,20 @@ "type": "array", "items": { "type": "string", - "description": "IPv4 address or IPv4_address/Mask" + "description": "IPv4 address or IPv4_address/Mask." }, "title": "IP Virtual Router Addresses" }, "ip_address_virtual": { "type": "string", - "description": "IPv4_address/Mask", + "description": "IPv4_address/Mask.", "title": "IP Address Virtual" }, "ip_address_virtual_secondaries": { "type": "array", "items": { "type": "string", - "description": "IPv4_address/Mask" + "description": "IPv4_address/Mask." }, "title": "IP Address Virtual Secondaries" }, @@ -53581,23 +58895,23 @@ }, "ip_helpers": { "type": "array", - "description": "List of DHCP servers", + "description": "List of DHCP servers.", "items": { "type": "object", "properties": { "ip_helper": { "type": "string", - "description": "IP address or hostname of DHCP server", + "description": "IP address or hostname of DHCP server.", "title": "IP Helper" }, "source_interface": { "type": "string", - "description": "Interface used as source for forwarded DHCP packets", + "description": "Interface used as source for forwarded DHCP packets.", "title": "Source Interface" }, "vrf": { "type": "string", - "description": "VRF where DHCP server can be reached", + "description": "VRF where DHCP server can be reached.", "title": "VRF" } }, @@ -53611,6 +58925,11 @@ }, "title": "IP Helpers" }, + "ip_dhcp_relay_all_subnets": { + "type": "boolean", + "description": "Allow forwarding requests with secondary IP addresses in the gateway address \"giaddr\" field.", + "title": "IP DHCP Relay All Subnets" + }, "ip_nat": { "type": "object", "properties": { @@ -53659,7 +58978,7 @@ "properties": { "access_list": { "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Access List" }, "comment": { @@ -53679,16 +58998,17 @@ "type": "integer", "minimum": 1, "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Group" }, "original_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address. The combination of `original_ip` and `original_port` must be unique.", "title": "Original IP" }, "original_port": { "type": "integer", + "description": "TCP/UDP port. The combination of `original_ip` and `original_port` must be unique.", "minimum": 1, "maximum": 65535, "title": "Original Port" @@ -53709,20 +59029,19 @@ }, "translated_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.", "title": "Translated IP" }, "translated_port": { "type": "integer", "minimum": 1, "maximum": 65535, - "description": "requires 'original_port'", + "description": "requires 'original_port'.", "title": "Translated Port" } }, "required": [ - "translated_ip", - "original_ip" + "translated_ip" ], "additionalProperties": false, "patternProperties": { @@ -53766,7 +59085,7 @@ }, "pool_name": { "type": "string", - "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone\nignored if 'nat_type' is overload\n", + "description": "required if 'nat_type' is pool, pool-address-only or pool-full-cone.\nignored if 'nat_type' is overload.\n", "title": "Pool Name" }, "priority": { @@ -53794,7 +59113,7 @@ "properties": { "access_list": { "type": "string", - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Access List" }, "comment": { @@ -53814,16 +59133,17 @@ "type": "integer", "minimum": 1, "maximum": 65535, - "description": "'access_list' and 'group' are mutual exclusive", + "description": "'access_list' and 'group' are mutual exclusive.", "title": "Group" }, "original_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address. The combination of `original_ip` and `original_port` must be unique.", "title": "Original IP" }, "original_port": { "type": "integer", + "description": "TCP/UDP port. The combination of `original_ip` and `original_port` must be unique.", "minimum": 1, "maximum": 65535, "title": "Original Port" @@ -53844,20 +59164,19 @@ }, "translated_ip": { "type": "string", - "description": "IPv4 address", + "description": "IPv4 address.", "title": "Translated IP" }, "translated_port": { "type": "integer", "minimum": 1, "maximum": 65535, - "description": "requires 'original_port'", + "description": "requires 'original_port'.", "title": "Translated Port" } }, "required": [ - "translated_ip", - "original_ip" + "translated_ip" ], "additionalProperties": false, "patternProperties": { @@ -53886,12 +59205,12 @@ }, "ipv6_address": { "type": "string", - "description": "IPv6_address/Mask", + "description": "IPv6_address/Mask.", "title": "IPv6 Address" }, "ipv6_address_virtual": { "type": "string", - "description": "IPv6_address/Mask\nIf both \"ipv6_address_virtual\" and \"ipv6_address_virtuals\" are set, all addresses will be configured\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use ipv6_address_virtuals instead.", + "description": "IPv6_address/Mask.\nIf both \"ipv6_address_virtual\" and \"ipv6_address_virtuals\" are set, all addresses will be configured.\n\nThis key is deprecated. Support will be removed in AVD version 5.0.0. Use ipv6_address_virtuals instead.", "deprecated": true, "title": "IPv6 Address Virtual" }, @@ -53900,13 +59219,13 @@ "description": "The new \"ipv6_address_virtuals\" key support multiple virtual ipv6 addresses.", "items": { "type": "string", - "description": "IPv6_address/Mask" + "description": "IPv6_address/Mask." }, "title": "IPv6 Address Virtuals" }, "ipv6_address_link_local": { "type": "string", - "description": "IPv6_address/Mask", + "description": "IPv6_address/Mask.", "title": "IPv6 Address Link Local" }, "ipv6_virtual_router_address": { @@ -53920,7 +59239,7 @@ "description": "Improved \"VARPv6\" data model to support multiple VARPv6 addresses.", "items": { "type": "string", - "description": "IPv6 address or IPv6_address/Mask" + "description": "IPv6 address or IPv6_address/Mask." }, "title": "IPv6 Virtual Router Addresses" }, @@ -53932,6 +59251,41 @@ "type": "boolean", "title": "IPv6 ND Managed Config Flag" }, + "ipv6_nd_other_config_flag": { + "type": "boolean", + "description": "Set the \"other stateful configuration\" flag in IPv6 router advertisements.", + "title": "IPv6 ND Other Config Flag" + }, + "ipv6_nd_cache": { + "type": "object", + "description": "IPv6 neighbor cache options.", + "properties": { + "dynamic_capacity": { + "type": "integer", + "description": "Capacity of dynamic cache entries.", + "minimum": 0, + "maximum": 4294967295, + "title": "Dynamic Capacity" + }, + "expire": { + "type": "integer", + "description": "Cache entries expirery in seconds.", + "minimum": 1, + "maximum": 65535, + "title": "Expire" + }, + "refresh_always": { + "type": "boolean", + "description": "Force refresh on cache expiry.", + "title": "Refresh Always" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "IPv6 ND Cache" + }, "ipv6_nd_prefixes": { "type": "array", "items": { @@ -53939,17 +59293,17 @@ "properties": { "ipv6_prefix": { "type": "string", - "description": "IPv6_address/Mask", + "description": "IPv6_address/Mask.", "title": "IPv6 Prefix" }, "valid_lifetime": { "type": "string", - "description": "In seconds <0-4294967295> or infinite", + "description": "In seconds <0-4294967295> or infinite.", "title": "Valid Lifetime" }, "preferred_lifetime": { "type": "string", - "description": "In seconds <0-4294967295> or infinite", + "description": "In seconds <0-4294967295> or infinite.", "title": "Preferred Lifetime" }, "no_autoconfig_flag": { @@ -53974,7 +59328,7 @@ "properties": { "address": { "type": "string", - "description": "DHCP server's IPv6 address", + "description": "DHCP server's IPv6 address.", "title": "Address" }, "vrf": { @@ -53983,17 +59337,17 @@ }, "local_interface": { "type": "string", - "description": "Local interface to communicate with DHCP server - mutually exclusive to source_address", + "description": "Local interface to communicate with DHCP server - mutually exclusive to source_address.", "title": "Local Interface" }, "source_address": { "type": "string", - "description": "Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface", + "description": "Source IPv6 address to communicate with DHCP server - mutually exclusive to local_interface.", "title": "Source Address" }, "link_address": { "type": "string", - "description": "Override the default link address specified in the relayed DHCP packet", + "description": "Override the default link address specified in the relayed DHCP packet.", "title": "Link Address" } }, @@ -54007,24 +59361,29 @@ }, "title": "IPv6 DHCP Relay Destinations" }, + "ipv6_dhcp_relay_all_subnets": { + "type": "boolean", + "description": "Allow forwarding requests with additional IPv6 addresses in the gateway address \"giaddr\" field.", + "title": "IPv6 DHCP Relay All Subnets" + }, "access_group_in": { "type": "string", - "description": "IPv4 access-list name", + "description": "IPv4 access-list name.", "title": "Access Group In" }, "access_group_out": { "type": "string", - "description": "IPv4 access-list name", + "description": "IPv4 access-list name.", "title": "Access Group Out" }, "ipv6_access_group_in": { "type": "string", - "description": "IPv6 access-list name", + "description": "IPv6 access-list name.", "title": "IPv6 Access Group In" }, "ipv6_access_group_out": { "type": "string", - "description": "IPv6 access-list name", + "description": "IPv6 access-list name.", "title": "IPv6 Access Group Out" }, "multicast": { @@ -54035,13 +59394,13 @@ "properties": { "boundaries": { "type": "array", - "description": "Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both", + "description": "Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both.", "items": { "type": "object", "properties": { "boundary": { "type": "string", - "description": "IPv4 access-list name or IPv4 multicast group prefix with mask", + "description": "IPv4 access-list name or IPv4 multicast group prefix with mask.", "title": "Boundary" }, "out": { @@ -54098,13 +59457,13 @@ "properties": { "boundaries": { "type": "array", - "description": "Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both", + "description": "Boundaries can be either 1 ACL or a list of multicast IP address_range(s)/prefix but not combination of both.", "items": { "type": "object", "properties": { "boundary": { "type": "string", - "description": "IPv6 access-list name or IPv6 multicast group prefix with mask", + "description": "IPv6 access-list name or IPv6 multicast group prefix with mask.", "title": "Boundary" } }, @@ -54182,12 +59541,12 @@ }, "ospf_authentication_key": { "type": "string", - "description": "Encrypted password used for simple authentication", + "description": "Encrypted password used for simple authentication.", "title": "OSPF Authentication Key" }, "ospf_message_digest_keys": { "type": "array", - "description": "Keys used for message-digest authentication", + "description": "Keys used for message-digest authentication.", "items": { "type": "object", "properties": { @@ -54208,7 +59567,7 @@ }, "key": { "type": "string", - "description": "Encrypted password", + "description": "Encrypted password.", "title": "Key" } }, @@ -54294,9 +59653,14 @@ }, "isis_enable": { "type": "string", - "description": "ISIS instance name", + "description": "ISIS instance name.", "title": "ISIS Enable" }, + "isis_bfd": { + "type": "boolean", + "description": "Enable BFD for ISIS.", + "title": "ISIS BFD" + }, "isis_passive": { "type": "boolean", "title": "ISIS Passive" @@ -54319,18 +59683,18 @@ }, "vrrp_ids": { "type": "array", - "description": "Improved \"vrrp\" data model to support multiple VRRP IDs", + "description": "Improved \"vrrp\" data model to support multiple VRRP IDs.", "items": { "type": "object", "properties": { "id": { "type": "integer", - "description": "VRID", + "description": "VRID.", "title": "ID" }, "priority_level": { "type": "integer", - "description": "Instance priority", + "description": "Instance priority.", "minimum": 1, "maximum": 254, "title": "Priority Level" @@ -54340,7 +59704,7 @@ "properties": { "interval": { "type": "integer", - "description": "Interval in seconds", + "description": "Interval in seconds.", "minimum": 1, "maximum": 255, "title": "Interval" @@ -54364,14 +59728,14 @@ "properties": { "minimum": { "type": "integer", - "description": "Minimum preempt delay in seconds", + "description": "Minimum preempt delay in seconds.", "minimum": 0, "maximum": 3600, "title": "Minimum" }, "reload": { "type": "integer", - "description": "Reload preempt delay in seconds", + "description": "Reload preempt delay in seconds.", "minimum": 0, "maximum": 3600, "title": "Reload" @@ -54427,14 +59791,14 @@ "properties": { "name": { "type": "string", - "description": "Tracked object name", + "description": "Tracked object name.", "title": "Name" }, "decrement": { "type": "integer", "minimum": 1, "maximum": 254, - "description": "Decrement VRRP priority by 1-254", + "description": "Decrement VRRP priority by 1-254.", "title": "Decrement" }, "shutdown": { @@ -54457,7 +59821,7 @@ "properties": { "address": { "type": "string", - "description": "Virtual IPv4 address", + "description": "Virtual IPv4 address.", "title": "Address" }, "version": { @@ -54483,7 +59847,7 @@ "properties": { "address": { "type": "string", - "description": "Virtual IPv6 address", + "description": "Virtual IPv6 address.", "title": "Address" } }, @@ -54514,12 +59878,12 @@ "properties": { "virtual_router": { "type": "string", - "description": "Virtual Router ID", + "description": "Virtual Router ID.", "title": "Virtual Router" }, "priority": { "type": "integer", - "description": "Instance priority", + "description": "Instance priority.", "title": "Priority" }, "advertisement_interval": { @@ -54532,12 +59896,12 @@ }, "ipv4": { "type": "string", - "description": "Virtual IPv4 address", + "description": "Virtual IPv4 address.", "title": "IPv4" }, "ipv6": { "type": "string", - "description": "Virtual IPv6 address", + "description": "Virtual IPv6 address.", "title": "IPv6" } }, @@ -54610,12 +59974,12 @@ }, "interval": { "type": "integer", - "description": "Rate in milliseconds", + "description": "Rate in milliseconds.", "title": "Interval" }, "min_rx": { "type": "integer", - "description": "Minimum RX hold time in milliseconds", + "description": "Minimum RX hold time in milliseconds.", "title": "Min RX" }, "multiplier": { @@ -54639,7 +60003,7 @@ "properties": { "input": { "type": "string", - "description": "Name of policy-map used for policy based routing", + "description": "Name of policy-map used for policy based routing.", "title": "Input" } }, @@ -54658,12 +60022,12 @@ }, "pvlan_mapping": { "type": "string", - "description": "List of VLANs as string", + "description": "List of VLANs as string.", "title": "PVLAN Mapping" }, "tenant": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Tenant" }, "tags": { @@ -54671,17 +60035,17 @@ "items": { "type": "string" }, - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Tags" }, "type": { "type": "string", - "description": "Key only used for documentation or validation purposes", + "description": "Key only used for documentation or validation purposes.", "title": "Type" }, "eos_cli": { "type": "string", - "description": "Multiline EOS CLI rendered directly on the VLAN interface in the final EOS configuration", + "description": "Multiline EOS CLI rendered directly on the VLAN interface in the final EOS configuration.", "title": "EOS CLI" } }, @@ -54814,6 +60178,12 @@ "default": false, "title": "Underlay IPv6" }, + "underlay_isis_bfd": { + "type": "boolean", + "default": false, + "description": "Enable BFD for ISIS on all underlay links.", + "title": "Underlay ISIS BFD" + }, "underlay_isis_instance_name": { "description": "Default -> \"EVPN_UNDERLAY\" for l3ls, \"CORE\" for mpls.", "type": "string", @@ -55022,7 +60392,7 @@ "title": "Wan Carriers" }, "wan_ha": { - "description": "PREVIEW: The `wan_ha` key is currently not supported", + "description": "PREVIEW: The `wan_ha` key is currently not supported.", "type": "object", "properties": { "lan_ha_path_group_name": { @@ -55221,7 +60591,7 @@ "properties": { "interval": { "type": "string", - "description": "Interval in milliseconds. Valid values are 50-60000 | \"auto\"\n\nWhen auto, the interval and failure_threshold are automatically determined based on\npath state.", + "description": "Interval in milliseconds. Valid values are 50-60000 | \"auto\".\n\nWhen auto, the interval and failure_threshold are automatically determined based on\npath state.", "title": "Interval" }, "failure_threshold": { @@ -55475,6 +60845,21 @@ } }, "title": "Path Groups" + }, + "internet_exit": { + "type": "object", + "properties": { + "policy": { + "type": "string", + "description": "PREVIEW: This key is in preview mode.\n\nInternet-exit policy name associated with this virtual_topology.\nThe policy must be defined under `cv_pathfinder_internet_exit_policies`.", + "title": "Policy" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Internet Exit" } }, "additionalProperties": false, @@ -55597,6 +60982,21 @@ } }, "title": "Path Groups" + }, + "internet_exit": { + "type": "object", + "properties": { + "policy": { + "type": "string", + "description": "PREVIEW: This key is in preview mode.\n\nInternet-exit policy name associated with this virtual_topology.\nThe policy must be defined under `cv_pathfinder_internet_exit_policies`.", + "title": "Policy" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Internet Exit" } }, "additionalProperties": false, @@ -55704,6 +61104,21 @@ } }, "title": "Path Groups" + }, + "internet_exit": { + "type": "object", + "properties": { + "policy": { + "type": "string", + "description": "PREVIEW: This key is in preview mode.\n\nInternet-exit policy name associated with this virtual_topology.\nThe policy must be defined under `cv_pathfinder_internet_exit_policies`.", + "title": "Policy" + } + }, + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Internet Exit" } }, "additionalProperties": false, @@ -55730,6 +61145,176 @@ "^_.+$": {} }, "title": "Wan Virtual Topologies" + }, + "zscaler_endpoints": { + "type": "object", + "description": "PREVIEW: These keys are in preview mode.\n\nSpecial data model used for testing the WAN internet-exit integration with Zscaler.\nThe model is supposed to be autofilled per-device by `eos_designs`.\nManually setting this model will take precedence and prevent `eos_designs` from trying to contact CloudVision.\nThis can be useful for offline testing or if CloudVision is not available or not configured for Zscaler integration.", + "properties": { + "primary": { + "type": "object", + "properties": { + "ip_address": { + "type": "string", + "title": "IP Address" + }, + "datacenter": { + "type": "string", + "title": "Datacenter" + }, + "city": { + "type": "string", + "title": "City" + }, + "country": { + "type": "string", + "title": "Country" + }, + "latitude": { + "type": "string", + "title": "Latitude" + }, + "longitude": { + "type": "string", + "title": "Longitude" + } + }, + "required": [ + "ip_address", + "datacenter", + "city", + "country", + "latitude", + "longitude" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Primary" + }, + "secondary": { + "type": "object", + "properties": { + "ip_address": { + "type": "string", + "title": "IP Address" + }, + "datacenter": { + "type": "string", + "title": "Datacenter" + }, + "city": { + "type": "string", + "title": "City" + }, + "country": { + "type": "string", + "title": "Country" + }, + "latitude": { + "type": "string", + "title": "Latitude" + }, + "longitude": { + "type": "string", + "title": "Longitude" + } + }, + "required": [ + "ip_address", + "datacenter", + "city", + "country", + "latitude", + "longitude" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Secondary" + }, + "tertiary": { + "type": "object", + "properties": { + "ip_address": { + "type": "string", + "title": "IP Address" + }, + "datacenter": { + "type": "string", + "title": "Datacenter" + }, + "city": { + "type": "string", + "title": "City" + }, + "country": { + "type": "string", + "title": "Country" + }, + "latitude": { + "type": "string", + "title": "Latitude" + }, + "longitude": { + "type": "string", + "title": "Longitude" + } + }, + "required": [ + "ip_address", + "datacenter", + "city", + "country", + "latitude", + "longitude" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Tertiary" + }, + "cloud_name": { + "description": "The name of the Zscaler cloud the CloudVision cluster is integrated with like 'zscaler1' or 'zscalerbeta'.", + "type": "string", + "title": "Cloud Name" + }, + "device_location": { + "description": "The location of the calling device after being resolved by Zscaler location APIs. This is required since Zscaler only accepts their own variants of City and Country.", + "type": "object", + "properties": { + "city": { + "type": "string", + "title": "City" + }, + "country": { + "type": "string", + "title": "Country" + } + }, + "required": [ + "city", + "country" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Device Location" + } + }, + "required": [ + "primary", + "cloud_name", + "device_location" + ], + "additionalProperties": false, + "patternProperties": { + "^_.+$": {} + }, + "title": "Zscaler Endpoints" } }, "required": [ diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/eos_designs.schema.yml b/python-avd/pyavd/_eos_designs/schema/eos_designs.schema.yml similarity index 89% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/eos_designs.schema.yml rename to python-avd/pyavd/_eos_designs/schema/eos_designs.schema.yml index ec45dd293eb..31ee7c55a96 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/eos_designs.schema.yml +++ b/python-avd/pyavd/_eos_designs/schema/eos_designs.schema.yml @@ -1,7 +1,11 @@ # Copyright (c) 2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. +# yaml-language-server: $schema=../../../plugins/plugin_utils/schema/avd_meta_schema.json +# Line above is used by RedHat's YAML Schema vscode extension +# Use Ctrl + Space to get suggestions for every field. Autocomplete will pop up after typing 2 letters. $id: eos_designs +$schema: avd_meta_schema type: dict allow_other_keys: true keys: @@ -42,7 +46,7 @@ keys: "debug" will produce hidden debug messages viewable with -v. - "quiet" will not produce any messages + "quiet" will not produce any messages. ' avd_data_validation_mode: @@ -220,7 +224,7 @@ keys: for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items/ + $ref: eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items mlag_ipv4_underlay_peer: type: dict keys: @@ -240,7 +244,7 @@ keys: for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items/ + $ref: eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items evpn_overlay_peers: type: dict keys: @@ -260,7 +264,7 @@ keys: for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items/ + $ref: eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items evpn_overlay_core: type: dict keys: @@ -280,7 +284,7 @@ keys: for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items/ + $ref: eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items mpls_overlay_peers: type: dict keys: @@ -300,7 +304,7 @@ keys: for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items/ + $ref: eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items rr_overlay_peers: type: dict keys: @@ -320,7 +324,7 @@ keys: for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items/ + $ref: eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items ipvpn_gateway_peers: type: dict keys: @@ -340,7 +344,7 @@ keys: for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items/ + $ref: eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items wan_overlay_peers: type: dict keys: @@ -394,7 +398,7 @@ keys: for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items/ + $ref: eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items wan_rr_overlay_peers: type: dict description: Configuration options for the peer-group created to peer between @@ -440,7 +444,7 @@ keys: for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items/ + $ref: eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items IPv4_UNDERLAY_PEERS: type: dict deprecation: @@ -506,40 +510,40 @@ keys: default: - key: servers type: server - description: Server + description: Server. - key: firewalls type: firewall - description: Firewall + description: Firewall. - key: routers type: router - description: Router + description: Router. - key: load_balancers type: load_balancer - description: Load Balancer + description: Load Balancer. - key: storage_arrays type: storage_array - description: Storage Array + description: Storage Array. - key: cpes type: cpe - description: CPE + description: CPE. - key: workstations type: workstation - description: Workstation + description: Workstation. - key: access_points type: access_point - description: Access Point + description: Access Point. - key: phones type: phone - description: Phone + description: Phone. - key: printers type: printer - description: Printer + description: Printer. - key: cameras type: camera - description: Camera + description: Camera. - key: generic_devices type: generic_device - description: Generic Device + description: Generic Device. core_interfaces: type: dict $ref: eos_designs#/$defs/l3_edge @@ -593,19 +597,121 @@ keys: existing keys will be replaced.\n" default: - custom_structured_configuration_ + cv_pathfinder_global_sites: + documentation_options: + table: wan-cv-pathfinder-regions + description: 'Define sites that are outside of the CV Pathfinder hierarchy. + + This is used to arrange pathfinders in the CloudVision topology layout.' + type: list + primary_key: name + items: + type: dict + keys: + name: + type: str + description: The site name. + description: + type: str + location: + type: str + description: Location as a string is resolved on Cloudvision. + cv_pathfinder_internet_exit_policies: + description: 'PREVIEW: These keys are in preview mode. + + + List of internet-exit policies used for the WAN configuration.' + type: list + primary_key: name + items: + type: dict + keys: + name: + type: str + description: Internet-exit policy name. + type: + type: str + description: 'Internet-exit policy type. + + direct: Exit directly over wan interfaces + + zscaler: Exit using Zscaler secure web gateway service' + valid_values: + - direct + - zscaler + required: true + fallback_to_system_default: + type: bool + default: true + description: Add system default exit-group at the end of the policy. + zscaler: + type: dict + description: Zscaler information. Only used if `type` is 'zscaler'. + keys: + ipsec_key_salt: + type: str + required: true + description: '"Salt" used for auto generation of encryption keys for + IPsec tunnels to Zscaler. + + The keys will be generated as a hash of `salt__`. + + Since this salt can be used to deduct the encryption key, it is recommeneded + to use vault.' + domain_name: + type: str + required: true + description: Domain name as configured in Zscaler for the tenant. Used + as UFQDN suffix for authentication. + encrypt_traffic: + type: bool + default: true + description: 'When `true` the traffic going over the tunnels will be + encrypted with AES-256-GCM. Otherwise the traffic will be using NULL + encryption. + + Note that encryption requires a subscription on the Zscaler account.' + download_bandwidth: + type: int + description: Maximum allowed download bandwidth in Mbps for each device + using this policy. + upload_bandwidth: + type: int + description: Maximum allowed upload bandwidth in Mbps for each device + using this policy. + firewall: + type: dict + keys: + enabled: + type: bool + description: Enforce firewall controls. + default: false + ips: + type: bool + description: Enable IPS Controls for the firewall. + default: false + acceptable_use_policy: + type: bool + description: Display an Acceptable Use Policy (AUP) and require users + to accept it. + default: false cv_pathfinder_regions: documentation_options: table: wan-cv-pathfinder-regions description: Define the CV Pathfinder hierarchy. type: list primary_key: name + unique_keys: + - id + - sites.name items: type: dict $ref: eos_cli_config_gen#/keys/router_adaptive_virtual_topology/keys/region keys: name: type: str - description: The region name. + min_length: 1 + max_length: 128 description: type: str id: @@ -616,6 +722,8 @@ keys: description: All sites are placed in a default zone "-ZONE" with ID 1. primary_key: name + unique_keys: + - id items: type: dict $ref: eos_cli_config_gen#/keys/router_adaptive_virtual_topology/keys/site @@ -623,6 +731,8 @@ keys: name: type: str description: The site name. + min_length: 1 + max_length: 128 description: type: str id: @@ -633,11 +743,27 @@ keys: the site ID must be unique within a region.' location: type: str - description: Location as a sring is resolved on Cloudvision. + description: Location as a string is resolved on Cloudvision. site_contact: type: str site_after_hours_contact: type: str + cv_server: + documentation_options: + table: wan-cv-pathfinder-zscaler-integration + description: 'PREVIEW: These keys are in preview mode. + + + Hostname or IP address of CloudVision host. Ex. "www.arista.io" for CVaaS. + + For `eos_designs` this variable is only used for the WAN Internet-exit integration + with Zscaler. + + The same variable name is also used by the `cv_deploy` role, and will override + the value of `ansible_host` on inventory ''cloudvision'' host. + + Make sure to set it in a common group_vars file.' + type: str cv_tags_topology_type: documentation_options: table: cloudvision-tags @@ -651,6 +777,23 @@ keys: - spine - core - edge + cv_token: + documentation_options: + table: wan-cv-pathfinder-zscaler-integration + description: 'PREVIEW: These keys are in preview mode. + + + Service account token as defined on CloudVision. This value should be using + Ansible Vault. + + For `eos_designs` this variable is only used for the WAN Internet-exit integration + with Zscaler. + + The same variable name is also used by the `cv_deploy` role, and will override + the value of `ansible_password` on inventory ''cloudvision'' host. + + Make sure to set it in a common group_vars file.' + type: str cv_topology: documentation_options: table: cv-topology @@ -730,7 +873,7 @@ keys: ' items: type: str - description: IPv4 address or DNS name for CloudVision + description: IPv4 address or DNS name for CloudVision. cvp_token_file: documentation_options: table: cloudvision-settings @@ -770,7 +913,7 @@ keys: - str description: 'Default interface MTU configured on EOS under "interface defaults". - Can be overriden per platform under platform settings. + Can be overridden per platform under platform settings. ' min: 68 @@ -1077,7 +1220,16 @@ keys: evpn_vlan_aware_bundles: documentation_options: table: evpn-settings - description: Enable vlan aware bundles for EVPN MAC-VRF. + description: 'Enable VLAN aware bundles for every EVPN MAC-VRF. + + If set to `true` all SVIs in a VRF are configured in a vlan-aware-bundle using + the VRF name as the bundle name. `l2vlans` are bundled in vlan-aware-bundles + using the VLAN name as the bundle name. + + + The `evpn_vlan_bundle` option under `svis` and `l2vlans` takes precedence and + overrides this behavior. Per svi/l2vlan `evpn_vlan_bundle` also works when this + setting is disabled which allow mixing vlan-aware-bundles with regular MAC-VRFs.' type: bool default: false evpn_vlan_bundles: @@ -1117,7 +1269,7 @@ keys: define it.\nrt_override will default to vni_override if set.\n\nrt_override supports two formats:\n - A single number which will be used in the RT fields instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rt_type' for details).\n - \ - A full RT string with colon seperator which will override the full + \ - A full RT string with colon separator which will override the full RT.\n" rd_override: type: str @@ -1129,7 +1281,7 @@ keys: set.\n\nrd_override supports two formats:\n - A single number which will be used in the RD assigned number field instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rd_type' for details).\n - A full RD string with colon - seperator which will override the full RD.\n" + separator which will override the full RD.\n" evpn_l2_multi_domain: type: bool description: 'Explicitly extend VLAN-Aware Bundle to remote EVPN domains. @@ -1154,6 +1306,53 @@ keys: - mpls default: vxlan type: str + fabric_flow_tracking: + documentation_options: + table: management-flow-tracking-settings + type: dict + description: 'Default enabling of flow-tracking(IPFIX) for various interface types + across the fabric. + + Flow Tracking can also be enabled/disabled under each of the specific data models. + + For general flow-tracking settings see `flow_tracking_settings`.' + keys: + uplinks: + description: Enable flow-tracking on all fabric uplinks. + type: dict + $ref: eos_designs#/$defs/flow_tracking_link + downlinks: + description: Enable flow-tracking on all fabric downlinks. + type: dict + $ref: eos_designs#/$defs/flow_tracking_link + endpoints: + description: Enable flow-tracking on all endpoints ports. + type: dict + $ref: eos_designs#/$defs/flow_tracking_link + l3_edge: + description: Enable flow-tracking on all p2p_links defined under l3_edge. + type: dict + $ref: eos_designs#/$defs/flow_tracking_link + core_interfaces: + description: Enable flow-tracking on all p2p_links defined under core_interfaces. + type: dict + $ref: eos_designs#/$defs/flow_tracking_link + mlag_interfaces: + description: Enable flow-tracking on all MLAG peer interfaces. + type: dict + $ref: eos_designs#/$defs/flow_tracking_link + l3_interfaces: + description: Enable flow-tracking on all node.l3_interfaces. + type: dict + $ref: eos_designs#/$defs/flow_tracking_link + dps_interfaces: + description: Enable flow-tracking on all dps_interfaces. + type: dict + $ref: eos_designs#/$defs/flow_tracking_link + direct_wan_ha_links: + description: Enable flow-tracking on all direct WAN HA links. + type: dict + $ref: eos_designs#/$defs/flow_tracking_link fabric_ip_addressing: type: dict keys: @@ -1188,6 +1387,15 @@ keys: - str description: IPv4 prefix length used for MLAG peer-vlan and L3 point-to-point SVIs over the MLAG peer-link. + ipv6_prefix_length: + type: int + default: 64 + min: 1 + max: 127 + convert_types: + - str + description: IPv6 prefix length used for MLAG peer-vlan and L3 point-to-point + SVIs over the MLAG peer-link. p2p_uplinks: type: dict keys: @@ -1236,50 +1444,154 @@ keys: description: Enable sFlow on all MLAG peer interfaces. type: bool flow_tracking_settings: + documentation_options: + table: management-flow-tracking-settings description: 'PREVIEW: This key is currently not supported Define the flow tracking parameters for this topology.' type: dict keys: - flow_tracker_name: - type: str - default: FLOW-TRACKER - description: Flow Tracker Name. - record_export: + sampled: type: dict + description: The options relevant only for flow tracker type sampled. keys: - on_inactive_timeout: - description: Flow record inactive export timeout in milliseconds. - type: int - convert_types: - - str - min: 3000 - max: 900000 - default: 70000 - on_interval: + encapsulation: + type: dict + keys: + ipv4_ipv6: + type: bool + mpls: + type: bool + sample: type: int convert_types: - str - min: 1000 - max: 36000000 - default: 300000 - description: Flow record export interval in milliseconds. - exporter: + min: 1 + max: 4294967295 + default: 10000 + hardware_offload: + type: dict + keys: + ipv4: + type: bool + description: Configure hardware offload for IPv4 traffic. + ipv6: + type: bool + description: Configure hardware offload for IPv6 traffic. + threshold_minimum: + type: int + convert_types: + - str + min: 1 + max: 4294967295 + description: Minimum number of samples. + hardware: type: dict + description: The options relevant only for flow tracker type hardware. keys: - name: - type: str - default: CV-TELEMETRY - description: Exporter Name. - template_interval: - description: Template interval in milliseconds. - type: int - convert_types: - - str - min: 5000 - max: 3600000 - default: 3600000 + record: + type: dict + keys: + format_ipfix_standard_timestamps_counters: + type: bool + description: Enable software export of IPFIX data records. + trackers: + type: list + primary_key: name + items: + type: dict + keys: + name: + type: str + description: Tracker Name + sampled: + type: dict + description: The options relevant only for flow tracker type sampled. + keys: + table_size: + type: int + convert_types: + - str + min: 1 + max: 614400 + description: 'Maximum number of entries in flow table. + + ' + record_export: + type: dict + keys: + mpls: + type: bool + description: Export MPLS forwarding information. + record_export: + type: dict + keys: + on_inactive_timeout: + type: int + convert_types: + - str + min: 3000 + max: 900000 + description: Flow record inactive export timeout in milliseconds + on_interval: + type: int + convert_types: + - str + min: 1000 + max: 36000000 + description: Flow record export interval in milliseconds + exporters: + type: list + primary_key: name + items: + type: dict + keys: + name: + type: str + description: Exporter Name + collector: + type: dict + keys: + host: + type: str + description: Collector IPv4 address or IPv6 address or fully + qualified domain name + port: + type: int + description: Collector Port Number + min: 1 + max: 65535 + convert_types: + - str + format: + type: dict + keys: + ipfix_version: + type: int + convert_types: + - str + local_interface: + type: str + description: Local Source Interface + template_interval: + type: int + convert_types: + - str + min: 5000 + max: 3600000 + description: Template interval in milliseconds + default: + - name: FLOW-TRACKER + record_export: + on_inactive_timeout: 70000 + on_interval: 300000 + exporters: + - name: CV-TELEMETRY + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 3600000 generate_cv_tags: documentation_options: table: cloudvision-tags @@ -1419,7 +1731,7 @@ keys: source: type: str description: 'This field supports substitution of the fields "interface_ip" - and "peer_ip". + for SVIs and both "interface_ip" and "peer_ip" for Layer 3 interfaces. Alternatively it can be set with a static value of "any", "/" or "". @@ -1430,7 +1742,7 @@ keys: destination: type: str description: 'This field supports substitution of the fields "interface_ip" - and "peer_ip". + for SVIs and both "interface_ip" and "peer_ip" for Layer 3 interfaces. Alternatively it can be set with a static value of "any", "/" or "". @@ -1679,7 +1991,7 @@ keys: description: Configure IP routing for the OOB Management VRF. mlag_ibgp_peering_vrfs: documentation_options: - table: overlay-settings + table: network-services-vrfs-settings type: dict description: 'On mlag leafs, an SVI interface is defined per vrf, to establish iBGP peering (required when there are MLAG leafs in topology). @@ -1721,7 +2033,7 @@ keys: description: List of DNS servers. The VRF is set to < mgmt_interface_vrf >. items: type: str - description: IPv4 address + description: IPv4 or IPv6 address. network_ports: type: list items: @@ -1907,6 +2219,13 @@ keys: Only supported if `overlay_routing_protocol` is set to `ibgp`. ' + default_flow_tracker_type: + type: str + valid_values: + - sampled + - hardware + description: Set the default flow tracker type. + default: sampled mlag_support: type: bool default: false @@ -2029,7 +2348,7 @@ keys: description: Path to Custom J2 template. interface_descriptions: type: dict - description: 'Override interface_descriptions templates + description: 'Override interface_descriptions templates. If description templates use Jinja2, they have to strip whitespaces using {%- -%} on any code blocks. @@ -2163,7 +2482,7 @@ keys: type: list items: type: str - description: '''inventory_hostname'' of CVX server + description: '''inventory_hostname'' of CVX server. ' overlay_her_flood_list_per_vni: @@ -2599,12 +2918,29 @@ keys: management_interface: type: str default: Management1 + security_entropy_sources: + description: Entropy source improves the randomness of the numbers used + to generate MACsec's cryptographic keys. + type: dict + keys: + hardware: + type: bool + description: Use a hardware based source. + haveged: + type: bool + description: Use the HAVEGE algorithm. + cpu_jitter: + type: bool + description: Use the Jitter RNG algorithm of a CPU based source. + hardware_exclusive: + type: bool + description: Only use entropy from the hardware source. structured_config: type: dict documentation_options: hide_keys: true description: Custom structured config for eos_cli_config_gen. - $ref: eos_cli_config_gen#/ + $ref: eos_cli_config_gen# raw_eos_cli: type: str description: EOS CLI rendered directly on the root level of the final EOS @@ -2657,6 +2993,14 @@ keys: reload_delay: mlag: 300 non_mlag: 330 + - platforms: + - 7010TX + feature_support: + queue_monitor_length_notify: false + per_interface_mtu: false + reload_delay: + mlag: 300 + non_mlag: 330 - platforms: - 7280R - 7280R2 @@ -2739,6 +3083,26 @@ keys: reload_delay: mlag: 300 non_mlag: 330 + - platforms: + - AWE-5310 + - AWE-5510 + - AWE-7250R + - AWE-7230R + feature_support: + bgp_update_wait_for_convergence: true + bgp_update_wait_install: false + interface_storm_control: false + queue_monitor_length_notify: false + management_interface: Management1/1 + - platforms: + - AWE-7220R + feature_support: + bgp_update_wait_for_convergence: true + bgp_update_wait_install: false + interface_storm_control: false + queue_monitor_length_notify: false + poe: true + management_interface: Management1 platform_speed_groups: documentation_options: table: platform-settings @@ -2960,6 +3324,20 @@ keys: For default enabling of sFlow for various interface types across the fabric see `fabric_sflow`.' keys: + sample: + type: dict + keys: + rate: + type: int + convert_types: + - str + min: 1 + max: 4294967295 + description: 'Packet sampling rate that defines the average number of + ingress packets that pass through an interface for every packet that + is sampled. + + A rate of 16384 corresponds to an average sample of one per 16384 packets.' destinations: type: list items: @@ -3010,6 +3388,13 @@ keys: If set for the VRFs defined by `mgmt_interface_vrf` or `inband_mgmt_vrf`, this setting will take precedence.' + shutdown_bgp_towards_undeployed_peers: + documentation_options: + table: fabric-settings + type: bool + default: false + description: 'When a device is set undeployed using `is_deployed: false` and `shutdown_bgp_towards_undeployed_peers` + key is set to true, the BGP neighborship is shutdown on the peer.' shutdown_interfaces_towards_undeployed_peers: documentation_options: table: fabric-settings @@ -3052,9 +3437,9 @@ keys: documentation_options: table: management-snmp-settings type: dict - description: 'SNMP settings + description: 'SNMP settings. - For SNMP local-interfaces see "source_interfaces.snmp" + For SNMP local-interfaces see "source_interfaces.snmp". Configuration of remote SNMP engine IDs are currently only possible using `structured_config`.' keys: @@ -3127,10 +3512,10 @@ keys: keys: name: type: str - description: Username + description: Username. group: type: str - description: Group name + description: Group name. version: type: str valid_values: @@ -3370,7 +3755,7 @@ keys: keys: profile: type: str - description: Profile name + description: Profile name. parent_profile: type: str description: 'Parent SVI profile name to apply. @@ -3512,6 +3897,12 @@ keys: ' type: bool default: false + underlay_isis_bfd: + documentation_options: + table: isis-settings + type: bool + default: false + description: Enable BFD for ISIS on all underlay links. underlay_isis_instance_name: documentation_options: table: isis-settings @@ -3750,7 +4141,7 @@ keys: wan_ha: documentation_options: table: wan-settings - description: 'PREVIEW: The `wan_ha` key is currently not supported' + description: 'PREVIEW: The `wan_ha` key is currently not supported.' type: dict keys: lan_ha_path_group_name: @@ -3893,7 +4284,7 @@ keys: convert_types: - int description: 'Interval in milliseconds. Valid values are 50-60000 | - "auto" + "auto". When auto, the interval and failure_threshold are automatically determined @@ -4127,7 +4518,7 @@ keys: is used. id: type: int - $ref: eos_cli_config_gen#keys/router_adaptive_virtual_topology/keys/vrfs/items/keys/profiles/items/keys/id + $ref: eos_cli_config_gen#/keys/router_adaptive_virtual_topology/keys/vrfs/items/keys/profiles/items/keys/id required: false min: 2 max: 253 @@ -4161,6 +4552,75 @@ keys: description: When set, no `catch-all` match is configured for the policy and unmatched traffic is dropped. default: false + zscaler_endpoints: + type: dict + description: 'PREVIEW: These keys are in preview mode. + + + Special data model used for testing the WAN internet-exit integration with Zscaler. + + The model is supposed to be autofilled per-device by `eos_designs`. + + Manually setting this model will take precedence and prevent `eos_designs` from + trying to contact CloudVision. + + This can be useful for offline testing or if CloudVision is not available or + not configured for Zscaler integration.' + keys: + primary: + type: dict + required: true + keys: + ip_address: + type: str + required: true + datacenter: + type: str + required: true + city: + type: str + required: true + country: + type: str + required: true + latitude: + type: str + convert_types: + - int + - float + required: true + longitude: + type: str + convert_types: + - int + - float + required: true + secondary: + type: dict + $ref: eos_designs#/keys/zscaler_endpoints/keys/primary + required: false + tertiary: + type: dict + $ref: eos_designs#/keys/zscaler_endpoints/keys/primary + required: false + cloud_name: + description: The name of the Zscaler cloud the CloudVision cluster is integrated + with like 'zscaler1' or 'zscalerbeta'. + type: str + required: true + device_location: + description: The location of the calling device after being resolved by Zscaler + location APIs. This is required since Zscaler only accepts their own variants + of City and Country. + type: dict + required: true + keys: + city: + type: str + required: true + country: + type: str + required: true dynamic_keys: connected_endpoints_keys.key: $ref: eos_designs#/$defs/connected_endpoints @@ -4195,7 +4655,7 @@ $defs: type: str description: 'By default the description is built leveraging `_`. - When set this key will overide the default value on the physical ports. + When set this key will override the default value on the physical ports. ' profile: @@ -4318,7 +4778,7 @@ $defs: - 'on' qos_profile: type: str - description: QOS profile name + description: QOS profile name. ptp: type: dict description: 'The global PTP profile parameters will be applied to all connected @@ -4347,10 +4807,13 @@ $defs: - smpte2059-2 sflow: type: bool - description: 'Configures sFlow on the interface. Overrides `fabric_sflow` + description: Configures sFlow on the interface. Overrides `fabric_sflow.endpoints` + setting. + flow_tracking: + type: dict + $ref: eos_designs#/$defs/flow_tracking_link + description: Configures flow-tracking on the interface. Overrides `fabric_flow_tracking.endpoints` setting. - - ' link_tracking: type: dict description: 'Configure the downstream interfaces of a respective Link Tracking @@ -4592,7 +5055,7 @@ $defs: type: bool size: type: int - description: Size in bytes + description: Size in bytes. convert_types: - str ethernet_segment: @@ -4686,6 +5149,17 @@ $defs: Setting to false will set port to ''shutdown'' in intended configuration. ' + ptp_mpass: + type: bool + default: false + description: 'When MPASS is enabled on an MLAG port-channel, MLAG peers + coordinate to function as a single PTP logical device. + + Arista PTP enabled devices always place PTP messages on the same physical + link within the port-channel. + + Hence, MPASS is needed only on MLAG port-channels connected to non-Arista + devices.' esi: type: str description: Format xxxx:xxxx:xxxx. @@ -4767,12 +5241,12 @@ $defs: type: int convert_types: - str - description: Subinterface number + description: Subinterface number. short_esi: type: str - description: 'In format xxxx:xxxx:xxxx or "auto" + description: 'In format xxxx:xxxx:xxxx or "auto". - Required for multihomed port-channels with subinterfaces + Required for multihomed port-channels with subinterfaces. ' vlan_id: @@ -4810,7 +5284,7 @@ $defs: for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: eos_cli_config_gen#/keys/port_channel_interfaces/items/ + $ref: eos_cli_config_gen#/keys/port_channel_interfaces/items validate_state: type: bool description: Set to false to disable interface validation by the `eos_validate_state` @@ -4825,7 +5299,7 @@ $defs: for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: eos_cli_config_gen#/keys/ethernet_interfaces/items/ + $ref: eos_cli_config_gen#/keys/ethernet_interfaces/items connected_endpoints: type: list primary_key: name @@ -4879,7 +5353,7 @@ $defs: ' items: type: str - description: Device + description: Device. endpoint_ports: type: list description: 'Endpoint ports is used for description, required unless @@ -4910,6 +5384,14 @@ $defs: items: type: str description: Used for documentation purposes. + flow_tracking_link: + type: dict + keys: + enabled: + type: bool + name: + type: str + description: Flow tracker name as defined in flow_tracking_settings. ipsec_profile: type: dict keys: @@ -5084,6 +5566,10 @@ $defs: This setting can be overridden per VRF. ' + evpn_vlan_bundle: + type: str + description: Enable `evpn_vlan_bundle` for all l2vlans and SVIs under the + tenant. This `evpn_vlan_bundle` should be present in `evpn_vlan_bundles`. bgp_peer_groups: documentation_options: table: network-services-vrfs-bgp-settings @@ -5120,6 +5606,46 @@ $defs: mapped to the corresponding peer_group. ' + address_family_ipv4: + type: dict + keys: + activate: + type: bool + route_map_in: + type: str + description: Inbound route-map name. + route_map_out: + type: str + description: Outbound route-map name. + default_originate: + type: dict + $ref: eos_cli_config_gen#/keys/router_bgp/keys/address_family_ipv4/keys/peer_groups/items/keys/default_originate + next_hop: + type: dict + $ref: eos_cli_config_gen#/keys/router_bgp/keys/address_family_ipv4/keys/peer_groups/items/keys/next_hop + prefix_list_in: + type: str + description: Inbound prefix-list name. + prefix_list_out: + type: str + description: Outbound prefix-list name. + address_family_ipv6: + type: dict + keys: + activate: + type: bool + route_map_in: + type: str + description: Inbound route-map name. + route_map_out: + type: str + description: Outbound route-map name. + prefix_list_in: + type: str + description: Inbound prefix-list name. + prefix_list_out: + type: str + description: Outbound prefix-list name. evpn_l2_multicast: documentation_options: table: network-services-multicast-settings @@ -5140,7 +5666,7 @@ $defs: type: bool underlay_l2_multicast_group_ipv4_pool: type: str - description: IPv4_address/Mask + description: IPv4_address/Mask. underlay_l2_multicast_group_ipv4_pool_offset: type: int convert_types: @@ -5171,7 +5697,7 @@ $defs: type: bool evpn_underlay_l3_multicast_group_ipv4_pool: type: str - description: IPv4_address/Mask + description: IPv4_address/Mask. required: true evpn_underlay_l3_multicast_group_ipv4_pool_offset: type: int @@ -5262,7 +5788,7 @@ $defs: source_address: type: str format: ipv4 - description: Default IP address of Loopback0 + description: Default IP address of Loopback0. version: type: int convert_types: @@ -5368,7 +5894,7 @@ $defs: this value and statically define it.\n\nrd_override supports two formats:\n - A single number will be used in the RD assigned number subfield (second part of the RD).\n - A full RD string with colon - seperator which will override the full RD.\n" + separator which will override the full RD.\n" rt_override: type: str convert_types: @@ -5378,7 +5904,7 @@ $defs: this value and statically define it.\n\nrt_override supports two formats:\n - A single number will be used in the RT assigned number subfield (second part of the RT).\n - A full RT string with colon - seperator which will override the full RT.\n" + separator which will override the full RT.\n" mlag_ibgp_peering_ipv4_pool: type: str description: 'IPv4_address/Mask @@ -5717,8 +6243,10 @@ $defs: description: 'Name of a bundle defined under ''evpn_vlan_bundles'' to inherit configuration. - To use this option the common "evpn_vlan_aware_bundles" option - must be set to true. + This setting overrides "evpn_vlan_bundle" set at tenant level. + + The common option "evpn_vlan_aware_bundles" is disregarded + for this option. ' nodes: @@ -5855,7 +6383,7 @@ $defs: pim: type: dict description: 'Enable PIM sparse-mode on the interface; requires - "evpn_l3_multicast" to be enabled on the VRF/Tenant + "evpn_l3_multicast" to be enabled on the VRF/Tenant. Enabling this implicitly makes the device a PIM External Gateway (PEG) in EVPN designs only. @@ -5867,13 +6395,18 @@ $defs: keys: enabled: type: bool + flow_tracking: + type: dict + $ref: eos_designs#/$defs/flow_tracking_link + description: Configures flow-tracking on the interface. Overrides + `fabric_flow_tracking.l3_interfaces` setting. structured_config: type: dict description: Custom structured config added under ethernet_interfaces.[name=] for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: eos_cli_config_gen#/keys/ethernet_interfaces/items/ + $ref: eos_cli_config_gen#/keys/ethernet_interfaces/items raw_eos_cli: type: str description: 'EOS CLI rendered directly on the Ethernet interface @@ -6031,6 +6564,7 @@ $defs: table: network-services-vrfs-bgp-settings type: list primary_key: ip_address + allow_duplicate_primary_key: true convert_types: - dict description: 'List of BGP peer definitions. @@ -6186,7 +6720,7 @@ $defs: for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: eos_cli_config_gen#/keys/router_bgp/keys/vrfs/items/ + $ref: eos_cli_config_gen#/keys/router_bgp/keys/vrfs/items bgp_peer_groups: documentation_options: table: network-services-vrfs-bgp-settings @@ -6220,6 +6754,46 @@ $defs: a bgp_peer mapped to the corresponding peer_group. ' + address_family_ipv4: + type: dict + keys: + activate: + type: bool + route_map_in: + type: str + description: Inbound route-map name. + route_map_out: + type: str + description: Outbound route-map name. + default_originate: + type: dict + $ref: eos_cli_config_gen#/keys/router_bgp/keys/address_family_ipv4/keys/peer_groups/items/keys/default_originate + next_hop: + type: dict + $ref: eos_cli_config_gen#/keys/router_bgp/keys/address_family_ipv4/keys/peer_groups/items/keys/next_hop + prefix_list_in: + type: str + description: Inbound prefix-list name. + prefix_list_out: + type: str + description: Outbound prefix-list name. + address_family_ipv6: + type: dict + keys: + activate: + type: bool + route_map_in: + type: str + description: Inbound route-map name. + route_map_out: + type: str + description: Outbound route-map name. + prefix_list_in: + type: str + description: Inbound prefix-list name. + prefix_list_out: + type: str + description: Outbound prefix-list name. additional_route_targets: documentation_options: table: network-services-vrfs-settings @@ -6253,7 +6827,7 @@ $defs: description: Custom structured config for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: eos_cli_config_gen#/ + $ref: eos_cli_config_gen# l2vlans: documentation_options: table: network-services-l2vlans-settings @@ -6272,7 +6846,7 @@ $defs: - str min: 1 max: 4094 - description: VLAN ID + description: VLAN ID. vni_override: type: int convert_types: @@ -6295,7 +6869,7 @@ $defs: if set.\n\nrt_override supports two formats:\n - A single number which will be used in the RT fields instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rt_type' for details).\n - A full RT string with - colon seperator which will override the full RT.\n" + colon separator which will override the full RT.\n" rd_override: type: str convert_types: @@ -6306,12 +6880,12 @@ $defs: vni_override if set.\n\nrd_override supports two formats:\n - A single number which will be used in the RD assigned number field instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rd_type' for details).\n - \ - A full RD string with colon seperator which will override the + \ - A full RD string with colon separator which will override the full RD.\n" name: type: str required: true - description: VLAN name + description: VLAN name. tags: type: list description: 'Tags leveraged for networks services filtering. @@ -6343,8 +6917,10 @@ $defs: description: 'Name of a bundle defined under ''evpn_vlan_bundles'' to inherit configuration. - To use this option the common "evpn_vlan_aware_bundles" option must - be set to true. + This setting overrides "evpn_vlan_bundle" set at tenant level. + + The common option "evpn_vlan_aware_bundles" is disregarded for this + option. ' trunk_groups: @@ -6425,7 +7001,7 @@ $defs: ' documentation_options: hide_keys: true - $ref: eos_cli_config_gen#/keys/router_bgp/keys/vlans/items/ + $ref: eos_cli_config_gen#/keys/router_bgp/keys/vlans/items raw_eos_cli: type: str description: 'EOS cli commands rendered on router_bgp.vlans. @@ -6450,7 +7026,7 @@ $defs: keys: name: type: str - description: Pseudowire name + description: Pseudowire name. type: type: str default: vpws-pseudowire @@ -6466,7 +7042,7 @@ $defs: keys: number: type: int - description: Subinterface number + description: Subinterface number. convert_types: - str endpoints: @@ -6487,7 +7063,7 @@ $defs: nodes: type: list description: Usually one node. With ESI multihoming we support - two nodes per pseudowire endpoint + two nodes per pseudowire endpoint. required: true min_length: 1 items: @@ -6582,12 +7158,20 @@ $defs: description: Node management interface IPv4 address. type: str format: cidr + mgmt_gateway: + type: str + description: This key sets the management gateway for the device. It takes + precedence over the global `mgmt_gateway`. ipv6_mgmt_ip: documentation_options: table: node-type-common-configuration description: Node management interface IPv6 address. type: str format: cidr + ipv6_mgmt_gateway: + type: str + description: This key sets the ipv6 management gateway for the device. + It takes precedence over the global `ipv6_mgmt_gateway`. mgmt_interface: documentation_options: table: node-type-common-configuration @@ -6697,7 +7281,7 @@ $defs: hide_keys: true description: Custom structured config for eos_cli_config_gen. type: dict - $ref: eos_cli_config_gen#/ + $ref: eos_cli_config_gen# uplink_type: documentation_options: table: node-type-uplink-configuration @@ -6717,7 +7301,7 @@ $defs: uplink_interfaces: documentation_options: table: node-type-uplink-configuration - description: 'Local uplink interfaces + description: 'Local uplink interfaces. Each list item supports range syntax that can be expanded into a list of interfaces. @@ -6781,6 +7365,16 @@ $defs: ' type: str + uplink_mtu: + documentation_options: + table: node-type-uplink-configuration + description: Point-to-Point uplinks MTU in bytes. This setting overrides + the `p2p_uplinks_mtu` setting. + type: int + convert_types: + - str + min: 68 + max: 65535 max_uplink_switches: documentation_options: table: node-type-uplink-configuration @@ -6909,7 +7503,7 @@ $defs: ' mlag_port_channel_structured_config: - $ref: eos_cli_config_gen#/keys/port_channel_interfaces/items/ + $ref: eos_cli_config_gen#/keys/port_channel_interfaces/items documentation_options: table: node-type-l2-mlag-configuration hide_keys: true @@ -6926,7 +7520,7 @@ $defs: ' mlag_peer_vlan_structured_config: - $ref: eos_cli_config_gen#/keys/vlan_interfaces/items/ + $ref: eos_cli_config_gen#/keys/vlan_interfaces/items documentation_options: table: node-type-l2-mlag-configuration hide_keys: true @@ -6943,7 +7537,7 @@ $defs: ' mlag_peer_l3_vlan_structured_config: - $ref: eos_cli_config_gen#/keys/vlan_interfaces/items/ + $ref: eos_cli_config_gen#/keys/vlan_interfaces/items documentation_options: table: node-type-l2-mlag-configuration hide_keys: true @@ -7435,17 +8029,39 @@ $defs: documentation_options: table: node-type-l2-mlag-configuration type: str + mlag_peer_address_family: + documentation_options: + table: node-type-l2-mlag-configuration + description: 'IP address family used to establish MLAG Peer Link (control + link). + + `ipv6` requires EOS version 4.31.1F or higher. + + Note: `ipv6` is not supported in combination with a common MLAG peer + link VLAN (ex. `mlag_l3_peer_vlan` set to 4094).' + type: str + valid_values: + - ipv4 + - ipv6 + default: ipv4 mlag_peer_ipv4_pool: documentation_options: table: node-type-l2-mlag-configuration - description: 'IP address pool used for MLAG Peer Link (control link). + description: 'IPv4 address pool used for MLAG Peer Link (control link). IP is derived from the node id. - Required when MLAG leafs present in topology. - - ' + Required for MLAG leafs when `mlag_peer_address_family` is `ipv4` (default).' type: str format: ipv4_cidr + mlag_peer_ipv6_pool: + documentation_options: + table: node-type-l2-mlag-configuration + description: 'IPv6 address pool used for MLAG Peer Link (control link). + IP is derived from the node id. + + Required for MLAG leafs when `mlag_peer_address_family` is `ipv6`.' + type: str + format: ipv6_cidr mlag_port_channel_id: documentation_options: table: node-type-l2-mlag-configuration @@ -8059,9 +8675,13 @@ $defs: type: str description: 'The CV Pathfinder site name. - This key is required for WAN routers but ignored for pathfinders. + This key is required for WAN routers but optional for pathfinders. + + For WAN routers and pathfinders with `cv_pathfinder_region`, the site + name must be defined for the relevant region under ''cv_pathfinder_regions''. - The site name must be defined for the relevant region under ''cv_pathfinder_regions''.' + For pathfinders without `cv_pathfinder_region` set, the site must be + defined under `cv_pathfinder_global_sites`.' wan_ha: documentation_options: table: node-type-wan-configuration @@ -8086,6 +8706,36 @@ $defs: default: true description: Enable / Disable IPsec over HA path-group when HA is enabled. + ha_interfaces: + description: "Local WAN HA interfaces\nOverwrite the default behavior + which is to pick all the `uplink_interfaces`.\nCan be used to filter + uplink interfaces when there are multiple uplinks.\nLimitations:\n + \ Either all interfaces must be uplinks or all interfaces must not + be uplinks.\n Only one interface is supported for non uplinks." + type: list + items: + type: str + pattern: Ethernet[\d/]+ + ha_ipv4_pool: + description: 'IP address pool used for WAN HA connectivity. + + IP is derived from the node ID. + + Not used for uplink interfaces.' + type: str + format: ipv4_cidr + max_ha_interfaces: + type: int + convert_types: + - str + description: 'Number of parallel links towards HA switches. + + Can be used to reserve IP addresses for future parallel HA links.' + flow_tracking: + type: dict + $ref: eos_designs#/$defs/flow_tracking_link + description: Configures flow-tracking on the HA interfaces. Overrides + `fabric_flow_tracking.wan_ha_links` setting. dps_mss_ipv4: documentation_options: table: node-type-wan-configuration @@ -8119,6 +8769,17 @@ $defs: This setting is useful on virtual Route Reflectors and Pathfinders where more CPU cores should be allocated for control plane.' + flow_tracker_type: + type: str + valid_values: + - sampled + - hardware + description: 'Set the flow tracker type. + + Override the `default_flow_tracker_type`` set at the `node_type_key` + level. + + `default_flow_tracker_type` default value is `sampled`.' node_groups: type: list description: Define variables related to all nodes part of this group. @@ -8186,7 +8847,7 @@ $defs: name: type: str description: 'Ethernet interface name like ''Ethernet2'' or subinterface - name like ''Ethernet2.42'' + name like ''Ethernet2.42''. For a subinterface, the parent physical interface is automatically created.' pattern: Ethernet[\d/]+(.[\d]+)? @@ -8194,7 +8855,7 @@ $defs: type: str description: 'Interface description. - If not set a default description will be configured with ''[[ ]]''' + If not set a default description will be configured with ''[[ ]]''.' ip_address: type: str description: Node IPv4 address/Mask or 'dhcp'. @@ -8240,19 +8901,44 @@ $defs: ` or `auto `. peer: type: str - description: The peer device name. Used for description and documentation + description: The peer device name. Used for description and documentation. peer_interface: type: str - description: The peer device interface. Used for description and documentation + description: The peer device interface. Used for description and documentation. peer_ip: type: str description: The peer device IPv4 address (no mask). Used as default route gateway if `set_default_route` is true and `ip` is an IP address. + bgp: + type: dict + description: Enforce IPv4 BGP peering for the peer + keys: + peer_as: + type: str + required: true + convert_types: + - int + description: 'BGP AS <1-4294967295> or AS number in asdot notation "<1-65535>.<0-65535>". + + For asdot notation in YAML inputs, the value must be put in quotes, + to prevent it from being interpreted as a float number.' + ipv4_prefix_list_in: + type: str + description: 'Prefix List Name. Accept routes for only these prefixes + from the peer. + + Required for wan interfaces.' + ipv4_prefix_list_out: + type: str + description: 'Prefix List Name. Advertise routes for only these prefixes. + + If not specified, nothing would be advertised.' ipv4_acl_in: description: 'Name of the IPv4 access-list to be assigned in the ingress direction. - The access-list must be defined under `ipv4_acls`. + The access-list must be defined under `ipv4_acls` and supports field substitution + for "interface_ip" and "peer_ip". Required for all WAN interfaces (`wan_carrier` is set) unless the carrier is marked as ''trusted'' under `wan_carriers`.' @@ -8263,7 +8949,8 @@ $defs: description: 'Name of the IPv4 Access-list to be assigned in the egress direction. - The access-list must be defined under `ipv4_acls`.' + The access-list must be defined under `ipv4_acls` and supports field substitution + for "interface_ip" and "peer_ip".' type: str convert_types: - int @@ -8277,7 +8964,7 @@ $defs: prefix: type: str required: true - description: IPv4_network/Mask + description: IPv4_network/Mask. qos_profile: type: str description: QOS service profile. @@ -8302,16 +8989,42 @@ $defs: default: true description: For a WAN interface (`wan_carrier` is set), allow to disable the static tunnel towards Pathfinders. + cv_pathfinder_internet_exit: + description: 'PREVIEW: This key is in preview mode' + type: dict + keys: + policies: + type: list + primary_key: name + description: List of Internet-exit policies using this interface as + exit. + items: + type: dict + keys: + name: + type: str + description: Internet-exit policy name. + tunnel_interface_numbers: + type: str + description: 'Number range to use for Tunnel interfaces to an + internet-exit service provider using this local interface. + + Examples: ''1-3'' or ''100,200,300''' raw_eos_cli: type: str description: EOS CLI rendered directly on the interface in the final EOS configuration. + flow_tracking: + type: dict + $ref: eos_designs#/$defs/flow_tracking_link + description: Configures flow-tracking on the interface. Overrides `fabric_flow_tracking.l3_interfaces` + setting. structured_config: type: dict documentation_options: hide_keys: true description: Custom structured config for the Ethernet interface. - $ref: eos_cli_config_gen#/keys/ethernet_interfaces/items/ + $ref: eos_cli_config_gen#/keys/ethernet_interfaces/items p2p_links: type: list items: @@ -8440,6 +9153,15 @@ $defs: sflow: type: bool description: Enable sFlow. Overrides `fabric_sflow` setting. + underlay_multicast: + type: bool + description: Enable PIM sparse mode. Requires `include_in_underlay_protocol` + and the global `underlay_multicast` to be `true`. + default: false + flow_tracking: + type: dict + $ref: eos_designs#/$defs/flow_tracking_link + description: Enable flow-tracking. Overrides `fabric_flow_tracking` setting. qos_profile: type: str description: QOS service profile. @@ -8492,7 +9214,7 @@ $defs: type: dict documentation_options: hide_keys: true - description: 'Custom structured config for interfaces + description: 'Custom structured config for interfaces. Note! The content of this dictionary is _not_ validated by the schema, since it can be either ethernet_interfaces or port_channel_interfaces.' @@ -8517,16 +9239,16 @@ $defs: keys: node: type: str - description: l3_leaf inventory hostname + description: l3_leaf inventory hostname. svi_settings: type: dict keys: name: type: str - description: VLAN name + description: VLAN name. enabled: type: bool - description: Enable or disable interface + description: Enable or disable interface. description: type: str description: 'SVI description. By default set to VLAN name. @@ -8545,9 +9267,9 @@ $defs: description: Explicitly enable/disable link-local IPv6 addressing. ip_address_virtual: type: str - description: 'IPv4_address/Mask + description: 'IPv4_address/Mask. - IPv4 VXLAN Anycast IP address + IPv4 VXLAN Anycast IP address. Conserves IP addresses in VXLAN deployments as it doesn''t require unique IP addresses on each node. @@ -8555,12 +9277,12 @@ $defs: ' ipv6_address_virtual: type: str - description: 'IPv6_address/Mask + description: 'IPv6_address/Mask. - ipv6 address virtuals to configure VXLAN Anycast IP address (Optional) + ipv6 address virtuals to configure VXLAN Anycast IP address (Optional). If both "ipv6_address_virtual" and "ipv6_address_virtuals" are set, all - addresses will be configured + addresses will be configured. ' deprecation: @@ -8569,7 +9291,7 @@ $defs: new_key: ipv6_address_virtuals ipv6_address_virtuals: type: list - description: 'IPv6 VXLAN Anycast IP addresses + description: 'IPv6 VXLAN Anycast IP addresses. Conserves IPv6 addresses in VXLAN deployments as it doesn''t require unique IPv6 addresses on each node. @@ -8577,13 +9299,13 @@ $defs: ' items: type: str - description: IPv6_address/Mask + description: IPv6_address/Mask. ip_address_virtual_secondaries: type: list - description: Secondary IPv4 VXLAN Anycast IP addresses + description: Secondary IPv4 VXLAN Anycast IP addresses. items: type: str - description: IPv4_address/Mask + description: IPv4_address/Mask. ip_virtual_router_addresses: type: list description: 'IPv4 VARP addresses. @@ -8598,7 +9320,7 @@ $defs: ' items: type: str - description: 'IPv4_address/Mask or IPv4_address + description: 'IPv4_address/Mask or IPv4_address. IPv4_address/Mask will also configure a static route to the SVI per best practice. @@ -8618,19 +9340,35 @@ $defs: ' items: type: str - description: IPv6_address + description: IPv6_address. + ipv4_acl_in: + description: 'Name of the IPv4 access-list to be assigned in the ingress direction. + + The access-list must be defined under `ipv4_acls` and supports substitution + of the field "interface_ip".' + type: str + convert_types: + - int + ipv4_acl_out: + description: 'Name of the IPv4 Access-list to be assigned in the egress direction. + + The access-list must be defined under `ipv4_acls` and supports substitution + of the field "interface_ip".' + type: str + convert_types: + - int ip_helpers: type: list primary_key: ip_helper convert_types: - dict - description: IP helper for DHCP relay + description: IP helper for DHCP relay. items: type: dict keys: ip_helper: type: str - description: IPv4 DHCP server IP + description: IPv4 DHCP server IP. source_interface: type: str description: Interface name to originate DHCP relay packets to DHCP @@ -8662,7 +9400,7 @@ $defs: define it.\nrt_override will default to vni_override if set.\n\nrt_override supports two formats:\n - A single number which will be used in the RT fields instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rt_type' for details).\n - \ - A full RT string with colon seperator which will override the full RT.\n" + \ - A full RT string with colon separator which will override the full RT.\n" rd_override: type: str convert_types: @@ -8672,7 +9410,7 @@ $defs: define it.\nrd_override will default to rt_override or vni_override if set.\n\nrd_override supports two formats:\n - A single number which will be used in the RD assigned number field instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rd_type' - for details).\n - A full RD string with colon seperator which will override + for details).\n - A full RD string with colon separator which will override the full RD.\n" trunk_groups: type: list @@ -8819,14 +9557,14 @@ $defs: structured_config: type: dict description: 'Structured configuration and EOS CLI commands rendered on - router_bgp.vlans.[id=] + router_bgp.vlans.[id=]. - This configuration will not be applied to vlan aware bundles + This configuration will not be applied to vlan aware bundles. ' documentation_options: hide_keys: true - $ref: eos_cli_config_gen#/keys/router_bgp/keys/vlans/items/ + $ref: eos_cli_config_gen#/keys/router_bgp/keys/vlans/items raw_eos_cli: type: str description: 'EOS CLI rendered directly on the Router BGP, VLAN definition @@ -8847,7 +9585,7 @@ $defs: ' documentation_options: hide_keys: true - $ref: eos_cli_config_gen#/keys/vlan_interfaces/items/ + $ref: eos_cli_config_gen#/keys/vlan_interfaces/items virtual_topology: type: dict keys: @@ -8856,29 +9594,29 @@ $defs: description: Optional name. traffic_class: type: int - $ref: eos_cli_config_gen#keys/router_adaptive_virtual_topology/keys/policies/items/keys/matches/items/keys/traffic_class + $ref: eos_cli_config_gen#/keys/router_adaptive_virtual_topology/keys/policies/items/keys/matches/items/keys/traffic_class dscp: type: int - $ref: eos_cli_config_gen#keys/router_adaptive_virtual_topology/keys/policies/items/keys/matches/items/keys/dscp + $ref: eos_cli_config_gen#/keys/router_adaptive_virtual_topology/keys/policies/items/keys/matches/items/keys/dscp lowest_hop_count: description: 'Prefer paths with lowest hop-count. Only applicable for `wan_mode: "cv-pathfinder"`.' type: bool default: false - $ref: eos_cli_config_gen#keys/router_path_selection/keys/load_balance_policies/items/keys/lowest_hop_count + $ref: eos_cli_config_gen#/keys/router_path_selection/keys/load_balance_policies/items/keys/lowest_hop_count constraints: type: dict keys: jitter: type: int - $ref: eos_cli_config_gen#keys/router_path_selection/keys/load_balance_policies/items/keys/jitter + $ref: eos_cli_config_gen#/keys/router_path_selection/keys/load_balance_policies/items/keys/jitter latency: type: int - $ref: eos_cli_config_gen#keys/router_path_selection/keys/load_balance_policies/items/keys/latency + $ref: eos_cli_config_gen#/keys/router_path_selection/keys/load_balance_policies/items/keys/latency loss_rate: type: str - $ref: eos_cli_config_gen#keys/router_path_selection/keys/load_balance_policies/items/keys/loss_rate + $ref: eos_cli_config_gen#/keys/router_path_selection/keys/load_balance_policies/items/keys/loss_rate path_groups: type: list min_length: 1 @@ -8905,3 +9643,14 @@ $defs: If not set, each path-group in `names` will be attributed its `default_preference`.' + internet_exit: + type: dict + keys: + policy: + type: str + description: 'PREVIEW: This key is in preview mode. + + + Internet-exit policy name associated with this virtual_topology. + + The policy must be defined under `cv_pathfinder_internet_exit_policies`.' diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/_defaults.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/_defaults.schema.yml similarity index 94% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/_defaults.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/_defaults.schema.yml index 3b636507260..af49361eaec 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/_defaults.schema.yml +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/_defaults.schema.yml @@ -5,5 +5,6 @@ # Line above is used by RedHat's YAML Schema vscode extension # Use Ctrl + Space to get suggestions for every field. Autocomplete will pop up after typing 2 letters. $id: eos_designs +$schema: avd_meta_schema type: dict allow_other_keys: true diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/application_traffic_recognition.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/application_traffic_recognition.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/application_traffic_recognition.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/application_traffic_recognition.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/avd_data_conversion_mode.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/avd_data_conversion_mode.schema.yml similarity index 96% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/avd_data_conversion_mode.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/avd_data_conversion_mode.schema.yml index 6ac3309d093..83310010154 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/avd_data_conversion_mode.schema.yml +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/avd_data_conversion_mode.schema.yml @@ -22,4 +22,4 @@ keys: "warning" will produce warning messages. "info" will produce regular log messages. "debug" will produce hidden debug messages viewable with -v. - "quiet" will not produce any messages + "quiet" will not produce any messages. diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/avd_data_validation_mode.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/avd_data_validation_mode.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/avd_data_validation_mode.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/avd_data_validation_mode.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/bfd_multihop.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/bfd_multihop.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/bfd_multihop.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/bfd_multihop.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/bgp_as.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/bgp_as.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/bgp_as.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/bgp_as.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/bgp_default_ipv4_unicast.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/bgp_default_ipv4_unicast.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/bgp_default_ipv4_unicast.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/bgp_default_ipv4_unicast.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/bgp_distance.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/bgp_distance.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/bgp_distance.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/bgp_distance.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/bgp_ecmp.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/bgp_ecmp.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/bgp_ecmp.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/bgp_ecmp.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/bgp_graceful_restart.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/bgp_graceful_restart.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/bgp_graceful_restart.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/bgp_graceful_restart.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/bgp_maximum_paths.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/bgp_maximum_paths.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/bgp_maximum_paths.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/bgp_maximum_paths.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/bgp_mesh_pes.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/bgp_mesh_pes.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/bgp_mesh_pes.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/bgp_mesh_pes.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/bgp_peer_groups.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/bgp_peer_groups.schema.yml similarity index 98% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/bgp_peer_groups.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/bgp_peer_groups.schema.yml index bfe8de46cd8..91f8088ac52 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/bgp_peer_groups.schema.yml +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/bgp_peer_groups.schema.yml @@ -32,7 +32,7 @@ keys: description: Custom structured config added under router_bgp.peer_groups.[name=] for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: "eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items/" + $ref: "eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items" mlag_ipv4_underlay_peer: type: dict keys: @@ -51,7 +51,7 @@ keys: description: Custom structured config added under router_bgp.peer_groups.[name=] for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: "eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items/" + $ref: "eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items" evpn_overlay_peers: type: dict keys: @@ -70,7 +70,7 @@ keys: description: Custom structured config added under router_bgp.peer_groups.[name=] for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: "eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items/" + $ref: "eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items" evpn_overlay_core: type: dict keys: @@ -89,7 +89,7 @@ keys: description: Custom structured config added under router_bgp.peer_groups.[name=] for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: "eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items/" + $ref: "eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items" mpls_overlay_peers: type: dict keys: @@ -108,7 +108,7 @@ keys: description: Custom structured config added under router_bgp.peer_groups.[name=] for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: "eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items/" + $ref: "eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items" rr_overlay_peers: type: dict keys: @@ -127,7 +127,7 @@ keys: description: Custom structured config added under router_bgp.peer_groups.[name=] for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: "eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items/" + $ref: "eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items" ipvpn_gateway_peers: type: dict keys: @@ -146,7 +146,7 @@ keys: description: Custom structured config added under router_bgp.peer_groups.[name=] for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: "eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items/" + $ref: "eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items" wan_overlay_peers: type: dict keys: @@ -195,7 +195,7 @@ keys: description: Custom structured config added under router_bgp.peer_groups.[name=] for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: "eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items/" + $ref: "eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items" wan_rr_overlay_peers: type: dict description: Configuration options for the peer-group created to peer between AutoVPN RRs or CV Pathfinders. @@ -237,7 +237,7 @@ keys: description: Custom structured config added under router_bgp.peer_groups.[name=] for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: "eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items/" + $ref: "eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items" IPv4_UNDERLAY_PEERS: type: dict deprecation: diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/bgp_update_wait_install.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/bgp_update_wait_install.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/bgp_update_wait_install.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/bgp_update_wait_install.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/bgp_wait_for_convergence.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/bgp_wait_for_convergence.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/bgp_wait_for_convergence.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/bgp_wait_for_convergence.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/connected_endpoints.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/connected_endpoints.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/connected_endpoints.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/connected_endpoints.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/connected_endpoints_keys.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/connected_endpoints_keys.schema.yml similarity index 82% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/connected_endpoints_keys.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/connected_endpoints_keys.schema.yml index 3c1f7d40293..7ed96b93452 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/connected_endpoints_keys.schema.yml +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/connected_endpoints_keys.schema.yml @@ -32,37 +32,37 @@ keys: default: - key: servers type: server - description: Server + description: Server. - key: firewalls type: firewall - description: Firewall + description: Firewall. - key: routers type: router - description: Router + description: Router. - key: load_balancers type: load_balancer - description: Load Balancer + description: Load Balancer. - key: storage_arrays type: storage_array - description: Storage Array + description: Storage Array. - key: cpes type: cpe - description: CPE + description: CPE. - key: workstations type: workstation - description: Workstation + description: Workstation. - key: access_points type: access_point - description: Access Point + description: Access Point. - key: phones type: phone - description: Phone + description: Phone. - key: printers type: printer - description: Printer + description: Printer. - key: cameras type: camera - description: Camera + description: Camera. - key: generic_devices type: generic_device - description: Generic Device + description: Generic Device. diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/core_interfaces.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/core_interfaces.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/core_interfaces.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/core_interfaces.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/custom_structured_configuration_list_merge.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/custom_structured_configuration_list_merge.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/custom_structured_configuration_list_merge.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/custom_structured_configuration_list_merge.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/custom_structured_configuration_prefix.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/custom_structured_configuration_prefix.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/custom_structured_configuration_prefix.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/custom_structured_configuration_prefix.schema.yml diff --git a/python-avd/pyavd/_eos_designs/schema/schema_fragments/cv_pathfinder_global_sites.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/cv_pathfinder_global_sites.schema.yml new file mode 100644 index 00000000000..36b9eddde5b --- /dev/null +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/cv_pathfinder_global_sites.schema.yml @@ -0,0 +1,32 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +# yaml-language-server: $schema=../../../../plugins/plugin_utils/schema/avd_meta_schema.json +# Line above is used by RedHat's YAML Schema vscode extension +# Use Ctrl + Space to get suggestions for every field. Autocomplete will pop up after typing 2 letters. +type: dict +keys: + cv_pathfinder_global_sites: + documentation_options: + table: wan-cv-pathfinder-regions + description: |- + Define sites that are outside of the CV Pathfinder hierarchy. + This is used to arrange pathfinders in the CloudVision topology layout. + type: list + primary_key: name + items: + type: dict + keys: + name: + type: str + description: The site name. + description: + type: str + location: + type: str + description: Location as a string is resolved on Cloudvision. + # TBD + # site_contact: + # type: str + # site_after_hours_contact: + # type: str diff --git a/python-avd/pyavd/_eos_designs/schema/schema_fragments/cv_pathfinder_internet_exit_policies.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/cv_pathfinder_internet_exit_policies.schema.yml new file mode 100644 index 00000000000..4ca302b66a3 --- /dev/null +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/cv_pathfinder_internet_exit_policies.schema.yml @@ -0,0 +1,77 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +# yaml-language-server: $schema=../../../../plugins/plugin_utils/schema/avd_meta_schema.json +# Line above is used by RedHat's YAML Schema vscode extension +# Use Ctrl + Space to get suggestions for every field. Autocomplete will pop up after typing 2 letters. +type: dict +keys: + cv_pathfinder_internet_exit_policies: + description: |- + PREVIEW: These keys are in preview mode. + + List of internet-exit policies used for the WAN configuration. + type: list + primary_key: name + items: + type: dict + keys: + name: + type: str + description: Internet-exit policy name. + type: + type: str + description: |- + Internet-exit policy type. + direct: Exit directly over wan interfaces + zscaler: Exit using Zscaler secure web gateway service + valid_values: + - direct + - zscaler + required: true + fallback_to_system_default: + type: bool + default: true + description: Add system default exit-group at the end of the policy. + zscaler: + type: dict + description: Zscaler information. Only used if `type` is 'zscaler'. + keys: + ipsec_key_salt: + type: str + required: true + description: |- + "Salt" used for auto generation of encryption keys for IPsec tunnels to Zscaler. + The keys will be generated as a hash of `salt__`. + Since this salt can be used to deduct the encryption key, it is recommeneded to use vault. + domain_name: + type: str + required: true + description: Domain name as configured in Zscaler for the tenant. Used as UFQDN suffix for authentication. + encrypt_traffic: + type: bool + default: true + description: |- + When `true` the traffic going over the tunnels will be encrypted with AES-256-GCM. Otherwise the traffic will be using NULL encryption. + Note that encryption requires a subscription on the Zscaler account. + download_bandwidth: + type: int + description: Maximum allowed download bandwidth in Mbps for each device using this policy. + upload_bandwidth: + type: int + description: Maximum allowed upload bandwidth in Mbps for each device using this policy. + firewall: + type: dict + keys: + enabled: + type: bool + description: Enforce firewall controls. + default: false + ips: + type: bool + description: Enable IPS Controls for the firewall. + default: false + acceptable_use_policy: + type: bool + description: Display an Acceptable Use Policy (AUP) and require users to accept it. + default: false diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/cv_pathfinder_regions.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/cv_pathfinder_regions.schema.yml similarity index 91% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/cv_pathfinder_regions.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/cv_pathfinder_regions.schema.yml index dd72e43b28e..6be9f00b00d 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/cv_pathfinder_regions.schema.yml +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/cv_pathfinder_regions.schema.yml @@ -12,14 +12,17 @@ keys: description: Define the CV Pathfinder hierarchy. type: list primary_key: name + unique_keys: + - id + - sites.name items: type: dict $ref: "eos_cli_config_gen#/keys/router_adaptive_virtual_topology/keys/region" keys: name: type: str - description: |- - The region name. + min_length: 1 + max_length: 128 description: type: str id: @@ -31,6 +34,8 @@ keys: description: |- All sites are placed in a default zone "-ZONE" with ID 1. primary_key: name + unique_keys: + - id items: type: dict $ref: "eos_cli_config_gen#/keys/router_adaptive_virtual_topology/keys/site" @@ -39,6 +44,8 @@ keys: type: str description: |- The site name. + min_length: 1 + max_length: 128 description: type: str id: @@ -48,7 +55,7 @@ keys: Given that all the sites are placed in a zone named after the region, the site ID must be unique within a region. location: type: str - description: Location as a sring is resolved on Cloudvision. + description: Location as a string is resolved on Cloudvision. site_contact: type: str site_after_hours_contact: diff --git a/python-avd/pyavd/_eos_designs/schema/schema_fragments/cv_server.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/cv_server.schema.yml new file mode 100644 index 00000000000..077661ff2b3 --- /dev/null +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/cv_server.schema.yml @@ -0,0 +1,19 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +# yaml-language-server: $schema=../../../../plugins/plugin_utils/schema/avd_meta_schema.json +# Line above is used by RedHat's YAML Schema vscode extension +# Use Ctrl + Space to get suggestions for every field. Autocomplete will pop up after typing 2 letters. +type: dict +keys: + cv_server: + documentation_options: + table: wan-cv-pathfinder-zscaler-integration + description: |- + PREVIEW: These keys are in preview mode. + + Hostname or IP address of CloudVision host. Ex. "www.arista.io" for CVaaS. + For `eos_designs` this variable is only used for the WAN Internet-exit integration with Zscaler. + The same variable name is also used by the `cv_deploy` role, and will override the value of `ansible_host` on inventory 'cloudvision' host. + Make sure to set it in a common group_vars file. + type: str diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/cv_tags_topology_type.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/cv_tags_topology_type.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/cv_tags_topology_type.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/cv_tags_topology_type.schema.yml diff --git a/python-avd/pyavd/_eos_designs/schema/schema_fragments/cv_token.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/cv_token.schema.yml new file mode 100644 index 00000000000..e4d83783eb1 --- /dev/null +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/cv_token.schema.yml @@ -0,0 +1,19 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +# yaml-language-server: $schema=../../../../plugins/plugin_utils/schema/avd_meta_schema.json +# Line above is used by RedHat's YAML Schema vscode extension +# Use Ctrl + Space to get suggestions for every field. Autocomplete will pop up after typing 2 letters. +type: dict +keys: + cv_token: + documentation_options: + table: wan-cv-pathfinder-zscaler-integration + description: |- + PREVIEW: These keys are in preview mode. + + Service account token as defined on CloudVision. This value should be using Ansible Vault. + For `eos_designs` this variable is only used for the WAN Internet-exit integration with Zscaler. + The same variable name is also used by the `cv_deploy` role, and will override the value of `ansible_password` on inventory 'cloudvision' host. + Make sure to set it in a common group_vars file. + type: str diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/cv_topology.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/cv_topology.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/cv_topology.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/cv_topology.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/cvp_ingestauth_key.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/cvp_ingestauth_key.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/cvp_ingestauth_key.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/cvp_ingestauth_key.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/cvp_instance_ip.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/cvp_instance_ip.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/cvp_instance_ip.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/cvp_instance_ip.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/cvp_instance_ips.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/cvp_instance_ips.schema.yml similarity index 93% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/cvp_instance_ips.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/cvp_instance_ips.schema.yml index 3a21c34027d..b5ed90115d6 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/cvp_instance_ips.schema.yml +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/cvp_instance_ips.schema.yml @@ -17,4 +17,4 @@ keys: `eos_designs` only supports one CloudVision cluster. items: type: str - description: IPv4 address or DNS name for CloudVision + description: IPv4 address or DNS name for CloudVision. diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/cvp_token_file.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/cvp_token_file.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/cvp_token_file.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/cvp_token_file.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/dc_name.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/dc_name.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/dc_name.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/dc_name.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/default_igmp_snooping_enabled.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/default_igmp_snooping_enabled.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/default_igmp_snooping_enabled.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/default_igmp_snooping_enabled.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/default_interface_mtu.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/default_interface_mtu.schema.yml similarity index 91% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/default_interface_mtu.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/default_interface_mtu.schema.yml index c0c8e2dc8a8..f3b29ed27f5 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/default_interface_mtu.schema.yml +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/default_interface_mtu.schema.yml @@ -14,6 +14,6 @@ keys: - str description: | Default interface MTU configured on EOS under "interface defaults". - Can be overriden per platform under platform settings. + Can be overridden per platform under platform settings. min: 68 max: 65535 diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/default_interfaces.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/default_interfaces.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/default_interfaces.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/default_interfaces.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/default_mgmt_method.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/default_mgmt_method.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/default_mgmt_method.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/default_mgmt_method.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/default_node_types.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/default_node_types.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/default_node_types.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/default_node_types.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_adapter_config.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/defs_adapter_config.schema.yml similarity index 95% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_adapter_config.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/defs_adapter_config.schema.yml index 2830bc7dd47..596c73f553a 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_adapter_config.schema.yml +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/defs_adapter_config.schema.yml @@ -18,7 +18,7 @@ $defs: type: str description: | By default the description is built leveraging `_`. - When set this key will overide the default value on the physical ports. + When set this key will override the default value on the physical ports. profile: type: str description: Port-profile name to inherit configuration. @@ -117,7 +117,7 @@ $defs: - "on" qos_profile: type: str - description: QOS profile name + description: QOS profile name. ptp: type: dict description: | @@ -143,8 +143,13 @@ $defs: - "smpte2059-2" sflow: type: bool - description: | - Configures sFlow on the interface. Overrides `fabric_sflow` setting. + description: |- + Configures sFlow on the interface. Overrides `fabric_sflow.endpoints` setting. + flow_tracking: + type: dict + $ref: "eos_designs#/$defs/flow_tracking_link" + description: |- + Configures flow-tracking on the interface. Overrides `fabric_flow_tracking.endpoints` setting. link_tracking: type: dict description: | @@ -380,7 +385,7 @@ $defs: type: bool size: type: int - description: Size in bytes + description: Size in bytes. convert_types: - str ethernet_segment: @@ -462,6 +467,13 @@ $defs: description: | Port-Channel administrative state. Setting to false will set port to 'shutdown' in intended configuration. + ptp_mpass: + type: bool + default: false + description: |- + When MPASS is enabled on an MLAG port-channel, MLAG peers coordinate to function as a single PTP logical device. + Arista PTP enabled devices always place PTP messages on the same physical link within the port-channel. + Hence, MPASS is needed only on MLAG port-channels connected to non-Arista devices. esi: type: str description: Format xxxx:xxxx:xxxx. @@ -530,12 +542,12 @@ $defs: type: int convert_types: - str - description: Subinterface number + description: Subinterface number. short_esi: type: str description: | - In format xxxx:xxxx:xxxx or "auto" - Required for multihomed port-channels with subinterfaces + In format xxxx:xxxx:xxxx or "auto". + Required for multihomed port-channels with subinterfaces. vlan_id: type: int convert_types: @@ -565,7 +577,7 @@ $defs: description: Custom structured config added under port_channel_interfaces.[name=] for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: "eos_cli_config_gen#/keys/port_channel_interfaces/items/" + $ref: "eos_cli_config_gen#/keys/port_channel_interfaces/items" validate_state: type: bool description: Set to false to disable interface validation by the `eos_validate_state` role. @@ -577,4 +589,4 @@ $defs: description: Custom structured config added under ethernet_interfaces.[name=] for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: "eos_cli_config_gen#/keys/ethernet_interfaces/items/" + $ref: "eos_cli_config_gen#/keys/ethernet_interfaces/items" diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_connected_endpoints.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/defs_connected_endpoints.schema.yml similarity index 98% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_connected_endpoints.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/defs_connected_endpoints.schema.yml index 48bb098e3e5..01ca96b8e38 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_connected_endpoints.schema.yml +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/defs_connected_endpoints.schema.yml @@ -48,7 +48,7 @@ $defs: The lists `endpoint_ports`, `switch_ports`, and `switches` must have the same length. items: type: str - description: Device + description: Device. endpoint_ports: type: list description: | diff --git a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_dhcp_relay.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/defs_flow_tracking_link.schema.yml similarity index 75% rename from ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_dhcp_relay.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/defs_flow_tracking_link.schema.yml index 25c79cd24aa..c2f78486812 100644 --- a/ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas/schema_fragments/ip_dhcp_relay.schema.yml +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/defs_flow_tracking_link.schema.yml @@ -5,10 +5,12 @@ # Line above is used by RedHat's YAML Schema vscode extension # Use Ctrl + Space to get suggestions for every field. Autocomplete will pop up after typing 2 letters. type: dict -keys: - ip_dhcp_relay: +$defs: + flow_tracking_link: type: dict keys: - information_option: + enabled: type: bool - description: Insert Option-82 information + name: + type: str + description: Flow tracker name as defined in flow_tracking_settings. diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_ipsec_profile.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/defs_ipsec_profile.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_ipsec_profile.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/defs_ipsec_profile.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_l3_edge.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/defs_l3_edge.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_l3_edge.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/defs_l3_edge.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_network_services.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/defs_network_services.schema.yml similarity index 91% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_network_services.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/defs_network_services.schema.yml index d5e54b07688..7a4a5b1fd92 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_network_services.schema.yml +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/defs_network_services.schema.yml @@ -79,6 +79,10 @@ $defs: By default the iBGP peering subnet is redistributed into the overlay routing protocol per VRF. Setting `redistribute_mlag_ibgp_peering_vrfs: false` under a tenant will change this default to prevent redistribution of these subnets for all VRFs in the tenant. This setting can be overridden per VRF. + evpn_vlan_bundle: + type: str + description: |- + Enable `evpn_vlan_bundle` for all l2vlans and SVIs under the tenant. This `evpn_vlan_bundle` should be present in `evpn_vlan_bundles`. bgp_peer_groups: documentation_options: table: network-services-vrfs-bgp-settings @@ -105,6 +109,46 @@ $defs: description: | Nodes is required to restrict configuration of BGP neighbors to certain nodes in the network. If not set the peer-group is created on devices which have a bgp_peer mapped to the corresponding peer_group. + address_family_ipv4: + type: dict + keys: + activate: + type: bool + route_map_in: + type: str + description: Inbound route-map name. + route_map_out: + type: str + description: Outbound route-map name. + default_originate: + type: dict + $ref: "eos_cli_config_gen#/keys/router_bgp/keys/address_family_ipv4/keys/peer_groups/items/keys/default_originate" + next_hop: + type: dict + $ref: "eos_cli_config_gen#/keys/router_bgp/keys/address_family_ipv4/keys/peer_groups/items/keys/next_hop" + prefix_list_in: + type: str + description: Inbound prefix-list name. + prefix_list_out: + type: str + description: Outbound prefix-list name. + address_family_ipv6: + type: dict + keys: + activate: + type: bool + route_map_in: + type: str + description: Inbound route-map name. + route_map_out: + type: str + description: Outbound route-map name. + prefix_list_in: + type: str + description: Inbound prefix-list name. + prefix_list_out: + type: str + description: Outbound prefix-list name. evpn_l2_multicast: documentation_options: table: network-services-multicast-settings @@ -123,7 +167,7 @@ $defs: type: bool underlay_l2_multicast_group_ipv4_pool: type: str - description: IPv4_address/Mask + description: IPv4_address/Mask. underlay_l2_multicast_group_ipv4_pool_offset: type: int convert_types: @@ -151,7 +195,7 @@ $defs: type: bool evpn_underlay_l3_multicast_group_ipv4_pool: type: str - description: IPv4_address/Mask + description: IPv4_address/Mask. required: true evpn_underlay_l3_multicast_group_ipv4_pool_offset: type: int @@ -222,7 +266,7 @@ $defs: source_address: type: str format: ipv4 - description: Default IP address of Loopback0 + description: Default IP address of Loopback0. version: type: int convert_types: @@ -301,7 +345,7 @@ $defs: rd_override supports two formats: - A single number will be used in the RD assigned number subfield (second part of the RD). - - A full RD string with colon seperator which will override the full RD. + - A full RD string with colon separator which will override the full RD. rt_override: type: str convert_types: @@ -312,7 +356,7 @@ $defs: rt_override supports two formats: - A single number will be used in the RT assigned number subfield (second part of the RT). - - A full RT string with colon seperator which will override the full RT. + - A full RT string with colon separator which will override the full RT. mlag_ibgp_peering_ipv4_pool: type: str description: | @@ -571,7 +615,8 @@ $defs: type: str description: | Name of a bundle defined under 'evpn_vlan_bundles' to inherit configuration. - To use this option the common "evpn_vlan_aware_bundles" option must be set to true. + This setting overrides "evpn_vlan_bundle" set at tenant level. + The common option "evpn_vlan_aware_bundles" is disregarded for this option. nodes: type: list primary_key: node @@ -695,18 +740,23 @@ $defs: pim: type: dict description: | - Enable PIM sparse-mode on the interface; requires "evpn_l3_multicast" to be enabled on the VRF/Tenant + Enable PIM sparse-mode on the interface; requires "evpn_l3_multicast" to be enabled on the VRF/Tenant. Enabling this implicitly makes the device a PIM External Gateway (PEG) in EVPN designs only. At least one RP address must be configured for EVPN PEG to be configured. keys: enabled: type: bool + flow_tracking: + type: dict + $ref: "eos_designs#/$defs/flow_tracking_link" + description: |- + Configures flow-tracking on the interface. Overrides `fabric_flow_tracking.l3_interfaces` setting. structured_config: type: dict description: Custom structured config added under ethernet_interfaces.[name=] for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: "eos_cli_config_gen#/keys/ethernet_interfaces/items/" + $ref: "eos_cli_config_gen#/keys/ethernet_interfaces/items" raw_eos_cli: type: str description: | @@ -849,6 +899,7 @@ $defs: table: network-services-vrfs-bgp-settings type: list primary_key: ip_address + allow_duplicate_primary_key: True convert_types: - dict description: | @@ -972,7 +1023,7 @@ $defs: description: Custom structured config added under router_bgp.vrfs.[name=] for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: "eos_cli_config_gen#/keys/router_bgp/keys/vrfs/items/" + $ref: "eos_cli_config_gen#/keys/router_bgp/keys/vrfs/items" bgp_peer_groups: documentation_options: table: network-services-vrfs-bgp-settings @@ -996,6 +1047,46 @@ $defs: description: | Nodes is required to restrict configuration of BGP neighbors to certain nodes in the network. If not set the peer-group is created on devices which have a bgp_peer mapped to the corresponding peer_group. + address_family_ipv4: + type: dict + keys: + activate: + type: bool + route_map_in: + type: str + description: Inbound route-map name. + route_map_out: + type: str + description: Outbound route-map name. + default_originate: + type: dict + $ref: "eos_cli_config_gen#/keys/router_bgp/keys/address_family_ipv4/keys/peer_groups/items/keys/default_originate" + next_hop: + type: dict + $ref: "eos_cli_config_gen#/keys/router_bgp/keys/address_family_ipv4/keys/peer_groups/items/keys/next_hop" + prefix_list_in: + type: str + description: Inbound prefix-list name. + prefix_list_out: + type: str + description: Outbound prefix-list name. + address_family_ipv6: + type: dict + keys: + activate: + type: bool + route_map_in: + type: str + description: Inbound route-map name. + route_map_out: + type: str + description: Outbound route-map name. + prefix_list_in: + type: str + description: Inbound prefix-list name. + prefix_list_out: + type: str + description: Outbound prefix-list name. additional_route_targets: documentation_options: table: network-services-vrfs-settings @@ -1026,7 +1117,7 @@ $defs: description: Custom structured config for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: "eos_cli_config_gen#/" + $ref: "eos_cli_config_gen#" l2vlans: documentation_options: table: network-services-l2vlans-settings @@ -1045,7 +1136,7 @@ $defs: - str min: 1 max: 4094 - description: VLAN ID + description: VLAN ID. vni_override: type: int convert_types: @@ -1066,7 +1157,7 @@ $defs: rt_override supports two formats: - A single number which will be used in the RT fields instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rt_type' for details). - - A full RT string with colon seperator which will override the full RT. + - A full RT string with colon separator which will override the full RT. rd_override: type: str convert_types: @@ -1078,11 +1169,11 @@ $defs: rd_override supports two formats: - A single number which will be used in the RD assigned number field instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rd_type' for details). - - A full RD string with colon seperator which will override the full RD. + - A full RD string with colon separator which will override the full RD. name: type: str required: true - description: VLAN name + description: VLAN name. tags: type: list description: | @@ -1107,7 +1198,8 @@ $defs: type: str description: | Name of a bundle defined under 'evpn_vlan_bundles' to inherit configuration. - To use this option the common "evpn_vlan_aware_bundles" option must be set to true. + This setting overrides "evpn_vlan_bundle" set at tenant level. + The common option "evpn_vlan_aware_bundles" is disregarded for this option. trunk_groups: type: list items: @@ -1167,7 +1259,7 @@ $defs: This configuration will not be applied to vlan aware bundles. documentation_options: hide_keys: true - $ref: "eos_cli_config_gen#/keys/router_bgp/keys/vlans/items/" + $ref: "eos_cli_config_gen#/keys/router_bgp/keys/vlans/items" raw_eos_cli: type: str description: | @@ -1187,7 +1279,7 @@ $defs: keys: name: type: str - description: Pseudowire name + description: Pseudowire name. type: type: str default: vpws-pseudowire @@ -1202,7 +1294,7 @@ $defs: keys: number: type: int - description: Subinterface number + description: Subinterface number. convert_types: - str endpoints: @@ -1221,7 +1313,7 @@ $defs: description: Pseudowire ID on this endpoint. nodes: type: list - description: Usually one node. With ESI multihoming we support two nodes per pseudowire endpoint + description: Usually one node. With ESI multihoming we support two nodes per pseudowire endpoint. required: true min_length: 1 items: diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_node_type.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/defs_node_type.schema.yml similarity index 93% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_node_type.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/defs_node_type.schema.yml index c62be2c41ac..57477666c43 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_node_type.schema.yml +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/defs_node_type.schema.yml @@ -63,12 +63,18 @@ $defs: description: Node management interface IPv4 address. type: str format: cidr + mgmt_gateway: + type: str + description: This key sets the management gateway for the device. It takes precedence over the global `mgmt_gateway`. ipv6_mgmt_ip: documentation_options: table: node-type-common-configuration description: Node management interface IPv6 address. type: str format: cidr + ipv6_mgmt_gateway: + type: str + description: This key sets the ipv6 management gateway for the device. It takes precedence over the global `ipv6_mgmt_gateway`. mgmt_interface: documentation_options: table: node-type-common-configuration @@ -158,7 +164,7 @@ $defs: hide_keys: true description: Custom structured config for eos_cli_config_gen. type: dict - $ref: "eos_cli_config_gen#/" + $ref: "eos_cli_config_gen#" uplink_type: documentation_options: table: node-type-uplink-configuration @@ -177,7 +183,7 @@ $defs: documentation_options: table: node-type-uplink-configuration description: | - Local uplink interfaces + Local uplink interfaces. Each list item supports range syntax that can be expanded into a list of interfaces. If uplink_interfaces is not defined, platform-specific defaults (defined under default_interfaces) will be used instead. Please note that default_interfaces are not defined by default, you should define these yourself. @@ -219,6 +225,15 @@ $defs: Set point-to-Point interface speed for the uplink switch interface only. Speed should be set in the format `` or `forced ` or `auto `. type: str + uplink_mtu: + documentation_options: + table: node-type-uplink-configuration + description: Point-to-Point uplinks MTU in bytes. This setting overrides the `p2p_uplinks_mtu` setting. + type: int + convert_types: + - str + min: 68 + max: 65535 max_uplink_switches: documentation_options: table: node-type-uplink-configuration @@ -327,9 +342,9 @@ $defs: "uplink_structured_config" is applied after "structured_config", so it can override "structured_config" defined on node-level. Note! The content of this dictionary is _not_ validated by the schema, since it can be either ethernet_interfaces or port_channel_interfaces. # Schema ref not implemented since we do not know which of the schemas to look at. - # $ref: "eos_cli_config_gen#/keys/ethernet_interfaces/items/" + # $ref: "eos_cli_config_gen#/keys/ethernet_interfaces/items" mlag_port_channel_structured_config: - $ref: "eos_cli_config_gen#/keys/port_channel_interfaces/items/" + $ref: "eos_cli_config_gen#/keys/port_channel_interfaces/items" documentation_options: table: node-type-l2-mlag-configuration hide_keys: true @@ -340,7 +355,7 @@ $defs: Overrides the settings on the port-channel interface level. "mlag_port_channel_structured_config" is applied after "structured_config", so it can override "structured_config" defined on node-level. mlag_peer_vlan_structured_config: - $ref: "eos_cli_config_gen#/keys/vlan_interfaces/items/" + $ref: "eos_cli_config_gen#/keys/vlan_interfaces/items" documentation_options: table: node-type-l2-mlag-configuration hide_keys: true @@ -351,7 +366,7 @@ $defs: Overrides the settings on the vlan interface level. "mlag_peer_vlan_structured_config" is applied after "structured_config", so it can override "structured_config" defined on node-level. mlag_peer_l3_vlan_structured_config: - $ref: "eos_cli_config_gen#/keys/vlan_interfaces/items/" + $ref: "eos_cli_config_gen#/keys/vlan_interfaces/items" documentation_options: table: node-type-l2-mlag-configuration hide_keys: true @@ -753,14 +768,34 @@ $defs: documentation_options: table: node-type-l2-mlag-configuration type: str + mlag_peer_address_family: + documentation_options: + table: node-type-l2-mlag-configuration + description: |- + IP address family used to establish MLAG Peer Link (control link). + `ipv6` requires EOS version 4.31.1F or higher. + Note: `ipv6` is not supported in combination with a common MLAG peer link VLAN (ex. `mlag_l3_peer_vlan` set to 4094). + type: str + valid_values: + - ipv4 + - ipv6 + default: ipv4 mlag_peer_ipv4_pool: documentation_options: table: node-type-l2-mlag-configuration - description: | - IP address pool used for MLAG Peer Link (control link). IP is derived from the node id. - Required when MLAG leafs present in topology. + description: |- + IPv4 address pool used for MLAG Peer Link (control link). IP is derived from the node id. + Required for MLAG leafs when `mlag_peer_address_family` is `ipv4` (default). type: str format: ipv4_cidr + mlag_peer_ipv6_pool: + documentation_options: + table: node-type-l2-mlag-configuration + description: |- + IPv6 address pool used for MLAG Peer Link (control link). IP is derived from the node id. + Required for MLAG leafs when `mlag_peer_address_family` is `ipv6`. + type: str + format: ipv6_cidr mlag_port_channel_id: documentation_options: table: node-type-l2-mlag-configuration @@ -1252,8 +1287,9 @@ $defs: type: str description: |- The CV Pathfinder site name. - This key is required for WAN routers but ignored for pathfinders. - The site name must be defined for the relevant region under 'cv_pathfinder_regions'. + This key is required for WAN routers but optional for pathfinders. + For WAN routers and pathfinders with `cv_pathfinder_region`, the site name must be defined for the relevant region under 'cv_pathfinder_regions'. + For pathfinders without `cv_pathfinder_region` set, the site must be defined under `cv_pathfinder_global_sites`. wan_ha: documentation_options: table: node-type-wan-configuration @@ -1275,6 +1311,37 @@ $defs: type: bool default: true description: Enable / Disable IPsec over HA path-group when HA is enabled. + ha_interfaces: + description: |- + Local WAN HA interfaces + Overwrite the default behavior which is to pick all the `uplink_interfaces`. + Can be used to filter uplink interfaces when there are multiple uplinks. + Limitations: + Either all interfaces must be uplinks or all interfaces must not be uplinks. + Only one interface is supported for non uplinks. + type: list + items: + type: str + pattern: "Ethernet[\\d/]+" + ha_ipv4_pool: + description: |- + IP address pool used for WAN HA connectivity. + IP is derived from the node ID. + Not used for uplink interfaces. + type: str + format: ipv4_cidr + max_ha_interfaces: + type: int + convert_types: + - str + description: |- + Number of parallel links towards HA switches. + Can be used to reserve IP addresses for future parallel HA links. + flow_tracking: + type: dict + $ref: "eos_designs#/$defs/flow_tracking_link" + description: |- + Configures flow-tracking on the HA interfaces. Overrides `fabric_flow_tracking.wan_ha_links` setting. dps_mss_ipv4: documentation_options: table: node-type-wan-configuration @@ -1305,6 +1372,15 @@ $defs: description: |- Set the maximum number of CPU used for the data plane. This setting is useful on virtual Route Reflectors and Pathfinders where more CPU cores should be allocated for control plane. + flow_tracker_type: + type: str + valid_values: + - "sampled" + - "hardware" + description: |- + Set the flow tracker type. + Override the `default_flow_tracker_type`` set at the `node_type_key` level. + `default_flow_tracker_type` default value is `sampled`. node_groups: type: list description: Define variables related to all nodes part of this group. diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_node_type_l3_interfaces.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/defs_node_type_l3_interfaces.schema.yml similarity index 69% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_node_type_l3_interfaces.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/defs_node_type_l3_interfaces.schema.yml index ead3362dad7..0f96396c245 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_node_type_l3_interfaces.schema.yml +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/defs_node_type_l3_interfaces.schema.yml @@ -15,14 +15,14 @@ $defs: name: type: str description: |- - Ethernet interface name like 'Ethernet2' or subinterface name like 'Ethernet2.42' + Ethernet interface name like 'Ethernet2' or subinterface name like 'Ethernet2.42'. For a subinterface, the parent physical interface is automatically created. pattern: "Ethernet[\\d/]+(.[\\d]+)?" description: type: str description: |- Interface description. - If not set a default description will be configured with '[[ ]]' + If not set a default description will be configured with '[[ ]]'. ip_address: type: str description: Node IPv4 address/Mask or 'dhcp'. @@ -68,19 +68,44 @@ $defs: peer: type: str description: |- - The peer device name. Used for description and documentation + The peer device name. Used for description and documentation. peer_interface: type: str description: |- - The peer device interface. Used for description and documentation + The peer device interface. Used for description and documentation. peer_ip: type: str description: |- The peer device IPv4 address (no mask). Used as default route gateway if `set_default_route` is true and `ip` is an IP address. + bgp: + type: dict + description: |- + Enforce IPv4 BGP peering for the peer + keys: + peer_as: + type: str + required: true + convert_types: + - int + description: 'BGP AS <1-4294967295> or AS number in asdot notation + "<1-65535>.<0-65535>". + + For asdot notation in YAML inputs, the value must be put in + quotes, to prevent it from being interpreted as a float number.' + ipv4_prefix_list_in: + type: str + description: |- + Prefix List Name. Accept routes for only these prefixes from the peer. + Required for wan interfaces. + ipv4_prefix_list_out: + type: str + description: |- + Prefix List Name. Advertise routes for only these prefixes. + If not specified, nothing would be advertised. ipv4_acl_in: description: |- Name of the IPv4 access-list to be assigned in the ingress direction. - The access-list must be defined under `ipv4_acls`. + The access-list must be defined under `ipv4_acls` and supports field substitution for "interface_ip" and "peer_ip". Required for all WAN interfaces (`wan_carrier` is set) unless the carrier is marked as 'trusted' under `wan_carriers`. type: str convert_types: @@ -88,7 +113,7 @@ $defs: ipv4_acl_out: description: |- Name of the IPv4 Access-list to be assigned in the egress direction. - The access-list must be defined under `ipv4_acls`. + The access-list must be defined under `ipv4_acls` and supports field substitution for "interface_ip" and "peer_ip". type: str convert_types: - int @@ -102,7 +127,7 @@ $defs: prefix: type: str required: true - description: IPv4_network/Mask + description: IPv4_network/Mask. qos_profile: type: str description: QOS service profile. @@ -124,13 +149,38 @@ $defs: default: true description: |- For a WAN interface (`wan_carrier` is set), allow to disable the static tunnel towards Pathfinders. + cv_pathfinder_internet_exit: + description: |- + PREVIEW: This key is in preview mode + type: dict + keys: + policies: + type: list + primary_key: name + description: List of Internet-exit policies using this interface as exit. + items: + type: dict + keys: + name: + type: str + description: Internet-exit policy name. + tunnel_interface_numbers: + type: str + description: |- + Number range to use for Tunnel interfaces to an internet-exit service provider using this local interface. + Examples: '1-3' or '100,200,300' raw_eos_cli: type: str description: EOS CLI rendered directly on the interface in the final EOS configuration. + flow_tracking: + type: dict + $ref: "eos_designs#/$defs/flow_tracking_link" + description: |- + Configures flow-tracking on the interface. Overrides `fabric_flow_tracking.l3_interfaces` setting. structured_config: type: dict documentation_options: hide_keys: true description: |- Custom structured config for the Ethernet interface. - $ref: "eos_cli_config_gen#/keys/ethernet_interfaces/items/" + $ref: "eos_cli_config_gen#/keys/ethernet_interfaces/items" diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_p2p_links.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/defs_p2p_links.schema.yml similarity index 93% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_p2p_links.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/defs_p2p_links.schema.yml index d39bdbd2223..3ecce51292c 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_p2p_links.schema.yml +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/defs_p2p_links.schema.yml @@ -120,6 +120,14 @@ $defs: sflow: type: bool description: Enable sFlow. Overrides `fabric_sflow` setting. + underlay_multicast: + type: bool + description: Enable PIM sparse mode. Requires `include_in_underlay_protocol` and the global `underlay_multicast` to be `true`. + default: false + flow_tracking: + type: dict + $ref: "eos_designs#/$defs/flow_tracking_link" + description: Enable flow-tracking. Overrides `fabric_flow_tracking` setting. qos_profile: type: str description: QOS service profile. @@ -169,7 +177,7 @@ $defs: documentation_options: hide_keys: true description: |- - Custom structured config for interfaces + Custom structured config for interfaces. Note! The content of this dictionary is _not_ validated by the schema, since it can be either ethernet_interfaces or port_channel_interfaces. # Schema ref not implemented since we do not know which of the schemas to look at. - # $ref: "eos_cli_config_gen#/keys/ethernet_interfaces/items/" + # $ref: "eos_cli_config_gen#/keys/ethernet_interfaces/items" diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_svi.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/defs_svi.schema.yml similarity index 94% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_svi.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/defs_svi.schema.yml index 93d6ffea986..87745a7e773 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_svi.schema.yml +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/defs_svi.schema.yml @@ -24,4 +24,4 @@ $defs: keys: node: type: str - description: l3_leaf inventory hostname + description: l3_leaf inventory hostname. diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_svi_settings.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/defs_svi_settings.schema.yml similarity index 87% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_svi_settings.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/defs_svi_settings.schema.yml index bc6e683dd15..311e63d6002 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_svi_settings.schema.yml +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/defs_svi_settings.schema.yml @@ -11,10 +11,10 @@ $defs: keys: name: type: str - description: VLAN name + description: VLAN name. enabled: type: bool - description: Enable or disable interface + description: Enable or disable interface. description: type: str description: | @@ -31,15 +31,15 @@ $defs: ip_address_virtual: type: str description: | - IPv4_address/Mask - IPv4 VXLAN Anycast IP address + IPv4_address/Mask. + IPv4 VXLAN Anycast IP address. Conserves IP addresses in VXLAN deployments as it doesn't require unique IP addresses on each node. ipv6_address_virtual: type: str description: | - IPv6_address/Mask - ipv6 address virtuals to configure VXLAN Anycast IP address (Optional) - If both "ipv6_address_virtual" and "ipv6_address_virtuals" are set, all addresses will be configured + IPv6_address/Mask. + ipv6 address virtuals to configure VXLAN Anycast IP address (Optional). + If both "ipv6_address_virtual" and "ipv6_address_virtuals" are set, all addresses will be configured. deprecation: warning: true remove_in_version: 5.0.0 @@ -47,17 +47,17 @@ $defs: ipv6_address_virtuals: type: list description: | - IPv6 VXLAN Anycast IP addresses + IPv6 VXLAN Anycast IP addresses. Conserves IPv6 addresses in VXLAN deployments as it doesn't require unique IPv6 addresses on each node. items: type: str - description: IPv6_address/Mask + description: IPv6_address/Mask. ip_address_virtual_secondaries: type: list - description: Secondary IPv4 VXLAN Anycast IP addresses + description: Secondary IPv4 VXLAN Anycast IP addresses. items: type: str - description: IPv4_address/Mask + description: IPv4_address/Mask. ip_virtual_router_addresses: type: list description: | @@ -68,7 +68,7 @@ $defs: items: type: str description: | - IPv4_address/Mask or IPv4_address + IPv4_address/Mask or IPv4_address. IPv4_address/Mask will also configure a static route to the SVI per best practice. ipv6_virtual_router_addresses: type: list @@ -79,19 +79,33 @@ $defs: _if_ there is an ipv6_address configured for the node. items: type: str - description: IPv6_address + description: IPv6_address. + ipv4_acl_in: + description: |- + Name of the IPv4 access-list to be assigned in the ingress direction. + The access-list must be defined under `ipv4_acls` and supports substitution of the field "interface_ip". + type: str + convert_types: + - int + ipv4_acl_out: + description: |- + Name of the IPv4 Access-list to be assigned in the egress direction. + The access-list must be defined under `ipv4_acls` and supports substitution of the field "interface_ip". + type: str + convert_types: + - int ip_helpers: type: list primary_key: ip_helper convert_types: - dict - description: IP helper for DHCP relay + description: IP helper for DHCP relay. items: type: dict keys: ip_helper: type: str - description: IPv4 DHCP server IP + description: IPv4 DHCP server IP. source_interface: type: str description: Interface name to originate DHCP relay packets to DHCP server. @@ -120,7 +134,7 @@ $defs: rt_override supports two formats: - A single number which will be used in the RT fields instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rt_type' for details). - - A full RT string with colon seperator which will override the full RT. + - A full RT string with colon separator which will override the full RT. rd_override: type: str convert_types: @@ -132,7 +146,7 @@ $defs: rd_override supports two formats: - A single number which will be used in the RD assigned number field instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rd_type' for details). - - A full RD string with colon seperator which will override the full RD. + - A full RD string with colon separator which will override the full RD. trunk_groups: type: list items: @@ -261,11 +275,11 @@ $defs: structured_config: type: dict description: | - Structured configuration and EOS CLI commands rendered on router_bgp.vlans.[id=] - This configuration will not be applied to vlan aware bundles + Structured configuration and EOS CLI commands rendered on router_bgp.vlans.[id=]. + This configuration will not be applied to vlan aware bundles. documentation_options: hide_keys: true - $ref: "eos_cli_config_gen#/keys/router_bgp/keys/vlans/items/" + $ref: "eos_cli_config_gen#/keys/router_bgp/keys/vlans/items" raw_eos_cli: type: str description: | @@ -280,4 +294,4 @@ $defs: Custom structured config added under vlan_interfaces.[name=] for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: "eos_cli_config_gen#/keys/vlan_interfaces/items/" + $ref: "eos_cli_config_gen#/keys/vlan_interfaces/items" diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_virtual_topology.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/defs_virtual_topology.schema.yml similarity index 61% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_virtual_topology.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/defs_virtual_topology.schema.yml index 97aeea13823..bb3aecc1418 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/defs_virtual_topology.schema.yml +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/defs_virtual_topology.schema.yml @@ -14,29 +14,29 @@ $defs: description: Optional name. traffic_class: type: int - $ref: "eos_cli_config_gen#keys/router_adaptive_virtual_topology/keys/policies/items/keys/matches/items/keys/traffic_class" + $ref: "eos_cli_config_gen#/keys/router_adaptive_virtual_topology/keys/policies/items/keys/matches/items/keys/traffic_class" dscp: type: int - $ref: "eos_cli_config_gen#keys/router_adaptive_virtual_topology/keys/policies/items/keys/matches/items/keys/dscp" + $ref: "eos_cli_config_gen#/keys/router_adaptive_virtual_topology/keys/policies/items/keys/matches/items/keys/dscp" lowest_hop_count: description: |- Prefer paths with lowest hop-count. Only applicable for `wan_mode: "cv-pathfinder"`. type: bool default: false - $ref: "eos_cli_config_gen#keys/router_path_selection/keys/load_balance_policies/items/keys/lowest_hop_count" + $ref: "eos_cli_config_gen#/keys/router_path_selection/keys/load_balance_policies/items/keys/lowest_hop_count" constraints: type: dict keys: jitter: type: int - $ref: "eos_cli_config_gen#keys/router_path_selection/keys/load_balance_policies/items/keys/jitter" + $ref: "eos_cli_config_gen#/keys/router_path_selection/keys/load_balance_policies/items/keys/jitter" latency: type: int - $ref: "eos_cli_config_gen#keys/router_path_selection/keys/load_balance_policies/items/keys/latency" + $ref: "eos_cli_config_gen#/keys/router_path_selection/keys/load_balance_policies/items/keys/latency" loss_rate: type: str - $ref: "eos_cli_config_gen#keys/router_path_selection/keys/load_balance_policies/items/keys/loss_rate" + $ref: "eos_cli_config_gen#/keys/router_path_selection/keys/load_balance_policies/items/keys/loss_rate" path_groups: type: list min_length: 1 @@ -61,3 +61,13 @@ $defs: "alternate" is converted to priority 2. If not set, each path-group in `names` will be attributed its `default_preference`. + internet_exit: + type: dict + keys: + policy: + type: str + description: |- + PREVIEW: This key is in preview mode. + + Internet-exit policy name associated with this virtual_topology. + The policy must be defined under `cv_pathfinder_internet_exit_policies`. diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/design.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/design.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/design.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/design.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/enable_trunk_groups.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/enable_trunk_groups.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/enable_trunk_groups.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/enable_trunk_groups.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/eos_designs_custom_templates.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/eos_designs_custom_templates.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/eos_designs_custom_templates.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/eos_designs_custom_templates.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/eos_designs_documentation.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/eos_designs_documentation.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/eos_designs_documentation.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/eos_designs_documentation.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/event_handlers.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/event_handlers.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/event_handlers.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/event_handlers.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/evpn_ebgp_gateway_inter_domain.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/evpn_ebgp_gateway_inter_domain.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/evpn_ebgp_gateway_inter_domain.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/evpn_ebgp_gateway_inter_domain.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/evpn_ebgp_gateway_multihop.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/evpn_ebgp_gateway_multihop.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/evpn_ebgp_gateway_multihop.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/evpn_ebgp_gateway_multihop.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/evpn_ebgp_multihop.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/evpn_ebgp_multihop.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/evpn_ebgp_multihop.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/evpn_ebgp_multihop.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/evpn_hostflap_detection.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/evpn_hostflap_detection.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/evpn_hostflap_detection.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/evpn_hostflap_detection.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/evpn_import_pruning.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/evpn_import_pruning.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/evpn_import_pruning.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/evpn_import_pruning.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/evpn_multicast.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/evpn_multicast.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/evpn_multicast.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/evpn_multicast.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/evpn_overlay_bgp_rtc.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/evpn_overlay_bgp_rtc.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/evpn_overlay_bgp_rtc.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/evpn_overlay_bgp_rtc.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/evpn_prevent_readvertise_to_server.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/evpn_prevent_readvertise_to_server.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/evpn_prevent_readvertise_to_server.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/evpn_prevent_readvertise_to_server.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/evpn_rd_type.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/evpn_rd_type.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/evpn_rd_type.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/evpn_rd_type.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/evpn_rt_type.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/evpn_rt_type.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/evpn_rt_type.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/evpn_rt_type.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/evpn_short_esi_prefix.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/evpn_short_esi_prefix.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/evpn_short_esi_prefix.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/evpn_short_esi_prefix.schema.yml diff --git a/python-avd/pyavd/_eos_designs/schema/schema_fragments/evpn_vlan_aware_bundles.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/evpn_vlan_aware_bundles.schema.yml new file mode 100644 index 00000000000..067c10003cb --- /dev/null +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/evpn_vlan_aware_bundles.schema.yml @@ -0,0 +1,18 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +# yaml-language-server: $schema=../../../../plugins/plugin_utils/schema/avd_meta_schema.json +# Line above is used by RedHat's YAML Schema vscode extension +# Use Ctrl + Space to get suggestions for every field. Autocomplete will pop up after typing 2 letters. +type: dict +keys: + evpn_vlan_aware_bundles: + documentation_options: + table: evpn-settings + description: |- + Enable VLAN aware bundles for every EVPN MAC-VRF. + If set to `true` all SVIs in a VRF are configured in a vlan-aware-bundle using the VRF name as the bundle name. `l2vlans` are bundled in vlan-aware-bundles using the VLAN name as the bundle name. + + The `evpn_vlan_bundle` option under `svis` and `l2vlans` takes precedence and overrides this behavior. Per svi/l2vlan `evpn_vlan_bundle` also works when this setting is disabled which allow mixing vlan-aware-bundles with regular MAC-VRFs. + type: bool + default: false diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/evpn_vlan_bundles.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/evpn_vlan_bundles.schema.yml similarity index 95% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/evpn_vlan_bundles.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/evpn_vlan_bundles.schema.yml index 403007ad3e6..b756d42acf3 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/evpn_vlan_bundles.schema.yml +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/evpn_vlan_bundles.schema.yml @@ -40,7 +40,7 @@ keys: rt_override supports two formats: - A single number which will be used in the RT fields instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rt_type' for details). - - A full RT string with colon seperator which will override the full RT. + - A full RT string with colon separator which will override the full RT. rd_override: type: str convert_types: @@ -52,7 +52,7 @@ keys: rd_override supports two formats: - A single number which will be used in the RD assigned number field instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rd_type' for details). - - A full RD string with colon seperator which will override the full RD. + - A full RD string with colon separator which will override the full RD. evpn_l2_multi_domain: type: bool description: | diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/fabric_evpn_encapsulation.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/fabric_evpn_encapsulation.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/fabric_evpn_encapsulation.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/fabric_evpn_encapsulation.schema.yml diff --git a/python-avd/pyavd/_eos_designs/schema/schema_fragments/fabric_flow_tracking.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/fabric_flow_tracking.schema.yml new file mode 100644 index 00000000000..e8f1fb32eeb --- /dev/null +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/fabric_flow_tracking.schema.yml @@ -0,0 +1,53 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +# yaml-language-server: $schema=../../../../plugins/plugin_utils/schema/avd_meta_schema.json +# Line above is used by RedHat's YAML Schema vscode extension +# Use Ctrl + Space to get suggestions for every field. Autocomplete will pop up after typing 2 letters. +type: dict +keys: + fabric_flow_tracking: + documentation_options: + table: management-flow-tracking-settings + type: dict + description: |- + Default enabling of flow-tracking(IPFIX) for various interface types across the fabric. + Flow Tracking can also be enabled/disabled under each of the specific data models. + For general flow-tracking settings see `flow_tracking_settings`. + keys: + uplinks: + description: Enable flow-tracking on all fabric uplinks. + type: dict + $ref: eos_designs#/$defs/flow_tracking_link + downlinks: + description: Enable flow-tracking on all fabric downlinks. + type: dict + $ref: eos_designs#/$defs/flow_tracking_link + endpoints: + description: Enable flow-tracking on all endpoints ports. + type: dict + $ref: eos_designs#/$defs/flow_tracking_link + l3_edge: + description: Enable flow-tracking on all p2p_links defined under l3_edge. + type: dict + $ref: eos_designs#/$defs/flow_tracking_link + core_interfaces: + description: Enable flow-tracking on all p2p_links defined under core_interfaces. + type: dict + $ref: eos_designs#/$defs/flow_tracking_link + mlag_interfaces: + description: Enable flow-tracking on all MLAG peer interfaces. + type: dict + $ref: eos_designs#/$defs/flow_tracking_link + l3_interfaces: + description: Enable flow-tracking on all node.l3_interfaces. + type: dict + $ref: eos_designs#/$defs/flow_tracking_link + dps_interfaces: + description: Enable flow-tracking on all dps_interfaces. + type: dict + $ref: eos_designs#/$defs/flow_tracking_link + direct_wan_ha_links: + description: Enable flow-tracking on all direct WAN HA links. + type: dict + $ref: eos_designs#/$defs/flow_tracking_link diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/fabric_ip_addressing.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/fabric_ip_addressing.schema.yml similarity index 88% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/fabric_ip_addressing.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/fabric_ip_addressing.schema.yml index 09039ea744a..2078b4ba706 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/fabric_ip_addressing.schema.yml +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/fabric_ip_addressing.schema.yml @@ -37,6 +37,14 @@ keys: convert_types: - str description: IPv4 prefix length used for MLAG peer-vlan and L3 point-to-point SVIs over the MLAG peer-link. + ipv6_prefix_length: + type: int + default: 64 + min: 1 + max: 127 + convert_types: + - str + description: IPv6 prefix length used for MLAG peer-vlan and L3 point-to-point SVIs over the MLAG peer-link. p2p_uplinks: type: dict keys: diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/fabric_name.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/fabric_name.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/fabric_name.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/fabric_name.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/fabric_sflow.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/fabric_sflow.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/fabric_sflow.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/fabric_sflow.schema.yml diff --git a/python-avd/pyavd/_eos_designs/schema/schema_fragments/flow_tracking_settings.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/flow_tracking_settings.schema.yml new file mode 100644 index 00000000000..b8bb46b5ebe --- /dev/null +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/flow_tracking_settings.schema.yml @@ -0,0 +1,158 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +# yaml-language-server: $schema=../../../../plugins/plugin_utils/schema/avd_meta_schema.json +# Line above is used by RedHat's YAML Schema vscode extension +# Use Ctrl + Space to get suggestions for every field. Autocomplete will pop up after typing 2 letters. +type: dict +keys: + flow_tracking_settings: + documentation_options: + table: management-flow-tracking-settings + description: |- + PREVIEW: This key is currently not supported + + Define the flow tracking parameters for this topology. + type: dict + keys: + sampled: + type: dict + description: |- + The options relevant only for flow tracker type sampled. + keys: + encapsulation: + type: dict + keys: + ipv4_ipv6: + type: bool + mpls: + type: bool + sample: + type: int + convert_types: + - str + min: 1 + max: 4294967295 + default: 10000 + hardware_offload: + type: dict + keys: + ipv4: + type: bool + description: Configure hardware offload for IPv4 traffic. + ipv6: + type: bool + description: Configure hardware offload for IPv6 traffic. + threshold_minimum: + type: int + convert_types: + - str + min: 1 + max: 4294967295 + description: Minimum number of samples. + hardware: + type: dict + description: |- + The options relevant only for flow tracker type hardware. + keys: + record: + type: dict + keys: + format_ipfix_standard_timestamps_counters: + type: bool + description: Enable software export of IPFIX data records. + trackers: + type: list + primary_key: name + items: + type: dict + keys: + name: + type: str + description: Tracker Name + sampled: + type: dict + description: |- + The options relevant only for flow tracker type sampled. + keys: + table_size: + type: int + convert_types: + - str + min: 1 + max: 614400 + description: | + Maximum number of entries in flow table. + record_export: + type: dict + keys: + mpls: + type: bool + description: Export MPLS forwarding information. + record_export: + type: dict + keys: + on_inactive_timeout: + type: int + convert_types: + - str + min: 3000 + max: 900000 + description: Flow record inactive export timeout in milliseconds + on_interval: + type: int + convert_types: + - str + min: 1000 + max: 36000000 + description: Flow record export interval in milliseconds + exporters: + type: list + primary_key: name + items: + type: dict + keys: + name: + type: str + description: Exporter Name + collector: + type: dict + keys: + host: + type: str + description: Collector IPv4 address or IPv6 address or fully qualified domain name + port: + type: int + description: Collector Port Number + min: 1 + max: 65535 + convert_types: + - str + format: + type: dict + keys: + ipfix_version: + type: int + convert_types: + - str + local_interface: + type: str + description: Local Source Interface + template_interval: + type: int + convert_types: + - str + min: 5000 + max: 3600000 + description: Template interval in milliseconds + default: + - name: FLOW-TRACKER + record_export: + on_inactive_timeout: 70000 + on_interval: 300000 + exporters: + - name: CV-TELEMETRY + collector: + host: 127.0.0.1 + local_interface: Loopback0 + template_interval: 3600000 diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/generate_cv_tags.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/generate_cv_tags.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/generate_cv_tags.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/generate_cv_tags.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/hardware_counters.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/hardware_counters.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/hardware_counters.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/hardware_counters.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/internal_vlan_order.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/internal_vlan_order.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/internal_vlan_order.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/internal_vlan_order.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/ipv4_acls.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/ipv4_acls.schema.yml similarity index 92% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/ipv4_acls.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/ipv4_acls.schema.yml index 8a60ce479cb..76a4d8deeb5 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/ipv4_acls.schema.yml +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/ipv4_acls.schema.yml @@ -34,14 +34,14 @@ keys: source: type: str description: |- - This field supports substitution of the fields "interface_ip" and "peer_ip". + This field supports substitution of the fields "interface_ip" for SVIs and both "interface_ip" and "peer_ip" for Layer 3 interfaces. Alternatively it can be set with a static value of "any", "/" or "". "" without a mask means host. Required except for remarks. destination: type: str description: |- - This field supports substitution of the fields "interface_ip" and "peer_ip". + This field supports substitution of the fields "interface_ip" for SVIs and both "interface_ip" and "peer_ip" for Layer 3 interfaces. Alternatively it can be set with a static value of "any", "/" or "". "" without a mask means host. Required except for remarks. diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/ipv6_mgmt_destination_networks.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/ipv6_mgmt_destination_networks.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/ipv6_mgmt_destination_networks.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/ipv6_mgmt_destination_networks.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/ipv6_mgmt_gateway.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/ipv6_mgmt_gateway.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/ipv6_mgmt_gateway.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/ipv6_mgmt_gateway.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/is_deployed.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/is_deployed.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/is_deployed.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/is_deployed.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/isis_advertise_passive_only.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/isis_advertise_passive_only.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/isis_advertise_passive_only.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/isis_advertise_passive_only.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/isis_area_id.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/isis_area_id.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/isis_area_id.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/isis_area_id.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/isis_default_circuit_type.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/isis_default_circuit_type.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/isis_default_circuit_type.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/isis_default_circuit_type.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/isis_default_is_type.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/isis_default_is_type.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/isis_default_is_type.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/isis_default_is_type.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/isis_default_metric.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/isis_default_metric.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/isis_default_metric.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/isis_default_metric.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/isis_maximum_paths.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/isis_maximum_paths.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/isis_maximum_paths.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/isis_maximum_paths.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/isis_system_id_format.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/isis_system_id_format.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/isis_system_id_format.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/isis_system_id_format.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/isis_ti_lfa.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/isis_ti_lfa.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/isis_ti_lfa.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/isis_ti_lfa.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/l3_edge.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/l3_edge.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/l3_edge.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/l3_edge.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/l3_interface_profiles.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/l3_interface_profiles.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/l3_interface_profiles.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/l3_interface_profiles.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/local_users.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/local_users.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/local_users.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/local_users.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/mac_address_table.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/mac_address_table.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/mac_address_table.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/mac_address_table.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/management_eapi.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/management_eapi.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/management_eapi.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/management_eapi.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/mgmt_destination_networks.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/mgmt_destination_networks.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/mgmt_destination_networks.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/mgmt_destination_networks.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/mgmt_gateway.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/mgmt_gateway.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/mgmt_gateway.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/mgmt_gateway.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/mgmt_interface.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/mgmt_interface.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/mgmt_interface.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/mgmt_interface.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/mgmt_interface_description.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/mgmt_interface_description.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/mgmt_interface_description.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/mgmt_interface_description.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/mgmt_interface_vrf.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/mgmt_interface_vrf.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/mgmt_interface_vrf.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/mgmt_interface_vrf.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/mgmt_vrf_routing.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/mgmt_vrf_routing.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/mgmt_vrf_routing.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/mgmt_vrf_routing.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/mlag_ibgp_peering_vrfs.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/mlag_ibgp_peering_vrfs.schema.yml similarity index 96% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/mlag_ibgp_peering_vrfs.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/mlag_ibgp_peering_vrfs.schema.yml index cba30ef46a4..db21ab3a473 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/mlag_ibgp_peering_vrfs.schema.yml +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/mlag_ibgp_peering_vrfs.schema.yml @@ -8,7 +8,7 @@ type: dict keys: mlag_ibgp_peering_vrfs: documentation_options: - table: overlay-settings + table: network-services-vrfs-settings type: dict description: | On mlag leafs, an SVI interface is defined per vrf, to establish iBGP peering (required when there are MLAG leafs in topology). diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/mlag_on_orphan_port_channel_downlink.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/mlag_on_orphan_port_channel_downlink.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/mlag_on_orphan_port_channel_downlink.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/mlag_on_orphan_port_channel_downlink.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/name_servers.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/name_servers.schema.yml similarity index 93% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/name_servers.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/name_servers.schema.yml index 7954874c880..ff28c434a10 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/name_servers.schema.yml +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/name_servers.schema.yml @@ -13,4 +13,4 @@ keys: description: List of DNS servers. The VRF is set to < mgmt_interface_vrf >. items: type: str - description: IPv4 address + description: IPv4 or IPv6 address. diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/network_ports.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/network_ports.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/network_ports.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/network_ports.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/network_services.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/network_services.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/network_services.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/network_services.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/network_services_keys.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/network_services_keys.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/network_services_keys.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/network_services_keys.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/new_network_services_bgp_vrf_config.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/new_network_services_bgp_vrf_config.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/new_network_services_bgp_vrf_config.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/new_network_services_bgp_vrf_config.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/node_type.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/node_type.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/node_type.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/node_type.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/node_type_keys.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/node_type_keys.schema.yml similarity index 97% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/node_type_keys.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/node_type_keys.schema.yml index 39468826fc4..4cd3e4c861a 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/node_type_keys.schema.yml +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/node_type_keys.schema.yml @@ -108,6 +108,13 @@ keys: `server` indicates that the router is a route-reflector. Only supported if `overlay_routing_protocol` is set to `ibgp`. + default_flow_tracker_type: + type: str + valid_values: + - "sampled" + - "hardware" + description: Set the default flow tracker type. + default: "sampled" mlag_support: type: bool default: false @@ -214,7 +221,7 @@ keys: interface_descriptions: type: dict description: | - Override interface_descriptions templates + Override interface_descriptions templates. If description templates use Jinja2, they have to strip whitespaces using {%- -%} on any code blocks. keys: python_module: diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/ntp_settings.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/ntp_settings.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/ntp_settings.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/ntp_settings.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/only_local_vlan_trunk_groups.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/only_local_vlan_trunk_groups.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/only_local_vlan_trunk_groups.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/only_local_vlan_trunk_groups.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/overlay_cvx_servers.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/overlay_cvx_servers.schema.yml similarity index 94% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/overlay_cvx_servers.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/overlay_cvx_servers.schema.yml index d75b4687bdf..ebf4931c968 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/overlay_cvx_servers.schema.yml +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/overlay_cvx_servers.schema.yml @@ -17,4 +17,4 @@ keys: items: type: str description: | - 'inventory_hostname' of CVX server + 'inventory_hostname' of CVX server. diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/overlay_her_flood_list_per_vni.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/overlay_her_flood_list_per_vni.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/overlay_her_flood_list_per_vni.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/overlay_her_flood_list_per_vni.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/overlay_her_flood_list_scope.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/overlay_her_flood_list_scope.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/overlay_her_flood_list_scope.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/overlay_her_flood_list_scope.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/overlay_loopback_description.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/overlay_loopback_description.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/overlay_loopback_description.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/overlay_loopback_description.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/overlay_mlag_rfc5549.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/overlay_mlag_rfc5549.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/overlay_mlag_rfc5549.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/overlay_mlag_rfc5549.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/overlay_rd_type.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/overlay_rd_type.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/overlay_rd_type.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/overlay_rd_type.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/overlay_routing_protocol.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/overlay_routing_protocol.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/overlay_routing_protocol.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/overlay_routing_protocol.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/overlay_routing_protocol_address_family.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/overlay_routing_protocol_address_family.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/overlay_routing_protocol_address_family.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/overlay_routing_protocol_address_family.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/overlay_rt_type.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/overlay_rt_type.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/overlay_rt_type.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/overlay_rt_type.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/p2p_uplinks_mtu.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/p2p_uplinks_mtu.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/p2p_uplinks_mtu.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/p2p_uplinks_mtu.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/p2p_uplinks_qos_profile.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/p2p_uplinks_qos_profile.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/p2p_uplinks_qos_profile.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/p2p_uplinks_qos_profile.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/platform_settings.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/platform_settings.schema.yml similarity index 82% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/platform_settings.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/platform_settings.schema.yml index 4631156da5e..8d779c31740 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/platform_settings.schema.yml +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/platform_settings.schema.yml @@ -87,12 +87,28 @@ keys: management_interface: type: str default: Management1 + security_entropy_sources: + description: Entropy source improves the randomness of the numbers used to generate MACsec's cryptographic keys. + type: dict + keys: + hardware: + type: bool + description: Use a hardware based source. + haveged: + type: bool + description: Use the HAVEGE algorithm. + cpu_jitter: + type: bool + description: Use the Jitter RNG algorithm of a CPU based source. + hardware_exclusive: + type: bool + description: Only use entropy from the hardware source. structured_config: type: dict documentation_options: hide_keys: true description: Custom structured config for eos_cli_config_gen. - $ref: "eos_cli_config_gen#/" + $ref: "eos_cli_config_gen#" raw_eos_cli: type: str description: EOS CLI rendered directly on the root level of the final EOS configuration. @@ -142,6 +158,14 @@ keys: reload_delay: mlag: 300 non_mlag: 330 + - platforms: + - 7010TX + feature_support: + queue_monitor_length_notify: false + per_interface_mtu: false + reload_delay: + mlag: 300 + non_mlag: 330 - platforms: - 7280R - 7280R2 @@ -223,3 +247,23 @@ keys: reload_delay: mlag: 300 non_mlag: 330 + - platforms: + - AWE-5310 + - AWE-5510 + - AWE-7250R + - AWE-7230R + feature_support: + bgp_update_wait_for_convergence: true + bgp_update_wait_install: false + interface_storm_control: false + queue_monitor_length_notify: false + management_interface: Management1/1 + - platforms: + - AWE-7220R + feature_support: + bgp_update_wait_for_convergence: true + bgp_update_wait_install: false + interface_storm_control: false + queue_monitor_length_notify: false + poe: true + management_interface: Management1 diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/platform_speed_groups.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/platform_speed_groups.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/platform_speed_groups.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/platform_speed_groups.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/pod_name.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/pod_name.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/pod_name.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/pod_name.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/port_profiles.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/port_profiles.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/port_profiles.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/port_profiles.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/ptp.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/ptp.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/ptp.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/ptp.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/ptp_profiles.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/ptp_profiles.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/ptp_profiles.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/ptp_profiles.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/queue_monitor_length.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/queue_monitor_length.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/queue_monitor_length.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/queue_monitor_length.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/redundancy.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/redundancy.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/redundancy.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/redundancy.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/serial_number.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/serial_number.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/serial_number.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/serial_number.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/sflow_settings.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/sflow_settings.schema.yml similarity index 86% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/sflow_settings.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/sflow_settings.schema.yml index bd66cc05cc2..5ff676ebeb8 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/sflow_settings.schema.yml +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/sflow_settings.schema.yml @@ -15,6 +15,18 @@ keys: The sFlow process will only be configured if any interface is enabled for sFlow. For default enabling of sFlow for various interface types across the fabric see `fabric_sflow`. keys: + sample: + type: dict + keys: + rate: + type: int + convert_types: + - str + min: 1 + max: 4294967295 + description: |- + Packet sampling rate that defines the average number of ingress packets that pass through an interface for every packet that is sampled. + A rate of 16384 corresponds to an average sample of one per 16384 packets. destinations: type: list items: diff --git a/python-avd/pyavd/_eos_designs/schema/schema_fragments/shutdown_bgp_towards_undeployed_peers.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/shutdown_bgp_towards_undeployed_peers.schema.yml new file mode 100644 index 00000000000..8c9db6314a5 --- /dev/null +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/shutdown_bgp_towards_undeployed_peers.schema.yml @@ -0,0 +1,15 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +# yaml-language-server: $schema=../../../../plugins/plugin_utils/schema/avd_meta_schema.json +# Line above is used by RedHat's YAML Schema vscode extension +# Use Ctrl + Space to get suggestions for every field. Autocomplete will pop up after typing 2 letters. +type: dict +keys: + shutdown_bgp_towards_undeployed_peers: + documentation_options: + table: fabric-settings + type: bool + default: false + description: |- + When a device is set undeployed using `is_deployed: false` and `shutdown_bgp_towards_undeployed_peers` key is set to true, the BGP neighborship is shutdown on the peer. diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/shutdown_interfaces_towards_undeployed_peers.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/shutdown_interfaces_towards_undeployed_peers.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/shutdown_interfaces_towards_undeployed_peers.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/shutdown_interfaces_towards_undeployed_peers.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/snmp_settings.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/snmp_settings.schema.yml similarity index 97% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/snmp_settings.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/snmp_settings.schema.yml index f31153af246..9bb751ff5af 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/snmp_settings.schema.yml +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/snmp_settings.schema.yml @@ -11,8 +11,8 @@ keys: table: management-snmp-settings type: dict description: |- - SNMP settings - For SNMP local-interfaces see "source_interfaces.snmp" + SNMP settings. + For SNMP local-interfaces see "source_interfaces.snmp". Configuration of remote SNMP engine IDs are currently only possible using `structured_config`. keys: contact: @@ -76,10 +76,10 @@ keys: keys: name: type: str - description: Username + description: Username. group: type: str - description: Group name + description: Group name. version: type: str valid_values: ["v1", "v2c", "v3"] diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/source_interfaces.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/source_interfaces.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/source_interfaces.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/source_interfaces.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/svi_profiles.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/svi_profiles.schema.yml similarity index 97% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/svi_profiles.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/svi_profiles.schema.yml index d9d6aa00f4c..ca39e7308fa 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/svi_profiles.schema.yml +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/svi_profiles.schema.yml @@ -27,7 +27,7 @@ keys: keys: profile: type: str - description: Profile name + description: Profile name. parent_profile: type: str description: | diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/system_mac_address.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/system_mac_address.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/system_mac_address.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/system_mac_address.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/terminattr_disable_aaa.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/terminattr_disable_aaa.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/terminattr_disable_aaa.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/terminattr_disable_aaa.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/terminattr_ingestexclude.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/terminattr_ingestexclude.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/terminattr_ingestexclude.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/terminattr_ingestexclude.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/terminattr_ingestgrpcurl_port.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/terminattr_ingestgrpcurl_port.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/terminattr_ingestgrpcurl_port.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/terminattr_ingestgrpcurl_port.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/terminattr_smashexcludes.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/terminattr_smashexcludes.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/terminattr_smashexcludes.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/terminattr_smashexcludes.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/timezone.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/timezone.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/timezone.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/timezone.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/trunk_groups.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/trunk_groups.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/trunk_groups.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/trunk_groups.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/type.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/type.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/type.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/type.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/underlay_filter_peer_as.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/underlay_filter_peer_as.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/underlay_filter_peer_as.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/underlay_filter_peer_as.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/underlay_filter_redistribute_connected.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/underlay_filter_redistribute_connected.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/underlay_filter_redistribute_connected.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/underlay_filter_redistribute_connected.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/underlay_ipv6.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/underlay_ipv6.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/underlay_ipv6.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/underlay_ipv6.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/evpn_vlan_aware_bundles.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/underlay_isis_bfd.schema.yml similarity index 80% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/evpn_vlan_aware_bundles.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/underlay_isis_bfd.schema.yml index 7be9e6f998e..978c1910488 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/evpn_vlan_aware_bundles.schema.yml +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/underlay_isis_bfd.schema.yml @@ -6,9 +6,9 @@ # Use Ctrl + Space to get suggestions for every field. Autocomplete will pop up after typing 2 letters. type: dict keys: - evpn_vlan_aware_bundles: + underlay_isis_bfd: documentation_options: - table: evpn-settings - description: Enable vlan aware bundles for EVPN MAC-VRF. + table: isis-settings type: bool default: false + description: Enable BFD for ISIS on all underlay links. diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/underlay_isis_instance_name.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/underlay_isis_instance_name.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/underlay_isis_instance_name.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/underlay_isis_instance_name.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/underlay_multicast.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/underlay_multicast.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/underlay_multicast.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/underlay_multicast.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/underlay_multicast_anycast_rp.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/underlay_multicast_anycast_rp.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/underlay_multicast_anycast_rp.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/underlay_multicast_anycast_rp.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/underlay_multicast_rps.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/underlay_multicast_rps.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/underlay_multicast_rps.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/underlay_multicast_rps.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/underlay_ospf_area.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/underlay_ospf_area.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/underlay_ospf_area.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/underlay_ospf_area.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/underlay_ospf_bfd_enable.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/underlay_ospf_bfd_enable.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/underlay_ospf_bfd_enable.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/underlay_ospf_bfd_enable.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/underlay_ospf_max_lsa.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/underlay_ospf_max_lsa.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/underlay_ospf_max_lsa.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/underlay_ospf_max_lsa.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/underlay_ospf_process_id.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/underlay_ospf_process_id.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/underlay_ospf_process_id.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/underlay_ospf_process_id.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/underlay_rfc5549.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/underlay_rfc5549.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/underlay_rfc5549.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/underlay_rfc5549.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/underlay_routing_protocol.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/underlay_routing_protocol.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/underlay_routing_protocol.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/underlay_routing_protocol.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/uplink_ptp.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/uplink_ptp.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/uplink_ptp.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/uplink_ptp.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/use_cv_topology.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/use_cv_topology.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/use_cv_topology.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/use_cv_topology.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/vtep_vvtep_ip.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/vtep_vvtep_ip.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/vtep_vvtep_ip.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/vtep_vvtep_ip.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/vxlan_vlan_aware_bundles.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/vxlan_vlan_aware_bundles.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/vxlan_vlan_aware_bundles.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/vxlan_vlan_aware_bundles.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/wan_carriers.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/wan_carriers.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/wan_carriers.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/wan_carriers.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/wan_ha.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/wan_ha.schema.yml similarity index 93% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/wan_ha.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/wan_ha.schema.yml index 900dd709f54..ea6126e2c63 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/wan_ha.schema.yml +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/wan_ha.schema.yml @@ -10,7 +10,7 @@ keys: documentation_options: table: wan-settings description: |- - PREVIEW: The `wan_ha` key is currently not supported + PREVIEW: The `wan_ha` key is currently not supported. type: dict keys: lan_ha_path_group_name: diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/wan_ipsec_profiles.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/wan_ipsec_profiles.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/wan_ipsec_profiles.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/wan_ipsec_profiles.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/wan_mode.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/wan_mode.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/wan_mode.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/wan_mode.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/wan_path_groups.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/wan_path_groups.schema.yml similarity index 99% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/wan_path_groups.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/wan_path_groups.schema.yml index 6e83d2e212f..8caaf1ec505 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/wan_path_groups.schema.yml +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/wan_path_groups.schema.yml @@ -82,7 +82,7 @@ keys: convert_types: - int description: |- - Interval in milliseconds. Valid values are 50-60000 | "auto" + Interval in milliseconds. Valid values are 50-60000 | "auto". When auto, the interval and failure_threshold are automatically determined based on path state. diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/wan_route_servers.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/wan_route_servers.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/wan_route_servers.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/wan_route_servers.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/wan_stun_dtls_disable.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/wan_stun_dtls_disable.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/wan_stun_dtls_disable.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/wan_stun_dtls_disable.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/wan_stun_dtls_profile_name.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/wan_stun_dtls_profile_name.schema.yml similarity index 100% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/wan_stun_dtls_profile_name.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/wan_stun_dtls_profile_name.schema.yml diff --git a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/wan_virtual_topologies.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/wan_virtual_topologies.schema.yml similarity index 98% rename from ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/wan_virtual_topologies.schema.yml rename to python-avd/pyavd/_eos_designs/schema/schema_fragments/wan_virtual_topologies.schema.yml index a3f864b25c3..e8df49fe6d1 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/schemas/schema_fragments/wan_virtual_topologies.schema.yml +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/wan_virtual_topologies.schema.yml @@ -128,7 +128,7 @@ keys: description: Optional name, if not set `-` is used. id: type: int - $ref: "eos_cli_config_gen#keys/router_adaptive_virtual_topology/keys/vrfs/items/keys/profiles/items/keys/id" + $ref: "eos_cli_config_gen#/keys/router_adaptive_virtual_topology/keys/vrfs/items/keys/profiles/items/keys/id" required: false min: 2 max: 253 diff --git a/python-avd/pyavd/_eos_designs/schema/schema_fragments/zscaler_endpoints.schema.yml b/python-avd/pyavd/_eos_designs/schema/schema_fragments/zscaler_endpoints.schema.yml new file mode 100644 index 00000000000..48c9ff6d685 --- /dev/null +++ b/python-avd/pyavd/_eos_designs/schema/schema_fragments/zscaler_endpoints.schema.yml @@ -0,0 +1,69 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +# yaml-language-server: $schema=../../../../plugins/plugin_utils/schema/avd_meta_schema.json +# Line above is used by RedHat's YAML Schema vscode extension +# Use Ctrl + Space to get suggestions for every field. Autocomplete will pop up after typing 2 letters. +type: dict +keys: + zscaler_endpoints: + type: dict + description: |- + PREVIEW: These keys are in preview mode. + + Special data model used for testing the WAN internet-exit integration with Zscaler. + The model is supposed to be autofilled per-device by `eos_designs`. + Manually setting this model will take precedence and prevent `eos_designs` from trying to contact CloudVision. + This can be useful for offline testing or if CloudVision is not available or not configured for Zscaler integration. + keys: + primary: + type: dict + required: true + keys: + ip_address: + type: str + required: true + datacenter: + type: str + required: true + city: + type: str + required: true + country: + type: str + required: true + latitude: + type: str + convert_types: + - int + - float + required: true + longitude: + type: str + convert_types: + - int + - float + required: true + secondary: + type: dict + $ref: eos_designs#/keys/zscaler_endpoints/keys/primary + required: false + tertiary: + type: dict + $ref: eos_designs#/keys/zscaler_endpoints/keys/primary + required: false + cloud_name: + description: The name of the Zscaler cloud the CloudVision cluster is integrated with like 'zscaler1' or 'zscalerbeta'. + type: str + required: true + device_location: + description: The location of the calling device after being resolved by Zscaler location APIs. This is required since Zscaler only accepts their own variants of City and Country. + type: dict + required: true + keys: + city: + type: str + required: true + country: + type: str + required: true diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/shared_utils.py b/python-avd/pyavd/_eos_designs/shared_utils/__init__.py similarity index 85% rename from ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/shared_utils.py rename to python-avd/pyavd/_eos_designs/shared_utils/__init__.py index fae2731ef48..60ce02a2049 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/shared_utils.py +++ b/python-avd/pyavd/_eos_designs/shared_utils/__init__.py @@ -5,6 +5,7 @@ from .connected_endpoints_keys import ConnectedEndpointsKeysMixin from .cv_topology import CvTopology from .filtered_tenants import FilteredTenantsMixin +from .flow_tracking import FlowTrackingMixin from .inband_management import InbandManagementMixin from .interface_descriptions import InterfaceDescriptionsMixin from .ip_addressing import IpAddressingMixin @@ -48,20 +49,21 @@ class SharedUtils( RoutingMixin, UnderlayMixin, UtilsMixin, + FlowTrackingMixin, ): """ - Class with commonly used methods / cached_properties to be shared between all the python_modules + Class with commonly used methods / cached_properties to be shared between all the python modules loaded in eos_designs. - This class is instatiated in 'EosDesignsFacts' class and set as 'shared_utils' property. - This class is also instatiated in 'eos_designs_structured_config' and the instance is given as argument to + This class is instantiated in 'EosDesignsFacts' class and set as 'shared_utils' property. + This class is also instantiated in 'eos_designs_structured_config' and the instance is given as argument to each python module. The base class '__init__' will set the instance as 'shared_utils' property. Since these methods / cached_properties will not be rendered automatically, we can avoid some of the general conditions and just return the value. We expect the logic that determines the relevancy of the value to be handled in calling function. - The class cannot be overriden. + The class cannot be overridden. """ def __init__(self, hostvars: dict, templar) -> None: diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/bgp_peer_groups.py b/python-avd/pyavd/_eos_designs/shared_utils/bgp_peer_groups.py similarity index 95% rename from ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/bgp_peer_groups.py rename to python-avd/pyavd/_eos_designs/shared_utils/bgp_peer_groups.py index b17d3dcac52..a32bebe2356 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/bgp_peer_groups.py +++ b/python-avd/pyavd/_eos_designs/shared_utils/bgp_peer_groups.py @@ -6,10 +6,10 @@ from functools import cached_property from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get +from ..._utils import get if TYPE_CHECKING: - from .shared_utils import SharedUtils + from . import SharedUtils class BgpPeerGroupsMixin: @@ -56,7 +56,7 @@ def bgp_peer_groups(self: SharedUtils): bgp_peer_groups[key]["listen_range_prefixes"] = get(self.hostvars, f"bgp_peer_groups.{key}.listen_range_prefixes", required=True) if key in ["wan_overlay_peers", "wan_rr_overlay_peers"]: - # For WAN peerings, set the TTL for maximum hops and use defaut timers for BFD + # For WAN peerings, set the TTL for maximum hops and use default timers for BFD bgp_peer_groups[key]["ttl_maximum_hops"] = get(self.hostvars, f"bgp_peer_groups.{key}.ttl_maximum_hops", default=1) if get(self.hostvars, f"bgp_peer_groups.{key}.bfd", default=default_bfd): diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/connected_endpoints_keys.py b/python-avd/pyavd/_eos_designs/shared_utils/connected_endpoints_keys.py similarity index 92% rename from ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/connected_endpoints_keys.py rename to python-avd/pyavd/_eos_designs/shared_utils/connected_endpoints_keys.py index 1102b2e2484..c2a22f510e9 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/connected_endpoints_keys.py +++ b/python-avd/pyavd/_eos_designs/shared_utils/connected_endpoints_keys.py @@ -6,11 +6,11 @@ from functools import cached_property from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.filter.convert_dicts import convert_dicts -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get +from ..._utils import get +from ...j2filters import convert_dicts if TYPE_CHECKING: - from .shared_utils import SharedUtils + from . import SharedUtils # NOTE: there is a static list of default endpoint keys in the fabric connected endpoints documentation templates. DEFAULT_CONNECTED_ENDPOINTS_KEYS = [ diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/cv_topology.py b/python-avd/pyavd/_eos_designs/shared_utils/cv_topology.py similarity index 94% rename from ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/cv_topology.py rename to python-avd/pyavd/_eos_designs/shared_utils/cv_topology.py index f3fbee26d34..45da1e06785 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/cv_topology.py +++ b/python-avd/pyavd/_eos_designs/shared_utils/cv_topology.py @@ -6,11 +6,11 @@ from functools import cached_property from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.filter.range_expand import range_expand -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get, get_item +from ..._utils import get, get_item +from ...j2filters import range_expand if TYPE_CHECKING: - from .shared_utils import SharedUtils + from . import SharedUtils class CvTopology: diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/filtered_tenants.py b/python-avd/pyavd/_eos_designs/shared_utils/filtered_tenants.py similarity index 96% rename from ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/filtered_tenants.py rename to python-avd/pyavd/_eos_designs/shared_utils/filtered_tenants.py index d434513d75c..909a392cfdc 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/filtered_tenants.py +++ b/python-avd/pyavd/_eos_designs/shared_utils/filtered_tenants.py @@ -6,16 +6,12 @@ from functools import cached_property from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.filter.convert_dicts import convert_dicts -from ansible_collections.arista.avd.plugins.filter.default import default -from ansible_collections.arista.avd.plugins.filter.natural_sort import natural_sort -from ansible_collections.arista.avd.plugins.filter.range_expand import range_expand -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError, AristaAvdMissingVariableError -from ansible_collections.arista.avd.plugins.plugin_utils.merge import merge -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get, get_item, unique +from ..._errors import AristaAvdError, AristaAvdMissingVariableError +from ..._utils import default, get, get_item, merge, unique +from ...j2filters import convert_dicts, natural_sort, range_expand if TYPE_CHECKING: - from .shared_utils import SharedUtils + from . import SharedUtils class FilteredTenantsMixin: @@ -71,7 +67,7 @@ def filtered_tenants(self: SharedUtils) -> list[dict]: } ) elif self.is_wan_router: - # It is enough to check only the first occurence of default VRF as some other piece of code + # It is enough to check only the first occurrence of default VRF as some other piece of code # checks that if the VRF is in multiple tenants, the configuration is consistent. for tenant in filtered_tenants: if (vrf_default := get_item(tenant["vrfs"], "name", "default")) is None: @@ -97,6 +93,11 @@ def filtered_l2vlans(self: SharedUtils, tenant: dict) -> list[dict]: return [] l2vlans: list[dict] = natural_sort(convert_dicts(tenant["l2vlans"], "id"), "id") + + if tenant_evpn_vlan_bundle := get(tenant, "evpn_vlan_bundle"): + for l2vlan in l2vlans: + l2vlan["evpn_vlan_bundle"] = get(l2vlan, "evpn_vlan_bundle", default=tenant_evpn_vlan_bundle) + l2vlans = [ # Copy and set tenant key on all l2vlans {**l2vlan, "tenant": tenant["name"]} @@ -268,6 +269,10 @@ def filtered_vrfs(self: SharedUtils, tenant: dict) -> list[dict]: if vrf["svis"] or vrf["l3_interfaces"] or vrf["loopbacks"] or self.is_forced_vrf(vrf): filtered_vrfs.append(vrf) + if tenant_evpn_vlan_bundle := get(tenant, "evpn_vlan_bundle"): + for svi in vrf["svis"]: + svi["evpn_vlan_bundle"] = get(svi, "evpn_vlan_bundle", default=tenant_evpn_vlan_bundle) + return filtered_vrfs @cached_property @@ -448,5 +453,3 @@ def get_additional_svi_config(svi_config: dict, svi: dict, vrf: dict) -> None: ospf_keys.append({"id": ospf_key["id"], "hash_algorithm": ospf_key.get("hash_algorithm", "sha512"), "key": ospf_key["key"]}) if ospf_keys: svi_config.update({"ospf_authentication": ospf_authentication, "ospf_message_digest_keys": ospf_keys}) - - return None diff --git a/python-avd/pyavd/_eos_designs/shared_utils/flow_tracking.py b/python-avd/pyavd/_eos_designs/shared_utils/flow_tracking.py new file mode 100644 index 00000000000..68c79979ea6 --- /dev/null +++ b/python-avd/pyavd/_eos_designs/shared_utils/flow_tracking.py @@ -0,0 +1,92 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import annotations + +from collections import defaultdict +from functools import cached_property +from typing import TYPE_CHECKING, Literal + +from ..._utils import get + +if TYPE_CHECKING: + from . import SharedUtils + + +class FlowTrackingMixin: + """ + Mixin Class providing a subset of SharedUtils + Class should only be used as Mixin to the SharedUtils class + Using type-hint on self to get proper type-hints on attributes across all Mixins. + """ + + @cached_property + def flow_tracking_type(self: SharedUtils) -> str: + default_flow_tracker_type = get(self.node_type_key_data, "default_flow_tracker_type", "sampled") + flow_tracker_type = get(self.switch_data_combined, "flow_tracker_type", default=default_flow_tracker_type) + return flow_tracker_type + + @cached_property + def default_flow_tracker_name(self: SharedUtils) -> str: + return "FLOW-TRACKER" + + @cached_property + def fabric_flow_tracking(self: SharedUtils) -> defaultdict: + """ + Return fabric level flow tracking settings for all data models + """ + configured_values = get(self.hostvars, "fabric_flow_tracking", default={}) + + # By default, flow tracker is `hardware` type named `FLOW-TRACKER` + output_settings = defaultdict( + lambda: { + "enabled": None, + "name": self.default_flow_tracker_name, + } + ) + + # By default, flow tracking is enabled only on DPS interfaces + output_settings["dps_interfaces"]["enabled"] = True + + for data_model, settings in configured_values.items(): + tracker_enabled = settings.get("enabled") + tracker_name = settings.get("name") + + if tracker_enabled is not None: + output_settings[data_model]["enabled"] = tracker_enabled + + if tracker_name: + output_settings[data_model]["name"] = tracker_name + return output_settings + + def get_flow_tracker( + self: SharedUtils, + link_settings: dict | None, + data_model: Literal[ + "uplinks", + "downlinks", + "endpoints", + "l3_edge", + "core_interfaces", + "mlag_interfaces", + "l3_interfaces", + "dps_interfaces", + ], + ) -> dict: + """ + Return flow_tracking settings for a link, falling back to the fabric flow_tracking_settings if not defined. + """ + link_tracker_enabled, link_tracker_name = None, None + if link_settings is not None: + link_tracker_enabled = get(link_settings, "flow_tracking.enabled") + link_tracker_name = get(link_settings, "flow_tracking.name") + + fabric_flow = self.fabric_flow_tracking[data_model] + + tracking_enabled = link_tracker_enabled if link_tracker_enabled is not None else fabric_flow["enabled"] + if not tracking_enabled: + return None + + tracker_name = link_tracker_name or fabric_flow["name"] + + return {self.flow_tracking_type: tracker_name} diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/inband_management.py b/python-avd/pyavd/_eos_designs/shared_utils/inband_management.py similarity index 96% rename from ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/inband_management.py rename to python-avd/pyavd/_eos_designs/shared_utils/inband_management.py index b1c4b8a1fc5..47d8cfc3edb 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/inband_management.py +++ b/python-avd/pyavd/_eos_designs/shared_utils/inband_management.py @@ -7,11 +7,11 @@ from ipaddress import ip_network from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError, AristaAvdMissingVariableError -from ansible_collections.arista.avd.plugins.plugin_utils.utils import default, get +from ..._errors import AristaAvdError, AristaAvdMissingVariableError +from ..._utils import default, get if TYPE_CHECKING: - from .shared_utils import SharedUtils + from . import SharedUtils class InbandManagementMixin: diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/interface_descriptions.py b/python-avd/pyavd/_eos_designs/shared_utils/interface_descriptions.py similarity index 85% rename from ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/interface_descriptions.py rename to python-avd/pyavd/_eos_designs/shared_utils/interface_descriptions.py index 19060434957..a3ac1b73126 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/interface_descriptions.py +++ b/python-avd/pyavd/_eos_designs/shared_utils/interface_descriptions.py @@ -6,12 +6,11 @@ from functools import cached_property from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.merge import merge -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get, load_python_class -from ansible_collections.arista.avd.roles.eos_designs.python_modules.interface_descriptions import AvdInterfaceDescriptions +from ..._utils import get, load_python_class, merge +from ..interface_descriptions import AvdInterfaceDescriptions if TYPE_CHECKING: - from .shared_utils import SharedUtils + from . import SharedUtils DEFAULT_AVD_INTERFACE_DESCRIPTIONS_PYTHON_CLASS_NAME = "AvdInterfaceDescriptions" @@ -54,5 +53,5 @@ def interface_descriptions_templates(self: SharedUtils) -> dict: node_type_templates = get(self.node_type_key_data, "interface_descriptions", default={}) if hostvar_templates or node_type_templates: return merge(hostvar_templates, node_type_templates, list_merge="replace", destructive_merge=False) - else: - return {} + + return {} diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/ip_addressing.py b/python-avd/pyavd/_eos_designs/shared_utils/ip_addressing.py similarity index 89% rename from ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/ip_addressing.py rename to python-avd/pyavd/_eos_designs/shared_utils/ip_addressing.py index df859d01d4b..101ad8a24af 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/ip_addressing.py +++ b/python-avd/pyavd/_eos_designs/shared_utils/ip_addressing.py @@ -6,12 +6,11 @@ from functools import cached_property from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.merge import merge -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get, load_python_class -from ansible_collections.arista.avd.roles.eos_designs.python_modules.ip_addressing import AvdIpAddressing +from ..._utils import get, load_python_class, merge +from ..ip_addressing import AvdIpAddressing if TYPE_CHECKING: - from .shared_utils import SharedUtils + from . import SharedUtils DEFAULT_AVD_IP_ADDRESSING_PYTHON_CLASS_NAME = "AvdIpAddressing" @@ -58,8 +57,8 @@ def vtep_ip(self: SharedUtils) -> str: """ if self.mlag is True: return self.ip_addressing.vtep_ip_mlag() - else: - return self.ip_addressing.vtep_ip() + + return self.ip_addressing.vtep_ip() @cached_property def vtep_vvtep_ip(self: SharedUtils) -> str | None: @@ -96,5 +95,5 @@ def ip_addressing_templates(self: SharedUtils) -> dict: node_type_templates = get(self.node_type_key_data, "ip_addressing", default={}) if hostvar_templates or node_type_templates: return merge(hostvar_templates, node_type_templates, list_merge="replace", destructive_merge=False) - else: - return {} + + return {} diff --git a/python-avd/pyavd/_eos_designs/shared_utils/l3_interfaces.py b/python-avd/pyavd/_eos_designs/shared_utils/l3_interfaces.py new file mode 100644 index 00000000000..87be9552c1c --- /dev/null +++ b/python-avd/pyavd/_eos_designs/shared_utils/l3_interfaces.py @@ -0,0 +1,119 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import annotations + +from functools import cached_property +from typing import TYPE_CHECKING + +from ..._errors import AristaAvdMissingVariableError +from ..._utils import get, get_item, merge +from ..interface_descriptions import InterfaceDescriptionData + +if TYPE_CHECKING: + from . import SharedUtils + + +class L3InterfacesMixin: + """ + Mixin Class providing a subset of SharedUtils + Class should only be used as Mixin to the SharedUtils class + Using type-hint on self to get proper type-hints on attributes across all Mixins. + """ + + def sanitize_interface_name(self: SharedUtils, interface_name: str) -> str: + """ + Interface name is used as value for certain fields, but `/` are not allowed in the value. + + So we transform `/` to `_` + Ethernet1/1.1 is transformed into Ethernet1_1.1 + """ + return interface_name.replace("/", "_") + + def apply_l3_interfaces_profile(self: SharedUtils, l3_interface: dict) -> dict: + """ + Apply a profile to an l3_interface + """ + if "profile" not in l3_interface: + # Nothing to do + return l3_interface + + profile = get_item(self.l3_interface_profiles, "profile", l3_interface["profile"], default={}) + merged_dict: dict = merge(profile, l3_interface, list_merge="replace", destructive_merge=False) + merged_dict.pop("profile", None) + return merged_dict + + @cached_property + def l3_interface_profiles(self: SharedUtils) -> list: + return get(self.hostvars, "l3_interface_profiles", default=[]) + + # TODO: Add sflow knob under fabric_sflow to cover l3_interfaces defined under the node_types. + # @cached_property + # def _l3_interfaces_sflow(self) -> bool | None: + # return get(self._hostvars, f"fabric_sflow.{self.data_model}") + + @cached_property + def l3_interfaces(self: SharedUtils) -> list: + """ + Returns the list of l3_interfaces, where any referenced profiles are applied. + """ + if not (l3_interfaces := get(self.switch_data_combined, "l3_interfaces")): + return [] + + # Apply l3_interfaces._profile if set. Silently ignoring missing profile. + if self.l3_interface_profiles: + l3_interfaces = [self.apply_l3_interfaces_profile(l3_interface) for l3_interface in l3_interfaces] + + return l3_interfaces + + @cached_property + def l3_interfaces_bgp_neighbors(self: SharedUtils) -> list: + neighbors = [] + for interface in self.l3_interfaces: + peer_ip = get(interface, "peer_ip") + bgp = get(interface, "bgp") + if not (peer_ip and bgp): + continue + + peer_as = get(bgp, "peer_as") + if peer_as is None: + raise AristaAvdMissingVariableError(f"'l3_interfaces[{interface['name']}].bgp.peer_as' needs to be set to enable BGP.") + + is_intf_wan = get(interface, "wan_carrier") is not None + + prefix_list_in = get(bgp, "ipv4_prefix_list_in") + if prefix_list_in is None and is_intf_wan: + raise AristaAvdMissingVariableError(f"BGP is enabled but 'bgp.ipv4_prefix_list_in' is not configured for l3_interfaces[{interface['name']}]") + + description = interface.get("description") + if not description: + description = self.interface_descriptions.underlay_ethernet_interface( + InterfaceDescriptionData( + shared_utils=self, + interface=interface["name"], + peer=interface.get("peer"), + peer_interface=interface.get("peer_interface"), + wan_carrier=interface.get("wan_carrier"), + wan_circuit_id=interface.get("wan_circuit_id"), + ) + ) + + neighbor = { + "ip_address": peer_ip, + "remote_as": peer_as, + "description": description, + } + + neighbor["ipv4_prefix_list_in"] = prefix_list_in + neighbor["ipv4_prefix_list_out"] = get(bgp, "ipv4_prefix_list_out") + if is_intf_wan: + neighbor["set_no_advertise"] = True + + # The inbound route-map is only used if there is a prefix list or no-advertise + if neighbor["ipv4_prefix_list_in"] or neighbor.get("set_no_advertise") is True: + neighbor["route_map_in"] = f"RM-BGP-{neighbor['ip_address']}-IN" + neighbor["route_map_out"] = f"RM-BGP-{neighbor['ip_address']}-OUT" + + neighbors.append(neighbor) + + return neighbors diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/link_tracking_groups.py b/python-avd/pyavd/_eos_designs/shared_utils/link_tracking_groups.py similarity index 92% rename from ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/link_tracking_groups.py rename to python-avd/pyavd/_eos_designs/shared_utils/link_tracking_groups.py index a123fa4b068..e9e5b16d22a 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/link_tracking_groups.py +++ b/python-avd/pyavd/_eos_designs/shared_utils/link_tracking_groups.py @@ -6,10 +6,10 @@ from functools import cached_property from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get +from ..._utils import get if TYPE_CHECKING: - from .shared_utils import SharedUtils + from . import SharedUtils class LinkTrackingGroupsMixin: diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/mgmt.py b/python-avd/pyavd/_eos_designs/shared_utils/mgmt.py similarity index 87% rename from ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/mgmt.py rename to python-avd/pyavd/_eos_designs/shared_utils/mgmt.py index 03126284198..4ed5cc781fe 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/mgmt.py +++ b/python-avd/pyavd/_eos_designs/shared_utils/mgmt.py @@ -6,11 +6,11 @@ from functools import cached_property from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdMissingVariableError -from ansible_collections.arista.avd.plugins.plugin_utils.utils import default, get +from ..._errors import AristaAvdMissingVariableError +from ..._utils import default, get if TYPE_CHECKING: - from .shared_utils import SharedUtils + from . import SharedUtils class MgmtMixin: @@ -50,11 +50,11 @@ def mgmt_interface_vrf(self: SharedUtils) -> str: @cached_property def mgmt_gateway(self: SharedUtils) -> str | None: - return get(self.hostvars, "mgmt_gateway") + return get(self.switch_data_combined, "mgmt_gateway", default=get(self.hostvars, "mgmt_gateway")) @cached_property def ipv6_mgmt_gateway(self: SharedUtils) -> str | None: - return get(self.hostvars, "ipv6_mgmt_gateway") + return get(self.switch_data_combined, "ipv6_mgmt_gateway", default=get(self.hostvars, "ipv6_mgmt_gateway")) @cached_property def default_mgmt_method(self: SharedUtils) -> str | None: @@ -70,7 +70,7 @@ def default_mgmt_method(self: SharedUtils) -> str | None: return default_mgmt_method - elif default_mgmt_method == "inband": + if default_mgmt_method == "inband": # Check for missing interface if self.inband_mgmt_interface is None: raise AristaAvdMissingVariableError("'default_mgmt_method: inband' requires 'inband_mgmt_interface' to be set.") @@ -83,7 +83,7 @@ def default_mgmt_method(self: SharedUtils) -> str | None: def default_mgmt_protocol_vrf(self: SharedUtils) -> str | None: if self.default_mgmt_method == "oob": return self.mgmt_interface_vrf - elif self.default_mgmt_method == "inband": + if self.default_mgmt_method == "inband": # inband_mgmt_vrf returns None for vrf default. return self.inband_mgmt_vrf or "default" @@ -93,7 +93,7 @@ def default_mgmt_protocol_vrf(self: SharedUtils) -> str | None: def default_mgmt_protocol_interface(self: SharedUtils) -> str | None: if self.default_mgmt_method == "oob": return self.mgmt_interface - elif self.default_mgmt_method == "inband": + if self.default_mgmt_method == "inband": return self.inband_mgmt_interface return None diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/misc.py b/python-avd/pyavd/_eos_designs/shared_utils/misc.py similarity index 92% rename from ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/misc.py rename to python-avd/pyavd/_eos_designs/shared_utils/misc.py index cb68e2dedcd..38b1eae2fdb 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/misc.py +++ b/python-avd/pyavd/_eos_designs/shared_utils/misc.py @@ -7,16 +7,13 @@ from functools import cached_property from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.filter.convert_dicts import convert_dicts -from ansible_collections.arista.avd.plugins.filter.natural_sort import natural_sort -from ansible_collections.arista.avd.plugins.filter.range_expand import range_expand -from ansible_collections.arista.avd.plugins.plugin_utils.errors.errors import AristaAvdError, AristaAvdMissingVariableError -from ansible_collections.arista.avd.plugins.plugin_utils.utils import default, get, get_item +from ..._errors import AristaAvdError, AristaAvdMissingVariableError +from ..._utils import default, get +from ...j2filters import convert_dicts, natural_sort, range_expand if TYPE_CHECKING: - from ansible_collections.arista.avd.plugins.plugin_utils.eos_designs_facts.eos_designs_facts import EosDesignsFacts - - from .shared_utils import SharedUtils + from ..eos_designs_facts import EosDesignsFacts + from . import SharedUtils class MiscMixin: @@ -194,8 +191,8 @@ def max_uplink_switches(self: SharedUtils) -> int: def p2p_uplinks_mtu(self: SharedUtils) -> int | None: if not self.platform_settings_feature_support_per_interface_mtu: return None - - return get(self.hostvars, "p2p_uplinks_mtu", default=9214) + p2p_uplinks_mtu = get(self.hostvars, "p2p_uplinks_mtu", default=9214) + return get(self.switch_data_combined, "uplink_mtu", default=p2p_uplinks_mtu) @cached_property def evpn_short_esi_prefix(self: SharedUtils) -> str: @@ -205,6 +202,10 @@ def evpn_short_esi_prefix(self: SharedUtils) -> str: def shutdown_interfaces_towards_undeployed_peers(self: SharedUtils) -> bool: return get(self.hostvars, "shutdown_interfaces_towards_undeployed_peers") is True + @cached_property + def shutdown_bgp_towards_undeployed_peers(self: SharedUtils) -> bool: + return get(self.hostvars, "shutdown_bgp_towards_undeployed_peers") is True + @cached_property def bfd_multihop(self: SharedUtils) -> dict: DEFAULT_BFD_MULTIHOP = { @@ -312,6 +313,10 @@ def fabric_ip_addressing_mlag_algorithm(self: SharedUtils) -> str: def fabric_ip_addressing_mlag_ipv4_prefix_length(self: SharedUtils) -> int: return get(self.hostvars, "fabric_ip_addressing.mlag.ipv4_prefix_length", default=31) + @cached_property + def fabric_ip_addressing_mlag_ipv6_prefix_length(self: SharedUtils) -> int: + return get(self.hostvars, "fabric_ip_addressing.mlag.ipv6_prefix_length", default=64) + @cached_property def fabric_ip_addressing_p2p_uplinks_ipv4_prefix_length(self: SharedUtils) -> int: return get(self.hostvars, "fabric_ip_addressing.p2p_uplinks.ipv4_prefix_length", default=31) @@ -356,22 +361,19 @@ def new_network_services_bgp_vrf_config(self: SharedUtils) -> bool: TODO: Change default to True in all cases in AVD 5.0.0 and remove in AVD 6.0.0 """ - if self.uplink_type == "p2p-vrfs": - default_value = True - else: - default_value = False + default_value = bool(self.uplink_type == "p2p-vrfs") return get(self.hostvars, "new_network_services_bgp_vrf_config", default=default_value) @cached_property - def ipv4_acls(self: SharedUtils) -> list: - return get(self.hostvars, "ipv4_acls", default=[]) + def ipv4_acls(self: SharedUtils) -> dict: + return {acl["name"]: acl for acl in get(self.hostvars, "ipv4_acls", default=[])} def get_ipv4_acl(self: SharedUtils, name: str, interface_name: str, *, interface_ip: str | None = None, peer_ip: str | None = None): """ Get one IPv4 ACL from "ipv4_acls" where fields have been substituted. If any substitution is done, the ACL name will get "_" appended. """ - org_ipv4_acl = get_item(self.ipv4_acls, "name", name, required=True, var_name=f"ipv4_acls[name={name}]") + org_ipv4_acl = get(self.ipv4_acls, name, required=True, org_key=f"ipv4_acls[name={name}]") # deepcopy to avoid inplace updates below from modifying the original. ipv4_acl = deepcopy(org_ipv4_acl) ip_replacements = { @@ -389,7 +391,7 @@ def get_ipv4_acl(self: SharedUtils, name: str, interface_name: str, *, interface entry["destination"] = self._get_ipv4_acl_field_with_substitution(destination_field, ip_replacements, f"{err_context}.destination", interface_name) if ipv4_acl != org_ipv4_acl: - ipv4_acl["name"] += f"_{interface_name}" + ipv4_acl["name"] += f"_{self.sanitize_interface_name(interface_name)}" return ipv4_acl @staticmethod @@ -416,3 +418,7 @@ def _get_ipv4_acl_field_with_substitution(field_value: str, replacements: dict[s return value return field_value + + @cached_property + def ipv4_prefix_list_catalog(self: SharedUtils) -> list: + return get(self.hostvars, "ipv4_prefix_list_catalog", default=[]) diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/mlag.py b/python-avd/pyavd/_eos_designs/shared_utils/mlag.py similarity index 90% rename from ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/mlag.py rename to python-avd/pyavd/_eos_designs/shared_utils/mlag.py index 2fa772a3e69..8ec7b307e4a 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/mlag.py +++ b/python-avd/pyavd/_eos_designs/shared_utils/mlag.py @@ -8,14 +8,13 @@ from re import findall from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.filter.range_expand import range_expand -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError, AristaAvdMissingVariableError -from ansible_collections.arista.avd.plugins.plugin_utils.utils import default, get +from ..._errors import AristaAvdError, AristaAvdMissingVariableError +from ..._utils import default, get +from ...j2filters import range_expand if TYPE_CHECKING: - from ansible_collections.arista.avd.plugins.plugin_utils.eos_designs_facts import EosDesignsFacts - - from .shared_utils import SharedUtils + from ..eos_designs_facts import EosDesignsFacts + from . import SharedUtils class MlagMixin: @@ -63,10 +62,18 @@ def mlag_interfaces(self: SharedUtils) -> list: def mlag_interfaces_speed(self: SharedUtils) -> str | None: return get(self.switch_data_combined, "mlag_interfaces_speed") + @cached_property + def mlag_peer_address_family(self: SharedUtils) -> str: + return get(self.switch_data_combined, "mlag_peer_address_family", default="ipv4") + @cached_property def mlag_peer_ipv4_pool(self: SharedUtils) -> str: return get(self.switch_data_combined, "mlag_peer_ipv4_pool", required=True) + @cached_property + def mlag_peer_ipv6_pool(self: SharedUtils) -> str: + return get(self.switch_data_combined, "mlag_peer_ipv6_pool", required=True) + @cached_property def mlag_peer_l3_ipv4_pool(self: SharedUtils) -> str: return get(self.switch_data_combined, "mlag_peer_l3_ipv4_pool", required=True) @@ -76,7 +83,7 @@ def mlag_role(self: SharedUtils) -> str | None: if self.mlag: if self.switch_data_node_group_nodes[0]["name"] == self.hostname: return "primary" - elif self.switch_data_node_group_nodes[1]["name"] == self.hostname: + if self.switch_data_node_group_nodes[1]["name"] == self.hostname: return "secondary" raise AristaAvdError("Unable to detect MLAG role") return None @@ -137,7 +144,7 @@ def mlag_ip(self: SharedUtils) -> str | None: """ if self.mlag_role == "primary": return self.ip_addressing.mlag_ip_primary() - elif self.mlag_role == "secondary": + if self.mlag_role == "secondary": return self.ip_addressing.mlag_ip_secondary() @cached_property @@ -149,7 +156,7 @@ def mlag_l3_ip(self: SharedUtils) -> str | None: return None if self.mlag_role == "primary": return self.ip_addressing.mlag_l3_ip_primary() - elif self.mlag_role == "secondary": + if self.mlag_role == "secondary": return self.ip_addressing.mlag_l3_ip_secondary() @cached_property @@ -162,7 +169,7 @@ def mlag_switch_ids(self: SharedUtils) -> dict | None: if self.id is None: raise AristaAvdMissingVariableError(f"'id' is not set on '{self.hostname}' and is required to compute MLAG ids") return {"primary": self.id, "secondary": self.mlag_peer_id} - elif self.mlag_role == "secondary": + if self.mlag_role == "secondary": if self.id is None: raise AristaAvdMissingVariableError(f"'id' is not set on '{self.hostname}' and is required to compute MLAG ids") return {"primary": self.mlag_peer_id, "secondary": self.id} diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/node_type.py b/python-avd/pyavd/_eos_designs/shared_utils/node_type.py similarity index 94% rename from ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/node_type.py rename to python-avd/pyavd/_eos_designs/shared_utils/node_type.py index 214fb23ed0a..ed56b5dfdf3 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/node_type.py +++ b/python-avd/pyavd/_eos_designs/shared_utils/node_type.py @@ -7,11 +7,11 @@ from re import search from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdMissingVariableError -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get +from ..._errors import AristaAvdMissingVariableError +from ..._utils import get if TYPE_CHECKING: - from .shared_utils import SharedUtils + from . import SharedUtils class NodeTypeMixin: @@ -28,13 +28,13 @@ def type(self: SharedUtils) -> str: """ if (node_type := get(self.hostvars, "type")) is not None: return node_type - elif self.default_node_type: + if self.default_node_type: return self.default_node_type raise AristaAvdMissingVariableError(f"'type' for host {self.hostname}") @cached_property - def default_node_type(self: SharedUtils) -> str: + def default_node_type(self: SharedUtils) -> str | None: """ default_node_type set based on hostname, returning first node type matching a regex in default_node_types diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/node_type_keys.py b/python-avd/pyavd/_eos_designs/shared_utils/node_type_keys.py similarity index 95% rename from ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/node_type_keys.py rename to python-avd/pyavd/_eos_designs/shared_utils/node_type_keys.py index 3ed59f31fd6..aa2f745940b 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/node_type_keys.py +++ b/python-avd/pyavd/_eos_designs/shared_utils/node_type_keys.py @@ -6,12 +6,12 @@ from functools import cached_property from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.filter.convert_dicts import convert_dicts -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdMissingVariableError -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get +from ..._errors import AristaAvdMissingVariableError +from ..._utils import get +from ...j2filters import convert_dicts if TYPE_CHECKING: - from .shared_utils import SharedUtils + from . import SharedUtils # NOTE: There is a static list of default node_type_keys in the fabric documentation templates DEFAULT_NODE_TYPE_KEYS = { @@ -67,6 +67,7 @@ "default_wan_role": "client", "default_underlay_routing_protocol": "none", "default_overlay_routing_protocol": "ibgp", + "default_flow_tracker_type": "hardware", "vtep": True, "network_services": { "l3": True, @@ -79,6 +80,7 @@ "default_wan_role": "server", "default_underlay_routing_protocol": "none", "default_overlay_routing_protocol": "ibgp", + "default_flow_tracker_type": "hardware", "vtep": True, "network_services": { "l3": True, diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/overlay.py b/python-avd/pyavd/_eos_designs/shared_utils/overlay.py similarity index 96% rename from ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/overlay.py rename to python-avd/pyavd/_eos_designs/shared_utils/overlay.py index 8208fb5af5c..cf85ff09795 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/overlay.py +++ b/python-avd/pyavd/_eos_designs/shared_utils/overlay.py @@ -8,11 +8,11 @@ from re import fullmatch from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError, AristaAvdMissingVariableError -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get +from ..._errors import AristaAvdError, AristaAvdMissingVariableError +from ..._utils import get if TYPE_CHECKING: - from .shared_utils import SharedUtils + from . import SharedUtils class OverlayMixin: @@ -152,9 +152,9 @@ def evpn_soo(self: SharedUtils) -> str: return f"{self.router_id}:{self.wan_site['id']}" if self.is_first_ha_peer: return f"{self.router_id}:{self.wan_site['id']}" - else: - peer_fact = self.get_peer_facts(self.wan_ha_peer, required=True) - return f"{peer_fact['router_id']}:{self.wan_site['id']}" + + peer_fact = self.get_peer_facts(self.wan_ha_peer, required=True) + return f"{peer_fact['router_id']}:{self.wan_site['id']}" if self.overlay_vtep: return f"{self.vtep_ip}:1" diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/platform.py b/python-avd/pyavd/_eos_designs/shared_utils/platform.py similarity index 88% rename from ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/platform.py rename to python-avd/pyavd/_eos_designs/shared_utils/platform.py index 25e55adf7a1..8b42342f690 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/platform.py +++ b/python-avd/pyavd/_eos_designs/shared_utils/platform.py @@ -7,10 +7,10 @@ from re import search from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.utils import default, get +from ..._utils import default, get if TYPE_CHECKING: - from .shared_utils import SharedUtils + from . import SharedUtils # Campus platforms are separated out by their ability to support "trident_forwarding_table_partition". # This is required for EVPN multicast, currently only supported on all 720XP platforms. @@ -61,6 +61,14 @@ }, "feature_support": {"queue_monitor_length_notify": False, "poe": True}, }, + { + "platforms": ["7010TX"], + "reload_delay": { + "mlag": 300, + "non_mlag": 330, + }, + "feature_support": {"queue_monitor_length_notify": False, "per_interface_mtu": False}, + }, { "platforms": ["7280R", "7280R2", "7020R"], "tcam_profile": "vxlan-routing", @@ -153,6 +161,27 @@ "bgp_update_wait_install": False, }, }, + { + "platforms": ["AWE-5310", "AWE-5510", "AWE-7250R", "AWE-7230R"], + "management_interface": "Management1/1", + "feature_support": { + "queue_monitor_length_notify": False, + "interface_storm_control": False, + "bgp_update_wait_for_convergence": True, + "bgp_update_wait_install": False, + }, + }, + { + "platforms": ["AWE-7220R"], + "management_interface": "Management1", + "feature_support": { + "queue_monitor_length_notify": False, + "interface_storm_control": False, + "bgp_update_wait_for_convergence": True, + "bgp_update_wait_install": False, + "poe": True, + }, + }, ] diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/ptp.py b/python-avd/pyavd/_eos_designs/shared_utils/ptp.py similarity index 94% rename from ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/ptp.py rename to python-avd/pyavd/_eos_designs/shared_utils/ptp.py index d511fdf3787..907b8b662c8 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/ptp.py +++ b/python-avd/pyavd/_eos_designs/shared_utils/ptp.py @@ -6,10 +6,10 @@ from functools import cached_property from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get, get_item +from ..._utils import get, get_item if TYPE_CHECKING: - from .shared_utils import SharedUtils + from . import SharedUtils DEFAULT_PTP_PROFILES = [ { diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/routing.py b/python-avd/pyavd/_eos_designs/shared_utils/routing.py similarity index 77% rename from ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/routing.py rename to python-avd/pyavd/_eos_designs/shared_utils/routing.py index 74f6b07671b..9a066809cf4 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/routing.py +++ b/python-avd/pyavd/_eos_designs/shared_utils/routing.py @@ -6,12 +6,12 @@ from functools import cached_property from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.filter.range_expand import range_expand -from ansible_collections.arista.avd.plugins.plugin_utils.errors.errors import AristaAvdError, AristaAvdMissingVariableError -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get +from ..._errors import AristaAvdError, AristaAvdMissingVariableError +from ..._utils import get +from ...j2filters import range_expand if TYPE_CHECKING: - from .shared_utils import SharedUtils + from . import SharedUtils class RoutingMixin: @@ -103,21 +103,19 @@ def bgp_as(self: SharedUtils) -> str | None: if self.bgp: if get(self.hostvars, "bgp_as") is not None: return str(get(self.hostvars, "bgp_as")) - else: - bgp_as_range_expanded = range_expand(str(get(self.switch_data_combined, "bgp_as", required=True))) - try: - if len(bgp_as_range_expanded) == 1: - return bgp_as_range_expanded[0] - elif self.mlag: - return bgp_as_range_expanded[self.mlag_switch_ids["primary"] - 1] - else: - if self.id is None: - raise AristaAvdMissingVariableError(f"'id' is not set on '{self.hostname}' and is required when expanding 'bgp_as'") - return bgp_as_range_expanded[self.id - 1] - except IndexError as exc: - raise AristaAvdError( - f"Unable to allocate BGP AS: bgp_as range is too small ({len(bgp_as_range_expanded)}) for the id of the device" - ) from exc + + bgp_as_range_expanded = range_expand(str(get(self.switch_data_combined, "bgp_as", required=True))) + try: + if len(bgp_as_range_expanded) == 1: + return bgp_as_range_expanded[0] + if self.mlag: + return bgp_as_range_expanded[self.mlag_switch_ids["primary"] - 1] + + if self.id is None: + raise AristaAvdMissingVariableError(f"'id' is not set on '{self.hostname}' and is required when expanding 'bgp_as'") + return bgp_as_range_expanded[self.id - 1] + except IndexError as exc: + raise AristaAvdError(f"Unable to allocate BGP AS: bgp_as range is too small ({len(bgp_as_range_expanded)}) for the id of the device") from exc @cached_property def always_configure_ip_routing(self: SharedUtils) -> bool: diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/switch_data.py b/python-avd/pyavd/_eos_designs/shared_utils/switch_data.py similarity index 92% rename from ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/switch_data.py rename to python-avd/pyavd/_eos_designs/shared_utils/switch_data.py index 0d1be55bacb..dfc3498d80a 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/switch_data.py +++ b/python-avd/pyavd/_eos_designs/shared_utils/switch_data.py @@ -6,12 +6,11 @@ from functools import cached_property from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.filter.convert_dicts import convert_dicts -from ansible_collections.arista.avd.plugins.plugin_utils.merge import merge -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get +from ..._utils import get, merge +from ...j2filters import convert_dicts if TYPE_CHECKING: - from .shared_utils import SharedUtils + from . import SharedUtils class SwitchDataMixin: diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/underlay.py b/python-avd/pyavd/_eos_designs/shared_utils/underlay.py similarity index 97% rename from ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/underlay.py rename to python-avd/pyavd/_eos_designs/shared_utils/underlay.py index 3314eb25501..0212839db71 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/underlay.py +++ b/python-avd/pyavd/_eos_designs/shared_utils/underlay.py @@ -6,10 +6,10 @@ from functools import cached_property from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get, get_item +from ..._utils import get, get_item if TYPE_CHECKING: - from .shared_utils import SharedUtils + from . import SharedUtils class UnderlayMixin: diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/utils.py b/python-avd/pyavd/_eos_designs/shared_utils/utils.py similarity index 88% rename from ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/utils.py rename to python-avd/pyavd/_eos_designs/shared_utils/utils.py index fe32b151321..55b3a13c97f 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/utils.py +++ b/python-avd/pyavd/_eos_designs/shared_utils/utils.py @@ -6,14 +6,12 @@ from functools import lru_cache from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError -from ansible_collections.arista.avd.plugins.plugin_utils.merge import merge -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get, get_item, template_var +from ..._errors import AristaAvdError +from ..._utils import get, get_item, merge, template_var if TYPE_CHECKING: - from ansible_collections.arista.avd.plugins.plugin_utils.eos_designs_facts import EosDesignsFacts - - from .shared_utils import SharedUtils + from ...eos_designs_facts import EosDesignsFacts + from . import SharedUtils class UtilsMixin: diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/wan.py b/python-avd/pyavd/_eos_designs/shared_utils/wan.py similarity index 74% rename from ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/wan.py rename to python-avd/pyavd/_eos_designs/shared_utils/wan.py index dbb505f521b..a9f6527f956 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/eos_designs_shared_utils/wan.py +++ b/python-avd/pyavd/_eos_designs/shared_utils/wan.py @@ -6,13 +6,12 @@ from functools import cached_property from typing import TYPE_CHECKING, Literal -from ansible_collections.arista.avd.plugins.filter.natural_sort import natural_sort -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError, AristaAvdMissingVariableError -from ansible_collections.arista.avd.plugins.plugin_utils.strip_empties import strip_empties_from_dict -from ansible_collections.arista.avd.plugins.plugin_utils.utils import default, get, get_item +from ..._errors import AristaAvdError, AristaAvdMissingVariableError +from ..._utils import default, get, get_ip_from_pool, get_item, strip_empties_from_dict +from ...j2filters import natural_sort if TYPE_CHECKING: - from .shared_utils import SharedUtils + from . import SharedUtils class WanMixin: @@ -42,15 +41,15 @@ def wan_role(self: SharedUtils) -> str | None: return wan_role @cached_property - def is_wan_router(self) -> bool: + def is_wan_router(self: SharedUtils) -> bool: return bool(self.wan_role) @cached_property - def is_wan_server(self) -> bool: + def is_wan_server(self: SharedUtils) -> bool: return self.wan_role == "server" @cached_property - def is_wan_client(self) -> bool: + def is_wan_client(self: SharedUtils) -> bool: return self.wan_role == "client" @cached_property @@ -179,7 +178,7 @@ def wan_local_path_groups(self: SharedUtils) -> list: return list(local_path_groups_dict.values()) @cached_property - def wan_local_path_group_names(self) -> list: + def wan_local_path_group_names(self: SharedUtils) -> list: """ Return a list of wan_local_path_group names to be used by HA peer and in various places """ @@ -226,26 +225,42 @@ def get_public_ip_for_wan_interface(self: SharedUtils, interface: dict) -> str: return interface["ip_address"].split("/", maxsplit=1)[0] @cached_property - def wan_site(self: SharedUtils) -> dict: + def wan_site(self: SharedUtils) -> dict | None: """ WAN site for CV Pathfinder + + The site is required for edges, but optional for pathfinders """ node_defined_site = get( self.switch_data_combined, "cv_pathfinder_site", - required=True, + required=self.is_cv_pathfinder_client, org_key="A node variable 'cv_pathfinder_site' must be defined when 'wan_role' is 'client' and 'wan_mode' is 'cv-pathfinder'", ) - sites = get(self.wan_region, "sites", required=True, org_key=f"The CV Pathfinder region '{self.wan_region['name']}' is missing a list of sites") + if node_defined_site is None: + return None + + # Special case for cv_pathfinders without a region, we find the site details under `cv_pathfinder_global_sites` instead. + if self.is_cv_pathfinder_server and self.wan_region is None: + sites = get(self.hostvars, "cv_pathfinder_global_sites", required=True) + site_not_found_error_msg = ( + f"The 'cv_pathfinder_site '{node_defined_site}' defined at the node level could not be found under the 'cv_pathfinder_global_sites' list" + ) + else: + sites = get(self.wan_region, "sites", required=True, org_key=f"The CV Pathfinder region '{self.wan_region['name']}' is missing a list of sites") + site_not_found_error_msg = ( + ( + f"The 'cv_pathfinder_site '{node_defined_site}' defined at the node level could not be found under the 'sites' list for the region" + f" '{self.wan_region['name']}'." + ), + ) + return get_item( sites, "name", node_defined_site, required=True, - custom_error_msg=( - f"The 'cv_pathfinder_site '{node_defined_site}' defined at the node level could not be found under the 'sites' list for the region" - f" '{self.wan_region['name']}'." - ), + custom_error_msg=site_not_found_error_msg, ) @cached_property @@ -253,8 +268,6 @@ def wan_region(self: SharedUtils) -> dict | None: """ WAN region for CV Pathfinder - Also checking if site names are unique across all regions. - The region is required for edges, but optional for pathfinders """ node_defined_region = get( @@ -270,17 +283,6 @@ def wan_region(self: SharedUtils) -> dict | None: self.hostvars, "cv_pathfinder_regions", required=True, org_key="'cv_pathfinder_regions' key must be set when 'wan_mode' is 'cv-pathfinder'." ) - # Verify that site names are unique across all regions. - site_names = [site["name"] for region in regions for site in region["sites"]] - if len(site_names) != len(set(site_names)): - # We have some site names that are not unique - # Now find them (slow so no need to do if we don't have duplicates) - duplicate_site_names = [site_name for site_name in site_names if site_names.count(site_name) > 1] - raise AristaAvdError( - "WAN Site names must be unique across all regions. " - f"Found the following duplicate site name(s) under 'cv_pathfinder_regions.[].sites. {duplicate_site_names}" - ) - return get_item( regions, "name", @@ -382,14 +384,6 @@ def should_connect_to_wan_rs(self: SharedUtils, path_groups: list) -> bool: for local_path_group in self.wan_local_path_groups ) - @cached_property - def wan_flow_tracker_name(self: SharedUtils) -> str: - """ - Return the name of the WAN flow tracking object - Used in both network services, underlay and overlay python modules. - """ - return get(self.hostvars, "flow_tracking_settings.flow_tracker_name", default="FLOW-TRACKER") - @cached_property def is_cv_pathfinder_router(self: SharedUtils) -> bool: """ @@ -476,32 +470,86 @@ def wan_ha_peer(self: SharedUtils) -> str | None: return None if self.is_first_ha_peer: return self.switch_data_node_group_nodes[1]["name"] - elif self.switch_data_node_group_nodes[1]["name"] == self.hostname: + if self.switch_data_node_group_nodes[1]["name"] == self.hostname: return self.switch_data_node_group_nodes[0]["name"] raise AristaAvdError("Unable to find WAN HA peer within same node group") + @cached_property + def configured_wan_ha_interfaces(self: SharedUtils) -> set: + """ + Read the device wan_ha.ha_interfaces node settings + """ + return get(self.switch_data_combined, "wan_ha.ha_interfaces", default=[]) + + @cached_property + def vrf_default_uplinks(self: SharedUtils) -> list: + """ + Return the uplinkss in VRF default + """ + return [uplink for uplink in self.get_switch_fact("uplinks") if get(uplink, "vrf") is None] + + @cached_property + def vrf_default_uplink_interfaces(self: SharedUtils) -> list: + """ + Return the uplink interfaces in VRF default + """ + return [uplink["interface"] for uplink in self.vrf_default_uplinks] + + @cached_property + def use_uplinks_for_wan_ha(self: SharedUtils) -> bool: + """ + Return true or false + """ + interfaces = set(self.configured_wan_ha_interfaces) + uplink_interfaces = set(self.vrf_default_uplink_interfaces) + + if interfaces.issubset(uplink_interfaces): + return True + if not interfaces.intersection(uplink_interfaces): + if len(interfaces) > 1: + raise AristaAvdError("AVD does not support multiple HA interfaces when not using uplinks.") + return False + raise AristaAvdError("Either all `wan_ha.ha_interfaces` must be uplink interfaces or all of them must not be uplinks.") + + @cached_property + def wan_ha_interfaces(self: SharedUtils) -> list: + """ + Return the list of interfaces for WAN HA + + If using uplinks for WAN HA, returns the filtered uplinks if self.configured_wan_ha_interfaces is not empty + else returns all of them. + """ + if self.use_uplinks_for_wan_ha: + return natural_sort(set(self.configured_wan_ha_interfaces)) or self.vrf_default_uplink_interfaces + # Using node values + return natural_sort(set(self.configured_wan_ha_interfaces), "name") + @cached_property def wan_ha_peer_ip_addresses(self: SharedUtils) -> list: """ Read the IP addresses/prefix length from HA peer uplinks Used also to generate the prefix list of the PEER HA prefixes """ - peer_facts = self.get_peer_facts(self.wan_ha_peer, required=True) - # For now only picking up uplink interfaces in VRF default on the router. - vrf_default_peer_uplinks = [uplink for uplink in get(peer_facts, "uplinks", required=True) if get(uplink, "vrf") is None] - + interfaces = set(self.configured_wan_ha_interfaces) ip_addresses = [] - for uplink in vrf_default_peer_uplinks: - ip_address = get( - uplink, - "ip_address", - required=True, - org_key=f"The uplink interface {uplink['interface']} used as WAN LAN HA on the remote peer {self.wan_ha_peer} does not have an IP address", - ) - # We can use [] notation here because if there is an ip_address, there should be a prefix_length - prefix_length = uplink["prefix_length"] - ip_addresses.append(f"{ip_address}/{prefix_length}") - + if self.use_uplinks_for_wan_ha: + peer_facts = self.get_peer_facts(self.wan_ha_peer, required=True) + vrf_default_peer_uplinks = [uplink for uplink in get(peer_facts, "uplinks", required=True) if get(uplink, "vrf") is None] + for uplink in vrf_default_peer_uplinks: + if not interfaces or uplink["interface"] in interfaces: + ip_address = get( + uplink, + "ip_address", + required=True, + org_key=( + f"The uplink interface {uplink['interface']} used as WAN LAN HA on the remote peer {self.wan_ha_peer} does not have an IP address", + ), + ) + prefix_length = uplink["prefix_length"] + ip_addresses.append(f"{ip_address}/{prefix_length}") + else: + # Only one supported HA interface today when not using uplinks + ip_addresses.append(self.get_wan_ha_ip_address(local=False)) return ip_addresses @cached_property @@ -510,22 +558,52 @@ def wan_ha_ip_addresses(self: SharedUtils) -> list: Read the IP addresses/prefix length from this device uplinks used for HA. Used to generate the prefix list. """ - vrf_default_uplinks = [uplink for uplink in self.get_switch_fact("uplinks") if get(uplink, "vrf") is None] - + interfaces = set(self.configured_wan_ha_interfaces) ip_addresses = [] - for uplink in vrf_default_uplinks: - ip_address = get( - uplink, - "ip_address", - required=True, - org_key=f"The uplink interface {uplink['interface']} used as WAN LAN HA does not have an IP address", - ) - # We can use [] notation here because if there is an ip_address, there should be a prefix_length - prefix_length = uplink["prefix_length"] - ip_addresses.append(f"{ip_address}/{prefix_length}") + if self.use_uplinks_for_wan_ha: + for uplink in self.vrf_default_uplinks: + if not interfaces or uplink["interface"] in interfaces: + ip_address = get( + uplink, + "ip_address", + required=True, + org_key=f"The uplink interface {uplink['interface']} used as WAN LAN HA does not have an IP address", + ) + # We can use [] notation here because if there is an ip_address, there should be a prefix_length + prefix_length = uplink["prefix_length"] + ip_addresses.append(f"{ip_address}/{prefix_length}") + else: + # Only one supported HA interface today when not using uplinks + ip_addresses.append(self.get_wan_ha_ip_address(local=True)) return ip_addresses + def get_wan_ha_ip_address(self: SharedUtils, local: bool) -> str | None: + """ + Render ipv4 address for wan_ha_ip_address using dynamically loaded python module. + + local: When true, request the first IP address else request the remote peer IP. + TODO: Move this to ip_addressing module to allow for custom logic. + """ + wan_ha_ipv4_pool = get( + self.switch_data_combined, + "wan_ha.ha_ipv4_pool", + required=True, + org_key="Missing `wan_ha.ha_ipv4_pool` node settings to allocate an IP address to defined HA interface", + ) + + first_ip_address = get_ip_from_pool(wan_ha_ipv4_pool, 31, 0, 0) + second_ip_address = get_ip_from_pool(wan_ha_ipv4_pool, 31, 0, 1) + + if self.is_first_ha_peer: + local_ip, remote_ip = first_ip_address, second_ip_address + else: + local_ip, remote_ip = second_ip_address, first_ip_address + + ip_address = local_ip if local else remote_ip + + return f"{ip_address}/31" + def generate_lb_policy_name(self: SharedUtils, name: str) -> str: """ Returns LB-{name} diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/get_structured_config/get_structured_config.py b/python-avd/pyavd/_eos_designs/structured_config/__init__.py similarity index 74% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/get_structured_config/get_structured_config.py rename to python-avd/pyavd/_eos_designs/structured_config/__init__.py index 811d2353e68..0474733a553 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/get_structured_config/get_structured_config.py +++ b/python-avd/pyavd/_eos_designs/structured_config/__init__.py @@ -5,23 +5,21 @@ from collections import ChainMap -from ansible_collections.arista.avd.plugins.plugin_utils.avdfacts import AvdFacts -from ansible_collections.arista.avd.plugins.plugin_utils.eos_designs_shared_utils import SharedUtils -from ansible_collections.arista.avd.plugins.plugin_utils.merge import merge -from ansible_collections.arista.avd.plugins.plugin_utils.schema.avdschematools import AvdSchemaTools -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get - -from ..base import AvdStructuredConfigBase -from ..connected_endpoints import AvdStructuredConfigConnectedEndpoints -from ..core_interfaces_and_l3_edge import AvdStructuredConfigCoreInterfacesAndL3Edge -from ..custom_structured_configuration import AvdStructuredConfigCustomStructuredConfiguration -from ..flows import AvdStructuredConfigFlows -from ..inband_management import AvdStructuredConfigInbandManagement -from ..metadata import AvdStructuredConfigMetadata -from ..mlag import AvdStructuredConfigMlag -from ..network_services import AvdStructuredConfigNetworkServices -from ..overlay import AvdStructuredConfigOverlay -from ..underlay import AvdStructuredConfigUnderlay +from ..._utils import get, merge +from ...avd_schema_tools import AvdSchemaTools +from ..avdfacts import AvdFacts +from ..shared_utils import SharedUtils +from .base import AvdStructuredConfigBase +from .connected_endpoints import AvdStructuredConfigConnectedEndpoints +from .core_interfaces_and_l3_edge import AvdStructuredConfigCoreInterfacesAndL3Edge +from .custom_structured_configuration import AvdStructuredConfigCustomStructuredConfiguration +from .flows import AvdStructuredConfigFlows +from .inband_management import AvdStructuredConfigInbandManagement +from .metadata import AvdStructuredConfigMetadata +from .mlag import AvdStructuredConfigMlag +from .network_services import AvdStructuredConfigNetworkServices +from .overlay import AvdStructuredConfigOverlay +from .underlay import AvdStructuredConfigUnderlay AVD_STRUCTURED_CONFIG_CLASSES = [ AvdStructuredConfigBase, @@ -90,8 +88,8 @@ def get_structured_config( list_merge = get(module_vars, "custom_structured_configuration_list_merge", default="append_rp") # Only for structured config run conversion on the data in since we still have some structured config inputs without full schema validation. - for result in results: - output_schema_tools.convert_data(result) + for res in results: + output_schema_tools.convert_data(res) else: list_merge = "append" diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/base/avdstructuredconfig.py b/python-avd/pyavd/_eos_designs/structured_config/base/__init__.py similarity index 96% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/base/avdstructuredconfig.py rename to python-avd/pyavd/_eos_designs/structured_config/base/__init__.py index 5f087a9bc9b..d0c3791990c 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/base/avdstructuredconfig.py +++ b/python-avd/pyavd/_eos_designs/structured_config/base/__init__.py @@ -5,13 +5,10 @@ from functools import cached_property -from ansible_collections.arista.avd.plugins.filter.convert_dicts import convert_dicts -from ansible_collections.arista.avd.plugins.filter.natural_sort import natural_sort -from ansible_collections.arista.avd.plugins.plugin_utils.avdfacts import AvdFacts -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdMissingVariableError -from ansible_collections.arista.avd.plugins.plugin_utils.strip_empties import strip_null_from_data -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get - +from ...._errors import AristaAvdMissingVariableError +from ...._utils import get, strip_null_from_data +from ....j2filters import convert_dicts, natural_sort +from ...avdfacts import AvdFacts from .ntp import NtpMixin from .snmp_server import SnmpServerMixin @@ -25,7 +22,7 @@ class AvdStructuredConfigBase(AvdFacts, NtpMixin, SnmpServerMixin): a dict with the name of the method as key. This means that each key in the final dict corresponds to a method. The Class uses AvdFacts, as the base class, to inherit the _hostvars, keys and other attributes. - Other methods are included as "Mixins" to make the files more managable. + Other methods are included as "Mixins" to make the files more manageable. The order of the @cached_properties methods imported from Mixins will also control the order in the output. """ @@ -166,7 +163,7 @@ def service_routing_protocols_model(self) -> str: return "multi-agent" @cached_property - def ip_routing(self) -> bool: + def ip_routing(self) -> bool | None: """ For l3 devices, configure ip routing unless ip_routing_ipv6_interfaces is True. For other devices only configure if "always_configure_ip_routing" is True. @@ -279,7 +276,8 @@ def daemon_terminattr(self) -> dict | None: daemon_terminattr["cvaddrs"].append(f"{cvp_instance_ip}:443") daemon_terminattr["cvauth"] = { "method": "token-secure", - "token_file": get(self._hostvars, "cvp_token_file", "/tmp/cv-onboarding-token"), + # Ignoring sonar-lint false positive for tmp path since this is config for EOS + "token_file": get(self._hostvars, "cvp_token_file", "/tmp/cv-onboarding-token"), # NOSONAR } else: # updating for cvp_on_prem_ips @@ -293,7 +291,8 @@ def daemon_terminattr(self) -> dict | None: else: daemon_terminattr["cvauth"] = { "method": "token", - "token_file": get(self._hostvars, "cvp_token_file", "/tmp/token"), + # Ignoring sonar-lint false positive for tmp path since this is config for EOS + "token_file": get(self._hostvars, "cvp_token_file", "/tmp/token"), # NOSONAR } daemon_terminattr["cvvrf"] = self.shared_utils.mgmt_interface_vrf @@ -428,11 +427,9 @@ def spanning_tree(self) -> dict | None: if spanning_tree_mode is not None: spanning_tree["mode"] = spanning_tree_mode priority = get(self.shared_utils.switch_data_combined, "spanning_tree_priority", default=32768) + # "rapid-pvst" is not included below. Per vlan spanning-tree priorities are set under network-services. if spanning_tree_mode == "mstp": spanning_tree["mst_instances"] = [{"id": "0", "priority": priority}] - elif spanning_tree_mode == "rapid-pvst": - pass - # Per vlan spanning-tree priorities are set under network-services. elif spanning_tree_mode == "rstp": spanning_tree["rstp_priority"] = priority @@ -518,6 +515,16 @@ def management_interfaces(self) -> list | None: return None + @cached_property + def management_security(self) -> dict | None: + """ + Return structured config for management_security. + """ + if (entropy_sources := get(self.shared_utils.platform_settings, "security_entropy_sources")) is not None: + return {"entropy_sources": entropy_sources} + + return None + @cached_property def tcam_profile(self) -> dict | None: """ @@ -567,10 +574,12 @@ def mac_address_table(self) -> dict | None: def queue_monitor_streaming(self) -> dict | None: """ queue_monitor_streaming set based on queue_monitor_streaming data-model + """ enable = get(self._hostvars, "queue_monitor_streaming.enable") vrf = get(self._hostvars, "queue_monitor_streaming.vrf") if enable is not True or vrf is None: + # TODO: Fix bug where queue monitor enable without VRF will not return any config. return None queue_monitor = {} diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/base/ntp.py b/python-avd/pyavd/_eos_designs/structured_config/base/ntp.py similarity index 91% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/base/ntp.py rename to python-avd/pyavd/_eos_designs/structured_config/base/ntp.py index bbbe971cfd6..a4ec8516cf9 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/base/ntp.py +++ b/python-avd/pyavd/_eos_designs/structured_config/base/ntp.py @@ -4,13 +4,15 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError -from ansible_collections.arista.avd.plugins.plugin_utils.strip_empties import strip_null_from_data -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get - +from ...._errors import AristaAvdError +from ...._utils import get, strip_null_from_data from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigBase + class NtpMixin(UtilsMixin): """ @@ -19,7 +21,7 @@ class NtpMixin(UtilsMixin): """ @cached_property - def ntp(self) -> dict | None: + def ntp(self: AvdStructuredConfigBase) -> dict | None: """ ntp set based on "ntp_settings" data-model. """ diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/base/snmp_server.py b/python-avd/pyavd/_eos_designs/structured_config/base/snmp_server.py similarity index 85% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/base/snmp_server.py rename to python-avd/pyavd/_eos_designs/structured_config/base/snmp_server.py index 6a6d64dc2d6..2052da7d198 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/base/snmp_server.py +++ b/python-avd/pyavd/_eos_designs/structured_config/base/snmp_server.py @@ -5,15 +5,16 @@ from functools import cached_property from hashlib import sha1 +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.filter.natural_sort import natural_sort -from ansible_collections.arista.avd.plugins.filter.snmp_hash import hash_passphrase -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError, AristaAvdMissingVariableError -from ansible_collections.arista.avd.plugins.plugin_utils.strip_empties import strip_null_from_data -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get, replace_or_append_item - +from ...._errors import AristaAvdError, AristaAvdMissingVariableError +from ...._utils import get, replace_or_append_item, strip_null_from_data +from ....j2filters import natural_sort, snmp_hash from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigBase + class SnmpServerMixin(UtilsMixin): """ @@ -22,7 +23,7 @@ class SnmpServerMixin(UtilsMixin): """ @cached_property - def snmp_server(self) -> dict | None: + def snmp_server(self: AvdStructuredConfigBase) -> dict | None: """ snmp_server set based on snmp_settings data-model, using various snmp_settings information. @@ -30,7 +31,7 @@ def snmp_server(self) -> dict | None: unique local_engine_id value based on hostname and mgmt_ip facts. If user.version is set to 'v3', compute_local_engineid and compute_v3_user_localized_key are set to 'True' - we will use hash_passphrase filter to create an instance of hashlib._hashlib.HASH corresponding to the auth_type + we will use snmp_hash filter to create an instance of hashlib HASH corresponding to the auth_type value based on various snmp_settings.users information. """ source_interfaces_inputs = self._source_interfaces.get("snmp") @@ -42,7 +43,7 @@ def snmp_server(self) -> dict | None: # Set here so we can reuse it. engine_ids = self._snmp_engine_ids(snmp_settings) - # Pass through most settings with no abstration. + # Pass through most settings with no abstraction. # Use other functions for abstraction. return strip_null_from_data( { @@ -62,17 +63,18 @@ def snmp_server(self) -> dict | None: } ) - def _snmp_engine_ids(self, snmp_settings: dict) -> str | None: + def _snmp_engine_ids(self: AvdStructuredConfigBase, snmp_settings: dict) -> dict | None: """ - Return engine ids if "snmp_settings.compute_local_engineid" is True. + Return dict of engine ids if "snmp_settings.compute_local_engineid" is True. Otherwise return None """ - if not snmp_settings.get("compute_local_engineid") is True: + if snmp_settings.get("compute_local_engineid") is not True: return None compute_source = get(snmp_settings, "compute_local_engineid_source", default="hostname_and_ip") if compute_source == "hostname_and_ip": - local_engine_id = sha1(f"{self.shared_utils.hostname}{self.shared_utils.mgmt_ip}".encode("utf-8")).hexdigest() + # Accepting SonarLint issue: The weak sha1 is not used for encryption. Just to create a unique engine id. + local_engine_id = sha1(f"{self.shared_utils.hostname}{self.shared_utils.mgmt_ip}".encode("utf-8")).hexdigest() # NOSONAR elif compute_source == "system_mac": if self.shared_utils.system_mac_address is None: raise AristaAvdMissingVariableError("default_engine_id_from_system_mac: true requires system_mac_address to be set!") @@ -84,7 +86,7 @@ def _snmp_engine_ids(self, snmp_settings: dict) -> str | None: return {"local": local_engine_id} - def _snmp_location(self, snmp_settings: dict) -> str | None: + def _snmp_location(self: AvdStructuredConfigBase, snmp_settings: dict) -> str | None: """ Return location if "snmp_settings.location" is True. Otherwise return None @@ -102,7 +104,7 @@ def _snmp_location(self, snmp_settings: dict) -> str | None: location_elements = [location for location in location_elements if location not in [None, ""]] return " ".join(location_elements) - def _snmp_users(self, snmp_settings: dict, engine_ids: dict | None) -> list | None: + def _snmp_users(self: AvdStructuredConfigBase, snmp_settings: dict, engine_ids: dict | None) -> list | None: """ Return users if "snmp_settings.users" is set. Otherwise return None @@ -134,7 +136,7 @@ def _snmp_users(self, snmp_settings: dict, engine_ids: dict | None) -> list | No user_dict["auth"] = auth if compute_v3_user_localized_key: hash_filter = {"passphrase": auth_passphrase, "auth": auth, "engine_id": engine_ids["local"]} - user_dict["auth_passphrase"] = hash_passphrase(hash_filter) + user_dict["auth_passphrase"] = snmp_hash(hash_filter) else: user_dict["auth_passphrase"] = auth_passphrase @@ -144,7 +146,7 @@ def _snmp_users(self, snmp_settings: dict, engine_ids: dict | None) -> list | No user_dict["priv"] = priv if compute_v3_user_localized_key: hash_filter.update({"passphrase": priv_passphrase, "priv": priv}) - user_dict["priv_passphrase"] = hash_passphrase(hash_filter) + user_dict["priv_passphrase"] = snmp_hash(hash_filter) else: user_dict["priv_passphrase"] = priv_passphrase @@ -152,7 +154,7 @@ def _snmp_users(self, snmp_settings: dict, engine_ids: dict | None) -> list | No return snmp_users or None - def _snmp_hosts(self, snmp_settings) -> list | None: + def _snmp_hosts(self: AvdStructuredConfigBase, snmp_settings) -> list | None: """ Return hosts if "snmp_settings.hosts" is set. Otherwise return None @@ -195,7 +197,7 @@ def _snmp_hosts(self, snmp_settings) -> list | None: return snmp_hosts or None - def _snmp_local_interfaces(self, source_interfaces_inputs: dict | None) -> list | None: + def _snmp_local_interfaces(self: AvdStructuredConfigBase, source_interfaces_inputs: dict | None) -> list | None: """ Return local_interfaces if "source_interfaces.snmp" is set. Otherwise return None @@ -210,7 +212,7 @@ def _snmp_local_interfaces(self, source_interfaces_inputs: dict | None) -> list ) return local_interfaces or None - def _snmp_vrfs(self, snmp_settings: dict | None) -> list | None: + def _snmp_vrfs(self: AvdStructuredConfigBase, snmp_settings: dict | None) -> list | None: """ Return list of dicts for enabling/disabling SNMP for VRFs Requires one of the following options to be set under snmp_settings: diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/base/utils.py b/python-avd/pyavd/_eos_designs/structured_config/base/utils.py similarity index 83% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/base/utils.py rename to python-avd/pyavd/_eos_designs/structured_config/base/utils.py index 72a210a5310..c1ac8fff4ec 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/base/utils.py +++ b/python-avd/pyavd/_eos_designs/structured_config/base/utils.py @@ -4,10 +4,13 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.eos_designs_shared_utils import SharedUtils -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError, AristaAvdMissingVariableError -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get +from ...._errors import AristaAvdError, AristaAvdMissingVariableError +from ...._utils import get + +if TYPE_CHECKING: + from . import AvdStructuredConfigBase class UtilsMixin: @@ -16,15 +19,11 @@ class UtilsMixin: Class should only be used as Mixin to a AvdStructuredConfig class or other Mixins. """ - # Set type hints for Attributes of the main class as needed - _hostvars: dict - shared_utils: SharedUtils - @cached_property def _source_interfaces(self) -> dict: return get(self._hostvars, "source_interfaces", default={}) - def _build_source_interfaces(self, include_mgmt_interface: bool, include_inband_mgmt_interface: bool, error_context: str) -> list: + def _build_source_interfaces(self: AvdStructuredConfigBase, include_mgmt_interface: bool, include_inband_mgmt_interface: bool, error_context: str) -> list: """ Return list of source interfaces with VRFs. diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/connected_endpoints/avdstructuredconfig.py b/python-avd/pyavd/_eos_designs/structured_config/connected_endpoints/__init__.py similarity index 93% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/connected_endpoints/avdstructuredconfig.py rename to python-avd/pyavd/_eos_designs/structured_config/connected_endpoints/__init__.py index 279f7e5b176..a29e935318b 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/connected_endpoints/avdstructuredconfig.py +++ b/python-avd/pyavd/_eos_designs/structured_config/connected_endpoints/__init__.py @@ -1,8 +1,7 @@ # Copyright (c) 2023-2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. -from ansible_collections.arista.avd.plugins.plugin_utils.avdfacts import AvdFacts - +from ...avdfacts import AvdFacts from .ethernet_interfaces import EthernetInterfacesMixin from .monitor_sessions import MonitorSessionsMixin from .port_channel_interfaces import PortChannelInterfacesMixin @@ -22,7 +21,7 @@ class AvdStructuredConfigConnectedEndpoints( a dict with the name of the method as key. This means that each key in the final dict corresponds to a method. The Class uses AvdFacts, as the base class, to inherit the _hostvars, keys and other attributes. - All other methods are included as "Mixins" to make the files more managable. + All other methods are included as "Mixins" to make the files more manageable. The order of the @cached_properties methods imported from Mixins will also control the order in the output. """ diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/connected_endpoints/ethernet_interfaces.py b/python-avd/pyavd/_eos_designs/structured_config/connected_endpoints/ethernet_interfaces.py similarity index 85% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/connected_endpoints/ethernet_interfaces.py rename to python-avd/pyavd/_eos_designs/structured_config/connected_endpoints/ethernet_interfaces.py index c1c58401308..f2414192462 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/connected_endpoints/ethernet_interfaces.py +++ b/python-avd/pyavd/_eos_designs/structured_config/connected_endpoints/ethernet_interfaces.py @@ -6,15 +6,17 @@ import re from collections import ChainMap from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.filter.range_expand import range_expand -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError, AristaAvdMissingVariableError -from ansible_collections.arista.avd.plugins.plugin_utils.strip_empties import strip_null_from_data -from ansible_collections.arista.avd.plugins.plugin_utils.utils import append_if_not_duplicate, default, get, replace_or_append_item - -from ..interface_descriptions import InterfaceDescriptionData +from ...._errors import AristaAvdError, AristaAvdMissingVariableError +from ...._utils import append_if_not_duplicate, default, get, replace_or_append_item, strip_null_from_data +from ....j2filters import range_expand +from ...interface_descriptions import InterfaceDescriptionData from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigConnectedEndpoints + class EthernetInterfacesMixin(UtilsMixin): """ @@ -23,7 +25,7 @@ class EthernetInterfacesMixin(UtilsMixin): """ @cached_property - def ethernet_interfaces(self) -> list | None: + def ethernet_interfaces(self: AvdStructuredConfigConnectedEndpoints) -> list | None: """ Return structured config for ethernet_interfaces @@ -78,7 +80,7 @@ def ethernet_interfaces(self) -> list | None: return None - def _update_ethernet_interface_cfg(self, adapter: dict, ethernet_interface: dict, connected_endpoint: dict) -> dict: + def _update_ethernet_interface_cfg(self: AvdStructuredConfigConnectedEndpoints, adapter: dict, ethernet_interface: dict, connected_endpoint: dict) -> dict: ethernet_interface.update( { "type": "switched", @@ -94,11 +96,19 @@ def _update_ethernet_interface_cfg(self, adapter: dict, ethernet_interface: dict "spanning_tree_bpdufilter": adapter.get("spanning_tree_bpdufilter"), "spanning_tree_bpduguard": adapter.get("spanning_tree_bpduguard"), "storm_control": self._get_adapter_storm_control(adapter), + "dot1x": adapter.get("dot1x"), + "phone": self._get_adapter_phone(adapter, connected_endpoint), + "poe": self._get_adapter_poe(adapter), + "ptp": self._get_adapter_ptp(adapter), + "service_profile": adapter.get("qos_profile"), + "sflow": self._get_adapter_sflow(adapter), + "flow_tracker": self._get_adapter_flow_tracking(adapter), + "link_tracking_groups": self._get_adapter_link_tracking_groups(adapter), } ) return ethernet_interface - def _get_ethernet_interface_cfg(self, adapter: dict, node_index: int, connected_endpoint: dict) -> dict: + def _get_ethernet_interface_cfg(self: AvdStructuredConfigConnectedEndpoints, adapter: dict, node_index: int, connected_endpoint: dict) -> dict: """ Return structured_config for one ethernet_interface """ @@ -174,7 +184,7 @@ def _get_ethernet_interface_cfg(self, adapter: dict, node_index: int, connected_ # Verify that the referred profile exists under port_profiles if not (profile := self.shared_utils.get_merged_port_profile(profile_name)): raise AristaAvdMissingVariableError( - "The 'profile' of every port-channel lacp fallback individual setting must be defined in the 'port_profiles'. First occurence seen" + "The 'profile' of every port-channel lacp fallback individual setting must be defined in the 'port_profiles'. First occurrence seen" f" of a missing profile is '{get(adapter, 'port_channel.lacp_fallback.individual.profile')}' for the connected endpoint with the" f" name '{connected_endpoint['name']}'." ) @@ -190,19 +200,8 @@ def _get_ethernet_interface_cfg(self, adapter: dict, node_index: int, connected_ # NOT a port-channel member else: ethernet_interface = self._update_ethernet_interface_cfg(adapter, ethernet_interface, connected_endpoint) - ethernet_interface.update( - { - "dot1x": adapter.get("dot1x"), - "phone": self._get_adapter_phone(adapter, connected_endpoint), - "poe": self._get_adapter_poe(adapter), - "ptp": self._get_adapter_ptp(adapter), - "service_profile": adapter.get("qos_profile"), - "sflow": self._get_adapter_sflow(adapter), - "evpn_ethernet_segment": self._get_adapter_evpn_ethernet_segment_cfg( - adapter, short_esi, node_index, connected_endpoint, "auto", "single-active" - ), - "link_tracking_groups": self._get_adapter_link_tracking_groups(adapter), - } + ethernet_interface["evpn_ethernet_segment"] = self._get_adapter_evpn_ethernet_segment_cfg( + adapter, short_esi, node_index, connected_endpoint, "auto", "single-active" ) # More common ethernet_interface settings diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/connected_endpoints/monitor_sessions.py b/python-avd/pyavd/_eos_designs/structured_config/connected_endpoints/monitor_sessions.py similarity index 91% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/connected_endpoints/monitor_sessions.py rename to python-avd/pyavd/_eos_designs/structured_config/connected_endpoints/monitor_sessions.py index fd3ecc217af..7a97bdb527a 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/connected_endpoints/monitor_sessions.py +++ b/python-avd/pyavd/_eos_designs/structured_config/connected_endpoints/monitor_sessions.py @@ -5,14 +5,15 @@ import re from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.filter.range_expand import range_expand -from ansible_collections.arista.avd.plugins.plugin_utils.merge import merge -from ansible_collections.arista.avd.plugins.plugin_utils.strip_empties import strip_null_from_data -from ansible_collections.arista.avd.plugins.plugin_utils.utils import append_if_not_duplicate, get, groupby - +from ...._utils import append_if_not_duplicate, get, groupby, merge, strip_null_from_data +from ....j2filters import range_expand from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigConnectedEndpoints + class MonitorSessionsMixin(UtilsMixin): """ @@ -21,7 +22,7 @@ class MonitorSessionsMixin(UtilsMixin): """ @cached_property - def monitor_sessions(self) -> list | None: + def monitor_sessions(self: AvdStructuredConfigConnectedEndpoints) -> list | None: """ Return structured_config for monitor_sessions """ @@ -70,7 +71,7 @@ def monitor_sessions(self) -> list | None: return None @cached_property - def _monitor_session_configs(self) -> list: + def _monitor_session_configs(self: AvdStructuredConfigConnectedEndpoints) -> list: """ Return list of monitor session configs extracted from every interface """ diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/connected_endpoints/port_channel_interfaces.py b/python-avd/pyavd/_eos_designs/structured_config/connected_endpoints/port_channel_interfaces.py similarity index 88% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/connected_endpoints/port_channel_interfaces.py rename to python-avd/pyavd/_eos_designs/structured_config/connected_endpoints/port_channel_interfaces.py index 9d9a28c9f98..8bf6833ef81 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/connected_endpoints/port_channel_interfaces.py +++ b/python-avd/pyavd/_eos_designs/structured_config/connected_endpoints/port_channel_interfaces.py @@ -6,17 +6,16 @@ import re from collections import ChainMap from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.filter.generate_esi import generate_esi -from ansible_collections.arista.avd.plugins.filter.generate_lacp_id import generate_lacp_id -from ansible_collections.arista.avd.plugins.filter.generate_route_target import generate_route_target -from ansible_collections.arista.avd.plugins.filter.range_expand import range_expand -from ansible_collections.arista.avd.plugins.plugin_utils.strip_empties import strip_null_from_data -from ansible_collections.arista.avd.plugins.plugin_utils.utils import append_if_not_duplicate, get - -from ..interface_descriptions import InterfaceDescriptionData +from ...._utils import append_if_not_duplicate, get, short_esi_to_route_target, strip_null_from_data +from ....j2filters import range_expand +from ...interface_descriptions import InterfaceDescriptionData from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigConnectedEndpoints + class PortChannelInterfacesMixin(UtilsMixin): """ @@ -25,7 +24,7 @@ class PortChannelInterfacesMixin(UtilsMixin): """ @cached_property - def port_channel_interfaces(self) -> list | None: + def port_channel_interfaces(self: AvdStructuredConfigConnectedEndpoints) -> list | None: """ Return structured config for port_channel_interfaces @@ -110,7 +109,9 @@ def port_channel_interfaces(self) -> list | None: return None - def _get_port_channel_interface_cfg(self, adapter: dict, port_channel_interface_name: str, channel_group_id: int, connected_endpoint: dict) -> dict: + def _get_port_channel_interface_cfg( + self: AvdStructuredConfigConnectedEndpoints, adapter: dict, port_channel_interface_name: str, channel_group_id: int, connected_endpoint: dict + ) -> dict: """ Return structured_config for one port_channel_interface """ @@ -141,6 +142,7 @@ def _get_port_channel_interface_cfg(self, adapter: dict, port_channel_interface_ "link_tracking_groups": self._get_adapter_link_tracking_groups(adapter), "ptp": self._get_adapter_ptp(adapter), "sflow": self._get_adapter_sflow(adapter), + "flow_tracker": self._get_adapter_flow_tracking(adapter), "validate_state": None if adapter.get("validate_state", True) else False, "eos_cli": get(adapter, "port_channel.raw_eos_cli"), "struct_cfg": get(adapter, "port_channel.structured_config"), @@ -169,10 +171,12 @@ def _get_port_channel_interface_cfg(self, adapter: dict, port_channel_interface_ if (short_esi := self._get_short_esi(adapter, channel_group_id)) is not None: port_channel_interface["evpn_ethernet_segment"] = self._get_adapter_evpn_ethernet_segment_cfg(adapter, short_esi, node_index, connected_endpoint) if port_channel_mode == "active": - port_channel_interface["lacp_id"] = generate_lacp_id(short_esi) + port_channel_interface["lacp_id"] = short_esi.replace(":", ".") # Set MLAG ID on port-channel if connection is multi-homed and this switch is running MLAG elif self.shared_utils.mlag and len(set(adapter["switches"])) > 1: + if get(port_channel_interface, "ptp.enable") is True and get(adapter, "port_channel.ptp_mpass") is True: + port_channel_interface["ptp"]["mpass"] = True port_channel_interface["mlag"] = channel_group_id # LACP Fallback @@ -186,7 +190,9 @@ def _get_port_channel_interface_cfg(self, adapter: dict, port_channel_interface_ return strip_null_from_data(port_channel_interface, strip_values_tuple=(None, "")) - def _get_port_channel_subinterface_cfg(self, subinterface: dict, adapter: dict, port_channel_subinterface_name: str, channel_group_id: int) -> dict: + def _get_port_channel_subinterface_cfg( + self: AvdStructuredConfigConnectedEndpoints, subinterface: dict, adapter: dict, port_channel_subinterface_name: str, channel_group_id: int + ) -> dict: """ Return structured_config for one port_channel_interface (subinterface) """ @@ -212,8 +218,8 @@ def _get_port_channel_subinterface_cfg(self, subinterface: dict, adapter: dict, short_esi := self._get_short_esi(adapter, channel_group_id, short_esi=subinterface.get("short_esi"), hash_extra_value=str(subinterface["number"])) ) is not None: port_channel_interface["evpn_ethernet_segment"] = { - "identifier": generate_esi(short_esi, self.shared_utils.evpn_short_esi_prefix), - "route_target": generate_route_target(short_esi), + "identifier": f"{self.shared_utils.evpn_short_esi_prefix}{short_esi}", + "route_target": short_esi_to_route_target(short_esi), } return strip_null_from_data(port_channel_interface, strip_values_tuple=(None, "")) diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/connected_endpoints/utils.py b/python-avd/pyavd/_eos_designs/structured_config/connected_endpoints/utils.py similarity index 82% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/connected_endpoints/utils.py rename to python-avd/pyavd/_eos_designs/structured_config/connected_endpoints/utils.py index 3264d1acf36..d414d8a75d2 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/connected_endpoints/utils.py +++ b/python-avd/pyavd/_eos_designs/structured_config/connected_endpoints/utils.py @@ -6,13 +6,14 @@ import re from functools import cached_property from hashlib import sha256 +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.filter.convert_dicts import convert_dicts -from ansible_collections.arista.avd.plugins.filter.generate_esi import generate_esi -from ansible_collections.arista.avd.plugins.filter.generate_route_target import generate_route_target -from ansible_collections.arista.avd.plugins.plugin_utils.eos_designs_shared_utils import SharedUtils -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get, get_item +from ...._errors import AristaAvdError +from ...._utils import get, get_item, short_esi_to_route_target +from ....j2filters import convert_dicts + +if TYPE_CHECKING: + from . import AvdStructuredConfigConnectedEndpoints class UtilsMixin: @@ -21,12 +22,8 @@ class UtilsMixin: Class should only be used as Mixin to a AvdStructuredConfig class or other Mixins. """ - # Set type hints for Attributes of the main class as needed - _hostvars: dict - shared_utils: SharedUtils - @cached_property - def _filtered_connected_endpoints(self) -> list: + def _filtered_connected_endpoints(self: AvdStructuredConfigConnectedEndpoints) -> list: """ Return list of endpoints defined under one of the keys in "connected_endpoints_keys" which are connected to this switch. @@ -71,7 +68,7 @@ def _filtered_connected_endpoints(self) -> list: return filtered_connected_endpoints @cached_property - def _filtered_network_ports(self) -> list: + def _filtered_network_ports(self: AvdStructuredConfigConnectedEndpoints) -> list: """ Return list of endpoints defined under "network_ports" which are connected to this switch. @@ -86,18 +83,20 @@ def _filtered_network_ports(self) -> list: return filtered_network_ports - def _match_regexes(self, regexes: list, value: str) -> bool: + def _match_regexes(self: AvdStructuredConfigConnectedEndpoints, regexes: list, value: str) -> bool: """ Match a list of regexes with the supplied value. Regex must match the full value to pass, so regex is wrapped in ^$ """ return any(re.match(rf"^{regex}$", value) for regex in regexes) - def _get_short_esi(self, adapter: dict, channel_group_id: int, short_esi: str = None, hash_extra_value: str = "") -> str | None: + def _get_short_esi( + self: AvdStructuredConfigConnectedEndpoints, adapter: dict, channel_group_id: int, short_esi: str = None, hash_extra_value: str = "" + ) -> str | None: """ Return short_esi for one adapter """ - if len(set(adapter["switches"])) < 2: + if len(set(adapter["switches"])) < 2 or not self.shared_utils.overlay_evpn or not self.shared_utils.overlay_vtep: # Only configure ESI for multi-homing. return None @@ -123,7 +122,7 @@ def _get_short_esi(self, adapter: dict, channel_group_id: int, short_esi: str = return short_esi - def _get_adapter_trunk_groups(self, adapter: dict, connected_endpoint: dict) -> dict | None: + def _get_adapter_trunk_groups(self: AvdStructuredConfigConnectedEndpoints, adapter: dict, connected_endpoint: dict) -> dict | None: """ Return trunk_groups for one adapter """ @@ -132,7 +131,7 @@ def _get_adapter_trunk_groups(self, adapter: dict, connected_endpoint: dict) -> return None - def _get_adapter_storm_control(self, adapter: dict) -> dict | None: + def _get_adapter_storm_control(self: AvdStructuredConfigConnectedEndpoints, adapter: dict) -> dict | None: """ Return storm_control for one adapter """ @@ -142,7 +141,7 @@ def _get_adapter_storm_control(self, adapter: dict) -> dict | None: return None def _get_adapter_evpn_ethernet_segment_cfg( - self, + self: AvdStructuredConfigConnectedEndpoints, adapter: dict, short_esi: str, node_index: int, @@ -158,9 +157,9 @@ def _get_adapter_evpn_ethernet_segment_cfg( adapter_ethernet_segment: dict = adapter.get("ethernet_segment", {}) evpn_ethernet_segment = { - "identifier": generate_esi(short_esi, self.shared_utils.evpn_short_esi_prefix), + "identifier": f"{self.shared_utils.evpn_short_esi_prefix}{short_esi}", "redundancy": adapter_ethernet_segment.get("redundancy", default_redundancy), - "route_target": generate_route_target(short_esi), + "route_target": short_esi_to_route_target(short_esi), } if (designated_forwarder_algorithm := adapter_ethernet_segment.get("designated_forwarder_algorithm", default_df_algo)) is None: return evpn_ethernet_segment @@ -192,7 +191,7 @@ def _get_adapter_evpn_ethernet_segment_cfg( return evpn_ethernet_segment - def _get_adapter_link_tracking_groups(self, adapter: dict) -> list | None: + def _get_adapter_link_tracking_groups(self: AvdStructuredConfigConnectedEndpoints, adapter: dict) -> list | None: """ Return link_tracking_groups for one adapter """ @@ -206,7 +205,7 @@ def _get_adapter_link_tracking_groups(self, adapter: dict) -> list | None: } ] - def _get_adapter_ptp(self, adapter: dict) -> dict | None: + def _get_adapter_ptp(self: AvdStructuredConfigConnectedEndpoints, adapter: dict) -> dict | None: """ Return ptp for one adapter """ @@ -228,7 +227,7 @@ def _get_adapter_ptp(self, adapter: dict) -> dict | None: return ptp_config - def _get_adapter_poe(self, adapter: dict) -> dict | None: + def _get_adapter_poe(self: AvdStructuredConfigConnectedEndpoints, adapter: dict) -> dict | None: """ Return poe settings for one adapter """ @@ -237,7 +236,7 @@ def _get_adapter_poe(self, adapter: dict) -> dict | None: return None - def _get_adapter_phone(self, adapter: dict, connected_endpoint: dict) -> dict | None: + def _get_adapter_phone(self: AvdStructuredConfigConnectedEndpoints, adapter: dict, connected_endpoint: dict) -> dict | None: """ Return phone settings for one adapter """ @@ -260,8 +259,12 @@ def _get_adapter_phone(self, adapter: dict, connected_endpoint: dict) -> dict | "trunk": get(adapter, "phone_trunk_mode"), } - def _get_adapter_sflow(self, adapter: dict) -> dict | None: + def _get_adapter_sflow(self: AvdStructuredConfigConnectedEndpoints, adapter: dict) -> dict | None: if (adapter_sflow := get(adapter, "sflow", default=self.shared_utils.fabric_sflow_endpoints)) is not None: return {"enable": adapter_sflow} return None + + def _get_adapter_flow_tracking(self: AvdStructuredConfigConnectedEndpoints, adapter: dict) -> dict | None: + # Adapter flow tracking variables will be validated in _filtered_connected_endpoints + return self.shared_utils.get_flow_tracker(adapter, "endpoints") diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/core_interfaces_and_l3_edge/avdstructuredconfig.py b/python-avd/pyavd/_eos_designs/structured_config/core_interfaces_and_l3_edge/__init__.py similarity index 94% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/core_interfaces_and_l3_edge/avdstructuredconfig.py rename to python-avd/pyavd/_eos_designs/structured_config/core_interfaces_and_l3_edge/__init__.py index 2572bce4987..3c7da0f0276 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/core_interfaces_and_l3_edge/avdstructuredconfig.py +++ b/python-avd/pyavd/_eos_designs/structured_config/core_interfaces_and_l3_edge/__init__.py @@ -1,8 +1,7 @@ # Copyright (c) 2023-2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. -from ansible_collections.arista.avd.plugins.plugin_utils.avdfacts import AvdFacts - +from ...avdfacts import AvdFacts from .ethernet_interfaces import EthernetInterfacesMixin from .port_channel_interfaces import PortChannelInterfacesMixin from .router_bgp import RouterBgpMixin @@ -26,7 +25,7 @@ class AvdStructuredConfigCoreInterfacesAndL3Edge( a dict with the name of the method as key. This means that each key in the final dict corresponds to a method. The Class uses AvdFacts, as the base class, to inherit the _hostvars, keys and other attributes. - All other methods are included as "Mixins" to make the files more managable. + All other methods are included as "Mixins" to make the files more manageable. The order of the @cached_properties methods imported from Mixins will also control the order in the output. """ diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/core_interfaces_and_l3_edge/ethernet_interfaces.py b/python-avd/pyavd/_eos_designs/structured_config/core_interfaces_and_l3_edge/ethernet_interfaces.py similarity index 90% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/core_interfaces_and_l3_edge/ethernet_interfaces.py rename to python-avd/pyavd/_eos_designs/structured_config/core_interfaces_and_l3_edge/ethernet_interfaces.py index 783b4c2b574..fe9c3b884be 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/core_interfaces_and_l3_edge/ethernet_interfaces.py +++ b/python-avd/pyavd/_eos_designs/structured_config/core_interfaces_and_l3_edge/ethernet_interfaces.py @@ -4,11 +4,14 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.utils import append_if_not_duplicate - +from ...._utils import append_if_not_duplicate from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigCoreInterfacesAndL3Edge + class EthernetInterfacesMixin(UtilsMixin): """ @@ -17,7 +20,7 @@ class EthernetInterfacesMixin(UtilsMixin): """ @cached_property - def ethernet_interfaces(self) -> list | None: + def ethernet_interfaces(self: AvdStructuredConfigCoreInterfacesAndL3Edge) -> list | None: """ Return structured config for ethernet_interfaces """ diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/core_interfaces_and_l3_edge/port_channel_interfaces.py b/python-avd/pyavd/_eos_designs/structured_config/core_interfaces_and_l3_edge/port_channel_interfaces.py similarity index 84% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/core_interfaces_and_l3_edge/port_channel_interfaces.py rename to python-avd/pyavd/_eos_designs/structured_config/core_interfaces_and_l3_edge/port_channel_interfaces.py index e6265443d18..3e2f36227ac 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/core_interfaces_and_l3_edge/port_channel_interfaces.py +++ b/python-avd/pyavd/_eos_designs/structured_config/core_interfaces_and_l3_edge/port_channel_interfaces.py @@ -4,9 +4,13 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigCoreInterfacesAndL3Edge + class PortChannelInterfacesMixin(UtilsMixin): """ @@ -15,7 +19,7 @@ class PortChannelInterfacesMixin(UtilsMixin): """ @cached_property - def port_channel_interfaces(self) -> list | None: + def port_channel_interfaces(self: AvdStructuredConfigCoreInterfacesAndL3Edge) -> list | None: """ Return structured config for port_channel_interfaces """ @@ -31,7 +35,6 @@ def port_channel_interfaces(self) -> list | None: port_channel_interface = {key: value for key, value in port_channel_interface.items() if value is not None} port_channel_interfaces.append(port_channel_interface) - continue if port_channel_interfaces: return port_channel_interfaces diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/core_interfaces_and_l3_edge/router_bgp.py b/python-avd/pyavd/_eos_designs/structured_config/core_interfaces_and_l3_edge/router_bgp.py similarity index 79% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/core_interfaces_and_l3_edge/router_bgp.py rename to python-avd/pyavd/_eos_designs/structured_config/core_interfaces_and_l3_edge/router_bgp.py index 1191ee8a622..9b88c143b69 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/core_interfaces_and_l3_edge/router_bgp.py +++ b/python-avd/pyavd/_eos_designs/structured_config/core_interfaces_and_l3_edge/router_bgp.py @@ -4,11 +4,14 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdMissingVariableError - +from ...._errors import AristaAvdMissingVariableError from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigCoreInterfacesAndL3Edge + class RouterBgpMixin(UtilsMixin): """ @@ -17,7 +20,7 @@ class RouterBgpMixin(UtilsMixin): """ @cached_property - def router_bgp(self) -> dict | None: + def router_bgp(self: AvdStructuredConfigCoreInterfacesAndL3Edge) -> dict | None: """ Return structured config for router_bgp """ @@ -28,11 +31,11 @@ def router_bgp(self) -> dict | None: neighbors = [] neighbor_interfaces = [] for p2p_link in self._filtered_p2p_links: - if not (p2p_link.get("include_in_underlay_protocol", True) is True): + if p2p_link.get("include_in_underlay_protocol", True) is not True: continue if p2p_link["data"]["bgp_as"] is None or p2p_link["data"]["peer_bgp_as"] is None: - raise AristaAvdMissingVariableError("l3_edge.p2p_links.[].as") + raise AristaAvdMissingVariableError(f"{self.data_model}.p2p_links.[].as or {self.data_model}.p2p_links_profiles.[].as") neighbor = { "remote_as": p2p_link["data"]["peer_bgp_as"], @@ -48,7 +51,7 @@ def router_bgp(self) -> dict | None: # Regular BGP Neighbors if p2p_link["data"]["ip"] is None or p2p_link["data"]["peer_ip"] is None: - raise AristaAvdMissingVariableError("l3_edge.p2p_links.[].ip, .subnet or .ip_pool") + raise AristaAvdMissingVariableError(f"{self.data_model}.p2p_links.[].ip, .subnet or .ip_pool") neighbor["bfd"] = p2p_link.get("bfd") if p2p_link["data"]["bgp_as"] != self.shared_utils.bgp_as: diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/core_interfaces_and_l3_edge/router_ospf.py b/python-avd/pyavd/_eos_designs/structured_config/core_interfaces_and_l3_edge/router_ospf.py similarity index 85% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/core_interfaces_and_l3_edge/router_ospf.py rename to python-avd/pyavd/_eos_designs/structured_config/core_interfaces_and_l3_edge/router_ospf.py index c861065532a..e8abeeb74b7 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/core_interfaces_and_l3_edge/router_ospf.py +++ b/python-avd/pyavd/_eos_designs/structured_config/core_interfaces_and_l3_edge/router_ospf.py @@ -4,9 +4,13 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigCoreInterfacesAndL3Edge + class RouterOspfMixin(UtilsMixin): """ @@ -15,7 +19,7 @@ class RouterOspfMixin(UtilsMixin): """ @cached_property - def router_ospf(self) -> dict | None: + def router_ospf(self: AvdStructuredConfigCoreInterfacesAndL3Edge) -> dict | None: """ Return structured config for router_ospf """ diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/core_interfaces_and_l3_edge/utils.py b/python-avd/pyavd/_eos_designs/structured_config/core_interfaces_and_l3_edge/utils.py similarity index 86% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/core_interfaces_and_l3_edge/utils.py rename to python-avd/pyavd/_eos_designs/structured_config/core_interfaces_and_l3_edge/utils.py index e51e15fefb2..c856b7eaf55 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/core_interfaces_and_l3_edge/utils.py +++ b/python-avd/pyavd/_eos_designs/structured_config/core_interfaces_and_l3_edge/utils.py @@ -8,12 +8,14 @@ from functools import cached_property from ipaddress import ip_network from itertools import islice +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.filter.convert_dicts import convert_dicts -from ansible_collections.arista.avd.plugins.plugin_utils.eos_designs_shared_utils import SharedUtils -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdMissingVariableError -from ansible_collections.arista.avd.plugins.plugin_utils.merge import merge -from ansible_collections.arista.avd.plugins.plugin_utils.utils import default, get, get_item +from ...._errors import AristaAvdMissingVariableError +from ...._utils import default, get, get_item, merge +from ....j2filters import convert_dicts + +if TYPE_CHECKING: + from . import AvdStructuredConfigCoreInterfacesAndL3Edge class UtilsMixin: @@ -22,28 +24,24 @@ class UtilsMixin: Class should only be used as Mixin to a AvdStructuredConfig class """ - # Set type hints for Attributes of the main class as needed - _hostvars: dict - shared_utils: SharedUtils - @cached_property - def _p2p_links_profiles(self) -> list: + def _p2p_links_profiles(self: AvdStructuredConfigCoreInterfacesAndL3Edge) -> list: return get(self._hostvars, f"{self.data_model}.p2p_links_profiles", default=[]) @cached_property - def _p2p_links_ip_pools(self) -> list: + def _p2p_links_ip_pools(self: AvdStructuredConfigCoreInterfacesAndL3Edge) -> list: return get(self._hostvars, f"{self.data_model}.p2p_links_ip_pools", default=[]) @cached_property - def _p2p_links(self) -> list: + def _p2p_links(self: AvdStructuredConfigCoreInterfacesAndL3Edge) -> list: return get(self._hostvars, f"{self.data_model}.p2p_links", default=[]) @cached_property - def _p2p_links_sflow(self) -> bool | None: + def _p2p_links_sflow(self: AvdStructuredConfigCoreInterfacesAndL3Edge) -> bool | None: return get(self._hostvars, f"fabric_sflow.{self.data_model}") @cached_property - def _filtered_p2p_links(self) -> list: + def _filtered_p2p_links(self: AvdStructuredConfigCoreInterfacesAndL3Edge) -> list: """ Returns a filtered list of p2p_links, which only contains links with our hostname. For each links any referenced profiles are applied and IP addresses are resolved @@ -70,7 +68,7 @@ def _filtered_p2p_links(self) -> list: return p2p_links - def _apply_p2p_links_profile(self, target_dict: dict) -> dict: + def _apply_p2p_links_profile(self: AvdStructuredConfigCoreInterfacesAndL3Edge, target_dict: dict) -> dict: """ Apply a profile to a p2p_link """ @@ -83,7 +81,7 @@ def _apply_p2p_links_profile(self, target_dict: dict) -> dict: merged_dict.pop("name", None) return merged_dict - def _resolve_p2p_ips(self, p2p_link: dict) -> dict: + def _resolve_p2p_ips(self: AvdStructuredConfigCoreInterfacesAndL3Edge, p2p_link: dict) -> dict: if "ip" in p2p_link: # ip already set, so nothing to do return p2p_link @@ -111,7 +109,7 @@ def _resolve_p2p_ips(self, p2p_link: dict) -> dict: p2p_link["ip"] = [f"{ip}/{subnet.prefixlen}" for ip in islice(subnet.hosts(), 2)] return p2p_link - def _get_p2p_data(self, p2p_link: dict) -> dict: + def _get_p2p_data(self: AvdStructuredConfigCoreInterfacesAndL3Edge, p2p_link: dict) -> dict: """ Parses p2p_link data model and extracts information which is easier to parse. Returns: @@ -151,8 +149,8 @@ def _get_p2p_data(self, p2p_link: dict) -> dict: "peer_type": peer_type, "ip": ip[index], "peer_ip": ip[peer_index], - "bgp_as": str(bgp_as[index]), - "peer_bgp_as": str(bgp_as[peer_index]), + "bgp_as": str(bgp_as[index]) if index < len(bgp_as) and bgp_as[index] else None, + "peer_bgp_as": str(bgp_as[peer_index]) if peer_index < len(bgp_as) and bgp_as[peer_index] else None, "description": descriptions[index], } @@ -206,7 +204,7 @@ def _get_p2p_data(self, p2p_link: dict) -> dict: raise AristaAvdMissingVariableError(f"{self.data_model}.p2p_links must have either 'interfaces' or 'port_channel' with correct members set.") - def _get_common_interface_cfg(self, p2p_link: dict) -> dict: + def _get_common_interface_cfg(self: AvdStructuredConfigCoreInterfacesAndL3Edge, p2p_link: dict) -> dict: """ Return partial structured_config for one p2p_link. Covers common config that is applicable to both port-channels and ethernet interfaces. @@ -235,6 +233,9 @@ def _get_common_interface_cfg(self, p2p_link: dict) -> dict: interface_cfg["ip_address"] = ip[index] if p2p_link.get("include_in_underlay_protocol", True) is True: + if p2p_link.get("underlay_multicast", False) and self.shared_utils.underlay_multicast is True: + interface_cfg["pim"] = {"ipv4": {"sparse_mode": True}} + if (self.shared_utils.underlay_rfc5549 and p2p_link.get("routing_protocol") != "ebgp") or p2p_link.get("ipv6_enable") is True: interface_cfg["ipv6_enable"] = True @@ -250,6 +251,7 @@ def _get_common_interface_cfg(self, p2p_link: dict) -> dict: interface_cfg.update( { "isis_enable": self.shared_utils.isis_instance_name, + "isis_bfd": get(self._hostvars, "underlay_isis_bfd"), "isis_metric": default(p2p_link.get("isis_metric"), self.shared_utils.isis_default_metric), "isis_network_point_to_point": p2p_link.get("isis_network_type", "point-to-point") == "point-to-point", "isis_hello_padding": p2p_link.get("isis_hello_padding", True), @@ -267,6 +269,9 @@ def _get_common_interface_cfg(self, p2p_link: dict) -> dict: if (p2p_link_sflow := get(p2p_link, "sflow", default=self._p2p_links_sflow)) is not None: interface_cfg["sflow"] = {"enable": p2p_link_sflow} + if (p2p_link_flow_tracking := self.shared_utils.get_flow_tracker(p2p_link, self.data_model)) is not None: + interface_cfg["flow_tracker"] = p2p_link_flow_tracking + if self.shared_utils.mpls_lsr and p2p_link.get("mpls_ip", True) is True: interface_cfg["mpls"] = {"ip": True} if p2p_link.get("include_in_underlay_protocol", True) is True and self.shared_utils.underlay_ldp and p2p_link.get("mpls_ldp", True) is True: @@ -281,7 +286,7 @@ def _get_common_interface_cfg(self, p2p_link: dict) -> dict: return interface_cfg - def _get_ethernet_cfg(self, p2p_link: dict) -> dict: + def _get_ethernet_cfg(self: AvdStructuredConfigCoreInterfacesAndL3Edge, p2p_link: dict) -> dict: """ Return partial structured_config for one p2p_link. Covers config that is only applicable to ethernet interfaces. @@ -305,7 +310,7 @@ def _get_ethernet_cfg(self, p2p_link: dict) -> dict: return ethernet_cfg - def _get_port_channel_member_cfg(self, p2p_link: dict, member: dict) -> dict: + def _get_port_channel_member_cfg(self: AvdStructuredConfigCoreInterfacesAndL3Edge, p2p_link: dict, member: dict) -> dict: """ Return partial structured_config for one p2p_link. Covers config for ethernet interfaces that are port-channel members. diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/custom_structured_configuration/avdstructuredconfig.py b/python-avd/pyavd/_eos_designs/structured_config/custom_structured_configuration/__init__.py similarity index 97% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/custom_structured_configuration/avdstructuredconfig.py rename to python-avd/pyavd/_eos_designs/structured_config/custom_structured_configuration/__init__.py index d0b7755a62f..d22c9a0219d 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/custom_structured_configuration/avdstructuredconfig.py +++ b/python-avd/pyavd/_eos_designs/structured_config/custom_structured_configuration/__init__.py @@ -5,8 +5,8 @@ from functools import cached_property -from ansible_collections.arista.avd.plugins.plugin_utils.avdfacts import AvdFacts -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get +from ...._utils import get +from ...avdfacts import AvdFacts CUSTOM_STRUCTURED_CONFIGURATION_EXEMPT_KEYS = ["custom_structured_configuration_prefix", "custom_structured_configuration_list_merge"] diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/flows/avdstructuredconfig.py b/python-avd/pyavd/_eos_designs/structured_config/flows/__init__.py similarity index 52% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/flows/avdstructuredconfig.py rename to python-avd/pyavd/_eos_designs/structured_config/flows/__init__.py index 1880b41b4f0..007d1b2c108 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/flows/avdstructuredconfig.py +++ b/python-avd/pyavd/_eos_designs/structured_config/flows/__init__.py @@ -5,11 +5,10 @@ from functools import cached_property -from ansible_collections.arista.avd.plugins.filter.natural_sort import natural_sort -from ansible_collections.arista.avd.plugins.plugin_utils.avdfacts import AvdFacts -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdMissingVariableError -from ansible_collections.arista.avd.plugins.plugin_utils.strip_empties import strip_null_from_data -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get, get_item +from ...._errors import AristaAvdMissingVariableError +from ...._utils import get, get_item, strip_null_from_data +from ....j2filters import natural_sort +from ...avdfacts import AvdFacts class AvdStructuredConfigFlows(AvdFacts): @@ -45,7 +44,10 @@ def sflow(self) -> dict | None: # At this point we have at least one interface with sFlow enabled # and at least one destination. - sflow = {"run": True} + sflow = { + "run": True, + "sample": get(self._hostvars, "sflow_settings.sample.rate"), + } # Using a temporary dict for VRFs sflow_vrfs = {} @@ -124,3 +126,102 @@ def _enable_sflow(self) -> bool: return True return False + + @cached_property + def _default_flow_tracker(self) -> dict: + """ + Following configuration will be rendered based on the inputs: + tracker FLOW-TRACKER + record export on inactive timeout 70000 + record export on interval 300000 + exporter ayush_exporter + collector 127.0.0.1 + local interface Loopback0 + template interval 3600000 + + Depending on the flow tracker type, some other default values like sample, no shutdown + will be added in further method + """ + return { + "name": self.shared_utils.default_flow_tracker_name, + "record_export": {"on_inactive_timeout": 70000, "on_interval": 300000}, + "exporters": [{"name": "CV-TELEMETRY", "collector": {"host": "127.0.0.1"}, "local_interface": "Loopback0", "template_interval": 3600000}], + } + + def resolve_flow_tracker_by_type(self, tracker_settings: dict) -> dict: + tracker = { + "name": tracker_settings["name"], + "record_export": tracker_settings.get("record_export"), + "exporters": tracker_settings.get("exporters"), + } + if self.shared_utils.flow_tracking_type == "sampled": + sampled_settings = get(tracker_settings, "sampled", {}) + if (table_size := sampled_settings.get("table_size")) is not None: + tracker["table_size"] = table_size + if (mpls := get(sampled_settings, "record_export.mpls")) is not None: + tracker["record_export"]["mpls"] = mpls + + return tracker + + @cached_property + def flow_tracking(self) -> dict | None: + """ + Return structured config for flow_tracking + """ + configured_trackers = self._get_enabled_flow_trackers() + if not configured_trackers: + return None + + flow_tracking = {} + + tracker_type = self.shared_utils.flow_tracking_type + flow_tracking_settings = get(self._hostvars, "flow_tracking_settings", default={}) + global_settings = get(flow_tracking_settings, tracker_type, default={}) + flow_tracking[tracker_type] = global_settings.copy() + if tracker_type == "sampled": + flow_tracking[tracker_type]["sample"] = get(flow_tracking[tracker_type], "sample", 10000) + + all_trackers = get(flow_tracking_settings, "trackers", default=[]) + + filtered_trackers = [] + for tracker_name in configured_trackers: + """ + We allow overriding the default flow tracker name, so if user has configured a tracker + with the default tracker name, then we just use that, if not, we create a default config + """ + default_tracker = tracker_name == self.shared_utils.default_flow_tracker_name + tracker = get_item( + all_trackers, + "name", + tracker_name, + required=not default_tracker, + custom_error_msg=f"{tracker_name} is being used for one of the interfaces, but is not configured in flow_tracking_settings", + ) + if default_tracker and tracker is None: + tracker = self._default_flow_tracker + + filtered_trackers.append(self.resolve_flow_tracker_by_type(tracker)) + + flow_tracking[tracker_type]["trackers"] = filtered_trackers + flow_tracking[tracker_type]["shutdown"] = False + + return flow_tracking + + def _get_enabled_flow_trackers(self) -> bool: + """ + Enable flow-tracking if any interface is enabled for flow-tracking. + + This relies on flow-tracking being rendered after all other eos_designs modules (except structured config). + """ + trackers = { + "sampled": {}, + "hardware": {}, + } + + for interface_type in ["ethernet_interfaces", "port_channel_interfaces", "dps_interfaces"]: + for interface in get(self._hostvars, interface_type, default=[]): + if tracker := get(interface, "flow_tracker"): + for trackerType, trackerName in tracker.items(): + trackers[trackerType][trackerName] = True + + return trackers[self.shared_utils.flow_tracking_type] diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/inband_management/avdstructuredconfig.py b/python-avd/pyavd/_eos_designs/structured_config/inband_management/__init__.py similarity index 94% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/inband_management/avdstructuredconfig.py rename to python-avd/pyavd/_eos_designs/structured_config/inband_management/__init__.py index 4c027bfce64..3d1c67abe82 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/inband_management/avdstructuredconfig.py +++ b/python-avd/pyavd/_eos_designs/structured_config/inband_management/__init__.py @@ -6,11 +6,10 @@ from functools import cached_property from ipaddress import ip_network -from ansible_collections.arista.avd.plugins.filter.natural_sort import natural_sort -from ansible_collections.arista.avd.plugins.plugin_utils.avdfacts import AvdFacts -from ansible_collections.arista.avd.plugins.plugin_utils.errors.errors import AristaAvdMissingVariableError -from ansible_collections.arista.avd.plugins.plugin_utils.strip_empties import strip_empties_from_dict -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get +from ...._errors import AristaAvdMissingVariableError +from ...._utils import get, strip_empties_from_dict +from ....j2filters import natural_sort +from ...avdfacts import AvdFacts class AvdStructuredConfigInbandManagement(AvdFacts): @@ -49,7 +48,7 @@ def vlan_interfaces(self) -> list | None: @cached_property def _inband_mgmt_ipv6_parent(self) -> bool: if self._inband_management_parent_vlans: - for vlan, subnet in self._inband_management_parent_vlans.items(): + for subnet in self._inband_management_parent_vlans.values(): if subnet["ipv6"]: return True return False @@ -57,7 +56,7 @@ def _inband_mgmt_ipv6_parent(self) -> bool: @cached_property def _inband_mgmt_ipv4_parent(self) -> bool: if self._inband_management_parent_vlans: - for vlan, subnet in self._inband_management_parent_vlans.items(): + for subnet in self._inband_management_parent_vlans.values(): if subnet["ipv4"]: return True return False @@ -138,6 +137,9 @@ def prefix_lists(self) -> list | None: if not self.shared_utils.underlay_filter_redistribute_connected: return None + if self.shared_utils.overlay_routing_protocol == "none": + return None + if not self._inband_mgmt_ipv4_parent: return None @@ -200,6 +202,9 @@ def route_maps(self) -> list | None: if not self.shared_utils.underlay_filter_redistribute_connected: return None + if self.shared_utils.overlay_routing_protocol == "none": + return None + route_map = {"name": "RM-CONN-2-BGP", "sequence_numbers": []} if self._inband_mgmt_ipv4_parent: diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/metadata/avdstructuredconfig.py b/python-avd/pyavd/_eos_designs/structured_config/metadata/__init__.py similarity index 91% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/metadata/avdstructuredconfig.py rename to python-avd/pyavd/_eos_designs/structured_config/metadata/__init__.py index 41d3394ceb5..61685b0588e 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/metadata/avdstructuredconfig.py +++ b/python-avd/pyavd/_eos_designs/structured_config/metadata/__init__.py @@ -5,16 +5,15 @@ from functools import cached_property -from ansible_collections.arista.avd.plugins.plugin_utils.avdfacts import AvdFacts -from ansible_collections.arista.avd.plugins.plugin_utils.strip_empties import strip_empties_from_dict - +from ...._utils import strip_empties_from_dict +from ...avdfacts import AvdFacts from .cv_pathfinder import CvPathfinderMixin from .cv_tags import CvTagsMixin class AvdStructuredConfigMetadata(AvdFacts, CvTagsMixin, CvPathfinderMixin): """ - This returns the metadata data strucutre as per the below example + This returns the metadata data structure as per the below example { "metadata": { "platform": "7050X3", diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/metadata/cv_pathfinder.py b/python-avd/pyavd/_eos_designs/structured_config/metadata/cv_pathfinder.py similarity index 93% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/metadata/cv_pathfinder.py rename to python-avd/pyavd/_eos_designs/structured_config/metadata/cv_pathfinder.py index 4fddcb7d796..a4f255a5b67 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/metadata/cv_pathfinder.py +++ b/python-avd/pyavd/_eos_designs/structured_config/metadata/cv_pathfinder.py @@ -6,11 +6,11 @@ from functools import cached_property from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get, get_item +from ...._errors import AristaAvdError +from ...._utils import get, get_item if TYPE_CHECKING: - from .avdstructuredconfig import AvdStructuredConfigMetadata + from . import AvdStructuredConfigMetadata class CvPathfinderMixin: @@ -34,6 +34,8 @@ def _cv_pathfinder(self: AvdStructuredConfigMetadata) -> dict | None: "ssl_profile": self.shared_utils.wan_stun_dtls_profile_name, "vtep_ip": self.shared_utils.vtep_ip, "region": get(self.shared_utils.wan_region or {}, "name"), + "site": get(self.shared_utils.wan_site or {}, "name"), + "address": get(self.shared_utils.wan_site or {}, "location"), "interfaces": self._metadata_interfaces(), "pathgroups": self._metadata_pathgroups(), "regions": self._metadata_regions(), @@ -199,3 +201,12 @@ def _get_vni_for_vrf_name(self: AvdStructuredConfigMetadata, vrf_name: str): raise AristaAvdError(f"Unable to find the WAN VNI for VRF {vrf_name} during generation of cv_pathfinder metadata.") return wan_vni + + def _metadata_internet_exit_policies(self: AvdStructuredConfigMetadata): + """ + No-op. + + This metadata is generated in the network services module, + since all the required data was readily available in there. + """ + return NotImplemented diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/metadata/cv_tags.py b/python-avd/pyavd/_eos_designs/structured_config/metadata/cv_tags.py similarity index 95% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/metadata/cv_tags.py rename to python-avd/pyavd/_eos_designs/structured_config/metadata/cv_tags.py index dbeb16611e4..c440521a51d 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/metadata/cv_tags.py +++ b/python-avd/pyavd/_eos_designs/structured_config/metadata/cv_tags.py @@ -6,12 +6,11 @@ from functools import cached_property from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError -from ansible_collections.arista.avd.plugins.plugin_utils.strip_empties import strip_empties_from_dict, strip_empties_from_list -from ansible_collections.arista.avd.plugins.plugin_utils.utils import default, get, get_item +from ...._errors import AristaAvdError +from ...._utils import default, get, get_item, strip_empties_from_dict, strip_empties_from_list if TYPE_CHECKING: - from .avdstructuredconfig import AvdStructuredConfigMetadata + from . import AvdStructuredConfigMetadata INVALID_CUSTOM_DEVICE_TAGS = [ "topology_hint_type", @@ -130,7 +129,7 @@ def _get_device_tags(self: AvdStructuredConfigMetadata) -> list: if generate_tag["name"] in INVALID_CUSTOM_DEVICE_TAGS: raise AristaAvdError( f"The CloudVision tag name 'generate_cv_tags.device_tags[name={generate_tag['name']}] is invalid. " - "System Tags cannot be overriden. Try using a different name for this tag." + "System Tags cannot be overridden. Try using a different name for this tag." ) # Get value from either 'value' key, structured config based on the 'data_path' key or raise. diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/mlag/avdstructuredconfig.py b/python-avd/pyavd/_eos_designs/structured_config/mlag/__init__.py similarity index 94% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/mlag/avdstructuredconfig.py rename to python-avd/pyavd/_eos_designs/structured_config/mlag/__init__.py index 0190818496f..0f67b7bb831 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/mlag/avdstructuredconfig.py +++ b/python-avd/pyavd/_eos_designs/structured_config/mlag/__init__.py @@ -5,12 +5,10 @@ from functools import cached_property -from ansible_collections.arista.avd.plugins.filter.list_compress import list_compress -from ansible_collections.arista.avd.plugins.plugin_utils.avdfacts import AvdFacts -from ansible_collections.arista.avd.plugins.plugin_utils.strip_empties import strip_empties_from_dict -from ansible_collections.arista.avd.plugins.plugin_utils.utils import default, get - -from ..interface_descriptions import InterfaceDescriptionData +from ...._utils import default, get, strip_empties_from_dict +from ....j2filters import list_compress +from ...avdfacts import AvdFacts +from ...interface_descriptions import InterfaceDescriptionData class AvdStructuredConfigMlag(AvdFacts): @@ -76,11 +74,15 @@ def vlan_interfaces(self) -> list | None: "name": main_vlan_interface_name, "description": "MLAG_PEER", "shutdown": False, - "ip_address": f"{self.shared_utils.mlag_ip}/{self.shared_utils.fabric_ip_addressing_mlag_ipv4_prefix_length}", "no_autostate": True, "struct_cfg": self.shared_utils.mlag_peer_vlan_structured_config, "mtu": self.shared_utils.p2p_uplinks_mtu, } + + if self.shared_utils.mlag_peer_address_family == "ipv6": + main_vlan_interface["ipv6_address"] = f"{self.shared_utils.mlag_ip}/{self.shared_utils.fabric_ip_addressing_mlag_ipv6_prefix_length}" + else: + main_vlan_interface["ip_address"] = f"{self.shared_utils.mlag_ip}/{self.shared_utils.fabric_ip_addressing_mlag_ipv4_prefix_length}" if not self.shared_utils.mlag_l3: return [strip_empties_from_dict(main_vlan_interface)] @@ -100,6 +102,7 @@ def vlan_interfaces(self) -> list | None: l3_cfg.update( { "isis_enable": self.shared_utils.isis_instance_name, + "isis_bfd": get(self._hostvars, "underlay_isis_bfd"), "isis_metric": 50, "isis_network_point_to_point": True, } @@ -157,6 +160,7 @@ def port_channel_interfaces(self): "service_profile": self.shared_utils.p2p_uplinks_qos_profile, "trunk_groups": [self._trunk_groups_mlag_name], "struct_cfg": get(self.shared_utils.switch_data_combined, "mlag_port_channel_structured_config"), + "flow_tracker": self.shared_utils.get_flow_tracker(None, "mlag_interfaces"), } if self.shared_utils.mlag_l3 is True and self._trunk_groups_mlag_l3_name != self._trunk_groups_mlag_name: @@ -212,7 +216,7 @@ def ethernet_interfaces(self): "speed": self.shared_utils.mlag_interfaces_speed, } if self.shared_utils.get_mlag_peer_fact("inband_ztp", required=False) is True: - ethernet_interface.update({"mode": "access", "vlans": self.shared_utils.get_mlag_peer_fact("inband_mgmt_vlan")}) + ethernet_interface.update({"mode": "access", "vlans": self.shared_utils.get_mlag_peer_fact("inband_ztp_vlan")}) ethernet_interfaces.append(strip_empties_from_dict(ethernet_interface)) return ethernet_interfaces diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/avdstructuredconfig.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/__init__.py similarity index 84% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/avdstructuredconfig.py rename to python-avd/pyavd/_eos_designs/structured_config/network_services/__init__.py index 86e3a24b666..8ae81886bc5 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/avdstructuredconfig.py +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/__init__.py @@ -1,31 +1,38 @@ # Copyright (c) 2023-2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. -from ansible_collections.arista.avd.plugins.plugin_utils.avdfacts import AvdFacts - +from ...avdfacts import AvdFacts from .application_traffic_recognition import ApplicationTrafficRecognitionMixin from .dps_interfaces import DpsInterfacesMixin from .eos_cli import EosCliMixin from .ethernet_interfaces import EthernetInterfacesMixin +from .ip_access_lists import IpAccesslistsMixin from .ip_igmp_snooping import IpIgmpSnoopingMixin +from .ip_nat import IpNatMixin +from .ip_security import IpSecurityMixin from .ip_virtual_router_mac_address import IpVirtualRouterMacAddressMixin from .ipv6_static_routes import Ipv6StaticRoutesMixin from .loopback_interfaces import LoopbackInterfacesMixin +from .metadata import MetadataMixin +from .monitor_connectivity import MonitorConnectivityMixin from .patch_panel import PatchPanelMixin from .port_channel_interfaces import PortChannelInterfacesMixin from .prefix_lists import PrefixListsMixin from .route_maps import RouteMapsMixin from .router_adaptive_virtual_topology import RouterAdaptiveVirtualTopologyMixin from .router_bgp import RouterBgpMixin +from .router_internet_exit import RouterInternetExitMixin from .router_isis import RouterIsisMixin from .router_multicast import RouterMulticastMixin from .router_ospf import RouterOspfMixin from .router_path_selection import RouterPathSelectionMixin from .router_pim_sparse_mode import RouterPimSparseModeMixin +from .router_service_insertion import RouterServiceInsertionMixin from .spanning_tree import SpanningTreeMixin from .standard_access_lists import StandardAccessListsMixin from .static_routes import StaticRoutesMixin from .struct_cfgs import StructCfgsMixin +from .tunnel_interfaces import TunnelInterfacesMixin from .virtual_source_nat_vrfs import VirtualSourceNatVrfsMixin from .vlan_interfaces import VlanInterfacesMixin from .vlans import VlansMixin @@ -39,7 +46,10 @@ class AvdStructuredConfigNetworkServices( SpanningTreeMixin, PatchPanelMixin, VlansMixin, + IpAccesslistsMixin, IpIgmpSnoopingMixin, + IpNatMixin, + IpSecurityMixin, IpVirtualRouterMacAddressMixin, VlanInterfacesMixin, EthernetInterfacesMixin, @@ -52,6 +62,8 @@ class AvdStructuredConfigNetworkServices( RouterBgpMixin, RouterOspfMixin, RouterPathSelectionMixin, + RouterServiceInsertionMixin, + RouterInternetExitMixin, DpsInterfacesMixin, VrfsMixin, EosCliMixin, @@ -63,6 +75,9 @@ class AvdStructuredConfigNetworkServices( RouterMulticastMixin, RouterPimSparseModeMixin, StandardAccessListsMixin, + TunnelInterfacesMixin, + MonitorConnectivityMixin, + MetadataMixin, ): """ The AvdStructuredConfig Class is imported by "get_structured_config" to render parts of the structured config. @@ -72,7 +87,7 @@ class AvdStructuredConfigNetworkServices( a dict with the name of the method as key. This means that each key in the final dict corresponds to a method. The Class uses AvdFacts, as the base class, to inherit the _hostvars, keys and other attributes. - All other methods are included as "Mixins" to make the files more managable. + All other methods are included as "Mixins" to make the files more manageable. The order of the @cached_properties methods imported from Mixins will also control the order in the output. """ diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/application_traffic_recognition.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/application_traffic_recognition.py similarity index 95% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/application_traffic_recognition.py rename to python-avd/pyavd/_eos_designs/structured_config/network_services/application_traffic_recognition.py index 6a9f5372220..b4b9191a90f 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/application_traffic_recognition.py +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/application_traffic_recognition.py @@ -4,12 +4,14 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.strip_empties import strip_empties_from_dict -from ansible_collections.arista.avd.plugins.plugin_utils.utils import append_if_not_duplicate, get, get_item - +from ...._utils import append_if_not_duplicate, get, get_item, strip_empties_from_dict from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigNetworkServices + class ApplicationTrafficRecognitionMixin(UtilsMixin): """ @@ -18,7 +20,7 @@ class ApplicationTrafficRecognitionMixin(UtilsMixin): """ @cached_property - def application_traffic_recognition(self) -> dict | None: + def application_traffic_recognition(self: AvdStructuredConfigNetworkServices) -> dict | None: """ Return structured config for application_traffic_recognition if wan router """ @@ -33,15 +35,15 @@ def application_traffic_recognition(self) -> dict | None: # self._wan_control_plane_application_profile is defined in utils.py @cached_property - def _wan_control_plane_application(self) -> str: + def _wan_control_plane_application(self: AvdStructuredConfigNetworkServices) -> str: return "APP-CONTROL-PLANE" @cached_property - def _wan_cp_app_dst_prefix(self) -> str: + def _wan_cp_app_dst_prefix(self: AvdStructuredConfigNetworkServices) -> str: return "PFX-PATHFINDERS" @cached_property - def _wan_cp_app_src_prefix(self) -> str: + def _wan_cp_app_src_prefix(self: AvdStructuredConfigNetworkServices) -> str: return "PFX-LOCAL-VTEP-IP" def _generate_control_plane_application_profile(self, app_dict: dict) -> None: @@ -131,7 +133,7 @@ def _generate_control_plane_application_profile(self, app_dict: dict) -> None: {"name": self._wan_cp_app_src_prefix, "prefix_values": [f"{self.shared_utils.vtep_ip}/32"]} ) - def _filtered_application_classification(self) -> dict: + def _filtered_application_classification(self: AvdStructuredConfigNetworkServices) -> dict: """ Based on the filtered policies local to the device, filter which application profiles should be configured on the device. @@ -146,7 +148,7 @@ def _filtered_application_classification(self) -> dict: def _append_object_to_list_of_dicts(path: str, obj_name: str, list_of_dicts: list, message: str | None = None, required=True) -> None: """ Helper function - Technically impossible to get a duplicate, just reusing the methode when the same applicaiton is used in multiple places + Technically impossible to get a duplicate, just reusing the method when the same application is used in multiple places """ if ( obj := get_item( diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/dps_interfaces.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/dps_interfaces.py similarity index 78% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/dps_interfaces.py rename to python-avd/pyavd/_eos_designs/structured_config/network_services/dps_interfaces.py index d917ce59cf7..5c7cf749e69 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/dps_interfaces.py +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/dps_interfaces.py @@ -4,9 +4,13 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigNetworkServices + class DpsInterfacesMixin(UtilsMixin): """ @@ -15,7 +19,7 @@ class DpsInterfacesMixin(UtilsMixin): """ @cached_property - def dps_interfaces(self) -> list | None: + def dps_interfaces(self: AvdStructuredConfigNetworkServices) -> list | None: """ Returns structured config for dps_interfaces @@ -37,7 +41,7 @@ def dps_interfaces(self) -> list | None: # TODO do IPv6 when needed - for now no easy way in AVD to detect if this is needed # When needed - need a default value if different than IPv4 - if self.shared_utils.is_cv_pathfinder_router: - dps1["flow_tracker"] = {"hardware": self.shared_utils.wan_flow_tracker_name} + if (dps_flow := self.shared_utils.get_flow_tracker(None, "dps_interfaces")) is not None: + dps1["flow_tracker"] = dps_flow return [dps1] diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/eos_cli.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/eos_cli.py similarity index 83% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/eos_cli.py rename to python-avd/pyavd/_eos_designs/structured_config/network_services/eos_cli.py index 6306712e50b..df0fe1a2d86 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/eos_cli.py +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/eos_cli.py @@ -4,11 +4,14 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get - +from ...._utils import get from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigNetworkServices + class EosCliMixin(UtilsMixin): """ @@ -17,7 +20,7 @@ class EosCliMixin(UtilsMixin): """ @cached_property - def eos_cli(self) -> dict | None: + def eos_cli(self: AvdStructuredConfigNetworkServices) -> str | None: """ Return existing eos_cli plus any eos_cli from VRFs """ diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/ethernet_interfaces.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/ethernet_interfaces.py similarity index 92% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/ethernet_interfaces.py rename to python-avd/pyavd/_eos_designs/structured_config/network_services/ethernet_interfaces.py index 77f7371a6f2..04a7b95635e 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/ethernet_interfaces.py +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/ethernet_interfaces.py @@ -5,13 +5,16 @@ import re from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.filter.natural_sort import natural_sort -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError -from ansible_collections.arista.avd.plugins.plugin_utils.utils import append_if_not_duplicate, get - +from ...._errors import AristaAvdError +from ...._utils import append_if_not_duplicate, get +from ....j2filters import natural_sort from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigNetworkServices + class EthernetInterfacesMixin(UtilsMixin): """ @@ -20,14 +23,14 @@ class EthernetInterfacesMixin(UtilsMixin): """ @cached_property - def ethernet_interfaces(self) -> list | None: + def ethernet_interfaces(self: AvdStructuredConfigNetworkServices) -> list | None: """ Return structured config for ethernet_interfaces Only used with L3 or L1 network services """ - if not (self.shared_utils.network_services_l3 or self.shared_utils.network_services_l1): + if not (self.shared_utils.network_services_l3 or self.shared_utils.network_services_l1 or self.shared_utils.l3_interfaces): return None # Using temp variables to keep the order of interfaces from Jinja @@ -70,6 +73,7 @@ def ethernet_interfaces(self) -> list | None: "description": interface_description, "eos_cli": l3_interface.get("raw_eos_cli"), "struct_cfg": l3_interface.get("structured_config"), + "flow_tracker": self.shared_utils.get_flow_tracker(l3_interface, "l3_interfaces"), } if "." in interface_name: @@ -250,6 +254,19 @@ def ethernet_interfaces(self) -> list | None: "shutdown": False, } ) + + for internet_exit_policy in self._filtered_internet_exit_policies: + for connection in internet_exit_policy.get("connections", []): + if connection["type"] == "ethernet": + ethernet_interfaces.append( + { + "name": connection["source_interface"], + "ip_nat": { + "service_profile": self.get_internet_exit_nat_profile_name(internet_exit_policy["type"]), + }, + } + ) + if ethernet_interfaces: return ethernet_interfaces diff --git a/python-avd/pyavd/_eos_designs/structured_config/network_services/ip_access_lists.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/ip_access_lists.py new file mode 100644 index 00000000000..cd98b209ed8 --- /dev/null +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/ip_access_lists.py @@ -0,0 +1,119 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import annotations + +from functools import cached_property +from typing import TYPE_CHECKING, Literal + +from ...._errors import AristaAvdError +from ...._utils import append_if_not_duplicate, get +from ....j2filters import natural_sort +from .utils import UtilsMixin + +if TYPE_CHECKING: + from . import AvdStructuredConfigNetworkServices + + +class IpAccesslistsMixin(UtilsMixin): + """ + Mixin Class used to generate structured config for one key. + Class should only be used as Mixin to a AvdStructuredConfig class + """ + + @cached_property + def _acl_internet_exit_zscaler(self: AvdStructuredConfigNetworkServices) -> dict: + return { + "name": self.get_internet_exit_nat_acl_name("zscaler"), + "entries": [ + { + "sequence": 10, + "action": "permit", + "protocol": "ip", + "source": "any", + "destination": "any", + } + ], + } + + @cached_property + def _acl_internet_exit_direct(self: AvdStructuredConfigNetworkServices) -> dict | None: + interface_ips = set() + for ie_policy in self._filtered_internet_exit_policies: + if ie_policy["type"] == "direct": + for connection in ie_policy["connections"]: + interface_ips.add(connection["source_interface_ip_address"]) + + if interface_ips: + interface_ips = sorted(interface_ips) + entries = [] + i = 0 + for i, interface_ip in enumerate(interface_ips): + entries.append( + { + "sequence": 10 + i * 10, + "action": "deny", + "protocol": "ip", + "source": interface_ip.split("/", maxsplit=1)[0], + "destination": "any", + } + ) + entries.append( + { + "sequence": 20 + i * 10, + "action": "permit", + "protocol": "ip", + "source": "any", + "destination": "any", + } + ) + + return { + "name": self.get_internet_exit_nat_acl_name("direct"), + "entries": entries, + } + + def _acl_internet_exit_user_defined(self: AvdStructuredConfigNetworkServices, internet_exit_policy_type: Literal["zscaler", "direct"]) -> dict | None: + acl_name = self.get_internet_exit_nat_acl_name(internet_exit_policy_type) + acl = get(self.shared_utils.ipv4_acls, acl_name) + if not acl: + return None + + # pass substitution fields as anything to check if acl requires substitution or not + acl = self.shared_utils.get_ipv4_acl(acl_name, "random", interface_ip="random", peer_ip="random") + if acl["name"] == acl_name: + # ACL doesn't need replacement + return [acl] + + # TODO: We still have one nat for all interfaces, need to also add logic to make nat per interface + # if acl needs substitution + raise AristaAvdError(f"ipv4_acls[name={acl_name}] field substitution is not supported for internet exit access lists") + + def _acl_internet_exit(self: AvdStructuredConfigNetworkServices, internet_exit_policy_type: Literal["zscaler", "direct"]) -> dict | None: + acls = self._acl_internet_exit_user_defined(internet_exit_policy_type) + if acls: + return acls + + if internet_exit_policy_type == "zscaler": + return [self._acl_internet_exit_zscaler] + if internet_exit_policy_type == "direct" and (acl := self._acl_internet_exit_direct): + return [acl] + return None + + @cached_property + def ip_access_lists(self: AvdStructuredConfigNetworkServices) -> list | None: + """ + Return structured config for ip_access_lists. + """ + ip_access_lists = [] + if self._svi_acls: + for interface_acls in self._svi_acls.values(): + for acl in interface_acls.values(): + append_if_not_duplicate(ip_access_lists, "name", acl, context="IPv4 Access lists for SVI", context_keys=["name"]) + + for ie_policy_type in self._filtered_internet_exit_policy_types: + acls = self._acl_internet_exit(ie_policy_type) + if acls: + ip_access_lists.extend(acls) + + return natural_sort(ip_access_lists, "name") or None diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/ip_igmp_snooping.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/ip_igmp_snooping.py similarity index 92% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/ip_igmp_snooping.py rename to python-avd/pyavd/_eos_designs/structured_config/network_services/ip_igmp_snooping.py index c0ad79a6dfa..2508a039b09 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/ip_igmp_snooping.py +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/ip_igmp_snooping.py @@ -4,11 +4,14 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.utils import append_if_not_duplicate, default, get - +from ...._utils import append_if_not_duplicate, default, get from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigNetworkServices + class IpIgmpSnoopingMixin(UtilsMixin): """ @@ -17,7 +20,7 @@ class IpIgmpSnoopingMixin(UtilsMixin): """ @cached_property - def ip_igmp_snooping(self) -> dict | None: + def ip_igmp_snooping(self: AvdStructuredConfigNetworkServices) -> dict | None: """ Return structured config for ip_igmp_snooping """ @@ -28,7 +31,7 @@ def ip_igmp_snooping(self) -> dict | None: ip_igmp_snooping = {} igmp_snooping_enabled = self.shared_utils.igmp_snooping_enabled ip_igmp_snooping["globally_enabled"] = igmp_snooping_enabled - if not (igmp_snooping_enabled is True): + if igmp_snooping_enabled is not True: return ip_igmp_snooping vlans = [] @@ -59,7 +62,7 @@ def ip_igmp_snooping(self) -> dict | None: return ip_igmp_snooping - def _ip_igmp_snooping_vlan(self, vlan, tenant) -> dict: + def _ip_igmp_snooping_vlan(self: AvdStructuredConfigNetworkServices, vlan, tenant) -> dict: """ ip_igmp_snooping logic for one vlan diff --git a/python-avd/pyavd/_eos_designs/structured_config/network_services/ip_nat.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/ip_nat.py new file mode 100644 index 00000000000..f648390d681 --- /dev/null +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/ip_nat.py @@ -0,0 +1,42 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import annotations + +from collections import defaultdict +from functools import cached_property +from typing import TYPE_CHECKING + +from .utils import UtilsMixin + +if TYPE_CHECKING: + from . import AvdStructuredConfigNetworkServices + + +class IpNatMixin(UtilsMixin): + """ + Mixin Class used to generate structured config for one key. + Class should only be used as Mixin to a AvdStructuredConfig class + """ + + @cached_property + def ip_nat(self: AvdStructuredConfigNetworkServices) -> dict | None: + """ + Returns structured config for ip_nat + """ + if not self.shared_utils.is_cv_pathfinder_client: + return None + + ip_nat = defaultdict(list) + + for policy_type in self._filtered_internet_exit_policy_types: + pool, profile = self.get_internet_exit_nat_pool_and_profile(policy_type) + if pool: + ip_nat["pools"].append(pool) + if profile: + ip_nat["profiles"].append(profile) + + if ip_nat: + return ip_nat + + return None diff --git a/python-avd/pyavd/_eos_designs/structured_config/network_services/ip_security.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/ip_security.py new file mode 100644 index 00000000000..613282a2d30 --- /dev/null +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/ip_security.py @@ -0,0 +1,79 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import annotations + +from functools import cached_property +from typing import TYPE_CHECKING + +from ...._utils import get, strip_null_from_data +from .utils import UtilsMixin + +if TYPE_CHECKING: + from . import AvdStructuredConfigNetworkServices + + +class IpSecurityMixin(UtilsMixin): + """ + Mixin Class used to generate structured config for one key. + Class should only be used as Mixin to a AvdStructuredConfig class + """ + + @cached_property + def ip_security(self: AvdStructuredConfigNetworkServices) -> dict | None: + """ + ip_security set based on cv_pathfinder_internet_exit_policies + """ + + if not self._filtered_internet_exit_policies: + return None + + ip_security = {"ike_policies": [], "sa_policies": [], "profiles": []} + for internet_exit_policy in self._filtered_internet_exit_policies: + # Currently we only need ipsec for zscaler. + if internet_exit_policy["type"] != "zscaler": + continue + + policy_name = internet_exit_policy["name"] + encrypt_traffic = get(internet_exit_policy, "zscaler.encrypt_traffic", default=True) + ike_policy_name = f"IE-{policy_name}-IKE-POLICY" + sa_policy_name = f"IE-{policy_name}-SA-POLICY" + profile_name = f"IE-{policy_name}-PROFILE" + ufqdn, ipsec_key = self._get_ipsec_credentials(internet_exit_policy) + + ip_security["ike_policies"].append( + { + "name": ike_policy_name, + "local_id_fqdn": ufqdn, + "ike_lifetime": 24, + "encryption": "aes256", + "dh_group": 24, + } + ) + ip_security["sa_policies"].append( + { + "name": sa_policy_name, + "pfs_dh_group": 24, + "sa_lifetime": {"value": 8}, + "esp": { + "integrity": "sha256", + "encryption": "aes256" if encrypt_traffic else "disabled", + }, + } + ) + ip_security["profiles"].append( + { + "name": profile_name, + "ike_policy": ike_policy_name, + "sa_policy": sa_policy_name, + "shared_key": ipsec_key, + "dpd": { + "interval": 10, + "time": 60, + "action": "clear", + }, + "connection": "start", + } + ) + + return strip_null_from_data(ip_security) or None diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/ip_virtual_router_mac_address.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/ip_virtual_router_mac_address.py similarity index 80% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/ip_virtual_router_mac_address.py rename to python-avd/pyavd/_eos_designs/structured_config/network_services/ip_virtual_router_mac_address.py index ad706beeab9..315efa3d595 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/ip_virtual_router_mac_address.py +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/ip_virtual_router_mac_address.py @@ -4,9 +4,13 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigNetworkServices + class IpVirtualRouterMacAddressMixin(UtilsMixin): """ @@ -15,7 +19,7 @@ class IpVirtualRouterMacAddressMixin(UtilsMixin): """ @cached_property - def ip_virtual_router_mac_address(self) -> str | None: + def ip_virtual_router_mac_address(self: AvdStructuredConfigNetworkServices) -> str | None: """ Return structured config for ip_virtual_router_mac_address """ diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/ipv6_static_routes.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/ipv6_static_routes.py similarity index 87% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/ipv6_static_routes.py rename to python-avd/pyavd/_eos_designs/structured_config/network_services/ipv6_static_routes.py index cb43e32b285..1fe4e3ced9a 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/ipv6_static_routes.py +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/ipv6_static_routes.py @@ -4,9 +4,13 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigNetworkServices + class Ipv6StaticRoutesMixin(UtilsMixin): """ @@ -15,7 +19,7 @@ class Ipv6StaticRoutesMixin(UtilsMixin): """ @cached_property - def ipv6_static_routes(self) -> list[dict] | None: + def ipv6_static_routes(self: AvdStructuredConfigNetworkServices) -> list[dict] | None: """ Returns structured config for ipv6_static_routes diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/loopback_interfaces.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/loopback_interfaces.py similarity index 90% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/loopback_interfaces.py rename to python-avd/pyavd/_eos_designs/structured_config/network_services/loopback_interfaces.py index 98f5b4c5350..bb9b02d8272 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/loopback_interfaces.py +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/loopback_interfaces.py @@ -4,11 +4,14 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.utils import append_if_not_duplicate, get, get_item - +from ...._utils import append_if_not_duplicate, get, get_item from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigNetworkServices + class LoopbackInterfacesMixin(UtilsMixin): """ @@ -17,7 +20,7 @@ class LoopbackInterfacesMixin(UtilsMixin): """ @cached_property - def loopback_interfaces(self) -> list | None: + def loopback_interfaces(self: AvdStructuredConfigNetworkServices) -> list | None: """ Return structured config for loopback_interfaces @@ -25,7 +28,7 @@ def loopback_interfaces(self) -> list | None: This function is also called from virtual_source_nat_vrfs to avoid duplicate logic """ - if not (self.shared_utils.network_services_l3): + if not self.shared_utils.network_services_l3: return None loopback_interfaces = [] @@ -73,7 +76,7 @@ def loopback_interfaces(self) -> list | None: return None - def _get_vtep_diagnostic_loopback_for_vrf(self, vrf: dict) -> dict | None: + def _get_vtep_diagnostic_loopback_for_vrf(self: AvdStructuredConfigNetworkServices, vrf: dict) -> dict | None: if (loopback := get(vrf, "vtep_diagnostic.loopback")) is None: return None diff --git a/python-avd/pyavd/_eos_designs/structured_config/network_services/metadata.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/metadata.py new file mode 100644 index 00000000000..57fb2f1a1e0 --- /dev/null +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/metadata.py @@ -0,0 +1,65 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import annotations + +from functools import cached_property +from typing import TYPE_CHECKING + +from ...._utils import get, strip_empties_from_list +from .utils import UtilsMixin + +if TYPE_CHECKING: + from . import AvdStructuredConfigNetworkServices + + +class MetadataMixin(UtilsMixin): + """ + Mixin Class used to generate structured config for one key. + Class should only be used as Mixin to a AvdStructuredConfig class + """ + + @cached_property + def metadata(self: AvdStructuredConfigNetworkServices) -> dict | None: + """ + Generate metadata.cv_pathfinder.internet_exit_policies if available. + """ + if not self._filtered_internet_exit_policies: + return None + + internet_exit_polices = [] + for internet_exit_policy in self._filtered_internet_exit_policies: + # Currently only supporting zscaler + if internet_exit_policy["type"] != "zscaler": + continue + + ufqdn, ipsec_key = self._get_ipsec_credentials(internet_exit_policy) + internet_exit_polices.append( + { + "name": internet_exit_policy["name"], + "type": internet_exit_policy["type"], + "city": get(self._zscaler_endpoints, "device_location.city", required=True, org_key="zscaler_endpoints.device_location.city"), + "country": get(self._zscaler_endpoints, "device_location.country", required=True, org_key="zscaler_endpoints.device_location.country"), + "upload_bandwidth": get(internet_exit_policy, "zscaler.upload_bandwidth"), + "download_bandwidth": get(internet_exit_policy, "zscaler.download_bandwidth"), + "firewall": get(internet_exit_policy, "zscaler.firewall.enabled", default=False), + "ips_control": get(internet_exit_policy, "zscaler.firewall.ips", default=False), + "acceptable_use_policy": get(internet_exit_policy, "zscaler.acceptable_use_policy", default=False), + "vpn_credentials": [ + { + "fqdn": ufqdn, + "vpn_type": "UFQDN", + "pre_shared_key": ipsec_key, + } + ], + "tunnels": [ + { + "name": f"Tunnel{connection['tunnel_id']}", + "preference": "Preferred" if connection["preference"] == "primary" else "Alternate", + } + for connection in internet_exit_policy["connections"] + ], + } + ) + + return {"cv_pathfinder": {"internet_exit_policies": strip_empties_from_list(internet_exit_polices, (None, [], {}))}} diff --git a/python-avd/pyavd/_eos_designs/structured_config/network_services/monitor_connectivity.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/monitor_connectivity.py new file mode 100644 index 00000000000..dce1dce62c4 --- /dev/null +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/monitor_connectivity.py @@ -0,0 +1,76 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import annotations + +from functools import cached_property +from typing import TYPE_CHECKING + +from ...._utils import append_if_not_duplicate, strip_empties_from_dict +from .utils import UtilsMixin + +if TYPE_CHECKING: + from . import AvdStructuredConfigNetworkServices + + +class MonitorConnectivityMixin(UtilsMixin): + """ + Mixin Class used to generate structured config for one key. + Class should only be used as Mixin to a AvdStructuredConfig class + """ + + @cached_property + def monitor_connectivity(self: AvdStructuredConfigNetworkServices) -> dict | None: + """ + Return structured config for monitor_connectivity + + Only used for CV Pathfinder edge routers today + """ + if not self._filtered_internet_exit_policies: + return None + + monitor_connectivity = {} + interface_sets = [] + hosts = [] + + for policy in self._filtered_internet_exit_policies: + for connection in policy["connections"]: + if connection["type"] == "tunnel": + interface_name = f"Tunnel{connection['tunnel_id']}" + else: + interface_name = connection["source_interface"] + + interface_set_name = f"SET-{self.shared_utils.sanitize_interface_name(interface_name)}" + interface_sets.append( + { + "name": interface_set_name, + "interfaces": interface_name, + } + ) + + host = { + "name": connection["monitor_name"], + "description": connection["description"], + "ip": connection["monitor_host"], + "local_interfaces": interface_set_name, + "address_only": False, + "url": connection.get("monitor_url"), + } + append_if_not_duplicate( + list_of_dicts=hosts, + primary_key="name", + new_dict=host, + context="Monitor connectivity host for Internet Exit policy", + context_keys=["name"], + ) + + monitor_connectivity["interface_sets"] = interface_sets + monitor_connectivity["hosts"] = hosts + + monitor_connectivity = strip_empties_from_dict(monitor_connectivity) + + if monitor_connectivity: + monitor_connectivity["shutdown"] = False + return monitor_connectivity + + return None diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/patch_panel.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/patch_panel.py similarity index 94% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/patch_panel.py rename to python-avd/pyavd/_eos_designs/structured_config/network_services/patch_panel.py index 9ec27ea8df1..2ca30e71727 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/patch_panel.py +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/patch_panel.py @@ -5,12 +5,15 @@ import re from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.filter.natural_sort import natural_sort -from ansible_collections.arista.avd.plugins.plugin_utils.utils import append_if_not_duplicate, get - +from ...._utils import append_if_not_duplicate, get +from ....j2filters import natural_sort from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigNetworkServices + class PatchPanelMixin(UtilsMixin): """ @@ -19,7 +22,7 @@ class PatchPanelMixin(UtilsMixin): """ @cached_property - def patch_panel(self) -> dict | None: + def patch_panel(self: AvdStructuredConfigNetworkServices) -> dict | None: """ Return structured config for patch_panel """ diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/port_channel_interfaces.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/port_channel_interfaces.py similarity index 84% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/port_channel_interfaces.py rename to python-avd/pyavd/_eos_designs/structured_config/network_services/port_channel_interfaces.py index f41fce06f20..1a9d3878421 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/port_channel_interfaces.py +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/port_channel_interfaces.py @@ -5,15 +5,15 @@ import re from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.filter.generate_esi import generate_esi -from ansible_collections.arista.avd.plugins.filter.generate_lacp_id import generate_lacp_id -from ansible_collections.arista.avd.plugins.filter.generate_route_target import generate_route_target -from ansible_collections.arista.avd.plugins.filter.natural_sort import natural_sort -from ansible_collections.arista.avd.plugins.plugin_utils.utils import append_if_not_duplicate, get - +from ...._utils import append_if_not_duplicate, get, short_esi_to_route_target +from ....j2filters import natural_sort from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigNetworkServices + class PortChannelInterfacesMixin(UtilsMixin): """ @@ -22,7 +22,7 @@ class PortChannelInterfacesMixin(UtilsMixin): """ @cached_property - def port_channel_interfaces(self) -> list | None: + def port_channel_interfaces(self: AvdStructuredConfigNetworkServices) -> list | None: """ Return structured config for port_channel_interfaces @@ -67,13 +67,13 @@ def port_channel_interfaces(self) -> list | None: parent_interface.update( { "evpn_ethernet_segment": { - "identifier": generate_esi(short_esi, self.shared_utils.evpn_short_esi_prefix), - "route_target": generate_route_target(short_esi), + "identifier": f"{self.shared_utils.evpn_short_esi_prefix}{short_esi}", + "route_target": short_esi_to_route_target(short_esi), } } ) if port_channel_mode == "active": - parent_interface["lacp_id"] = generate_lacp_id(short_esi) + parent_interface["lacp_id"] = short_esi.replace(":", ".") subif_parent_interfaces.append(parent_interface) @@ -123,13 +123,13 @@ def port_channel_interfaces(self) -> list | None: interface.update( { "evpn_ethernet_segment": { - "identifier": generate_esi(short_esi, self.shared_utils.evpn_short_esi_prefix), - "route_target": generate_route_target(short_esi), + "identifier": f"{self.shared_utils.evpn_short_esi_prefix}{short_esi}", + "route_target": short_esi_to_route_target(short_esi), } } ) if port_channel_mode == "active": - interface["lacp_id"] = generate_lacp_id(short_esi) + interface["lacp_id"] = short_esi.replace(":", ".") append_if_not_duplicate( list_of_dicts=port_channel_interfaces, diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/prefix_lists.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/prefix_lists.py similarity index 89% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/prefix_lists.py rename to python-avd/pyavd/_eos_designs/structured_config/network_services/prefix_lists.py index c8bf9c4097b..df1463a221a 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/prefix_lists.py +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/prefix_lists.py @@ -5,11 +5,14 @@ from functools import cached_property from ipaddress import IPv4Network +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.filter.natural_sort import natural_sort - +from ....j2filters import natural_sort from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigNetworkServices + class PrefixListsMixin(UtilsMixin): """ @@ -18,7 +21,7 @@ class PrefixListsMixin(UtilsMixin): """ @cached_property - def prefix_lists(self) -> list | None: + def prefix_lists(self: AvdStructuredConfigNetworkServices) -> list | None: """ Return structured config for prefix_lists @@ -42,7 +45,7 @@ def prefix_lists(self) -> list | None: return None - def _prefix_lists_vrf_default(self) -> list: + def _prefix_lists_vrf_default(self: AvdStructuredConfigNetworkServices) -> list: """ prefix_lists for EVPN services in VRF "default" """ @@ -71,7 +74,7 @@ def _prefix_lists_vrf_default(self) -> list: return prefix_lists @cached_property - def _mlag_ibgp_peering_subnets_without_redistribution(self) -> list: + def _mlag_ibgp_peering_subnets_without_redistribution(self: AvdStructuredConfigNetworkServices) -> list: """ Return sorted list of MLAG peerings for VRFs where MLAG iBGP peering should not be redistributed """ diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/route_maps.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/route_maps.py similarity index 90% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/route_maps.py rename to python-avd/pyavd/_eos_designs/structured_config/network_services/route_maps.py index b0c7fdfdfe3..e50894caf2d 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/route_maps.py +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/route_maps.py @@ -4,12 +4,14 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.strip_empties import strip_empties_from_list -from ansible_collections.arista.avd.plugins.plugin_utils.utils import append_if_not_duplicate - +from ...._utils import append_if_not_duplicate, strip_empties_from_list from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigNetworkServices + class RouteMapsMixin(UtilsMixin): """ @@ -18,7 +20,7 @@ class RouteMapsMixin(UtilsMixin): """ @cached_property - def route_maps(self) -> list | None: + def route_maps(self: AvdStructuredConfigNetworkServices) -> list | None: """ Return structured config for route_maps @@ -81,7 +83,7 @@ def route_maps(self) -> list | None: return None @cached_property - def _route_maps_vrf_default(self) -> list | None: + def _route_maps_vrf_default(self: AvdStructuredConfigNetworkServices) -> list | None: """ Route-maps for EVPN services in VRF "default" @@ -106,7 +108,7 @@ def _route_maps_vrf_default(self) -> list | None: return route_maps or None - def _bgp_mlag_peer_group_route_map(self) -> dict: + def _bgp_mlag_peer_group_route_map(self: AvdStructuredConfigNetworkServices) -> dict: """ Return dict with one route-map Origin Incomplete for MLAG iBGP learned routes @@ -125,7 +127,7 @@ def _bgp_mlag_peer_group_route_map(self) -> dict: ], } - def _connected_to_bgp_vrfs_route_map(self) -> dict: + def _connected_to_bgp_vrfs_route_map(self: AvdStructuredConfigNetworkServices) -> dict: """ Return dict with one route-map Filter MLAG peer subnets for redistribute connected for overlay VRFs @@ -145,7 +147,7 @@ def _connected_to_bgp_vrfs_route_map(self) -> dict: ], } - def _evpn_export_vrf_default_route_map(self) -> dict | None: + def _evpn_export_vrf_default_route_map(self: AvdStructuredConfigNetworkServices) -> dict | None: """ Match the following prefixes to be exported in EVPN for VRF default: * SVI subnets in VRF default @@ -187,7 +189,7 @@ def _evpn_export_vrf_default_route_map(self) -> dict | None: return {"name": "RM-EVPN-EXPORT-VRF-DEFAULT", "sequence_numbers": sequence_numbers} - def _bgp_underlay_peers_route_map(self) -> dict | None: + def _bgp_underlay_peers_route_map(self: AvdStructuredConfigNetworkServices) -> dict | None: """ For non WAN routers filter EVPN routes away from underlay. @@ -229,7 +231,7 @@ def _bgp_underlay_peers_route_map(self) -> dict | None: return {"name": "RM-BGP-UNDERLAY-PEERS-OUT", "sequence_numbers": sequence_numbers} - def _redistribute_connected_to_bgp_route_map(self) -> dict | None: + def _redistribute_connected_to_bgp_route_map(self: AvdStructuredConfigNetworkServices) -> dict | None: """ Append network services relevant entries to the route-map used to redistribute connected subnets in BGP @@ -257,7 +259,7 @@ def _redistribute_connected_to_bgp_route_map(self) -> dict | None: return {"name": "RM-CONN-2-BGP", "sequence_numbers": sequence_numbers} - def _redistribute_static_to_bgp_route_map(self) -> dict | None: + def _redistribute_static_to_bgp_route_map(self: AvdStructuredConfigNetworkServices) -> dict | None: """ Append network services relevant entries to the route-map used to redistribute static routes to BGP """ diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/router_adaptive_virtual_topology.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/router_adaptive_virtual_topology.py similarity index 70% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/router_adaptive_virtual_topology.py rename to python-avd/pyavd/_eos_designs/structured_config/network_services/router_adaptive_virtual_topology.py index 872af50ba4b..a2ec4868658 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/router_adaptive_virtual_topology.py +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/router_adaptive_virtual_topology.py @@ -4,12 +4,14 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.strip_empties import strip_empties_from_dict -from ansible_collections.arista.avd.plugins.plugin_utils.utils import append_if_not_duplicate, get, get_item - +from ...._utils import append_if_not_duplicate, get, get_item, strip_empties_from_dict from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigNetworkServices + class RouterAdaptiveVirtualTopologyMixin(UtilsMixin): """ @@ -18,7 +20,7 @@ class RouterAdaptiveVirtualTopologyMixin(UtilsMixin): """ @cached_property - def router_adaptive_virtual_topology(self) -> dict | None: + def router_adaptive_virtual_topology(self: AvdStructuredConfigNetworkServices) -> dict | None: """ Return structured config for profiles, policies and VRFs for router adaptive-virtual-topology (AVT) """ @@ -33,7 +35,7 @@ def router_adaptive_virtual_topology(self) -> dict | None: return strip_empties_from_dict(router_adaptive_virtual_topology) - def _cv_pathfinder_wan_vrfs(self) -> list: + def _cv_pathfinder_wan_vrfs(self: AvdStructuredConfigNetworkServices) -> list: """ Return a list of WAN VRFs based on filtered tenants and the AVT. """ @@ -71,7 +73,7 @@ def _cv_pathfinder_wan_vrfs(self) -> list: return wan_vrfs - def _cv_pathfinder_policies(self) -> list: + def _cv_pathfinder_policies(self: AvdStructuredConfigNetworkServices) -> list: """ Build and return the CV Pathfinder policies based on the computed _filtered_wan_policies. @@ -84,43 +86,61 @@ def _cv_pathfinder_policies(self) -> list: for policy in self._filtered_wan_policies: pathfinder_policy = {"name": policy["name"], "matches": []} for match in get(policy, "matches", default=[]): - # popping id and load_balance_policy + # popping id, load_balance_and internet-exit policy pathfinder_match = match.copy() pathfinder_match.pop("id") pathfinder_match.pop("load_balance_policy") + pathfinder_match.pop("internet_exit_policy_name") pathfinder_policy["matches"].append(pathfinder_match) if (default_match := policy.get("default_match")) is not None: pathfinder_match = default_match.copy() pathfinder_match.pop("id") pathfinder_match.pop("load_balance_policy") + pathfinder_match.pop("internet_exit_policy_name") pathfinder_policy["matches"].append(pathfinder_match) policies.append(strip_empties_from_dict(pathfinder_policy)) return policies - def _cv_pathfinder_profiles(self) -> list: + def _cv_pathfinder_profiles(self: AvdStructuredConfigNetworkServices) -> list: """ Return a list of router adaptive-virtual-topology profiles for this router. - - TODO: add internet exit once supported """ profiles = [] for policy in self._filtered_wan_policies: for match in policy.get("matches", []): + profile = { + "name": match["avt_profile"], + "load_balance_policy": match["load_balance_policy"]["name"], + } + if (internet_exit_policy_name := match["internet_exit_policy_name"]) is not None and get_item( + self._filtered_internet_exit_policies, "name", internet_exit_policy_name + ) is not None: + profile["internet_exit_policy"] = internet_exit_policy_name + append_if_not_duplicate( list_of_dicts=profiles, primary_key="name", - new_dict={"name": match["avt_profile"], "load_balance_policy": match["load_balance_policy"]["name"]}, + new_dict=profile, context="Router Adaptive Virtual Topology profiles.", context_keys=["name"], ) if (default_match := policy.get("default_match")) is not None: + profile = { + "name": default_match["avt_profile"], + "load_balance_policy": default_match["load_balance_policy"]["name"], + } + if (internet_exit_policy_name := default_match["internet_exit_policy_name"]) is not None and get_item( + self._filtered_internet_exit_policies, "name", internet_exit_policy_name + ) is not None: + profile["internet_exit_policy"] = internet_exit_policy_name + append_if_not_duplicate( list_of_dicts=profiles, primary_key="name", - new_dict={"name": default_match["avt_profile"], "load_balance_policy": default_match["load_balance_policy"]["name"]}, + new_dict=profile, context="Router Adaptive Virtual Topology profiles.", context_keys=["name"], ) diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/router_bgp.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/router_bgp.py similarity index 78% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/router_bgp.py rename to python-avd/pyavd/_eos_designs/structured_config/network_services/router_bgp.py index ef4ef4942a6..ef826600f83 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/router_bgp.py +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/router_bgp.py @@ -7,16 +7,16 @@ from functools import cached_property from itertools import groupby as itertools_groupby from re import fullmatch as re_fullmatch +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.filter.list_compress import list_compress -from ansible_collections.arista.avd.plugins.filter.natural_sort import natural_sort -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdMissingVariableError -from ansible_collections.arista.avd.plugins.plugin_utils.merge import merge -from ansible_collections.arista.avd.plugins.plugin_utils.strip_empties import strip_empties_from_dict -from ansible_collections.arista.avd.plugins.plugin_utils.utils import append_if_not_duplicate, default, get, get_item - +from ...._errors import AristaAvdMissingVariableError +from ...._utils import append_if_not_duplicate, default, get, get_item, merge, strip_empties_from_dict +from ....j2filters import list_compress, natural_sort from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigNetworkServices + class RouterBgpMixin(UtilsMixin): """ @@ -25,7 +25,7 @@ class RouterBgpMixin(UtilsMixin): """ @cached_property - def router_bgp(self) -> dict | None: + def router_bgp(self: AvdStructuredConfigNetworkServices) -> dict | None: """ Return the structured config for router_bgp @@ -37,11 +37,13 @@ def router_bgp(self) -> dict | None: if not self.shared_utils.bgp: return None + tenant_svis_l2vlans_dict = self._router_bgp_sorted_vlans_and_svis_lists() + router_bgp = { - "peer_groups": self._router_bgp_peer_groups, + **self._router_bgp_peer_groups(), "vrfs": self._router_bgp_vrfs, - "vlans": self._router_bgp_vlans, - "vlan_aware_bundles": self._router_bgp_vlan_aware_bundles, + "vlans": self._router_bgp_vlans(tenant_svis_l2vlans_dict), + "vlan_aware_bundles": self._router_bgp_vlan_aware_bundles(tenant_svis_l2vlans_dict), "redistribute_routes": self._router_bgp_redistribute_routes, "vpws": self._router_bgp_vpws, } @@ -53,18 +55,17 @@ def router_bgp(self) -> dict | None: router_bgp = {key: value for key, value in router_bgp.items() if value is not None} return router_bgp - @cached_property - def _router_bgp_peer_groups(self) -> list | None: + def _router_bgp_peer_groups(self: AvdStructuredConfigNetworkServices) -> dict: """ Return the structured config for router_bgp.peer_groups Covers two areas: - - bgp_peer_groups defined under the vrf + - bgp_peer_groups defined under the vrf including ipv4/ipv6 address_families. - adding route-map to the underlay peer-group in case of services in vrf default """ if not self.shared_utils.network_services_l3: - return None + return {} peer_groups = [] peer_peergroups = set() @@ -74,7 +75,7 @@ def _router_bgp_peer_groups(self) -> list | None: if not (vrf["bgp_peers"] or vrf.get("bgp_peer_groups")): continue - vrf_peer_peergroups = set([peer["peer_group"] for peer in vrf["bgp_peers"] if "peer_group" in peer]) + vrf_peer_peergroups = set(peer["peer_group"] for peer in vrf["bgp_peers"] if "peer_group" in peer) peer_groups.extend( [ peer_group @@ -92,12 +93,24 @@ def _router_bgp_peer_groups(self) -> list | None: ] ) - bgp_peer_groups = [] + router_bgp = {"peer_groups": []} if peer_groups: for peer_group in peer_groups: + peer_group.pop("nodes", None) + for af in ["address_family_ipv4", "address_family_ipv6"]: + if not (af_peer_group := peer_group.pop(af, None)): + continue + af_peer_groups = router_bgp.setdefault(af, {"peer_groups": []})["peer_groups"] + append_if_not_duplicate( + primary_key="name", + list_of_dicts=af_peer_groups, + new_dict={"name": peer_group["name"], **af_peer_group}, + context=f"BGP Peer Groups for '{af}' defined under network services", + context_keys=["name"], + ) append_if_not_duplicate( - list_of_dicts=bgp_peer_groups, + list_of_dicts=router_bgp["peer_groups"], primary_key="name", new_dict=peer_group, context="BGP Peer Groups defined under network services", @@ -106,7 +119,7 @@ def _router_bgp_peer_groups(self) -> list | None: # router bgp default vrf configuration for evpn if self._vrf_default_evpn and (self._vrf_default_ipv4_subnets or self._vrf_default_ipv4_static_routes["static_routes"]): - bgp_peer_groups.append( + router_bgp["peer_groups"].append( { "name": self.shared_utils.bgp_peer_groups["ipv4_underlay_peers"]["name"], "type": "ipv4", @@ -114,13 +127,13 @@ def _router_bgp_peer_groups(self) -> list | None: } ) - if bgp_peer_groups: - return bgp_peer_groups + if router_bgp["peer_groups"]: + return router_bgp - return None + return {} @cached_property - def _router_bgp_vrfs(self) -> list | None: + def _router_bgp_vrfs(self: AvdStructuredConfigNetworkServices) -> list | None: """ Return structured config for router_bgp.vrfs @@ -183,7 +196,14 @@ def _router_bgp_vrfs(self) -> list | None: "prefix_list_out": bgp_peer.pop("prefix_list_out", None), } ) - bgp_vrf.setdefault(address_family, {}).setdefault("neighbors", []).append(neighbor) + + append_if_not_duplicate( + list_of_dicts=bgp_vrf.setdefault(address_family, {}).setdefault("neighbors", []), + primary_key="ip_address", + new_dict=neighbor, + context="BGP peer defined under VRFs", + context_keys=["ip_address"], + ) if bgp_peer.get("set_ipv4_next_hop") is not None or bgp_peer.get("set_ipv6_next_hop") is not None: route_map = f"RM-{vrf_name}-{peer_ip}-SET-NEXT-HOP-OUT" @@ -195,7 +215,14 @@ def _router_bgp_vrfs(self) -> list | None: bgp_peer.pop("set_ipv6_next_hop", None) bgp_peer.pop("nodes", None) - bgp_vrf.setdefault("neighbors", []).append({"ip_address": peer_ip, **bgp_peer}) + + append_if_not_duplicate( + list_of_dicts=bgp_vrf.setdefault("neighbors", []), + primary_key="ip_address", + new_dict={"ip_address": peer_ip, **bgp_peer}, + context="BGP peer defined under VRFs", + context_keys=["ip_address"], + ) if ( get(vrf, "ospf.enabled") is True @@ -225,7 +252,7 @@ def _router_bgp_vrfs(self) -> list | None: return vrfs or None - def _update_router_bgp_vrf_evpn_or_mpls_cfg(self, bgp_vrf: dict, vrf: dict, vrf_address_families: list) -> None: + def _update_router_bgp_vrf_evpn_or_mpls_cfg(self: AvdStructuredConfigNetworkServices, bgp_vrf: dict, vrf: dict, vrf_address_families: list) -> None: """ In-place update EVPN/MPLS part of structured config for *one* VRF under router_bgp.vrfs """ @@ -272,9 +299,7 @@ def _update_router_bgp_vrf_evpn_or_mpls_cfg(self, bgp_vrf: dict, vrf: dict, vrf_ if (evpn_multicast_transit_mode := get(vrf, "_evpn_l3_multicast_evpn_peg_transit")) is True: bgp_vrf["evpn_multicast_address_family"] = {"ipv4": {"transit": evpn_multicast_transit_mode}} - return - - def _update_router_bgp_vrf_mlag_neighbor_cfg(self, bgp_vrf: dict, vrf: dict, tenant: dict, vlan_id: int) -> None: + def _update_router_bgp_vrf_mlag_neighbor_cfg(self: AvdStructuredConfigNetworkServices, bgp_vrf: dict, vrf: dict, tenant: dict, vlan_id: int) -> None: """ In-place update MLAG neighbor part of structured config for *one* VRF under router_bgp.vrfs """ @@ -316,10 +341,51 @@ def _update_router_bgp_vrf_mlag_neighbor_cfg(self, bgp_vrf: dict, vrf: dict, ten }, } ) - return - @cached_property - def _router_bgp_vlans(self) -> list | None: + def _router_bgp_sorted_vlans_and_svis_lists(self: AvdStructuredConfigNetworkServices) -> dict: + tenant_svis_l2vlans_dict = {} + for tenant in self.shared_utils.filtered_tenants: + tenant_svis_l2vlans_dict[tenant["name"]] = {} + + # For L2VLANs + l2vlans_bundle_dict = {} + l2vlans_non_bundle_list = {} + sorted_vlan_list = sorted(tenant["l2vlans"], key=self._get_vlan_aware_bundle_name_tuple_for_l2vlans) + bundle_groups = itertools_groupby(sorted_vlan_list, self._get_vlan_aware_bundle_name_tuple_for_l2vlans) + for vlan_aware_bundle_name_tuple, l2vlans in bundle_groups: + bundle_name, is_evpn_vlan_bundle = vlan_aware_bundle_name_tuple + l2vlans = list(l2vlans) + + if is_evpn_vlan_bundle: + l2vlans_bundle_dict[bundle_name] = l2vlans + else: + l2vlans_non_bundle_list[bundle_name] = l2vlans + + # For SVIs + vrf_svis_bundle_dict = {} + vrf_svis_non_bundle_dict = {} + for vrf in tenant["vrfs"]: + vrf_svis_non_bundle_dict[vrf["name"]] = [] + vrf_svis_bundle_dict[vrf["name"]] = {} + sorted_svi_list = sorted(vrf["svis"], key=self._get_vlan_aware_bundle_name_tuple_for_svis) + bundle_groups_svis = itertools_groupby(sorted_svi_list, self._get_vlan_aware_bundle_name_tuple_for_svis) + for vlan_aware_bundle_name_tuple, svis in bundle_groups_svis: + bundle_name, is_evpn_vlan_bundle = vlan_aware_bundle_name_tuple + svis = list(svis) + + if is_evpn_vlan_bundle: + vrf_svis_bundle_dict[vrf["name"]][bundle_name] = svis + else: + vrf_svis_non_bundle_dict[vrf["name"]] = svis + + tenant_svis_l2vlans_dict[tenant["name"]]["svi_bundle"] = vrf_svis_bundle_dict + tenant_svis_l2vlans_dict[tenant["name"]]["svi_non_bundle"] = vrf_svis_non_bundle_dict + tenant_svis_l2vlans_dict[tenant["name"]]["l2vlan_bundle"] = l2vlans_bundle_dict + tenant_svis_l2vlans_dict[tenant["name"]]["l2vlan_non_bundle"] = l2vlans_non_bundle_list + + return tenant_svis_l2vlans_dict + + def _router_bgp_vlans(self: AvdStructuredConfigNetworkServices, tenant_svis_l2vlans_dict) -> list | None: """ Return structured config for router_bgp.vlans """ @@ -335,7 +401,7 @@ def _router_bgp_vlans(self) -> list | None: vlans = [] for tenant in self.shared_utils.filtered_tenants: for vrf in tenant["vrfs"]: - for svi in vrf["svis"]: + for svi in tenant_svis_l2vlans_dict[tenant["name"]]["svi_non_bundle"][vrf["name"]]: if (vlan := self._router_bgp_vlans_vlan(svi, tenant, vrf)) is not None: vlan_id = int(svi["id"]) vlan = {"id": vlan_id, **vlan} @@ -349,22 +415,23 @@ def _router_bgp_vlans(self) -> list | None: ) # L2 Vlans per Tenant - for l2vlan in tenant["l2vlans"]: - if (vlan := self._router_bgp_vlans_vlan(l2vlan, tenant, vrf={})) is not None: - vlan_id = int(l2vlan["id"]) - vlan = {"id": vlan_id, **vlan} - append_if_not_duplicate( - list_of_dicts=vlans, - primary_key="id", - new_dict=vlan, - context="BGP VLANs defined under network services", - context_keys=["id", "tenant"], - ignore_keys={"tenant"}, - ) + for l2vlans in tenant_svis_l2vlans_dict[tenant["name"]]["l2vlan_non_bundle"].values(): + for l2vlan in l2vlans: + if (vlan := self._router_bgp_vlans_vlan(l2vlan, tenant, vrf={})) is not None: + vlan_id = int(l2vlan["id"]) + vlan = {"id": vlan_id, **vlan} + append_if_not_duplicate( + list_of_dicts=vlans, + primary_key="id", + new_dict=vlan, + context="BGP VLANs defined under network services", + context_keys=["id", "tenant"], + ignore_keys={"tenant"}, + ) return vlans or None - def _router_bgp_vlans_vlan(self, vlan, tenant, vrf) -> dict | None: + def _router_bgp_vlans_vlan(self: AvdStructuredConfigNetworkServices, vlan, tenant, vrf) -> dict | None: """ Return structured config for one given vlan under router_bgp.vlans """ @@ -405,7 +472,7 @@ def _evpn_vlan_bundles(self) -> list: def _evpn_vlan_aware_bundles(self) -> bool: return get(self._hostvars, "evpn_vlan_aware_bundles", default=False) - def _get_vlan_aware_bundle_name_tuple_for_l2vlans(self, vlan: dict) -> tuple[str, bool] | None: + def _get_vlan_aware_bundle_name_tuple_for_l2vlans(self: AvdStructuredConfigNetworkServices, vlan: dict) -> tuple[str, bool] | None: """ Return a tuple with string with the vlan-aware-bundle name for one VLAN and a boolean saying if this is a evpn_vlan_bundle. """ @@ -413,7 +480,7 @@ def _get_vlan_aware_bundle_name_tuple_for_l2vlans(self, vlan: dict) -> tuple[str return (str(vlan.get("evpn_vlan_bundle")), True) return (str(vlan.get("name")), False) - def _get_vlan_aware_bundle_name_tuple_for_svis(self, vlan: dict) -> tuple[str, bool] | None: + def _get_vlan_aware_bundle_name_tuple_for_svis(self: AvdStructuredConfigNetworkServices, vlan: dict) -> tuple[str, bool] | None: """ Return a tuple with string with the vlan-aware-bundle name for one VLAN and a boolean saying if this is a evpn_vlan_bundle. If no bundle is configured, it will return an empty string as name, since the calling function will then get all svis without bundle @@ -423,18 +490,18 @@ def _get_vlan_aware_bundle_name_tuple_for_svis(self, vlan: dict) -> tuple[str, b return (str(vlan.get("evpn_vlan_bundle")), True) return ("", False) - def _get_evpn_vlan_bundle(self, vlan: dict, bundle_name: str) -> dict: + def _get_evpn_vlan_bundle(self: AvdStructuredConfigNetworkServices, vlan: dict, bundle_name: str) -> dict: """ Return an evpn_vlan_bundle dict if it exists, else raise an exception. """ if (evpn_vlan_bundle := get_item(self._evpn_vlan_bundles, "name", bundle_name)) is None: raise AristaAvdMissingVariableError( - "The 'evpn_vlan_bundle' of the svis/l2vlans must be defined in the common 'evpn_vlan_bundles' setting. First occurence seen for svi/l2vlan" + "The 'evpn_vlan_bundle' of the svis/l2vlans must be defined in the common 'evpn_vlan_bundles' setting. First occurrence seen for svi/l2vlan" f" {vlan['id']} in Tenant '{vlan['tenant']}' and evpn_vlan_bundle '{vlan['evpn_vlan_bundle']}'." ) return evpn_vlan_bundle - def _get_svi_l2vlan_bundle(self, evpn_vlan_bundle: dict, tenant: dict, vlans: list) -> dict | None: + def _get_svi_l2vlan_bundle(self: AvdStructuredConfigNetworkServices, evpn_vlan_bundle: dict, tenant: dict, vlans: list) -> dict | None: """ Return an bundle config for a svi or l2vlan. """ @@ -457,11 +524,10 @@ def _get_svi_l2vlan_bundle(self, evpn_vlan_bundle: dict, tenant: dict, vlans: li if (eos_cli := get(evpn_vlan_bundle, "bgp.raw_eos_cli")) is not None: bundle["eos_cli"] = eos_cli return bundle - else: - return None - @cached_property - def _router_bgp_vlan_aware_bundles(self) -> list | None: + return None + + def _router_bgp_vlan_aware_bundles(self: AvdStructuredConfigNetworkServices, tenant_svis_l2vlans_dict) -> list | None: """ Return structured config for router_bgp.vlan_aware_bundles """ @@ -469,58 +535,43 @@ def _router_bgp_vlan_aware_bundles(self) -> list | None: if not self.shared_utils.network_services_l2 or not self.shared_utils.overlay_evpn: return None - if not self._evpn_vlan_aware_bundles: - return None - bundles = [] for tenant in self.shared_utils.filtered_tenants: l2vlan_svi_vlan_aware_bundles = {} for vrf in tenant["vrfs"]: - sorted_vlan_list = sorted(vrf["svis"], key=self._get_vlan_aware_bundle_name_tuple_for_svis) - bundle_groups = itertools_groupby(sorted_vlan_list, self._get_vlan_aware_bundle_name_tuple_for_svis) - - for vlan_aware_bundle_name_tuple, svis in bundle_groups: - bundle_name, is_evpn_vlan_bundle = vlan_aware_bundle_name_tuple - svis = list(svis) - if is_evpn_vlan_bundle: - # SVIs which have an evpn_vlan_bundle defined - if bundle_name in l2vlan_svi_vlan_aware_bundles: - l2vlan_svi_vlan_aware_bundles[bundle_name]["l2vlan_svis"].extend(svis) - else: - # check if the referred name exists in the global evpn_vlan_bundles - evpn_vlan_bundle = self._get_evpn_vlan_bundle(svis[0], bundle_name) - l2vlan_svi_vlan_aware_bundles[bundle_name] = {"evpn_vlan_bundle": evpn_vlan_bundle, "l2vlan_svis": svis} - - else: - # SVIs which don't have an evpn_vlan_bundle defined are included in the VRF vlan-aware-bundle - if (bundle := self._router_bgp_vlan_aware_bundles_vrf(vrf, tenant, svis)) is not None: - append_if_not_duplicate( - list_of_dicts=bundles, - primary_key="name", - new_dict=bundle, - context="BGP VLAN-Aware Bundles defined under network services", - context_keys=["name"], - ) - - # L2 Vlans per Tenant - # If multiple L2 Vlans share the same evpn_vlan_bundle name, they will be part of the same vlan-aware-bundle else they use the vlan name as bundle - sorted_vlan_list = sorted(tenant["l2vlans"], key=self._get_vlan_aware_bundle_name_tuple_for_l2vlans) - bundle_groups = itertools_groupby(sorted_vlan_list, self._get_vlan_aware_bundle_name_tuple_for_l2vlans) - - for vlan_aware_bundle_name_tuple, l2vlans in bundle_groups: - bundle_name, is_evpn_vlan_bundle = vlan_aware_bundle_name_tuple - l2vlans = list(l2vlans) - if is_evpn_vlan_bundle: - # If "evpn_vlan_bundle" in l2vlan bundle group, we use the same logic for rd/rt as VRFs - # using the settings under the given evpn_vlan_bundle only. + for bundle_name, svis in tenant_svis_l2vlans_dict[tenant["name"]]["svi_bundle"][vrf["name"]].items(): + # SVIs which have an evpn_vlan_bundle defined if bundle_name in l2vlan_svi_vlan_aware_bundles: - l2vlan_svi_vlan_aware_bundles[bundle_name]["l2vlan_svis"].extend(l2vlans) + l2vlan_svi_vlan_aware_bundles[bundle_name]["l2vlan_svis"].extend(svis) else: # check if the referred name exists in the global evpn_vlan_bundles - evpn_vlan_bundle = self._get_evpn_vlan_bundle(l2vlans[0], bundle_name) - l2vlan_svi_vlan_aware_bundles[bundle_name] = {"evpn_vlan_bundle": evpn_vlan_bundle, "l2vlan_svis": l2vlans} + evpn_vlan_bundle = self._get_evpn_vlan_bundle(svis[0], bundle_name) + l2vlan_svi_vlan_aware_bundles[bundle_name] = {"evpn_vlan_bundle": evpn_vlan_bundle, "l2vlan_svis": svis} + + if self._evpn_vlan_aware_bundles: + svis = tenant_svis_l2vlans_dict[tenant["name"]]["svi_non_bundle"][vrf["name"]] + # SVIs which don't have an evpn_vlan_bundle defined are included in the VRF vlan-aware-bundle + if (bundle := self._router_bgp_vlan_aware_bundles_vrf(vrf, tenant, svis)) is not None: + append_if_not_duplicate( + list_of_dicts=bundles, + primary_key="name", + new_dict=bundle, + context="BGP VLAN-Aware Bundles defined under network services", + context_keys=["name"], + ) + # L2 Vlans per Tenant + # If multiple L2 Vlans share the same evpn_vlan_bundle name, they will be part of the same vlan-aware-bundle else they use the vlan name as bundle + for bundle_name, l2vlans in tenant_svis_l2vlans_dict[tenant["name"]]["l2vlan_bundle"].items(): + if bundle_name in l2vlan_svi_vlan_aware_bundles: + l2vlan_svi_vlan_aware_bundles[bundle_name]["l2vlan_svis"].extend(l2vlans) else: + # check if the referred name exists in the global evpn_vlan_bundles + evpn_vlan_bundle = self._get_evpn_vlan_bundle(l2vlans[0], bundle_name) + l2vlan_svi_vlan_aware_bundles[bundle_name] = {"evpn_vlan_bundle": evpn_vlan_bundle, "l2vlan_svis": l2vlans} + + if self._evpn_vlan_aware_bundles: + for bundle_name, l2vlans in tenant_svis_l2vlans_dict[tenant["name"]]["l2vlan_non_bundle"].items(): # Without "evpn_vlan_bundle" we fall back to per-vlan behavior if (bundle := self._router_bgp_vlans_vlan(l2vlans[0], tenant, vrf={})) is None: # Skip bundle since no vlans were enabled for vxlan. @@ -529,7 +580,6 @@ def _router_bgp_vlan_aware_bundles(self) -> list | None: # We are reusing the regular bgp vlan function so need to add vlan info bundle["vlan"] = list_compress([int(l2vlan["id"]) for l2vlan in l2vlans]) bundle = {"name": bundle_name, **bundle} - append_if_not_duplicate( list_of_dicts=bundles, primary_key="name", @@ -563,7 +613,7 @@ def _router_bgp_vlan_aware_bundles(self) -> list | None: return bundles or None - def _router_bgp_vlan_aware_bundles_vrf(self, vrf: dict, tenant: dict, vlans: list[dict]) -> dict | None: + def _router_bgp_vlan_aware_bundles_vrf(self: AvdStructuredConfigNetworkServices, vrf: dict, tenant: dict, vlans: list[dict]) -> dict | None: """ Return structured config for one vrf under router_bgp.vlan_aware_bundles """ @@ -576,7 +626,9 @@ def _router_bgp_vlan_aware_bundles_vrf(self, vrf: dict, tenant: dict, vlans: lis tenant=tenant, ) - def _router_bgp_vlan_aware_bundle(self, name: str, vlans: list, rd: str, rt: str, evpn_l2_multi_domain: bool, tenant: dict) -> dict | None: + def _router_bgp_vlan_aware_bundle( + self: AvdStructuredConfigNetworkServices, name: str, vlans: list, rd: str, rt: str, evpn_l2_multi_domain: bool, tenant: dict + ) -> dict | None: """ Return structured config for one vlan-aware-bundle. Used for VRFs and bundles defined under "evpn_vlan_bundles" referred by l2vlans and SVIs @@ -604,7 +656,7 @@ def _router_bgp_vlan_aware_bundle(self, name: str, vlans: list, rd: str, rt: str return bundle @cached_property - def _rt_admin_subfield(self) -> str | None: + def _rt_admin_subfield(self: AvdStructuredConfigNetworkServices) -> str | None: """ Return a string with the route-target admin subfield unless set to "vrf_id" or "vrf_vni" or "id". Returns None if not set, since the calling functions will use @@ -617,12 +669,12 @@ def _rt_admin_subfield(self) -> str | None: if admin_subfield == "bgp_as": return self.shared_utils.bgp_as - if re_fullmatch(r"[0-9]+", str(admin_subfield)): + if re_fullmatch(r"\d+", str(admin_subfield)): return admin_subfield return None - def get_vlan_mac_vrf_id(self, vlan, tenant) -> int: + def get_vlan_mac_vrf_id(self: AvdStructuredConfigNetworkServices, vlan, tenant) -> int: mac_vrf_id_base = default(tenant.get("mac_vrf_id_base"), tenant.get("mac_vrf_vni_base")) if mac_vrf_id_base is None: raise AristaAvdMissingVariableError( @@ -631,7 +683,7 @@ def get_vlan_mac_vrf_id(self, vlan, tenant) -> int: ) return mac_vrf_id_base + int(vlan["id"]) - def get_vlan_mac_vrf_vni(self, vlan, tenant) -> int: + def get_vlan_mac_vrf_vni(self: AvdStructuredConfigNetworkServices, vlan, tenant) -> int: mac_vrf_vni_base = default(tenant.get("mac_vrf_vni_base"), tenant.get("mac_vrf_id_base")) if mac_vrf_vni_base is None: raise AristaAvdMissingVariableError( @@ -640,7 +692,7 @@ def get_vlan_mac_vrf_vni(self, vlan, tenant) -> int: ) return mac_vrf_vni_base + int(vlan["id"]) - def get_vlan_rd(self, vlan, tenant) -> str: + def get_vlan_rd(self: AvdStructuredConfigNetworkServices, vlan, tenant) -> str: """ Return a string with the route-destinguisher for one VLAN """ @@ -660,7 +712,7 @@ def get_vlan_rd(self, vlan, tenant) -> str: return f"{self.shared_utils.overlay_rd_type_admin_subfield}:{assigned_number_subfield}" - def get_vlan_rt(self, vlan: dict, tenant: dict) -> str: + def get_vlan_rt(self: AvdStructuredConfigNetworkServices, vlan: dict, tenant: dict) -> str: """ Return a string with the route-target for one VLAN """ @@ -692,7 +744,7 @@ def get_vlan_rt(self, vlan: dict, tenant: dict) -> str: return f"{admin_subfield}:{assigned_number_subfield}" @cached_property - def _vrf_rt_admin_subfield(self) -> str | None: + def _vrf_rt_admin_subfield(self: AvdStructuredConfigNetworkServices) -> str | None: """ Return a string with the VRF route-target admin subfield unless set to "vrf_id" or "vrf_vni" or "id". Returns None if not set, since the calling functions will use @@ -705,12 +757,12 @@ def _vrf_rt_admin_subfield(self) -> str | None: if admin_subfield == "bgp_as": return self.shared_utils.bgp_as - if re_fullmatch(r"[0-9]+", str(admin_subfield)): + if re_fullmatch(r"\d+", str(admin_subfield)): return admin_subfield return None - def get_vrf_rd(self, vrf) -> str: + def get_vrf_rd(self: AvdStructuredConfigNetworkServices, vrf) -> str: """ Return a string with the route-destinguisher for one VRF """ @@ -724,7 +776,7 @@ def get_vrf_rd(self, vrf) -> str: return f"{self.shared_utils.overlay_rd_type_vrf_admin_subfield}:{self.shared_utils.get_vrf_id(vrf)}" - def get_vrf_rt(self, vrf: dict) -> str: + def get_vrf_rt(self: AvdStructuredConfigNetworkServices, vrf: dict) -> str: """ Return a string with the route-target for one VRF """ @@ -746,7 +798,7 @@ def get_vrf_rt(self, vrf: dict) -> str: return f"{admin_subfield}:{self.shared_utils.get_vrf_id(vrf)}" - def get_vlan_aware_bundle_rd(self, id: int, tenant: dict, is_vrf: bool, rd_override: str = None) -> str: + def get_vlan_aware_bundle_rd(self: AvdStructuredConfigNetworkServices, id: int, tenant: dict, is_vrf: bool, rd_override: str | None = None) -> str: """ Return a string with the route-destinguisher for one VLAN Aware Bundle """ @@ -764,7 +816,9 @@ def get_vlan_aware_bundle_rd(self, id: int, tenant: dict, is_vrf: bool, rd_overr bundle_number = id + int(get(tenant, "vlan_aware_bundle_number_base", default=0)) return f"{admin_subfield}:{bundle_number}" - def get_vlan_aware_bundle_rt(self, id: int, vni: int, tenant: dict, is_vrf: bool, rt_override: str = None) -> str: + def get_vlan_aware_bundle_rt( + self: AvdStructuredConfigNetworkServices, id: int, vni: int, tenant: dict, is_vrf: bool, rt_override: str | None = None + ) -> str: """ Return a string with the route-target for one VLAN Aware Bundle """ @@ -787,7 +841,7 @@ def get_vlan_aware_bundle_rt(self, id: int, vni: int, tenant: dict, is_vrf: bool return f"{admin_subfield}:{bundle_number}" @cached_property - def _router_bgp_redistribute_routes(self) -> list | None: + def _router_bgp_redistribute_routes(self: AvdStructuredConfigNetworkServices) -> list | None: """ Return structured config for router_bgp.redistribute_routes @@ -809,7 +863,7 @@ def _router_bgp_redistribute_routes(self) -> list | None: return [{"source_protocol": "static"}] @cached_property - def _router_bgp_vpws(self) -> list[dict] | None: + def _router_bgp_vpws(self: AvdStructuredConfigNetworkServices) -> list[dict] | None: """ Return structured config for router_bgp.vpws """ @@ -877,7 +931,7 @@ def _router_bgp_vpws(self) -> list[dict] | None: return None - def _router_bgp_mlag_peer_group(self) -> dict: + def _router_bgp_mlag_peer_group(self: AvdStructuredConfigNetworkServices) -> dict: """ Return a partial router_bgp structured_config covering the MLAG peer_group and associated address_family activations diff --git a/python-avd/pyavd/_eos_designs/structured_config/network_services/router_internet_exit.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/router_internet_exit.py new file mode 100644 index 00000000000..05d87ebc8da --- /dev/null +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/router_internet_exit.py @@ -0,0 +1,63 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import annotations + +from collections import defaultdict +from functools import cached_property +from typing import TYPE_CHECKING + +from ...._utils import get +from .utils import UtilsMixin + +if TYPE_CHECKING: + from . import AvdStructuredConfigNetworkServices + + +class RouterInternetExitMixin(UtilsMixin): + """ + Mixin Class used to generate structured config for one key. + Class should only be used as Mixin to a AvdStructuredConfig class + """ + + @cached_property + def router_internet_exit(self: AvdStructuredConfigNetworkServices) -> dict | None: + """ + Return structured config for router_internet_exit + + Only used for CV Pathfinder edge routers today + """ + if not self._filtered_internet_exit_policies: + return None + + router_internet_exit = {} + exit_groups_dict = defaultdict(lambda: {"local_connections": []}) + policies = [] + + for policy in self._filtered_internet_exit_policies: + policy_exit_groups = [] + # TODO: Today we use the order of the connection list to order the exit-groups inside the policy. + # This works for zscaler but later we may need to use some sorting intelligence as order matters. + for connection in policy.get("connections", []): + exit_group_name = connection["exit_group"] + exit_groups_dict[exit_group_name]["local_connections"].append({"name": connection["name"]}) + # Recording the exit_group in the policy + if exit_group_name not in policy_exit_groups: + policy_exit_groups.append(exit_group_name) + + if get(policy, "fallback_to_system_default", default=True): + policy_exit_groups.append("system-default-exit-group") + + policies.append({"name": policy["name"], "exit_groups": [{"name": exit_group_name} for exit_group_name in policy_exit_groups]}) + + if exit_groups_dict: + router_internet_exit["exit_groups"] = [ + {"name": exit_group_name, **exit_group_data} for exit_group_name, exit_group_data in exit_groups_dict.items() + ] + if policies: + router_internet_exit["policies"] = policies + + if router_internet_exit: + return router_internet_exit + + return None diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/router_isis.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/router_isis.py similarity index 85% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/router_isis.py rename to python-avd/pyavd/_eos_designs/structured_config/network_services/router_isis.py index 9ce3d0cca1f..c65f9734686 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/router_isis.py +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/router_isis.py @@ -4,9 +4,13 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigNetworkServices + class RouterIsisMixin(UtilsMixin): """ @@ -15,7 +19,7 @@ class RouterIsisMixin(UtilsMixin): """ @cached_property - def router_isis(self) -> dict | None: + def router_isis(self: AvdStructuredConfigNetworkServices) -> dict | None: """ return structured config for router_isis diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/router_multicast.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/router_multicast.py similarity index 81% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/router_multicast.py rename to python-avd/pyavd/_eos_designs/structured_config/network_services/router_multicast.py index 59339855727..c528193aae5 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/router_multicast.py +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/router_multicast.py @@ -4,9 +4,13 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.utils import append_if_not_duplicate, get -from ansible_collections.arista.avd.roles.eos_designs.python_modules.network_services.utils import UtilsMixin +from ...._utils import append_if_not_duplicate, get +from .utils import UtilsMixin + +if TYPE_CHECKING: + from . import AvdStructuredConfigNetworkServices class RouterMulticastMixin(UtilsMixin): @@ -16,7 +20,7 @@ class RouterMulticastMixin(UtilsMixin): """ @cached_property - def router_multicast(self) -> dict | None: + def router_multicast(self: AvdStructuredConfigNetworkServices) -> dict | None: """ return structured config for router_multicast diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/router_ospf.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/router_ospf.py similarity index 93% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/router_ospf.py rename to python-avd/pyavd/_eos_designs/structured_config/network_services/router_ospf.py index 32b50ed12df..92f40946ec8 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/router_ospf.py +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/router_ospf.py @@ -4,12 +4,15 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdMissingVariableError -from ansible_collections.arista.avd.plugins.plugin_utils.utils import append_if_not_duplicate, default, get - +from ...._errors import AristaAvdMissingVariableError +from ...._utils import append_if_not_duplicate, default, get from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigNetworkServices + class RouterOspfMixin(UtilsMixin): """ @@ -18,7 +21,7 @@ class RouterOspfMixin(UtilsMixin): """ @cached_property - def router_ospf(self) -> dict | None: + def router_ospf(self: AvdStructuredConfigNetworkServices) -> dict | None: """ return structured config for router_ospf diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/router_path_selection.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/router_path_selection.py similarity index 88% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/router_path_selection.py rename to python-avd/pyavd/_eos_designs/structured_config/network_services/router_path_selection.py index 0470c8b60e8..3032db940e0 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/router_path_selection.py +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/router_path_selection.py @@ -4,12 +4,14 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.strip_empties import strip_empties_from_dict -from ansible_collections.arista.avd.plugins.plugin_utils.utils import append_if_not_duplicate, get - +from ...._utils import append_if_not_duplicate, get, strip_empties_from_dict from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigNetworkServices + class RouterPathSelectionMixin(UtilsMixin): """ @@ -18,7 +20,7 @@ class RouterPathSelectionMixin(UtilsMixin): """ @cached_property - def router_path_selection(self) -> dict | None: + def router_path_selection(self: AvdStructuredConfigNetworkServices) -> dict | None: """ Return structured config for router path-selection (DPS) """ @@ -44,7 +46,7 @@ def router_path_selection(self) -> dict | None: return strip_empties_from_dict(router_path_selection) - def _wan_load_balance_policies(self) -> list: + def _wan_load_balance_policies(self: AvdStructuredConfigNetworkServices) -> list: """ Return a list of load balance policies """ @@ -69,7 +71,7 @@ def _wan_load_balance_policies(self) -> list: return load_balance_policies - def _autovpn_policies(self) -> list: + def _autovpn_policies(self: AvdStructuredConfigNetworkServices) -> list: """ Return a list of policies for AutoVPN """ diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/router_pim_sparse_mode.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/router_pim_sparse_mode.py similarity index 82% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/router_pim_sparse_mode.py rename to python-avd/pyavd/_eos_designs/structured_config/network_services/router_pim_sparse_mode.py index 97739f9bcdf..1a4be6e597f 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/router_pim_sparse_mode.py +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/router_pim_sparse_mode.py @@ -4,9 +4,13 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.utils import append_if_not_duplicate, get -from ansible_collections.arista.avd.roles.eos_designs.python_modules.network_services.utils import UtilsMixin +from ...._utils import append_if_not_duplicate, get +from .utils import UtilsMixin + +if TYPE_CHECKING: + from . import AvdStructuredConfigNetworkServices class RouterPimSparseModeMixin(UtilsMixin): @@ -16,7 +20,7 @@ class RouterPimSparseModeMixin(UtilsMixin): """ @cached_property - def router_pim_sparse_mode(self) -> dict | None: + def router_pim_sparse_mode(self: AvdStructuredConfigNetworkServices) -> dict | None: """ return structured config for router_pim diff --git a/python-avd/pyavd/_eos_designs/structured_config/network_services/router_service_insertion.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/router_service_insertion.py new file mode 100644 index 00000000000..adb9e86127a --- /dev/null +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/router_service_insertion.py @@ -0,0 +1,59 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import annotations + +from functools import cached_property +from typing import TYPE_CHECKING + +from .utils import UtilsMixin + +if TYPE_CHECKING: + from . import AvdStructuredConfigNetworkServices + + +class RouterServiceInsertionMixin(UtilsMixin): + """ + Mixin Class used to generate structured config for one key. + Class should only be used as Mixin to a AvdStructuredConfig class + """ + + @cached_property + def router_service_insertion(self: AvdStructuredConfigNetworkServices) -> dict | None: + """ + Return structured config for router_service_insertion + + Only used for CV Pathfinder edge routers today + """ + if not self._filtered_internet_exit_policies: + return None + + router_service_insertion = {} + connections = [] + + for policy in self._filtered_internet_exit_policies: + for connection in policy.get("connections", []): + service_connection = { + "name": connection["name"], + "monitor_connectivity_host": connection["monitor_name"], + } + + if connection["type"] == "tunnel": + service_connection["tunnel_interface"] = { + "primary": f"Tunnel{connection['tunnel_id']}", + } + elif connection["type"] == "ethernet": + service_connection["ethernet_interface"] = { + "name": connection["source_interface"], + "next_hop": connection["next_hop"], + } + + connections.append(service_connection) + if connections: + router_service_insertion["enabled"] = True + router_service_insertion["connections"] = connections + + if router_service_insertion: + return router_service_insertion + + return None diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/spanning_tree.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/spanning_tree.py similarity index 87% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/spanning_tree.py rename to python-avd/pyavd/_eos_designs/structured_config/network_services/spanning_tree.py index 1e753721fb6..a1d8a36c8b5 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/spanning_tree.py +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/spanning_tree.py @@ -4,10 +4,14 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.filter.list_compress import list_compress -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get -from ansible_collections.arista.avd.roles.eos_designs.python_modules.network_services.utils import UtilsMixin +from ...._utils import get +from ....j2filters import list_compress +from .utils import UtilsMixin + +if TYPE_CHECKING: + from . import AvdStructuredConfigNetworkServices class SpanningTreeMixin(UtilsMixin): @@ -17,7 +21,7 @@ class SpanningTreeMixin(UtilsMixin): """ @cached_property - def spanning_tree(self) -> dict | None: + def spanning_tree(self: AvdStructuredConfigNetworkServices) -> dict | None: """ spanning_tree priorities set per VLAN if spanning_tree mode is "rapid-pvst" """ diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/standard_access_lists.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/standard_access_lists.py similarity index 89% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/standard_access_lists.py rename to python-avd/pyavd/_eos_designs/structured_config/network_services/standard_access_lists.py index 5676a6efd45..82f0737d267 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/standard_access_lists.py +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/standard_access_lists.py @@ -4,11 +4,14 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.utils import append_if_not_duplicate, default, get - +from ...._utils import append_if_not_duplicate, default, get from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigNetworkServices + class StandardAccessListsMixin(UtilsMixin): """ @@ -17,7 +20,7 @@ class StandardAccessListsMixin(UtilsMixin): """ @cached_property - def standard_access_lists(self) -> list | None: + def standard_access_lists(self: AvdStructuredConfigNetworkServices) -> list | None: """ return structured config for standard_access_lists diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/static_routes.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/static_routes.py similarity index 73% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/static_routes.py rename to python-avd/pyavd/_eos_designs/structured_config/network_services/static_routes.py index a916bbe8e81..9ad652f9b8d 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/static_routes.py +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/static_routes.py @@ -5,9 +5,13 @@ import ipaddress from functools import cached_property +from typing import TYPE_CHECKING from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigNetworkServices + class StaticRoutesMixin(UtilsMixin): """ @@ -16,7 +20,7 @@ class StaticRoutesMixin(UtilsMixin): """ @cached_property - def static_routes(self) -> list[dict] | None: + def static_routes(self: AvdStructuredConfigNetworkServices) -> list[dict] | None: """ Returns structured config for static_routes @@ -61,6 +65,18 @@ def static_routes(self) -> list[dict] | None: if static_route not in static_routes: static_routes.append(static_route) + for internet_exit_policy in self._filtered_internet_exit_policies: + for connection in internet_exit_policy.get("connections", []): + if connection["type"] == "tunnel": + static_route = { + "destination_address_prefix": f"{connection['tunnel_destination_ip']}/32", + "name": f"IE-ZSCALER-{connection['suffix']}", + "gateway": connection["next_hop"], + } + # Ignore duplicate items in case of multiple connections generating the same route + if static_route not in static_routes: + static_routes.append(static_route) + if static_routes: return static_routes diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/struct_cfgs.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/struct_cfgs.py similarity index 86% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/struct_cfgs.py rename to python-avd/pyavd/_eos_designs/structured_config/network_services/struct_cfgs.py index 72b6abb2b8e..ad0438ca3d5 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/struct_cfgs.py +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/struct_cfgs.py @@ -4,11 +4,14 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.utils import append_if_not_duplicate - +from ...._utils import append_if_not_duplicate from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigNetworkServices + class StructCfgsMixin(UtilsMixin): """ @@ -16,11 +19,8 @@ class StructCfgsMixin(UtilsMixin): Class should only be used as Mixin to a AvdStructuredConfig class """ - # Set type hints for Attributes of the main class as needed - _hostvars: dict - @cached_property - def struct_cfgs(self) -> list | None: + def struct_cfgs(self: AvdStructuredConfigNetworkServices) -> list | None: """ Return the combined structured config from VRFs """ diff --git a/python-avd/pyavd/_eos_designs/structured_config/network_services/tunnel_interfaces.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/tunnel_interfaces.py new file mode 100644 index 00000000000..17f35ac9747 --- /dev/null +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/tunnel_interfaces.py @@ -0,0 +1,62 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import annotations + +from functools import cached_property +from typing import TYPE_CHECKING + +from ...._utils import append_if_not_duplicate +from .utils import UtilsMixin + +if TYPE_CHECKING: + from . import AvdStructuredConfigNetworkServices + + +class TunnelInterfacesMixin(UtilsMixin): + """ + Mixin Class used to generate structured config for one key. + Class should only be used as Mixin to a AvdStructuredConfig class + """ + + @cached_property + def tunnel_interfaces(self: AvdStructuredConfigNetworkServices) -> list | None: + """ + Return structured config for tunnel_interfaces + + Only used for CV Pathfinder edge routers today + """ + if not self._filtered_internet_exit_policies: + return None + + tunnel_interfaces = [] + + for internet_exit_policy in self._filtered_internet_exit_policies: + for connection in internet_exit_policy.get("connections", []): + if connection["type"] == "tunnel": + tunnel_interface = { + "name": f"Tunnel{connection['tunnel_id']}", + "description": connection["description"], + "mtu": 1394, # TODO: do not hardcode + "ip_address": connection["tunnel_ip_address"], + "tunnel_mode": "ipsec", # TODO: do not hardcode + "source_interface": connection["source_interface"], + "destination": connection["tunnel_destination_ip"], + "ipsec_profile": connection["ipsec_profile"], + } + + if internet_exit_policy["type"] == "zscaler": + tunnel_interface["nat_profile"] = self.get_internet_exit_nat_profile_name(internet_exit_policy["type"]) + + append_if_not_duplicate( + list_of_dicts=tunnel_interfaces, + primary_key="name", + new_dict=tunnel_interface, + context="Tunnel interface for Internet Exit policy", + context_keys=["name"], + ) + + if tunnel_interfaces: + return tunnel_interfaces + + return None diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/utils.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/utils.py similarity index 56% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/utils.py rename to python-avd/pyavd/_eos_designs/structured_config/network_services/utils.py index 626c9e1217b..ea513e3922d 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/utils.py +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/utils.py @@ -5,41 +5,42 @@ import ipaddress from functools import cached_property +from typing import TYPE_CHECKING, Literal, Tuple -from ansible_collections.arista.avd.plugins.filter.natural_sort import natural_sort -from ansible_collections.arista.avd.plugins.plugin_utils.eos_designs_shared_utils import SharedUtils -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError, AristaAvdMissingVariableError -from ansible_collections.arista.avd.plugins.plugin_utils.utils import default, get, get_item +from ...._errors import AristaAvdError, AristaAvdMissingVariableError +from ...._utils import default, get, get_item +from ...._utils.password_utils.password import simple_7_encrypt +from ....j2filters import natural_sort, range_expand +from .utils_zscaler import UtilsZscalerMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigNetworkServices -class UtilsMixin: + +class UtilsMixin(UtilsZscalerMixin): """ Mixin Class with internal functions. Class should only be used as Mixin to a AvdStructuredConfig class """ - # Set type hints for Attributes of the main class as needed - _hostvars: dict - shared_utils: SharedUtils - @cached_property - def _trunk_groups_mlag_name(self) -> str: + def _trunk_groups_mlag_name(self: AvdStructuredConfigNetworkServices) -> str: return get(self.shared_utils.trunk_groups, "mlag.name", required=True) @cached_property - def _trunk_groups_mlag_l3_name(self) -> str: + def _trunk_groups_mlag_l3_name(self: AvdStructuredConfigNetworkServices) -> str: return get(self.shared_utils.trunk_groups, "mlag_l3.name", required=True) @cached_property - def _trunk_groups_uplink_name(self) -> str: + def _trunk_groups_uplink_name(self: AvdStructuredConfigNetworkServices) -> str: return get(self.shared_utils.trunk_groups, "uplink.name", required=True) @cached_property - def _local_endpoint_trunk_groups(self) -> set: + def _local_endpoint_trunk_groups(self: AvdStructuredConfigNetworkServices) -> set: return set(get(self._hostvars, "switch.local_endpoint_trunk_groups", default=[])) @cached_property - def _vrf_default_evpn(self) -> bool: + def _vrf_default_evpn(self: AvdStructuredConfigNetworkServices) -> bool: """ Return boolean telling if VRF "default" is running EVPN or not. """ @@ -58,7 +59,7 @@ def _vrf_default_evpn(self) -> bool: return False @cached_property - def _vrf_default_ipv4_subnets(self) -> list[str]: + def _vrf_default_ipv4_subnets(self: AvdStructuredConfigNetworkServices) -> list[str]: """ Return list of ipv4 subnets in VRF "default" """ @@ -79,7 +80,7 @@ def _vrf_default_ipv4_subnets(self) -> list[str]: return subnets @cached_property - def _vrf_default_ipv4_static_routes(self) -> dict: + def _vrf_default_ipv4_static_routes(self: AvdStructuredConfigNetworkServices) -> dict: """ Finds static routes defined under VRF "default" and find out if they should be redistributed in underlay and/or overlay. @@ -126,7 +127,7 @@ def _vrf_default_ipv4_static_routes(self) -> dict: "redistribute_in_overlay": redistribute_in_overlay, } - def _mlag_ibgp_peering_enabled(self, vrf, tenant) -> bool: + def _mlag_ibgp_peering_enabled(self: AvdStructuredConfigNetworkServices, vrf, tenant) -> bool: """ Returns True if mlag ibgp_peering is enabled False otherwise @@ -137,7 +138,7 @@ def _mlag_ibgp_peering_enabled(self, vrf, tenant) -> bool: mlag_ibgp_peering: bool = default(vrf.get("enable_mlag_ibgp_peering_vrfs"), tenant.get("enable_mlag_ibgp_peering_vrfs"), True) return vrf["name"] != "default" and mlag_ibgp_peering - def _mlag_ibgp_peering_vlan_vrf(self, vrf, tenant) -> int | None: + def _mlag_ibgp_peering_vlan_vrf(self: AvdStructuredConfigNetworkServices, vrf, tenant) -> int | None: """ MLAG IBGP Peering VLANs per VRF @@ -160,7 +161,7 @@ def _mlag_ibgp_peering_vlan_vrf(self, vrf, tenant) -> int | None: return vlan_id - def _mlag_ibgp_peering_redistribute(self, vrf, tenant) -> bool: + def _mlag_ibgp_peering_redistribute(self: AvdStructuredConfigNetworkServices, vrf, tenant) -> bool: """ Returns True if MLAG IBGP Peering subnet should be redistributed for the given vrf/tenant. False otherwise. @@ -170,7 +171,7 @@ def _mlag_ibgp_peering_redistribute(self, vrf, tenant) -> bool: return default(vrf.get("redistribute_mlag_ibgp_peering_vrfs"), tenant.get("redistribute_mlag_ibgp_peering_vrfs"), True) is True @cached_property - def _configure_bgp_mlag_peer_group(self) -> bool: + def _configure_bgp_mlag_peer_group(self: AvdStructuredConfigNetworkServices) -> bool: """ Flag set during creating of BGP VRFs if an MLAG peering is needed. Decides if MLAG BGP peer-group should be configured. @@ -189,7 +190,7 @@ def _configure_bgp_mlag_peer_group(self) -> bool: return False @cached_property - def _filtered_wan_vrfs(self) -> list: + def _filtered_wan_vrfs(self: AvdStructuredConfigNetworkServices) -> list: """ Loop through all the VRFs defined under `wan_virtual_topologies.vrfs` and returns a list of mode """ @@ -225,7 +226,7 @@ def _filtered_wan_vrfs(self) -> list: return wan_vrfs @cached_property - def _wan_virtual_topologies_policies(self) -> list: + def _wan_virtual_topologies_policies(self: AvdStructuredConfigNetworkServices) -> list: """ This function parses the input data and append the default-policy if not already present """ @@ -237,7 +238,7 @@ def _wan_virtual_topologies_policies(self) -> list: return policies @cached_property - def _filtered_wan_policies(self) -> list: + def _filtered_wan_policies(self: AvdStructuredConfigNetworkServices) -> list: """ Loop through all the VRFs defined under `wan_virtual_topologies.vrfs` and returns a list of policies to configure on this device. @@ -281,7 +282,7 @@ def _filtered_wan_policies(self) -> list: return filtered_policies - def _update_policy_match_statements(self, policy: dict) -> None: + def _update_policy_match_statements(self: AvdStructuredConfigNetworkServices, policy: dict) -> None: """ Update the policy dict with two keys: `matches` and `default_match` For each match (or default_match), the load_balancing policy is resolved and if it is empty @@ -305,6 +306,7 @@ def _update_policy_match_statements(self, policy: dict) -> None: { "application_profile": self._wan_control_plane_application_profile_name, "avt_profile": self._wan_control_plane_profile_name, + "internet_exit_policy_name": get(control_plane_virtual_topology, "internet_exit.policy"), "traffic_class": get(control_plane_virtual_topology, "traffic_class"), "dscp": get(control_plane_virtual_topology, "dscp"), "load_balance_policy": load_balance_policy, @@ -347,6 +349,7 @@ def _update_policy_match_statements(self, policy: dict) -> None: { "application_profile": application_profile, "avt_profile": name, + "internet_exit_policy_name": get(application_virtual_topology, "internet_exit.policy"), "traffic_class": get(application_virtual_topology, "traffic_class"), "dscp": get(application_virtual_topology, "dscp"), "load_balance_policy": load_balance_policy, @@ -386,6 +389,7 @@ def _update_policy_match_statements(self, policy: dict) -> None: default_match = { "application_profile": application_profile, "avt_profile": name, + "internet_exit_policy_name": get(default_virtual_topology, "internet_exit.policy"), "traffic_class": get(default_virtual_topology, "traffic_class"), "dscp": get(default_virtual_topology, "dscp"), "load_balance_policy": load_balance_policy, @@ -402,9 +406,7 @@ def _update_policy_match_statements(self, policy: dict) -> None: policy["matches"] = matches policy["default_match"] = default_match - return - - def _generate_wan_load_balance_policy(self, name: str, input_dict: dict, context_path: str) -> dict | None: + def _generate_wan_load_balance_policy(self: AvdStructuredConfigNetworkServices, name: str, input_dict: dict, context_path: str) -> dict | None: """ Generate and return a router path-selection load-balance policy. If HA is enabled, inject the HA path-group with priority 1. @@ -470,7 +472,7 @@ def _generate_wan_load_balance_policy(self, name: str, input_dict: dict, context return wan_load_balance_policy - def _path_group_preference_to_eos_priority(self, path_group_preference: int | str, context_path: str) -> int: + def _path_group_preference_to_eos_priority(self: AvdStructuredConfigNetworkServices, path_group_preference: int | str, context_path: str) -> int: """ Convert "preferred" to 1 and "alternate" to 2. Everything else is returned as is. @@ -490,7 +492,7 @@ def _path_group_preference_to_eos_priority(self, path_group_preference: int | st except ValueError: failed_conversion = True - if failed_conversion or not (1 <= priority <= 65535): + if failed_conversion or not 1 <= priority <= 65535: raise AristaAvdError( f"Invalid value '{path_group_preference}' for Path-Group preference - should be either 'preferred', " f"'alternate' or an integer[1-65535] for {context_path}." @@ -499,14 +501,14 @@ def _path_group_preference_to_eos_priority(self, path_group_preference: int | st return priority @cached_property - def _default_wan_policy_name(self) -> str: + def _default_wan_policy_name(self: AvdStructuredConfigNetworkServices) -> str: """ TODO make this configurable """ return "DEFAULT-POLICY" @cached_property - def _default_policy_path_group_names(self) -> list: + def _default_policy_path_group_names(self: AvdStructuredConfigNetworkServices) -> list: """ Return the list of path-groups to consider when generating a default policy with AVD whether for the default policy or the special Control-plane policy. @@ -524,7 +526,7 @@ def _default_policy_path_group_names(self) -> list: return natural_sort(path_group_names) @cached_property - def _default_wan_policy(self) -> dict: + def _default_wan_policy(self: AvdStructuredConfigNetworkServices) -> dict: """ If no policy is defined for a VRF under 'wan_virtual_topologies.vrfs', a default policy named DEFAULT-POLICY is used where all traffic is matched in the default category and distributed amongst all path-groups. @@ -537,7 +539,7 @@ def _default_wan_policy(self) -> dict: "default_virtual_topology": {"path_groups": [{"names": self._default_policy_path_group_names}]}, } - def _default_profile_name(self, profile_name: str, application_profile: str) -> str: + def _default_profile_name(self: AvdStructuredConfigNetworkServices, profile_name: str, application_profile: str) -> str: """ Helper function to consistently return the default name of a profile @@ -546,7 +548,7 @@ def _default_profile_name(self, profile_name: str, application_profile: str) -> return f"{profile_name}-{application_profile}" @cached_property - def _wan_control_plane_virtual_topology(self) -> dict: + def _wan_control_plane_virtual_topology(self: AvdStructuredConfigNetworkServices) -> dict: """ Return the Control plane virtual topology or the default one. @@ -561,7 +563,7 @@ def _wan_control_plane_virtual_topology(self) -> dict: return control_plane_virtual_topology @cached_property - def _wan_control_plane_profile_name(self) -> str: + def _wan_control_plane_profile_name(self: AvdStructuredConfigNetworkServices) -> str: """ Control plane profile name """ @@ -569,14 +571,14 @@ def _wan_control_plane_profile_name(self) -> str: return get(self._wan_control_plane_virtual_topology, "name", default=f"{vrf_default_policy_name}-CONTROL-PLANE") @cached_property - def _wan_control_plane_application_profile_name(self) -> str: + def _wan_control_plane_application_profile_name(self: AvdStructuredConfigNetworkServices) -> str: """ Control plane application profile name """ return get(self._hostvars, "wan_virtual_topologies.control_plane_virtual_topology.application_profile", default="APP-PROFILE-CONTROL-PLANE") @cached_property - def _local_path_groups_connected_to_pathfinder(self) -> list: + def _local_path_groups_connected_to_pathfinder(self: AvdStructuredConfigNetworkServices) -> list: """ Return list of names of local path_groups connected to pathfinder """ @@ -585,3 +587,328 @@ def _local_path_groups_connected_to_pathfinder(self) -> list: for path_group in self.shared_utils.wan_local_path_groups if any(wan_interface["connected_to_pathfinder"] for wan_interface in path_group["interfaces"]) ] + + @cached_property + def _svi_acls(self: AvdStructuredConfigNetworkServices) -> dict[str, dict[str, dict]] | None: + """ + Returns a dict of + : { + "ipv4_acl_in": , + "ipv4_acl_out": , + } + Only contains interfaces with ACLs and only the ACLs that are set, + so use `get(self._svi_acls, f"{interface_name}.ipv4_acl_in")` to get the value. + """ + if not self.shared_utils.network_services_l3: + return None + + svi_acls = {} + for tenant in self.shared_utils.filtered_tenants: + for vrf in tenant["vrfs"]: + for svi in vrf["svis"]: + ipv4_acl_in = get(svi, "ipv4_acl_in") + ipv4_acl_out = get(svi, "ipv4_acl_out") + if ipv4_acl_in is None and ipv4_acl_out is None: + continue + + interface_name = f"Vlan{svi['id']}" + interface_ip: str | None = svi.get("ip_address_virtual") + if interface_ip is not None and "/" in interface_ip: + interface_ip = interface_ip.split("/", maxsplit=1)[0] + + if ipv4_acl_in is not None: + svi_acls.setdefault(interface_name, {})["ipv4_acl_in"] = self.shared_utils.get_ipv4_acl( + name=ipv4_acl_in, + interface_name=interface_name, + interface_ip=interface_ip, + ) + if ipv4_acl_out is not None: + svi_acls.setdefault(interface_name, {})["ipv4_acl_out"] = self.shared_utils.get_ipv4_acl( + name=ipv4_acl_out, + interface_name=interface_name, + interface_ip=interface_ip, + ) + + return svi_acls + + def get_internet_exit_nat_profile_name(self: AvdStructuredConfigNetworkServices, internet_exit_policy_type: Literal["zscaler", "direct"]) -> str: + if internet_exit_policy_type == "zscaler": + return "NAT-IE-ZSCALER" + return "NAT-IE-DIRECT" + + def get_internet_exit_nat_acl_name(self: AvdStructuredConfigNetworkServices, internet_exit_policy_type: Literal["zscaler", "direct"]) -> str: + return f"ACL-{self.get_internet_exit_nat_profile_name(internet_exit_policy_type)}" + + def get_internet_exit_nat_pool_and_profile( + self: AvdStructuredConfigNetworkServices, internet_exit_policy_type: Literal["zscaler", "direct"] + ) -> Tuple[dict | None, dict | None]: + if internet_exit_policy_type == "zscaler": + pool = { + "name": "PORT-ONLY-POOL", + "type": "port-only", + "ranges": [ + { + "first_port": 1500, + "last_port": 65535, + } + ], + } + + profile = { + "name": self.get_internet_exit_nat_profile_name(internet_exit_policy_type), + "source": { + "dynamic": [ + { + "access_list": self.get_internet_exit_nat_acl_name(internet_exit_policy_type), + "pool_name": "PORT-ONLY-POOL", + "nat_type": "pool", + } + ] + }, + } + return pool, profile + if internet_exit_policy_type == "direct": + profile_name = self.get_internet_exit_nat_profile_name(internet_exit_policy_type) + profile = { + "name": profile_name, + "source": { + "dynamic": [ + { + "access_list": self.get_internet_exit_nat_acl_name(internet_exit_policy_type), + "nat_type": "overload", + } + ] + }, + } + return None, profile + + @cached_property + def _filtered_internet_exit_policy_types(self: AvdStructuredConfigNetworkServices) -> list: + return sorted(set(internet_exit_policy["type"] for internet_exit_policy in self._filtered_internet_exit_policies)) + + @cached_property + def _filtered_internet_exit_policies(self: AvdStructuredConfigNetworkServices) -> list: + """ + Only supported for CV Pathfinder Edge routers. Returns an empty list for pathfinders. + + - Parse self._filtered_wan_policies looking to internet_exit_policies. + - Verify each internet_exit_policy is present in inputs `cv_pathfinder_internet_exit_policies`. + - get_internet_exit_connections and insert into the policy dict. + - Return the list of relevant internet_exit_policies. + """ + if not self.shared_utils.is_cv_pathfinder_client: + return [] + + internet_exit_policy_names = set() + candidate_internet_exit_policies = [] + configured_internet_exit_policies = get(self._hostvars, "cv_pathfinder_internet_exit_policies", []) + + for policy in self._filtered_wan_policies: + for match in get(policy, "matches", default=[]): + internet_exit_policy_name = match.get("internet_exit_policy_name") + if not internet_exit_policy_name or internet_exit_policy_name in internet_exit_policy_names: + continue + internet_exit_policy = get_item( + configured_internet_exit_policies, + "name", + internet_exit_policy_name, + required=True, + custom_error_msg=( + f"The internet exit policy {internet_exit_policy_name} configured under " + f"`wan_virtual_topologies.policies[name={policy['name']}].internet_exit.policy` " + "is not defined under `cv_pathfinder_internet_exit_policies`." + ), + ).copy() + internet_exit_policy_names.add(internet_exit_policy_name) + candidate_internet_exit_policies.append(internet_exit_policy) + + if (default_match := policy.get("default_match")) is not None: + internet_exit_policy_name = default_match.get("internet_exit_policy_name") + if not internet_exit_policy_name or internet_exit_policy_name in internet_exit_policy_names: + continue + internet_exit_policy = get_item( + configured_internet_exit_policies, + "name", + internet_exit_policy_name, + required=True, + custom_error_msg=( + f"The internet exit policy {internet_exit_policy_name} configured under " + f"`wan_virtual_topologies.policies[name={policy['name']}].internet_exit.policy` " + "is not defined under `cv_pathfinder_internet_exit_policies`." + ), + ).copy() + internet_exit_policy_names.add(internet_exit_policy_name) + candidate_internet_exit_policies.append(internet_exit_policy) + + if not internet_exit_policy_names: + return [] + + internet_exit_policies = [] + + for internet_exit_policy in candidate_internet_exit_policies: + internet_exit_policy["connections"] = self.get_internet_exit_connections(internet_exit_policy) + if not internet_exit_policy["connections"]: + # No local interface for this policy + # TODO: Decide if we should raise here instead + continue + internet_exit_policies.append(internet_exit_policy) + + return internet_exit_policies + + def get_internet_exit_connections(self: AvdStructuredConfigNetworkServices, internet_exit_policy: dict) -> list: + """ + Return a list of connections (dicts) for the given internet_exit_policy. + + These are useful for easy creation of connectivity-monitor, service-insertion connections, exit-groups, tunnels etc. + """ + policy_name = internet_exit_policy["name"] + policy_type = internet_exit_policy["type"] + + if policy_type == "direct": + return self.get_direct_internet_exit_connections(internet_exit_policy) + + if policy_type == "zscaler": + return self.get_zscaler_internet_exit_connections(internet_exit_policy) + + raise AristaAvdError(f"Unsupported type '{policy_type}' found in cv_pathfinder_internet_exit[name={policy_name}].") + + def get_direct_internet_exit_connections(self: AvdStructuredConfigNetworkServices, internet_exit_policy: dict) -> list: + """ + Return a list of connections (dicts) for the given internet_exit_policy of type direct. + """ + if get(internet_exit_policy, "type") != "direct": + return [] + + connections = [] + + # Check if the policy has any local interface + for wan_interface in self.shared_utils.wan_interfaces: + wan_interface_internet_exit_policies = get(wan_interface, "cv_pathfinder_internet_exit.policies", default=[]) + if get_item(wan_interface_internet_exit_policies, "name", internet_exit_policy["name"]) is None: + continue + + if not wan_interface.get("peer_ip"): + raise AristaAvdMissingVariableError( + f"{wan_interface['name']} peer_ip needs to be set. When using wan interface " + "for direct type internet exit, peer_ip is used for nexthop, and connectivity monitoring." + ) + + # wan interface ip will be used for acl, hence raise error if ip is not available + if (ip_address := wan_interface.get("ip_address")) == "dhcp": + if not (ip_address := wan_interface.get("dhcp_ip")): + raise AristaAvdMissingVariableError( + f"{wan_interface['name']} 'dhcp_ip' needs to be set. When using WAN interface for 'direct' type Internet exit, " + "'dhcp_ip' is used in the NAT ACL." + ) + + sanitized_interface_name = self.shared_utils.sanitize_interface_name(wan_interface["name"]) + connections.append( + { + "type": "ethernet", + "name": f"IE-{sanitized_interface_name}", + "source_interface_ip_address": ip_address, + "monitor_name": f"IE-{sanitized_interface_name}", + "monitor_host": wan_interface["peer_ip"], + "next_hop": wan_interface["peer_ip"], + "source_interface": wan_interface["name"], + "description": f"Internet Exit {internet_exit_policy['name']}", + "exit_group": f"{internet_exit_policy['name']}", + } + ) + + return connections + + def get_zscaler_internet_exit_connections(self: AvdStructuredConfigNetworkServices, internet_exit_policy: dict) -> list: + """ + Return a list of connections (dicts) for the given internet_exit_policy of type zscaler. + """ + if get(internet_exit_policy, "type") != "zscaler": + return [] + + policy_name = internet_exit_policy["name"] + + cloud_name = get(self._zscaler_endpoints, "cloud_name", required=True) + connections = [] + + # Check if the policy has any local interface + for wan_interface in self.shared_utils.wan_interfaces: + wan_interface_internet_exit_policies = get(wan_interface, "cv_pathfinder_internet_exit.policies", default=[]) + if (interface_policy_config := get_item(wan_interface_internet_exit_policies, "name", internet_exit_policy["name"])) is None: + continue + + connection_base = { + "type": "tunnel", + "source_interface": wan_interface["name"], + "next_hop": get( + wan_interface, + "peer_ip", + required=True, + org_key=f"The configured internet-exit policy requires `peer_ip` configured under the WAN Interface {wan_interface['name']}", + ), + # Accepting SonarLint issue: The URL is just for verifying connectivity. No data is passed. + "monitor_url": f"http://gateway.{cloud_name}.net/vpntest", # NOSONAR + } + + tunnel_interface_numbers = get(interface_policy_config, "tunnel_interface_numbers") + if tunnel_interface_numbers is None: + raise AristaAvdMissingVariableError( + f"{wan_interface['name']}.cv_pathfinder_internet_exit.policies[{internet_exit_policy['name']}]." + "tunnel_interface_numbers needs to be set, when using wan interface for zscaler type internet exit." + ) + + tunnel_id_range = range_expand(tunnel_interface_numbers) + + zscaler_endpoint_keys = ("primary", "secondary", "tertiary") + for index, zscaler_endpoint_key in enumerate(zscaler_endpoint_keys): + if zscaler_endpoint_key not in self._zscaler_endpoints: + continue + + zscaler_endpoint = self._zscaler_endpoints[zscaler_endpoint_key] + + # PRI, SEC, TER used for groups + # TODO: consider if we should use DC names as group suffix. + suffix = zscaler_endpoint_key[0:3].upper() + + destination_ip = zscaler_endpoint["ip_address"] + tunnel_id = tunnel_id_range[index] + connections.append( + { + **connection_base, + "name": f"IE-Tunnel{tunnel_id}", + "monitor_name": f"IE-Tunnel{tunnel_id}", + "monitor_host": destination_ip, + "tunnel_id": tunnel_id, + # Using Loopback0 as source interface as using the WAN interface causes issues for DPS. + "tunnel_ip_address": "unnumbered Loopback0", + "tunnel_destination_ip": destination_ip, + "ipsec_profile": f"IE-{policy_name}-PROFILE", + "description": f"Internet Exit {policy_name} {suffix}", + "exit_group": f"{policy_name}_{suffix}", + "preference": zscaler_endpoint_key, + "suffix": suffix, + } + ) + + return connections + + def _get_ipsec_credentials(self: AvdStructuredConfigNetworkServices, internet_exit_policy: dict) -> tuple[str, str]: + """ + Returns ufqdn, shared_key based on various details from the given internet_exit_policy. + """ + policy_name = internet_exit_policy["name"] + domain_name = get(internet_exit_policy, "zscaler.domain_name", required=True) + ipsec_key_salt = get(internet_exit_policy, "zscaler.ipsec_key_salt", required=True) + ipsec_key = self._generate_ipsec_key(name=policy_name, salt=ipsec_key_salt) + ufqdn = f"{self.shared_utils.hostname}_{policy_name}@{domain_name}" + return ufqdn, ipsec_key + + def _generate_ipsec_key(self: AvdStructuredConfigNetworkServices, name: str, salt: str) -> str: + """ + Build a secret containing various components for this policy and device. + Run type-7 obfuscation using a algorithmic salt so we ensure the same key every time. + + TODO: Maybe introduce some formatting with max length of each element, since the keys can be come very very long. + """ + secret = "_".join((self.shared_utils.hostname, name, salt)) + type_7_salt = sum(salt.encode("utf-8")) % 16 + return simple_7_encrypt(secret, type_7_salt) diff --git a/python-avd/pyavd/_eos_designs/structured_config/network_services/utils_zscaler.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/utils_zscaler.py new file mode 100644 index 00000000000..983bbdb03a3 --- /dev/null +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/utils_zscaler.py @@ -0,0 +1,107 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import annotations + +import asyncio +from functools import cached_property +from logging import getLogger +from typing import TYPE_CHECKING + +from ...._cv.client import CVClient +from ...._cv.workflows.models import CVDevice +from ...._cv.workflows.verify_devices_on_cv import verify_devices_in_cloudvision_inventory +from ...._errors import AristaAvdError +from ...._utils import get + +if TYPE_CHECKING: + from ...._cv.api.arista.swg.v1 import Location, VpnEndpoint + from . import AvdStructuredConfigNetworkServices + +LOGGER = getLogger(__name__) + + +class UtilsZscalerMixin: + """ + Mixin Class with internal functions. + Class should only be used as Mixin to a AvdStructuredConfig class + """ + + @cached_property + def _zscaler_endpoints(self: AvdStructuredConfigNetworkServices) -> dict: + """ + Returns zscaler_endpoints data model built via CloudVision API calls, unless they are provided in the input variables. + + Should only be called for CV Pathfinder Client devices. + """ + zscaler_endpoints = get(self._hostvars, "zscaler_endpoints") + if zscaler_endpoints is not None: + return zscaler_endpoints + + return asyncio.run(self._generate_zscaler_endpoints()) or {} + + async def _generate_zscaler_endpoints(self: AvdStructuredConfigNetworkServices): + """ + Call CloudVision SWG APIs to generate the zscaler_endpoints model. + + Should only be called for CV Pathfinder Client devices. + + TODO: Add support for cv_verify_certs + """ + context = "The WAN Internet-exit integration with Zscaler fetches information from CloudVision" + cv_server = get(self._hostvars, "cv_server", required=True, org_key=f"{context} and requires 'cv_server' to be set.") + cv_token = get(self._hostvars, "cv_token", required=True, org_key=f"{context} and requires 'cv_server' to be set.") + wan_site_location = get( + self.shared_utils.wan_site, + "location", + required=True, + org_key=( + f"{context} and requires 'cv_pathfinder_regions[name={self.shared_utils.wan_region['name']}]" + f".sites[name={self.shared_utils.wan_site['name']}].location' to be set." + ), + ) + + async with CVClient(servers=[cv_server], token=cv_token) as cv_client: + cv_device = CVDevice(self.shared_utils.hostname, self.shared_utils.serial_number, self.shared_utils.system_mac_address) + cv_inventory_devices: list[CVDevice] = await verify_devices_in_cloudvision_inventory( + devices=[cv_device], skip_missing_devices=True, warnings=[], cv_client=cv_client + ) + if not cv_inventory_devices: + raise AristaAvdError(f"{context} but could not find '{self.shared_utils.hostname}' on the server '{cv_server}'.") + if len(cv_inventory_devices) > 1: + raise AristaAvdError( + ( + f"{context} but found more than one device named '{self.shared_utils.hostname}' on the server '{cv_server}'. " + "Set 'serial_number' for the device in AVD vars, to ensure a unique match." + ) + ) + device_id: str = cv_inventory_devices[0].serial_number + request_time, _ = await cv_client.set_swg_device(device_id=device_id, service="zscaler", location=wan_site_location) + cv_endpoint_status = await cv_client.wait_for_swg_endpoint_status(device_id=device_id, service="zscaler", start_time=request_time) + + device_location: Location = cv_endpoint_status.device_location + + zscaler_endpoints = { + "cloud_name": cv_endpoint_status.cloud_name, + "device_location": { + "city": device_location.city, + "country": device_location.country, + }, + } + if not getattr(cv_endpoint_status, "vpn_endpoints", None) or not getattr(cv_endpoint_status.vpn_endpoints, "values", None): + raise AristaAvdError(f"{context} but did not get any IPsec Tunnel endpoints back from the Zscaler API.") + + for key in ("primary", "secondary", "tertiary"): + if key in cv_endpoint_status.vpn_endpoints.values: + vpn_endpoint: VpnEndpoint = cv_endpoint_status.vpn_endpoints.values[key] + location: Location = vpn_endpoint.endpoint_location + zscaler_endpoints[key] = { + "ip_address": vpn_endpoint.ip_address.value, + "datacenter": vpn_endpoint.datacenter, + "city": location.city, + "country": location.country, + "latitude": location.latitude, + "longitude": location.longitude, + } + + return zscaler_endpoints diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/virtual_source_nat_vrfs.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/virtual_source_nat_vrfs.py similarity index 88% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/virtual_source_nat_vrfs.py rename to python-avd/pyavd/_eos_designs/structured_config/network_services/virtual_source_nat_vrfs.py index ba2ea924a30..f339276b836 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/virtual_source_nat_vrfs.py +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/virtual_source_nat_vrfs.py @@ -4,11 +4,14 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.utils import append_if_not_duplicate - +from ...._utils import append_if_not_duplicate from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigNetworkServices + class VirtualSourceNatVrfsMixin(UtilsMixin): """ @@ -16,11 +19,8 @@ class VirtualSourceNatVrfsMixin(UtilsMixin): Class should only be used as Mixin to a AvdStructuredConfig class """ - # Set type hints for Attributes of the main class as needed - loopback_interfaces: dict - @cached_property - def virtual_source_nat_vrfs(self) -> list | None: + def virtual_source_nat_vrfs(self: AvdStructuredConfigNetworkServices) -> list | None: """ Return structured config for virtual_source_nat_vrfs diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/vlan_interfaces.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/vlan_interfaces.py similarity index 91% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/vlan_interfaces.py rename to python-avd/pyavd/_eos_designs/structured_config/network_services/vlan_interfaces.py index 1214ba551a8..9881b7914ae 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/vlan_interfaces.py +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/vlan_interfaces.py @@ -4,13 +4,15 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdMissingVariableError -from ansible_collections.arista.avd.plugins.plugin_utils.strip_empties import strip_empties_from_dict -from ansible_collections.arista.avd.plugins.plugin_utils.utils import append_if_not_duplicate, default, get - +from ...._errors import AristaAvdMissingVariableError +from ...._utils import append_if_not_duplicate, default, get, strip_empties_from_dict from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigNetworkServices + class VlanInterfacesMixin(UtilsMixin): """ @@ -19,7 +21,7 @@ class VlanInterfacesMixin(UtilsMixin): """ @cached_property - def vlan_interfaces(self) -> list | None: + def vlan_interfaces(self: AvdStructuredConfigNetworkServices) -> list | None: """ Return structured config for vlan_interfaces @@ -63,7 +65,7 @@ def vlan_interfaces(self) -> list | None: return None - def _get_vlan_interface_config_for_svi(self, svi, vrf) -> dict: + def _get_vlan_interface_config_for_svi(self: AvdStructuredConfigNetworkServices, svi, vrf) -> dict: def _check_virtual_router_mac_address(vlan_interface_config: dict, variables: list): """ Check if any variable in the list of variables is not None in vlan_interface_config @@ -78,8 +80,9 @@ def _check_virtual_router_mac_address(vlan_interface_config: dict, variables: li f"'virtual_router_mac_address' must be set for node '{self.shared_utils.hostname}' when using {' or '.join(quoted_vars)} under 'svi'" ) + interface_name = f"Vlan{svi['id']}" vlan_interface_config = { - "name": f"Vlan{int(svi['id'])}", + "name": interface_name, "tenant": svi["tenant"], "tags": svi.get("tags"), "description": default(svi.get("description"), svi["name"]), @@ -87,6 +90,8 @@ def _check_virtual_router_mac_address(vlan_interface_config: dict, variables: li "ip_address": svi.get("ip_address"), "ipv6_address": svi.get("ipv6_address"), "ipv6_enable": svi.get("ipv6_enable"), + "access_group_in": get(self._svi_acls, f"{interface_name}.ipv4_acl_in.name"), + "access_group_out": get(self._svi_acls, f"{interface_name}.ipv4_acl_out.name"), "mtu": svi.get("mtu") if self.shared_utils.platform_settings_feature_support_per_interface_mtu else None, "eos_cli": svi.get("raw_eos_cli"), "struct_cfg": svi.get("structured_config"), @@ -148,7 +153,7 @@ def _check_virtual_router_mac_address(vlan_interface_config: dict, variables: li return strip_empties_from_dict(vlan_interface_config) - def _get_vlan_interface_config_for_mlag_peering(self, vrf) -> dict: + def _get_vlan_interface_config_for_mlag_peering(self: AvdStructuredConfigNetworkServices, vrf) -> dict: """ Build config for MLAG peering SVI for the given SVI. Called from vlan_interfaces and prefix_lists diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/vlans.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/vlans.py similarity index 91% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/vlans.py rename to python-avd/pyavd/_eos_designs/structured_config/network_services/vlans.py index a48b7b5a43c..80da7e8c09f 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/vlans.py +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/vlans.py @@ -4,12 +4,15 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.filter.natural_sort import natural_sort -from ansible_collections.arista.avd.plugins.plugin_utils.utils import append_if_not_duplicate - +from ...._utils import append_if_not_duplicate +from ....j2filters import natural_sort from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigNetworkServices + class VlansMixin(UtilsMixin): """ @@ -18,7 +21,7 @@ class VlansMixin(UtilsMixin): """ @cached_property - def vlans(self) -> list | None: + def vlans(self: AvdStructuredConfigNetworkServices) -> list | None: """ Return structured config for vlans. @@ -77,7 +80,7 @@ def vlans(self) -> list | None: return None - def _get_vlan_config(self, vlan) -> dict: + def _get_vlan_config(self: AvdStructuredConfigNetworkServices, vlan) -> dict: """ Return structured config for one given vlan diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/vrfs.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/vrfs.py similarity index 89% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/vrfs.py rename to python-avd/pyavd/_eos_designs/structured_config/network_services/vrfs.py index 7044b538520..9f02180eadf 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/vrfs.py +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/vrfs.py @@ -4,11 +4,14 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.utils import append_if_not_duplicate - +from ...._utils import append_if_not_duplicate from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigNetworkServices + class VrfsMixin(UtilsMixin): """ @@ -17,7 +20,7 @@ class VrfsMixin(UtilsMixin): """ @cached_property - def vrfs(self) -> list | None: + def vrfs(self: AvdStructuredConfigNetworkServices) -> list | None: """ Return structured config for vrfs. @@ -69,7 +72,7 @@ def vrfs(self) -> list | None: return None - def _has_ipv6(self, vrf) -> bool: + def _has_ipv6(self: AvdStructuredConfigNetworkServices, vrf) -> bool: """ Return bool if IPv6 is configured in the given VRF. diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/vxlan_interface.py b/python-avd/pyavd/_eos_designs/structured_config/network_services/vxlan_interface.py similarity index 92% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/vxlan_interface.py rename to python-avd/pyavd/_eos_designs/structured_config/network_services/vxlan_interface.py index 9b2e5c6eb49..f70c552f647 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/network_services/vxlan_interface.py +++ b/python-avd/pyavd/_eos_designs/structured_config/network_services/vxlan_interface.py @@ -4,15 +4,16 @@ from __future__ import annotations from functools import cached_property -from typing import NoReturn - -from ansible_collections.arista.avd.plugins.filter.natural_sort import natural_sort -from ansible_collections.arista.avd.plugins.filter.range_expand import range_expand -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError, AristaAvdMissingVariableError -from ansible_collections.arista.avd.plugins.plugin_utils.utils import append_if_not_duplicate, default, get, get_item, unique +from typing import TYPE_CHECKING, NoReturn +from ...._errors import AristaAvdError, AristaAvdMissingVariableError +from ...._utils import append_if_not_duplicate, default, get, get_item, unique +from ....j2filters import natural_sort, range_expand from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigNetworkServices + class VxlanInterfaceMixin(UtilsMixin): """ @@ -20,11 +21,8 @@ class VxlanInterfaceMixin(UtilsMixin): Class should only be used as Mixin to a AvdStructuredConfig class """ - # Set type hints for Attributes of the main class as needed - _hostvars: dict - @cached_property - def vxlan_interface(self) -> dict | None: + def vxlan_interface(self: AvdStructuredConfigNetworkServices) -> dict | None: """ Returns structured config for vxlan_interface @@ -122,7 +120,7 @@ def vxlan_interface(self) -> dict | None: } } - def _get_vxlan_interface_config_for_vrf(self, vrf: dict, tenant: dict, vrfs: list, vlans: list, vnis: list) -> None: + def _get_vxlan_interface_config_for_vrf(self: AvdStructuredConfigNetworkServices, vrf: dict, tenant: dict, vrfs: list, vlans: list, vnis: list) -> None: """ In place updates of the vlans, vnis and vrfs list """ @@ -210,7 +208,7 @@ def _get_vxlan_interface_config_for_vrf(self, vrf: dict, tenant: dict, vrfs: lis context_keys=["name", "vni"], ) - def _get_vxlan_interface_config_for_vlan(self, vlan, tenant) -> dict: + def _get_vxlan_interface_config_for_vlan(self: AvdStructuredConfigNetworkServices, vlan, tenant) -> dict: """ vxlan_interface logic for one vlan @@ -248,11 +246,11 @@ def _get_vxlan_interface_config_for_vlan(self, vlan, tenant) -> dict: return vxlan_interface_vlan @cached_property - def _overlay_her_flood_list_per_vni(self) -> bool: + def _overlay_her_flood_list_per_vni(self: AvdStructuredConfigNetworkServices) -> bool: return get(self._hostvars, "overlay_her_flood_list_per_vni") is True @cached_property - def _overlay_her_flood_lists(self) -> dict[list]: + def _overlay_her_flood_lists(self: AvdStructuredConfigNetworkServices) -> dict[list]: """ Returns a dict with HER Flood Lists. @@ -299,7 +297,7 @@ def _overlay_her_flood_lists(self) -> dict[list]: return overlay_her_flood_lists - def _raise_duplicate_vni_error(self, vni: int, context: str, tenant: str, duplicate_vni_tenant: str) -> NoReturn: + def _raise_duplicate_vni_error(self: AvdStructuredConfigNetworkServices, vni: int, context: str, tenant: str, duplicate_vni_tenant: str) -> NoReturn: msg = f"Duplicate VXLAN VNI '{vni}' found in Tenant(s) '{tenant}' during configuration of {context}." if duplicate_vni_tenant != tenant: msg = f"{msg} Other VNI is in Tenant(s) '{duplicate_vni_tenant}'." @@ -307,5 +305,5 @@ def _raise_duplicate_vni_error(self, vni: int, context: str, tenant: str, duplic raise AristaAvdError(msg) @cached_property - def _multi_vtep(self) -> bool: + def _multi_vtep(self: AvdStructuredConfigNetworkServices) -> bool: return self.shared_utils.mlag is True and self.shared_utils.evpn_multicast is True diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/avdstructuredconfig.py b/python-avd/pyavd/_eos_designs/structured_config/overlay/__init__.py similarity index 93% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/avdstructuredconfig.py rename to python-avd/pyavd/_eos_designs/structured_config/overlay/__init__.py index 23d55036f48..f21e7ddd076 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/avdstructuredconfig.py +++ b/python-avd/pyavd/_eos_designs/structured_config/overlay/__init__.py @@ -1,10 +1,8 @@ # Copyright (c) 2023-2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. -from ansible_collections.arista.avd.plugins.plugin_utils.avdfacts import AvdFacts - +from ...avdfacts import AvdFacts from .cvx import CvxMixin -from .flow_tracking import FlowTrackingMixin from .ip_extcommunity_lists import IpExtCommunityListsMixin from .ip_security import IpSecurityMixin from .management_cvx import ManagementCvxMixin @@ -21,7 +19,6 @@ class AvdStructuredConfigOverlay( AvdFacts, CvxMixin, - FlowTrackingMixin, IpExtCommunityListsMixin, IpSecurityMixin, ManagementCvxMixin, @@ -42,7 +39,7 @@ class AvdStructuredConfigOverlay( a dict with the name of the method as key. This means that each key in the final dict corresponds to a method. The Class uses AvdFacts, as the base class, to get the render, keys and other attributes. - All other methods are included as "Mixins" to make the files more managable. + All other methods are included as "Mixins" to make the files more manageable. The order of the @cached_properties methods imported from Mixins will also control the order in the output. """ diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/cvx.py b/python-avd/pyavd/_eos_designs/structured_config/overlay/cvx.py similarity index 86% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/cvx.py rename to python-avd/pyavd/_eos_designs/structured_config/overlay/cvx.py index cffb61f44f7..c32a8e77649 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/cvx.py +++ b/python-avd/pyavd/_eos_designs/structured_config/overlay/cvx.py @@ -5,11 +5,14 @@ from functools import cached_property from ipaddress import ip_interface +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get - +from ...._utils import get from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigOverlay + class CvxMixin(UtilsMixin): """ @@ -18,11 +21,11 @@ class CvxMixin(UtilsMixin): """ @cached_property - def cvx(self) -> dict | None: + def cvx(self: AvdStructuredConfigOverlay) -> dict | None: """ Detect if this is a CVX server for overlay and configure service & peer hosts accordingly. """ - if not (self.shared_utils.overlay_cvx): + if not self.shared_utils.overlay_cvx: return None overlay_cvx_servers = get(self._hostvars, "overlay_cvx_servers", default=[]) diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/ip_extcommunity_lists.py b/python-avd/pyavd/_eos_designs/structured_config/overlay/ip_extcommunity_lists.py similarity index 86% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/ip_extcommunity_lists.py rename to python-avd/pyavd/_eos_designs/structured_config/overlay/ip_extcommunity_lists.py index 0d1ea693337..7111bee46d4 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/ip_extcommunity_lists.py +++ b/python-avd/pyavd/_eos_designs/structured_config/overlay/ip_extcommunity_lists.py @@ -4,9 +4,13 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigOverlay + class IpExtCommunityListsMixin(UtilsMixin): """ @@ -15,7 +19,7 @@ class IpExtCommunityListsMixin(UtilsMixin): """ @cached_property - def ip_extcommunity_lists(self) -> list | None: + def ip_extcommunity_lists(self: AvdStructuredConfigOverlay) -> list | None: """ Return structured config for ip_extcommunity_lists """ diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/ip_security.py b/python-avd/pyavd/_eos_designs/structured_config/overlay/ip_security.py similarity index 85% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/ip_security.py rename to python-avd/pyavd/_eos_designs/structured_config/overlay/ip_security.py index b5de24805ab..247a92301dd 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/ip_security.py +++ b/python-avd/pyavd/_eos_designs/structured_config/overlay/ip_security.py @@ -4,12 +4,14 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.strip_empties import strip_null_from_data -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get - +from ...._utils import get, strip_null_from_data from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigOverlay + class IpSecurityMixin(UtilsMixin): """ @@ -18,7 +20,7 @@ class IpSecurityMixin(UtilsMixin): """ @cached_property - def ip_security(self) -> dict | None: + def ip_security(self: AvdStructuredConfigOverlay) -> dict | None: """ ip_security set based on wan_ipsec_profiles data_model @@ -42,7 +44,7 @@ def ip_security(self) -> dict | None: return strip_null_from_data(ip_security) - def _append_data_plane(self, ip_security: dict, data_plane_config: dict) -> None: + def _append_data_plane(self: AvdStructuredConfigOverlay, ip_security: dict, data_plane_config: dict) -> None: """ In place update of ip_security """ @@ -63,7 +65,7 @@ def _append_data_plane(self, ip_security: dict, data_plane_config: dict) -> None # For data plane, adding key_controller by default ip_security["key_controller"] = self._key_controller(profile_name) - def _append_control_plane(self, ip_security: dict, control_plane_config: dict) -> None: + def _append_control_plane(self: AvdStructuredConfigOverlay, ip_security: dict, control_plane_config: dict) -> None: """ In place update of ip_security for control plane data @@ -82,7 +84,7 @@ def _append_control_plane(self, ip_security: dict, control_plane_config: dict) - # If there is not data plane IPSec profile, use the control plane one for key controller ip_security["key_controller"] = self._key_controller(profile_name) - def _ike_policy(self, name: str) -> dict | None: + def _ike_policy(self: AvdStructuredConfigOverlay, name: str) -> dict | None: """ Return an IKE policy """ @@ -91,7 +93,7 @@ def _ike_policy(self, name: str) -> dict | None: "local_id": self.shared_utils.vtep_ip, } - def _sa_policy(self, name: str) -> dict | None: + def _sa_policy(self: AvdStructuredConfigOverlay, name: str) -> dict | None: """ Return an SA policy @@ -104,7 +106,7 @@ def _sa_policy(self, name: str) -> dict | None: sa_policy["pfs_dh_group"] = 14 return sa_policy - def _profile(self, profile_name: str, ike_policy_name: str | None, sa_policy_name: str, key: str) -> dict | None: + def _profile(self: AvdStructuredConfigOverlay, profile_name: str, ike_policy_name: str | None, sa_policy_name: str, key: str) -> dict | None: """ Return one IPsec Profile @@ -127,7 +129,7 @@ def _profile(self, profile_name: str, ike_policy_name: str | None, sa_policy_nam "mode": "transport", } - def _key_controller(self, profile_name: str) -> dict | None: + def _key_controller(self: AvdStructuredConfigOverlay, profile_name: str) -> dict | None: """ Return a key_controller structure if the device is not a RR or pathfinder """ diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/management_cvx.py b/python-avd/pyavd/_eos_designs/structured_config/overlay/management_cvx.py similarity index 86% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/management_cvx.py rename to python-avd/pyavd/_eos_designs/structured_config/overlay/management_cvx.py index 14d875b0269..525228122d7 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/management_cvx.py +++ b/python-avd/pyavd/_eos_designs/structured_config/overlay/management_cvx.py @@ -5,11 +5,14 @@ from functools import cached_property from ipaddress import ip_interface +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get - +from ...._utils import get from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigOverlay + class ManagementCvxMixin(UtilsMixin): """ @@ -18,7 +21,7 @@ class ManagementCvxMixin(UtilsMixin): """ @cached_property - def management_cvx(self) -> dict | None: + def management_cvx(self: AvdStructuredConfigOverlay) -> dict | None: if not (self.shared_utils.overlay_cvx and self.shared_utils.overlay_vtep): return None diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/management_security.py b/python-avd/pyavd/_eos_designs/structured_config/overlay/management_security.py similarity index 87% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/management_security.py rename to python-avd/pyavd/_eos_designs/structured_config/overlay/management_security.py index cb2bb43a29e..e309c209f2b 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/management_security.py +++ b/python-avd/pyavd/_eos_designs/structured_config/overlay/management_security.py @@ -4,9 +4,13 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigOverlay + class ManagementSecurityMixin(UtilsMixin): """ @@ -15,7 +19,7 @@ class ManagementSecurityMixin(UtilsMixin): """ @cached_property - def management_security(self) -> dict | None: + def management_security(self: AvdStructuredConfigOverlay) -> dict | None: """ Return structured config for management_security. diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/route_maps.py b/python-avd/pyavd/_eos_designs/structured_config/overlay/route_maps.py similarity index 62% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/route_maps.py rename to python-avd/pyavd/_eos_designs/structured_config/overlay/route_maps.py index 304660c4d5e..b28dd9b7f0f 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/route_maps.py +++ b/python-avd/pyavd/_eos_designs/structured_config/overlay/route_maps.py @@ -4,11 +4,14 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.filter.natural_sort import natural_sort - +from ....j2filters import natural_sort from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigOverlay + class RouteMapsMixin(UtilsMixin): """ @@ -17,7 +20,7 @@ class RouteMapsMixin(UtilsMixin): """ @cached_property - def route_maps(self) -> list | None: + def route_maps(self: AvdStructuredConfigOverlay) -> list | None: """ Return structured config for route_maps """ @@ -67,6 +70,7 @@ def route_maps(self) -> list | None: ], } ) + route_maps.append( { "name": "RM-EVPN-SOO-OUT", @@ -80,6 +84,41 @@ def route_maps(self) -> list | None: } ) + if self.shared_utils.wan_ha: + route_maps.append( + { + "name": "RM-WAN-HA-PEER-IN", + "sequence_numbers": [ + { + "sequence": 10, + "type": "permit", + "description": "Set tag 50 on routes received from HA peer over EVPN", + "set": ["tag 50"], + }, + ], + } + ) + route_maps.append( + { + "name": "RM-WAN-HA-PEER-OUT", + "sequence_numbers": [ + { + "sequence": 10, + "type": "permit", + "description": "Make EVPN routes learned from WAN less preferred on HA peer", + "match": ["route-type internal"], + "set": ["local-preference 50"], + }, + { + "sequence": 20, + "type": "permit", + "description": "Make locally injected routes less preferred on HA peer", + "set": ["local-preference 75"], + }, + ], + } + ) + if route_maps: return route_maps diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/router_adaptive_virtual_topology.py b/python-avd/pyavd/_eos_designs/structured_config/overlay/router_adaptive_virtual_topology.py similarity index 87% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/router_adaptive_virtual_topology.py rename to python-avd/pyavd/_eos_designs/structured_config/overlay/router_adaptive_virtual_topology.py index daf91ad3905..fcaffb3db9b 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/router_adaptive_virtual_topology.py +++ b/python-avd/pyavd/_eos_designs/structured_config/overlay/router_adaptive_virtual_topology.py @@ -4,9 +4,13 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigOverlay + class RouterAdaptiveVirtualTopologyMixin(UtilsMixin): """ @@ -15,7 +19,7 @@ class RouterAdaptiveVirtualTopologyMixin(UtilsMixin): """ @cached_property - def router_adaptive_virtual_topology(self) -> dict | None: + def router_adaptive_virtual_topology(self: AvdStructuredConfigOverlay) -> dict | None: """ Return structured config for router adaptive-virtual-topology (AVT) """ diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/router_bfd.py b/python-avd/pyavd/_eos_designs/structured_config/overlay/router_bfd.py similarity index 78% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/router_bfd.py rename to python-avd/pyavd/_eos_designs/structured_config/overlay/router_bfd.py index 0267ef47dce..9fc0150d081 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/router_bfd.py +++ b/python-avd/pyavd/_eos_designs/structured_config/overlay/router_bfd.py @@ -4,11 +4,14 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.strip_empties import strip_empties_from_dict - +from ...._utils import strip_empties_from_dict from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigOverlay + class RouterBfdMixin(UtilsMixin): """ @@ -17,7 +20,7 @@ class RouterBfdMixin(UtilsMixin): """ @cached_property - def router_bfd(self) -> dict | None: + def router_bfd(self: AvdStructuredConfigOverlay) -> dict | None: """ return structured config for router_bfd """ diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/router_bgp.py b/python-avd/pyavd/_eos_designs/structured_config/overlay/router_bgp.py similarity index 87% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/router_bgp.py rename to python-avd/pyavd/_eos_designs/structured_config/overlay/router_bgp.py index 219fa55d7a1..3ffcf68427e 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/router_bgp.py +++ b/python-avd/pyavd/_eos_designs/structured_config/overlay/router_bgp.py @@ -5,14 +5,16 @@ import ipaddress from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.filter.natural_sort import natural_sort -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError -from ansible_collections.arista.avd.plugins.plugin_utils.strip_empties import strip_empties_from_dict -from ansible_collections.arista.avd.plugins.plugin_utils.utils import default, get, get_item - +from ...._errors import AristaAvdError +from ...._utils import default, get, get_item, strip_empties_from_dict +from ....j2filters import natural_sort from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigOverlay + class RouterBgpMixin(UtilsMixin): """ @@ -21,7 +23,7 @@ class RouterBgpMixin(UtilsMixin): """ @cached_property - def router_bgp(self) -> dict | None: + def router_bgp(self: AvdStructuredConfigOverlay) -> dict | None: """ Return the structured config for router_bgp """ @@ -47,13 +49,13 @@ def router_bgp(self) -> dict | None: # Need to keep potentially empty dict for redistribute_routes return strip_empties_from_dict(router_bgp, strip_values_tuple=(None, "")) - def _bgp_cluster_id(self) -> str | None: + def _bgp_cluster_id(self: AvdStructuredConfigOverlay) -> str | None: if self.shared_utils.overlay_routing_protocol == "ibgp": if self.shared_utils.evpn_role == "server" or self.shared_utils.mpls_overlay_role == "server": return get(self.shared_utils.switch_data_combined, "bgp_cluster_id", default=self.shared_utils.router_id) return None - def _bgp_listen_ranges(self) -> list | None: + def _bgp_listen_ranges(self: AvdStructuredConfigOverlay) -> list | None: """ Generate listen-ranges. Currently only supported for WAN RR. """ @@ -69,7 +71,9 @@ def _bgp_listen_ranges(self) -> list | None: for prefix in self.shared_utils.wan_listen_ranges ] or None - def _generate_base_peer_group(self, pg_type: str, pg_name: str, maximum_routes: int = 0, update_source: str = "Loopback0") -> dict: + def _generate_base_peer_group( + self: AvdStructuredConfigOverlay, pg_type: str, pg_name: str, maximum_routes: int = 0, update_source: str = "Loopback0" + ) -> dict: return { "name": self.shared_utils.bgp_peer_groups[pg_name]["name"], "type": pg_type, @@ -81,7 +85,7 @@ def _generate_base_peer_group(self, pg_type: str, pg_name: str, maximum_routes: "struct_cfg": self.shared_utils.bgp_peer_groups[pg_name]["structured_config"], } - def _peer_groups(self) -> list | None: + def _peer_groups(self: AvdStructuredConfigOverlay) -> list | None: """ """ peer_groups = [] @@ -150,9 +154,13 @@ def _peer_groups(self) -> list | None: if self._is_wan_server_with_peers: wan_rr_overlay_peer_group = self._generate_base_peer_group("wan", "wan_rr_overlay_peers", update_source=self.shared_utils.vtep_loopback) wan_rr_overlay_peer_group.update( - {"remote_as": self.shared_utils.bgp_as, "ttl_maximum_hops": self.shared_utils.bgp_peer_groups["wan_rr_overlay_peers"]["ttl_maximum_hops"]} + { + "remote_as": self.shared_utils.bgp_as, + "ttl_maximum_hops": self.shared_utils.bgp_peer_groups["wan_rr_overlay_peers"]["ttl_maximum_hops"], + "bfd_timers": get(self.shared_utils.bgp_peer_groups["wan_rr_overlay_peers"], "bfd_timers"), + "route_reflector_client": True, + } ) - wan_rr_overlay_peer_group["bfd_timers"] = get(self.shared_utils.bgp_peer_groups["wan_rr_overlay_peers"], "bfd_timers") peer_groups.append(wan_rr_overlay_peer_group) # same for ebgp and ibgp @@ -167,7 +175,7 @@ def _peer_groups(self) -> list | None: return peer_groups - def _address_family_ipv4(self) -> dict: + def _address_family_ipv4(self: AvdStructuredConfigOverlay) -> dict: """ deactivate the relevant peer_groups in address_family_ipv4 """ @@ -199,7 +207,7 @@ def _address_family_ipv4(self) -> dict: return {"peer_groups": peer_groups} - def _address_family_evpn(self) -> dict: + def _address_family_evpn(self: AvdStructuredConfigOverlay) -> dict: """ """ address_family_evpn = {} @@ -276,9 +284,19 @@ def _address_family_evpn(self) -> dict: if self.shared_utils.is_wan_server: address_family_evpn["next_hop"] = {"resolution_disabled": True} + + # Activitating HA iBGP session for WAN HA + if self.shared_utils.wan_ha: + address_family_evpn["neighbor_default"] = { + "next_hop_self_received_evpn_routes": { + "enable": True, + } + } + address_family_evpn["neighbors"] = [{"ip_address": self._wan_ha_peer_vtep_ip(), "activate": True}] + return address_family_evpn - def _address_family_ipv4_sr_te(self) -> dict | None: + def _address_family_ipv4_sr_te(self: AvdStructuredConfigOverlay) -> dict | None: """Generate structured config for IPv4 SR-TE address family""" if not self.shared_utils.is_cv_pathfinder_router: return None @@ -297,7 +315,7 @@ def _address_family_ipv4_sr_te(self) -> dict | None: return address_family_ipv4_sr_te - def _address_family_link_state(self) -> dict | None: + def _address_family_link_state(self: AvdStructuredConfigOverlay) -> dict | None: """Generate structured config for link-state address family""" if not self.shared_utils.is_cv_pathfinder_router: return None @@ -328,7 +346,7 @@ def _address_family_link_state(self) -> dict | None: return address_family_link_state - def _address_family_path_selection(self) -> dict | None: + def _address_family_path_selection(self: AvdStructuredConfigOverlay) -> dict | None: """ """ if not self.shared_utils.is_wan_router: return None @@ -348,7 +366,7 @@ def _address_family_path_selection(self) -> dict | None: return address_family_path_selection - def _address_family_rtc(self) -> dict | None: + def _address_family_rtc(self: AvdStructuredConfigOverlay) -> dict | None: """ Activate EVPN OVERLAY peer group and EVPN OVERLAY CORE peer group (if present) in address_family_rtc @@ -368,7 +386,7 @@ def _address_family_rtc(self) -> dict | None: if self.shared_utils.overlay_routing_protocol == "ebgp": if self.shared_utils.evpn_gateway_vxlan_l2 is True or self.shared_utils.evpn_gateway_vxlan_l3 is True: core_peer_group = {"name": self.shared_utils.bgp_peer_groups["evpn_overlay_core"]["name"], "activate": True} - # TODO @Claus told me to remove this + # TODO (@Claus) told me to remove this if self.shared_utils.evpn_role == "server": core_peer_group["default_route_target"] = {"only": True} peer_groups.append(core_peer_group) @@ -394,7 +412,7 @@ def _address_family_rtc(self) -> dict | None: return address_family_rtc - def _address_family_vpn_ipvx(self, version: int) -> dict | None: + def _address_family_vpn_ipvx(self: AvdStructuredConfigOverlay, version: int) -> dict | None: if version not in [4, 6]: raise AristaAvdError("_address_family_vpn_ipvx should be called with version 4 or 6 only") @@ -426,19 +444,24 @@ def _address_family_vpn_ipvx(self, version: int) -> dict | None: return address_family_vpn_ipvx - def _create_neighbor(self, ip_address: str, name: str, peer_group: str, remote_as: str = None) -> dict: + def _create_neighbor(self: AvdStructuredConfigOverlay, ip_address: str, name: str, peer_group: str, remote_as: str | None = None) -> dict: """ """ neighbor = {"ip_address": ip_address, "peer_group": peer_group, "peer": name, "description": name} if self.shared_utils.overlay_routing_protocol == "ebgp": if remote_as is None: - raise AristaAvdError("Configuring eBGP neighor without a remote_as") + raise AristaAvdError("Configuring eBGP neighbor without a remote_as") neighbor["remote_as"] = remote_as + if self.shared_utils.shutdown_bgp_towards_undeployed_peers is True and name in self._avd_overlay_peers: + peer_facts = self.shared_utils.get_peer_facts(name) + if peer_facts["is_deployed"] is False: + neighbor["shutdown"] = True + return neighbor - def _neighbors(self) -> list | None: + def _neighbors(self: AvdStructuredConfigOverlay) -> list | None: """ """ neighbors = [] @@ -501,6 +524,21 @@ def _neighbors(self) -> list | None: for wan_route_server, data in self.shared_utils.filtered_wan_route_servers.items(): neighbor = self._create_neighbor(data["vtep_ip"], wan_route_server, self.shared_utils.bgp_peer_groups["wan_overlay_peers"]["name"]) neighbors.append(neighbor) + + if self.shared_utils.wan_ha: + neighbor = { + "ip_address": self._wan_ha_peer_vtep_ip(), + "peer": self.shared_utils.wan_ha_peer, + "description": self.shared_utils.wan_ha_peer, + "remote_as": self.shared_utils.bgp_as, + "update_source": "Dps1", + "route_reflector_client": True, + "send_community": "all", + "route_map_in": "RM-WAN-HA-PEER-IN", + "route_map_out": "RM-WAN-HA-PEER-OUT", + } + neighbors.append(neighbor) + if self.shared_utils.is_wan_server: # No neighbor configured on the `wan_overlay_peers` peer group as it is covered by listen ranges for wan_route_server, data in self.shared_utils.filtered_wan_route_servers.items(): @@ -522,14 +560,14 @@ def _neighbors(self) -> list | None: return None - def _ip_in_listen_ranges(self, source_ip: str, listen_range_prefixes: list) -> bool: + def _ip_in_listen_ranges(self: AvdStructuredConfigOverlay, source_ip: str, listen_range_prefixes: list) -> bool: """ Check if our source IP is in any of the listen range prefixes """ source_ip = ipaddress.ip_address(source_ip) return any(source_ip in ipaddress.ip_network(prefix) for prefix in listen_range_prefixes) - def _bgp_overlay_dpath(self) -> dict | None: + def _bgp_overlay_dpath(self: AvdStructuredConfigOverlay) -> dict | None: if self.shared_utils.overlay_dpath is True: return { "bestpath": { diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/router_path_selection.py b/python-avd/pyavd/_eos_designs/structured_config/overlay/router_path_selection.py similarity index 86% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/router_path_selection.py rename to python-avd/pyavd/_eos_designs/structured_config/overlay/router_path_selection.py index acf949fc276..b865fb00885 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/router_path_selection.py +++ b/python-avd/pyavd/_eos_designs/structured_config/overlay/router_path_selection.py @@ -4,13 +4,15 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError -from ansible_collections.arista.avd.plugins.plugin_utils.strip_empties import strip_empties_from_dict -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get, get_item - +from ...._errors import AristaAvdError +from ...._utils import get, get_item, strip_empties_from_dict from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigOverlay + class RouterPathSelectionMixin(UtilsMixin): """ @@ -19,7 +21,7 @@ class RouterPathSelectionMixin(UtilsMixin): """ @cached_property - def router_path_selection(self) -> dict | None: + def router_path_selection(self: AvdStructuredConfigOverlay) -> dict | None: """ Return structured config for router path-selection (DPS) """ @@ -38,21 +40,21 @@ def router_path_selection(self) -> dict | None: return strip_empties_from_dict(router_path_selection) @cached_property - def _cp_ipsec_profile_name(self) -> str: + def _cp_ipsec_profile_name(self: AvdStructuredConfigOverlay) -> str: """ Returns the IPsec profile name to use for Control-Plane """ return get(self._hostvars, "wan_ipsec_profiles.control_plane.profile_name", default="CP-PROFILE") @cached_property - def _dp_ipsec_profile_name(self) -> str: + def _dp_ipsec_profile_name(self: AvdStructuredConfigOverlay) -> str: """ Returns the IPsec profile name to use for Data-Plane """ # TODO need to use CP one if 'wan_ipsec_profiles.data_plane' not present return get(self._hostvars, "wan_ipsec_profiles.data_plane.profile_name", default="DP-PROFILE") - def _get_path_groups(self) -> list: + def _get_path_groups(self: AvdStructuredConfigOverlay) -> list: """ Generate the required path-groups locally """ @@ -108,7 +110,7 @@ def _get_path_groups(self) -> list: return path_groups - def _generate_ha_path_group(self) -> dict: + def _generate_ha_path_group(self: AvdStructuredConfigOverlay) -> dict: """ Called only when self.shared_utils.wan_ha is True or on Pathfinders """ @@ -124,7 +126,7 @@ def _generate_ha_path_group(self) -> dict: ha_path_group.update( { # This should be the LAN interface over which a DPS tunnel is built - "local_interfaces": [{"name": interface["interface"]} for interface in self._wan_ha_interfaces()], + "local_interfaces": [{"name": interface} for interface in self.shared_utils.wan_ha_interfaces], "static_peers": [ { "router_ip": self._wan_ha_peer_vtep_ip(), @@ -139,20 +141,20 @@ def _generate_ha_path_group(self) -> dict: return ha_path_group - def _wan_ha_interfaces(self) -> list: + def _wan_ha_interfaces(self: AvdStructuredConfigOverlay) -> list: """ Return list of interfaces for HA """ return [uplink for uplink in self.shared_utils.get_switch_fact("uplinks") if get(uplink, "vrf") is None] - def _wan_ha_peer_vtep_ip(self) -> str: + def _wan_ha_peer_vtep_ip(self: AvdStructuredConfigOverlay) -> str: """ """ peer_facts = self.shared_utils.get_peer_facts(self.shared_utils.wan_ha_peer, required=True) return get(peer_facts, "vtep_ip", required=True) - def _get_path_group_id(self, path_group_name: str, config_id: int | None = None) -> int: + def _get_path_group_id(self: AvdStructuredConfigOverlay, path_group_name: str, config_id: int | None = None) -> int: """ - TODO - implement algorithm to auto assign IDs - cf internal documenation + TODO - implement algorithm to auto assign IDs - cf internal documentation TODO - also implement algorithm for cross connects on public path_groups """ if path_group_name == self.shared_utils.wan_ha_path_group_name: @@ -161,7 +163,7 @@ def _get_path_group_id(self, path_group_name: str, config_id: int | None = None) return config_id return 500 - def _get_local_interfaces_for_path_group(self, path_group_name: str) -> list | None: + def _get_local_interfaces_for_path_group(self: AvdStructuredConfigOverlay, path_group_name: str) -> list | None: """ Generate the router_path_selection.local_interfaces list @@ -181,7 +183,7 @@ def _get_local_interfaces_for_path_group(self, path_group_name: str) -> list | N return local_interfaces - def _get_dynamic_peers(self, disable_ipsec: bool) -> dict | None: + def _get_dynamic_peers(self: AvdStructuredConfigOverlay, disable_ipsec: bool) -> dict | None: """ TODO support ip_local ? """ @@ -193,7 +195,7 @@ def _get_dynamic_peers(self, disable_ipsec: bool) -> dict | None: dynamic_peers["ipsec"] = False return dynamic_peers - def _get_static_peers_for_path_group(self, path_group_name: str) -> list | None: + def _get_static_peers_for_path_group(self: AvdStructuredConfigOverlay, path_group_name: str) -> list | None: """ Retrieves the static peers to configure for a given path-group based on the connected nodes. """ diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/router_traffic_engineering.py b/python-avd/pyavd/_eos_designs/structured_config/overlay/router_traffic_engineering.py similarity index 78% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/router_traffic_engineering.py rename to python-avd/pyavd/_eos_designs/structured_config/overlay/router_traffic_engineering.py index a711d42d08b..ea55c939a7b 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/router_traffic_engineering.py +++ b/python-avd/pyavd/_eos_designs/structured_config/overlay/router_traffic_engineering.py @@ -4,9 +4,13 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigOverlay + class RouterTrafficEngineering(UtilsMixin): """ @@ -15,7 +19,7 @@ class RouterTrafficEngineering(UtilsMixin): """ @cached_property - def router_traffic_engineering(self) -> dict | None: + def router_traffic_engineering(self: AvdStructuredConfigOverlay) -> dict | None: """ Return structured config for router traffic-engineering """ diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/stun.py b/python-avd/pyavd/_eos_designs/structured_config/overlay/stun.py similarity index 85% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/stun.py rename to python-avd/pyavd/_eos_designs/structured_config/overlay/stun.py index e192d73cd35..bbd3bd3de9c 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/stun.py +++ b/python-avd/pyavd/_eos_designs/structured_config/overlay/stun.py @@ -5,11 +5,14 @@ import itertools from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.strip_empties import strip_empties_from_dict - +from ...._utils import strip_empties_from_dict from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigOverlay + class StunMixin(UtilsMixin): """ @@ -18,7 +21,7 @@ class StunMixin(UtilsMixin): """ @cached_property - def stun(self) -> dict | None: + def stun(self: AvdStructuredConfigOverlay) -> dict | None: """ Return structured config for stun """ diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/utils.py b/python-avd/pyavd/_eos_designs/structured_config/overlay/utils.py similarity index 81% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/utils.py rename to python-avd/pyavd/_eos_designs/structured_config/overlay/utils.py index 33a0eb5d31d..e87a6d9c60c 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/overlay/utils.py +++ b/python-avd/pyavd/_eos_designs/structured_config/overlay/utils.py @@ -4,10 +4,13 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.filter.natural_sort import natural_sort -from ansible_collections.arista.avd.plugins.plugin_utils.eos_designs_shared_utils.shared_utils import SharedUtils -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get +from ...._utils import get +from ....j2filters import natural_sort + +if TYPE_CHECKING: + from . import AvdStructuredConfigOverlay class UtilsMixin: @@ -16,12 +19,8 @@ class UtilsMixin: Class should only be used as Mixin to a AvdStructuredConfig class """ - # Set type hints for Attributes of the main class as needed - _hostvars: dict - shared_utils: SharedUtils - @cached_property - def _avd_overlay_peers(self) -> list: + def _avd_overlay_peers(self: AvdStructuredConfigOverlay) -> list: """ Returns a list of overlay peers for the device @@ -31,7 +30,7 @@ def _avd_overlay_peers(self) -> list: return get(self._hostvars, f"avd_overlay_peers..{self.shared_utils.hostname}", separator="..", default=[]) @cached_property - def _evpn_gateway_remote_peers(self) -> dict: + def _evpn_gateway_remote_peers(self: AvdStructuredConfigOverlay) -> dict: if not self.shared_utils.overlay_evpn: return {} @@ -62,7 +61,7 @@ def _evpn_gateway_remote_peers(self) -> dict: return evpn_gateway_remote_peers @cached_property - def _evpn_route_clients(self) -> dict: + def _evpn_route_clients(self: AvdStructuredConfigOverlay) -> dict: if not self.shared_utils.overlay_evpn: return {} @@ -76,14 +75,14 @@ def _evpn_route_clients(self) -> dict: if ( self.shared_utils.hostname in peer_facts.get("evpn_route_servers", []) and peer_facts.get("evpn_role") in ["server", "client"] - and avd_peer not in self._evpn_route_servers.keys() + and avd_peer not in self._evpn_route_servers ): self._append_peer(evpn_route_clients, avd_peer, peer_facts) return evpn_route_clients @cached_property - def _evpn_route_servers(self) -> dict: + def _evpn_route_servers(self: AvdStructuredConfigOverlay) -> dict: if not self.shared_utils.overlay_evpn: return {} @@ -100,29 +99,29 @@ def _evpn_route_servers(self) -> dict: # The next four should probably be moved to facts @cached_property - def _is_mpls_client(self) -> bool: + def _is_mpls_client(self: AvdStructuredConfigOverlay) -> bool: return self.shared_utils.mpls_overlay_role == "client" or (self.shared_utils.evpn_role == "client" and self.shared_utils.overlay_evpn_mpls) @cached_property - def _is_mpls_server(self) -> bool: + def _is_mpls_server(self: AvdStructuredConfigOverlay) -> bool: return self.shared_utils.mpls_overlay_role == "server" or (self.shared_utils.evpn_role == "server" and self.shared_utils.overlay_evpn_mpls) - def _is_peer_mpls_client(self, peer_facts: dict) -> bool: + def _is_peer_mpls_client(self: AvdStructuredConfigOverlay, peer_facts: dict) -> bool: return peer_facts.get("mpls_overlay_role", None) == "client" or ( peer_facts.get("evpn_role", None) == "client" and get(peer_facts, "overlay.evpn_mpls") is True ) - def _is_peer_mpls_server(self, peer_facts: dict) -> bool: + def _is_peer_mpls_server(self: AvdStructuredConfigOverlay, peer_facts: dict) -> bool: return peer_facts.get("mpls_overlay_role", None) == "server" or ( peer_facts.get("evpn_role", None) == "server" and get(peer_facts, "overlay.evpn_mpls") is True ) @cached_property - def _ipvpn_gateway_local_as(self) -> str | None: + def _ipvpn_gateway_local_as(self: AvdStructuredConfigOverlay) -> str | None: return str(_as) if (_as := get(self.shared_utils.switch_data_combined, "ipvpn_gateway.local_as")) is not None else None @cached_property - def _ipvpn_gateway_remote_peers(self) -> dict: + def _ipvpn_gateway_remote_peers(self: AvdStructuredConfigOverlay) -> dict: if self.shared_utils.overlay_ipvpn_gateway is not True: return {} @@ -148,7 +147,7 @@ def _ipvpn_gateway_remote_peers(self) -> dict: return ipvpn_gateway_remote_peers @cached_property - def _mpls_route_clients(self) -> dict: + def _mpls_route_clients(self: AvdStructuredConfigOverlay) -> dict: if self._is_mpls_server is not True: return {} @@ -159,13 +158,13 @@ def _mpls_route_clients(self) -> dict: if self._is_peer_mpls_client(peer_facts) is not True: continue - if self.shared_utils.hostname in peer_facts.get("mpls_route_reflectors", []) and avd_peer not in self._mpls_route_reflectors.keys(): + if self.shared_utils.hostname in peer_facts.get("mpls_route_reflectors", []) and avd_peer not in self._mpls_route_reflectors: self._append_peer(mpls_route_clients, avd_peer, peer_facts) return mpls_route_clients @cached_property - def _mpls_mesh_pe(self) -> dict: + def _mpls_mesh_pe(self: AvdStructuredConfigOverlay) -> dict: if self.shared_utils.overlay_mpls is not True: return {} @@ -189,7 +188,7 @@ def _mpls_mesh_pe(self) -> dict: return mpls_mesh_pe @cached_property - def _mpls_route_reflectors(self) -> dict: + def _mpls_route_reflectors(self: AvdStructuredConfigOverlay) -> dict: if self._is_mpls_client is not True: return {} @@ -208,7 +207,7 @@ def _mpls_route_reflectors(self) -> dict: return mpls_route_reflectors @cached_property - def _mpls_rr_peers(self) -> dict: + def _mpls_rr_peers(self: AvdStructuredConfigOverlay) -> dict: if self._is_mpls_server is not True: return {} @@ -236,9 +235,9 @@ def _mpls_rr_peers(self) -> dict: return mpls_rr_peers - def _append_peer(self, peers_dict: dict, peer_name: str, peer_facts: dict) -> None: + def _append_peer(self: AvdStructuredConfigOverlay, peers_dict: dict, peer_name: str, peer_facts: dict) -> None: """ - Retieve bgp_as and "overlay.peering_address" from peer_facts and append + Retrieve bgp_as and "overlay.peering_address" from peer_facts and append a new peer to peers_dict { peer_name: { @@ -259,17 +258,21 @@ def _append_peer(self, peers_dict: dict, peer_name: str, peer_facts: dict) -> No } @cached_property - def _is_wan_server_with_peers(self) -> bool: + def _is_wan_server_with_peers(self: AvdStructuredConfigOverlay) -> bool: return self.shared_utils.is_wan_server and len(self.shared_utils.filtered_wan_route_servers) > 0 - def _stun_server_profile_name(self, wan_route_server_name: str, path_group_name: str, interface_name: str) -> str: + def _stun_server_profile_name(self: AvdStructuredConfigOverlay, wan_route_server_name: str, path_group_name: str, interface_name: str) -> str: """ Return a string to use as the name of the stun server_profile + + `/` are not allowed, `.` are allowed so + Ethernet1/1.1 is transformed into Ethernet1_1.1 """ - return f"{path_group_name}-{wan_route_server_name}-{interface_name}" + sanitized_interface_name = self.shared_utils.sanitize_interface_name(interface_name) + return f"{path_group_name}-{wan_route_server_name}-{sanitized_interface_name}" @cached_property - def _stun_server_profiles(self) -> list: + def _stun_server_profiles(self: AvdStructuredConfigOverlay) -> dict: """ Return a dictionary of _stun_server_profiles with ip_address per local path_group """ @@ -285,3 +288,8 @@ def _stun_server_profiles(self) -> list: for interface_dict in get(path_group, "interfaces", required=True) ) return stun_server_profiles + + def _wan_ha_peer_vtep_ip(self) -> str: + """ """ + peer_facts = self.shared_utils.get_peer_facts(self.shared_utils.wan_ha_peer, required=True) + return get(peer_facts, "vtep_ip", required=True) diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/avdstructuredconfig.py b/python-avd/pyavd/_eos_designs/structured_config/underlay/__init__.py similarity index 95% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/avdstructuredconfig.py rename to python-avd/pyavd/_eos_designs/structured_config/underlay/__init__.py index e37d9be3979..ca3a97672a8 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/avdstructuredconfig.py +++ b/python-avd/pyavd/_eos_designs/structured_config/underlay/__init__.py @@ -1,8 +1,7 @@ # Copyright (c) 2023-2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. -from ansible_collections.arista.avd.plugins.plugin_utils.avdfacts import AvdFacts - +from ...avdfacts import AvdFacts from .agents import AgentsMixin from .as_path import AsPathMixin from .ethernet_interfaces import EthernetInterfacesMixin @@ -50,7 +49,7 @@ class AvdStructuredConfigUnderlay( a dict with the name of the method as key. This means that each key in the final dict corresponds to a method. The Class uses AvdFacts, as the base class, to get the render, keys and other attributes. - All other methods are included as "Mixins" to make the files more managable. + All other methods are included as "Mixins" to make the files more manageable. The order of the @cached_properties methods imported from Mixins will also control the order in the output. """ diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/agents.py b/python-avd/pyavd/_eos_designs/structured_config/underlay/agents.py similarity index 82% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/agents.py rename to python-avd/pyavd/_eos_designs/structured_config/underlay/agents.py index 8fd9e344148..5b317cd3171 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/agents.py +++ b/python-avd/pyavd/_eos_designs/structured_config/underlay/agents.py @@ -4,9 +4,13 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigUnderlay + class AgentsMixin(UtilsMixin): """ @@ -15,7 +19,7 @@ class AgentsMixin(UtilsMixin): """ @cached_property - def agents(self) -> dict | None: + def agents(self: AvdStructuredConfigUnderlay) -> list | None: """ Return structured config for agents """ diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/as_path.py b/python-avd/pyavd/_eos_designs/structured_config/underlay/as_path.py similarity index 81% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/as_path.py rename to python-avd/pyavd/_eos_designs/structured_config/underlay/as_path.py index 506fdf94b19..7b195afd924 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/as_path.py +++ b/python-avd/pyavd/_eos_designs/structured_config/underlay/as_path.py @@ -4,9 +4,13 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigUnderlay + class AsPathMixin(UtilsMixin): """ @@ -15,7 +19,7 @@ class AsPathMixin(UtilsMixin): """ @cached_property - def as_path(self) -> list | None: + def as_path(self: AvdStructuredConfigUnderlay) -> dict | None: """ Return structured config for as_path. """ @@ -23,7 +27,7 @@ def as_path(self) -> list | None: return None access_lists = [] - if self.shared_utils.is_cv_pathfinder_client: + if self.shared_utils.wan_ha and self.shared_utils.use_uplinks_for_wan_ha: access_lists.append( { "name": "ASPATH-WAN", diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/ethernet_interfaces.py b/python-avd/pyavd/_eos_designs/structured_config/underlay/ethernet_interfaces.py similarity index 85% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/ethernet_interfaces.py rename to python-avd/pyavd/_eos_designs/structured_config/underlay/ethernet_interfaces.py index ffae7c4bc37..3a5278fcf22 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/ethernet_interfaces.py +++ b/python-avd/pyavd/_eos_designs/structured_config/underlay/ethernet_interfaces.py @@ -4,13 +4,16 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.filter.natural_sort import natural_sort -from ansible_collections.arista.avd.plugins.plugin_utils.utils import append_if_not_duplicate, get - -from ..interface_descriptions import InterfaceDescriptionData +from ...._utils import append_if_not_duplicate, get +from ....j2filters import natural_sort +from ...interface_descriptions import InterfaceDescriptionData from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigUnderlay + class EthernetInterfacesMixin(UtilsMixin): """ @@ -19,7 +22,7 @@ class EthernetInterfacesMixin(UtilsMixin): """ @cached_property - def ethernet_interfaces(self) -> list | None: + def ethernet_interfaces(self: AvdStructuredConfigUnderlay) -> list | None: """ Return structured config for ethernet_interfaces """ @@ -58,6 +61,7 @@ def ethernet_interfaces(self) -> list | None: "ipv6_enable": link.get("ipv6_enable"), "link_tracking_groups": link.get("link_tracking_groups"), "sflow": link.get("sflow"), + "flow_tracker": link.get("flow_tracker"), } ) @@ -100,6 +104,7 @@ def ethernet_interfaces(self) -> list | None: ethernet_interface.update( { "isis_enable": self.shared_utils.isis_instance_name, + "isis_bfd": get(self._hostvars, "underlay_isis_bfd"), "isis_metric": self.shared_utils.isis_default_metric, "isis_network_point_to_point": True, "isis_circuit_type": self.shared_utils.isis_default_circuit_type, @@ -109,11 +114,6 @@ def ethernet_interfaces(self) -> list | None: if link.get("underlay_multicast") is True: ethernet_interface["pim"] = {"ipv4": {"sparse_mode": True}} - # TODO: allow to enable flow tracking once toggle is in place - # Configuring flow tracking on LAN interfaces - # if self.shared_utils.is_cv_pathfinder_client: - # ethernet_interface["flow_tracker"] = {"hardware": self.shared_utils.wan_flow_tracker_name} - # Structured Config ethernet_interface["struct_cfg"] = link.get("structured_config") @@ -149,6 +149,7 @@ def ethernet_interfaces(self) -> list | None: "service_profile": self.shared_utils.p2p_uplinks_qos_profile, "link_tracking_groups": link.get("link_tracking_groups"), "spanning_tree_portfast": link.get("spanning_tree_portfast"), + "flow_tracker": link.get("flow_tracker"), } ) @@ -189,16 +190,12 @@ def ethernet_interfaces(self) -> list | None: "encapsulation_dot1q_vlan": subinterface["encapsulation_dot1q_vlan"], "ipv6_enable": subinterface.get("ipv6_enable"), "sflow": link.get("sflow"), + "flow_tracker": link.get("flow_tracker"), "mtu": self.shared_utils.p2p_uplinks_mtu, } if subinterface.get("ip_address") is not None: ethernet_subinterface.update({"ip_address": f"{subinterface['ip_address']}/{subinterface['prefix_length']}"}), - # TODO: allow to enable flow tracking once toggle is in place - # Configuring flow tracking on LAN interfaces - # if self.shared_utils.is_cv_pathfinder_client: - # ethernet_subinterface["flow_tracker"] = {"hardware": self.shared_utils.wan_flow_tracker_name} - ethernet_subinterface = {key: value for key, value in ethernet_subinterface.items() if value is not None} append_if_not_duplicate( list_of_dicts=ethernet_interfaces, @@ -225,7 +222,7 @@ def ethernet_interfaces(self) -> list | None: interface_name = l3_interface["name"] if "." in interface_name: # This is a subinterface so we need to ensure that the parent is created - parent_interface_name, subif_id = interface_name.split(".", maxsplit=1) + parent_interface_name, _ = interface_name.split(".", maxsplit=1) subif_parent_interface_names.add(parent_interface_name) ethernet_interface = self._get_l3_interface_cfg(l3_interface) @@ -248,11 +245,6 @@ def ethernet_interfaces(self) -> list | None: "shutdown": False, } - # TODO: allow to enable flow tracking once toggle is in place - # Configuring flow tracking on LAN interfaces - # if self.shared_utils.is_cv_pathfinder_client: - # ethernet_interface["flow_tracker"] = {"hardware": self.shared_utils.wan_flow_tracker_name} - append_if_not_duplicate( list_of_dicts=ethernet_interfaces, primary_key="name", @@ -261,6 +253,31 @@ def ethernet_interfaces(self) -> list | None: context_keys=["name", "peer", "peer_interface"], ) + # WAN HA interfaces for direct connection + if self.shared_utils.use_uplinks_for_wan_ha is False: + direct_wan_ha_links_flow_tracker = get( + self.shared_utils.switch_data_combined, "wan_ha.flow_tracker", default=self.shared_utils.get_flow_tracker(None, "direct_wan_ha_links") + ) + for index, interface in enumerate(get(self.shared_utils.switch_data_combined, "wan_ha.ha_interfaces", required=True)): + ha_interface = { + "name": interface, + "type": "routed", + "peer_type": "l3_interface", + "peer": self.shared_utils.wan_ha_peer, + "shutdown": False, + "description": "DIRECT LAN HA LINK", + "ip_address": self.shared_utils.wan_ha_ip_addresses[index], + "flow_tracker": direct_wan_ha_links_flow_tracker, + } + + append_if_not_duplicate( + list_of_dicts=ethernet_interfaces, + primary_key="name", + new_dict=ha_interface, + context=f"L3 Interfaces defined under {self.shared_utils.node_type_key_data['key']} wan_ha_interfaces", + context_keys=["name", "peer", "peer_interface"], + ) + if ethernet_interfaces: return ethernet_interfaces diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/ip_access_lists.py b/python-avd/pyavd/_eos_designs/structured_config/underlay/ip_access_lists.py similarity index 79% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/ip_access_lists.py rename to python-avd/pyavd/_eos_designs/structured_config/underlay/ip_access_lists.py index 988b459b545..6d33e3d92f9 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/ip_access_lists.py +++ b/python-avd/pyavd/_eos_designs/structured_config/underlay/ip_access_lists.py @@ -4,12 +4,15 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.filter.natural_sort import natural_sort -from ansible_collections.arista.avd.plugins.plugin_utils.utils import append_if_not_duplicate - +from ...._utils import append_if_not_duplicate +from ....j2filters import natural_sort from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigUnderlay + class IpAccesslistsMixin(UtilsMixin): """ @@ -18,7 +21,7 @@ class IpAccesslistsMixin(UtilsMixin): """ @cached_property - def ip_access_lists(self) -> list | None: + def ip_access_lists(self: AvdStructuredConfigUnderlay) -> list | None: """ Return structured config for ip_access_lists. diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/loopback_interfaces.py b/python-avd/pyavd/_eos_designs/structured_config/underlay/loopback_interfaces.py similarity index 91% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/loopback_interfaces.py rename to python-avd/pyavd/_eos_designs/structured_config/underlay/loopback_interfaces.py index 076a1d100ce..6b5ea9c3fbc 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/loopback_interfaces.py +++ b/python-avd/pyavd/_eos_designs/structured_config/underlay/loopback_interfaces.py @@ -4,13 +4,16 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdMissingVariableError -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get - -from ..interface_descriptions.models import InterfaceDescriptionData +from ...._errors import AristaAvdMissingVariableError +from ...._utils import get +from ...interface_descriptions.models import InterfaceDescriptionData from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigUnderlay + class LoopbackInterfacesMixin(UtilsMixin): """ @@ -19,7 +22,7 @@ class LoopbackInterfacesMixin(UtilsMixin): """ @cached_property - def loopback_interfaces(self) -> list | None: + def loopback_interfaces(self: AvdStructuredConfigUnderlay) -> list | None: """ Return structured config for loopback_interfaces """ @@ -93,7 +96,7 @@ def loopback_interfaces(self) -> list | None: return loopback_interfaces @cached_property - def _node_sid(self): + def _node_sid(self: AvdStructuredConfigUnderlay): if self.shared_utils.id is None: raise AristaAvdMissingVariableError(f"'id' is not set on '{self.shared_utils.hostname}' and is required to set node SID") node_sid_base = int(get(self.shared_utils.switch_data_combined, "node_sid_base", 0)) diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/mpls.py b/python-avd/pyavd/_eos_designs/structured_config/underlay/mpls.py similarity index 86% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/mpls.py rename to python-avd/pyavd/_eos_designs/structured_config/underlay/mpls.py index 86ffc5d0177..390d4dd2433 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/mpls.py +++ b/python-avd/pyavd/_eos_designs/structured_config/underlay/mpls.py @@ -4,9 +4,13 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigUnderlay + class MplsMixin(UtilsMixin): """ @@ -15,7 +19,7 @@ class MplsMixin(UtilsMixin): """ @cached_property - def mpls(self) -> dict | None: + def mpls(self: AvdStructuredConfigUnderlay) -> dict | None: """ Return structured config for mpls """ diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/port_channel_interfaces.py b/python-avd/pyavd/_eos_designs/structured_config/underlay/port_channel_interfaces.py similarity index 84% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/port_channel_interfaces.py rename to python-avd/pyavd/_eos_designs/structured_config/underlay/port_channel_interfaces.py index 0c823e63d9f..b75a76cbca4 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/port_channel_interfaces.py +++ b/python-avd/pyavd/_eos_designs/structured_config/underlay/port_channel_interfaces.py @@ -4,15 +4,15 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.filter.generate_esi import generate_esi -from ansible_collections.arista.avd.plugins.filter.generate_lacp_id import generate_lacp_id -from ansible_collections.arista.avd.plugins.filter.generate_route_target import generate_route_target -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get - -from ..interface_descriptions.models import InterfaceDescriptionData +from ...._utils import get, short_esi_to_route_target +from ...interface_descriptions.models import InterfaceDescriptionData from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigUnderlay + class PortChannelInterfacesMixin(UtilsMixin): """ @@ -21,7 +21,7 @@ class PortChannelInterfacesMixin(UtilsMixin): """ @cached_property - def port_channel_interfaces(self) -> list | None: + def port_channel_interfaces(self: AvdStructuredConfigUnderlay) -> list | None: """ Return structured config for port_channel_interfaces """ @@ -56,6 +56,7 @@ def port_channel_interfaces(self) -> list | None: "link_tracking_groups": link.get("link_tracking_groups"), "native_vlan": link.get("native_vlan"), "sflow": link.get("sflow"), + "flow_tracker": link.get("flow_tracker"), "spanning_tree_portfast": link.get("spanning_tree_portfast"), } @@ -70,10 +71,10 @@ def port_channel_interfaces(self) -> list | None: if (short_esi := link.get("short_esi")) is not None: port_channel_interface["evpn_ethernet_segment"] = { - "identifier": generate_esi(short_esi, self.shared_utils.evpn_short_esi_prefix), - "route_target": generate_route_target(short_esi), + "identifier": f"{self.shared_utils.evpn_short_esi_prefix}{short_esi}", + "route_target": short_esi_to_route_target(short_esi), } - port_channel_interface["lacp_id"] = generate_lacp_id(short_esi) + port_channel_interface["lacp_id"] = short_esi.replace(":", ".") # PTP if get(link, "ptp.enable") is True: diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/prefix_lists.py b/python-avd/pyavd/_eos_designs/structured_config/underlay/prefix_lists.py similarity index 66% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/prefix_lists.py rename to python-avd/pyavd/_eos_designs/structured_config/underlay/prefix_lists.py index db993f77fa6..fe1cf767e2e 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/prefix_lists.py +++ b/python-avd/pyavd/_eos_designs/structured_config/underlay/prefix_lists.py @@ -5,9 +5,14 @@ import ipaddress from functools import cached_property +from typing import TYPE_CHECKING +from ...._utils import get, get_item from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigUnderlay + class PrefixListsMixin(UtilsMixin): """ @@ -16,7 +21,7 @@ class PrefixListsMixin(UtilsMixin): """ @cached_property - def prefix_lists(self) -> list | None: + def prefix_lists(self: AvdStructuredConfigUnderlay) -> list | None: """ Return structured config for prefix_lists """ @@ -47,24 +52,45 @@ def prefix_lists(self) -> list | None: ] prefix_lists.append({"name": "PL-LOOPBACKS-PIM-RP", "sequence_numbers": sequence_numbers}) - # TODO - may be needed in other situations - if self.shared_utils.wan_ha and self.shared_utils.underlay_routing_protocol == "ebgp": + # For now only configure it with eBGP towards LAN. + if self.shared_utils.wan_ha and self.shared_utils.use_uplinks_for_wan_ha and self.shared_utils.underlay_routing_protocol == "ebgp": sequence_numbers = [ {"sequence": 10 * (index + 1), "action": f"permit {ipaddress.ip_network(ip_address, strict=False)}"} for index, ip_address in enumerate(self.shared_utils.wan_ha_ip_addresses) ] - prefix_lists.append({"name": "PL-WAN-HA-PREFIXES", "sequence_numbers": sequence_numbers}) + + if sequence_numbers: + prefix_lists.append({"name": "PL-WAN-HA-PREFIXES", "sequence_numbers": sequence_numbers}) sequence_numbers = [ {"sequence": 10 * (index + 1), "action": f"permit {ipaddress.ip_network(ip_address, strict=False)}"} for index, ip_address in enumerate(self.shared_utils.wan_ha_peer_ip_addresses) ] - prefix_lists.append({"name": "PL-WAN-HA-PEER-PREFIXES", "sequence_numbers": sequence_numbers}) + + if sequence_numbers: + prefix_lists.append({"name": "PL-WAN-HA-PEER-PREFIXES", "sequence_numbers": sequence_numbers}) + + prefix_lists_in_use = set() + for neighbor in self.shared_utils.l3_interfaces_bgp_neighbors: + if prefix_list_in := get(neighbor, "ipv4_prefix_list_in"): + if prefix_list_in not in prefix_lists_in_use: + pfx_list = self._get_prefix_list(prefix_list_in) + prefix_lists.append(pfx_list) + prefix_lists_in_use.add(prefix_list_in) + + if prefix_list_out := get(neighbor, "ipv4_prefix_list_out"): + if prefix_list_out not in prefix_lists_in_use: + pfx_list = self._get_prefix_list(prefix_list_out) + prefix_lists.append(pfx_list) + prefix_lists_in_use.add(prefix_list_out) return prefix_lists + def _get_prefix_list(self, name: str): + return get_item(self.shared_utils.ipv4_prefix_list_catalog, "name", name, required=True, var_name=f"ipv4_prefix_list_catalog[name={name}]") + @cached_property - def ipv6_prefix_lists(self) -> dict | None: + def ipv6_prefix_lists(self: AvdStructuredConfigUnderlay) -> list | None: """ Return structured config for IPv6 prefix_lists """ diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/route_maps.py b/python-avd/pyavd/_eos_designs/structured_config/underlay/route_maps.py similarity index 62% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/route_maps.py rename to python-avd/pyavd/_eos_designs/structured_config/underlay/route_maps.py index 6d9f4394389..40299305edc 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/route_maps.py +++ b/python-avd/pyavd/_eos_designs/structured_config/underlay/route_maps.py @@ -4,9 +4,14 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING +from ...._utils import get from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigUnderlay + class RouteMapsMixin(UtilsMixin): """ @@ -15,7 +20,7 @@ class RouteMapsMixin(UtilsMixin): """ @cached_property - def route_maps(self) -> list | None: + def route_maps(self: AvdStructuredConfigUnderlay) -> list | None: """ Return structured config for route_maps @@ -30,7 +35,6 @@ def route_maps(self) -> list | None: if self.shared_utils.overlay_routing_protocol != "none" and self.shared_utils.underlay_filter_redistribute_connected: # RM-CONN-2-BGP - sequence_numbers = [] sequence_10 = { "sequence": 10, "type": "permit", @@ -39,8 +43,7 @@ def route_maps(self) -> list | None: if self.shared_utils.wan_role: sequence_10["set"] = [f"extcommunity soo {self.shared_utils.evpn_soo} additive"] - sequence_numbers.append(sequence_10) - + sequence_numbers = [sequence_10] # SEQ 20 is set by inband management if applicable, so avoid setting that here if self.shared_utils.underlay_ipv6 is True: @@ -61,7 +64,7 @@ def route_maps(self) -> list | None: } ) - if self.shared_utils.wan_ha: + if self.shared_utils.wan_ha and self.shared_utils.use_uplinks_for_wan_ha: sequence_numbers.append( { "sequence": 50, @@ -103,7 +106,7 @@ def route_maps(self) -> list | None: "set": [f"extcommunity soo {self.shared_utils.evpn_soo} additive"], }, ] - if self.shared_utils.wan_ha: + if self.shared_utils.wan_ha and self.shared_utils.use_uplinks_for_wan_ha: sequence_numbers.extend( [ { @@ -114,47 +117,70 @@ def route_maps(self) -> list | None: }, { "sequence": 20, - "type": "permit", - "description": "Allow prefixes originated from the HA peer", - "match": ["extcommunity ECL-EVPN-SOO"], - "set": ["as-path match all replacement auto auto"], - }, - { - "sequence": 30, - "type": "permit", - "description": "Use WAN routes from HA peer as backup", + "type": "deny", + "description": "Deny other routes from the HA peer", "match": ["as-path ASPATH-WAN"], - "set": ["community no-advertise"], }, ] ) route_maps.append({"name": "RM-BGP-UNDERLAY-PEERS-IN", "sequence_numbers": sequence_numbers}) # RM-BGP-UNDERLAY-PEERS-OUT - sequence_numbers = [ - { - "sequence": 10, - "type": "permit", - "description": "Advertise local routes towards LAN", - "match": ["extcommunity ECL-EVPN-SOO"], - }, - { - "sequence": 20, - "type": "permit", - "description": "Advertise routes received from WAN iBGP towards LAN", - "match": ["route-type internal"], - }, - ] if self.shared_utils.wan_ha: - sequence_numbers.append( + sequence_numbers = [ { - "sequence": 30, + "sequence": 10, "type": "permit", - "description": "Advertise WAN HA prefixes towards LAN", - "match": ["ip address prefix-list PL-WAN-HA-PREFIXES"], + "description": "Make routes learned from WAN HA peer less preferred on LAN routers", + "match": ["tag 50", "route-type internal"], + "set": ["metric 50"], }, - ) - route_maps.append({"name": "RM-BGP-UNDERLAY-PEERS-OUT", "sequence_numbers": sequence_numbers}) + { + "sequence": 20, + "type": "permit", + }, + ] + route_maps.append({"name": "RM-BGP-UNDERLAY-PEERS-OUT", "sequence_numbers": sequence_numbers}) + + for neighbor in self.shared_utils.l3_interfaces_bgp_neighbors: + # RM-BGP--IN + if prefix_list_in := get(neighbor, "ipv4_prefix_list_in"): + sequence_numbers = [ + { + "sequence": 10, + "type": "permit", + "match": [f"ip address prefix-list {prefix_list_in}"], + }, + ] + # set no advertise is set only for wan neighbors, which will also have + # prefix_list_in + if neighbor.get("set_no_advertise"): + sequence_numbers[0]["set"] = ["community no-advertise additive"] + + route_maps.append({"name": neighbor["route_map_in"], "sequence_numbers": sequence_numbers}) + + # RM-BGP--OUT + if prefix_list_out := get(neighbor, "ipv4_prefix_list_out"): + sequence_numbers = [ + { + "sequence": 10, + "type": "permit", + "match": [f"ip address prefix-list {prefix_list_out}"], + }, + { + "sequence": 20, + "type": "deny", + }, + ] + else: + sequence_numbers = [ + { + "sequence": 10, + "type": "deny", + }, + ] + + route_maps.append({"name": neighbor["route_map_out"], "sequence_numbers": sequence_numbers}) if route_maps: return route_maps diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/router_bgp.py b/python-avd/pyavd/_eos_designs/structured_config/underlay/router_bgp.py similarity index 85% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/router_bgp.py rename to python-avd/pyavd/_eos_designs/structured_config/underlay/router_bgp.py index 926d20d0c94..3877292aec5 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/router_bgp.py +++ b/python-avd/pyavd/_eos_designs/structured_config/underlay/router_bgp.py @@ -4,10 +4,13 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.strip_empties import strip_empties_from_dict -from ansible_collections.arista.avd.plugins.plugin_utils.utils import append_if_not_duplicate, get -from ansible_collections.arista.avd.roles.eos_designs.python_modules.underlay.utils import UtilsMixin +from ...._utils import append_if_not_duplicate, get, strip_empties_from_dict +from .utils import UtilsMixin + +if TYPE_CHECKING: + from . import AvdStructuredConfigUnderlay class RouterBgpMixin(UtilsMixin): @@ -17,7 +20,7 @@ class RouterBgpMixin(UtilsMixin): """ @cached_property - def router_bgp(self) -> dict | None: + def router_bgp(self: AvdStructuredConfigUnderlay) -> dict | None: """ Return the structured config for router_bgp """ @@ -45,10 +48,11 @@ def router_bgp(self) -> dict | None: if self.shared_utils.overlay_routing_protocol == "ibgp" and self.shared_utils.is_cv_pathfinder_router: peer_group["route_map_in"] = "RM-BGP-UNDERLAY-PEERS-IN" - peer_group["route_map_out"] = "RM-BGP-UNDERLAY-PEERS-OUT" if self.shared_utils.wan_ha: - # For HA need to add allowas_in 1 - peer_group["allowas_in"] = {"enabled": True, "times": 1} + peer_group["route_map_out"] = "RM-BGP-UNDERLAY-PEERS-OUT" + if self.shared_utils.use_uplinks_for_wan_ha: + # For HA need to add allowas_in 1 + peer_group["allowas_in"] = {"enabled": True, "times": 1} router_bgp["peer_groups"] = [strip_empties_from_dict(peer_group)] @@ -127,6 +131,9 @@ def router_bgp(self) -> dict | None: "bfd": get(link, "bfd"), } + if self.shared_utils.shutdown_bgp_towards_undeployed_peers is True and link["peer_is_deployed"] is False: + neighbor["shutdown"] = True + if self.shared_utils.underlay_filter_peer_as is True: neighbor["route_map_out"] = f"RM-BGP-AS{link['peer_bgp_as']}-OUT" @@ -167,6 +174,17 @@ def router_bgp(self) -> dict | None: if neighbors: router_bgp["neighbors"] = neighbors + for neighbor_info in self.shared_utils.l3_interfaces_bgp_neighbors: + neighbor = { + "ip_address": get(neighbor_info, "ip_address"), + "remote_as": get(neighbor_info, "remote_as"), + "description": get(neighbor_info, "description"), + "route_map_in": get(neighbor_info, "route_map_in"), + "route_map_out": get(neighbor_info, "route_map_out"), + } + + router_bgp.setdefault("neighbors", []).append(strip_empties_from_dict(neighbor)) + if vrfs_dict: router_bgp["vrfs"] = list(vrfs_dict.values()) @@ -174,7 +192,7 @@ def router_bgp(self) -> dict | None: return strip_empties_from_dict(router_bgp, strip_values_tuple=(None, "")) @cached_property - def _router_bgp_redistribute_routes(self) -> list: + def _router_bgp_redistribute_routes(self: AvdStructuredConfigUnderlay) -> list: """ Return structured config for router_bgp.redistribute_routes """ diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/router_isis.py b/python-avd/pyavd/_eos_designs/structured_config/underlay/router_isis.py similarity index 92% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/router_isis.py rename to python-avd/pyavd/_eos_designs/structured_config/underlay/router_isis.py index 23be82c1b22..d558f53e9f1 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/router_isis.py +++ b/python-avd/pyavd/_eos_designs/structured_config/underlay/router_isis.py @@ -4,12 +4,15 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdMissingVariableError -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get - +from ...._errors import AristaAvdMissingVariableError +from ...._utils import get from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigUnderlay + class RouterIsisMixin(UtilsMixin): """ @@ -18,7 +21,7 @@ class RouterIsisMixin(UtilsMixin): """ @cached_property - def router_isis(self) -> dict | None: + def router_isis(self: AvdStructuredConfigUnderlay) -> dict | None: """ return structured config for router_isis """ @@ -72,7 +75,7 @@ def router_isis(self) -> dict | None: return router_isis @cached_property - def _isis_net(self) -> str | None: + def _isis_net(self: AvdStructuredConfigUnderlay) -> str | None: if get(self._hostvars, "isis_system_id_format", default="node_id") == "node_id": isis_system_id_prefix = get(self.shared_utils.switch_data_combined, "isis_system_id_prefix") if isis_system_id_prefix is None: @@ -91,7 +94,7 @@ def _isis_net(self) -> str | None: return f"{isis_area_id}.{system_id}.00" @cached_property - def _is_type(self) -> str: + def _is_type(self: AvdStructuredConfigUnderlay) -> str: default_is_type = get(self._hostvars, "isis_default_is_type", default="level-2") is_type = str(get(self.shared_utils.switch_data_combined, "is_type", default=default_is_type)).lower() if is_type not in ["level-1", "level-2", "level-1-2"]: diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/router_msdp.py b/python-avd/pyavd/_eos_designs/structured_config/underlay/router_msdp.py similarity index 85% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/router_msdp.py rename to python-avd/pyavd/_eos_designs/structured_config/underlay/router_msdp.py index 81a0eaaf12b..c37cb8e91e1 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/router_msdp.py +++ b/python-avd/pyavd/_eos_designs/structured_config/underlay/router_msdp.py @@ -4,12 +4,15 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.filter.natural_sort import natural_sort -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get, get_item - +from ...._utils import get, get_item +from ....j2filters import natural_sort from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigUnderlay + class RouterMsdpMixin(UtilsMixin): """ @@ -18,7 +21,7 @@ class RouterMsdpMixin(UtilsMixin): """ @cached_property - def router_msdp(self) -> dict | None: + def router_msdp(self: AvdStructuredConfigUnderlay) -> dict | None: """ return structured config for router_msdp @@ -52,7 +55,7 @@ def router_msdp(self) -> dict | None: "originator_id_local_interface": "Loopback0", "peers": [ { - "ipv4_address": get(self.shared_utils.get_peer_facts(node["name"]), "router_id", required=True), + "ipv4_address": get(self.shared_utils.get_peer_facts(peer), "router_id", required=True), "local_interface": "Loopback0", "description": peer, "mesh_groups": [{"name": "ANYCAST-RP"}], diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/router_ospf.py b/python-avd/pyavd/_eos_designs/structured_config/underlay/router_ospf.py similarity index 90% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/router_ospf.py rename to python-avd/pyavd/_eos_designs/structured_config/underlay/router_ospf.py index d9bd7fee68b..06ef57beda8 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/router_ospf.py +++ b/python-avd/pyavd/_eos_designs/structured_config/underlay/router_ospf.py @@ -4,11 +4,14 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.utils import default, get - +from ...._utils import default, get from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigUnderlay + class RouterOspfMixin(UtilsMixin): """ @@ -17,7 +20,7 @@ class RouterOspfMixin(UtilsMixin): """ @cached_property - def router_ospf(self) -> dict | None: + def router_ospf(self: AvdStructuredConfigUnderlay) -> dict | None: """ return structured config for router_ospf """ diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/router_pim_sparse_mode.py b/python-avd/pyavd/_eos_designs/structured_config/underlay/router_pim_sparse_mode.py similarity index 91% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/router_pim_sparse_mode.py rename to python-avd/pyavd/_eos_designs/structured_config/underlay/router_pim_sparse_mode.py index 7cb134e7828..95b01390f3d 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/router_pim_sparse_mode.py +++ b/python-avd/pyavd/_eos_designs/structured_config/underlay/router_pim_sparse_mode.py @@ -4,11 +4,14 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get, get_item - +from ...._utils import get, get_item from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigUnderlay + class RouterPimSparseModeMixin(UtilsMixin): """ @@ -17,7 +20,7 @@ class RouterPimSparseModeMixin(UtilsMixin): """ @cached_property - def router_pim_sparse_mode(self) -> dict | None: + def router_pim_sparse_mode(self: AvdStructuredConfigUnderlay) -> dict | None: """ return structured config for router_pim_sparse_mode diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/standard_access_lists.py b/python-avd/pyavd/_eos_designs/structured_config/underlay/standard_access_lists.py similarity index 89% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/standard_access_lists.py rename to python-avd/pyavd/_eos_designs/structured_config/underlay/standard_access_lists.py index 95b70655b90..d777d802052 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/standard_access_lists.py +++ b/python-avd/pyavd/_eos_designs/structured_config/underlay/standard_access_lists.py @@ -4,9 +4,13 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigUnderlay + class StandardAccessListsMixin(UtilsMixin): """ @@ -15,7 +19,7 @@ class StandardAccessListsMixin(UtilsMixin): """ @cached_property - def standard_access_lists(self) -> list | None: + def standard_access_lists(self: AvdStructuredConfigUnderlay) -> list | None: """ return structured config for standard_access_lists diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/static_routes.py b/python-avd/pyavd/_eos_designs/structured_config/underlay/static_routes.py similarity index 88% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/static_routes.py rename to python-avd/pyavd/_eos_designs/structured_config/underlay/static_routes.py index 8cb8960b3af..fa15767f536 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/static_routes.py +++ b/python-avd/pyavd/_eos_designs/structured_config/underlay/static_routes.py @@ -4,11 +4,14 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get - +from ...._utils import get from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigUnderlay + class StaticRoutesMixin(UtilsMixin): """ @@ -17,7 +20,7 @@ class StaticRoutesMixin(UtilsMixin): """ @cached_property - def static_routes(self) -> list[dict] | None: + def static_routes(self: AvdStructuredConfigUnderlay) -> list[dict] | None: """ Returns structured config for static_routes diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/utils.py b/python-avd/pyavd/_eos_designs/structured_config/underlay/utils.py similarity index 87% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/utils.py rename to python-avd/pyavd/_eos_designs/structured_config/underlay/utils.py index 827a3321775..b9ae4c35528 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/utils.py +++ b/python-avd/pyavd/_eos_designs/structured_config/underlay/utils.py @@ -4,15 +4,15 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.filter.natural_sort import natural_sort -from ansible_collections.arista.avd.plugins.filter.range_expand import range_expand -from ansible_collections.arista.avd.plugins.plugin_utils.eos_designs_shared_utils.shared_utils import SharedUtils -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError -from ansible_collections.arista.avd.plugins.plugin_utils.strip_empties import strip_empties_from_dict -from ansible_collections.arista.avd.plugins.plugin_utils.utils import default, get, get_item +from ...._errors import AristaAvdError +from ...._utils import default, get, get_item, strip_empties_from_dict +from ....j2filters import natural_sort, range_expand +from ...interface_descriptions import InterfaceDescriptionData -from ..interface_descriptions import InterfaceDescriptionData +if TYPE_CHECKING: + from . import AvdStructuredConfigUnderlay class UtilsMixin: @@ -21,12 +21,8 @@ class UtilsMixin: Class should only be used as Mixin to a AvdStructuredConfig class """ - # Set type hints for Attributes of the main class as needed - _hostvars: dict - shared_utils: SharedUtils - @cached_property - def _avd_peers(self) -> list: + def _avd_peers(self: AvdStructuredConfigUnderlay) -> list: """ Returns a list of peers @@ -36,7 +32,7 @@ def _avd_peers(self) -> list: return natural_sort(get(self._hostvars, f"avd_topology_peers..{self.shared_utils.hostname}", separator="..", default=[])) @cached_property - def _underlay_filter_peer_as_route_maps_asns(self) -> list: + def _underlay_filter_peer_as_route_maps_asns(self: AvdStructuredConfigUnderlay) -> list: """ Filtered ASNs """ @@ -47,7 +43,7 @@ def _underlay_filter_peer_as_route_maps_asns(self) -> list: return natural_sort({link["peer_bgp_as"] for link in self._underlay_links if link["type"] == "underlay_p2p"}) @cached_property - def _underlay_links(self) -> list: + def _underlay_links(self: AvdStructuredConfigUnderlay) -> list: """ Returns the list of underlay links for this device """ @@ -57,6 +53,13 @@ def _underlay_links(self) -> list: for uplink in underlay_links: uplink.update({"sflow": {"enable": self.shared_utils.fabric_sflow_uplinks}}) + uplinks_flow_tracker = self.shared_utils.get_flow_tracker(None, "uplinks") + if uplinks_flow_tracker is not None: + for uplink in underlay_links: + uplink.update({"flow_tracker": uplinks_flow_tracker}) + + downlinks_flow_tracker = self.shared_utils.get_flow_tracker(None, "downlinks") + for peer in self._avd_peers: peer_facts = self.shared_utils.get_peer_facts(peer, required=True) for uplink in peer_facts["uplinks"]: @@ -87,11 +90,12 @@ def _underlay_links(self) -> list: "underlay_multicast": get(uplink, "underlay_multicast"), "ipv6_enable": get(uplink, "ipv6_enable"), "sflow": {"enable": self.shared_utils.fabric_sflow_downlinks}, + "flow_tracker": downlinks_flow_tracker, "spanning_tree_portfast": get(uplink, "peer_spanning_tree_portfast"), "structured_config": get(uplink, "structured_config"), } if get(peer_facts, "inband_ztp"): - link["inband_ztp_vlan"] = get(peer_facts, "inband_mgmt_vlan") + link["inband_ztp_vlan"] = get(peer_facts, "inband_ztp_vlan") link["inband_ztp_lacp_fallback_delay"] = get(peer_facts, "inband_ztp_lacp_fallback_delay") if (subinterfaces := get(uplink, "subinterfaces")) is not None: @@ -110,7 +114,7 @@ def _underlay_links(self) -> list: return natural_sort(underlay_links, "interface") @cached_property - def _underlay_vlan_trunk_groups(self) -> list: + def _underlay_vlan_trunk_groups(self: AvdStructuredConfigUnderlay) -> list: """ Returns a list of trunk groups to configure on the underlay link """ @@ -139,17 +143,16 @@ def _underlay_vlan_trunk_groups(self) -> list: return [] @cached_property - def _uplinks(self) -> list: + def _uplinks(self: AvdStructuredConfigUnderlay) -> list: return get(self._hostvars, "switch.uplinks") - def _get_l3_interface_cfg(self, l3_interface: dict) -> dict | None: + def _get_l3_interface_cfg(self: AvdStructuredConfigUnderlay, l3_interface: dict) -> dict | None: """ Returns structured_configuration for one L3 interface """ interface_name = get(l3_interface, "name", required=True, org_key=f"...[node={self.shared_utils.hostname}].l3_interfaces[].name]") if "." in interface_name: iface_type = "l3dot1q" - encapsulation = int(get(l3_interface, "encapsulation_dot1q_vlan", default=interface_name.split(".")[-1])) else: iface_type = "routed" @@ -185,22 +188,19 @@ def _get_l3_interface_cfg(self, l3_interface: dict) -> dict | None: "description": interface_description, "speed": l3_interface.get("speed"), "service_profile": l3_interface.get("qos_profile"), - "access_group_in": get(self._l3_interface_acls, f"{interface_name}.ipv4_acl_in.name"), - "access_group_out": get(self._l3_interface_acls, f"{interface_name}.ipv4_acl_out.name"), + "access_group_in": get(self._l3_interface_acls, f"{interface_name}..ipv4_acl_in..name", separator=".."), + "access_group_out": get(self._l3_interface_acls, f"{interface_name}..ipv4_acl_out..name", separator=".."), "eos_cli": l3_interface.get("raw_eos_cli"), "struct_cfg": l3_interface.get("structured_config"), + "flow_tracker": self.shared_utils.get_flow_tracker(l3_interface, "l3_interfaces"), } if iface_type == "l3dot1q": - interface["encapsulation_dot1q_vlan"] = encapsulation + interface["encapsulation_dot1q_vlan"] = int(get(l3_interface, "encapsulation_dot1q_vlan", default=interface_name.split(".")[-1])) if ip_address == "dhcp" and l3_interface.get("dhcp_accept_default_route", True): interface["dhcp_client_accept_default_route"] = True - # TODO: enable flow tracking once toggle is in place - # if self.shared_utils.is_cv_pathfinder_router: - # interface["flow_tracker"] = {"hardware": self.shared_utils.wan_flow_tracker_name} - if self.shared_utils.is_wan_router and (wan_carrier_name := l3_interface.get("wan_carrier")) is not None and interface["access_group_in"] is None: if not get(get_item(self.shared_utils.wan_carriers, "name", wan_carrier_name, default={}), "trusted"): raise AristaAvdError( @@ -212,7 +212,7 @@ def _get_l3_interface_cfg(self, l3_interface: dict) -> dict | None: return strip_empties_from_dict(interface) - def _get_l3_uplink_with_l2_as_subint(self, link: dict) -> tuple[dict, list[dict]]: + def _get_l3_uplink_with_l2_as_subint(self: AvdStructuredConfigUnderlay, link: dict) -> tuple[dict, list[dict]]: """ Return a tuple with main uplink interface, list of subinterfaces representing each SVI. """ @@ -245,7 +245,7 @@ def _get_l3_uplink_with_l2_as_subint(self, link: dict) -> tuple[dict, list[dict] ) return main_interface, [interface for interface in interfaces if interface["name"] != link["interface"]] - def _get_l2_as_subint(self, link: dict, svi: dict, vrf: dict) -> dict: + def _get_l2_as_subint(self: AvdStructuredConfigUnderlay, link: dict, svi: dict, vrf: dict) -> dict: """ Return structured config for one subinterface representing the given SVI. Only supports static IPs or VRRP. @@ -269,6 +269,7 @@ def _get_l2_as_subint(self, link: dict, svi: dict, vrf: dict) -> dict: "mtu": svi.get("mtu") if self.shared_utils.platform_settings_feature_support_per_interface_mtu else None, "eos_cli": svi.get("raw_eos_cli"), "struct_cfg": svi.get("structured_config"), + "flow_tracker": link.get("flow_tracker"), } if (mtu := subinterface["mtu"]) is not None and subinterface["mtu"] > self.shared_utils.p2p_uplinks_mtu: raise AristaAvdError( @@ -290,15 +291,10 @@ def _get_l2_as_subint(self, link: dict, svi: dict, vrf: dict) -> dict: # Adding IP helpers and OSPF via a common function also used for SVIs on L3 switches. self.shared_utils.get_additional_svi_config(subinterface, svi, vrf) - # TODO: enable flow tracking once toggle is in place - # Configuring flow tracking on LAN interfaces of WAN routers - # if self.shared_utils.is_cv_pathfinder_client: - # subinterface["flow_tracker"] = {"hardware": self.shared_utils.wan_flow_tracker_name} - return strip_empties_from_dict(subinterface) @cached_property - def _l3_interface_acls(self) -> dict[str, dict[str, dict]]: + def _l3_interface_acls(self: AvdStructuredConfigUnderlay) -> dict[str, dict[str, dict]]: """ Returns a dict of : { diff --git a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/vlans.py b/python-avd/pyavd/_eos_designs/structured_config/underlay/vlans.py similarity index 89% rename from ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/vlans.py rename to python-avd/pyavd/_eos_designs/structured_config/underlay/vlans.py index 337bf1a4e67..f4957538317 100644 --- a/ansible_collections/arista/avd/roles/eos_designs/python_modules/underlay/vlans.py +++ b/python-avd/pyavd/_eos_designs/structured_config/underlay/vlans.py @@ -4,13 +4,15 @@ from __future__ import annotations from functools import cached_property +from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.filter.natural_sort import natural_sort -from ansible_collections.arista.avd.plugins.filter.range_expand import range_expand -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get, get_item - +from ...._utils import get, get_item +from ....j2filters import natural_sort, range_expand from .utils import UtilsMixin +if TYPE_CHECKING: + from . import AvdStructuredConfigUnderlay + class VlansMixin(UtilsMixin): """ @@ -19,7 +21,7 @@ class VlansMixin(UtilsMixin): """ @cached_property - def vlans(self) -> dict | None: + def vlans(self: AvdStructuredConfigUnderlay) -> list | None: """ Return structured config for vlans diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/errors/errors.py b/python-avd/pyavd/_errors/__init__.py similarity index 84% rename from ansible_collections/arista/avd/plugins/plugin_utils/errors/errors.py rename to python-avd/pyavd/_errors/__init__.py index 6f1fe9c969d..23b79312886 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/errors/errors.py +++ b/python-avd/pyavd/_errors/__init__.py @@ -1,16 +1,11 @@ # Copyright (c) 2023-2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. -try: - import jsonschema -except ImportError as imp_exc: - JSONSCHEMA_IMPORT_ERROR = imp_exc -else: - JSONSCHEMA_IMPORT_ERROR = None +import jsonschema class AristaAvdError(Exception): - def __init__(self, message="An Error has occured in an arista.avd plugin"): + def __init__(self, message="An Error has occurred in an arista.avd plugin"): self.message = message super().__init__(self.message) @@ -33,9 +28,6 @@ class AristaAvdMissingVariableError(AristaAvdError): class AvdSchemaError(AristaAvdError): def __init__(self, message="Schema Error", error=None): - if JSONSCHEMA_IMPORT_ERROR: - raise AristaAvdError('Python library "jsonschema" must be installed to use this plugin') from JSONSCHEMA_IMPORT_ERROR - if isinstance(error, jsonschema.SchemaError): self.message = f"'Schema Error: {self._json_path_to_string(error.absolute_path)}': {error.message}" else: @@ -45,9 +37,6 @@ def __init__(self, message="Schema Error", error=None): class AvdValidationError(AristaAvdError): def __init__(self, message: str = "Schema Error", error=None): - if JSONSCHEMA_IMPORT_ERROR: - raise AristaAvdError('Python library "jsonschema" must be installed to use this plugin') from JSONSCHEMA_IMPORT_ERROR - if isinstance(error, (jsonschema.ValidationError)): self.path = self._json_path_to_string(error.absolute_path) self.message = f"'Validation Error: {self.path}': {error.message}" diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/alert/__init__.py b/python-avd/pyavd/_schema/__init__.py similarity index 100% rename from ansible_collections/arista/avd/plugins/plugin_utils/cv_client/api/arista/alert/__init__.py rename to python-avd/pyavd/_schema/__init__.py diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/schema/avd_meta_schema.json b/python-avd/pyavd/_schema/avd_meta_schema.json similarity index 98% rename from ansible_collections/arista/avd/plugins/plugin_utils/schema/avd_meta_schema.json rename to python-avd/pyavd/_schema/avd_meta_schema.json index 7f1c32ba1f5..c5237ff7d4d 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/schema/avd_meta_schema.json +++ b/python-avd/pyavd/_schema/avd_meta_schema.json @@ -1,7 +1,7 @@ { "$comment": "Copyright (c) 2023 Arista Networks, Inc. Use of this source code is governed by the Apache License 2.0 that can be found in the LICENSE file.", - "$schema": "https://json-schema.org/draft-07/schema", - "$id": "https://avd.sh/development/schema-schema.json", + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "http://avd.sh/development/schema-schema.json", "$defs": { "avd_schema_var": { "type": "object", @@ -216,7 +216,7 @@ }, "unique_keys": { "type": "array", - "description": "List of types to auto-convert from.\nFor 'list of dicts' auto-conversion is supported from 'dict' if 'primary_key' is set on the list schema\nFor other list item types conversion from dict will use the keys as list items.", + "description": "List of keys or dot-notation path keys that must be unique in addition to primary_key.", "items": { "type": "string", "$comment": "The regex here matches valid key names", @@ -310,6 +310,7 @@ }, "$ref": { "type": "string", + "pattern": "^(eos_cli_config_gen|eos_designs)#(/[a-z$][a-z0-9_]*)*$", "description": "Reference to Sub Schema using JSON Schema resolver.\nExample '#/keys/mykey' will resolve the schema for 'mykey' under the root dictionary of the current schema" }, "documentation_options": { diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/schema/avddataconverter.py b/python-avd/pyavd/_schema/avddataconverter.py similarity index 92% rename from ansible_collections/arista/avd/plugins/plugin_utils/schema/avddataconverter.py rename to python-avd/pyavd/_schema/avddataconverter.py index de54f6cba99..8cfe78a2a02 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/schema/avddataconverter.py +++ b/python-avd/pyavd/_schema/avddataconverter.py @@ -5,9 +5,9 @@ from typing import TYPE_CHECKING, Generator -from ansible_collections.arista.avd.plugins.filter.convert_dicts import convert_dicts -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AvdConversionWarning, AvdDeprecationWarning -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get_all +from .._errors import AvdConversionWarning, AvdDeprecationWarning +from .._utils import get_all +from ..j2filters import convert_dicts SCHEMA_TO_PY_TYPE_MAP = { "str": str, @@ -60,7 +60,7 @@ def convert_data(self, data, schema: dict, path: list[str] = None) -> Generator: # Converters will do inplace update of data. Any returns will be yielded conversion messages. yield from converter(schema[key], data, schema, path) - def convert_keys(self, keys: dict, data: dict, schema: dict, path: list[str]): + def convert_keys(self, keys: dict, data: dict, _, path: list[str]): """ This function performs conversion on each key with the relevant subschema """ @@ -100,7 +100,7 @@ def convert_dynamic_keys(self, dynamic_keys: dict, data: dict, schema: dict, pat # Reuse convert_keys to perform the actual conversion on the resolved dynamic keys yield from self.convert_keys(keys, data, schema, path) - def convert_items(self, items: dict, data: list, schema: dict, path: list[str]): + def convert_items(self, items: dict, data: list, _, path: list[str]): """ This function performs conversion on each item with the items subschema """ @@ -150,7 +150,7 @@ def convert_types(self, convert_types: list, data: dict | list, index: str | int if schema_type in SIMPLE_CONVERTERS: try: data[index] = SIMPLE_CONVERTERS[schema_type](value) - except Exception: + except Exception: # pylint: disable=broad-exception-caught # Ignore errors # TODO: Log message return @@ -160,7 +160,7 @@ def convert_types(self, convert_types: list, data: dict | list, index: str | int elif convert_type in ["dict", "list"] and schema_type == "list" and "primary_key" in schema: try: data[index] = convert_dicts(value, schema["primary_key"], secondary_key=schema.get("secondary_key")) - except Exception: + except Exception: # pylint: disable=broad-exception-caught # Ignore errors # TODO: Log message return @@ -174,7 +174,7 @@ def convert_types(self, convert_types: list, data: dict | list, index: str | int elif convert_type == "dict" and schema_type == "list": try: data[index] = list(value) - except Exception: + except Exception: # pylint: disable=broad-exception-caught # Ignore errors # TODO: Log message return @@ -184,14 +184,14 @@ def convert_types(self, convert_types: list, data: dict | list, index: str | int elif convert_type == "str" and schema_type == "list": try: data[index] = list(map(str.strip, value.split(","))) - except Exception: + except Exception: # pylint: disable=broad-exception-caught # Ignore errors # TODO: Log message return yield AvdConversionWarning(key=path, oldtype=convert_type, newtype=schema_type) - def deprecation(self, deprecation: dict, data, schema: dict, path: list): + def deprecation(self, deprecation: dict, _, __, path: list): """ deprecation: warning: bool, default = True diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/schema/avdschema.py b/python-avd/pyavd/_schema/avdschema.py similarity index 84% rename from ansible_collections/arista/avd/plugins/plugin_utils/schema/avdschema.py rename to python-avd/pyavd/_schema/avdschema.py index e4d117530e5..5d0168a7e25 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/schema/avdschema.py +++ b/python-avd/pyavd/_schema/avdschema.py @@ -6,25 +6,14 @@ from copy import deepcopy from functools import cached_property -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError, AvdSchemaError, AvdValidationError -from ansible_collections.arista.avd.plugins.plugin_utils.schema.avddataconverter import AvdDataConverter -from ansible_collections.arista.avd.plugins.plugin_utils.schema.avdschemaresolver import AvdSchemaResolver -from ansible_collections.arista.avd.plugins.plugin_utils.schema.avdvalidator import AvdValidator -from ansible_collections.arista.avd.plugins.plugin_utils.schema.store import create_store - -try: - import jsonschema -except ImportError as imp_exc: - JSONSCHEMA_IMPORT_ERROR = imp_exc -else: - JSONSCHEMA_IMPORT_ERROR = None - -try: - from deepmerge import always_merger -except ImportError as imp_exc: - DEEPMERGE_IMPORT_ERROR = imp_exc -else: - DEEPMERGE_IMPORT_ERROR = None +import jsonschema +from deepmerge import always_merger + +from .._errors import AristaAvdError, AvdSchemaError, AvdValidationError +from .avddataconverter import AvdDataConverter +from .avdschemaresolver import AvdSchemaResolver +from .avdvalidator import AvdValidator +from .store import create_store DEFAULT_SCHEMA = { "type": "dict", @@ -49,11 +38,6 @@ class AvdSchema: """ def __init__(self, schema: dict = None, schema_id: str = None, load_store_from_yaml=False): - if JSONSCHEMA_IMPORT_ERROR: - raise AristaAvdError('Python library "jsonschema" must be installed to use this plugin') from JSONSCHEMA_IMPORT_ERROR - if DEEPMERGE_IMPORT_ERROR: - raise AristaAvdError('Python library "deepmerge" must be installed to use this plugin') from DEEPMERGE_IMPORT_ERROR - self.store = create_store(load_from_yaml=load_store_from_yaml) self._schema_validator = jsonschema.Draft7Validator(self.store["avd_meta_schema"]) self.load_schema(schema, schema_id) @@ -99,7 +83,7 @@ def load_schema(self, schema: dict = None, schema_id: str = None): self._dataconverter = AvdDataConverter(self) self._schemaresolver = AvdSchemaResolver(schema, self.store) except Exception as e: - raise AristaAvdError("An error occured during creation of the validator") from e + raise AristaAvdError("An error occurred during creation of the validator") from e def extend_schema(self, schema: dict): # Clear cached resolved_schema if any @@ -117,7 +101,7 @@ def validate(self, data): try: for validation_error in validation_errors: yield self._error_handler(validation_error) - except Exception as error: + except Exception as error: # pylint: disable=broad-exception-caught yield self._error_handler(error) def convert(self, data): @@ -126,7 +110,7 @@ def convert(self, data): try: for conversion_error in conversion_errors: yield self._error_handler(conversion_error) - except Exception as error: + except Exception as error: # pylint: disable=broad-exception-caught yield self._error_handler(error) @cached_property diff --git a/python-avd/pyavd/_schema/avdschemaresolver.py b/python-avd/pyavd/_schema/avdschemaresolver.py new file mode 100644 index 00000000000..e8fd3249191 --- /dev/null +++ b/python-avd/pyavd/_schema/avdschemaresolver.py @@ -0,0 +1,131 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import annotations + +from copy import deepcopy + +from referencing import Registry, Specification +from referencing.exceptions import PointerToNowhere +from referencing.jsonschema import DRAFT7, _legacy_anchor_in_dollar_id, _legacy_dollar_id, _maybe_in_subresource_crazy_items_dependencies + +from .._errors import AvdSchemaError +from .._utils import merge + + +class AvdSchemaResolver: + def __init__(self, base_schema_name: str, store: dict): + self.resolver = self.create_resolver(store, base_uri=base_schema_name) + + def resolve(self, resolved_schema: dict): + methods = { + "items": self._items, + "keys": self._keys, + "dynamic_keys": self._dynamic_keys, + } + + for key, method in methods.items(): + if resolved_schema.get(key): + method(resolved_schema) + + return resolved_schema + + def _keys(self, resolved_schema: dict): + for key in resolved_schema["keys"]: + # Resolve the child schema + # Repeat in case new refs inherited from the first ref. + while "$ref" in resolved_schema["keys"][key]: + self._ref_on_child(resolved_schema["keys"][key]) + + self.resolve(resolved_schema["keys"][key]) + + def _dynamic_keys(self, resolved_schema: dict): + for key in resolved_schema["dynamic_keys"]: + # Resolve the child schema + # Repeat in case new refs inherited from the first ref. + while "$ref" in resolved_schema["dynamic_keys"][key]: + self._ref_on_child(resolved_schema["dynamic_keys"][key]) + + self.resolve(resolved_schema["dynamic_keys"][key]) + + def _items(self, resolved_schema: dict): + # Resolve the child schema + # Repeat in case new refs inherited from the first ref. + while "$ref" in resolved_schema["items"]: + self._ref_on_child(resolved_schema["items"]) + + self.resolve(resolved_schema["items"]) + + def _ref_on_child(self, resolved_schema: dict): + """ + This function resolves the $ref referenced schema, + then merges with any schema defined at the same level + + In place update of supplied resolved_schema + """ + try: + resolved = self.resolver.lookup(resolved_schema["$ref"]) + except PointerToNowhere: + raise AvdSchemaError( + ( + f"Unable to resolve $ref: '{resolved_schema['$ref']}'." + "Make sure to adhere to the strict format '^(eos_cli_config_gen|eos_designs)#(/[a-z$][a-z0-9_]*)*$'." + ) + ) from None + ref_schema = deepcopy(resolved.contents) + resolved_schema.pop("$ref") + merge(resolved_schema, ref_schema, same_key_strategy="use_existing", list_merge="replace") + + def create_resolver(self, store: dict, base_uri=""): + """ + Returns a resolver which can resolve "$ref" references across all AVD schemas. + The given "base_uri" can be used for relative references (currently not used in AVD). + """ + registry = self.create_registry(store) + return registry.resolver(base_uri) + + @staticmethod + def create_registry(store: dict) -> Registry: + """ + Returns a "registry" for the "referencing" library. + + The registry contains schemas that could be resolved from references. In our case it + contains the default jsonschema specifications + the AVD schemas. + + Since AVD uses a proprietary schema format, we have to declare a custom "specification" + which contains functions used by the resolver to "walk" the schema. + + Since the AVD schema format is largely based on DRAFT7, we reuse some builtin functions + from "referencing" which are also used for the builtin DRAFT7 specification. + """ + + def subresources(schema: dict): + """ + Generator of childschemas + """ + if "keys" in schema and schema["keys"]: + yield from schema["keys"].values() + if "dynamic_keys" in schema and schema["dynamic_keys"]: + yield from schema["dynamic_keys"].values() + if "$defs" in schema and schema["$defs"]: + yield from schema["$defs"].values() + if "items" in schema: + yield schema["items"] + + avd_meta_schema_spec = Specification( + name="avd_meta_schema", + id_of=_legacy_dollar_id, + subresources_of=subresources, + anchors_in=_legacy_anchor_in_dollar_id, + maybe_in_subresource=_maybe_in_subresource_crazy_items_dependencies( + in_value=set(), + in_subarray=set(), + in_subvalues={"keys", "dynamic_keys", "$defs"}, + ), + ) + resources = [ + ("avd_meta_schema", DRAFT7.create_resource(store["avd_meta_schema"])), + ("eos_cli_config_gen", avd_meta_schema_spec.create_resource(store["eos_cli_config_gen"])), + ("eos_designs", avd_meta_schema_spec.create_resource(store["eos_designs"])), + ] + return Registry().with_resources(resources) diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/schema/avdvalidator.py b/python-avd/pyavd/_schema/avdvalidator.py similarity index 81% rename from ansible_collections/arista/avd/plugins/plugin_utils/schema/avdvalidator.py rename to python-avd/pyavd/_schema/avdvalidator.py index ae54ce06738..0fd61a4de95 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/schema/avdvalidator.py +++ b/python-avd/pyavd/_schema/avdvalidator.py @@ -3,23 +3,20 @@ # that can be found in the LICENSE file. from collections import ChainMap -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError -from ansible_collections.arista.avd.plugins.plugin_utils.schema.refresolver import create_refresolver -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get_all, get_all_with_path, get_indices_of_duplicate_items +import jsonschema +import jsonschema._types +import jsonschema.validators +from .._utils import get_all, get_all_with_path, get_indices_of_duplicate_items + +# Special handling of jsonschema <4.18 vs. >=4.18 try: - import jsonschema - import jsonschema._types - import jsonschema._validators - import jsonschema.protocols - import jsonschema.validators -except ImportError as imp_exc: - JSONSCHEMA_IMPORT_ERROR = imp_exc -else: - JSONSCHEMA_IMPORT_ERROR = None - - -def _unique_keys_validator(validator, unique_keys: list[str], instance: list, schema: dict): + import jsonschema._validators as jsonschema_validators +except ImportError: + import jsonschema._keywords as jsonschema_validators + + +def _unique_keys_validator(validator, unique_keys: list[str], instance: list, _schema: dict): if not validator.is_type(unique_keys, "list"): return @@ -122,7 +119,7 @@ def _keys_validator(validator, keys: dict, instance: dict, schema: dict): ) -def _dynamic_keys_validator(validator, dynamic_keys: dict, instance: dict, schema: dict): +def _dynamic_keys_validator(validator, _dynamic_keys: dict, instance: dict, schema: dict): """ This function triggers the regular "keys" validator in case only dynamic_keys is set. """ @@ -134,7 +131,7 @@ def _ref_validator(validator, ref, instance: dict, schema: dict): raise NotImplementedError("$ref must be resolved before using AvdValidator") -def _valid_values_validator(validator, valid_values, instance, schema: dict): +def _valid_values_validator(_validator, valid_values, instance, _schema: dict): """ This function validates if the instance conforms to the "valid_values" """ @@ -142,12 +139,12 @@ def _valid_values_validator(validator, valid_values, instance, schema: dict): yield jsonschema.ValidationError(f"'{instance}' is not one of {valid_values}") -def _is_dict(validator, instance): +def _is_dict(_validator, instance): return isinstance(instance, (dict, ChainMap)) class AvdValidator: - def __new__(cls, schema, store): + def __new__(cls, schema: dict, store: dict): """ AvdSchemaValidator is used to validate AVD Data. It uses a combination of our own validators and builtin jsonschema validators @@ -155,22 +152,19 @@ def __new__(cls, schema, store): We have extra type checkers not covered by the AVD_META_SCHEMA (array, boolean etc) since the same TypeChecker is used by the validators themselves. """ - if JSONSCHEMA_IMPORT_ERROR: - raise AristaAvdError('Python library "jsonschema" must be installed to use this plugin') from JSONSCHEMA_IMPORT_ERROR - ValidatorClass = jsonschema.validators.create( meta_schema=store["avd_meta_schema"], validators={ "$ref": _ref_validator, - "type": jsonschema._validators.type, - "max": jsonschema._validators.maximum, - "min": jsonschema._validators.minimum, + "type": jsonschema_validators.type, + "max": jsonschema_validators.maximum, + "min": jsonschema_validators.minimum, "valid_values": _valid_values_validator, - "format": jsonschema._validators.format, - "max_length": jsonschema._validators.maxLength, - "min_length": jsonschema._validators.minLength, - "pattern": jsonschema._validators.pattern, - "items": jsonschema._validators.items, + "format": jsonschema_validators.format, + "max_length": jsonschema_validators.maxLength, + "min_length": jsonschema_validators.minLength, + "pattern": jsonschema_validators.pattern, + "items": jsonschema_validators.items, "primary_key": _primary_key_validator, "unique_keys": _unique_keys_validator, "keys": _keys_validator, @@ -196,5 +190,4 @@ def __new__(cls, schema, store): ), # version="0.1", ) - - return ValidatorClass(schema, resolver=create_refresolver(schema, store)) + return ValidatorClass(schema) diff --git a/python-avd/pyavd/_schema/constants.py b/python-avd/pyavd/_schema/constants.py new file mode 100644 index 00000000000..c61cbbdabd5 --- /dev/null +++ b/python-avd/pyavd/_schema/constants.py @@ -0,0 +1,21 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from pathlib import Path + +PYAVD_DIR = Path(__file__).parents[1] + +EOS_DESIGNS_SCHEMA_DIR = PYAVD_DIR.joinpath("_eos_designs/schema") +EOS_DESIGNS_PICKLED_SCHEMA_PATH = EOS_DESIGNS_SCHEMA_DIR.joinpath("eos_designs.schema.pickle") + +EOS_CLI_CONFIG_GEN_SCHEMA_DIR = PYAVD_DIR.joinpath("_eos_cli_config_gen/schema") +EOS_CLI_CONFIG_GEN_PICKLED_SCHEMA_PATH = EOS_CLI_CONFIG_GEN_SCHEMA_DIR.joinpath("eos_cli_config_gen.schema.pickle") + +METASCHEMA_DIR = PYAVD_DIR.joinpath("_schema") +METASCHEMA_PICKLED_SCHEMA_PATH = METASCHEMA_DIR.joinpath("avd_meta_schema.pickle") + +PICKLED_SCHEMAS = { + "avd_meta_schema": METASCHEMA_PICKLED_SCHEMA_PATH, + "eos_cli_config_gen": EOS_CLI_CONFIG_GEN_PICKLED_SCHEMA_PATH, + "eos_designs": EOS_DESIGNS_PICKLED_SCHEMA_PATH, +} diff --git a/python-avd/vendor_overrides/schema/store.py b/python-avd/pyavd/_schema/store.py similarity index 79% rename from python-avd/vendor_overrides/schema/store.py rename to python-avd/pyavd/_schema/store.py index 57f02cee92f..ca6a1f75c0d 100644 --- a/python-avd/vendor_overrides/schema/store.py +++ b/python-avd/pyavd/_schema/store.py @@ -4,7 +4,7 @@ from functools import lru_cache from pickle import load -from pyavd.vendor.schema.default_schemas import DEFAULT_PICKLED_SCHEMAS +from .constants import PICKLED_SCHEMAS @lru_cache @@ -12,7 +12,7 @@ def create_store(load_from_yaml=False): if load_from_yaml: raise NotImplementedError("'load_from_yaml' not supported for create_store under PyAVD") store = {} - for id, schema_file in DEFAULT_PICKLED_SCHEMAS.items(): + for id, schema_file in PICKLED_SCHEMAS.items(): with open(schema_file, "rb") as file: store[id] = load(file) diff --git a/python-avd/pyavd/_utils/__init__.py b/python-avd/pyavd/_utils/__init__.py new file mode 100644 index 00000000000..dffbeabe270 --- /dev/null +++ b/python-avd/pyavd/_utils/__init__.py @@ -0,0 +1,46 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from .append_if_not_duplicate import append_if_not_duplicate +from .batch import batch +from .compare_dicts import compare_dicts +from .default import default +from .get import get, get_v2 +from .get_all import get_all, get_all_with_path +from .get_indices_of_duplicate_items import get_indices_of_duplicate_items +from .get_ip_from_pool import get_ip_from_pool +from .get_item import get_item +from .groupby import groupby +from .load_python_class import load_python_class +from .merge import merge +from .replace_or_append_item import replace_or_append_item +from .short_esi_to_route_target import short_esi_to_route_target +from .strip_empties import strip_empties_from_dict, strip_empties_from_list, strip_null_from_data +from .template import template +from .template_var import template_var +from .unique import unique + +__all__ = [ + "append_if_not_duplicate", + "batch", + "compare_dicts", + "default", + "get_all", + "get_all_with_path", + "get_indices_of_duplicate_items", + "get_ip_from_pool", + "get_item", + "get", + "get_v2", + "groupby", + "load_python_class", + "merge", + "replace_or_append_item", + "short_esi_to_route_target", + "strip_empties_from_dict", + "strip_empties_from_list", + "strip_null_from_data", + "template", + "template_var", + "unique", +] diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/utils/append_if_not_duplicate.py b/python-avd/pyavd/_utils/append_if_not_duplicate.py similarity index 96% rename from ansible_collections/arista/avd/plugins/plugin_utils/utils/append_if_not_duplicate.py rename to python-avd/pyavd/_utils/append_if_not_duplicate.py index c0b4d0c340a..de75dfd6552 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/utils/append_if_not_duplicate.py +++ b/python-avd/pyavd/_utils/append_if_not_duplicate.py @@ -3,8 +3,7 @@ # that can be found in the LICENSE file. from __future__ import annotations -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdDuplicateDataError - +from .._errors import AristaAvdDuplicateDataError from .compare_dicts import compare_dicts from .get import get from .get_item import get_item diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/utils/batch.py b/python-avd/pyavd/_utils/batch.py similarity index 100% rename from ansible_collections/arista/avd/plugins/plugin_utils/utils/batch.py rename to python-avd/pyavd/_utils/batch.py diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/utils/compare_dicts.py b/python-avd/pyavd/_utils/compare_dicts.py similarity index 100% rename from ansible_collections/arista/avd/plugins/plugin_utils/utils/compare_dicts.py rename to python-avd/pyavd/_utils/compare_dicts.py diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/utils/default.py b/python-avd/pyavd/_utils/default.py similarity index 100% rename from ansible_collections/arista/avd/plugins/plugin_utils/utils/default.py rename to python-avd/pyavd/_utils/default.py diff --git a/python-avd/pyavd/_utils/get.py b/python-avd/pyavd/_utils/get.py new file mode 100644 index 00000000000..457e60bfa97 --- /dev/null +++ b/python-avd/pyavd/_utils/get.py @@ -0,0 +1,106 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from .._errors import AristaAvdMissingVariableError + + +def get(dictionary, key, default=None, required=False, org_key=None, separator="."): + """ + Get a value from a dictionary or nested dictionaries. + + Key supports dot-notation like "foo.bar" to do deeper lookups. + Returns the supplied default value or None if the key is not found and required is False. + + Parameters + ---------- + dictionary : dict + Dictionary to get key from + key : str + Dictionary Key - supporting dot-notation for nested dictionaries + default : any + Default value returned if the key is not found + required : bool + Fail if the key is not found + org_key : str + Internal variable used for raising exception with the full key name even when called recursively + separator: str + String to use as the separator parameter in the split function. Useful in cases when the key + can contain variables with "." inside (e.g. hostnames) + + Returns + ------- + any + Value or default value + + Raises + ------ + AristaAvdMissingVariableError + If the key is not found and required == True + """ + + if org_key is None: + org_key = key + keys = str(key).split(separator) + value = dictionary.get(keys[0]) + if value is None: + if required is True: + raise AristaAvdMissingVariableError(org_key) + return default + + if len(keys) > 1: + return get(value, separator.join(keys[1:]), default=default, required=required, org_key=org_key, separator=separator) + + return value + + +def get_v2(dict_or_object, key_or_attribute, default=None, required=False, org_key=None, separator="."): + """ + Get a value from a dictionary or object or nested dictionaries and objects. + + Key supports dot-notation like "foo.bar" to do deeper lookups. + Returns the supplied default value or None if the key is not found and required is False. + + Parameters + ---------- + dict_or_object : dict | object + Dictionary or Object to get key_or_attribute from + key_or_attribute : str + Dictionary Key or Object attribute - supporting dot-notation for nested dictionaries and objects + default : any + Default value returned if the key is not found + required : bool + Fail if the key is not found + org_key : str + Internal variable used for raising exception with the full key name even when called recursively + separator: str + String to use as the separator parameter in the split function. Useful in cases when the key + can contain variables with "." inside (e.g. hostnames) + + Returns + ------- + any + Value or default value + + Raises + ------ + AristaAvdMissingVariableError + If the key is not found and required == True + """ + + if org_key is None: + org_key = key_or_attribute + keys = str(key_or_attribute).split(separator) + if callable(getattr(dict_or_object, "get", None)): + value = dict_or_object.get(keys[0]) + else: + value = getattr(dict_or_object, keys[0], None) + + if value is None: + if required is True: + raise AristaAvdMissingVariableError(org_key) + return default + + if len(keys) > 1: + return get_v2(value, separator.join(keys[1:]), default=default, required=required, org_key=org_key, separator=separator) + + return value diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/utils/get_all.py b/python-avd/pyavd/_utils/get_all.py similarity index 92% rename from ansible_collections/arista/avd/plugins/plugin_utils/utils/get_all.py rename to python-avd/pyavd/_utils/get_all.py index 8ffbcfa855b..d0e882b6a17 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/utils/get_all.py +++ b/python-avd/pyavd/_utils/get_all.py @@ -5,7 +5,7 @@ from typing import Any, Generator -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdMissingVariableError +from .._errors import AristaAvdMissingVariableError def get_all(data, path: str, required: bool = False, org_path=None): @@ -48,7 +48,7 @@ def get_all(data, path: str, required: bool = False, org_path=None): return output - elif isinstance(data, dict): + if isinstance(data, dict): value = data.get(path_elements[0]) if value is None: @@ -60,8 +60,7 @@ def get_all(data, path: str, required: bool = False, org_path=None): if len(path_elements) > 1: return get_all(value, ".".join(path_elements[1:]), required=required, org_path=org_path) - else: - return [value] + return [value] return [] @@ -105,7 +104,4 @@ def get_all_with_path(data, path: str, _current_path: list[str | int] | None = N yield from get_all_with_path(value, ".".join(path_elements[1:]), _current_path=[*_current_path, path_elements[0]]) return - else: - yield (_current_path, value) - - return + yield (_current_path, value) diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/utils/get_indices_of_duplicate_items.py b/python-avd/pyavd/_utils/get_indices_of_duplicate_items.py similarity index 100% rename from ansible_collections/arista/avd/plugins/plugin_utils/utils/get_indices_of_duplicate_items.py rename to python-avd/pyavd/_utils/get_indices_of_duplicate_items.py diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/utils/get_ip_from_pool.py b/python-avd/pyavd/_utils/get_ip_from_pool.py similarity index 95% rename from ansible_collections/arista/avd/plugins/plugin_utils/utils/get_ip_from_pool.py rename to python-avd/pyavd/_utils/get_ip_from_pool.py index fc8efbf98cf..9f66413ad54 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/utils/get_ip_from_pool.py +++ b/python-avd/pyavd/_utils/get_ip_from_pool.py @@ -3,7 +3,7 @@ # that can be found in the LICENSE file. import ipaddress -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError +from .._errors import AristaAvdError def get_ip_from_pool(pool: str, prefixlen: int, subnet_offset: int, ip_offset: int) -> str: diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/utils/get_item.py b/python-avd/pyavd/_utils/get_item.py similarity index 87% rename from ansible_collections/arista/avd/plugins/plugin_utils/utils/get_item.py rename to python-avd/pyavd/_utils/get_item.py index ba6d9255928..b63ef2831c0 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/utils/get_item.py +++ b/python-avd/pyavd/_utils/get_item.py @@ -1,10 +1,19 @@ # Copyright (c) 2023-2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdMissingVariableError +from .._errors import AristaAvdMissingVariableError -def get_item(list_of_dicts: list, key, value, default=None, required=False, case_sensitive=False, var_name=None, custom_error_msg=None): +def get_item( + list_of_dicts: list, + key, + value, + default=None, + required=False, + case_sensitive=False, # pylint: disable=unused-argument + var_name=None, + custom_error_msg=None, +): """ Get one dictionary from a list of dictionaries by matching the given key and value @@ -25,7 +34,7 @@ def get_item(list_of_dicts: list, key, value, default=None, required=False, case required : bool Fail if there is no match case_sensitive : bool - If the search value is a string, the comparison will ignore case by default + If the search value is a string, the comparison will ignore case by default (TODO) var_name : str String used for raising exception with the full variable name custom_error_msg : str diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/utils/groupby.py b/python-avd/pyavd/_utils/groupby.py similarity index 100% rename from ansible_collections/arista/avd/plugins/plugin_utils/utils/groupby.py rename to python-avd/pyavd/_utils/groupby.py diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/utils/load_python_class.py b/python-avd/pyavd/_utils/load_python_class.py similarity index 92% rename from ansible_collections/arista/avd/plugins/plugin_utils/utils/load_python_class.py rename to python-avd/pyavd/_utils/load_python_class.py index 994838fbed0..0ee2e8c6469 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/utils/load_python_class.py +++ b/python-avd/pyavd/_utils/load_python_class.py @@ -5,7 +5,7 @@ import importlib -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError, AristaAvdMissingVariableError +from .._errors import AristaAvdError, AristaAvdMissingVariableError def load_python_class(module_path: str, class_name: str, parent_class: type | None = None) -> type: diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/merge/merge.py b/python-avd/pyavd/_utils/merge/__init__.py similarity index 83% rename from ansible_collections/arista/avd/plugins/plugin_utils/merge/merge.py rename to python-avd/pyavd/_utils/merge/__init__.py index b4628af161b..9dcf1467bb0 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/merge/merge.py +++ b/python-avd/pyavd/_utils/merge/__init__.py @@ -6,35 +6,28 @@ from copy import deepcopy from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError +from deepmerge import Merger from .mergeonschema import MergeOnSchema if TYPE_CHECKING: - from ansible_collections.arista.avd.plugins.plugin_utils.schema.avdschema import AvdSchema + from ..._schema.avdschema import AvdSchema -try: - from deepmerge import Merger -except ImportError as imp_exc: - DEEPMERGE_IMPORT_ERROR = imp_exc -else: - DEEPMERGE_IMPORT_ERROR = None - -def _strategy_keep(config, path, base, nxt): +def _strategy_keep(_config, _path, base, nxt): """prefer base, otherwise nxt""" if base is not None: return base return nxt -def _strategy_prepend_unique(config, path, base, nxt): +def _strategy_prepend_unique(_config, _path, base, nxt): """prepend nxt items without duplicates in base to base.""" nxt_as_set = set(nxt) return nxt + [n for n in base if n not in nxt_as_set] -def _strategy_must_match(config, path, base, nxt): +def _strategy_must_match(_config, path, base, nxt): if base != nxt: raise ValueError(f"Values of {'.'.join(path)} do not match: {base} != {nxt}") return base @@ -79,14 +72,11 @@ def merge(base, *nxt_list, recursive=True, list_merge="append", same_key_strateg An instance of AvdSchema can be passed to merge, to allow merging lists of dictionaries using the "primary_key" defined in the schema. """ - if DEEPMERGE_IMPORT_ERROR: - raise AristaAvdError("AVD requires python deepmerge to be installed") from DEEPMERGE_IMPORT_ERROR - if not destructive_merge: base = deepcopy(base) if list_merge not in MAP_ANSIBLE_LIST_MERGE_TO_DEEPMERGE_LIST_STRATEGY: - raise AristaAvdError(f"merge: 'list_merge' argument can only be equal to one of {list(MAP_ANSIBLE_LIST_MERGE_TO_DEEPMERGE_LIST_STRATEGY.keys())}") + raise ValueError(f"merge: 'list_merge' argument can only be equal to one of {list(MAP_ANSIBLE_LIST_MERGE_TO_DEEPMERGE_LIST_STRATEGY.keys())}") list_strategies = [MAP_ANSIBLE_LIST_MERGE_TO_DEEPMERGE_LIST_STRATEGY.get(list_merge, "append")] diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/merge/mergeonschema.py b/python-avd/pyavd/_utils/merge/mergeonschema.py similarity index 83% rename from ansible_collections/arista/avd/plugins/plugin_utils/merge/mergeonschema.py rename to python-avd/pyavd/_utils/merge/mergeonschema.py index 8cb08730f8f..c8c884f6af3 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/merge/mergeonschema.py +++ b/python-avd/pyavd/_utils/merge/mergeonschema.py @@ -5,17 +5,10 @@ from typing import TYPE_CHECKING -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError, AvdSchemaError - if TYPE_CHECKING: - from ansible_collections.arista.avd.plugins.plugin_utils.schema.avdschema import AvdSchema + from pyavd._schema.avdschema import AvdSchema -try: - from deepmerge import STRATEGY_END -except ImportError as imp_exc: - DEEPMERGE_IMPORT_ERROR = imp_exc -else: - DEEPMERGE_IMPORT_ERROR = None +from deepmerge import STRATEGY_END class MergeOnSchema: @@ -27,9 +20,6 @@ class MergeOnSchema: """ def __init__(self, schema: AvdSchema = None): - if DEEPMERGE_IMPORT_ERROR: - raise AristaAvdError("AVD requires python deepmerge to be installed") from DEEPMERGE_IMPORT_ERROR - self.schema = schema def strategy(self, config, path: list, base: list, nxt: list): @@ -44,7 +34,7 @@ def strategy(self, config, path: list, base: list, nxt: list): # Skip if we cannot load subschema for path try: schema = self.schema.subschema(path) - except AvdSchemaError: + except Exception: # pylint: disable=broad-exception-caught return STRATEGY_END # Skip if the schema for this list is not having "primary_key" @@ -78,8 +68,8 @@ def strategy(self, config, path: list, base: list, nxt: list): base[base_index] = config.value_strategy(path, base_item, nxt_item) except Exception as e: - raise AristaAvdError( - f"An issue occurred while trying to do schema-based deepmerge for the schema path {path} " f"using primary key '{primary_key}'" + raise RuntimeError( + f"An issue occurred while trying to do schema-based deepmerge for the schema path {path} using primary key '{primary_key}'" ) from e # If all nxt items got merged, we can just return the updated base. @@ -94,7 +84,7 @@ def strategy(self, config, path: list, base: list, nxt: list): del nxt[merged_nxt_index] except Exception as e: - raise AristaAvdError( + raise RuntimeError( f"An issue occurred after schema-based deepmerge for the schema path {path} using primary key '{primary_key}', " f"while preparing remaining items with to be merged with regular strategies. Merged indexes were {merged_nxt_indexes}" ) from e diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/password_utils/__init__.py b/python-avd/pyavd/_utils/password_utils/__init__.py similarity index 100% rename from ansible_collections/arista/avd/plugins/plugin_utils/password_utils/__init__.py rename to python-avd/pyavd/_utils/password_utils/__init__.py diff --git a/python-avd/pyavd/_utils/password_utils/password.py b/python-avd/pyavd/_utils/password_utils/password.py new file mode 100644 index 00000000000..45f1e291a97 --- /dev/null +++ b/python-avd/pyavd/_utils/password_utils/password.py @@ -0,0 +1,358 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +""" +Used by Encrypt / Decrypt filters +""" +from __future__ import annotations + +import random + +from .password_utils import cbc_decrypt, cbc_encrypt + + +def _validate_password_and_key(password: str, key: str) -> None: + """ + Validates the password and key values. + + Args: + password (str): The password to validate. + key (str): The key to validate. + + Raises: + ValueError: If the key or password is missing. + TypeError: If the password is not of type `str`. + """ + if not key: + raise ValueError("Key is required for encryption") + + if not password: + raise ValueError("Password is required for encryption") + + if not isinstance(password, str): + raise TypeError(f"Password MUST be of type 'str' but is of type {type(password)}") + + +############## +# OSPF +############## +def ospf_simple_encrypt(password: str, key: str) -> str: + """ + Encrypt a password for OSPF simple authentication. + + Args: + password (str): The password to be encrypted. + key (str): The interface name, e.g., "Ethernet1". + + Returns: + str: The encrypted password as a base64-encoded string. + + Raises: + ValueError: If the key or password is missing. + TypeError: If the password is not of type `str`. + """ + _validate_password_and_key(password, key) + + data = bytes(password, encoding="UTF-8") + key_b = bytes(f"{key}_passwd", encoding="UTF-8") + + return cbc_encrypt(key_b, data).decode() + + +def ospf_simple_decrypt(password: str, key: str) -> str: + """ + Decrypt a password for OSPF simple authentication. + + Args: + password (str): The encrypted password to be decrypted. + key (str): The interface name, e.g., "Ethernet1". + + Returns: + str: The decrypted password as a string. + + Raises: + ValueError: If decryption fails. + ValueError: If the key or password is missing. + TypeError: If the password is not of type `str`. + """ + _validate_password_and_key(password, key) + + data = bytes(password, encoding="UTF-8") + key_b = bytes(f"{key}_passwd", encoding="UTF-8") + + try: + return cbc_decrypt(key_b, data).decode() + except Exception as exc: + raise ValueError("OSPF password decryption failed - check the input parameters") from exc + + +OSPF_MESSAGE_DIGEST_HASH_ALGORITHMS = ["md5", "sha1", "sha256", "sha384", "sha512"] + + +def ospf_message_digest_encrypt(password: str, key: str, hash_algorithm: str = None, key_id: str = None) -> str: + """ + Encrypt a password for Message Digest Keys. + + Args: + password (str): The password to be encrypted. + key (str): The interface name, e.g., "Ethernet1". + hash_algorithm (str, optional): The hash algorithm to use. Must be one of ["md5", "sha1", "sha256", "sha384", "sha512"]. + key_id (str, optional): The key ID to use. + + Returns: + str: The encrypted password as a base64-encoded string. + + Raises: + ValueError: If `hash_algorithm` or `key_id` is not provided. + ValueError: If `hash_algorithm` is not one of the allowed values. + ValueError: If the key or password is missing. + TypeError: If the password is not of type `str`. + """ + _validate_password_and_key(password, key) + if hash_algorithm is None or key_id is None: + raise ValueError("For OSPF message digest keys, both hash_algorithm and key_id are required") + if hash_algorithm not in OSPF_MESSAGE_DIGEST_HASH_ALGORITHMS: + raise ValueError(f"For OSPF message digest keys, `hash_algorithm` must be in {OSPF_MESSAGE_DIGEST_HASH_ALGORITHMS}") + + data = bytes(password, encoding="UTF-8") + key_b = bytes(f"{key}_{hash_algorithm}Key_{key_id}", encoding="UTF-8") + + return cbc_encrypt(key_b, data).decode() + + +def ospf_message_digest_decrypt(password: str, key: str, hash_algorithm: str = None, key_id: str = None) -> str: + """ + Decrypt a password for Message Digest Keys. + + Args: + password (str): The encrypted password to be decrypted. + key (str): The interface name, e.g., "Ethernet1". + hash_algorithm (str, optional): The hash algorithm used for encryption. Must be one of ["md5", "sha1", "sha256", "sha384", "sha512"]. + key_id (str, optional): The key ID used for encryption. + + Returns: + str: The decrypted password as a string. + + Raises: + ValueError: If `hash_algorithm` or `key_id` is not provided. + ValueError: If `hash_algorithm` is not one of the allowed values. + ValueError: If decryption fails. + ValueError: If the key or password is missing. + TypeError: If the password is not of type `str`. + """ + _validate_password_and_key(password, key) + if hash_algorithm is None or key_id is None: + raise ValueError("For OSPF message digest keys, both hash_algorithm and key_id are required") + if hash_algorithm not in OSPF_MESSAGE_DIGEST_HASH_ALGORITHMS: + raise ValueError(f"For OSPF message digest keys, `hash_algorithm` must be in {OSPF_MESSAGE_DIGEST_HASH_ALGORITHMS}") + + data = bytes(password, encoding="UTF-8") + key_b = bytes(f"{key}_{hash_algorithm}Key_{key_id}", encoding="UTF-8") + + try: + return cbc_decrypt(key_b, data).decode() + except Exception as exc: + raise ValueError("OSPF password decryption failed - check the input parameters") from exc + + +############## +# BGP +############## +def bgp_encrypt(password: str, key) -> str: + """ + Encrypts a password for BGP (Border Gateway Protocol) authentication. + + Args: + password (str): The password to be encrypted. + key (str): The key used for encryption, derived from either or . + + Returns: + str: The encrypted password as a base64-encoded string. + + Raises: + ValueError: If the key or password is missing. + TypeError: If the password is not of type `str`. + """ + _validate_password_and_key(password, key) + + data = bytes(password, encoding="UTF-8") + key = bytes(f"{key}_passwd", encoding="UTF-8") + + return cbc_encrypt(key, data).decode() + + +def bgp_decrypt(password: str, key) -> str: + """ + Decrypts a password for BGP (Border Gateway Protocol) authentication. + + Args: + password (str): The encrypted password to be decrypted. + key (str): The key used for decryption, derived from either or . + + Returns: + str: The decrypted password as a string. + + Raises: + ValueError: If decryption fails. + ValueError: If the key or password is missing. + TypeError: If the password is not of type `str`. + """ + _validate_password_and_key(password, key) + + data = bytes(password, encoding="UTF-8") + key = bytes(f"{key}_passwd", encoding="UTF-8") + + try: + return cbc_decrypt(key, data).decode() + except Exception as exc: + raise ValueError("BGP password decryption failed - check the input parameters") from exc + + +############## +# ISIS +############## +_ISIS_MODE_MAP = { + "none": "noAuth", + "text": "clearText", + "md5": "md5", + "sha": "sha", + "sha-1": "sha_1", + "sha-224": "sha_224", + "sha-256": "sha_256", + "sha-384": "sha_384", + "sha-512": "sha_512", +} + + +def _validate_isis_args(password: str, key: str, mode: str): + """ + Validates the arguments for ISIS (Intermediate System to Intermediate System) encryption/decryption. + + Args: + password (str): The password to be encrypted/decrypted. + key (str): The key used for encryption/decryption. + mode (str): The mode of operation for encryption/decryption, which should be one of the options in `_ISIS_MODE_MAP`. + + Raises: + ValueError: If `password` is empty or missing. + TypeError: If `password` is not of type `str`. + TypeError: If `key` is not of type `str`. + TypeError: If `mode` is not of type `str` or is not one of the valid options in `_ISIS_MODE_MAP`. + ValueError: If `mode` is empty or missing. + """ + if not password: + raise ValueError("Password is required for encryption/decryption") + + if not isinstance(password, str): + raise TypeError(f"Password MUST be of type 'str' but is of type {type(password)}") + + if not isinstance(key, str): + raise TypeError(f"Key MUST be of type 'str' but is of type {type(key)}") + + if not isinstance(mode, str): + raise TypeError(f"Mode MUST be a string with one of the following options: {list(_ISIS_MODE_MAP)}. Got '{mode}'.") + + if not mode: + raise ValueError("Mode is required for encryption/decryption") + + +def _get_isis_key(key: str, mode: str) -> bytes: + """ + Constructs a key for ISIS (Intermediate System to Intermediate System) encryption/decryption. + + Args: + key (str): The base key string. + mode (str): The mode of operation, which determines how the key is formatted. + + Returns: + bytes: The constructed key as bytes. + """ + return bytes(f"{key}_{_ISIS_MODE_MAP[mode]}", encoding="UTF-8") + + +def isis_encrypt(password: str, key: str, mode: str) -> str: + """ + Encrypt a password for ISIS authentication. + + Args: + password: Password as string + key: ISIS instance name as string. + mode: 'none', 'text', 'md5' or 'sha' or for shared-secret mode 'sha-1', 'sha-224', 'sha-256', 'sha-384', 'sha-512'. + + Returns: + str: The encrypted password as a string. + """ + _validate_isis_args(password, key, mode) + + data = bytes(password, encoding="UTF-8") + + return cbc_encrypt(_get_isis_key(key, mode), data).decode() + + +def isis_decrypt(password: str, key: str, mode: str) -> str: + """ + Decrypt a password for ISIS authentication. + + Args: + password (str): The encrypted password to be decrypted. + key (str): The ISIS instance name used to derive the decryption key. + mode (str): Specifies the decryption mode. Can be one of: + - 'none': No encryption. + - 'text': Plain text (no decryption needed, but processed accordingly). + - 'md5': MD5 hash decryption. + - 'sha': SHA-1 hash decryption. + - 'sha-1', 'sha-224', 'sha-256', 'sha-384', 'sha-512': Various SHA hash decryptions. + + Returns: + str: The decrypted password as a string. + + Raises: + ValueError: If decryption fails for any reason. + """ + _validate_isis_args(password, key, mode) + + data = bytes(password, encoding="UTF-8") + + try: + return cbc_decrypt(_get_isis_key(key, mode), data).decode() + except Exception as exc: + raise ValueError("ISIS password decryption failed - check the input parameters") from exc + + +############### +# Simple type 7 +############### +SIMPLE_7_SEED = b"dsfd;kfoA,.iyewrkldJKDHSUBsgvca69834ncxv9873254k;fg87" + + +def simple_7_decrypt(data: str) -> str: + """ + Decrypt (deobfuscate) a password from insecure type-7. + + Args: + data: The encrypted password + + Returns: + str: The decrypted password as a string. + """ + salt = int(data[0:2]) + secret = bytearray.fromhex(data[2:]) + return bytes(char ^ (SIMPLE_7_SEED[(salt + i) % 53]) for i, char in enumerate(secret)).decode("UTF-8") + + +def simple_7_encrypt(data: str, salt: int | None = None) -> str: + """ + Encrypt (obfuscate) a password with insecure type-7. + + Args: + data: The clear text password + salt: Optionally a number within the range 0-15. If not set, a random salt will be used. + + Returns: + str: The encrypted password as a string. + """ + if salt is None: + # Accepting SonarLint issue: Pseudo random is ok since this is simply creating a visible salt + salt = random.randint(0, 15) # NOSONAR + cleartext = data.encode("UTF-8") + return f"{salt:02}" + bytearray(char ^ (SIMPLE_7_SEED[(salt + i) % 53]) for i, char in enumerate(cleartext)).hex().upper() diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/password_utils/password_utils.py b/python-avd/pyavd/_utils/password_utils/password_utils.py similarity index 67% rename from ansible_collections/arista/avd/plugins/plugin_utils/password_utils/password_utils.py rename to python-avd/pyavd/_utils/password_utils/password_utils.py index 842a0d90fae..70c261f1057 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/password_utils/password_utils.py +++ b/python-avd/pyavd/_utils/password_utils/password_utils.py @@ -11,15 +11,8 @@ import base64 -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError - -try: - from cryptography.hazmat.backends import default_backend - from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes - - HAS_CRYPTOGRAPHY = True -except ImportError: - HAS_CRYPTOGRAPHY = False +from cryptography.hazmat.backends import default_backend +from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes SEED = b"\xd5\xa8\xc9\x1e\xf5\xd5\x8a\x23" @@ -178,16 +171,22 @@ def hashkey(pw) -> bytes: def cbc_encrypt(key: bytes, data: bytes) -> bytes: """ - Encrypt a password. The key is either _passwd or _passwd + Encrypt a password. + + Args: + key (bytes): The encryption key, which should be the peer group name or neighbor IP with '_passwd' suffix. + data (bytes): The data to be encrypted. + + Returns: + bytes: The encrypted data, encoded in base64. """ - if not HAS_CRYPTOGRAPHY: - raise AristaAvdError("AVD could not import the required 'cryptography' Python library") hashed_key = hashkey(key) padding = (8 - ((len(data) + 4) % 8)) % 8 ciphertext = ENC_SIG + bytes([padding * 16 + 0xE]) + data + bytes(padding) - cipher = Cipher(algorithms.TripleDES(hashed_key), modes.CBC(bytes(8)), default_backend()) + # Accepting SonarLint issue: The insecure algorithm is ok since this simply matches the algorithm of EOS. + cipher = Cipher(algorithms.TripleDES(hashed_key), modes.CBC(bytes(8)), default_backend()) # NOSONAR encryptor = cipher.encryptor() result = encryptor.update(ciphertext) encryptor.finalize() @@ -197,18 +196,24 @@ def cbc_encrypt(key: bytes, data: bytes) -> bytes: def cbc_decrypt(key: bytes, data: bytes) -> bytes: """ - Decrypt a password. The key is either _passwd or _passwd + Decrypt a password. - raises: - * ValueError: if the length of the provided data is not a multiple of the block length. + Args: + key (bytes): The decryption key, which should be the peer group name or neighbor IP with '_passwd' suffix. + data (bytes): The base64-encoded data to be decrypted. + + Returns: + bytes: The decrypted data. + + Raises: + ValueError: If the decrypted data is invalid or the length of the provided data is not a multiple of the block length. """ - if not HAS_CRYPTOGRAPHY: - raise AristaAvdError("AVD could not import the required 'cryptography' Python library") data = base64.b64decode(data) hashed_key = hashkey(key) - cipher = Cipher(algorithms.TripleDES(hashed_key), modes.CBC(bytes(8)), default_backend()) + # Accepting SonarLint issue: Insecure algorithm is ok since this is simply matching the algorithm of EOS. + cipher = Cipher(algorithms.TripleDES(hashed_key), modes.CBC(bytes(8)), default_backend()) # NOSONAR decryptor = cipher.decryptor() result = decryptor.update(data) decryptor.finalize() @@ -223,11 +228,17 @@ def cbc_decrypt(key: bytes, data: bytes) -> bytes: def cbc_check_password(key: bytes, data: bytes) -> bool: """ - This function is used to verify if an encrypted password is decryptable. - It does not return the password but only raise an error if the passowrd cannot be decrypted + Verify if an encrypted password is decryptable. + It does not return the password but only raises an error if the password cannot be decrypted + + Args: + key (bytes): The decryption key, which should be the peer group name or neighbor IP with '_passwd' suffix. + data (bytes): The base64-encoded encrypted password data to be decrypted. + + Returns: + bool: `True` if the password is decryptable, `False` otherwise. """ - if not HAS_CRYPTOGRAPHY: - raise AristaAvdError("AVD could not import the required 'cryptography' Python library") + # pylint: disable=W0718 try: cbc_decrypt(key, data) diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/utils/replace_or_append_item.py b/python-avd/pyavd/_utils/replace_or_append_item.py similarity index 100% rename from ansible_collections/arista/avd/plugins/plugin_utils/utils/replace_or_append_item.py rename to python-avd/pyavd/_utils/replace_or_append_item.py diff --git a/python-avd/pyavd/_utils/short_esi_to_route_target.py b/python-avd/pyavd/_utils/short_esi_to_route_target.py new file mode 100644 index 00000000000..8d7908e4291 --- /dev/null +++ b/python-avd/pyavd/_utils/short_esi_to_route_target.py @@ -0,0 +1,11 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +import re + +MATCH_PATTERN = re.compile(r"^([0-9a-fA-F]{2})([0-9a-fA-F]{2}):([0-9a-fA-F]{2})([0-9a-fA-F]{2}):([0-9a-fA-F]{2})([0-9a-fA-F]{2})$") +REPL = r"\1:\2:\3:\4:\5:\6" + + +def short_esi_to_route_target(short_esi: str) -> str: + return re.sub(MATCH_PATTERN, REPL, short_esi) diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/strip_empties.py b/python-avd/pyavd/_utils/strip_empties.py similarity index 82% rename from ansible_collections/arista/avd/plugins/plugin_utils/strip_empties.py rename to python-avd/pyavd/_utils/strip_empties.py index 46a14084ef4..76ab0066ada 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/strip_empties.py +++ b/python-avd/pyavd/_utils/strip_empties.py @@ -1,14 +1,7 @@ -#!/usr/bin/env python -# coding: utf-8 -*- -# # Copyright (c) 2019-2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. - - -from __future__ import absolute_import, division, print_function - -__metaclass__ = type +from __future__ import annotations def strip_null_from_data(data, strip_values_tuple=(None,)): @@ -27,20 +20,12 @@ def strip_null_from_data(data, strip_values_tuple=(None,)): """ if isinstance(data, dict): return strip_empties_from_dict(data, strip_values_tuple) - elif isinstance(data, list): + if isinstance(data, list): return strip_empties_from_list(data, strip_values_tuple) return data -def strip_empties_from_list( - data, - strip_values_tuple=( - None, - "", - [], - {}, - ), -): +def strip_empties_from_list(data, strip_values_tuple=(None, "", [], {})): """ strip_empties_from_list Remove entries with null value from a list @@ -67,15 +52,7 @@ def strip_empties_from_list( return new_data -def strip_empties_from_dict( - data, - strip_values_tuple=( - None, - "", - [], - {}, - ), -): +def strip_empties_from_dict(data, strip_values_tuple=(None, "", [], {})): """ strip_empties_from_dict Remove entries with null value from a dict diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/utils/template.py b/python-avd/pyavd/_utils/template.py similarity index 80% rename from ansible_collections/arista/avd/plugins/plugin_utils/utils/template.py rename to python-avd/pyavd/_utils/template.py index 49fb4e88da8..814c02353c6 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/utils/template.py +++ b/python-avd/pyavd/_utils/template.py @@ -1,9 +1,6 @@ # Copyright (c) 2023-2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. -from ansible.module_utils._text import to_text - - def template(template_file, template_vars, templar): """ Run Ansible Templar with template file. @@ -30,6 +27,14 @@ def template(template_file, template_vars, templar): str The rendered template """ + if templar is None: + raise NotImplementedError("Jinja Templating is not implemented in pyavd") + + # We only get here when running from Ansible, so it is safe to import from ansible. + # pylint: disable=import-outside-toplevel + from ansible.module_utils._text import to_text + + # pylint: enable=import-outside-toplevel dataloader = templar._loader searchpath = templar.environment.loader.searchpath diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/utils/template_var.py b/python-avd/pyavd/_utils/template_var.py similarity index 100% rename from ansible_collections/arista/avd/plugins/plugin_utils/utils/template_var.py rename to python-avd/pyavd/_utils/template_var.py diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/utils/unique.py b/python-avd/pyavd/_utils/unique.py similarity index 86% rename from ansible_collections/arista/avd/plugins/plugin_utils/utils/unique.py rename to python-avd/pyavd/_utils/unique.py index 91c4ed9c2d7..0c94596ecc3 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/utils/unique.py +++ b/python-avd/pyavd/_utils/unique.py @@ -15,5 +15,4 @@ def unique(in_list): Unique list items """ - list_set = set(in_list) - return list(list_set) + return list(set(in_list)) diff --git a/python-avd/pyavd/avd_schema_tools.py b/python-avd/pyavd/avd_schema_tools.py index 7fe371b0496..530a0a7bc6c 100644 --- a/python-avd/pyavd/avd_schema_tools.py +++ b/python-avd/pyavd/avd_schema_tools.py @@ -1,15 +1,13 @@ # Copyright (c) 2023-2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. -from typing import Generator +from __future__ import annotations -from .validation_result import ValidationResult -from .vendor.errors import AvdConversionWarning, AvdDeprecationWarning, AvdValidationError -from .vendor.schema.avdschema import AvdSchema +from typing import TYPE_CHECKING, Generator -IGNORE_EXCEPTIONS = AvdConversionWarning -VALIDATION_ERROR_EXCEPTIONS = AvdValidationError -DEPRECATION_WARNING_EXCEPTIONS = AvdDeprecationWarning +if TYPE_CHECKING: + from ._errors import AvdDeprecationWarning + from .validation_result import ValidationResult class AvdSchemaTools: @@ -26,6 +24,11 @@ def __init__(self, schema: dict = None, schema_id: str = None) -> None: schema_id: Name of AVD Schema to use for conversion and validation. """ + # pylint: disable=import-outside-toplevel + from ._schema.avdschema import AvdSchema + + # pylint: enable=import-outside-toplevel + self.avdschema = AvdSchema(schema=schema, schema_id=schema_id) def convert_data(self, data: dict) -> list[AvdDeprecationWarning]: @@ -40,20 +43,23 @@ def convert_data(self, data: dict) -> list[AvdDeprecationWarning]: Returns: List of AvdDeprecationWarnings """ + from ._errors import AvdConversionWarning, AvdDeprecationWarning # pylint: disable=import-outside-toplevel # avdschema.convert returns a Generator, so we have to iterate through it to perform the actual conversions. exceptions: Generator = self.avdschema.convert(data) result = [] for exception in exceptions: - # Ignore conversions and deprecations - if isinstance(exception, IGNORE_EXCEPTIONS): + # Ignore conversions + if isinstance(exception, AvdConversionWarning): continue - if isinstance(exception, DEPRECATION_WARNING_EXCEPTIONS): + # Store but continue for deprecations + if isinstance(exception, AvdDeprecationWarning): result.append(exception) continue + # Raise on other exceptions if isinstance(exception, Exception): raise exception @@ -70,24 +76,33 @@ def validate_data(self, data: dict) -> ValidationResult: Returns: Validation result object with any validation errors or deprecation warnings. """ + # pylint: disable=import-outside-toplevel + from ._errors import AvdConversionWarning, AvdDeprecationWarning, AvdValidationError + from .validation_result import ValidationResult + + # pylint: enable=import-outside-toplevel + result = ValidationResult(failed=False) # avdschema.validate returns a Generator, so we have to iterate through it to perform the actual validations. exceptions: Generator = self.avdschema.validate(data) for exception in exceptions: - # Ignore conversions and deprecations - if isinstance(exception, IGNORE_EXCEPTIONS): + # Ignore conversions + if isinstance(exception, AvdConversionWarning): continue - if isinstance(exception, VALIDATION_ERROR_EXCEPTIONS): + # Store and fail but continue for validation errors + if isinstance(exception, AvdValidationError): result.validation_errors.append(exception) result.failed = True continue - if isinstance(exception, DEPRECATION_WARNING_EXCEPTIONS): + # Store but continue for deprecations + if isinstance(exception, AvdDeprecationWarning): result.deprecation_warnings.append(exception) continue + # Raise on other exceptions if isinstance(exception, Exception): raise exception diff --git a/python-avd/pyavd/constants.py b/python-avd/pyavd/constants.py index 71bc5a5ee0d..490f5b66043 100644 --- a/python-avd/pyavd/constants.py +++ b/python-avd/pyavd/constants.py @@ -9,5 +9,5 @@ JINJA2_CONFIG_TEMPLATE = "eos-intended-config.j2" JINJA2_DOCUMENTAITON_TEMPLATE = "eos-device-documentation.j2" JINJA2_EXTENSIONS = ["jinja2.ext.loopcontrols", "jinja2.ext.do", "jinja2.ext.i18n"] -JINJA2_PRECOMPILED_TEMPLATE_PATH = Path(__file__).parent.joinpath("vendor", "templates", "compiled_templates") -JINJA2_TEMPLATE_PATHS = [Path(__file__).parent.joinpath("vendor", "templates")] +JINJA2_PRECOMPILED_TEMPLATE_PATH = Path(__file__).parent.joinpath("_eos_cli_config_gen/j2templates", "compiled_templates") +JINJA2_TEMPLATE_PATHS = [Path(__file__).parent.joinpath("_eos_cli_config_gen/j2templates")] diff --git a/python-avd/pyavd/get_avd_facts.py b/python-avd/pyavd/get_avd_facts.py index 56c1587fd20..78b7093c524 100644 --- a/python-avd/pyavd/get_avd_facts.py +++ b/python-avd/pyavd/get_avd_facts.py @@ -1,10 +1,9 @@ # Copyright (c) 2023-2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. -from collections import ChainMap +from __future__ import annotations -from .vendor.eos_designs.eos_designs_facts import EosDesignsFacts -from .vendor.eos_designs.eos_designs_shared_utils import SharedUtils +from collections import ChainMap def get_avd_facts(all_inputs: dict[str, dict]) -> dict[str, dict]: @@ -71,10 +70,15 @@ def _create_avd_switch_facts_instances(all_inputs: dict[str, dict]) -> dict: } ``` """ + # pylint: disable=import-outside-toplevel + from ._eos_designs.eos_designs_facts import EosDesignsFacts + from ._eos_designs.shared_utils import SharedUtils + + # pylint: enable=import-outside-toplevel avd_switch_facts = {} for hostname, hostvars in all_inputs.items(): - # Set 'inventory_hostname' on the input variables, to keep compatability with Ansible focused code. + # Set 'inventory_hostname' on the input variables, to keep compatibility with Ansible focused code. # Add reference to dict "avd_switch_facts" to access EosDesignsFacts objects of other switches during rendering of one switch. mapped_hostvars = ChainMap( {"inventory_hostname": hostname, "avd_switch_facts": avd_switch_facts}, diff --git a/python-avd/pyavd/get_device_config.py b/python-avd/pyavd/get_device_config.py index 2b2e1f0cdb9..249d294487e 100755 --- a/python-avd/pyavd/get_device_config.py +++ b/python-avd/pyavd/get_device_config.py @@ -1,8 +1,6 @@ # Copyright (c) 2023-2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. -from .constants import JINJA2_CONFIG_TEMPLATE -from .templater import Templar def get_device_config(structured_config: dict) -> str: @@ -16,6 +14,11 @@ def get_device_config(structured_config: dict) -> str: Returns: Device configuration in EOS CLI format. """ + # pylint: disable=import-outside-toplevel + from .constants import JINJA2_CONFIG_TEMPLATE + from .templater import Templar + + # pylint: enable=import-outside-toplevel templar = Templar() return templar.render_template_from_file(JINJA2_CONFIG_TEMPLATE, structured_config) diff --git a/python-avd/pyavd/get_device_doc.py b/python-avd/pyavd/get_device_doc.py index 0e6e6263dff..47cfd87aae2 100755 --- a/python-avd/pyavd/get_device_doc.py +++ b/python-avd/pyavd/get_device_doc.py @@ -1,10 +1,6 @@ # Copyright (c) 2023-2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. -from .constants import JINJA2_DOCUMENTAITON_TEMPLATE -from .templater import Templar -from .vendor.j2.filter.add_md_toc import HAS_MD_TOC -from .vendor.j2.filter.add_md_toc import add_md_toc as filter_add_md_toc def get_device_doc(structured_config: dict, add_md_toc: bool = False) -> str: @@ -19,13 +15,16 @@ def get_device_doc(structured_config: dict, add_md_toc: bool = False) -> str: Returns: Device documentation in Markdown format. """ + # pylint: disable=import-outside-toplevel + from .constants import JINJA2_DOCUMENTAITON_TEMPLATE + from .j2filters import add_md_toc as filter_add_md_toc + from .templater import Templar + + # pylint: enable=import-outside-toplevel templar = Templar() result: str = templar.render_template_from_file(JINJA2_DOCUMENTAITON_TEMPLATE, structured_config) if add_md_toc: - if not HAS_MD_TOC: - raise ModuleNotFoundError("The python library 'md-toc' is not installed. Install using 'pip3 install pyavd[mdtoc]'") - return filter_add_md_toc(result, skip_lines=3) return result diff --git a/python-avd/pyavd/get_device_structured_config.py b/python-avd/pyavd/get_device_structured_config.py index 9c04c4eda46..ea79322152c 100755 --- a/python-avd/pyavd/get_device_structured_config.py +++ b/python-avd/pyavd/get_device_structured_config.py @@ -3,11 +3,6 @@ # that can be found in the LICENSE file. from collections import ChainMap -from .avd_schema_tools import AvdSchemaTools -from .constants import EOS_CLI_CONFIG_GEN_SCHEMA_ID -from .vendor.eos_designs.get_structured_config import get_structured_config -from .vendor.errors import AristaAvdError - def get_device_structured_config(hostname: str, inputs: dict, avd_facts: dict) -> dict: """ @@ -22,8 +17,15 @@ def get_device_structured_config(hostname: str, inputs: dict, avd_facts: dict) - Returns: Device Structured Configuration as a dictionary """ - - # Set 'inventory_hostname' on the input hostvars, to keep compatability with Ansible focused code. + # pylint: disable=import-outside-toplevel + from ._eos_designs.structured_config import get_structured_config + from ._errors import AristaAvdError + from .avd_schema_tools import AvdSchemaTools + from .constants import EOS_CLI_CONFIG_GEN_SCHEMA_ID + + # pylint: enable=import-outside-toplevel + # + # Set 'inventory_hostname' on the input hostvars, to keep compatibility with Ansible focused code. # Also map in avd_facts without touching the hostvars mapped_hostvars = ChainMap( { diff --git a/python-avd/pyavd/j2filters/__init__.py b/python-avd/pyavd/j2filters/__init__.py new file mode 100644 index 00000000000..0b422cbe014 --- /dev/null +++ b/python-avd/pyavd/j2filters/__init__.py @@ -0,0 +1,36 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from .add_md_toc import add_md_toc +from .convert_dicts import convert_dicts +from .decrypt import decrypt +from .default import default +from .encrypt import encrypt +from .generate_esi import generate_esi +from .generate_lacp_id import generate_lacp_id +from .generate_route_target import generate_route_target +from .hide_passwords import hide_passwords +from .is_in_filter import is_in_filter +from .list_compress import list_compress +from .natural_sort import natural_sort +from .range_expand import range_expand +from .snmp_hash import snmp_hash +from .status_render import status_render + +__all__ = [ + "add_md_toc", + "convert_dicts", + "decrypt", + "default", + "encrypt", + "generate_esi", + "generate_lacp_id", + "generate_route_target", + "hide_passwords", + "is_in_filter", + "list_compress", + "natural_sort", + "range_expand", + "snmp_hash", + "status_render", +] diff --git a/python-avd/pyavd/j2filters/add_md_toc.py b/python-avd/pyavd/j2filters/add_md_toc.py new file mode 100644 index 00000000000..121eac3da29 --- /dev/null +++ b/python-avd/pyavd/j2filters/add_md_toc.py @@ -0,0 +1,137 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import annotations + +import re +from unicodedata import normalize + +HEADING_PATTERN = re.compile(r"#+ ") + + +def add_md_toc(md_input: str, skip_lines: int = 0, toc_levels: int = 3, toc_marker: str = "") -> str: + """Parse the input MarkDown and add a TOC between the toc_markers. + + Parameters + ---------- + md_input: str + MarkDown which will be processed + skip_lines: int, optional + Skip first x lines when parsing MD file + default: 0 + toc_levels: int, optional + How many levels of headings will be included in the TOC (Default:3) + default: 3 + toc_marker: str, optional + TOC will be inserted or updated between two of these markers in the MD file + default: '' + + Returns + ------- + str + MD with added TOC + """ + + if not isinstance(skip_lines, int): + raise TypeError(f"add_md_toc 'skip_lines' argument must be an integer. Got '{skip_lines}'({type(skip_lines)}).") + + if not isinstance(toc_levels, int) or toc_levels < 1: + raise TypeError(f"add_md_toc 'toc_levels' argument must be >0. Got '{toc_levels}'({type(skip_lines)}).") + + if not isinstance(toc_marker, str) or not toc_marker: + raise TypeError(f"add_md_toc 'toc_marker' argument must be a non-empty string. Got '{toc_marker}'({type(skip_lines)}).") + + if not isinstance(md_input, str): + raise TypeError(f"add_md_toc expects a string. Got {type(md_input)}.") + + md_lines = md_input.split("\n") + toc_marker_positions = [] + toc_lines = [] + + # all_anchor_ids is used to hold anchors for the full MD document even if we are skipping lines or levels for the TOC. + all_anchor_ids = [] + + # toc_level_offset ensures we start the TOC at the lowest level within the unskipped lines. + toc_level_offset = 99 + + for line_num, line in enumerate(md_lines): + if line == toc_marker: + # Register line number or the TOC marker. + toc_marker_positions.append(line_num) + continue + if re.match(HEADING_PATTERN, line): + # This is a heading. + # First get info for this line, including building an anchor and adding this anchor to all_anchor_ids. + # This is important, since skipped headings will still be associated with an anchor-id during parsing of the final MarkDown file. + level, text, anchor_id = _get_line_info(line, all_anchor_ids) + + # Do not create a TOC line if we are skipping or at a deeper level than we want. + if line_num < skip_lines or level > toc_levels: + continue + + # Create the TOC line + toc_level_offset = min(toc_level_offset, level) + prefix = (" " * (level - toc_level_offset)) + "- " + toc_lines.append(f"{prefix}[{text}](#{anchor_id})") + + if len(toc_marker_positions) != 2: + raise ValueError( + f"add_md_toc expects exactly two occurrences of the toc marker '{toc_marker}' on their own lines. Found {len(toc_marker_positions)} occurrences." + ) + + return "\n".join(md_lines[: toc_marker_positions[0]] + toc_lines + md_lines[toc_marker_positions[1] + 1 :]) + + +def _get_line_info(line: str, all_anchor_ids: list[str]) -> (int, str, str): + """Split heading and return level, text and anchor_id. + + Since we know the line is already a heading, we can assume correct formatting. + Update all_anchor_ids with the missing anchor if not found. + + Parameters + ---------- + line: str + Line to parse + all_anchor_ids: list + List of existing anchor_ids + + Returns + ------- + int, str, str: + The level of the heading, the text of the heading and the anchor_id for the heading. + """ + pounds, text = line.split(" ", maxsplit=1) + level = len(pounds) + anchor_id = _get_anchor_id(text, all_anchor_ids) + + return level, text, anchor_id + + +def _get_anchor_id(text: str, all_anchor_ids: list[str]) -> str: + """ + Returns a unique anchor_id after adding it to 'all_anchor_ids'. + The logic here follow the auto-id generation algorithm of the MarkDown spec. + + Parameters + ---------- + text: str + Text to generate an anchor for. + all_anchor_ids: list + List of existing anchor_ids + + Returns + ------- + str: + The anchor ID for the text. + """ + tmp_anchor_id = normalize("NFKD", text).encode("ascii", "ignore") + tmp_anchor_id = re.sub(r"[^\w\s-]", "", tmp_anchor_id.decode("ascii")).strip().lower() + tmp_anchor_id = re.sub(r"[-\s]+", "-", tmp_anchor_id) + + anchor_id = tmp_anchor_id + counter = 0 + while anchor_id in all_anchor_ids: + counter += 1 + anchor_id = f"{tmp_anchor_id}-{counter}" + all_anchor_ids.append(anchor_id) + return anchor_id diff --git a/python-avd/pyavd/j2filters/convert_dicts.py b/python-avd/pyavd/j2filters/convert_dicts.py new file mode 100644 index 00000000000..f78243d7d35 --- /dev/null +++ b/python-avd/pyavd/j2filters/convert_dicts.py @@ -0,0 +1,97 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import annotations + +import os + + +def convert_dicts(dictionary: dict | list, primary_key: str = "name", secondary_key: str | None = None) -> list: + """ + The `arista.avd.convert_dicts` filter will convert a dictionary containing nested dictionaries to a list of + dictionaries. It inserts the outer dictionary keys into each list item using the primary_key `name` (key name is + configurable) and if there is a non-dictionary value,it inserts this value to + secondary key (key name is configurable), if secondary key is provided. + + This filter is intended for: + + - Seamless data model migration from dictionaries to lists. + - Improve processing performance when dealing with large dictionaries by converting them to lists of dictionaries. + + Note: If there is a non-dictionary value with no secondary key provided, it will pass through untouched + + To use this filter: + + ```jinja + {# convert list of dictionary with default `name:` as the primary key and None secondary key #} + {% set example_list = example_dictionary | arista.avd.convert_dicts %} + {% for example_item in example_list %} + item primary key is {{ example_item.name }} + {% endfor %} + + {# convert list of dictionary with `id:` set as the primary key and `types:` set as the secondary key #} + {% set example_list = example_dictionary | arista.avd.convert_dicts('id','types') %} + {% for example_item in example_list %} + item primary key is {{ example_item.id }} + item secondary key is {{ example_item.types }} + {% endfor %} + ``` + + Parameters + ---------- + dictionary : any + Nested Dictionary to convert - returned untouched if not a nested dictionary and list + primary_key : str, optional + Name of primary key used when inserting outer dictionary keys into items. + secondary_key : str, optional + Name of secondary key used when inserting dictionary values which are list into items. + + Returns + ------- + any + Returns list of dictionaries or input variable untouched if not a nested dictionary/list. + """ + if not isinstance(dictionary, (dict, list)) or os.environ.get("AVD_DISABLE_CONVERT_DICTS"): + # Not a dictionary/list, return the original + return dictionary + if isinstance(dictionary, list): + output = [] + for element in dictionary: + if not isinstance(element, dict): + output.append({primary_key: element}) + elif primary_key not in element and secondary_key is not None: + # if element of nested dictionary is a dictionary but primary key is missing, insert primary and secondary keys. + for key in element: + output.append( + { + primary_key: key, + secondary_key: element[key], + } + ) + else: + output.append(element) + return output + # This is now a dict + output = [] + for key in dictionary: + if secondary_key is not None: + # Add secondary key for the values if secondary key is provided + output.append( + { + primary_key: key, + secondary_key: dictionary[key], + } + ) + else: + if not isinstance(dictionary[key], dict): + # Not a nested dictionary + output.append({primary_key: key}) + else: + # Nested dictionary + output.append( + { + primary_key: key, + **dictionary[key], + } + ) + return output diff --git a/python-avd/pyavd/j2filters/decrypt.py b/python-avd/pyavd/j2filters/decrypt.py new file mode 100644 index 00000000000..5894c7a4aa3 --- /dev/null +++ b/python-avd/pyavd/j2filters/decrypt.py @@ -0,0 +1,32 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import annotations + +from pyavd._utils.password_utils import METHODS_DIR + + +def decrypt(value, passwd_type=None, key=None, **kwargs) -> str: + """ + Umbrella function to execute the correct decrypt method based on the input type. + + Args: + value (any): The value to decrypt. + passwd_type (str): The type of decryption method to use. Must be provided. + key (str or None): Optional decryption key or parameter. + **kwargs: Additional keyword arguments passed to the specific decryption method. + + Returns: + str: The decrypted value as a string. + + Raises: + TypeError: If `passwd_type` is not provided. + KeyError: If `passwd_type` is not found in `METHODS_DIR`. + """ + if not passwd_type: + raise TypeError("type keyword must be present to use this test") + try: + decrypt_method = METHODS_DIR[passwd_type][1] + except KeyError as exc: + raise KeyError(f"Type {passwd_type} is not supported for the decrypt filter") from exc + return decrypt_method(str(value), key=key, **kwargs) diff --git a/python-avd/pyavd/j2filters/default.py b/python-avd/pyavd/j2filters/default.py new file mode 100644 index 00000000000..ecc328b2665 --- /dev/null +++ b/python-avd/pyavd/j2filters/default.py @@ -0,0 +1,29 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from jinja2.runtime import Undefined + + +def default(*values): + """ + default will test value if defined and is not none. + + Arista.avd.default will test if the first value is defined and is not none. + If true return value else repeat for the next value. + If we run out of values we return None. + + Example when used as a jinja filter + ------- + priority: {{ spanning_tree_priority | arista.avd.default("32768") }} + + Args: + *values: One or more values to test. + + Returns: + First value that is defined and not None. Otherwise returns None. + """ + for value in values: + if value is not None and not isinstance(value, Undefined): + return value + + return None diff --git a/python-avd/pyavd/j2filters/encrypt.py b/python-avd/pyavd/j2filters/encrypt.py new file mode 100644 index 00000000000..22077f908f5 --- /dev/null +++ b/python-avd/pyavd/j2filters/encrypt.py @@ -0,0 +1,32 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import annotations + +from pyavd._utils.password_utils import METHODS_DIR + + +def encrypt(value, passwd_type=None, key=None, **kwargs) -> str: + """ + Umbrella function to execute the correct encrypt method based on the input type. + + Args: + value (any): The value to encrypt. + passwd_type (str): The type of encryption method to use. Must be provided. + key (str or None): Optional encryption key or parameter. + **kwargs: Additional keyword arguments passed to the specific encryption method. + + Returns: + str: The encrypted value as a string. + + Raises: + TypeError: If `passwd_type` is not provided. + KeyError: If `passwd_type` is not found in `METHODS_DIR`. + """ + if not passwd_type: + raise TypeError("type keyword must be present to use this test") + try: + encrypt_method = METHODS_DIR[passwd_type][0] + except KeyError as exc: + raise KeyError(f"Type {passwd_type} is not supported for the encrypt filter") from exc + return encrypt_method(str(value), key=key, **kwargs) diff --git a/python-avd/pyavd/j2filters/generate_esi.py b/python-avd/pyavd/j2filters/generate_esi.py new file mode 100644 index 00000000000..7153ccb5b37 --- /dev/null +++ b/python-avd/pyavd/j2filters/generate_esi.py @@ -0,0 +1,16 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +def generate_esi(short_esi: str, esi_prefix: str = "0000:0000:") -> str: + """ + Transforms short_esi to EVPN ESI format. + 0303:0202:0101 (short_esi) -> 0000:0000:0303:0202:0101 (EVPN ESI). + + Args: + esi_short: Short ESI value as per AVD definition in eos_designs + esi_prefix: ESI prefix value, will be concatenated with the `short_esi` + Returns: + Concatenated string of `esi_prefix` and `short_esi` like `0000:0000:0303:0202:0101` + + """ + return esi_prefix + short_esi diff --git a/python-avd/pyavd/j2filters/generate_lacp_id.py b/python-avd/pyavd/j2filters/generate_lacp_id.py new file mode 100644 index 00000000000..4b71fc04939 --- /dev/null +++ b/python-avd/pyavd/j2filters/generate_lacp_id.py @@ -0,0 +1,17 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import annotations + + +def generate_lacp_id(esi_short: str) -> str: + """ + Transforms short_esi `0303:0202:0101` to LACP ID format `0303.0202.0101` + + Args: + esi_short (str): Short ESI value as per AVD definition in eos_designs + Returns: + str: LACP ID + + """ + return esi_short.replace(":", ".") diff --git a/python-avd/pyavd/j2filters/generate_route_target.py b/python-avd/pyavd/j2filters/generate_route_target.py new file mode 100644 index 00000000000..a8a8a9d1a0b --- /dev/null +++ b/python-avd/pyavd/j2filters/generate_route_target.py @@ -0,0 +1,28 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import annotations + +import re + + +def generate_route_target(esi_short: str | None) -> str | None: + """ + generate_route_target transforms 3 octets ESI like 0303:0202:0101 to route-target + + Parameters + ---------- + esi : str + Short ESI value as per AVD definition in eos_designs + + Returns + ------- + str: + String based on route-target format like 03:03:02:02:01:01 + """ + if esi_short is None: + return None + delimiter = ":" + esi = esi_short.replace(delimiter, "") + esi_split = re.findall("..", esi) + return delimiter.join(esi_split) diff --git a/python-avd/pyavd/j2filters/hide_passwords.py b/python-avd/pyavd/j2filters/hide_passwords.py new file mode 100644 index 00000000000..ca7bc09eaed --- /dev/null +++ b/python-avd/pyavd/j2filters/hide_passwords.py @@ -0,0 +1,20 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import annotations + + +def hide_passwords(value: str, hide_passwords: bool = False) -> str: + """ + Replaces the input data with "" if the hide_passwords parameter is true. + + Args: + value (str): Value to be hidden + hide_passwords(bool) : Enable/disable hide_passwords + Returns: + str: "" or value + + """ + if not isinstance(hide_passwords, bool): + raise TypeError(f"{hide_passwords} in hide_passwords filter is not of type bool") + return "" if hide_passwords else value diff --git a/python-avd/pyavd/j2filters/is_in_filter.py b/python-avd/pyavd/j2filters/is_in_filter.py new file mode 100644 index 00000000000..fb92c5d4a73 --- /dev/null +++ b/python-avd/pyavd/j2filters/is_in_filter.py @@ -0,0 +1,29 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import annotations + + +def is_in_filter(hostname: str, hostname_filter: list | None) -> bool: + """ + Check if device is part of the filter or not. + + Parameters + ---------- + hostname : str + Device hostname to compare against filter. + hostname_filter : list, optional + Device filter, by default ['all'] + + Returns + ------- + boolean + True if device hostname is part of filter. False if not. + """ + if hostname_filter is None: + hostname_filter = ["all"] + if "all" in hostname_filter: + return True + if any(element in hostname for element in hostname_filter): + return True + return False diff --git a/python-avd/pyavd/j2filters/list_compress.py b/python-avd/pyavd/j2filters/list_compress.py new file mode 100644 index 00000000000..5ef482825b4 --- /dev/null +++ b/python-avd/pyavd/j2filters/list_compress.py @@ -0,0 +1,29 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import annotations + +from itertools import count, groupby + + +def list_compress(list_to_compress: list[int]) -> str: + """ + Compresses a list of integers to a range string. + Args: + list_to_compress (list): List of integers. + Returns: + str: Compressed range string. + + Example when used as a jinja filter + ------- + list1: "{{ [1,2,3,4,5] | arista.avd.list_compress }}" -> "1-5" + list2: "{{ [1,2,3,7,8] | arista.avd.list_compress }}" -> "1-3,7-8" + """ + if not isinstance(list_to_compress, list): + raise TypeError(f"Value must be of type list, got {type(list_to_compress)}") + + if not all(isinstance(item, int) for item in list_to_compress): + raise TypeError(f"All elements of the list {list_to_compress} must be integers") + + groups = (list(group) for key, group in groupby(sorted(list_to_compress), lambda element, iterator=count(): next(iterator) - element)) + return ",".join("-".join(map(str, (group[0], group[-1])[: len(group)])) for group in groups) diff --git a/python-avd/pyavd/j2filters/natural_sort.py b/python-avd/pyavd/j2filters/natural_sort.py new file mode 100644 index 00000000000..76f0dcc3b4a --- /dev/null +++ b/python-avd/pyavd/j2filters/natural_sort.py @@ -0,0 +1,43 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import annotations + +import re + +from jinja2.runtime import Undefined +from jinja2.utils import Namespace + + +def convert(text: str) -> int | str: + """ + Converts the string to an integer if it is a digit, otherwise converts it to lower case. + Args: + text (str): Input string. + Returns: + int | str: Converted string. + """ + return int(text) if text.isdigit() else text.lower() + + +def natural_sort(iterable: list | dict | str | None, sort_key: str | None = None) -> list: + """ + Sorts an iterable in a natural (alphanumeric) order. + Args: + iterable (list | dict | str | None): Input iterable. + sort_key (str | None, optional): Key to sort by, defaults to None. + Returns: + list: Sorted iterable. + """ + if isinstance(iterable, Undefined) or iterable is None: + return [] + + def alphanum_key(key): + pattern = r"(\d+)" + if sort_key is not None and isinstance(key, dict): + return [convert(c) for c in re.split(pattern, str(key.get(sort_key, key)))] + if sort_key is not None and isinstance(key, Namespace): + return [convert(c) for c in re.split(pattern, getattr(key, sort_key))] + return [convert(c) for c in re.split(pattern, str(key))] + + return sorted(iterable, key=alphanum_key) diff --git a/python-avd/pyavd/j2filters/range_expand.py b/python-avd/pyavd/j2filters/range_expand.py new file mode 100644 index 00000000000..be86a9ecf81 --- /dev/null +++ b/python-avd/pyavd/j2filters/range_expand.py @@ -0,0 +1,153 @@ +# Copyright (c) 2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +# pylint: disable=cell-var-from-loop +from __future__ import annotations + +import re + + +def range_expand(range_to_expand): + if not isinstance(range_to_expand, (list, str)): + raise TypeError(f"value must be of type list or str, got {type(range_to_expand)}") + + result = [] + + # If we got a list, unpack it and run this function recursively + if isinstance(range_to_expand, list): + for r in range_to_expand: + result.extend(range_expand(r)) + + # Must be a str now + else: + prefix = "" + + # Unpack list in string + for one_range in range_to_expand.split(","): + if one_range is None: + continue + + # Find prefix (if any) + # Ignoring SONAR hotspot regarding potential DDOS for this PR. + regex = r"^(.*?)(((\d+)-)?(\d+)\/)?(((\d+)-)?(\d+)\/)?(((\d+)-)?(\d+))(\.((\d+)-)?(\d+))?" # NOSONAR + # Number of groups in this regex. + regex_groups = 17 + # Groups one-by-one: + # Group 1 (.*?) matches prefix ex. Ethernet, Eth, Po, Port-Channel + # Group 2 (((\d+)-)?(\d+)\/)? matches module(s) and slash ex. 12/, 1-3/ + # Group 3 ((\d+)-)? matches first module and dash ex. 1- + # Group 4 (\d+) matches first module ex. 1 + # Group 5 (\d+) matches last module ex. 12, 3 + # Group 6 (((\d+)-)?(\d+)\/)? matches parent interface(s) and slash ex. 47/, 1-48/ + # Group 7 ((\d+)-)? matches parent interface(s) and dash ex. 47- + # Group 8 (\d+) matches first parent interface ex. 1 + # Group 9 (\d+) matches last parent interface ex. 47, 48 + # Group 10 (((\d+)-)?(\d+)) matches (breakout) interface(s) ex. 1, 1-4, 1-48 + # Group 11 ((\d+)-)? matches first interfaces and dash ex. 1-, 1- + # Group 12 (\d+) matches first interface + # Group 13 (\d+) matches last interface ex. 1, 4, 48 + # Group 14 (\.((\d+)-)?(\d+))? matches dot and sub-interface(s) ex. .141, .12-15 + # Group 15 ((\d+)-)? matches first sub-interface and dash ex. 12- + # Group 16 (\d+) matches first sub-interface ex. 12 + # Group 17 (\d+) matches last sub-interface ex. 141, 15 + # Remember that the groups() object is 0-based and the group numbers above are 1-based + search_result = re.search(regex, one_range) + if search_result: + if len(search_result.groups()) == regex_groups: + groups = search_result.groups() + first_module = last_module = None + first_parent_interface = last_parent_interface = None + first_interface = last_interface = None + first_subinterface = last_subinterface = None + # Set prefix if found (otherwise use last set prefix) + if groups[0]: + prefix = groups[0] + if groups[4]: + last_module = int(groups[4]) + if groups[3]: + first_module = int(groups[3]) + else: + first_module = last_module + if groups[8]: + last_parent_interface = int(groups[8]) + if groups[7]: + first_parent_interface = int(groups[7]) + else: + first_parent_interface = last_parent_interface + if groups[12]: + last_interface = int(groups[12]) + if groups[11]: + first_interface = int(groups[11]) + else: + first_interface = last_interface + if groups[16]: + last_subinterface = int(groups[16]) + if groups[15]: + first_subinterface = int(groups[15]) + else: + first_subinterface = last_subinterface + + def expand_subinterfaces(interface_string): + result = [] + if last_subinterface is not None: + if first_subinterface > last_subinterface: + raise ValueError( + f"Range {one_range} could not be expanded because the first subinterface {first_subinterface} is larger than last" + f" subinterface {last_subinterface} in the range." + ) + for subinterface in range(first_subinterface, last_subinterface + 1): + result.append(f"{interface_string}.{subinterface}") + else: + result.append(interface_string) + return result + + def expand_interfaces(interface_string): + result = [] + if first_interface > last_interface: + raise ValueError( + f"Range {one_range} could not be expanded because the first interface {first_interface} is larger than last interface" + f" {last_interface} in the range." + ) + for interface in range(first_interface, last_interface + 1): + for res in expand_subinterfaces(f"{interface_string}{interface}"): + result.append(res) + return result + + def expand_parent_interfaces(interface_string): + result = [] + if last_parent_interface: + if first_parent_interface > last_parent_interface: + raise ValueError( + f"Range {one_range} could not be expanded because the first interface {first_parent_interface} is larger than last" + f" interface {last_parent_interface} in the range." + ) + for parent_interface in range(first_parent_interface, last_parent_interface + 1): + for res in expand_interfaces(f"{interface_string}{parent_interface}/"): + result.append(res) + else: + for res in expand_interfaces(f"{interface_string}"): + result.append(res) + return result + + def expand_module(interface_string): + result = [] + if last_module: + if first_module > last_module: + raise ValueError( + f"Range {one_range} could not be expanded because the first module {first_module} is larger than last module" + f" {last_module} in the range." + ) + for module in range(first_module, last_module + 1): + for res in expand_parent_interfaces(f"{interface_string}{module}/"): + result.append(res) + else: + for res in expand_parent_interfaces(f"{interface_string}"): + result.append(res) + return result + + result.extend(expand_module(prefix)) + + else: + raise ValueError(f"Invalid range, got {one_range} and found {search_result.groups()}") + + return result diff --git a/python-avd/pyavd/j2filters/snmp_hash.py b/python-avd/pyavd/j2filters/snmp_hash.py new file mode 100644 index 00000000000..726c0615295 --- /dev/null +++ b/python-avd/pyavd/j2filters/snmp_hash.py @@ -0,0 +1,103 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. + +import hashlib + +_PRIV_KEY_LENGTH = {"des": 128, "aes": 128, "aes192": 192, "aes256": 256} + + +def _get_hash_object(auth_type: str) -> object: + """ + :param auth_type: a string in [md5|sha|sha224|sha256|sha384|sha512] + + :return: an instance of hashlib Hash object corresponding to the + auth_type + + :raises: AristaAvdError, when the auth_type is not valid + """ + auth = "sha1" if auth_type == "sha" else auth_type + try: + return hashlib.new(auth) + except ValueError: + raise ValueError(f"{auth_type} is not a valid Auth algorithm for SNMPv3") from ValueError + + +def _key_from_passphrase(passphrase: str, auth_type: str) -> str: + """ + RFC 2574 section A.2 algorithm + https://www.rfc-editor.org/rfc/rfc2574.html#appendix-A2 + + :param passphrase: the passphrase to use to generate the key + :param auth_type: a string in [md5|sha|sha224|sha256|sha384|sha512] + + :return: the key generated from the passphrase using auth_type as per + the algorithm described in the RFC. + + :raises: AristaAvdError, when the auth_type is not valid + """ + b_passphrase = passphrase + if isinstance(passphrase, str): + b_passphrase = passphrase.encode("UTF-8", errors="strict") + hash_object = _get_hash_object(auth_type) + count = 0 + password_index = 0 + password_length = len(b_passphrase) + while count < 1048576: + cp = bytearray() + for _ in range(0, 64): + cp.append(b_passphrase[password_index % password_length]) + password_index += 1 + hash_object.update(cp) + count += 64 + return hash_object.hexdigest() + + +def _localize_passphrase(passphrase: str, auth_type: str, engine_id: str, priv_type: str = None) -> str: + """ + Key localization as described in RFC 2574, section 2.6 + https://www.rfc-editor.org/rfc/rfc2574.html#section-2.6 + + :param passphrase: the passphrase to localize, if priv_type is None + it is the auth passphrase else it is the priv + passphrase + :param auth_type: a string in [md5|sha|sha224|sha256|sha384|sha512] + :param engine_id: an hexadecimal string containing the engine_id to be + used to localize the key + :param auth_type: an optional argument indicating the priv algorithm + in [des|aes|aes192|aes256] + + :return: the localized key generated from the passphrase using auth_type + and if required truncated to match the appropriate keylength for + the priv_type. + + :raises: AristaAvdError, when the auth_type or priv_type is not valid + or if the engined_id is not a proper hexadecimal string + """ + + key = bytes.fromhex(_key_from_passphrase(passphrase, auth_type)) + hash_object = _get_hash_object(auth_type) + try: + hash_object.update(key + bytes.fromhex(engine_id) + key) + except ValueError as error: + raise ValueError(f"engine ID {engine_id} is not an hexadecimal string") from error + localized_key = hash_object.hexdigest() + if priv_type is not None: + try: + while len(localized_key) * 4 < _PRIV_KEY_LENGTH[priv_type]: + hash_object = _get_hash_object(auth_type) + hash_object.update(bytes.fromhex(localized_key)) + localized_key = localized_key + hash_object.hexdigest() + # Truncate ithe key if required + localized_key = localized_key[: _PRIV_KEY_LENGTH[priv_type] // 4] + except KeyError as error: + raise ValueError(f"{priv_type} is not a valid Priv algorithm for SNMPv3") from error + return localized_key + + +def snmp_hash(input_dict: dict) -> str: + passphrase = input_dict["passphrase"] + auth_type = input_dict["auth"] + engine_id = input_dict["engine_id"] + priv_type = input_dict.get("priv") + return _localize_passphrase(passphrase, auth_type, engine_id, priv_type) diff --git a/python-avd/pyavd/j2filters/status_render.py b/python-avd/pyavd/j2filters/status_render.py new file mode 100644 index 00000000000..9583279afe6 --- /dev/null +++ b/python-avd/pyavd/j2filters/status_render.py @@ -0,0 +1,32 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import annotations + + +def status_render(state_string, rendering): + """ + status_render Convert Text to EMOJI code + + Parameters + ---------- + state_string : str + Text to convert in EMOJI + rendering : string + Markdown Flavor to use for Emoji rendering. + + Returns + ------- + str + Value to render in markdown + """ + # STATIC EMOJI CODE + GH_CODE = {} + # Github MD code for Emoji checked box + GH_CODE["PASS"] = ":white_check_mark:" + # GH MD code for Emoji Fail + GH_CODE["FAIL"] = ":x:" + + if rendering == "github": + return GH_CODE[state_string.upper()] + return state_string diff --git a/python-avd/pyavd/j2tests/contains.py b/python-avd/pyavd/j2tests/contains.py new file mode 100644 index 00000000000..e7dcfbc697c --- /dev/null +++ b/python-avd/pyavd/j2tests/contains.py @@ -0,0 +1,43 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +"""AVD Jinja2 test contains. + +The test checks if a list contains any of the value(s) passed in test_value. +""" + +from __future__ import annotations + +from typing import Any + +from jinja2.runtime import Undefined + + +def contains(value: list[Any], test_value: Any | list[Any] = None) -> bool: + """The test checks if a list contains any of the value(s) passed in test_value. + + If 'value' is Undefined, None or not a list then the test has failed. + + Parameters + ---------- + value : + List to test + test_value : single item or list of items + Value(s) to test for in value + + Returns + ------- + boolean + True if variable matches criteria, False in other cases. + """ + # TODO - this will fail miserably if test_value is not hashable ! + if isinstance(value, Undefined) or value is None or not isinstance(value, list): + # Invalid value - return false + return False + if isinstance(test_value, Undefined) or test_value is None: + # Invalid value - return false + return False + if isinstance(test_value, list) and not set(value).isdisjoint(test_value): + # test_value is list so test if value and test_value has any common items + return True + return test_value in value diff --git a/python-avd/pyavd/j2tests/defined.py b/python-avd/pyavd/j2tests/defined.py new file mode 100644 index 00000000000..f9a299e2eb6 --- /dev/null +++ b/python-avd/pyavd/j2tests/defined.py @@ -0,0 +1,118 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +"""AVD Jinja2 test defined. + +The test checks if a passed variable is defined, and if specified, its value and its type. +""" + +from __future__ import annotations + +import warnings + +from jinja2.runtime import Undefined + + +def defined(value, test_value=None, var_type=None, fail_action=None, var_name=None, run_tests=False): + """ + defined - Ansible test plugin to test if a variable is defined and not none + + Arista.avd.defined will test value if defined and is not none and return true or false. + If test_value is supplied, the value must also pass == test_value to return true. + If var_type is supplied, the value must also be of the specified class/type + If fail_action is 'warning' a warning will be emitted on failure. + If fail_action is 'error' an error will be emitted on failure and the task will fail. + If var_name is supplied it will be used in the warning and error messages to ease troubleshooting. + + Examples: + 1. Test if var is defined and not none: + {% if spanning_tree is arista.avd.defined %} + ... + {% endif %} + + 2. Test if variable is defined, not none and has value "something" + {% if extremely_long_variable_name is arista.avd.defined("something") %} + ... + {% endif %} + + 3. Test if variable is defined and of not print a warning message with the variable name + {% if my_dict.my_list[12].my_var is arista.avd.defined(fail_action='warning', var_name='my_dict.my_list[12].my_var' %} + + Parameters + ---------- + value : any + Value to test from ansible + test_value : any, optional + Value to test in addition of defined and not none, by default None + var_type : ['float', 'int', 'str', 'list', 'dict', 'tuple', 'bool'], optional + Type or Class to test for + fail_action : ['warning', 'error'], optional + Optional action if test fails to emit a Warning or Error + var_name : , optional + Optional string to use as variable name in warning or error messages + + Returns + ------- + boolean + True if variable matches criteria, False in other cases. + """ + if isinstance(value, Undefined) or value is None: + # Invalid value - return false + if str(fail_action).lower() == "warning": + warnings_count = {} + if var_name is not None: + warning_msg = f"{var_name} was expected but not set. Output may be incorrect or incomplete!" + warnings.warn(warning_msg) + warnings_count["[WARNING]: " + warning_msg] = warnings_count.get("[WARNING]: " + warning_msg, 0) + 1 + else: + warning_msg = "A variable was expected but not set. Output may be incorrect or incomplete!" + warnings.warn(warning_msg) + warnings_count["[WARNING]: " + warning_msg] = warnings_count.get("[WARNING]: " + warning_msg, 0) + 1 + elif str(fail_action).lower() == "error": + if var_name is not None: + raise ValueError(f"{var_name} was expected but not set!") + raise ValueError("A variable was expected but not set!") + if run_tests: + return False, warnings_count + return False + + if test_value is not None and value != test_value: + # Valid value but not matching the optional argument + if str(fail_action).lower() == "warning": + warnings_count = {} + if var_name is not None: + warning_msg = f"{var_name} was set to {value} but we expected {test_value}. Output may be incorrect or incomplete!" + warnings.warn(warning_msg) + warnings_count["[WARNING]: " + warning_msg] = warnings_count.get("[WARNING]: " + warning_msg, 0) + 1 + else: + warning_msg = f"A variable was set to {value} but we expected {test_value}. Output may be incorrect or incomplete!" + warnings.warn(warning_msg) + warnings_count["[WARNING]: " + warning_msg] = warnings_count.get("[WARNING]: " + warning_msg, 0) + 1 + elif str(fail_action).lower() == "error": + if var_name is not None: + raise ValueError(f"{var_name} was set to {value} but we expected {test_value}!") + raise ValueError(f"A variable was set to {value} but we expected {test_value}!") + if run_tests: + return False, warnings_count + return False + if str(var_type).lower() in ["float", "int", "str", "list", "dict", "tuple", "bool"] and str(var_type).lower() != type(value).__name__: + # Invalid class - return false + if str(fail_action).lower() == "warning": + warnings_count = {} + if var_name is not None: + warning_msg = f"{var_name} was a {type(value).__name__} but we expected a {str(var_type).lower()}. Output may be incorrect or incomplete!" + warnings.warn(warning_msg) + warnings_count["[WARNING]: " + warning_msg] = warnings_count.get("[WARNING]: " + warning_msg, 0) + 1 + else: + warning_msg = f"A variable was a {type(value).__name__} but we expected a {str(var_type).lower()}. Output may be incorrect or incomplete!" + warnings.warn(warning_msg) + warnings_count["[WARNING]: " + warning_msg] = warnings_count.get("[WARNING]: " + warning_msg, 0) + 1 + elif str(fail_action).lower() == "error": + if var_name is not None: + raise ValueError(f"{var_name} was a {type(value).__name__} but we expected a {str(var_type).lower()}!") + raise ValueError(f"A variable was a {type(value).__name__} but we expected a {str(var_type).lower()}!") + if run_tests: + return False, warnings_count + return False + # Valid value and is matching optional argument if provided - return true + return True diff --git a/python-avd/pyavd/schema/__init__.py b/python-avd/pyavd/schema/__init__.py deleted file mode 100644 index e772bee41fe..00000000000 --- a/python-avd/pyavd/schema/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. diff --git a/python-avd/pyavd/schema/constants.py b/python-avd/pyavd/schema/constants.py deleted file mode 100644 index 8687faaadd4..00000000000 --- a/python-avd/pyavd/schema/constants.py +++ /dev/null @@ -1,41 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -from pathlib import Path - -REPO_ROOT = Path(__file__).parents[3] -EOS_DESIGNS_SCHEMA_DIR = REPO_ROOT.joinpath("ansible_collections/arista/avd/roles/eos_designs/schemas") -EOS_DESIGNS_SCHEMA_PATH = EOS_DESIGNS_SCHEMA_DIR.joinpath("eos_designs.schema.yml") -EOS_DESIGNS_FRAGMENTS_PATH = EOS_DESIGNS_SCHEMA_DIR.joinpath("schema_fragments") -EOS_DESIGNS_PICKLED_SCHEMA_PATH = EOS_DESIGNS_SCHEMA_DIR.joinpath("eos_designs.schema.pickle") -EOS_DESIGNS_JSONSCHEMA_PATH = EOS_DESIGNS_SCHEMA_DIR.joinpath("eos_designs.jsonschema.json") - -EOS_CLI_CONFIG_GEN_SCHEMA_DIR = REPO_ROOT.joinpath("ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas") -EOS_CLI_CONFIG_GEN_SCHEMA_PATH = EOS_CLI_CONFIG_GEN_SCHEMA_DIR.joinpath("eos_cli_config_gen.schema.yml") -EOS_CLI_CONFIG_GEN_FRAGMENTS_PATH = EOS_CLI_CONFIG_GEN_SCHEMA_DIR.joinpath("schema_fragments") -EOS_CLI_CONFIG_GEN_PICKLED_SCHEMA_PATH = EOS_CLI_CONFIG_GEN_SCHEMA_DIR.joinpath("eos_cli_config_gen.schema.pickle") -EOS_CLI_CONFIG_GEN_JSONSCHEMA_PATH = EOS_CLI_CONFIG_GEN_SCHEMA_DIR.joinpath("eos_cli_config_gen.jsonschema.json") - -METASCHEMA_DIR = REPO_ROOT.joinpath("ansible_collections/arista/avd/plugins/plugin_utils/schema") -METASCHEMA_PATH = METASCHEMA_DIR.joinpath("avd_meta_schema.json") -METASCHEMA_PICKLED_SCHEMA_PATH = METASCHEMA_DIR.joinpath("avd_meta_schema.pickle") - -SCHEMA_PATHS = { - "avd_meta_schema": METASCHEMA_PATH, - "eos_cli_config_gen": EOS_CLI_CONFIG_GEN_SCHEMA_PATH, - "eos_designs": EOS_DESIGNS_SCHEMA_PATH, -} -SCHEMA_FRAGMENTS_PATHS = { - "eos_cli_config_gen": EOS_CLI_CONFIG_GEN_FRAGMENTS_PATH, - "eos_designs": EOS_DESIGNS_FRAGMENTS_PATH, -} -PICKLED_SCHEMAS = { - "avd_meta_schema": METASCHEMA_PICKLED_SCHEMA_PATH, - "eos_cli_config_gen": EOS_CLI_CONFIG_GEN_PICKLED_SCHEMA_PATH, - "eos_designs": EOS_DESIGNS_PICKLED_SCHEMA_PATH, -} -JSONSCHEMA_PATHS = { - "eos_cli_config_gen": EOS_CLI_CONFIG_GEN_JSONSCHEMA_PATH, - "eos_designs": EOS_DESIGNS_JSONSCHEMA_PATH, -} -LICENSE_HEADER = REPO_ROOT.joinpath("development/license-short.txt").read_text(encoding="UTF-8").strip() diff --git a/python-avd/pyavd/templater.py b/python-avd/pyavd/templater.py index 3780b06dd3c..c6f58b30781 100644 --- a/python-avd/pyavd/templater.py +++ b/python-avd/pyavd/templater.py @@ -1,34 +1,15 @@ # Copyright (c) 2023-2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. +from __future__ import annotations + +import os +from pathlib import Path +from typing import Sequence + from jinja2 import ChoiceLoader, Environment, FileSystemLoader, ModuleLoader, StrictUndefined -from .constants import JINJA2_EXTENSIONS, JINJA2_PRECOMPILED_TEMPLATE_PATH -from .vendor.j2.filter.convert_dicts import convert_dicts -from .vendor.j2.filter.decrypt import decrypt -from .vendor.j2.filter.default import default -from .vendor.j2.filter.encrypt import encrypt -from .vendor.j2.filter.hide_passwords import hide_passwords -from .vendor.j2.filter.list_compress import list_compress -from .vendor.j2.filter.natural_sort import natural_sort -from .vendor.j2.filter.range_expand import range_expand -from .vendor.j2.test.contains import contains -from .vendor.j2.test.defined import defined - -JINJA2_CUSTOM_FILTERS = { - "arista.avd.default": default, - "arista.avd.convert_dicts": convert_dicts, - "arista.avd.decrypt": decrypt, - "arista.avd.encrypt": encrypt, - "arista.avd.hide_passwords": hide_passwords, - "arista.avd.list_compress": list_compress, - "arista.avd.natural_sort": natural_sort, - "arista.avd.range_expand": range_expand, -} -JINJA2_CUSTOM_TESTS = { - "arista.avd.defined": defined, - "arista.avd.contains": contains, -} +from .constants import JINJA2_EXTENSIONS, JINJA2_PRECOMPILED_TEMPLATE_PATH, JINJA2_TEMPLATE_PATHS, RUNNING_FROM_SRC class Undefined(StrictUndefined): @@ -40,46 +21,112 @@ class Undefined(StrictUndefined): "{% if var is arista.avd.undefined or var.key is arista.avd.undefined or var.key.subkey is arista.avd.undefined %}" """ - def __getattr__(self, name): + def __getattr__(self, _name): # Return original Undefined object to preserve the first failure context return self - def __getitem__(self, key): + def __getitem__(self, _key): # Return original Undefined object to preserve the first failure context return self def __repr__(self): return f"Undefined(hint={self._undefined_hint}, obj={self._undefined_obj}, name={self._undefined_name})" - def __contains__(self, item): + def __contains__(self, _item): # Return original Undefined object to preserve the first failure context return self class Templar: def __init__(self, searchpaths: list[str] = None): - self.loader = ChoiceLoader( - [ - ModuleLoader(JINJA2_PRECOMPILED_TEMPLATE_PATH), - FileSystemLoader(searchpaths or []), - ] - ) + if not RUNNING_FROM_SRC: + self.loader = ModuleLoader(JINJA2_PRECOMPILED_TEMPLATE_PATH) + else: + searchpaths = searchpaths or [] + searchpaths.extend(JINJA2_TEMPLATE_PATHS) + self.loader = ChoiceLoader( + [ + ModuleLoader(JINJA2_PRECOMPILED_TEMPLATE_PATH), + FileSystemLoader(searchpaths), + ] + ) - self.environment = Environment( + # Accepting SonarLint issue: No autoescaping is ok, since we are not using this for a website, so XSS is not applicable. + self.environment = Environment( # NOSONAR extensions=JINJA2_EXTENSIONS, loader=self.loader, undefined=Undefined, trim_blocks=True, ) - self.environment.filters.update(JINJA2_CUSTOM_FILTERS) - self.environment.tests.update(JINJA2_CUSTOM_TESTS) + # Backward-compatible compilation for Jinja 3.0.0 to 3.1.x + if not hasattr(self.environment, "concat"): + self.environment.concat = "".join + + self.import_filters_and_tests() + + def import_filters_and_tests(self) -> None: + # pylint: disable=import-outside-toplevel + from .j2filters import ( + add_md_toc, + convert_dicts, + decrypt, + default, + encrypt, + generate_esi, + generate_lacp_id, + generate_route_target, + hide_passwords, + is_in_filter, + list_compress, + natural_sort, + range_expand, + snmp_hash, + status_render, + ) + from .j2tests.contains import contains + from .j2tests.defined import defined + + # pylint: enable=import-outside-toplevel + + self.environment.filters.update( + { + "arista.avd.add_md_toc": add_md_toc, + "arista.avd.convert_dicts": convert_dicts, + "arista.avd.decrypt": decrypt, + "arista.avd.default": default, + "arista.avd.encrypt": encrypt, + "arista.avd.generate_esi": generate_esi, + "arista.avd.generate_lacp_id": generate_lacp_id, + "arista.avd.generate_route_target": generate_route_target, + "arista.avd.hide_passwords": hide_passwords, + "arista.avd.is_in_filter": is_in_filter, + "arista.avd.list_compress": list_compress, + "arista.avd.natural_sort": natural_sort, + "arista.avd.range_expand": range_expand, + "arista.avd.snmp_hash": snmp_hash, + "arista.avd.status_render": status_render, + } + ) + self.environment.tests.update( + { + "arista.avd.defined": defined, + "arista.avd.contains": contains, + } + ) def render_template_from_file(self, template_file: str, template_vars: dict) -> str: return self.environment.get_template(template_file).render(template_vars) def compile_templates_in_paths(self, searchpaths: list[str]) -> None: - print(JINJA2_PRECOMPILED_TEMPLATE_PATH) - self.environment.loader = FileSystemLoader(searchpaths) + """Compile the Jinja2 templates in the path. + The FileSystemLoader tries to compile any file in the path no matter the extension so + this uses a custom one. + + Parameters + ---------- + searchpaths: The list of path to search templates in. + """ + self.environment.loader = ExtensionFileSystemLoader(searchpaths) self.environment.compile_templates( zip=None, log_function=print, @@ -87,3 +134,22 @@ def compile_templates_in_paths(self, searchpaths: list[str]) -> None: ignore_errors=False, ) self.environment.loader = self.loader + + +class ExtensionFileSystemLoader(FileSystemLoader): + """Custom Jinja2 loader that filters on extensions.""" + + def __init__( + self, + searchpath: str | os.PathLike[str] | Sequence[str | os.PathLike[str]], + encoding: str = "utf-8", + followlinks: bool = False, + extensions: list[str] | None = None, + ) -> None: + self.extensions = extensions or [".j2"] + super().__init__(searchpath, encoding, followlinks) + + def list_templates(self) -> list[str]: + """Filter found files from FileSystemLoader using extensions.""" + found = super().list_templates() + return [file for file in found if Path(file).suffix in self.extensions] diff --git a/python-avd/pyavd/validate_inputs.py b/python-avd/pyavd/validate_inputs.py index e1318e77d2b..46385489e61 100644 --- a/python-avd/pyavd/validate_inputs.py +++ b/python-avd/pyavd/validate_inputs.py @@ -1,10 +1,12 @@ # Copyright (c) 2023-2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. -from .avd_schema_tools import AvdSchemaTools -from .constants import EOS_DESIGNS_SCHEMA_ID -from .validation_result import ValidationResult -from .vendor.eos_designs.eos_designs_shared_utils import SharedUtils +from __future__ import annotations + +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from .validation_result import ValidationResult eos_designs_schema_tools = None @@ -21,7 +23,12 @@ def validate_inputs(inputs: dict) -> ValidationResult: Returns: Validation result object with any validation errors or deprecation warnings. """ + # pylint: disable=import-outside-toplevel + from ._eos_designs.shared_utils import SharedUtils + from .avd_schema_tools import AvdSchemaTools + from .constants import EOS_DESIGNS_SCHEMA_ID + # pylint: enable=import-outside-toplevel # Initialize a global instance of eos_designs_schema_tools global eos_designs_schema_tools if eos_designs_schema_tools is None: diff --git a/python-avd/pyavd/validate_structured_config.py b/python-avd/pyavd/validate_structured_config.py index 25677606d65..71ae386b06c 100644 --- a/python-avd/pyavd/validate_structured_config.py +++ b/python-avd/pyavd/validate_structured_config.py @@ -1,9 +1,12 @@ # Copyright (c) 2023-2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. -from .avd_schema_tools import AvdSchemaTools -from .constants import EOS_CLI_CONFIG_GEN_SCHEMA_ID -from .validation_result import ValidationResult +from __future__ import annotations + +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from .validation_result import ValidationResult eos_cli_config_gen_schema_tools = None @@ -20,7 +23,11 @@ def validate_structured_config(structured_config: dict) -> ValidationResult: Returns: Validation result object with any validation errors or deprecation warnings. """ + # pylint: disable=import-outside-toplevel + from .avd_schema_tools import AvdSchemaTools + from .constants import EOS_CLI_CONFIG_GEN_SCHEMA_ID + # pylint: enable=import-outside-toplevel # Initialize a global instance of eos_cli_config_gen_schema_tools global eos_cli_config_gen_schema_tools if eos_cli_config_gen_schema_tools is None: diff --git a/python-avd/pyavd/validation_result.py b/python-avd/pyavd/validation_result.py index d95465cab42..a429c53b654 100644 --- a/python-avd/pyavd/validation_result.py +++ b/python-avd/pyavd/validation_result.py @@ -1,7 +1,12 @@ # Copyright (c) 2023-2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. -from .vendor.errors import AvdDeprecationWarning, AvdValidationError +from __future__ import annotations + +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from ._errors import AvdDeprecationWarning, AvdValidationError class ValidationResult: diff --git a/python-avd/pyproject.toml b/python-avd/pyproject.toml index f4a0049b33d..4fc9a57015f 100644 --- a/python-avd/pyproject.toml +++ b/python-avd/pyproject.toml @@ -1,6 +1,6 @@ [project] name="pyavd" -dynamic = ["version", "dependencies", "optional-dependencies"] +dynamic = ["version"] authors=[{ name = "Arista Networks", email = "ansible@arista.com"}] description="Arista Validated Designs" readme = "README.md" @@ -10,6 +10,7 @@ classifiers = [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "Programming Language :: Python", + "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", @@ -17,25 +18,49 @@ classifiers = [ "Topic :: Software Development :: Testing", ] keywords = ["pyavd"] -requires-python = ">=3.10" +requires-python = ">=3.9" +dependencies = [ + "aristaproto>=0.1.1", + "cryptography>=38.0.4", + "deepmerge>=1.1.0", + "Jinja2>=3.0", + "jsonschema>=4.10.3", + "requests>=2.27.0", +] [project.urls] homepage = "https://avd.arista.com" repository = "https://github.com/aristanetworks/avd" +[project.optional-dependencies] +ansible = [ + "ansible-core>=2.15.0,<2.18.0", + "pyavd[ansible-collection]", +] +ansible-collection = [ + "anta>=1.0.0", + "cvprac>=1.3.1", + "netaddr>=0.7.19", + "PyYAML>=6.0.0", + "treelib>=1.5.5", +] + [build-system] requires = [ "setuptools>=66.1", "wheel", "jinja2>=3.0", - "jsonschema>=4.5.1,<4.18", + "jsonschema>=4.10.3", + "referencing>=0.35.0", "deepmerge>=1.1.0", - "md-toc>=8.1.8", "pyyaml>=6.0.0", "mkdocstrings[python]", "pydantic>=2.3.0", + "eval-type-backport>=0.2.0", # Only needed for 3.9 + "cryptography>=38.0.4", + "aristaproto>=0.1.1", ] -build-backend = "custom-build-backend" +build-backend = "custom_build_backend" backend-path = ["scripts"] [tool.setuptools] @@ -50,12 +75,9 @@ include-package-data = true [tool.setuptools.packages.find] include = ["pyavd*"] -exclude = ["vendor_overrides*"] [tool.setuptools.dynamic] version = {attr = "pyavd.__version__"} -dependencies = {file = ["requirements.txt"]} -optional-dependencies = {"mdtoc" = { file = ["requirements-mdtoc.txt"] }} [tool.black] line-length = 160 @@ -71,10 +93,13 @@ branch = true [tool.coverage.report] show_missing = true -fail_under = 89 +fail_under = 90 include = [ "pyavd/*" ] +omit = [ + "pyavd/_cv/api/*" +] # Regexes for lines to exclude from consideration exclude_also = [ # Have to re-enable the standard pragma @@ -92,7 +117,7 @@ exclude_also = [ "@(abc\\.)?abstractmethod", # Don't complain about TYPE_CHECKING blocks "if TYPE_CHECKING:", - # Dont' complain about Jinja2 internalcode + # Don't complain about Jinja2 internalcode # Note that except KeyError is a bit sad but this is the pattern "except KeyError:", "@internalcode", diff --git a/python-avd/requirements-mdtoc.txt b/python-avd/requirements-mdtoc.txt deleted file mode 100644 index 96e6ea15f68..00000000000 --- a/python-avd/requirements-mdtoc.txt +++ /dev/null @@ -1 +0,0 @@ -md-toc>=8.1.8 diff --git a/python-avd/requirements.txt b/python-avd/requirements.txt deleted file mode 100644 index 6d3714380f4..00000000000 --- a/python-avd/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -jinja2>=3.0 -jsonschema>=4.5.1,<4.18 -deepmerge>=1.1.0 diff --git a/python-avd/schema_tools/avdschemaresolver.py b/python-avd/schema_tools/avdschemaresolver.py new file mode 100644 index 00000000000..6a0479761c8 --- /dev/null +++ b/python-avd/schema_tools/avdschemaresolver.py @@ -0,0 +1,129 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import annotations + +from copy import deepcopy + +from pyavd._utils import merge +from referencing import Registry, Specification +from referencing.exceptions import PointerToNowhere +from referencing.jsonschema import DRAFT7, _legacy_anchor_in_dollar_id, _legacy_dollar_id, _maybe_in_subresource_crazy_items_dependencies + + +class AvdSchemaResolver: + def __init__(self, base_schema_name: str, store: dict): + self.resolver = self.create_resolver(store, base_uri=base_schema_name) + + def resolve(self, resolved_schema: dict): + methods = { + "items": self._items, + "keys": self._keys, + "dynamic_keys": self._dynamic_keys, + } + + for key, method in methods.items(): + if resolved_schema.get(key): + method(resolved_schema) + + return resolved_schema + + def _keys(self, resolved_schema: dict): + for key in resolved_schema["keys"]: + # Resolve the child schema + # Repeat in case new refs inherited from the first ref. + while "$ref" in resolved_schema["keys"][key]: + self._ref_on_child(resolved_schema["keys"][key]) + + self.resolve(resolved_schema["keys"][key]) + + def _dynamic_keys(self, resolved_schema: dict): + for key in resolved_schema["dynamic_keys"]: + # Resolve the child schema + # Repeat in case new refs inherited from the first ref. + while "$ref" in resolved_schema["dynamic_keys"][key]: + self._ref_on_child(resolved_schema["dynamic_keys"][key]) + + self.resolve(resolved_schema["dynamic_keys"][key]) + + def _items(self, resolved_schema: dict): + # Resolve the child schema + # Repeat in case new refs inherited from the first ref. + while "$ref" in resolved_schema["items"]: + self._ref_on_child(resolved_schema["items"]) + + self.resolve(resolved_schema["items"]) + + def _ref_on_child(self, resolved_schema: dict): + """ + This function resolves the $ref referenced schema, + then merges with any schema defined at the same level + + In place update of supplied resolved_schema + """ + try: + resolved = self.resolver.lookup(resolved_schema["$ref"]) + except PointerToNowhere: + raise RuntimeError( + ( + f"Unable to resolve $ref: '{resolved_schema['$ref']}'." + "Make sure to adhere to the strict format '^(eos_cli_config_gen|eos_designs)#(/[a-z$][a-z0-9_]*)*$'." + ) + ) from None + ref_schema = deepcopy(resolved.contents) + resolved_schema.pop("$ref") + merge(resolved_schema, ref_schema, same_key_strategy="use_existing", list_merge="replace") + + def create_resolver(self, store: dict, base_uri=""): + """ + Returns a resolver which can resolve "$ref" references across all AVD schemas. + The given "base_uri" can be used for relative references (currently not used in AVD). + """ + registry = self.create_registry(store) + return registry.resolver(base_uri) + + @staticmethod + def create_registry(store: dict) -> Registry: + """ + Returns a "registry" for the "referencing" library. + + The registry contains schemas that could be resolved from references. In our case it + contains the default jsonschema specifications + the AVD schemas. + + Since AVD uses a proprietary schema format, we have to declare a custom "specification" + which contains functions used by the resolver to "walk" the schema. + + Since the AVD schema format is largely based on DRAFT7, we reuse some builtin functions + from "referencing" which are also used for the builtin DRAFT7 specification. + """ + + def subresources(schema: dict): + """ + Generator of childschemas + """ + if "keys" in schema and schema["keys"]: + yield from schema["keys"].values() + if "dynamic_keys" in schema and schema["dynamic_keys"]: + yield from schema["dynamic_keys"].values() + if "$defs" in schema and schema["$defs"]: + yield from schema["$defs"].values() + if "items" in schema: + yield schema["items"] + + avd_meta_schema_spec = Specification( + name="avd_meta_schema", + id_of=_legacy_dollar_id, + subresources_of=subresources, + anchors_in=_legacy_anchor_in_dollar_id, + maybe_in_subresource=_maybe_in_subresource_crazy_items_dependencies( + in_value=set(), + in_subarray=set(), + in_subvalues={"keys", "dynamic_keys", "$defs"}, + ), + ) + resources = [ + ("avd_meta_schema", DRAFT7.create_resource(store["avd_meta_schema"])), + ("eos_cli_config_gen", avd_meta_schema_spec.create_resource(store["eos_cli_config_gen"])), + ("eos_designs", avd_meta_schema_spec.create_resource(store["eos_designs"])), + ] + return Registry().with_resources(resources) diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/schema/avdtojsonschemaconverter.py b/python-avd/schema_tools/avdtojsonschemaconverter.py similarity index 90% rename from ansible_collections/arista/avd/plugins/plugin_utils/schema/avdtojsonschemaconverter.py rename to python-avd/schema_tools/avdtojsonschemaconverter.py index 4e6e4b28836..d2bab037b21 100644 --- a/ansible_collections/arista/avd/plugins/plugin_utils/schema/avdtojsonschemaconverter.py +++ b/python-avd/schema_tools/avdtojsonschemaconverter.py @@ -3,7 +3,7 @@ # that can be found in the LICENSE file. from __future__ import annotations -from ansible_collections.arista.avd.plugins.plugin_utils.schema.key_to_display_name import key_to_display_name +from .key_to_display_name import key_to_display_name def get_deprecation(schema: dict) -> tuple[str, str]: @@ -96,7 +96,7 @@ def convert_schema(self, schema: dict) -> dict: return output - def convert_type(self, type: str, parent_schema: dict) -> dict: + def convert_type(self, type: str, _) -> dict: TYPE_MAP = { "str": "string", "int": "integer", @@ -142,16 +142,16 @@ def __convert_keys(self, keys: dict, parent_schema: dict, output_key: str, ignor return output - def convert_max(self, max: int, parent_schema: dict) -> dict: + def convert_max(self, max: int, _) -> dict: return {"maximum": max} - def convert_min(self, min: int, parent_schema: dict) -> dict: + def convert_min(self, min: int, _) -> dict: return {"minimum": min} - def convert_valid_values(self, valid_values: list, parent_schema: dict) -> dict: + def convert_valid_values(self, valid_values: list, _) -> dict: return {"enum": valid_values} - def convert_format(self, format: str, parent_schema: dict) -> dict: + def convert_format(self, format: str, _) -> dict: FORMAT_MAP = { "ipv4": "ipv4", "ipv4_cidr": None, @@ -182,10 +182,10 @@ def convert_min_length(self, min: int, parent_schema: dict) -> dict: return {"minItems": min} return {} - def convert_pattern(self, pattern: str, parent_schema: dict) -> dict: + def convert_pattern(self, pattern: str, _) -> dict: return {"pattern": pattern} - def convert_default(self, default, parent_schema: dict) -> dict: + def convert_default(self, default, _) -> dict: return {"default": default} def convert_items(self, items: dict, parent_schema: dict) -> dict: @@ -198,12 +198,12 @@ def convert_items(self, items: dict, parent_schema: dict) -> dict: output["items"]["required"].append(primary_key) return output - def convert_display_name(self, display_name: str, parent_schema: dict) -> dict: + def convert_display_name(self, display_name: str, _) -> dict: return {"title": display_name} def convert_description(self, description: str, parent_schema: dict) -> dict: if "deprecation" in parent_schema: - label, deprecation_text = get_deprecation(parent_schema) + _, deprecation_text = get_deprecation(parent_schema) if deprecation_text is not None: return { "description": f"{description}\n{deprecation_text}", diff --git a/python-avd/schema_tools/constants.py b/python-avd/schema_tools/constants.py index bb2c4eca5c9..b0e0c8bc74b 100644 --- a/python-avd/schema_tools/constants.py +++ b/python-avd/schema_tools/constants.py @@ -4,19 +4,23 @@ from pathlib import Path REPO_ROOT = Path(__file__).parents[2] -EOS_DESIGNS_SCHEMA_DIR = REPO_ROOT.joinpath("ansible_collections/arista/avd/roles/eos_designs/schemas") +PYAVD_DIR = REPO_ROOT.joinpath("python-avd/pyavd") + +EOS_DESIGNS_SCHEMA_DIR = PYAVD_DIR.joinpath("_eos_designs/schema") EOS_DESIGNS_SCHEMA_PATH = EOS_DESIGNS_SCHEMA_DIR.joinpath("eos_designs.schema.yml") EOS_DESIGNS_FRAGMENTS_PATH = EOS_DESIGNS_SCHEMA_DIR.joinpath("schema_fragments") EOS_DESIGNS_PICKLED_SCHEMA_PATH = EOS_DESIGNS_SCHEMA_DIR.joinpath("eos_designs.schema.pickle") EOS_DESIGNS_JSONSCHEMA_PATH = EOS_DESIGNS_SCHEMA_DIR.joinpath("eos_designs.jsonschema.json") +EOS_DESIGNS_DOCS_PATH = REPO_ROOT.joinpath("ansible_collections/arista/avd/roles/eos_designs/docs") -EOS_CLI_CONFIG_GEN_SCHEMA_DIR = REPO_ROOT.joinpath("ansible_collections/arista/avd/roles/eos_cli_config_gen/schemas") +EOS_CLI_CONFIG_GEN_SCHEMA_DIR = PYAVD_DIR.joinpath("_eos_cli_config_gen/schema") EOS_CLI_CONFIG_GEN_SCHEMA_PATH = EOS_CLI_CONFIG_GEN_SCHEMA_DIR.joinpath("eos_cli_config_gen.schema.yml") EOS_CLI_CONFIG_GEN_FRAGMENTS_PATH = EOS_CLI_CONFIG_GEN_SCHEMA_DIR.joinpath("schema_fragments") EOS_CLI_CONFIG_GEN_PICKLED_SCHEMA_PATH = EOS_CLI_CONFIG_GEN_SCHEMA_DIR.joinpath("eos_cli_config_gen.schema.pickle") EOS_CLI_CONFIG_GEN_JSONSCHEMA_PATH = EOS_CLI_CONFIG_GEN_SCHEMA_DIR.joinpath("eos_cli_config_gen.jsonschema.json") +EOS_CLI_CONFIG_GEN_DOCS_PATH = REPO_ROOT.joinpath("ansible_collections/arista/avd/roles/eos_cli_config_gen/docs") -METASCHEMA_DIR = REPO_ROOT.joinpath("ansible_collections/arista/avd/plugins/plugin_utils/schema") +METASCHEMA_DIR = PYAVD_DIR.joinpath("_schema") METASCHEMA_PATH = METASCHEMA_DIR.joinpath("avd_meta_schema.json") METASCHEMA_PICKLED_SCHEMA_PATH = METASCHEMA_DIR.joinpath("avd_meta_schema.pickle") @@ -38,4 +42,8 @@ "eos_cli_config_gen": EOS_CLI_CONFIG_GEN_JSONSCHEMA_PATH, "eos_designs": EOS_DESIGNS_JSONSCHEMA_PATH, } +DOCS_PATHS = { + "eos_cli_config_gen": EOS_CLI_CONFIG_GEN_DOCS_PATH, + "eos_designs": EOS_DESIGNS_DOCS_PATH, +} LICENSE_HEADER = REPO_ROOT.joinpath("development/license-short.txt").read_text(encoding="UTF-8").strip() diff --git a/python-avd/schema_tools/generate_docs/mdtabsgen.py b/python-avd/schema_tools/generate_docs/mdtabsgen.py index bdfc37a92cb..438f2b2d6ba 100644 --- a/python-avd/schema_tools/generate_docs/mdtabsgen.py +++ b/python-avd/schema_tools/generate_docs/mdtabsgen.py @@ -1,6 +1,8 @@ # Copyright (c) 2023-2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. +from __future__ import annotations + from textwrap import indent from ..constants import LICENSE_HEADER diff --git a/python-avd/schema_tools/generate_docs/tablerowgen.py b/python-avd/schema_tools/generate_docs/tablerowgen.py index e375fc12ac2..37b13890232 100644 --- a/python-avd/schema_tools/generate_docs/tablerowgen.py +++ b/python-avd/schema_tools/generate_docs/tablerowgen.py @@ -93,8 +93,8 @@ def get_indentation(self) -> str: # TODO: Remove legacy output if LEGACY_OUTPUT: return i * (indentation_count - 2) + "-" + " " # Using space as last indentation to match legacy behavior - else: - return i * (indentation_count - 2) + "-" + i + + return i * (indentation_count - 2) + "-" + i return i * indentation_count @@ -187,7 +187,7 @@ def render_default(self) -> str | None: Should render markdown for "default" field. """ if self.schema.default is not None: - if isinstance(self.schema.default, (list, dict)) and len(self.schema.default) > 1: + if isinstance(self.schema.default, (list, dict)) and (len(self.schema.default) > 1 or len(str(self.schema.default)) > 40): return "See (+) on YAML tab" return f"`{self.schema.default}`" diff --git a/python-avd/schema_tools/generate_docs/yamllinegen.py b/python-avd/schema_tools/generate_docs/yamllinegen.py index fc39b868c49..ba0d67744af 100644 --- a/python-avd/schema_tools/generate_docs/yamllinegen.py +++ b/python-avd/schema_tools/generate_docs/yamllinegen.py @@ -120,7 +120,7 @@ def render_field(self) -> Generator[YamlLine]: Renders YamlLines for this field including description. """ - # Build semicolon seperated list of field properties. + # Build semicolon separated list of field properties. value_fields = [ self.schema.type, self.render_restrictions(), @@ -190,7 +190,11 @@ def needs_annotation_for_default_value(self) -> bool: Determines if this field should use a mkdocs codeblock annotation / popup to display the default value. Is true for list or dict with length above 1. Otherwise false. """ - return self.schema.default is not None and isinstance(self.schema.default, (list, dict)) and len(self.schema.default) > 1 + return ( + self.schema.default is not None + and isinstance(self.schema.default, (list, dict)) + and (len(self.schema.default) > 1 or len(str(self.schema.default)) > 40) + ) def get_default(self) -> str | None: """ @@ -294,7 +298,7 @@ def render_field(self) -> Generator[YamlLine]: Renders YamlLine for this field. """ - # Build semicolon seperated list of field properties. + # Build semicolon separated list of field properties. properties_fields = [ self.render_restrictions(), self.get_default(), @@ -357,7 +361,7 @@ def render_field(self) -> Generator[YamlLine]: Renders YamlLine for this field. """ - # Build semicolon seperated list of field properties. + # Build semicolon separated list of field properties. properties_fields = [ self.render_restrictions(), self.get_default(), diff --git a/ansible_collections/arista/avd/plugins/plugin_utils/schema/key_to_display_name.py b/python-avd/schema_tools/key_to_display_name.py similarity index 100% rename from ansible_collections/arista/avd/plugins/plugin_utils/schema/key_to_display_name.py rename to python-avd/schema_tools/key_to_display_name.py diff --git a/python-avd/schema_tools/metaschema/meta_schema_model.py b/python-avd/schema_tools/metaschema/meta_schema_model.py index 64f458d2992..ed8a92952cb 100644 --- a/python-avd/schema_tools/metaschema/meta_schema_model.py +++ b/python-avd/schema_tools/metaschema/meta_schema_model.py @@ -6,7 +6,7 @@ from abc import ABC from enum import Enum from functools import cached_property -from typing import Annotated, Any, ClassVar, Generator, List, Literal +from typing import Annotated, Any, ClassVar, Generator, List, Literal, Union from pydantic import BaseModel, ConfigDict, Field, constr @@ -17,14 +17,14 @@ """ This module provides Pydantic models (classes) representing the meta-schema of the AVD Schema. -Each variable in the schema is called a field, and for each type of field we have a corrosponding Pydantic model: +Each variable in the schema is called a field, and for each type of field we have a corresponding Pydantic model: - AvdSchemaInt - AvdSchemaBool - AvdSchemaStr - AvdSchemaList - AvdSchemaDict -The alias "AvdSchemaField" is a union of of all the models above, and can be used as easy type hint for any field type. +The alias "AvdSchemaField" is a union of all the models above, and can be used as an easy type hint for any field type. All the type-specific Pydantic models inherit the common base class "AvdSchemaBaseModel", and have local overrides as needed. For example, only "AvdSchemaList" and "AvdSchemaDict" need to parse child fields. @@ -35,10 +35,6 @@ KEY_PATTERN = r"^[a-z][a-z0-9_]*$" """Common pattern to match legal key strings""" -DYNAMIC_KEY_PATTERN = r"^[a-z][a-z0-9_.]*$" -"""Common pattern to match legal dynamic key strings""" -KEY_PATTERN_WITH_UPPERCASE = r"^[a-zA-Z][a-zA-Z0-9_]*$" -"""This is a temporary pattern allowing uppercase keys too""" class AvdSchemaBaseModel(BaseModel, ABC): @@ -89,7 +85,7 @@ class DocumentationOptions(BaseModel): display_name: str | None = Field(None, pattern=r"^[^\n]+$") """Free text display name for forms and documentation (single line)""" description: Annotated[str, constr(min_length=1)] | None = None - """Free text description for forms and documentation (multi line)""" + """Free text description for forms and documentation (multi-line)""" required: bool | None = None """Key is required""" deprecation: Deprecation | None = None @@ -121,7 +117,7 @@ class DocumentationOptions(BaseModel): Simple types or the first key of a dict contained in a list will be rendered with a hyphen as part of the indentation. """ - # Signal to __init__ if the $ref in the schema should be resolved before initilizing the pydantic model. + # Signal to __init__ if the $ref in the schema should be resolved before initializing the pydantic model. _resolve_schema: ClassVar[bool] = True def __init__(self, resolve_schema: bool | None = None, **data): @@ -423,7 +419,7 @@ def _descendant_tables(self) -> set[str]: def model_post_init(self, __context: Any) -> None: """ Overrides BaseModel.model_post_init(). - Runs after this model including all child models have been initilized. + Runs after this model including all child models have been initialized. Sets Internal attributes on child schema (if set): - _parent_schema @@ -478,14 +474,13 @@ class DocumentationOptions(AvdSchemaBaseModel.DocumentationOptions): default: dict[str, Any] | None = None """Default value""" - # TODO: Change pattern to KEY_PATTERN once we have removed all upper case keys from the schema - keys: dict[constr(pattern=KEY_PATTERN_WITH_UPPERCASE), Annotated[AvdSchemaField, Field(discriminator="type")]] | None = None + keys: dict[str, Annotated[AvdSchemaField, Field(discriminator="type")]] | None = None """ Dictionary of dictionary-keys in the format `{: {}}`. `keyname` must use snake_case. `schema` is the schema for each key. This is a recursive schema, so the value must conform to AVD Schema. """ - dynamic_keys: dict[constr(pattern=DYNAMIC_KEY_PATTERN), Annotated[AvdSchemaField, Field(discriminator="type")]] | None = None + dynamic_keys: dict[str, Annotated[AvdSchemaField, Field(discriminator="type")]] | None = None """ Dictionary of dynamic dictionary-keys in the format `{: {}}`. `variable.path` is a variable path using dot-notation and pointing to a variable under the parent dictionary containing dictionary-keys. @@ -501,7 +496,7 @@ class DocumentationOptions(AvdSchemaBaseModel.DocumentationOptions): """Schema name used when exporting to JSON schema""" field_id: str | None = Field(None, alias="$id") """Schema ID used when exporting to JSON schema""" - field_defs: dict[constr(pattern=KEY_PATTERN), Annotated[AvdSchemaField, Field(discriminator="type")]] = Field(None, alias="$defs") + field_defs: dict[str, Annotated[AvdSchemaField, Field(discriminator="type")]] = Field(None, alias="$defs") """Storage for reusable schema fragments""" # Type of schema docs generators to use for this schema field. @@ -532,7 +527,7 @@ def _descendant_tables(self) -> set[str]: def model_post_init(self, __context: Any) -> None: """ Overrides BaseModel.model_post_init(). - Runs after this model including all child models have been initilized. + Runs after this model including all child models have been initialized. Set Internal attributes on child schemas: - _key @@ -578,5 +573,8 @@ def _path(self) -> list[str]: return [] -AvdSchemaField = AvdSchemaInt | AvdSchemaBool | AvdSchemaStr | AvdSchemaList | AvdSchemaDict +# Workaround for tox until Python 3.9 is dropped +# https://github.com/microsoft/pyright/issues/4615#issuecomment-1426685471 +AvdSchemaField = Union[AvdSchemaInt, AvdSchemaBool, AvdSchemaStr, AvdSchemaList, AvdSchemaDict] +# AvdSchemaField = AvdSchemaInt | AvdSchemaBool | AvdSchemaStr | AvdSchemaList | AvdSchemaDict """Alias for any of the AvdSchema field types""" diff --git a/python-avd/schema_tools/metaschema/resolvemodel.py b/python-avd/schema_tools/metaschema/resolvemodel.py index 8311ac70c1f..21ce86e3185 100644 --- a/python-avd/schema_tools/metaschema/resolvemodel.py +++ b/python-avd/schema_tools/metaschema/resolvemodel.py @@ -65,7 +65,7 @@ def walk_schema(schema: dict, path: list[str]) -> dict | None: """ Paths the dictionary along the given path. Empty steps are ignored. - If the path is invalid it will return None, sso the calling function can raise an error with the original schema ref. + If the path is invalid it will return None, so the calling function can raise an error with the original schema ref. """ if not path: return schema diff --git a/python-avd/schema_tools/store.py b/python-avd/schema_tools/store.py index 60406c03747..985972d4e25 100644 --- a/python-avd/schema_tools/store.py +++ b/python-avd/schema_tools/store.py @@ -1,19 +1,136 @@ # Copyright (c) 2023-2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. +from copy import deepcopy from functools import lru_cache -from pickle import load +from hashlib import sha1 +from pickle import HIGHEST_PROTOCOL +from pickle import dump as pickle_dump +from pickle import load as pickle_load -from .constants import PICKLED_SCHEMAS +from yaml import safe_load + +from .avdschemaresolver import AvdSchemaResolver +from .constants import PICKLED_SCHEMAS, SCHEMA_PATHS @lru_cache -def create_store() -> dict[str, dict]: +def create_store(load_from_yaml=False, force_rebuild=False) -> dict[str, dict]: + """ + Create and return a schema store which is a dict of all our schemas like + { + "avd_meta_schema": {...avd meta schema as dict...}, + "eos_cli_config_gen": {...schema as dict...}, + "eos_designs": {...schema as dict...}, + } + The function is cached to save time on multiple calls. + + If load_from_yaml is True it will read and return unresolved schemas from yml/json files. + + If force_rebuild is True or if this is the first time running AVD after changing schemas/upgrade/install + the schema yml/json files will be read, fully resolved, saved as pickle to a file and returned in the + store dict. + """ store = {} - # Load from Pickle + # Load from YAML if set. This is used by the tool that creates the pickle. + if load_from_yaml: + return _create_store_from_yaml() + + # Recompile schemas if needed and store in pickles for next time. + if force_rebuild or _should_recompile_schemas(): + return _compile_schemas() + + # Load from Pickle. for id, schema_file in PICKLED_SCHEMAS.items(): with open(schema_file, "rb") as file: - store[id] = load(file) + store[id] = pickle_load(file) return store + + +def _should_recompile_schemas() -> bool: + """ + Returns true if pickled schemas should be recompiled + """ + # Check if any pickled schema is missing + for pickle_file in PICKLED_SCHEMAS.values(): + if not pickle_file.exists(): + return True + + # Check if any hash file is missing and if any stored hash does not match the hash of the schema file + for schema_file in SCHEMA_PATHS.values(): + hash_file = schema_file.with_suffix(".sha1") + if not hash_file.exists(): + return True + + existing_hash = hash_file.with_suffix(".sha1").read_text(encoding="UTF-8") + new_hash = sha1(schema_file.read_bytes(), usedforsecurity=False).hexdigest() # NOSONAR + if existing_hash != new_hash: + return True + + return False + + +def _create_store_from_yaml() -> dict[str, dict]: + """ + Returns a schema store loaded from yaml/json files with $ref + """ + store = {} + for id, schema_file in SCHEMA_PATHS.items(): + with open(schema_file, "r", encoding="UTF-8") as stream: + store[id] = safe_load(stream) + return store + + +def _compile_schemas() -> dict: + """ + Load schemas from yaml files, + create a temporary "store", + resolve all $refs and save the resulting schemas as pickles + """ + schema_store = _create_store_from_yaml() + + # We rely on eos_cli_config_gen being before eos_designs, + # so anything in eos_cli_config_gen can be resolved and $def popped before resolving from eos_designs. + for schema_name, pickle_file in PICKLED_SCHEMAS.items(): + if schema_name == "avd_meta_schema": + # Do not resolve $ref in the meta schema. + resolved_schema = schema_store[schema_name] + else: + resolved_schema = _resolve_schema(schema_store[schema_name], schema_store) + + # Inplace update the schema store with the resolved variant without $def. + # This is needed so eos_designs will not resolve to a schema with another $ref. + schema_store[schema_name] = resolved_schema + + # Update pickle file with binary version of the completely resolved schema. + try: + with pickle_file.open("wb") as stream: + pickle_dump(resolved_schema, stream, HIGHEST_PROTOCOL) + + # Update the .sha1 file with the new hash of the yaml schema file. + schema_file = SCHEMA_PATHS[schema_name] + new_hash = sha1(schema_file.read_bytes(), usedforsecurity=False).hexdigest() # NOSONAR + schema_file.with_suffix(".sha1").write_text(new_hash, encoding="UTF-8") + except PermissionError: + # Ignoring PermissionError so we can operate in read-only environments + # (like "ansible-test units" containers). + pass + + return schema_store + + +def _resolve_schema(schema: dict, store: dict) -> dict: + """ + Get fully resolved schema (where all $ref has been expanded recursively) + .schemaresolver performs inplace update of the argument so we give it a copy of the existing schema. + """ + resolved_schema = deepcopy(schema) + schemaresolver = AvdSchemaResolver(schema["$id"], store) + schemaresolver.resolve(resolved_schema) + + # Since the schema is now fully resolved we can drop the $defs. + resolved_schema.pop("$defs", None) + + return resolved_schema diff --git a/python-avd/scripts/build-schemas.py b/python-avd/scripts/build-schemas.py index 60d73db5f07..dbf121413b6 100755 --- a/python-avd/scripts/build-schemas.py +++ b/python-avd/scripts/build-schemas.py @@ -15,14 +15,11 @@ # Override global path to load schema from source instead of any installed version. path.insert(0, str(Path(__file__).parents[1])) -from schema_tools.constants import JSONSCHEMA_PATHS, LICENSE_HEADER, REPO_ROOT, SCHEMA_FRAGMENTS_PATHS, SCHEMA_PATHS +from schema_tools.avdtojsonschemaconverter import AvdToJsonSchemaConverter +from schema_tools.constants import DOCS_PATHS, JSONSCHEMA_PATHS, LICENSE_HEADER, SCHEMA_FRAGMENTS_PATHS, SCHEMA_PATHS from schema_tools.generate_docs.mdtabsgen import get_md_tabs from schema_tools.metaschema.meta_schema_model import AristaAvdSchema - -path.insert(0, str(REPO_ROOT)) - -from ansible_collections.arista.avd.plugins.plugin_utils.schema.avdtojsonschemaconverter import AvdToJsonSchemaConverter -from ansible_collections.arista.avd.plugins.plugin_utils.schema.store import create_store +from schema_tools.store import create_store FRAGMENTS_PATTERN = "*.yml" @@ -44,6 +41,13 @@ def combine_schemas(): with SCHEMA_PATHS[schema_name].open(mode="w", encoding="UTF-8") as schema_stream: schema_stream.write(indent(LICENSE_HEADER, prefix="# ") + "\n") + schema_stream.write( + ( + "# yaml-language-server: $schema=../../../plugins/plugin_utils/schema/avd_meta_schema.json\n" + "# Line above is used by RedHat's YAML Schema vscode extension\n" + "# Use Ctrl + Space to get suggestions for every field. Autocomplete will pop up after typing 2 letters.\n" + ) + ) schema_stream.write(yaml_dump(schema, Dumper=CSafeDumper, sort_keys=False)) @@ -58,13 +62,13 @@ def convert_to_jsonschema(schema_store): def build_schema_tables(schema_store): - for schema_name, schema_path in SCHEMA_PATHS.items(): + for schema_name in SCHEMA_PATHS: if schema_name not in SCHEMA_FRAGMENTS_PATHS: continue schema = AristaAvdSchema(**schema_store[schema_name]) table_names = sorted(schema._descendant_tables) - output_dir = schema_path.parents[1].joinpath("docs/tables") + output_dir = DOCS_PATHS[schema_name].joinpath("tables") for table_name in table_names: print(f"Building table: {table_name} from schema {schema_name}") table_file = output_dir.joinpath(f"{table_name}.md") diff --git a/python-avd/scripts/compile_templates.py b/python-avd/scripts/compile_templates.py index 111e9bdd71a..3b051c50707 100755 --- a/python-avd/scripts/compile_templates.py +++ b/python-avd/scripts/compile_templates.py @@ -2,10 +2,11 @@ # Copyright (c) 2023-2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. +from pathlib import Path from sys import path # Override global path to load pyavd from pwd instead of any installed version. -path.insert(0, ".") +path.insert(0, str(Path(__file__).parent.parent)) from pyavd.constants import JINJA2_TEMPLATE_PATHS from pyavd.templater import Templar diff --git a/python-avd/scripts/custom-build-backend.py b/python-avd/scripts/custom_build_backend.py similarity index 91% rename from python-avd/scripts/custom-build-backend.py rename to python-avd/scripts/custom_build_backend.py index bd756ccb231..528a82aa377 100644 --- a/python-avd/scripts/custom-build-backend.py +++ b/python-avd/scripts/custom_build_backend.py @@ -3,11 +3,19 @@ # that can be found in the LICENSE file. from pathlib import Path from subprocess import Popen +from typing import TYPE_CHECKING from setuptools import build_meta as _orig -from setuptools.build_meta import * # noqa: F401,F403 # pylint:disable=wildcard-import,unused-wildcard-import from yaml import safe_load +if not TYPE_CHECKING: + + def __getattr__(name): + """ + Workaround to avoid 'from setuptools.build_meta import *' + """ + return locals().get(name, getattr(_orig, name)) + def _translate_version(version: str, pyavd_prerelease: str) -> str: """ diff --git a/python-avd/tests/pyavd/eos_cli_config_gen/test_get_device_config.py b/python-avd/tests/pyavd/eos_cli_config_gen/test_get_device_config.py index 8a365e48b88..2714f855843 100644 --- a/python-avd/tests/pyavd/eos_cli_config_gen/test_get_device_config.py +++ b/python-avd/tests/pyavd/eos_cli_config_gen/test_get_device_config.py @@ -20,10 +20,4 @@ def test_get_device_config(hostname: str, all_inputs: dict, configs: dict): assert isinstance(device_config, str) # assert f"hostname {hostname}\n" in eos_config - # Hack to insert newline if the config is empty. - # This is to match the jinja generated output from Ansible, where Ansible has a special output function - # adding this extra newline if the config is empty. - if not device_config: - device_config = "\n" - assert device_config == expected_config diff --git a/python-avd/tests/pyavd/eos_cli_config_gen/test_validate_structured_config.py b/python-avd/tests/pyavd/eos_cli_config_gen/test_validate_structured_config.py index 997f6f7485a..b63b6554dd1 100644 --- a/python-avd/tests/pyavd/eos_cli_config_gen/test_validate_structured_config.py +++ b/python-avd/tests/pyavd/eos_cli_config_gen/test_validate_structured_config.py @@ -2,10 +2,10 @@ # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. from pyavd import validate_structured_config +from pyavd._errors import AvdValidationError from pyavd.avd_schema_tools import AvdSchemaTools -from pyavd.vendor.errors import AvdValidationError -SCHEMA = AvdSchemaTools(schema_id="eos_cli_config_gen").avdschema.resolved_schema +SCHEMA = AvdSchemaTools(schema_id="eos_cli_config_gen").avdschema._schema def test_validate_structured_config_with_valid_data(hostname: str, all_inputs: dict): diff --git a/python-avd/tests/pyavd/eos_designs/test_get_avd_facts.py b/python-avd/tests/pyavd/eos_designs/test_get_avd_facts.py index c04b547ee40..a0dddef8f95 100644 --- a/python-avd/tests/pyavd/eos_designs/test_get_avd_facts.py +++ b/python-avd/tests/pyavd/eos_designs/test_get_avd_facts.py @@ -11,10 +11,10 @@ def test_get_avd_facts(all_inputs: dict): avd_facts = get_avd_facts(all_inputs) assert isinstance(avd_facts, dict) - assert "avd_switch_facts" in avd_facts.keys() + assert "avd_switch_facts" in avd_facts assert isinstance(avd_facts["avd_switch_facts"], dict) assert len(avd_facts["avd_switch_facts"]) == len(all_inputs) - assert "avd_overlay_peers" in avd_facts.keys() + assert "avd_overlay_peers" in avd_facts assert isinstance(avd_facts["avd_overlay_peers"], dict) - assert "avd_topology_peers" in avd_facts.keys() + assert "avd_topology_peers" in avd_facts assert isinstance(avd_facts["avd_topology_peers"], dict) diff --git a/python-avd/tests/pyavd/eos_designs/test_validate_structured_config.py b/python-avd/tests/pyavd/eos_designs/test_validate_structured_config.py index bdb1ae4fd1b..09caae8e5b8 100644 --- a/python-avd/tests/pyavd/eos_designs/test_validate_structured_config.py +++ b/python-avd/tests/pyavd/eos_designs/test_validate_structured_config.py @@ -2,10 +2,10 @@ # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. from pyavd import validate_structured_config +from pyavd._errors import AvdValidationError from pyavd.avd_schema_tools import AvdSchemaTools -from pyavd.vendor.errors import AvdValidationError -SCHEMA = AvdSchemaTools(schema_id="eos_cli_config_gen").avdschema.resolved_schema +SCHEMA = AvdSchemaTools(schema_id="eos_cli_config_gen").avdschema._schema def test_validate_structured_config_with_valid_data(hostname: str, structured_configs: dict): diff --git a/python-avd/tests/pyavd/j2filters/test_add_md_toc.py b/python-avd/tests/pyavd/j2filters/test_add_md_toc.py new file mode 100644 index 00000000000..e4ebd5d05f8 --- /dev/null +++ b/python-avd/tests/pyavd/j2filters/test_add_md_toc.py @@ -0,0 +1,84 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from pathlib import Path + +import pytest +from pyavd.j2filters.add_md_toc import _get_anchor_id, add_md_toc + +DIR_PATH = Path(__file__).parent / "toc_files" +MD_INPUT_VALID = DIR_PATH / "valid_file.md" +MD_INPUT_INVALID = DIR_PATH / "invalid_file.md" +EXPECTED_TOC = DIR_PATH / "expected_toc.md" +TOC_MARKER = "" +SKIP_LINES_LIST = [0, 1, 2] +VALID_TOC_LEVEL = 2 +INVALID_TOC_LEVEL = 0 + + +class TestAddMdTocFilter: + """Class to test add_md_toc filter.""" + + @pytest.mark.parametrize("skip_lines", SKIP_LINES_LIST) + def test_add_md_toc(self, skip_lines): + """Test add_md_toc success scenarii.""" + with open(MD_INPUT_VALID, "r", encoding="UTF-8") as input_file: + resp = add_md_toc(input_file.read(), skip_lines=skip_lines, toc_levels=VALID_TOC_LEVEL, toc_marker=TOC_MARKER) + + with open(EXPECTED_TOC, "r", encoding="UTF-8") as input_file: + expected_toc = input_file.read() + + assert resp.strip() != expected_toc.strip() + + def test_add_md_toc_invalid_skip_lines(self): + """Test add_md_toc with invalid skip_lines.""" + with open(MD_INPUT_VALID, "r", encoding="UTF-8") as input_file: + with pytest.raises(TypeError, match="add_md_toc 'skip_lines' argument must be an integer."): + add_md_toc(input_file.read(), skip_lines="Not an int") + + def test_add_md_toc_invalid_toc_level(self): + """Test add_md_toc with invalid toc level.""" + with open(MD_INPUT_VALID, "r", encoding="UTF-8") as input_file: + with pytest.raises(TypeError): + add_md_toc(input_file.read(), toc_levels=INVALID_TOC_LEVEL) + + def test_add_md_toc_invalid_toc_marker(self): + """Test add_md_toc with invalid toc_marker.""" + with open(MD_INPUT_VALID, "r", encoding="UTF-8") as input_file: + with pytest.raises(TypeError, match="add_md_toc 'toc_marker' argument must be a non-empty string."): + add_md_toc(input_file.read(), toc_marker=["Not_as_string"]) + + def test_add_md_toc_invalid_md_input_type(self): + """Test add_md_toc with invalid md_inpuT_type.""" + with pytest.raises(TypeError, match="add_md_toc expects a string."): + add_md_toc(["not_as_string"]) + + def test_add_md_toc_invalid(self): + """Test add_md_toc with invalid input file.""" + with open(MD_INPUT_INVALID, "r", encoding="UTF-8") as md_input_toc_invalid: + with pytest.raises(ValueError, match="add_md_toc expects exactly two occurrences of the toc marker"): + add_md_toc(md_input_toc_invalid.read()) + + def test_add_md_toc_btw_specific_markers(self): + """Test to add the TOC at the end of the file using the specific markers features.""" + with open(DIR_PATH / "markers_at_bottom.md", "r", encoding="UTF-8") as input_file: + resp = add_md_toc(input_file.read(), skip_lines=0, toc_levels=2, toc_marker=TOC_MARKER) + + with open(DIR_PATH / "expected_output_toc_at_bottom.md", "r", encoding="UTF-8") as expected_output: + assert resp == expected_output.read() + + def test__get_anchor_id_with_nonn_empty_anchor_id(self) -> None: + """This test intends to verify that the function can generate unique anchor_ids.""" + # Starts empty + all_anchor_ids = [] + text = "This is my header" + # Call the function three times with the same inputs and check a new unique anchor has been added + for i in range(3): + _get_anchor_id(text, all_anchor_ids) + assert len(all_anchor_ids) == i + 1 + expected_anchor = f"this-is-my-header-{i}" if i > 0 else "this-is-my-header" + assert expected_anchor in all_anchor_ids diff --git a/python-avd/tests/pyavd/j2filters/test_convert_dict.py b/python-avd/tests/pyavd/j2filters/test_convert_dict.py new file mode 100644 index 00000000000..81e0d95911c --- /dev/null +++ b/python-avd/tests/pyavd/j2filters/test_convert_dict.py @@ -0,0 +1,96 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import absolute_import, division, print_function + +import pytest +from pyavd.j2filters import convert_dicts + +DEFAULT_PRIMARY_KEY = "name" +NESTED_LIST_OF_DICT = { + "TEST1": [{"type": "permit", "extcommunities": "65000:65000"}, {"type": "deny", "extcommunities": "65002:65002"}], + "TEST2": [{"type": "deny", "extcommunities": "65001:65001"}], +} +NESTED_DICT = {"TEST1": {"action": "permit 1000:1000"}, "TEST2": {"action": "permit 2000:3000"}} +LIST_OF_STRING = ["Test1", "Test2", "Test3"] +LIST_OF_DICT = [{"type": "permit"}, {"extcommunities": "65000:65000"}] +DICT_WITH_STRING = {"dict": "test_string"} + + +class TestConvertDicts: + @pytest.mark.parametrize( + "test_dict, primary_key, secondary_key, converted_value", + [ + ( + NESTED_DICT, + "", + "", + [{"action": "permit 1000:1000", "name": "TEST1"}, {"action": "permit 2000:3000", "name": "TEST2"}], + ), # test_convert_dicts_with_nested_dict_default + ( + NESTED_DICT, + "id", + "", + [{"action": "permit 1000:1000", "id": "TEST1"}, {"action": "permit 2000:3000", "id": "TEST2"}], + ), # test_convert_dicts_with_nested_dict_primary_key + ( + NESTED_DICT, + "", + "types", + [{"name": "TEST1", "types": {"action": "permit 1000:1000"}}, {"name": "TEST2", "types": {"action": "permit 2000:3000"}}], + ), # test_convert_dicts_with_nested_dict_secondary_key + ( + NESTED_DICT, + "id", + "types", + [{"id": "TEST1", "types": {"action": "permit 1000:1000"}}, {"id": "TEST2", "types": {"action": "permit 2000:3000"}}], + ), # test_convert_dicts_with_listofdict_default + (NESTED_LIST_OF_DICT, "", "", [{"name": "TEST1"}, {"name": "TEST2"}]), # test_convert_dicts_with_listofdict_default + (NESTED_LIST_OF_DICT, "test", "", [{"test": "TEST1"}, {"test": "TEST2"}]), # test_convert_dicts_with_listofdict_primary_key + ( + NESTED_LIST_OF_DICT, + "", + "types", + [ + {"name": "TEST1", "types": [{"type": "permit", "extcommunities": "65000:65000"}, {"type": "deny", "extcommunities": "65002:65002"}]}, + {"name": "TEST2", "types": [{"type": "deny", "extcommunities": "65001:65001"}]}, + ], + ), # test_convert_dicts_with_listofdict_secondary_key + ( + NESTED_LIST_OF_DICT, + "id", + "types", + [ + {"id": "TEST1", "types": [{"type": "permit", "extcommunities": "65000:65000"}, {"type": "deny", "extcommunities": "65002:65002"}]}, + {"id": "TEST2", "types": [{"type": "deny", "extcommunities": "65001:65001"}]}, + ], + ), # test_convert_dicts_with_listofdict_primary_and_secondary_key + (LIST_OF_STRING, "", "", [{"name": "Test1"}, {"name": "Test2"}, {"name": "Test3"}]), # test_convert_dicts_with_list_default + (LIST_OF_STRING, "test", "", [{"test": "Test1"}, {"test": "Test2"}, {"test": "Test3"}]), # test_convert_dicts_with_list_primary_key + (LIST_OF_STRING, "", "id", [{"name": "Test1"}, {"name": "Test2"}, {"name": "Test3"}]), # test_convert_dicts_with_list_secondary_key + ( + LIST_OF_STRING, + "test", + "types", + [{"test": "Test1"}, {"test": "Test2"}, {"test": "Test3"}], + ), # test_convert_dicts_with_list_primary_and_secondary_key + (DICT_WITH_STRING, "", "", [{"name": "dict"}]), # test_convert_dicts_with_string_value_default + (DICT_WITH_STRING, "test", "", [{"test": "dict"}]), # test_convert_dicts_with_string_value_primary_key + (DICT_WITH_STRING, "", "str", [{"name": "dict", "str": "test_string"}]), # test_convert_dicts_with_string_value_secondary_key + (DICT_WITH_STRING, "test", "str", [{"test": "dict", "str": "test_string"}]), # test_convert_dicts_with_string_value_primary_key_and_secondary_key + (LIST_OF_DICT, "", "", LIST_OF_DICT), # test_convert_dicts_with_list_of_dict_default + (LIST_OF_DICT, "test", "", LIST_OF_DICT), # test_convert_dicts_with_list_of_dict_primary_key + ( + LIST_OF_DICT, + "", + "id", + [{"name": "type", "id": "permit"}, {"name": "extcommunities", "id": "65000:65000"}], + ), # test_convert_dicts_with_list_of_dict_secondary_key + (LIST_OF_DICT, "test", "id", [{"test": "type", "id": "permit"}, {"test": "extcommunities", "id": "65000:65000"}]), + ], + ) # test_convert_dicts_with_list_of_dict_primary_key_and_secondary_key + def test_convert_dicts(self, test_dict, primary_key, secondary_key, converted_value): + primary_key = primary_key if primary_key else DEFAULT_PRIMARY_KEY + secondary_key = secondary_key if secondary_key else None + resp = convert_dicts(test_dict, primary_key, secondary_key) + assert resp == converted_value diff --git a/python-avd/tests/pyavd/j2filters/test_decrypt.py b/python-avd/tests/pyavd/j2filters/test_decrypt.py new file mode 100644 index 00000000000..8c15192a7ab --- /dev/null +++ b/python-avd/tests/pyavd/j2filters/test_decrypt.py @@ -0,0 +1,34 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import annotations + +from contextlib import nullcontext as does_not_raise + +import pytest +from pyavd.j2filters import decrypt + + +@pytest.mark.parametrize( + "password, passwd_type, key, kwargs, expected_raise", + [ + pytest.param("dummy", None, "dummy", {}, pytest.raises(TypeError), id="Missing Type"), + pytest.param("dummy", "eigrp", "dummy", {}, pytest.raises(KeyError), id="Wrong Type"), + pytest.param("3QGcqpU2YTwKh2jVQ4Vj/A==", "bgp", "42.42.42.42", {}, does_not_raise(), id="Implemented Type BGP"), + pytest.param("qCTcuwOSntAmLZaW2QjKcA==", "ospf_simple", "Ethernet1", {}, does_not_raise(), id="Implemented Type OSPF simple"), + pytest.param( + "tDvJjUyf8///ktvy/xpfeQ==", + "ospf_message_digest", + "Ethernet1", + {"hash_algorithm": "sha512", "key_id": 66}, + does_not_raise(), + id="Implemented Type OSPF MD", + ), + ], +) +def test_decrypt(password, passwd_type, key, kwargs, expected_raise): + """ + Test decrypt method for non existing and existing type + """ + with expected_raise: + decrypt(password, passwd_type=passwd_type, key=key, **kwargs) diff --git a/python-avd/tests/pyavd/j2filters/test_default.py b/python-avd/tests/pyavd/j2filters/test_default.py new file mode 100644 index 00000000000..1751c684c20 --- /dev/null +++ b/python-avd/tests/pyavd/j2filters/test_default.py @@ -0,0 +1,23 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +import pytest +from jinja2.runtime import Undefined +from pyavd.j2filters import default + +PRIMARY_VALUE_LIST = [1, "ABC", None, Undefined, {}, {"key": "value"}, [1, 2]] +DEFAULT_VALUE_LIST = [["default"], [None, 1], [None, "abc"], [None, None, "2"], [{"key": "value"}]] + + +class TestDefaultFilter: + @pytest.mark.parametrize("primary_value", PRIMARY_VALUE_LIST) + @pytest.mark.parametrize("default_value", DEFAULT_VALUE_LIST) + def test_default(self, primary_value, default_value): + resp = default(primary_value, *default_value) + if isinstance(primary_value, Undefined) or primary_value is None and len(DEFAULT_VALUE_LIST) >= 1: + for i in default_value: + if isinstance(i, Undefined) or i is None or i == "": + continue + assert i == resp + else: + assert resp == primary_value diff --git a/python-avd/tests/pyavd/j2filters/test_encrypt.py b/python-avd/tests/pyavd/j2filters/test_encrypt.py new file mode 100644 index 00000000000..f71c0bed3be --- /dev/null +++ b/python-avd/tests/pyavd/j2filters/test_encrypt.py @@ -0,0 +1,28 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import annotations + +from contextlib import nullcontext as does_not_raise + +import pytest +from pyavd.j2filters import encrypt + + +@pytest.mark.parametrize( + "password, passwd_type, key, kwargs, expected_raise", + [ + pytest.param("dummy", None, "dummy", {}, pytest.raises(TypeError), id="Missing Type"), + pytest.param("dummy", "eigrp", "dummy", {}, pytest.raises(KeyError), id="Wrong Type"), + pytest.param(42, "bgp", "42.42.42.42", {}, does_not_raise(), id="Password is not a string"), + pytest.param("arista", "bgp", "42.42.42.42", {}, does_not_raise(), id="Implemented Type BGP"), + pytest.param("arista", "ospf_simple", "Ethernet1", {}, does_not_raise(), id="Implemented Type OSPF simple"), + pytest.param("arista", "ospf_message_digest", "Ethernet1", {"hash_algorithm": "sha512", "key_id": 66}, does_not_raise(), id="Implemented Type OSPF MD"), + ], +) +def test_encrypt(password, passwd_type, key, kwargs, expected_raise): + """ + Test encrypt method for non-existing and existing type. + """ + with expected_raise: + encrypt(password, passwd_type=passwd_type, key=key, **kwargs) diff --git a/python-avd/tests/pyavd/j2filters/test_generate_esi.py b/python-avd/tests/pyavd/j2filters/test_generate_esi.py new file mode 100644 index 00000000000..e322ded3ee0 --- /dev/null +++ b/python-avd/tests/pyavd/j2filters/test_generate_esi.py @@ -0,0 +1,24 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +import pytest +from pyavd.j2filters import generate_esi + +DEFAULT_ESI_PREFIX = "0000:0000:" +GENERATE_ESI_TEST_CASES = [ + # (, , ) + ("0303:0202:0101", "", "0000:0000:0303:0202:0101"), # without prefix + ("0303:0202:0101", "1111:1111:", "1111:1111:0303:0202:0101"), # with prefix +] + + +class TestGenerateEsiFilter: + @pytest.mark.parametrize("esi_short, esi_prefix, esi", GENERATE_ESI_TEST_CASES) + def test_generate_esi(self, esi_short, esi_prefix, esi): + esi_prefix = esi_prefix or DEFAULT_ESI_PREFIX + resp = generate_esi(esi_short, esi_prefix) + assert resp == esi diff --git a/python-avd/tests/pyavd/j2filters/test_generate_lacp_id.py b/python-avd/tests/pyavd/j2filters/test_generate_lacp_id.py new file mode 100644 index 00000000000..eb124727dae --- /dev/null +++ b/python-avd/tests/pyavd/j2filters/test_generate_lacp_id.py @@ -0,0 +1,32 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +import pytest +from pyavd.j2filters import generate_lacp_id + +ESI_SHORT_VALID_INPUT = [ + ("0404:0202:0101", "0404.0202.0101"), + ("000:000:0303:0202:0101", "000.000.0303.0202.0101"), + ("", ""), +] + +ESI_SHORT_INVALID_INPUT = [ + (10, "'int' object has no attribute 'replace'"), + (None, "'NoneType' object has no attribute 'replace'"), + ({}, "'dict' object has no attribute 'replace'"), + ([], "'list' object has no attribute 'replace'"), +] + + +class TestGenerateLacpIdFilter: + + @pytest.mark.parametrize("esi_short, lacp_id", ESI_SHORT_VALID_INPUT) + def test_generate_lacp_id_valid(self, esi_short, lacp_id): + resp = generate_lacp_id(esi_short) + assert resp == lacp_id + + @pytest.mark.parametrize("esi_short, error_msg", ESI_SHORT_INVALID_INPUT) + def test_generate_lacp_id_invalid(self, esi_short, error_msg): + with pytest.raises(AttributeError) as exc_info: + generate_lacp_id(esi_short) + assert str(exc_info.value) == error_msg diff --git a/python-avd/tests/pyavd/j2filters/test_generate_route_target.py b/python-avd/tests/pyavd/j2filters/test_generate_route_target.py new file mode 100644 index 00000000000..9cc45c8c678 --- /dev/null +++ b/python-avd/tests/pyavd/j2filters/test_generate_route_target.py @@ -0,0 +1,25 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +import pytest +from pyavd.j2filters import generate_route_target + +ESI_TO_RT_TEST_CASES = [ + # (, ) + ("0303:0202:0101", "03:03:02:02:01:01"), + (None, None), + ("ESI_SHORT", "ES:I_:SH:OR"), + ("", ""), + ("3", ""), +] + + +class TestGenerateRouteTargetFilter: + @pytest.mark.parametrize("esi_short, route_target", ESI_TO_RT_TEST_CASES) + def test_generate_route_target(self, esi_short, route_target): + resp = generate_route_target(esi_short) + assert resp == route_target diff --git a/python-avd/tests/pyavd/j2filters/test_hide_passwords.py b/python-avd/tests/pyavd/j2filters/test_hide_passwords.py new file mode 100644 index 00000000000..00ee0361650 --- /dev/null +++ b/python-avd/tests/pyavd/j2filters/test_hide_passwords.py @@ -0,0 +1,32 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +import pytest +from pyavd.j2filters import hide_passwords + +VALID_INPUT_HIDE_PASSWORDS = [ + ("dummy", False, "dummy"), + ("dummy", True, ""), + (None, True, ""), +] + +INVALID_INPUT_HIDE_PASSWORDS = [("password", "wrong_type_flag", "wrong_type_flag in hide_passwords filter is not of type bool")] + + +class TestHidePasswordsFilter: + @pytest.mark.parametrize("value, hide_passwords_flag, hidden_password", VALID_INPUT_HIDE_PASSWORDS) + def test_hide_passwords_valid(self, value, hide_passwords_flag, hidden_password): + """ + Test hide_passwords + """ + assert hide_passwords(value, hide_passwords_flag) == hidden_password + + @pytest.mark.parametrize("value, hide_passwords_flag, error_msg", INVALID_INPUT_HIDE_PASSWORDS) + def test_hide_passwords_invalid(self, value, hide_passwords_flag, error_msg): + with pytest.raises(TypeError) as exc_info: + hide_passwords(value, hide_passwords_flag) + assert str(exc_info.value) == error_msg diff --git a/python-avd/tests/pyavd/j2filters/test_is_in_filter.py b/python-avd/tests/pyavd/j2filters/test_is_in_filter.py new file mode 100644 index 00000000000..1787a1b8a62 --- /dev/null +++ b/python-avd/tests/pyavd/j2filters/test_is_in_filter.py @@ -0,0 +1,28 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import absolute_import, division, print_function + +import pytest +from pyavd.j2filters import is_in_filter + +HOSTNAME_VALID = "test1.aristanetworks.com" +HOSTNAME_INVALID = "test1.bsn.com" +HOSTNAME_FILTER_VALID = ["arista", "aristanetworks"] +HOSTNAME_FILTER_INVALID = "aristanetworks" + +IS_IN_FILTER_TEST_CASES = [ + # (, , ) + (HOSTNAME_VALID, None, True), # default filter + (HOSTNAME_VALID, HOSTNAME_FILTER_VALID, True), # valid hostname + (HOSTNAME_INVALID, HOSTNAME_FILTER_VALID, False), # invalid hostname + # TODO: Check if this is a valid testcase. Add a type check? + (HOSTNAME_VALID, HOSTNAME_FILTER_INVALID, True), # invalid filter +] + + +class TestIsInFilter: + @pytest.mark.parametrize("hostname, hostname_filter, res_is_in_filter", IS_IN_FILTER_TEST_CASES) + def test_is_in_filter(self, hostname, hostname_filter, res_is_in_filter): + res = is_in_filter(hostname=hostname, hostname_filter=hostname_filter) + assert res == res_is_in_filter diff --git a/python-avd/tests/pyavd/j2filters/test_list_compress.py b/python-avd/tests/pyavd/j2filters/test_list_compress.py new file mode 100644 index 00000000000..68bb3048f02 --- /dev/null +++ b/python-avd/tests/pyavd/j2filters/test_list_compress.py @@ -0,0 +1,36 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +import pytest +from pyavd.j2filters import list_compress + +LIST_COMPRESS_INVALID_TESTS = [ + ("1-3", "Value must be of type list, got "), + ({"key": "value"}, "Value must be of type list, got "), + (33, "Value must be of type list, got "), + (["a", "b", "c"], "All elements of the list ['a', 'b', 'c'] must be integers"), + ([1, "a"], "All elements of the list [1, 'a'] must be integers"), +] + +LIST_COMPRESS_VALID_TESTS = [ + ([1, 2, 3, 4], "1-4"), + ([1, 2, 3, 7, 8], "1-3,7-8"), + ([9, 10, 11, 4, 2, 1], "1-2,4,9-11"), +] + + +class TestListCompressFilter: + @pytest.mark.parametrize("invalid_list_to_compress, error_msg", LIST_COMPRESS_INVALID_TESTS) + def test_list_compress_invalid(self, invalid_list_to_compress, error_msg): + with pytest.raises(TypeError) as exc_info: + list_compress(invalid_list_to_compress) + assert str(exc_info.value) == error_msg + + @pytest.mark.parametrize("valid_list_to_compress, compressed_string", LIST_COMPRESS_VALID_TESTS) + def test_list_compress_valid(self, valid_list_to_compress, compressed_string): + resp = list_compress(valid_list_to_compress) + assert resp in compressed_string diff --git a/python-avd/tests/pyavd/j2filters/test_natural_sort.py b/python-avd/tests/pyavd/j2filters/test_natural_sort.py new file mode 100644 index 00000000000..ee356554adc --- /dev/null +++ b/python-avd/tests/pyavd/j2filters/test_natural_sort.py @@ -0,0 +1,76 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +import pytest +from pyavd.j2filters.natural_sort import convert, natural_sort + + +class TestNaturalSortFilter: + @pytest.mark.parametrize( + "item_to_convert, converted_item", + [ + ("100", 100), + ("200", 200), + ("ABC", "abc"), + ], + ) + def test_convert(self, item_to_convert, converted_item): + resp = convert(item_to_convert) + assert resp == converted_item + + @pytest.mark.parametrize( + "item_to_natural_sort, sort_key, sorted_list", + [ + (None, None, []), # test with None + ([], None, []), # test with blank list + ({}, "", []), # test with blank dict + ("", None, []), # test with blank string + ("access_list", None, ["_", "a", "c", "c", "e", "i", "l", "s", "s", "s", "t"]), # test with string + (["1,2,3,4", "11,2,3,4", "5.6.7.8"], None, ["1,2,3,4", "5.6.7.8", "11,2,3,4"]), # test with list of integers + ({"a1": 123, "a10": 333, "a2": 2, "a11": 4456}, None, ["a1", "a2", "a10", "a11"]), # test with dict + ( + [ + {"name": "ACL-10", "counters_per_entry": True}, + {"name": "ACL-01", "counters_per_entry": True}, + {"name": "ACL-05", "counters_per_entry": False}, + ], + "name", + [ + {"name": "ACL-01", "counters_per_entry": True}, + {"name": "ACL-05", "counters_per_entry": False}, + {"name": "ACL-10", "counters_per_entry": True}, + ], # test list of dict with "name" as sort_key + ), + ( + [ + {"name": "ACL-10", "counters_per_entry": True}, + {"sequence_numbers": {"sequence": 10}}, + {"counters_per_entry": False}, + {"name": "ACL-05", "counters_per_entry": False}, + ], + "name", + [ + {"name": "ACL-05", "counters_per_entry": False}, + {"name": "ACL-10", "counters_per_entry": True}, + {"counters_per_entry": False}, + {"sequence_numbers": {"sequence": 10}}, + ], # test list of dict without "name" sort_key in some entries + ), + ( + [ + {"sequence_numbers": {"sequence": 10}}, + {"counters_per_entry": False}, + {"action": "action_command"}, + ], + "name", + [ + {"action": "action_command"}, + {"counters_per_entry": False}, + {"sequence_numbers": {"sequence": 10}}, + ], + ), # test test list of dict without "name" sort_key in all entries + ], + ) + def test_natural_sort(self, item_to_natural_sort, sort_key, sorted_list): + resp = natural_sort(item_to_natural_sort, sort_key) + assert resp == sorted_list diff --git a/ansible_collections/arista/avd/tests/unit/plugins/filter/test_range_expand.py b/python-avd/tests/pyavd/j2filters/test_range_expand.py similarity index 78% rename from ansible_collections/arista/avd/tests/unit/plugins/filter/test_range_expand.py rename to python-avd/tests/pyavd/j2filters/test_range_expand.py index cb86a14b134..f151716f92c 100644 --- a/ansible_collections/arista/avd/tests/unit/plugins/filter/test_range_expand.py +++ b/python-avd/tests/pyavd/j2filters/test_range_expand.py @@ -1,39 +1,37 @@ # Copyright (c) 2023-2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. -from __future__ import absolute_import, division, print_function -__metaclass__ = type +from __future__ import annotations import pytest - -from ansible_collections.arista.avd.plugins.filter.range_expand import AnsibleFilterError, FilterModule, range_expand +from pyavd.j2filters import range_expand RANGE_TO_EXPAND_INVALID_VALUES = [ - pytest.param(True, AnsibleFilterError, "value must be of type list or str, got ", id="Wrong input type - bool"), - pytest.param({"key": "value"}, AnsibleFilterError, "value must be of type list or str, got ", id="Wrong input type - dict"), - pytest.param(33, AnsibleFilterError, "", id="Wrong input type - int"), + pytest.param(True, TypeError, "value must be of type list or str, got ", id="Wrong input type - bool"), + pytest.param({"key": "value"}, TypeError, "value must be of type list or str, got ", id="Wrong input type - dict"), + pytest.param(33, TypeError, "", id="Wrong input type - int"), pytest.param( "Ethernet4-2", - AnsibleFilterError, + ValueError, "Range Ethernet4-2 could not be expanded because the first interface 4 is larger than last interface 2 in the range.", id="Wrong interface range", ), pytest.param( "Ethernet1,51-3/2", - AnsibleFilterError, + ValueError, "Range 51-3/2 could not be expanded because the first module 51 is larger than last module 3 in the range.", id="Wrong module range", ), pytest.param( "Ethernet1.42-21", - AnsibleFilterError, + ValueError, "Range Ethernet1.42-21 could not be expanded because the first subinterface 42 is larger than last subinterface 21 in the range.", id="Wrong subinterface range", ), pytest.param( "Ethernet4/2-1/4", - AnsibleFilterError, + ValueError, "Range Ethernet4/2-1/4 could not be expanded because the first interface 2 is larger than last interface 1 in the range.", id="Wrong parent interface range", ), @@ -79,8 +77,6 @@ ["1.0", "1.1", "2.0", "2.1"], ] -f = FilterModule() - class TestRangeExpandFilter: @pytest.mark.parametrize("input_value, expected_raise, expected_raise_message", RANGE_TO_EXPAND_INVALID_VALUES) @@ -92,8 +88,3 @@ def test_range_expand_invalid(self, input_value, expected_raise, expected_raise_ def test_range_expand_valid(self, RANGE_TO_EXPAND_VALID): resp = range_expand(RANGE_TO_EXPAND_VALID) assert resp in EXPECTED_RESULT_VALID_VALUES - - def test_range_expand_filter(self): - resp = f.filters() - assert isinstance(resp, dict) - assert "range_expand" in resp.keys() diff --git a/python-avd/tests/pyavd/j2filters/test_snmp_hash.py b/python-avd/tests/pyavd/j2filters/test_snmp_hash.py new file mode 100644 index 00000000000..b0faa4e08e6 --- /dev/null +++ b/python-avd/tests/pyavd/j2filters/test_snmp_hash.py @@ -0,0 +1,90 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from contextlib import nullcontext as does_not_raise + +import pytest +from pyavd.j2filters.snmp_hash import _PRIV_KEY_LENGTH, _get_hash_object, _key_from_passphrase, _localize_passphrase + +GET_HASH_OBJECT_TEST_CASES = [ + # auth_type, result, expectation + ("md5", "md5", does_not_raise()), + ("sha", "sha1", does_not_raise()), + ("sha256", "sha256", does_not_raise()), + ("sha384", "sha384", does_not_raise()), + ("sha512", "sha512", does_not_raise()), + ("toto", None, pytest.raises(ValueError)), +] + +KEY_FROM_PASSPHRASE_TEST_CASES = [ + # passphrase, auth_type, result, expectation + ("testauth", "md5", "7a3d6867d36341fcc49c7d6dd0182078", does_not_raise()), + ("testauth", "sha", "d6997cbe7ffa9efa756721303e367478d0a9a61b", does_not_raise()), + ("testauth", "sha224", "b4cdc03923d5fa37bb20ca665bf2e971b9d7521c3cc311a7d29bfed2", does_not_raise()), + ("testauth", "sha256", "bd7b6e2a86527e0b93b65ad3d67d1fc870a420c49d53b4d652364d81e954f704", does_not_raise()), + ("testauth", "sha384", "bf8300efa68bb5d99945fef87fafb9b564ebaccd9c371bb8184fdba1df95eaa5d05b5f0fcaacfb0a3906b6e37693c6dd", does_not_raise()), + ( + "testauth", + "sha512", + "c005b901a9a29e140e2749bb5d51789bba97f614c3c8060a1c080d775f12494ba6d968dc22526bb06532e96e2e4d3bd0e746f2696439a4a034d040e1c7de0aaa", + does_not_raise(), + ), + ("testauth", "toto", None, pytest.raises(ValueError)), +] + +LOCALIZE_PASSPHRASE_TEST_CASES = [ + # passphrase, auth_type, engine_id, priv_type, result, expectation + ("testauth", "md5", "424242424242424242", None, "a487532d40f65644034ba50bec29bd90", does_not_raise()), + ("testauth", "sha", "424242424242424242", None, "14c3e7d55a9d67b7341e0dafba817bd33d3eb2e4", does_not_raise()), + ("testauth", "sha224", "424242424242424242", None, "b74ddba450a2b8a2b7f1823df22b4a1efa984071c5afcefadd72cc3f", does_not_raise()), + ("testauth", "sha256", "424242424242424242", None, "ca08c9b519c910b678faf598bc33e118272f37fd9a1522d5b4b764fea26fd9ca", does_not_raise()), + ( + "testauth", + "sha384", + "424242424242424242", + None, + "84e53e90d79c258426a67a229759cfe46058339d2d9db41e12ba29fe671ecf8085c4d45049b419ea23ae2e1fa0773bff", + does_not_raise(), + ), + ( + "testauth", + "sha512", + "424242424242424242", + None, + "bccbd436115c60540422ad8e98b8373dee507fd9e77730372f03dcf8e8a074a43d9f04bd6b7be64eb806bdbaeff43ccd1ca93c4606ab46eb797720e4c59abcc7", + does_not_raise(), + ), + ("testauth", "toto", "424242424242424242", None, None, pytest.raises(ValueError)), + # only testing priv with one auth algorithm, the longest, to verify key length + ("testpriv", "sha512", "424242424242424242", "des", "ca5e54b5c49e7addba0046c591f8f541", does_not_raise()), + ("testpriv", "sha512", "424242424242424242", "aes", "ca5e54b5c49e7addba0046c591f8f541", does_not_raise()), + ("testpriv", "sha512", "424242424242424242", "aes192", "ca5e54b5c49e7addba0046c591f8f5417338cdc1043068ab", does_not_raise()), + ("testpriv", "sha512", "424242424242424242", "aes256", "ca5e54b5c49e7addba0046c591f8f5417338cdc1043068abf8c2a7ab751f13dc", does_not_raise()), + ("testpriv", "sha512", "424242424242424242", "toto", None, pytest.raises(ValueError)), + # non hex engine_id + ("testpriv", "sha512", "zzzzzzzzzzzz", "toto", None, pytest.raises(ValueError)), +] + + +class TestSNMPHashFilter: + @pytest.mark.parametrize("auth_type, result, expectation", GET_HASH_OBJECT_TEST_CASES) + def test_get_hash_object(self, auth_type, result, expectation): + with expectation: + assert _get_hash_object(auth_type).name == result + + @pytest.mark.parametrize("passphrase, auth_type, result, expectation", KEY_FROM_PASSPHRASE_TEST_CASES) + def test_key_from_passphrase(self, passphrase, auth_type, result, expectation): + with expectation: + assert _key_from_passphrase(passphrase, auth_type) == result + + @pytest.mark.parametrize("passphrase, auth_type, engine_id, priv_type, result, expectation", LOCALIZE_PASSPHRASE_TEST_CASES) + def test_localize_passphrase(self, passphrase, auth_type, engine_id, priv_type, result, expectation): + with expectation: + localized_passphrase = _localize_passphrase(passphrase, auth_type, engine_id, priv_type=priv_type) + assert localized_passphrase == result + if priv_type: + assert len(localized_passphrase) * 4 == _PRIV_KEY_LENGTH[priv_type] diff --git a/python-avd/tests/pyavd/j2filters/test_status_render.py b/python-avd/tests/pyavd/j2filters/test_status_render.py new file mode 100644 index 00000000000..ed490788b20 --- /dev/null +++ b/python-avd/tests/pyavd/j2filters/test_status_render.py @@ -0,0 +1,16 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import annotations + +import pytest +from pyavd.j2filters import status_render + +STATE_STRINGS = [("PASS", "github", ":white_check_mark:"), ("fail", "github", ":x:"), ("FAIL", "test", "FAIL")] + + +class TestMarkdownRenderingFilter: + @pytest.mark.parametrize("state_string, rendering, markdown_code", STATE_STRINGS) + def test_status_render_valid(self, state_string, rendering, markdown_code): + resp = status_render(state_string, rendering) + assert resp == markdown_code diff --git a/ansible_collections/arista/avd/tests/unit/filters/toc_files/expected_output_toc_at_bottom.md b/python-avd/tests/pyavd/j2filters/toc_files/expected_output_toc_at_bottom.md similarity index 98% rename from ansible_collections/arista/avd/tests/unit/filters/toc_files/expected_output_toc_at_bottom.md rename to python-avd/tests/pyavd/j2filters/toc_files/expected_output_toc_at_bottom.md index 2843780d303..7e86932b8b4 100644 --- a/ansible_collections/arista/avd/tests/unit/filters/toc_files/expected_output_toc_at_bottom.md +++ b/python-avd/tests/pyavd/j2filters/toc_files/expected_output_toc_at_bottom.md @@ -5,20 +5,27 @@ --> # md-toc + a python script to generate the toc (table of contents) of markdown ## toc + @{md-toc}@ ## todo + - [ ] basic func - [ ] unit test - [ ] js version and a chrome extension ## Ussage xx + ### ussage1 + ### ussage 2 + ## todo2 + # todo3 diff --git a/ansible_collections/arista/avd/tests/unit/filters/toc_files/expected_toc.md b/python-avd/tests/pyavd/j2filters/toc_files/expected_toc.md similarity index 98% rename from ansible_collections/arista/avd/tests/unit/filters/toc_files/expected_toc.md rename to python-avd/tests/pyavd/j2filters/toc_files/expected_toc.md index 574d99526bb..9277c4ccafb 100644 --- a/ansible_collections/arista/avd/tests/unit/filters/toc_files/expected_toc.md +++ b/python-avd/tests/pyavd/j2filters/toc_files/expected_toc.md @@ -10,19 +10,27 @@ - [Ussage xx](#ussage-xx) - [todo2](#todo2) - [todo3](#todo3) + # md-toc + a python script to generate the toc (table of contents) of markdown ## toc + @{md-toc}@ ## todo + - [ ] basic func - [ ] unit test - [ ] js version and a chrome extension ## Ussage xx + ### ussage1 + ### ussage 2 + ## todo2 + # todo3 diff --git a/ansible_collections/arista/avd/tests/unit/filters/toc_files/invalid_file.md b/python-avd/tests/pyavd/j2filters/toc_files/invalid_file.md similarity index 98% rename from ansible_collections/arista/avd/tests/unit/filters/toc_files/invalid_file.md rename to python-avd/tests/pyavd/j2filters/toc_files/invalid_file.md index 5ddfe9268e9..0009c317302 100644 --- a/ansible_collections/arista/avd/tests/unit/filters/toc_files/invalid_file.md +++ b/python-avd/tests/pyavd/j2filters/toc_files/invalid_file.md @@ -7,18 +7,25 @@ # md-toc + a python script to generate the toc (table of contents) of markdown ## toc + @{md-toc}@ ## todo + - [ ] basic func - [ ] unit test - [ ] js version and a chrome extension ## Ussage xx + ### ussage1 + ### ussage 2 + ## todo2 + # todo3 diff --git a/ansible_collections/arista/avd/tests/unit/filters/toc_files/markers_at_bottom.md b/python-avd/tests/pyavd/j2filters/toc_files/markers_at_bottom.md similarity index 98% rename from ansible_collections/arista/avd/tests/unit/filters/toc_files/markers_at_bottom.md rename to python-avd/tests/pyavd/j2filters/toc_files/markers_at_bottom.md index ebe46db6d18..de153d6fa46 100644 --- a/ansible_collections/arista/avd/tests/unit/filters/toc_files/markers_at_bottom.md +++ b/python-avd/tests/pyavd/j2filters/toc_files/markers_at_bottom.md @@ -5,20 +5,27 @@ --> # md-toc + a python script to generate the toc (table of contents) of markdown ## toc + @{md-toc}@ ## todo + - [ ] basic func - [ ] unit test - [ ] js version and a chrome extension ## Ussage xx + ### ussage1 + ### ussage 2 + ## todo2 + # todo3 diff --git a/ansible_collections/arista/avd/tests/unit/filters/toc_files/valid_file.md b/python-avd/tests/pyavd/j2filters/toc_files/valid_file.md similarity index 98% rename from ansible_collections/arista/avd/tests/unit/filters/toc_files/valid_file.md rename to python-avd/tests/pyavd/j2filters/toc_files/valid_file.md index 9d0849e4ee1..0015a8dd900 100644 --- a/ansible_collections/arista/avd/tests/unit/filters/toc_files/valid_file.md +++ b/python-avd/tests/pyavd/j2filters/toc_files/valid_file.md @@ -10,18 +10,25 @@ # md-toc + a python script to generate the toc (table of contents) of markdown ## toc + @{md-toc}@ ## todo + - [ ] basic func - [ ] unit test - [ ] js version and a chrome extension ## Ussage xx + ### ussage1 + ### ussage 2 + ## todo2 + # todo3 diff --git a/python-avd/tests/pyavd/j2tests/test_contains.py b/python-avd/tests/pyavd/j2tests/test_contains.py new file mode 100644 index 00000000000..2b05b05ec6d --- /dev/null +++ b/python-avd/tests/pyavd/j2tests/test_contains.py @@ -0,0 +1,32 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +"""Unit tests for pyavd.j2tests.contains.""" + +from __future__ import annotations + +import pytest +from jinja2.runtime import Undefined +from pyavd.j2tests.contains import contains + +TEST_DATA = [ + pytest.param(None, "dummy", False, id="value is None"), + pytest.param(Undefined, "dummy", False, id="value is Undefined"), + pytest.param("value_not_a_list", "dummy", False, id="value is not a list"), + pytest.param(["dummy"], None, False, id="test_value is None"), + pytest.param(["dummy"], Undefined, False, id="test_value is Undefined"), + pytest.param(["a", "b", "c"], "b", True, id="test_value single value in value"), + pytest.param(["a", "b", "c"], ["d", "b"], True, id="test_value list contained value"), + pytest.param([1, 42, 666], 42, True, id="test success with int"), + pytest.param(["a", "b", "c"], "d", False, id="test_value list not contained value"), + pytest.param(["a", "b", "c"], ["d", "e"], False, id="test_value single value not in value"), +] + + +class TestContainsTest: + """Test Contains.""" + + @pytest.mark.parametrize(("value, test_value, expected_result"), TEST_DATA) + def test_contains(self, value, test_value, expected_result): + """Test the contains function.""" + assert contains(value, test_value) == expected_result diff --git a/ansible_collections/arista/avd/tests/unit/test/test_defined_plugin.py b/python-avd/tests/pyavd/j2tests/test_defined_plugin.py similarity index 92% rename from ansible_collections/arista/avd/tests/unit/test/test_defined_plugin.py rename to python-avd/tests/pyavd/j2tests/test_defined_plugin.py index 1988be2010e..7fdc21471aa 100644 --- a/ansible_collections/arista/avd/tests/unit/test/test_defined_plugin.py +++ b/python-avd/tests/pyavd/j2tests/test_defined_plugin.py @@ -1,15 +1,13 @@ # Copyright (c) 2023-2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. -from __future__ import absolute_import, division, print_function +from __future__ import annotations -__metaclass__ = type +import warnings import pytest -from ansible.errors import AnsibleError from jinja2.runtime import Undefined - -from ansible_collections.arista.avd.plugins.test.defined import TestModule, defined +from pyavd.j2tests.defined import defined VALUE_LIST = ["ab", None, 1, True, {"key": "value"}] TEST_VALUE_LIST = [None, "ab", True, 1, True] @@ -18,20 +16,22 @@ VAR_TYPE_LIST = ["int", "str", "integer", "aaa", None, dict] INVALID_FAIL_ACTION_LIST = [None, "aaaa"] -f = TestModule() - class TestDefinedPlugin: def defined_function(self, value, test_value=None, var_type=None, fail_action=None, var_name=None, err_msg=None, warn_msg=None): if str(fail_action).lower() == "warning": - resp, warning = defined(value, test_value=test_value, var_type=var_type, fail_action=fail_action, var_name=var_name, run_tests=True) + with warnings.catch_warnings(record=True) as w: + resp, warning = defined(value, test_value=test_value, var_type=var_type, fail_action=fail_action, var_name=var_name, run_tests=True) + assert len(w) == 1 + assert isinstance(w[0].message, UserWarning) if warn_msg: assert warning is not None warn = str(list(warning.keys())[0]).replace("[WARNING]: ", "").strip().replace("\n", " ") assert warn == warn_msg - assert resp is False + assert str(w[0].message) == warn_msg + assert resp is False elif str(fail_action).lower() == "error": - with pytest.raises(AnsibleError) as e: + with pytest.raises(ValueError) as e: resp, warning = defined(value, test_value=test_value, var_type=var_type, fail_action=fail_action, var_name=var_name, run_tests=True) assert str(e.value) == err_msg diff --git a/ansible_collections/arista/avd/tests/unit/plugins/plugin_utils/merge/access_lists.schema.yml b/python-avd/tests/pyavd/schema/access_lists.schema.yml similarity index 100% rename from ansible_collections/arista/avd/tests/unit/plugins/plugin_utils/merge/access_lists.schema.yml rename to python-avd/tests/pyavd/schema/access_lists.schema.yml diff --git a/ansible_collections/arista/avd/tests/unit/plugins/plugin_utils/schema/acl.yml b/python-avd/tests/pyavd/schema/acl.yml similarity index 100% rename from ansible_collections/arista/avd/tests/unit/plugins/plugin_utils/schema/acl.yml rename to python-avd/tests/pyavd/schema/acl.yml diff --git a/ansible_collections/arista/avd/tests/unit/plugins/plugin_utils/schema/combined.schema.yml b/python-avd/tests/pyavd/schema/combined.schema.yml similarity index 100% rename from ansible_collections/arista/avd/tests/unit/plugins/plugin_utils/schema/combined.schema.yml rename to python-avd/tests/pyavd/schema/combined.schema.yml diff --git a/ansible_collections/arista/avd/tests/unit/plugins/plugin_utils/schema/ipv6-access-lists.yml b/python-avd/tests/pyavd/schema/ipv6-access-lists.yml similarity index 100% rename from ansible_collections/arista/avd/tests/unit/plugins/plugin_utils/schema/ipv6-access-lists.yml rename to python-avd/tests/pyavd/schema/ipv6-access-lists.yml diff --git a/ansible_collections/arista/avd/tests/unit/plugins/plugin_utils/schema/ipv6_standard_access_lists.schema.yml b/python-avd/tests/pyavd/schema/ipv6_standard_access_lists.schema.yml similarity index 100% rename from ansible_collections/arista/avd/tests/unit/plugins/plugin_utils/schema/ipv6_standard_access_lists.schema.yml rename to python-avd/tests/pyavd/schema/ipv6_standard_access_lists.schema.yml diff --git a/ansible_collections/arista/avd/tests/unit/plugins/plugin_utils/schema/test_avdschema.py b/python-avd/tests/pyavd/schema/test_avdschema.py similarity index 71% rename from ansible_collections/arista/avd/tests/unit/plugins/plugin_utils/schema/test_avdschema.py rename to python-avd/tests/pyavd/schema/test_avdschema.py index 15a87ad7b67..e591bf4f900 100644 --- a/ansible_collections/arista/avd/tests/unit/plugins/plugin_utils/schema/test_avdschema.py +++ b/python-avd/tests/pyavd/schema/test_avdschema.py @@ -1,19 +1,16 @@ # Copyright (c) 2023-2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. -from __future__ import absolute_import, division, print_function - -__metaclass__ = type - import os import pytest import yaml from deepmerge import always_merger - -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AvdValidationError -from ansible_collections.arista.avd.plugins.plugin_utils.schema.avdschema import DEFAULT_SCHEMA, AvdSchema -from ansible_collections.arista.avd.plugins.plugin_utils.schema.default_schemas import DEFAULT_SCHEMAS +from pyavd._errors import AvdValidationError +from pyavd._schema.avdschema import DEFAULT_SCHEMA, AvdSchema +from pyavd._schema.avdschemaresolver import AvdSchemaResolver +from schema_tools.constants import SCHEMA_PATHS +from schema_tools.store import create_store script_dir = os.path.dirname(__file__) with open(f"{script_dir}/access_lists.schema.yml", "r", encoding="utf-8") as schema_file: @@ -120,86 +117,78 @@ def test_avd_schema_init_without_schema(self): assert isinstance(avdschema, AvdSchema) assert avdschema._schema == DEFAULT_SCHEMA - @pytest.mark.parametrize("TEST_SCHEMA", VALID_TEST_SCHEMAS) - def test_avd_schema_init_with_schema(self, TEST_SCHEMA): - avdschema = AvdSchema(TEST_SCHEMA) + @pytest.mark.parametrize("test_schema", VALID_TEST_SCHEMAS) + def test_avd_schema_init_with_schema(self, test_schema): + avdschema = AvdSchema(test_schema) assert isinstance(avdschema, AvdSchema) - assert avdschema._schema == TEST_SCHEMA + assert avdschema._schema == test_schema def test_avd_schema_init_with_invalid_schema(self): with pytest.raises(AvdValidationError): AvdSchema(INVALID_SCHEMA) - @pytest.mark.parametrize("TEST_SCHEMA", VALID_TEST_SCHEMAS) - def test_avd_schema_validate_schema(self, TEST_SCHEMA): + @pytest.mark.parametrize("test_schema", VALID_TEST_SCHEMAS) + def test_avd_schema_validate_schema(self, test_schema): try: - for validation_error in AvdSchema().validate_schema(TEST_SCHEMA): + for validation_error in AvdSchema().validate_schema(test_schema): assert False, f"Validation Error '{validation_error.message}' returned" - except Exception as e: + except Exception as e: # pylint: disable=broad-exception-caught assert False, f"AvdSchema().validate_schema(TEST_SCHEMA) raised an exception: {e}" - assert True def test_avd_schema_validate_invalid_schema(self): try: for validation_error in AvdSchema().validate_schema(INVALID_SCHEMA): assert isinstance(validation_error, AvdValidationError) - except Exception as e: + except Exception as e: # pylint: disable=broad-exception-caught assert False, f"AvdSchema().validate_schema(INVALID_SCHEMA) raised an exception: {e}" - @pytest.mark.parametrize("TEST_DATA", TEST_DATA_SETS) - def test_avd_schema_validate_without_schema(self, TEST_DATA): + @pytest.mark.parametrize("test_data", TEST_DATA_SETS) + def test_avd_schema_validate_without_schema(self, test_data): try: - for validation_error in AvdSchema().validate(TEST_DATA): - pass - except Exception as e: + list(AvdSchema().validate(test_data)) + except Exception as e: # pylint: disable=broad-exception-caught assert False, f"AvdSchema().validate(TEST_DATA) raised an exception: {e}" - assert True - @pytest.mark.parametrize("TEST_SCHEMA", VALID_TEST_SCHEMAS) - @pytest.mark.parametrize("TEST_DATA", TEST_DATA_SETS) - def test_avd_schema_validate_with_loaded_schema(self, TEST_SCHEMA, TEST_DATA): + @pytest.mark.parametrize("test_schema", VALID_TEST_SCHEMAS) + @pytest.mark.parametrize("test_data", TEST_DATA_SETS) + def test_avd_schema_validate_with_loaded_schema(self, test_schema, test_data): try: - for validation_error in AvdSchema(TEST_SCHEMA).validate(TEST_DATA): + for validation_error in AvdSchema(test_schema).validate(test_data): assert False, f"Validation Error '{validation_error.message}' returned" - except Exception as e: + except Exception as e: # pylint: disable=broad-exception-caught assert False, f"AvdSchema(TEST_SCHEMA).validate(TEST_DATA) raised an exception: {e}" - assert True - @pytest.mark.parametrize("INVALID_DATA", INVALID_ACL_DATA) - def test_avd_schema_validate_with_invalid_data(self, INVALID_DATA): + @pytest.mark.parametrize("invalid_data", INVALID_ACL_DATA) + def test_avd_schema_validate_with_invalid_data(self, invalid_data): try: - for validation_error in AvdSchema(combined_schema).validate(INVALID_DATA): + for validation_error in AvdSchema(combined_schema).validate(invalid_data): assert isinstance(validation_error, AvdValidationError) - except Exception as e: + except Exception as e: # pylint: disable=broad-exception-caught assert False, f"AvdSchema(combined_schema).validate(INVALID_DATA) raised an exception: {e}" - def test_avd_schema_validate_with_missing_data(self): - with pytest.raises(TypeError): - AvdSchema().validate() - - @pytest.mark.parametrize("TEST_SCHEMA", VALID_TEST_SCHEMAS) - def test_avd_schema_load_valid_schema(self, TEST_SCHEMA): + @pytest.mark.parametrize("test_schema", VALID_TEST_SCHEMAS) + def test_avd_schema_load_valid_schema(self, test_schema): try: avdschema = AvdSchema() - avdschema.load_schema(TEST_SCHEMA) - except Exception as e: + avdschema.load_schema(test_schema) + except Exception as e: # pylint: disable=broad-exception-caught assert False, f"load_schema(TEST_SCHEMA) raised an exception: {e}" - assert avdschema._schema == TEST_SCHEMA + assert avdschema._schema == test_schema def test_avd_schema_load_invalid_schema(self): with pytest.raises(AvdValidationError): avdschema = AvdSchema() avdschema.load_schema(INVALID_SCHEMA) - @pytest.mark.parametrize("TEST_SCHEMA", VALID_TEST_SCHEMAS) - def test_avd_schema_extend_valid_schema(self, TEST_SCHEMA): + @pytest.mark.parametrize("test_schema", VALID_TEST_SCHEMAS) + def test_avd_schema_extend_valid_schema(self, test_schema): expected_schema = {} expected_schema = always_merger.merge(expected_schema, DEFAULT_SCHEMA) - expected_schema = always_merger.merge(expected_schema, TEST_SCHEMA) + expected_schema = always_merger.merge(expected_schema, test_schema) try: avdschema = AvdSchema() - avdschema.extend_schema(TEST_SCHEMA) - except Exception as e: + avdschema.extend_schema(test_schema) + except Exception as e: # pylint: disable=broad-exception-caught assert False, f"extend_schema(TEST_SCHEMA) raised an exception: {e}" assert avdschema._schema == expected_schema @@ -208,58 +197,57 @@ def test_avd_schema_extend_invalid_schema(self): avdschema = AvdSchema() avdschema.extend_schema(INVALID_SCHEMA) - @pytest.mark.parametrize("TEST_PATH", TEST_DATA_PATHS) - def test_avd_schema_subschema_with_loaded_schema(self, TEST_PATH): + @pytest.mark.parametrize("test_path", TEST_DATA_PATHS) + def test_avd_schema_subschema_with_loaded_schema(self, test_path): try: avdschema = AvdSchema(combined_schema) - subschema = avdschema.subschema(TEST_PATH) - except Exception as e: + subschema = avdschema.subschema(test_path) + except Exception as e: # pylint: disable=broad-exception-caught assert False, f"subschema(TEST_PATH) raised an exception: {e}" - if len(TEST_PATH) == 0: + if len(test_path) == 0: assert subschema == EXPECTED_SUBSCHEMAS["_empty"] else: - assert subschema == EXPECTED_SUBSCHEMAS[".".join(TEST_PATH)] + assert subschema == EXPECTED_SUBSCHEMAS[".".join(test_path)] def test_avd_schema_subschema_with_ref_to_store_schemas(self): test_schema = {"type": "dict", "keys": {}} - for id in DEFAULT_SCHEMAS: + for id in SCHEMA_PATHS: if id == "avd_meta_schema": continue - test_schema["keys"][id] = {"type": "dict", "$ref": f"{id}#/"} + test_schema["keys"][id] = {"type": "dict", "$ref": f"{id}#"} # For performance reasons $ref is no longer supported at runtime. # The $ref must be resolved before loading the schema. - avdschema = AvdSchema(test_schema) - resolved_test_schema = avdschema.resolved_schema + store = create_store() + resolved_test_schema = AvdSchemaResolver("", store).resolve(test_schema) avdschema = AvdSchema(resolved_test_schema) - for id in DEFAULT_SCHEMAS: + for id in SCHEMA_PATHS: if id == "avd_meta_schema": continue subschema = avdschema.subschema([id]) assert subschema.get("type") == "dict" assert subschema.get("keys") is not None - @pytest.mark.parametrize("TEST_SCHEMA", UNIQUE_KEYS_SCHEMAS) - @pytest.mark.parametrize("TEST_DATA", UNIQUE_KEYS_VALID_DATA) - def test_avd_schema_validate_unique_keys_valid_data(self, TEST_SCHEMA, TEST_DATA): + @pytest.mark.parametrize("test_schema", UNIQUE_KEYS_SCHEMAS) + @pytest.mark.parametrize("test_data", UNIQUE_KEYS_VALID_DATA) + def test_avd_schema_validate_unique_keys_valid_data(self, test_schema, test_data): try: - for validation_error in AvdSchema(TEST_SCHEMA).validate(TEST_DATA): + for validation_error in AvdSchema(test_schema).validate(test_data): assert False, f"Validation Error '{validation_error.message}' returned" - except Exception as e: + except Exception as e: # pylint: disable=broad-exception-caught assert False, f"AvdSchema(UNIQUE_KEYS_SCHEMAS).validate(UNIQUE_KEYS_VALID_DATA) raised an exception: {e}" - assert True - @pytest.mark.parametrize("TEST_SCHEMA", UNIQUE_KEYS_SCHEMAS) - @pytest.mark.parametrize("INVALID_DATA", UNIQUE_KEYS_INVALID_DATA) - def test_avd_schema_validate_unique_keys_invalid_data(self, TEST_SCHEMA, INVALID_DATA): + @pytest.mark.parametrize("test_schema", UNIQUE_KEYS_SCHEMAS) + @pytest.mark.parametrize("invalid_data", UNIQUE_KEYS_INVALID_DATA) + def test_avd_schema_validate_unique_keys_invalid_data(self, test_schema, invalid_data): try: - validation_errors = tuple(AvdSchema(TEST_SCHEMA).validate(INVALID_DATA)) + validation_errors = tuple(AvdSchema(test_schema).validate(invalid_data)) if not validation_errors: assert False, "did NOT fail validation" for validation_error in validation_errors: assert isinstance(validation_error, AvdValidationError) assert validation_error.path.endswith((".key", ".nested_list_key")) - except Exception as e: + except Exception as e: # pylint: disable=broad-exception-caught assert False, f"AvdSchema(UNIQUE_KEYS_SCHEMAS).validate(UNIQUE_KEYS_INVALID_DATA) raised an exception: {e}" diff --git a/ansible_collections/arista/avd/tests/unit/plugins/plugin_utils/schema/access_lists.schema.yml b/python-avd/tests/pyavd/utils/merge/access_lists.schema.yml similarity index 100% rename from ansible_collections/arista/avd/tests/unit/plugins/plugin_utils/schema/access_lists.schema.yml rename to python-avd/tests/pyavd/utils/merge/access_lists.schema.yml diff --git a/ansible_collections/arista/avd/tests/unit/plugins/plugin_utils/merge/acl1.yml b/python-avd/tests/pyavd/utils/merge/acl1.yml similarity index 100% rename from ansible_collections/arista/avd/tests/unit/plugins/plugin_utils/merge/acl1.yml rename to python-avd/tests/pyavd/utils/merge/acl1.yml diff --git a/ansible_collections/arista/avd/tests/unit/plugins/plugin_utils/merge/acl2.yml b/python-avd/tests/pyavd/utils/merge/acl2.yml similarity index 100% rename from ansible_collections/arista/avd/tests/unit/plugins/plugin_utils/merge/acl2.yml rename to python-avd/tests/pyavd/utils/merge/acl2.yml diff --git a/ansible_collections/arista/avd/tests/unit/plugins/plugin_utils/merge/acl_merged.yml b/python-avd/tests/pyavd/utils/merge/acl_merged.yml similarity index 100% rename from ansible_collections/arista/avd/tests/unit/plugins/plugin_utils/merge/acl_merged.yml rename to python-avd/tests/pyavd/utils/merge/acl_merged.yml diff --git a/ansible_collections/arista/avd/tests/unit/plugins/plugin_utils/merge/test_merge.py b/python-avd/tests/pyavd/utils/merge/test_merge.py similarity index 90% rename from ansible_collections/arista/avd/tests/unit/plugins/plugin_utils/merge/test_merge.py rename to python-avd/tests/pyavd/utils/merge/test_merge.py index 3174cb9dbd5..d7ae0898863 100644 --- a/ansible_collections/arista/avd/tests/unit/plugins/plugin_utils/merge/test_merge.py +++ b/python-avd/tests/pyavd/utils/merge/test_merge.py @@ -9,9 +9,8 @@ import pytest import yaml - -from ansible_collections.arista.avd.plugins.plugin_utils.merge import merge -from ansible_collections.arista.avd.plugins.plugin_utils.schema.avdschema import AvdSchema +from pyavd._schema.avdschema import AvdSchema +from pyavd._utils import merge script_dir = os.path.dirname(__file__) with open(f"{script_dir}/access_lists.schema.yml", "r", encoding="utf-8") as schema_file: diff --git a/ansible_collections/arista/avd/tests/unit/plugins/filter/test_password.py b/python-avd/tests/pyavd/utils/password/test_password.py similarity index 74% rename from ansible_collections/arista/avd/tests/unit/plugins/filter/test_password.py rename to python-avd/tests/pyavd/utils/password/test_password.py index df8e3e9e770..c7988b78d4f 100644 --- a/ansible_collections/arista/avd/tests/unit/plugins/filter/test_password.py +++ b/python-avd/tests/pyavd/utils/password/test_password.py @@ -1,18 +1,10 @@ # Copyright (c) 2023-2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. -from __future__ import absolute_import, division, print_function - -__metaclass__ = type - -from contextlib import nullcontext as does_not_raise +from __future__ import annotations import pytest - -from ansible_collections.arista.avd.plugins.filter.decrypt import decrypt -from ansible_collections.arista.avd.plugins.filter.encrypt import encrypt -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError, AristaAvdMissingVariableError -from ansible_collections.arista.avd.plugins.plugin_utils.password_utils.password import ( +from pyavd._utils.password_utils import ( bgp_decrypt, bgp_encrypt, isis_decrypt, @@ -63,6 +55,7 @@ ("RR-OVERLAY-PEERS", "arista123", "04FdfTXWrEfpDTUc3mlSjg=="), ("MLAG_PEER", "arista123", "arwUnrq9ydqIhjfTwRhAlg=="), ] +OSPF_MESSAGE_DIGEST_HASH_ALGORITHMS = ["md5", "sha1", "sha256", "sha384", "sha512"] @pytest.mark.parametrize("key, password, expected", BGP_INPUT_DICT_ENCRYPT_EXPECTED) @@ -86,7 +79,7 @@ def test_bgp_decrypt_failure(key, password): """ Test bgp_decrypt failure cases """ - with pytest.raises(AristaAvdError): + with pytest.raises(ValueError): bgp_decrypt(password, key=key) @@ -154,7 +147,7 @@ def test_ospf_simple_decrypt_failure(key, password): """ Test ospf_simple_decrypt failure cases """ - with pytest.raises(AristaAvdError): + with pytest.raises(ValueError): ospf_simple_decrypt(password, key=key) @@ -179,8 +172,13 @@ def test_ospf_message_digest_decrypt_failure(key, password, hash_algorithm, key_ """ Test ospf_message_digest_decrypt failure cases """ - with pytest.raises(AristaAvdError): - ospf_message_digest_decrypt(password, key=key, hash_algorithm=hash_algorithm, key_id=key_id) + + if hash_algorithm is None or key_id is None: + with pytest.raises(ValueError, match="For OSPF message digest keys, both hash_algorithm and key_id are required"): + ospf_message_digest_encrypt(password, key=key, hash_algorithm=hash_algorithm, key_id=key_id) + elif hash_algorithm not in OSPF_MESSAGE_DIGEST_HASH_ALGORITHMS: + with pytest.raises(ValueError, match=f"For OSPF message digest keys, `hash_algorithm` must be in {'|'.join(OSPF_MESSAGE_DIGEST_HASH_ALGORITHMS)}"): + ospf_message_digest_encrypt(password, key=key, hash_algorithm=hash_algorithm, key_id=key_id) ########## @@ -235,52 +233,5 @@ def test_isis_decrypt_failure(key, mode, password): """ Test isis_decrypt failure cases """ - with pytest.raises(AristaAvdError): + with pytest.raises(ValueError): isis_decrypt(password, key=key, mode=mode) - - -########## -# GENERIC -########## -@pytest.mark.parametrize( - "password, passwd_type, key, kwargs, expected_raise", - [ - pytest.param("dummy", None, "dummy", {}, pytest.raises(AristaAvdMissingVariableError), id="Missing Type"), - pytest.param("dummy", "eigrp", "dummy", {}, pytest.raises(AristaAvdError), id="Wrong Type"), - pytest.param(42, "bgp", "42.42.42.42", {}, does_not_raise(), id="Password is not a string"), - pytest.param("arista", "bgp", "42.42.42.42", {}, does_not_raise(), id="Implemented Type BPG"), - pytest.param("arista", "ospf_simple", "Ethernet1", {}, does_not_raise(), id="Implemented Type OSPF simple"), - pytest.param("arista", "ospf_message_digest", "Ethernet1", {"hash_algorithm": "sha512", "key_id": 66}, does_not_raise(), id="Implemented Type OSPF MD"), - ], -) -def test_encrypt(password, passwd_type, key, kwargs, expected_raise): - """ - Test encrypt method for non existing and existing type - """ - with expected_raise: - encrypt(password, passwd_type=passwd_type, key=key, **kwargs) - - -@pytest.mark.parametrize( - "password, passwd_type, key, kwargs, expected_raise", - [ - pytest.param("dummy", None, "dummy", {}, pytest.raises(AristaAvdMissingVariableError), id="Missing Type"), - pytest.param("dummy", "eigrp", "dummy", {}, pytest.raises(AristaAvdError), id="Wrong Type"), - pytest.param("3QGcqpU2YTwKh2jVQ4Vj/A==", "bgp", "42.42.42.42", {}, does_not_raise(), id="Implemented Type BGP"), - pytest.param("qCTcuwOSntAmLZaW2QjKcA==", "ospf_simple", "Ethernet1", {}, does_not_raise(), id="Implemented Type OSPF simple"), - pytest.param( - "tDvJjUyf8///ktvy/xpfeQ==", - "ospf_message_digest", - "Ethernet1", - {"hash_algorithm": "sha512", "key_id": 66}, - does_not_raise(), - id="Implemented Type OSPF MD", - ), - ], -) -def test_decrypt(password, passwd_type, key, kwargs, expected_raise): - """ - Test decrypt method for non existing and existing type - """ - with expected_raise: - decrypt(password, passwd_type=passwd_type, key=key, **kwargs) diff --git a/ansible_collections/arista/avd/tests/unit/plugins/plugin_utils/test_password_utils.py b/python-avd/tests/pyavd/utils/password/test_password_utils.py similarity index 90% rename from ansible_collections/arista/avd/tests/unit/plugins/plugin_utils/test_password_utils.py rename to python-avd/tests/pyavd/utils/password/test_password_utils.py index 84ba9a45cb7..bfe73fef76b 100644 --- a/ansible_collections/arista/avd/tests/unit/plugins/plugin_utils/test_password_utils.py +++ b/python-avd/tests/pyavd/utils/password/test_password_utils.py @@ -1,13 +1,10 @@ # Copyright (c) 2023-2024 Arista Networks, Inc. # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. -from __future__ import absolute_import, division, print_function - -__metaclass__ = type +from __future__ import annotations import pytest - -from ansible_collections.arista.avd.plugins.plugin_utils.password_utils.password_utils import cbc_check_password, cbc_decrypt, cbc_encrypt +from pyavd._utils.password_utils.password_utils import cbc_check_password, cbc_decrypt, cbc_encrypt # password used is "arista" VALID_PASSWORD_KEY_PAIRS = [("42.42.42.42", b"3QGcqpU2YTwKh2jVQ4Vj/A=="), ("AVD-TEST", b"bM7t58t04qSqLHAfZR/Szg==")] diff --git a/ansible_collections/arista/avd/tests/unit/module_utils/test_utils.py b/python-avd/tests/pyavd/utils/test_get.py similarity index 95% rename from ansible_collections/arista/avd/tests/unit/module_utils/test_utils.py rename to python-avd/tests/pyavd/utils/test_get.py index dd926d36e28..c64dd1ce020 100644 --- a/ansible_collections/arista/avd/tests/unit/module_utils/test_utils.py +++ b/python-avd/tests/pyavd/utils/test_get.py @@ -9,9 +9,8 @@ from contextlib import contextmanager import pytest - -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get +from pyavd._errors import AristaAvdError +from pyavd._utils import get @contextmanager diff --git a/ansible_collections/arista/avd/tests/unit/plugins/plugin_utils/utils/test_get_ip_from_pool.py b/python-avd/tests/pyavd/utils/test_get_ip_from_pool.py similarity index 90% rename from ansible_collections/arista/avd/tests/unit/plugins/plugin_utils/utils/test_get_ip_from_pool.py rename to python-avd/tests/pyavd/utils/test_get_ip_from_pool.py index d7e1e244848..472b6b64848 100644 --- a/ansible_collections/arista/avd/tests/unit/plugins/plugin_utils/utils/test_get_ip_from_pool.py +++ b/python-avd/tests/pyavd/utils/test_get_ip_from_pool.py @@ -2,9 +2,8 @@ # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. import pytest - -from ansible_collections.arista.avd.plugins.plugin_utils.errors import AristaAvdError -from ansible_collections.arista.avd.plugins.plugin_utils.utils import get_ip_from_pool +from pyavd._errors import AristaAvdError +from pyavd._utils import get_ip_from_pool # default values for testcases diff --git a/python-avd/tests/pyavd/utils/test_short_esi_to_route_target.py b/python-avd/tests/pyavd/utils/test_short_esi_to_route_target.py new file mode 100644 index 00000000000..85f5a99d24a --- /dev/null +++ b/python-avd/tests/pyavd/utils/test_short_esi_to_route_target.py @@ -0,0 +1,25 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +import pytest +from pyavd._utils import short_esi_to_route_target + +ESI_TO_RT_TEST_CASES = [ + # (, ) + ("0303:0202:0101", "03:03:02:02:01:01"), + ("0303:0202:0101 ", "0303:0202:0101 "), + ("ESI_SHORT", "ESI_SHORT"), + ("", ""), + ("3", "3"), +] + + +class TestGenerateRouteTargetFilter: + @pytest.mark.parametrize("short_esi, route_target", ESI_TO_RT_TEST_CASES) + def test_short_esi_to_route_target(self, short_esi, route_target): + resp = short_esi_to_route_target(short_esi) + assert resp == route_target diff --git a/ansible_collections/arista/avd/tests/unit/module_utils/test_strip_empties.py b/python-avd/tests/pyavd/utils/test_strip_empties.py similarity index 96% rename from ansible_collections/arista/avd/tests/unit/module_utils/test_strip_empties.py rename to python-avd/tests/pyavd/utils/test_strip_empties.py index fe970704830..961e045d865 100644 --- a/ansible_collections/arista/avd/tests/unit/module_utils/test_strip_empties.py +++ b/python-avd/tests/pyavd/utils/test_strip_empties.py @@ -6,8 +6,7 @@ __metaclass__ = type import pytest - -from ansible_collections.arista.avd.plugins.plugin_utils.strip_empties import strip_null_from_data +from pyavd._utils import strip_null_from_data STRIP_EMPTIES_LIST = { "None": ["string1", "string2", "string3", None], diff --git a/python-avd/tests/schema_tools/artifacts/eos_cli_config_gen.schema.yml b/python-avd/tests/schema_tools/artifacts/eos_cli_config_gen.schema.yml index 5982386bd65..eb5a713d27d 100644 --- a/python-avd/tests/schema_tools/artifacts/eos_cli_config_gen.schema.yml +++ b/python-avd/tests/schema_tools/artifacts/eos_cli_config_gen.schema.yml @@ -80,7 +80,7 @@ keys: type: str convert_types: - int - description: Privelege level 'all' or 0-15 + description: Privilege level 'all' or 0-15 type: type: str valid_values: @@ -101,7 +101,7 @@ keys: type: str convert_types: - int - description: Privelege level 'all' or 0-15 + description: Privilege level 'all' or 0-15 type: type: str valid_values: @@ -798,12 +798,12 @@ keys: ' cvsourceip: type: str - description: 'Set source IP address in case of in-band managament + description: 'Set source IP address in case of in-band management ' cvsourceintf: type: str - description: 'Set source interface in case of in-band managament. Available + description: 'Set source interface in case of in-band management. Available as of TerminAttr v1.23.0 ' @@ -873,12 +873,12 @@ keys: ' cvsourceip: type: str - description: 'Set source IP address in case of in-band managament + description: 'Set source IP address in case of in-band management ' cvsourceintf: type: str - description: 'Set source interface in case of in-band managament + description: 'Set source interface in case of in-band management ' cvvrf: @@ -1101,7 +1101,7 @@ keys: hide_passwords: type: bool description: 'Replace the input data using the `hide_passwords` filter in - the Jinja2 templates by '''' in the configruation if true + the Jinja2 templates by '''' in the configuration if true ' default: false @@ -1845,7 +1845,7 @@ keys: valid_values: - percent - pps - description: Optional field and is hardware dependant + description: Optional field and is hardware dependent broadcast: type: dict keys: @@ -1861,7 +1861,7 @@ keys: valid_values: - percent - pps - description: Optional field and is hardware dependant + description: Optional field and is hardware dependent multicast: type: dict keys: @@ -1877,7 +1877,7 @@ keys: valid_values: - percent - pps - description: Optional field and is hardware dependant + description: Optional field and is hardware dependent unknown_unicast: type: dict keys: @@ -1893,7 +1893,7 @@ keys: valid_values: - percent - pps - description: Optional field and is hardware dependant + description: Optional field and is hardware dependent logging: type: dict keys: @@ -2636,7 +2636,7 @@ keys: of valid_values which MUST be updated to support\nnew feature as they are released in EOS.\n\nThe available values of the different keys like 'direction' or 'address_type'\nare feature and hardware dependent and this model DOES - NOT validate that the\ncombinations are valid. It is the responsability + NOT validate that the\ncombinations are valid. It is the responsibility of the user of this data model\nto make sure that the rendered CLI is accepted by the targeted device.\n\nExamples:\n\n * Use:\n ```yaml\n hardware_counters:\n \ features:\n - name: ip\n direction: out\n layer3: @@ -5718,7 +5718,7 @@ keys: required: true convert_types: - int - description: 'Drop Treshold. This value may also be + description: 'Drop Threshold. This value may also be fractions. Example: 7/8 or 3/4 or 1/2 @@ -5779,7 +5779,7 @@ keys: required: true convert_types: - int - description: 'Drop Treshold. This value may also be + description: 'Drop Threshold. This value may also be fractions. Example: 7/8 or 3/4 or 1/2 @@ -5787,7 +5787,7 @@ keys: ' sand: type: dict - description: Most of the platform sand options are hardware dependant and + description: Most of the platform sand options are hardware dependent and optional keys: qos_maps: @@ -6285,7 +6285,7 @@ keys: valid_values: - percent - pps - description: Optional field and is hardware dependant + description: Optional field and is hardware dependent broadcast: type: dict keys: @@ -6301,7 +6301,7 @@ keys: valid_values: - percent - pps - description: Optional field and is hardware dependant + description: Optional field and is hardware dependent multicast: type: dict keys: @@ -6317,7 +6317,7 @@ keys: valid_values: - percent - pps - description: Optional field and is hardware dependant + description: Optional field and is hardware dependent unknown_unicast: type: dict keys: @@ -6333,7 +6333,7 @@ keys: valid_values: - percent - pps - description: Optional field and is hardware dependant + description: Optional field and is hardware dependent ip_proxy_arp: type: bool isis_enable: diff --git a/python-avd/tests/schema_tools/artifacts/eos_designs.schema.yml b/python-avd/tests/schema_tools/artifacts/eos_designs.schema.yml index 52f54aa30fb..f562e2d8d56 100644 --- a/python-avd/tests/schema_tools/artifacts/eos_designs.schema.yml +++ b/python-avd/tests/schema_tools/artifacts/eos_designs.schema.yml @@ -205,7 +205,7 @@ keys: for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items/ + $ref: eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items mlag_ipv4_underlay_peer: type: dict keys: @@ -225,7 +225,7 @@ keys: for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items/ + $ref: eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items evpn_overlay_peers: type: dict keys: @@ -245,7 +245,7 @@ keys: for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items/ + $ref: eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items evpn_overlay_core: type: dict keys: @@ -265,7 +265,7 @@ keys: for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items/ + $ref: eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items mpls_overlay_peers: type: dict keys: @@ -285,7 +285,7 @@ keys: for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items/ + $ref: eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items rr_overlay_peers: type: dict keys: @@ -305,7 +305,7 @@ keys: for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items/ + $ref: eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items ipvpn_gateway_peers: type: dict keys: @@ -325,7 +325,7 @@ keys: for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items/ + $ref: eos_cli_config_gen#/keys/router_bgp/keys/peer_groups/items IPv4_UNDERLAY_PEERS: type: dict deprecation: @@ -876,7 +876,7 @@ keys: define it.\nrt_override will default to vni_override if set.\n\nrt_override supports two formats:\n - A single number which will be used in the RT fields instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rt_type' for details).\n - \ - A full RT string with colon seperator which will override the full + \ - A full RT string with colon separator which will override the full RT.\n" rd_override: type: str @@ -888,7 +888,7 @@ keys: set.\n\nrd_override supports two formats:\n - A single number which will be used in the RD assigned number field instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rd_type' for details).\n - A full RD string with colon - seperator which will override the full RD.\n" + separator which will override the full RD.\n" evpn_l2_multi_domain: type: bool description: 'Explicitly extend VLAN-Aware Bundle to remote EVPN domains. @@ -2978,7 +2978,7 @@ $defs: type: str description: 'By default the description is built leveraging `_`. - When set this key will overide the default value on the physical ports. + When set this key will override the default value on the physical ports. ' profile: @@ -3554,7 +3554,7 @@ $defs: for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: eos_cli_config_gen#/keys/port_channel_interfaces/items/ + $ref: eos_cli_config_gen#/keys/port_channel_interfaces/items raw_eos_cli: type: str description: EOS CLI rendered directly on the ethernet interface in the final @@ -3565,7 +3565,7 @@ $defs: for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: eos_cli_config_gen#/keys/ethernet_interfaces/items/ + $ref: eos_cli_config_gen#/keys/ethernet_interfaces/items connected_endpoints: type: list primary_key: name @@ -4490,7 +4490,7 @@ $defs: for eos_cli_config_gen. documentation_options: hide_keys: true - $ref: eos_cli_config_gen#/keys/ethernet_interfaces/items/ + $ref: eos_cli_config_gen#/keys/ethernet_interfaces/items raw_eos_cli: type: str description: 'EOS CLI rendered directly on the Ethernet interface @@ -4852,7 +4852,7 @@ $defs: if set.\n\nrt_override supports two formats:\n - A single number which will be used in the RT fields instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rt_type' for details).\n - A full RT string with - colon seperator which will override the full RT.\n" + colon separator which will override the full RT.\n" rd_override: type: str convert_types: @@ -4863,7 +4863,7 @@ $defs: vni_override if set.\n\nrd_override supports two formats:\n - A single number which will be used in the RD assigned number field instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rd_type' for details).\n - \ - A full RD string with colon seperator which will override the + \ - A full RD string with colon separator which will override the full RD.\n" name: type: str @@ -5394,7 +5394,7 @@ $defs: ' mlag_port_channel_structured_config: - $ref: eos_cli_config_gen#/keys/port_channel_interfaces/items/ + $ref: eos_cli_config_gen#/keys/port_channel_interfaces/items documentation_options: table: node-type-l2-mlag-configuration hide_keys: true @@ -6706,7 +6706,7 @@ $defs: define it.\nrt_override will default to vni_override if set.\n\nrt_override supports two formats:\n - A single number which will be used in the RT fields instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rt_type' for details).\n - \ - A full RT string with colon seperator which will override the full RT.\n" + \ - A full RT string with colon separator which will override the full RT.\n" rd_override: type: str convert_types: @@ -6716,7 +6716,7 @@ $defs: define it.\nrd_override will default to rt_override or vni_override if set.\n\nrd_override supports two formats:\n - A single number which will be used in the RD assigned number field instead of mac_vrf_id/mac_vrf_vni (see 'overlay_rd_type' - for details).\n - A full RD string with colon seperator which will override + for details).\n - A full RD string with colon separator which will override the full RD.\n" tags: type: list diff --git a/python-avd/tests/schema_tools/generate_docs/test_mdtabsgen.py b/python-avd/tests/schema_tools/generate_docs/test_mdtabsgen.py index 2691a46901f..7ece8b0d141 100644 --- a/python-avd/tests/schema_tools/generate_docs/test_mdtabsgen.py +++ b/python-avd/tests/schema_tools/generate_docs/test_mdtabsgen.py @@ -2,19 +2,21 @@ # Use of this source code is governed by the Apache License 2.0 # that can be found in the LICENSE file. from pathlib import Path -from sys import path +from sys import path, version_info from unittest.mock import patch import pytest -# Override global path to load schema from source instead of any installed version. -# Avoids to load from pyavd to avoid relying on pyavd vendor things being generated. -path.insert(0, str(Path(__file__).parents[3])) +if version_info >= (3, 10): + # Override global path to load schema from source instead of any installed version. + # Avoids to load from pyavd to avoid relying on pyavd vendor things being generated. + path.insert(0, str(Path(__file__).parents[3])) -from schema_tools.generate_docs.mdtabsgen import get_md_tabs -from schema_tools.metaschema.meta_schema_model import AristaAvdSchema + from schema_tools.generate_docs.mdtabsgen import get_md_tabs + from schema_tools.metaschema.meta_schema_model import AristaAvdSchema +@pytest.mark.skipif(version_info < (3, 10), reason="Our Pydantic models require minimum Python3.10") @pytest.mark.parametrize("table_name", ["network-services-multicast-settings"]) def test_get_md_tabs(table_name: str, schema_store, artifacts_path, output_path): """ diff --git a/python-avd/tests/schema_tools/metaschema/test_meta_schema_model.py b/python-avd/tests/schema_tools/metaschema/test_meta_schema_model.py index 33e0ca1d933..fc2f6a07cd7 100644 --- a/python-avd/tests/schema_tools/metaschema/test_meta_schema_model.py +++ b/python-avd/tests/schema_tools/metaschema/test_meta_schema_model.py @@ -3,28 +3,30 @@ # that can be found in the LICENSE file. import json from pathlib import Path -from sys import path +from sys import path, version_info +import pytest import yaml -# Override global path to load schema from source instead of any installed version. -# Avoids to load from pyavd to avoid relying on pyavd vendor things being generated. -path.insert(0, str(Path(__file__).parents[3])) +if version_info >= (3, 10): + # Override global path to load schema from source instead of any installed version. + # Avoids to load from pyavd to avoid relying on pyavd vendor things being generated. + path.insert(0, str(Path(__file__).parents[3])) -from schema_tools.metaschema.meta_schema_model import AristaAvdSchema -from schema_tools.store import create_store + from schema_tools.metaschema.meta_schema_model import AristaAvdSchema + from schema_tools.store import create_store + + raw_schema = create_store()["eos_designs"] class NoAliasDumper(yaml.Dumper): """Dump YAML without generating aliases and anchors for reused ids""" - def ignore_aliases(self, data): + def ignore_aliases(self, _): return True -raw_schema = create_store()["eos_designs"] - - +@pytest.mark.skipif(version_info < (3, 10), reason="Our Pydantic models require minimum Python3.10") def test_pydantic_dump_matches_original_yaml(): """ Loads the schema _without_ resolving the $ref and then dumps the schema again as json. diff --git a/python-avd/tests/utils.py b/python-avd/tests/utils.py index 10271b6916d..92c302a9bbf 100644 --- a/python-avd/tests/utils.py +++ b/python-avd/tests/utils.py @@ -45,7 +45,7 @@ def create_common_vars(common_varfiles): def get_files_in_folder(folder_path): files = [] - for root, dir, filenames in os.walk(folder_path): + for root, _, filenames in os.walk(folder_path): for filename in filenames: files.append(os.path.join(root, filename)) return files diff --git a/python-avd/tox.ini b/python-avd/tox.ini index 3da304dc436..ca22a4f4f89 100644 --- a/python-avd/tox.ini +++ b/python-avd/tox.ini @@ -1,5 +1,6 @@ [tox] env_list = + py39 py310 py311 py312 @@ -9,6 +10,13 @@ env_list = depends = report: coverage +[gh-actions] +python = + 3.9: py39 + 3.10: py310 + 3.11: coverage, report + 3.12: py312 + [testenv] description = run the tests with our own runner package = wheel @@ -20,7 +28,7 @@ deps = pytest PyYAML>=6.0.0 pydantic>=2.3.0 -extras = mdtoc + referencing>=0.35.0 commands = make test-dep # posargs allows to run only a specific test using @@ -33,8 +41,10 @@ deps = PyYAML>=6.0.0 pydantic>=2.3.0 coverage[toml] + referencing>=0.35.0 commands = coverage erase + make test-dep # posargs allows to run only a specific test using # tox -e -- path/to/my/test::test coverage run --rcfile=pyproject.toml -m pytest {posargs} diff --git a/python-avd/vendor_overrides/schema/default_schemas.py b/python-avd/vendor_overrides/schema/default_schemas.py deleted file mode 100644 index 00a3083b367..00000000000 --- a/python-avd/vendor_overrides/schema/default_schemas.py +++ /dev/null @@ -1,12 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -from pathlib import Path - -pyavd_dir = Path(__file__).parents[2] - -DEFAULT_PICKLED_SCHEMAS = { - "avd_meta_schema": pyavd_dir.joinpath("vendor", "schemas", "avd_meta_schema.pickle"), - "eos_cli_config_gen": pyavd_dir.joinpath("vendor", "schemas", "eos_cli_config_gen.schema.pickle"), - "eos_designs": pyavd_dir.joinpath("vendor", "schemas", "eos_designs.schema.pickle"), -} diff --git a/python-avd/vendor_overrides/utils/compile_searchpath.py b/python-avd/vendor_overrides/utils/compile_searchpath.py deleted file mode 100644 index b00798dbe38..00000000000 --- a/python-avd/vendor_overrides/utils/compile_searchpath.py +++ /dev/null @@ -1,10 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -""" -Dummy. Not needed for pyavd, but is imported in __init__.py -""" - - -def compile_searchpath(*args) -> str: - raise NotImplementedError("Not implemented in pyavd") diff --git a/python-avd/vendor_overrides/utils/display.py b/python-avd/vendor_overrides/utils/display.py deleted file mode 100644 index e2d6200ecc4..00000000000 --- a/python-avd/vendor_overrides/utils/display.py +++ /dev/null @@ -1,12 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -""" -Emulate Ansible's Display class -used for vendor/j2/test/defined.py -""" - - -class Display: - def warning(self, *args): - pass diff --git a/python-avd/vendor_overrides/utils/get_templar.py b/python-avd/vendor_overrides/utils/get_templar.py deleted file mode 100644 index ad83edcdcf3..00000000000 --- a/python-avd/vendor_overrides/utils/get_templar.py +++ /dev/null @@ -1,10 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -""" -Dummy. Not needed for pyavd, but is imported in __init__.py -""" - - -def get_templar(): - raise NotImplementedError("Jinja Templating is not implemented in pyavd") diff --git a/python-avd/vendor_overrides/utils/template.py b/python-avd/vendor_overrides/utils/template.py deleted file mode 100644 index 1f307184389..00000000000 --- a/python-avd/vendor_overrides/utils/template.py +++ /dev/null @@ -1,10 +0,0 @@ -# Copyright (c) 2023-2024 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the LICENSE file. -""" -Dummy. Not needed for pyavd, but is imported in __init__.py -""" - - -def template(*args) -> str: - raise NotImplementedError("Jinja Templating is not implemented in pyavd")